tawasuyu

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…

TOML 1184Shell 70Rust 62Markdown 501503 Definiciones

⎇ 9e50ea43a3e29095e81ddcbd7418e15e5e4b844e scripts/mudanza/formatos/__init__.py Python · 53 líneas · 1.9 KB Historia Quién tocó qué crudo

traducir: familia «servicio» — systemd → tarjeta de arje, y el pivote pasa a ser uno POR FAMILIA fefa92ec5 · Sergio ·

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())}