Skip to content

feat: unifica toolkit_layer — mode=sql su raw, catalog mode (datasets), scope validation - #422

Merged
Gabrymi93 merged 11 commits into
mainfrom
feat/layer-sql-raw-and-cross-dataset
Jul 28, 2026
Merged

feat: unifica toolkit_layer — mode=sql su raw, catalog mode (datasets), scope validation#422
Gabrymi93 merged 11 commits into
mainfrom
feat/layer-sql-raw-and-cross-dataset

Conversation

@Gabrymi93

Copy link
Copy Markdown
Member

Sintesi

toolkit_layer diventa il tool SQL unico: supporta SQL su layer raw (CSV), cross-dataset SQL via slugs, e scope validation. Tre unificazioni in uno.

Contesto collegato

Continua il percorso di unificazione iniziato con le PR #419, #420, #421.

Cosa cambia

1. mode=sql ora funziona su layer=raw

Prima era bloccato (ValueError: mode=sql non e' supportato per layer=raw). Ora DuckDB legge il CSV primario via read_csv_auto e lo espone come tabella data.

2. Catalog mode: datasets=[slug1, slug2, ...]

Nuovo parametro datasets (mutuamente esclusivo con config_path) per query cross-dataset su dataset pubblicati GCS/workspace. Usa CatalogResolver per risolvere slug → URL parquet, costruisce CTE multipli, esegue SQL.

3. Scope validation (catalog mode)

Portata da clean-query: blocca DDL/DML (DROP, ALTER, INSERT...), read_parquet() diretto, tabelle non dichiarate nei CTE. Hard cap a 500 righe.

Backward compat

toolkit_layer(config_path=..., mode=sql, layer=clean) invariato. datasets=None di default.

Impatto

  • Documentazione o testi
  • Policy GitHub o template
  • Codice o automazioni
  • Pipeline dati o trasformazioni
  • Contenuti o metadati di dataset
  • Nessun impatto visibile per chi usa il repository

Verifica

  • 90/90 test passanti (invariati)
  • Test reale cross-dataset SQL su GCS: terna_electricity_by_source GROUP BY regione → 8 righe, ok
  • Scope validation testata: blocca tabelle non consentite, read_parquet, DROP
  • toolkit_layer(mode=sql, config_path=...) invariato

Controlli

  • Questa PR e' nel repository giusto
  • Ho collegato issue o discussion quando serve
  • Ho verificato l'impatto su documentazione, codice o dati
  • Ho aggiornato solo quello che era davvero necessario
  • I test nuovi o modificati hanno marker (contract/policy/regression/adapter/pure_unit/smoke)
  • Se la PR fixa un bug: il test che lo protegge e' marcato regression con link all'issue

Note per chi revisiona

  • I test esistenti coprono gia' toolkit_layer (mode=schema/preview/profile/sql con config_path)
  • La catalog mode non ha ancora test dedicati (solo prova reale manuale) — da aggiungere in iterazione successiva se serve
  • scope validation e' un parser SQL naive (regex), non un parser AST — sufficiente per i casi d'uso del Lab

Gabrymi93 added 11 commits July 28, 2026 15:30
- _resolve_datasets converte qualsiasi s3:// in https://storage.googleapis.com/
  (vale sia per clean che per mart)
- year=None entries incluse nel filtro anno (serie storiche)
- Sort key corretto per year=None
- Import CLEAN_BUCKET/MART_BUCKET da lab_connectors.gcs.paths
  invece di ridefinirli in catalog_ops.py
L'import del modulo server.py chiama create_mcp_server() a livello
modulo, che richiede 'mcp'. pytest.importorskip a livello modulo
skipka l'intero file se mcp non e' installato.

In CI: 22 skipped invece di 4 error.
In locale con lab-connectors[mcp]: 22 passed.
pytest.importorskip('mcp') trova il package 'mcp' ma non garantisce
che mcp.server.fastmcp.FastMCP sia disponibile. Usa importorskip
sul submodulo che crea_mcp_server() importa davvero.
@Gabrymi93
Gabrymi93 merged commit 56407d2 into main Jul 28, 2026
3 checks passed
@Gabrymi93
Gabrymi93 deleted the feat/layer-sql-raw-and-cross-dataset branch July 28, 2026 15:16
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