Skip to content

feat(h4-2): exportador CSV/JSON del log de eventos (RF-11)#26

Merged
Jacket-69 merged 2 commits into
mainfrom
feat/h4-2-exportador-csv-json
May 21, 2026
Merged

feat(h4-2): exportador CSV/JSON del log de eventos (RF-11)#26
Jacket-69 merged 2 commits into
mainfrom
feat/h4-2-exportador-csv-json

Conversation

@Jacket-69
Copy link
Copy Markdown
Owner

Resumen

Segunda fase de H4: subcomando sentinel export que produce CSV (Excel-ready) y JSON (auditoría humana) a partir del log canónico eventos.jsonl generado en H4-1. Cierra RF-11.

Cambios

Adapter adapters/exportador.py:

  • exportar_a_csv(eventos, path) -> int: flatten del payload anidado a columnas payload_*; listas serializadas a JSON string; encoding utf-8-sig (BOM). Unión de columnas para payloads heterogéneos (saturación tiene menos campos que óptimo).
  • exportar_a_json(eventos, path) -> int: array indentado sin BOM, formato apto para jq y revisión humana.
  • Helper _aplanar_dict(d, prefijo) recursivo.

CLI interfaces/cli/export_cmd.py:

  • sentinel export --formato {csv,json} --in eventos.jsonl --out reporte.{csv,json}.
  • Enum FormatoExport para validación.
  • Exit 2 si --in no existe o el JSONL es corrupto (propagado desde JsonlRepositorioEventos.__init__pydantic.ValidationError).

Decisiones intencionales

  • CSV con flatten (no JSON-string-en-celda): produce columnas tabulares clásicas que LibreOffice/Excel manejan nativamente, a costa de duplicar prefijo payload_. Razonable para auditoría manual; un consumidor programático debería usar JSON.
  • JSON como array, no JSONL: el log canónico ya es JSONL. El export es para humanos; un array indentado es más usable.
  • utf-8-sig con BOM en CSV: regla pragmática para Excel español sin reconfigurar locales. JSON queda sin BOM (estándar IETF).
  • Sin streaming: ADR-0007 estima ~30-50 eventos por simulación, todos caben en memoria. Si crece, refactor trivial a iterator-to-iterator.

Validación local

  • ruff check + ruff format --check: ✓ (68 archivos).
  • mypy src/sentinel_dispatch: ✓ (36 archivos).
  • pytest tests/unit tests/integration --no-cov: 249 passed in 3.61s (235 baseline + 14 nuevos).
  • Cobertura global: 92.66 %.

DoD

  • RF-11 cerrado funcionalmente (CSV + JSON + CLI + tests).
  • El log canónico JSONL NO se modifica (RN-03 preservado): este subcomando solo lee.
  • No requiere ADR (decisión localizada al adapter; el schema fuente ya está en ADR-0018).
  • Trazabilidad actualizada: RF-11 → ✅.
  • CHANGELOG entry bajo [Unreleased].
  • CI compare debe seguir 12/12 OK bit-exacto (este PR no toca RT-02).

Commits

  1. 633d992 feat(h4-2): exportador CSV/JSON del log de eventos (RF-11)
  2. af41878 docs(quality): RF-11 ✅ + entrada H4-2 en CHANGELOG

Próxima fase

H4-3: application/simulacion.py (RF-12). Fase 5 del plan H4.

Jacket-69 added 2 commits May 21, 2026 13:23
Nuevo adapter `adapters/exportador.py` con dos funciones puras:
- `exportar_a_csv(eventos, path)`: flatten del `payload` anidado a
  columnas `payload_*` (e.g. `payload_costo_total`); listas serializadas
  como JSON string; encoding `utf-8-sig` con BOM para Excel ES; unión
  de columnas para payloads heterogéneos (saturación vs óptimo).
- `exportar_a_json(eventos, path)`: array indentado sin BOM, formato
  apto para herramientas tabulares (`jq`) y auditoría humana.

Nuevo subcomando CLI `sentinel export --formato {csv,json} --in --out`
con enum `FormatoExport`. Exit 2 si la entrada no existe o es JSONL
corrupto (propagado desde `JsonlRepositorioEventos.__init__`).

El log canónico (`eventos.jsonl`) NO se modifica — el export es un
archivo derivado. RN-03 preservado: este subcomando solo lee.

Tests: 14 nuevos verdes (Normal/Borde + CLI end-to-end con archivo
inexistente y corrupto). Suite total 249/249, cov 92.66 %.
Trazabilidad: RF-11 ✅ apuntando a `adapters/exportador.py` +
`interfaces/cli/export_cmd.py`. Descripción del schema CSV (flatten
con prefijo `payload_`, encoding utf-8-sig BOM) y JSON (array indentado).
CHANGELOG: entrada "H4 fase 2" bajo [Unreleased] con resumen del
exportador, decisiones de encoding y cobertura del test suite.
@Jacket-69 Jacket-69 merged commit 0e2d448 into main May 21, 2026
6 checks passed
@Jacket-69 Jacket-69 deleted the feat/h4-2-exportador-csv-json branch May 21, 2026 17:25
Jacket-69 added a commit that referenced this pull request May 29, 2026
feat(h4-2): exportador CSV/JSON del log de eventos (RF-11)
Jacket-69 added a commit that referenced this pull request May 29, 2026
feat(h4-2): exportador CSV/JSON del log de eventos (RF-11)
Jacket-69 added a commit that referenced this pull request May 29, 2026
feat(h4-2): exportador CSV/JSON del log de eventos (RF-11)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant