Generador de reportes PDF usando Typst como motor de renderizado.
- Python 3.11+
- uv
uv syncuv add "git+https://github.com/ernestopalacios/report_typst"from pathlib import Path
from report_typst import Report, ReportMetadata
from report_typst.renderers.pypi_typst import PyTypstRenderer
report = Report(
report_type="log_report",
renderer=PyTypstRenderer(),
metadata=ReportMetadata(
id="OT-123",
estado="EN PROCESO",
fecha="2025-01-15",
extra={"cuadrilla": "Alpha", "responsable": "Juan Pérez"},
),
templates_dir=Path("src/report_typst/templates"),
)
report.add_entry("ERROR", "No coinciden las fechas", "Detalle del error...")
report.add_entry("INFO", "Procesamiento completado", "Sin observaciones")
result = report.generate()
print(f"PDF generado: {result.pdf_path}")report_type |
v1 mapper | Plantilla | Estado |
|---|---|---|---|
log_report |
log_report_v1_mapper |
log_report_v1.typ |
Estable |
marcas_report |
marcas_report_v1_mapper |
marcas_report_v1.typ |
Placeholder |
La clase Report (src/report_typst/core.py) es un traductor puro: recibe datos estructurados y produce un PDF. No contiene lógica de negocio.
- Renderer inyectable:
Reportrecibe unTypstRenderer(Protocol enrenderer.py). La implementación de producción esPyTypstRenderer(renderers/pypi_typst.py, basada en el paquetetypstde PyPI). Esto permite testear con mocks sin compilar Typst real. - Tipos de reporte: registrados en
report_types.pyvíamatch/caseenresolve_report_spec(). Cada tipo define su plantilla.typy un mapper que transformaLogEntry/ReportMetadataal dict que la plantilla espera. - Plantillas:
.typensrc/report_typst/templates/. Nomenclatura:{report_type}_v{version}.typ. - Metadatos extensibles:
ReportMetadatatiene campos base (id,estado,fecha) y un dictextrapara campos específicos de cada proyecto.
- Crear una plantilla
mi_reporte_v1.typentemplates/. - Escribir un mapper en
report_types.py. - Agregar un
caseenresolve_report_spec().
uv run pytest # tests unitarios (sin integración)
uv run pytest -m '' # todos los tests, incluyendo integración
uv run pytest --cov=report_typst # con coberturaLos tests de integración compilan Typst real y están marcados con @pytest.mark.integration. Quedan excluidos del run por defecto.
Para más detalles de arquitectura, consultar AGENTS.md.