Skip to content

fix(mart): validazione multi-year — tabelle con years non bloccano il run (#445) - #446

Merged
Gabrymi93 merged 5 commits into
mainfrom
fix/mart-multi-year-validation
Aug 2, 2026
Merged

fix(mart): validazione multi-year — tabelle con years non bloccano il run (#445)#446
Gabrymi93 merged 5 commits into
mainfrom
fix/mart-multi-year-validation

Conversation

@Gabrymi93

Copy link
Copy Markdown
Member

Sintesi

Fix della validazione mart multi-year (mart.tables[].years). Prima del fix, un candidate con tabelle mart multi-year non poteva completare il run: la validazione per-anno falliva (Missing required MART tables) e il passaggio multi-year non partiva mai. Inoltre le table_rules delle tabelle multi-year non venivano mai applicate.

Contesto collegato

Cosa cambia

  • toolkit — fix pipeline
  • support
  • docs
  • cleanup
  • workflow o CI
  • altro

Impatto

  • Cambia il comportamento di toolkit run per candidate con tabelle multi-year
  • Cambia il contratto con consumatori downstream — no: stessi output, ora validati
  • Solo documentazione o metadati
  • Nessun impatto visibile

Dettaglio

Gap 1 — mart/validate.py: validazione per-anno esclude le tabelle multi-year

run_mart_validation esclude dalle required_tables per-anno le tabelle con years (prodotte a livello dataset, non nel dir per-anno). Prima: Missing required MART tables falliva sempre il run quando esistevano tabelle multi-year in required_tables.

Gap 2 — mart/run.py: validazione multi-year applicata

run_mart_multi_year ora valida le tabelle prodotte con validate_mart (applica table_rules/required_tables delle tabelle con years). Prima: nessuna validazione multi-year esisteva — le regole non venivano mai applicate. L'esito è registrato nel metadata (validation) e nel return (validation_passed/validation_errors).

Gap 3 — cli/cmd_run.py: solo multi-year non blocca il run

Quando has_single_year_mart è False (tutte le tabelle multi-year), registra una validazione mart "skipped" (passed=True) per non far fallire il run per-anno. _maybe_run_multi_year_mart propaga validation_passed=False come errore (rispetta fail_on_error).

Verifica

python -m pytest tests/test_mart_multi_year.py -v

Test nuovi:

  • test_mart_only_multi_year — candidate con TUTTE le tabelle years: run passa, output dataset-level esiste, validazione multi-year applicata (prima falliva)

Verifica reale (dataset-incubator, iva-regionale con 1 tabella per-anno + 2 multi-year):

  • Run per-anno: passed (3/3 tabelle)
  • 2 output multi-year a livello dataset (10 e 21 righe)
  • metadata.validation.passed: True, 0 errori

Suite completa: 1222 passed. I 16 fallimenti sono pre-esistenti su main (fixture project-example mancante in ambiente locale), verificati indipendenti dal fix.

Checklist

  • Test aggiunto per il caso "solo multi-year"
  • Test esistenti multi-year passano
  • Verifica reale su iva-regionale (candidate con tabelle miste)
  • pre-commit (ruff) passato
  • Test suite completa verde in CI (i 16 fallimenti locali sono ambientali, da verificare su CI)

… run (issue #445)

Gap 1 — validate.py: run_mart_validation esclude dalle required_tables
per-anno le tabelle con mart.tables[].years (sono a livello dataset).
Prima: Missing required MART tables falliva sempre il run con solo
tabelle multi-year.

Gap 2 — run.py: run_mart_multi_year valida le tabelle prodotte con
validate_mart (table_rules/required_tables delle tabelle multi-year).
Prima: nessuna validazione multi-year esisteva. Aggiunto esito nel
metadata (layer mart_multi_year, field validation) e nel return
(validation_passed/validation_errors).

Gap 3 — cmd_run.py: quando has_single_year_mart è False (tutte le
tabelle multi-year), registra una validazione mart 'skipped' (passed)
per non far fallire il run per-anno. _maybe_run_multi_year_mart
propaga validation_passed=False come errore (fail_on_error).

Test: test_mart_only_multi_year — solo tabelle con years, run passa,
output dataset-level, validazione multi-year applicata.
Verifica reale: iva-regionale (tabelle miste) passa, 2 output
multi-year validati (10 e 21 righe).
- run.py: multi_year_names tipizzato set[str] (filtra i None)
- cmd_run.py: skipped_summary annotato dict[str, Any]

Risolve i 2 errori mypy introdotti dal fix #445 (gli altri 89
errori residui sono pre-esistenti su main: arg-type su
validate_mart/validate_clean e stub lab_connectors mancanti).
…skip

- cmd_run.py: estratto _skip_mart_validation in helper — riduce le righe
  aggiunte a run_year (il numero di riga del logger.error cambiava e il
  rich logger spezzava 'CLEAN SQL' inserendo l'ancora in mezzo)
- test_run_dry_run.py: assert robusti a 'CLEAN <ancora> SQL' (regex) —
  il wrap del logger dipende dal numero di riga, fragile tra versioni
- run.py: import locale di validate_mart nella funzione (evita di
  caricare lo stack di validazione all'import del modulo)

Verifica: test_run_dry_run 21/21 (su main e branch), test_mart_multi_year
2/2. Il comportamento del fix #445 è invariato.
…issue #445)

- path_resolver.py: _mart_output_paths distingue per tabella — con years
  l'output è data/mart/{dataset}/{name}.parquet (dataset-level), senza
  years resta nel dir per-anno. Prima tutti gli output erano nel dir
  per-anno → readiness/summary segnalavano mart_outputs_missing per le
  multi-year anche quando esistevano.

Verifica: review_readiness(iva-regionale) ora ready (8/8) invece di
needs-review (7/8); summary warnings vuoto, 3/3 output.
Test: test_mart_output_paths_multi_year_resolve_to_dataset_level —
path resolver multi-year a livello dataset, isolato (no run, no CWD).
Suite: test_mart_multi_year 3/3, test_cli_path_contract 23/23,
test_run_dry_run 21/21, test_run_validation_gate 7/7. mypy 0 errori.
…ger robusti

- test_mart_only_multi_year_validation_failure: table_rules violata in
  multi-year → run fallisce (validation_passed=False), metadata registra
  gli errori. Copre il ramo di errore prima non testato.
- test_run_dry_run: assert su 'CLEAN' + 'SQL' separati nel testo
  normalizzato, senza assumere l'ancora cmd_run.py:NNNN (formato logger).
- Test multi-year 4/4, dry-run 21/21, cli_path_contract 23/23.
@Gabrymi93

Copy link
Copy Markdown
Member Author

Review follow-up (2026-08-02) — checklist impatto aggiornata

In risposta alla review, segnalo la correzione alla sezione "Impatto su contratti pubblici" del body: la PR tocca il path output delle mart multi-year (le tabelle con years ora risolvono a livello dataset data/mart/{dataset}/{name}.parquet, non nel dir per-anno). Era un fix di coerenza (il runner scriveva già lì), ma il path resolver ora lo riflette — quindi:

  • Path output (nuovo layer, cambio percorso artifact) — le mart multi-year sono esposte nel path corretto

Per completezza, la checklist aggiornata:

  • Struttura dataset.yml — no
  • Path output — : il path resolver ora risolve le tabelle multi-year a livello dataset (era già il comportamento del runner, ora la diagnostica/readiness è coerente)
  • Schema parquet — no
  • CLI o MCP tool — no
  • API pubblica del toolkit — no (funzioni interne _mart_output_paths/_skip_mart_validation/_validate_multi_year_tables)

Downstream: dataset-incubator beneficia del fix (iva-regionale readiness 8/8), nessuna modifica richiesta ai candidate.

@Gabrymi93
Gabrymi93 merged commit 53c809c into main Aug 2, 2026
3 checks passed
@Gabrymi93
Gabrymi93 deleted the fix/mart-multi-year-validation branch August 2, 2026 14:00
Gabrymi93 added a commit that referenced this pull request Aug 2, 2026
- fix(mart): validazione multi-year — tabelle con years non bloccano il run (#445, PR #446)
- fix(readiness): tabelle mart multi-year risolvono a livello dataset
- test: ramo errore validazione multi-year + assert logger robusti
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.

pipeline: mart multi-year (tutte con years) — run per-anno fallisce e il multi-year non parte

1 participant