sergio/takana
> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…
⎇ b0085e7cf6978a7f9e27aa863f756a463fc1407e
scripts/mudanza/formatos/__init__.py
History
Who touched what
raw
traducir: familia «servicio» — systemd → tarjeta de arje, y el pivote pasa a ser uno POR FAMILIA
1"""Registro de PLUGINS de formato (SDD 29).
2
3Un formato se agrega dejando un fichero en este directorio que decore sus funciones con `@lector` y
4`@escritor`. No hay que tocar el centro ni ningún otro plugin: ése es el punto de tener un pivote.
5
6 @lector("nginx", familia="web")
7 def leer(texto) -> Config: ...
8
9 @escritor("caddy", familia="web")
10 def escribir(cfg) -> str: ...
11
12⚠ **LA FAMILIA NO ES DECORACIÓN.** El pivote es uno por familia: un unit de systemd no es un sitio
13web, y emparejar un lector de servicios con un escritor de web produciría basura *plausible* — el
14modo de fallo caro. El registro empareja SÓLO dentro de la familia y rechaza el cruce con un error,
15no con un intento. Es la misma regla del acta, aplicada un nivel más arriba: parecerse es peor que
16faltar.
17"""
18import importlib, pkgutil, pathlib
19
20LECTORES, ESCRITORES = {}, {} # nombre -> (funcion, familia)
21
22
23def lector(nombre, familia="web"):
24 def deco(f):
25 LECTORES[nombre] = (f, familia)
26 return f
27 return deco
28
29
30def escritor(nombre, familia="web"):
31 def deco(f):
32 ESCRITORES[nombre] = (f, familia)
33 return f
34 return deco
35
36
37def cargar():
38 """Importa todos los plugins del directorio. Descubrimiento, no lista cableada: una lista que hay
39 que editar a mano se desincroniza y el formato nuevo 'no existe' sin que nada falle."""
40 for m in pkgutil.iter_modules([str(pathlib.Path(__file__).parent)]):
41 if not m.name.startswith("_"):
42 importlib.import_module(f"{__name__}.{m.name}")
43 return LECTORES, ESCRITORES
44
45
46def familias():
47 """{familia: (lectores, escritores)} — para listar y para contar pares de verdad."""
48 d = {}
49 for n, (_, fam) in LECTORES.items():
50 d.setdefault(fam, ([], []))[0].append(n)
51 for n, (_, fam) in ESCRITORES.items():
52 d.setdefault(fam, ([], []))[1].append(n)
53 return {k: (sorted(v[0]), sorted(v[1])) for k, v in sorted(d.items())}