Skip to content

Commit 08ecc36

Browse files
aborrusoclaude
andcommitted
release: v1.0.0
Roadmap completa verso la produzione: py.typed + mypy --strict, CI GitHub Actions, metadata PyPI (Repository/Issues), installazione da PyPI documentata, --timeout configurabile, coverage 89%→99% (+ fix di un bug reale: --format invalido produceva un traceback), CHANGELOG.md, knowledge bundle OKF in knowledge/, valutazione produzione in docs/. Nessun push, tag o pubblicazione PyPI in questo commit. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent a308344 commit 08ecc36

38 files changed

Lines changed: 1142 additions & 25 deletions

.github/workflows/ci.yml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
8+
jobs:
9+
test:
10+
runs-on: ubuntu-latest
11+
strategy:
12+
matrix:
13+
python-version: ["3.12", "3.13"]
14+
steps:
15+
- uses: actions/checkout@v4
16+
17+
- name: Install uv
18+
uses: astral-sh/setup-uv@v5
19+
with:
20+
python-version: ${{ matrix.python-version }}
21+
22+
- name: Install dependencies
23+
run: uv sync --locked
24+
25+
- name: Lint (ruff)
26+
run: uv run ruff check .
27+
28+
- name: Type-check (mypy)
29+
run: uv run mypy src/openrndt
30+
31+
- name: Test (pytest)
32+
run: uv run pytest -v

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,6 @@ tmp.md
2424
# Local outputs
2525
*.out
2626
out.txt
27+
28+
# Test coverage
29+
.coverage

CHANGELOG.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Changelog
2+
3+
Tutte le modifiche rilevanti di questo progetto sono documentate qui.
4+
5+
Il formato segue [Keep a Changelog](https://keepachangelog.com/it/1.0.0/); il progetto segue [Semantic Versioning](https://semver.org/lang/it/).
6+
7+
## [1.0.0] - 2026-07-17
8+
9+
### Added
10+
11+
- Type-checking `mypy --strict` in CI e come dipendenza dev.
12+
- `py.typed` (PEP 561): la libreria distribuisce i tipi a chi la importa.
13+
- CI GitHub Actions (`.github/workflows/ci.yml`): ruff, mypy, pytest su push/PR, matrice Python 3.12/3.13.
14+
- Opzione globale `--timeout` per il timeout HTTP per singolo tentativo (default 30s).
15+
- Metadata PyPI: `Repository`/`Issues` in `[project.urls]`.
16+
- Sezione README per l'installazione da PyPI (`uv tool install openrndt` / `uvx`).
17+
- Suite di test estesa a 55 test, coverage 99%.
18+
19+
### Fixed
20+
21+
- `--format <valore-invalido>` produceva un traceback completo invece di un messaggio leggibile: ora catturato ed esce con codice 2, coerente col principio "mai uno stack trace".
22+
23+
## [0.1.0] - 2026-05-27
24+
25+
### Added
26+
27+
- Comandi `search`, `get`, `discover` (MVP read-only sul RNDT).
28+
- Libreria Python parallela alla CLI (`search`, `get_item`, `get_item_xml`, `get_item_html`, `ItemNotFoundError`).
29+
- Formati di output `json` (default), `table`, `csv`, `compact` (NDJSON per agenti AI).
30+
- Gestione errori pensata per orchestrazione LLM: mai stack trace, exit code distinti (0/1/2), messaggi self-contained su stderr.
31+
- Retry esponenziale su timeout/5xx (`tenacity`).
32+
- Codelist offline (ISO 19115, campi Lucene, formati) per `discover`, senza chiamate di rete.
33+
- Skill Claude Code `rndt-explorer` per l'esplorazione guidata del catalogo.
34+
- Bug noti dell'API RNDT documentati e compensati (`dataCategory` che non filtra, `sort` "amichevole" ignorato, item inesistente → 200 con `found: false`).

LOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
# LOG
22

3+
## 2026-07-17
4+
5+
- **Valutazione readiness produzione v0.1.0** in `docs/evaluation-v0.1.0.md`: codice production-grade, gap tutti infrastrutturali (no CI, no mypy, metadata PyPI incompleti, manca `py.typed` e CHANGELOG). Roadmap verso v1.0 inclusa.
6+
- **Knowledge bundle OKF** in `knowledge/`: documentazione del progetto in Open Knowledge Format (markdown + frontmatter YAML, leggibile da umani e agenti). 18 file: project, architecture, skill, cli/ (search, get, discover), library/, api/ (endpoint + bug noti verificati live), conventions/ (errori, output, testing). Validato conforme OKF v0.1 (frontmatter `type`, cross-link integri).
7+
- **`py.typed`** (PEP 561) aggiunto in `src/openrndt/`: verificato presente nel wheel dopo `uv build` senza bisogno di config aggiuntiva (`uv_build` lo include automaticamente). 38/38 test verdi. Primo punto della roadmap v1.0 in `docs/evaluation-v0.1.0.md`.
8+
- **`mypy --strict` pulito** (secondo punto roadmap): aggiunto al gruppo dev, config `[tool.mypy]` in `pyproject.toml`. 5 fix reali: `discover()` in `cli.py` riusava la variabile `section` con due tipi diversi (rinominata `values`); `dict` senza type-arg in `client.py`; 3 `no-any-return` (`response.json()` non annotato) in `search.py`/`item.py`, risolti annotando la variabile o con `cast`. 38/38 test e ruff ancora verdi.
9+
- **CI GitHub Actions** (terzo punto roadmap): `.github/workflows/ci.yml`, matrice Python 3.12/3.13, step `uv sync --locked``ruff check``mypy``pytest -v` su push/PR verso main. Sequenza verificata localmente prima del commit.
10+
- **Metadata `[project.urls]`** (quarto punto): aggiunti `Repository`/`Issues` verso `github.com/ondata/openrndt`; rinominati i link RNDT (`RNDT Portal`/`RNDT REST API`) per chiarire che non sono il repo del codice.
11+
- **README: installazione da PyPI** (quinto punto): sezione dedicata con `uv tool install openrndt`/`uvx`, nota onesta che il package non è ancora pubblicato; installazione locale riorganizzata in sezioni "Da locale" / "Per sviluppo".
12+
- **`--timeout` configurabile in CLI** (sesto punto): nuova opzione globale, stesso pattern di `--base-url` (override in `config.py`: `get_timeout()`/`set_timeout()`, usato come default da `client.rndt_request()`). Verificato live: `--timeout 0.5` contro un IP non instradabile fallisce in ~1.5s con messaggio leggibile ed exit 1 (no traceback), invece dei ~90s del default. 38/38 test, ruff e mypy verdi.
13+
- **v1.0.0** (ottavo punto, parziale su richiesta esplicita): `CHANGELOG.md` (Keep a Changelog), bump versione in `pyproject.toml`/`__init__.py`, classifier PyPI `3 - Alpha``5 - Production/Stable`, README aggiornato. Build 1.0.0 verificata (`uv build` + `twine check` PASSED, `py.typed` nel wheel). **Nessun push, tag o pubblicazione PyPI**: su richiesta dell'utente, questo giro si ferma al commit locale — tag/push/publish restano un passo successivo esplicito.
14+
- **Coverage 89%→99%** (settimo punto) e **bug reale trovato nel farlo**: `--format <valore-invalido>` produceva un traceback completo (verificato live) — violava il principio cardine "mai uno stack trace". Fix: `ValueError` di `output.set_mode()` ora catturato nel callback `_root` di `cli.py` → messaggio leggibile + exit 2. +17 test: `tests/test_output.py` nuovo (rami table/csv irraggiungibili dalla CLI, testati chiamando `output.emit()` direttamente); percorsi di successo mai testati a livello CLI (`get` default json, `get --html`, `get --format table`, `discover` in table); `search --format compact` zero risultati; payload di risposta non-dict; parametro `--modified`; `keywords_s` come stringa singola; download senza `dctype`. Aggiunto `pytest-cov` (dev) e fixture di reset per `output_mode`/`timeout` in `conftest.py` (stesso pattern di `_reset_base_url`). Coverage residua (99%, righe 230/234 di `cli.py`): solo `main()`/`__main__` boilerplate. 55/55 test, ruff e mypy verdi.
15+
316
## 2026-06-11
417

518
- **Nuovo formato `--format compact` (NDJSON per agenti).** Quarto formato di output per `search`: una riga JSON per record con i soli campi ad alto segnale (`id`, `title`, `org`, `type`, `category`, `updated`, `resources`). Pensato per far scremare molti risultati a basso consumo di token prima del `get`. Spunto dal progetto Copernicus-Services-Products-Metadata (rendering sintetico dei risultati; lì *prima* della ricerca perché catalogo locale, qui *dopo* perché catalogo remoto).

README.md

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
CLI Python e libreria per accedere al **Repertorio Nazionale dei Dati Territoriali (RNDT)**
44
pensata per essere orchestrata da un'AI.
55

6-
> Stato: alpha (v0.1) — read-only.
6+
> Stato: v1.0 — read-only.
77
88
## Cos'è il RNDT
99

@@ -13,21 +13,36 @@ API per cercare e scaricare i metadati.
1313

1414
## Installazione
1515

16+
### Da PyPI
17+
18+
```bash
19+
uv tool install openrndt
20+
# oppure, senza installazione persistente:
21+
uvx openrndt --help
22+
```
23+
24+
> Non ancora pubblicato su PyPI (roadmap verso la v1.0). Nel frattempo installa da locale.
25+
26+
### Da locale
27+
1628
```bash
17-
# CLI globale (consigliato): venv isolato, eseguibile in PATH
18-
uv tool install /path/to/openrndt
29+
git clone https://github.com/ondata/openrndt.git
30+
cd openrndt
31+
32+
# CLI globale: venv isolato, eseguibile in PATH
33+
uv tool install .
1934

2035
# Aggiornamento dopo modifiche al codice
21-
uv tool install --reinstall /path/to/openrndt
36+
uv tool install --reinstall .
2237

2338
# Disinstallazione
2439
uv tool uninstall openrndt
2540
```
2641

27-
Per sviluppo (modifiche con ricarica immediata):
42+
### Per sviluppo (modifiche con ricarica immediata)
2843

2944
```bash
30-
git clone <repo>
45+
git clone https://github.com/ondata/openrndt.git
3146
cd openrndt
3247
uv sync
3348
uv run openrndt --help
@@ -55,6 +70,13 @@ openrndt get age:D_E973_MARSAGLIA --xml > meta.xml
5570
openrndt discover
5671
```
5772

73+
Il timeout HTTP per singolo tentativo è configurabile con `--timeout` (default 30s);
74+
con i retry su timeout/5xx (3 tentativi) il caso peggiore è ~3x questo valore:
75+
76+
```bash
77+
openrndt --timeout 5 search --q "catasto" --num 5
78+
```
79+
5880
Tutti i comandi accettano `--format json` (default), `--format table`, `--format csv`.
5981
Per `search` c'è anche `--format compact`: una riga NDJSON per record con i soli
6082
campi ad alto segnale (`id`, `title`, `org`, `type`, `category`, `updated`,

docs/evaluation-v0.1.0.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# Valutazione openrndt v0.1.0 — readiness per produzione
2+
3+
Data: 2026-07-17. Metodologia: lettura sistematica di `src/openrndt/` (7 moduli, 299 statement), esecuzione reale della suite test (`uv run pytest` + coverage con `pytest-cov`), build effettiva del package (`uv build` + `twine check`), esecuzione CLI live contro `https://geodati.gov.it/RNDT` (search reale, 8.827 risultati per "catasto"), test di percorsi d'errore (ID inesistente, parametro fuori range, host irraggiungibile, formato non tabellare). Valutazione indipendente, senza riferimenti a valutazioni precedenti.
4+
5+
## Giudizio sintetico
6+
7+
Il codice è solido, coerente e già production-grade nella sua logica applicativa: gestione errori disciplinata, test reali (non mock banali), doc allineata al comportamento verificato live. Quello che manca per una release pubblica non è nel codice ma nell'infrastruttura attorno: non c'è CI, non c'è type-checking automatizzato, il packaging PyPI ha lacune di metadata (repo non linkato, licenza in formato deprecato), e non esiste un blocco netto — è un progetto a un passo dalla v1.0, non a metà strada.
8+
9+
## Punti di forza
10+
11+
- **Gestione errori disegnata per agenti AI, verificata empiricamente**: mai uno stack trace, exit code distinti (0/1/2), messaggi su stderr. Confermato dai test live: ID inesistente → `exit 1` con messaggio leggibile; `--num 99999``exit 2`; `get --format csv` → rifiutato con messaggio esplicito senza chiamata di rete.
12+
- **Suite test reale**: 38 test, 89% coverage (`pytest --cov`), tutti mockati via `respx` (nessuna rete), copre retry (503×3 vs 503→200), JSON malformato con status 200, connessione rifiutata, formati di output incrociati.
13+
- **Documentazione insolitamente onesta e verificata sul campo**: `LOG.md` e `codelists.py` documentano bug reali dell'API RNDT scoperti live (`dataCategory` non filtra, `sort` "amichevole" ignorato, CSW non conforme INSPIRE) — non copiati dalla doc ufficiale ma testati.
14+
- **Doppio uso CLI/libreria reale**, non solo dichiarato: `from openrndt import search, get_item, ItemNotFoundError` funziona, eccezioni documentate nelle docstring, README ha sezione libreria dedicata con esempi.
15+
- **Build PyPI funzionante**: `uv build` produce wheel+sdist validi, `twine check` passa senza errori.
16+
- **Superficie di sicurezza minima e correttamente gestita**: `_encode_id()` usa `quote(safe="")`, i parametri passano per l'encoding httpx, l'API è read-only e il passthrough Lucene in `--q` è una feature intenzionale (documentata), non un vettore di injection.
17+
18+
## Gap per la produzione
19+
20+
### IMPORTANTE
21+
22+
1. **Nessuna CI/CD** (`.github/` assente). Ogni merge si affida a run manuali locali. Fix: workflow GitHub Actions minimo — `uv sync && uv run pytest && uv run ruff check .` su push/PR, matrice 3.12/3.13.
23+
2. **Metadata PyPI incompleti per un consumo di terzi**`pyproject.toml:33-35`: `[project.urls]` punta solo al portale dati e alla pagina REST API; mancano `Repository`/`Issues`/`Changelog` verso `https://github.com/ondata/openrndt`. Fix: aggiungere `Repository` e `Issues`, mantenendo il link RNDT con etichetta chiara (es. `"RNDT Portal"`).
24+
3. **README con installazione solo locale**`README.md:16-25`: `uv tool install /path/to/openrndt` presuppone un clone locale. Fix: aggiungere sezione "da PyPI" quando pubblicato, tenendo quella locale come "per sviluppo".
25+
4. **Nessun type-checking automatizzato**: `mypy`/`pyright` non installati né in `[dependency-groups].dev` (`pyproject.toml:37-43`). Il codice usa type hints ovunque ma nessuno li valida. Fix: aggiungere `mypy` (o `pyright`) al gruppo dev + step CI.
26+
5. **Timeout di rete potenzialmente lungo per un agente che orchestra la CLI**`client.py:16,25-29`: `DEFAULT_TIMEOUT=30.0` + retry 3× con `wait_exponential(max=10)` su `TimeoutException` può far attendere fino a ~90 secondi prima di un errore leggibile su un host lento/irraggiungibile (verificato empiricamente). Nessun flag CLI per abbassare timeout/retry. Fix: esporre `--timeout` (il parametro esiste già nella funzione, manca solo il flag CLI) e/o ridurre il default per la CLI interattiva.
27+
6. **Manca `py.typed`** (PEP 561): assente sia in `src/openrndt/` che nel wheel buildato. Per un package pensato anche come libreria, i tipi non sono distribuiti a chi lo importa. Fix: aggiungere file vuoto `src/openrndt/py.typed` e verificarne la presenza nel wheel al prossimo build.
28+
7. **Nessun CHANGELOG** separato da `LOG.md`. `LOG.md` è un diario di sviluppo, non un changelog utile a chi aggiorna la versione. Fix: `CHANGELOG.md` in formato Keep-a-Changelog, popolato almeno al primo tag di release.
29+
30+
### NICE-TO-HAVE
31+
32+
8. **Stato globale mutabile in `config.py` e `output.py`** (`config.py:10,19-21`; `output.py:14,18-22`): `_override` e `_output_mode` sono variabili modulo-livello. Irrilevante per la CLI; race condition latente per uso libreria in contesto concorrente. Da documentare come limite.
33+
9. **Nessun client HTTP condiviso**: `client.py:32` apre una nuova connessione a ogni chiamata (niente keep-alive/pooling). Trascurabile per la CLI, penalizzante per molte chiamate in sequenza da libreria.
34+
10. **Licenza in formato deprecato da PEP 639**`pyproject.toml:9`: `license = { text = "MIT" }` è la forma legacy; la raccomandata è `license = "MIT"` (stringa SPDX). Fix banale.
35+
11. **Versione duplicata**: `__version__` in `__init__.py:7` e `version` in `pyproject.toml:3` da tenere sincronizzate a mano. Fix: derivare l'una dall'altra (es. `importlib.metadata.version()`).
36+
12. **Copertura test non uniforme**: `output.py` al 71% (branch `table` senza `table_rows`, rami `csv` vuoti); `cli.py` all'87% (`search --format compact` con 0 risultati, `discover` non-json per sezione singola, `main()`). Nessun percorso critico, ma vale la pena chiudere prima di v1.0.
37+
13. **`ref/` e `PRD.md` senza indice**: utili per chi sviluppa, non arrivano al consumatore PyPI (correttamente esclusi dal wheel).
38+
39+
## Roadmap consigliata verso v1.0
40+
41+
1. Aggiungere `py.typed`, verificare la sua presenza nel wheel dopo build.
42+
2. Aggiungere `mypy` (o `pyright`) al gruppo dev, far passare pulito.
43+
3. Creare `.github/workflows/ci.yml`: `uv sync`, `pytest`, `ruff check`, matrice 3.12/3.13.
44+
4. Sistemare `[project.urls]`: aggiungere `Repository`/`Issues`, chiarire il link RNDT come portale dati.
45+
5. Aggiornare README con installazione da PyPI accanto a quella locale per sviluppo.
46+
6. Esporre `--timeout`/retry configurabili in CLI.
47+
7. Chiudere i gap di coverage residui in `output.py`/`cli.py`.
48+
8. Aggiungere `CHANGELOG.md`, taggare `v1.0.0`, pubblicare su PyPI (`uv build` + `uv publish`).
49+
9. Facoltativo: migrare la licenza alla forma stringa SPDX; automatizzare `__version__` da un'unica fonte.

knowledge/api/index.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# API RNDT
2+
3+
* [API REST del RNDT](rndt-rest-api.md) - endpoint usati da openrndt, parametri, campi Lucene.
4+
* [Bug noti e divergenze dalla documentazione ufficiale](known-issues.md) - comportamenti reali verificati live.

knowledge/api/known-issues.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
---
2+
type: Reference
3+
title: Bug noti dell'API RNDT
4+
description: Divergenze verificate live tra la documentazione ufficiale RNDT e il comportamento reale dell'API.
5+
tags: [rndt, bug, verificato-live]
6+
timestamp: 2026-07-17T00:00:00Z
7+
---
8+
9+
Tutti i punti seguenti sono stati verificati empiricamente contro l'API di produzione, non dedotti dalla documentazione. openrndt li compensa dove possibile.
10+
11+
# Divergenze
12+
13+
| Comportamento documentato | Comportamento reale | Compensazione in openrndt |
14+
|---------------------------|---------------------|---------------------------|
15+
| Il parametro `dataCategory` filtra per categoria. | Non filtra: ritorna sempre il catalogo intero. | `--data-category` è tradotto nella clausola Lucene `q=keywords_s:VAL` (`OR` per valori multipli). |
16+
| `sort=dateDescending` / `dateAscending` ordinano per data. | Ignorati: ordine identico fra loro. | `discover --what sort_values` marca i valori rotti; la sintassi funzionante è `campo:asc\|desc` su campo sortable (es. `apiso_Modified_dt:desc`). |
17+
|| Ordinare su un campo `text` analizzato (es. `title` nudo) dà errore Elasticsearch "Fielddata is disabled". | Documentato nelle codelist; usare i campi `_s`/`_dt`/`_i`. |
18+
| Esiste una data di pubblicazione ordinabile. | Non esiste; `apiso_CreationDate_dt` è spesso null o fittizia (es. 2012-01-01). | Proxy consigliato per "più recenti": `apiso_Modified_dt:desc` (issue #4 del repository). |
19+
| L'endpoint CSW supporta `SortBy` (INSPIRE Discovery Services v3.1). | `SortBy` ignorato: non conforme. | Nessuna: documentato (issue #5 del repository). |
20+
| Item inesistente → errore HTTP. | Risponde `200` con body `{"found": false}`. | `get_item` controlla `found` e solleva `ItemNotFoundError`. |
21+
22+
# Problemi di qualità dei dati (non dell'API)
23+
24+
- Alcuni record dichiarano una bbox errata che copre tutta l'Italia (`6.6,35.5,18.5,47.1`): compaiono come rumore in qualunque ricerca `--bbox`. Il filtro bbox in sé funziona (semantica overlaps, verificata).
25+
26+
# Citations
27+
28+
[1] `ref/rest-api-rndt.md` e `LOG.md` nel repository (verifiche live datate).
29+
[2] [Pagina ufficiale REST API RNDT](https://geodati.gov.it/geoportale/eng/strumenti-en/rest-api)

knowledge/api/rndt-rest-api.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
---
2+
type: External API
3+
title: API REST del RNDT
4+
description: Gli endpoint del geoportale RNDT usati da openrndt e i campi Lucene interrogabili.
5+
resource: https://geodati.gov.it/RNDT
6+
tags: [rndt, rest, elasticsearch, lucene]
7+
timestamp: 2026-07-17T00:00:00Z
8+
---
9+
10+
Il RNDT espone un'API REST in stile Esri Geoportal Server su base `https://geodati.gov.it/RNDT` (configurabile via env `OPENRNDT_BASE_URL`). È read-only e senza autenticazione. openrndt applica retry esponenziale (3 tentativi) su timeout e 5xx.
11+
12+
# Endpoint usati
13+
14+
| Endpoint | Uso in openrndt |
15+
|----------|-----------------|
16+
| `GET /rest/metadata/search` | [search](/cli/search.md). Parametri: `q` (Lucene), `bbox`, `time`, `modified`, `sort`, `start`, `num` (max 5000), `f` (formato), `id`. |
17+
| `GET /rest/metadata/item/{id}` | [get](/cli/get.md), JSON Elasticsearch. |
18+
| `GET /rest/metadata/item/{id}/xml` | XML ISO 19139. |
19+
| `GET /rest/metadata/item/{id}/html` | HTML. |
20+
21+
# Campi Lucene principali (parametro `q`)
22+
23+
L'elenco completo con descrizioni è offline in [discover --what lucene_fields](/cli/discover.md). Regole sui suffissi:
24+
25+
| Suffisso | Tipo | Note |
26+
|----------|------|------|
27+
| `_txt` | testo analizzato | wildcard trailing OK (`palerm*`), leading non supportata su campo esplicito. |
28+
| `_s` | keyword, case-sensitive | wildcard solo trailing. |
29+
| `_dt` | data ISO 8601 | range `[2024-01-01T00:00:00Z TO *]`; sortable. |
30+
| `_i` | intero | range `[1 TO 10000]`. |
31+
| `_b` | booleano | `true` \| `false`. |
32+
33+
Campi ad alto valore: `apiso_Type_s` (dataset/series/service), `apiso_TopicCategory_s`, `apiso_OrganizationName_txt`, `apiso_Modified_dt`, `isOpendata` (`isOpendata:*` per tutti gli open data), `apiso_Format_s`, `INSPIRETheme_s`, `AmbitoTerritoriale_s`.
34+
35+
Molti comportamenti reali divergono dalla documentazione ufficiale: vedi [bug noti](/api/known-issues.md).
36+
37+
# Citations
38+
39+
[1] [Pagina ufficiale REST API RNDT](https://geodati.gov.it/geoportale/eng/strumenti-en/rest-api)
40+
[2] [Spec Esri Geoportal Server](https://gpt.geocloud.com/geoportal3/api/gpt_api.json)
41+
[3] Mirror locale della documentazione: `ref/rest-api-rndt.md` nel repository.

0 commit comments

Comments
 (0)