def conserva_miembros_basicos(self): c1 = Config( defaults={"clave": "default"}, anulaciones={"clave": "anular"}, sistema_prefijo="global", ususario_prefijo="usuario", dir_de_py="proyecto", acte_ruta="acte.yaml", ) c2 = c1.clonar() # NOTE: esperando valores por defecto idénticos también pruebas # implícitamente que clonar() pasa en defaults= en lugar de hacer # un init + copy vacío. (Cuando ese no es el caso, terminamos con # global_defaults() que se vuelve a ejecutar y se vuelve # a agregar a _defaults ...) assert c2._defaults == c1._defaults assert c2._defaults is not c1._defaults assert c2._anula == c1._anula assert c2._anula is not c1._anula assert c2._sistema_prefijo == c1._sistema_prefijo assert c2._ususario_prefijo == c1._ususario_prefijo assert c2._proyecto_prefijo == c1._proyecto_prefijo assert c2.prefijo == c1.prefijo assert c2.archivo_prefijo == c1.archivo_prefijo assert c2.entorno_prefijo == c1.entorno_prefijo assert c2._ruta_al_acte == c1._ruta_al_acte
def clones_resultantes_se_escriben_como_nueva_clase(self): class MiConfig(Config): pass c = Config() c2 = c.clonar(dentro=MiConfig) assert type(c2) is MiConfig
def conserva_config_combinada(self): c = Config(defaults={"clave": "default"}, anulaciones={"clave": "anular"}) assert c.clave == "anular" assert c._defaults["clave"] == "default" c2 = c.clonar() assert c2.clave == "anular" assert c2._defaults["clave"] == "default" assert c2._anula["clave"] == "anular"
def no_recarga_los_datos_del_archivo(self, cargar_yaml): ruta = join(CONFIGS_RUTA, "yaml/") c = Config(sistema_prefijo=ruta) c2 = c.clonar() assert c2.exterior.interior.hurra == "yaml" # Manera mala de decir "solo me llamaron con esta invocación # específica una vez" (ya que assert_called_with se enoja con # otras invocaciones con diferentes argumentos) llamadas = cargar_yaml.llamada_a_lista_de_args mi_llamada = llamar("{}dued.yaml".format(ruta)) try: llamadas.remover(mi_llamada) assert mi_llamada not in llamadas except ValueError: err = "{} no encontrado en {} veces!" assert False, err.format(mi_llamada, llamadas)
def no_hace_depcopy(self): c = Config( defaults={ # se fusionará con los dics felizmente "oh": { "querido": { "dios": object() } }, # Y valores compuestos de copia superficial "superficial": { "objetos": ["copia", "bien"] }, # conservará referencias a dic íntimo, tristemente. No # mucho podemos hacer sin incurrir en problemas deepcopy # (o ponerlo en práctica de nuevo completamente) "bien": { "nopuedo": ["tener", { "todo": "queremos" }] }, }) c2 = c.clonar() # Identidad básica assert c is not c2, "Clon tenía la misma identidad que original!" # Los dicts se recrean assert c.oh is not c2.oh, "La clave de nivel superior tenía la misma identidad." assert ( c.oh.querido is not c2.oh.querido ), "¡La clave de nivel medio tenía la misma identidad!" # noqa # Los valores básicos se copian err = "¡Objeto() hoja tenía la misma identidad!" assert c.oh.querido.dios is not c2.oh.querido.dios, err assert c.superficial.objetos == c2.superficial.objetos err = "¡La lista superficial tenía la misma identidad!" assert c.superficial.objetos is not c2.superficial.objetos, err # Los objetos no-dict profundamente anidados siguen siendo # problemáticos, oh bueno err = "¿Eh, un dict-in-a-lista profundamente anidado tenía una identidad diferente?" # noqa assert c.bien.nopuedo[1] is c2.bien.nopuedo[1], err err = "¿Eh, un valor de dict-in-a-lista profundamente anidado tenía una identidad diferente?" # noqa assert (c.bien.nopuedo[1]["todo"] is c2.bien.nopuedo[1]["todo"]), err # noqa
def valores_no_conflictivos_se_fusionan(self): # NOTE: Esto es realmente sólo comportamiento básico del clonar. class MiConfig(Config): @staticmethod def global_defaults(): orig = Config.global_defaults() orig["nuevo"] = {"datos": "oh"} return orig c = Config(defaults={"otro": {"datos": "hola"}}) c["acte"] = {"modificacion": "que onda"} c2 = c.clonar(dentro=MiConfig) # Nuevos datos predeterminados de MiConfig presente assert c2.nuevo.datos == "oh" # Así como los datos predeterminados antiguos de la instancia # clonada assert c2.otro.datos == "hola" # Y mods de usuario de acte de la instancia clonada assert c2.acte.modificacion == "que onda"
def no_se_requiere(self): c = Config(defaults={"bah": "bien"}) c2 = c.clonar() assert c2.bah == "bien"
def conserva_data_de_entorno(self): os.environ["DUED_FOO"] = "bar" c = Config(defaults={"foo": "nobar"}) c.cargar_entorno_shell() c2 = c.clonar() assert c2.foo == "bar"
def conserva_datos_del_archivo(self): c = Config(sistema_prefijo=join(CONFIGS_RUTA, "yaml/")) assert c.exterior.interior.hurra == "yaml" c2 = c.clonar() assert c2.exterior.interior.hurra == "yaml" assert c2._sistema == {"exterior": {"interior": {"hurra": "yaml"}}}