feat(layout): scoperta sezioni dati per convenzione — zero mappa repo - #462
Conversation
Sostituisce REPO_DATASET_DIRS (mappa hardcoded repo→dirs) con una
scoperta per convenzione: una dir di primo livello del repo è una sezione
dati se contiene {slug}/dataset.yml. Vale per qualsiasi layout presente
e futuro (datasets/, support/, candidates/, compose/, ...) — un nuovo repo
con layout custom non richiede più modifiche al toolkit.
- layout.py: repo_dataset_dirs(repo_dir) scopre le sezioni, esclude dir
nascoste (.github, .git) e templates/ (falsi positivi verificati)
- catalog.py/discovery.py: passano repo_dir invece di repo.name
- Test: 5 contract di scoperta (flat, multi-sezione, DI, esclusioni,
default compat) — sostituiscono i 2 della vecchia mappa
Verifica: open-conto-annuale e open-siope scoprono ('datasets','support')
senza dichiarazione; 1334 test verdi, ruff+mypy puliti.
…dati
Review finding (fix-required): la scoperta per convenzione esponeva
toolkit/smoke/ come sezione dati — 6 fixture di test (bdap_ckan_csv,
bdap_http_csv, ...) comparivano nel find workspace (224 totali invece
di 218 reali).
- _EXCLUDED_SECTION_DIRS: aggiunto smoke/ (fixture di test)
- rimosso il fallback a ('datasets',): un repo senza sezioni scoperte
NON è un repo dati → tuple vuota, il chiamante lo salta (prima 35 repo
non-dati ricevevano il default e venivano scanditi inutilmente)
- DEFAULT_DATASET_DIRS resta solo come default del dataclass RepoLayout
(builder con layout esplicito)
Test: test_excludes_templates_and_hidden ora include smoke/;
test_no_sections_returns_default → test_no_sections_returns_empty.
Verificato: find workspace 224→218 (6 smoke rimossi), 1334 verdi,
ruff+mypy puliti.
…overy Due fix collegati, chiudono il finding monthly HDD: 1. _scan_workspace_configs: slug da dataset.name (chiave canonica, come load_manifest) invece di data['slug'] or dir_slug — 22/188 dataset avevano slug dalla dir (es. 'precipitazioni' vs 'precipitazioni_bologna', 'anag-enti' vs 'ca_anag_enti_seed'). data['slug'] top-level è morto (0 usi). 2. resolve_config_path Stage 4: fallback alla mappa slug→config_path di _scan_workspace_configs quando la ricerca per dir fallisce (dir totalmente diversa dallo slug, o senza dir locale — monthly HDD). Test: +3 (slug da dataset.name, fallback dir senza name, resolve dir≠slug via mappa). Verificato: tutti i casi risolvono (precipitazioni_bologna, ca_anag_enti_seed, siope_anag_enti_seed, chddr2_m senza dir locale). 1337 verdi, ruff+mypy puliti.
Completamento finding monthly HDD (commit
|
Tipo
root fix / refactor — sostituisce la mappa hardcoded
REPO_DATASET_DIRS(repo→dirs) con una scoperta per convenzione: zero dichiarazioni per repo, scalabile a qualsiasi layout presente e futuro.Problema reale
REPO_DATASET_DIRSera una mappa{repo: (dirs,)}: ogni repo nuovo con layout custom richiedeva una riga in più nel toolkit. L'arrivo diopen-conto-annuale(layoutdatasets/+support/nella PR open-conto-annuale#3) avrebbe richiesto l'ennesima aggiunta — punto e a capo a ogni repo. Inoltreopen-siope(giàdatasets/+support/) non era dichiarato affatto.Soluzione — risoluzione univoca
Una dir di primo livello del repo è una sezione dati se contiene
{slug}/dataset.yml. La convenzione è la fonte unica:datasets/,support/,candidates/,compose/,support_datasets/,anagrafica/— qualunque layout — vengono scoperte senza dichiararle.Esclusioni (falsi positivi verificati): dir nascoste (
.github/ISSUE_TEMPLATE/dataset.yml,.git) etemplates/(candidate seed).Contratto riusato/sostituito
REPO_DATASET_DIRS+repo_dataset_dirs(repo_name)(mappa) →repo_dataset_dirs(repo_dir)(scoperta).catalog.pyscan configs,discovery.pyStage 3) — cambia solo l'argomento darepo.namearepo_dir.Implementazione
toolkit/registry/layout.pyrepo_dataset_dirs(repo_dir): scopre le sezioni da{section}/*/dataset.yml, esclude nascoste+templates, default("datasets",)se nessunatoolkit/domain/catalog.py_scan_workspace_configspassarepo_dir; docstring aggiornatatoolkit/core/discovery.pyresolve_config_pathStage 3 passarepo_dirtests/test_registry_builder.pyVerifica
('datasets', 'support')senza dichiarazione('datasets', 'support')(prima non dichiarato)('candidates', 'compose', 'support_datasets')scoperto('datasets',)invariatoRischio residuo
("datasets",)per repo senza sezioni mantiene la compat con il vecchio default — un repo senza dataset.yml ma con dirdatasets/vuota lo usa comunque.open-conto-annualeè su branch pre-migrazione (layoutanagrafica/): la scoperta lo vede già; dopo il merge della sua PR Ridurre il surface area del toolkit e consolidare il contract runtime #3 saràdatasets/+support/— nessuna modifica al toolkit necessaria (è il punto della PR).Follow-up
Nessuno obbligatorio. Con questa PR, il toolkit scopre i layout senza conoscerli — il pattern si applica a qualsiasi repo futuro.