예제 #1
0
 def analiza_lista_de_cadenas_sys_argv_style(self):
     "analiza la lista de cadenas sys.argv-style"
     # Pruebas no hinchables FTL
     miartefacto = Contexto(nombre="miartefacto")
     miartefacto.agregar_arg("arg")
     p = Analizador(contextos=[miartefacto])
     p.analizar_args(["miartefacto", "--arg", "valor"])
예제 #2
0
 def otros_tokens_luego_generan_errores_de_analisis(self):
     # NOTE: esto se debe a la carcasa especial donde suministramos
     # el nombre del artefacto como valor cuando la bandera se
     # llama literalmente "ayuda".
     artefacto1 = Contexto("miartefacto")
     init = Contexto(args=[Argumento("help", opcional=True)])
     analizador = Analizador(inicial=init, contextos=[artefacto1])
     with raises(ErrorDeAnalisis, match=r".*foobar.*"):
         analizador.analizar_args(
             ["miartefacto", "--help", "foobar"])
예제 #3
0
 def por_si_mismo_caso_base(self):
     artefacto1 = Contexto("miartefacto")
     init = Contexto(args=[Argumento("help", opcional=True)])
     analizador = Analizador(inicial=init, contextos=[artefacto1])
     resultado = analizador.analizar_args(["miartefacto", "--help"])
     assert len(resultado) == 2
     assert resultado[0].args.help.valor == "miartefacto"
     assert "help" not in resultado[1].args
예제 #4
0
 def valor_que_requiere_que_banderas_cores_tambien_trabajen_correctamente(
         self):
     "banderas de núcleo que requieren-valor también funcionan correctamente"
     inicial = Contexto(args=[Argumento("ocultar")])
     artefacto1 = Contexto("miartefacto")
     analizador = Analizador(inicial=inicial,
                             contextos=[artefacto1])
     resultado = analizador.analizar_args(
         ["miartefacto", "--ocultar", "ambos"])
     assert resultado[0].args.ocultar.valor == "ambos"
예제 #5
0
 def cuando_los_argumentos_de_conflicto_por_artefacto_ganan(self):
     # Contexto de análisis inicial con un --echo, más artefacto con el mismo
     inicial = Contexto(args=[self._echo()])
     artefacto1 = Contexto("miartefacto", args=[self._echo()])
     analizador = Analizador(inicial=inicial,
                             contextos=[artefacto1])
     # Llamar con --echo en el contexto por-artefacto, espere que
     # el contexto artefacto se actualice, y no nucleo.
     resultado = analizador.analizar_args(["miartefacto", "--echo"])
     assert resultado[0].args.echo.valor is False
     assert resultado[1].args.echo.valor is True
예제 #6
0
 def banderas_core_funcionan_normalmente_cuando_no_hay_conflicto(
         self):
     # Contexto de análisis inicial con un --echo, más un artefacto sin argumentos
     inicial = Contexto(args=[self._echo()])
     artefacto1 = Contexto("miartefacto")
     analizador = Analizador(inicial=inicial,
                             contextos=[artefacto1])
     # Llamar con --echo en el contexto por-artefacto, espere
     # que el contexto central se actualice (vs un error)
     resultado = analizador.analizar_args(["miartefacto", "--echo"])
     assert resultado[0].args.echo.valor is True
예제 #7
0
        class errores_de_analisis:
            def setup(self):
                self.p = Analizador(
                    [Contexto(nombre="foo", args=[Argumento("bar")])])

            def valores_de_bandera_que_faltan_generan_ParseError(self):
                with raises(ErrorDeAnalisis):
                    self.p.analizar_args(["foo", "--bar"])

            def adjunta_contexto_a_ParseErrors(self):
                try:
                    self.p.analizar_args(["foo", "--bar"])
                except ErrorDeAnalisis as e:
                    assert e.contexto is not None

            def contexto_adjunto_es_None_fuera_de_contextos(self):
                try:
                    Analizador().analizar_args(["wat"])
                except ErrorDeAnalisis as e:
                    assert e.contexto is None
예제 #8
0
 def clona_sin_contextos_iniciales(self):
     a = Argumento("foo")
     assert a.valor is None
     c = Contexto(nombre="miartefacto", args=(a, ))
     p = Analizador(contextos=(c, ))
     assert p.contextos["miartefacto"] is c
     r = p.analizar_args(["miartefacto", "--foo", "val"])
     assert p.contextos["miartefacto"] is c
     c2 = r[0]
     assert c2 is not c
     a2 = c2.args["foo"]
     assert a2 is not a
     assert a.valor is None
     assert a2.valor == "val"
예제 #9
0
 def clona_contexto_inicial(self):
     a = Argumento("foo", tipo=bool)
     assert a.valor is None
     c = Contexto(args=(a, ))
     p = Analizador(inicial=c)
     assert p.inicial is c
     r = p.analizar_args(["--foo"])
     assert p.inicial is c
     c2 = r[0]
     assert c2 is not c
     a2 = c2.args["foo"]
     assert a2 is not a
     assert a.valor is None
     assert a2.valor is True
예제 #10
0
 def bool_core_pero_por_cadena_de_artefacto(self):
     # Contexto inicial de análisis con bool --ocultar, y un
     # artefacto con un regular (cadena) --ocultar
     inicial = Contexto(
         args=[Argumento("ocultar", tipo=bool, default=False)])
     artefacto1 = Contexto("miartefacto",
                           args=[Argumento("ocultar")])
     analizador = Analizador(inicial=inicial,
                             contextos=[artefacto1])
     # Espera que, como la versión del artefacto gana, seamos
     # capaces de llamarlo con un valor. (Si hubiera bichos raros
     # en los que la bandera del núcleo informara al análisis, esto fallaría.)
     resultado = analizador.analizar_args(
         ["miartefacto", "--ocultar", "ambos"])
     assert resultado[0].args.ocultar.valor is False
     assert resultado[1].args.ocultar.valor == "ambos"
예제 #11
0
 def ignorar_desconocido_no_muta_resto_de_argv(self):
     p = Analizador([Contexto("ugh")], ignorar_desconocido=True)
     r = p.analizar_args(["ugh", "what", "-nowai"])
     # NOT: ['what', '-n', '-a', '-a', '-i']
     assert r.sin_analizar == ["what", "-nowai"]