L'esportazione¶
Un'esportazione è un lavoro che gira dalla parte del servizio: Export lo
rappresenta mentre è in corso, ExportStatus dice a che punto è, Progress
quanto ne resta, e Corpus è l'archivio una volta scaricato. Export sta
in piedi da solo, identificato dal suo token, e sopravvive al processo che
l'ha avviato.
Il percorso completo, dai criteri all'archivio riaperto da disco, sta in esportare un atto intero.
Gli stati di un'esportazione¶
stateDiagram-v2
[*] --> TO_CONFIRM: start_export()
TO_CONFIRM --> WAITING
WAITING --> PROCESSING
PROCESSING --> CONFIRMED_WITH_DELAY: ci vuole piu' tempo
CONFIRMED_WITH_DELAY --> PROCESSING
PROCESSING --> COMPLETED: download()
PROCESSING --> FAILED
PROCESSING --> OVERLOADED
COMPLETED --> [*]
FAILED --> [*]
OVERLOADED --> [*]
I tre stati in fondo concludono l'attesa di wait; gli altri la fanno tornare
a interrogare il servizio.
Il formato dell'archivio¶
Un ZIP con una cartella per atto, e dentro un documento JSON per versione:
LEGGE_19900807_241/1990-08-18_090G0294_ORIGINALE_V0.json
LEGGE_19900807_241/1990-08-18_090G0294_VIGENZA_1990-12-20_V1.json
LEGGE_19900807_241/1990-08-18_090G0294_VIGENZA_1991-01-23_V2.json
Il nome porta la data di pubblicazione in Gazzetta, il codice redazionale, la
data da cui la versione vale e il suo numero progressivo. Nessun campo del
documento riporta quella data: se i nomi non dichiarano la versione, Corpus
rifiuta l'archivio con
UnexpectedResponseError invece di
leggerli tutti come «originale».
Export
¶
Export(
token: str,
trasporto: Trasporto,
*,
format: Format = JSON,
stato: ExportStatus = TO_CONFIRM,
sleep: Callable[[float], None] = sleep,
clock: Callable[[], float] = monotonic,
)
Un'esportazione, dalla richiesta all'archivio prodotto.
Codice sorgente in src/normattiva/esporta.py
progress
property
¶
progress: Progress
L'ultimo avanzamento dichiarato dal servizio, quando lo dichiara.
from_token
classmethod
¶
Riprende un'esportazione già avviata, a partire dal suo token.
Codice sorgente in src/normattiva/esporta.py
refresh
¶
refresh() -> ExportStatus
Interroga il servizio una volta sullo stato dell'esportazione.
Codice sorgente in src/normattiva/esporta.py
wait
¶
wait(*, timeout: float = TIMEOUT) -> ExportStatus
Interroga il servizio finché l'archivio è pronto, o finché la scadenza è superata.
Se il servizio dichiara un possibile ritardo, la scadenza viene prorogata una sola volta: prorogarla a ogni dichiarazione toglierebbe ogni limite all'attesa.
Parametri:
| Nome | Tipo | Descrizione | Predefinito |
|---|---|---|---|
timeout
|
float
|
quanti secondi attendere prima di rinunciare. |
TIMEOUT
|
Restituisce:
| Tipo | Descrizione |
|---|---|
ExportStatus
|
Lo stato in cui l'esportazione si è conclusa. |
Solleva:
| Tipo | Descrizione |
|---|---|
ExportFailedError
|
il servizio l'ha dichiarata fallita,
oppure l'attesa ha superato |
OverloadedError
|
il servizio non è in grado di completarla adesso. |
Codice sorgente in src/normattiva/esporta.py
download
¶
download() -> Corpus
Scarica l'archivio e legge gli atti che contiene.
Solo il format JSON viene convertito in modelli; gli altri formati si
scaricano come file con save, perché la libreria non li interpreta.
Restituisce:
| Tipo | Descrizione |
|---|---|
Corpus
|
Gli atti che l'archivio contiene, e l'archivio stesso. |
Solleva:
| Tipo | Descrizione |
|---|---|
InvalidArgumentError
|
il format non è JSON; usare |
UnexpectedResponseError
|
l'archivio non è leggibile, o i nomi dei file non dichiarano più la vigenza. |
Codice sorgente in src/normattiva/esporta.py
save
¶
Scarica l'archivio e lo scrive su disco, in qualunque format.
AsyncExport
¶
AsyncExport(
token: str,
trasporto: TrasportoAsync,
*,
format: Format = JSON,
stato: ExportStatus = TO_CONFIRM,
sleep: Callable[[float], Awaitable[None]] = sleep,
clock: Callable[[], float] = monotonic,
)
La variante asincrona di Export.
Codice sorgente in src/normattiva/esporta.py
progress
property
¶
progress: Progress
L'ultimo avanzamento dichiarato dal servizio, quando lo dichiara.
from_token
async
classmethod
¶
from_token(
token: str,
trasporto: TrasportoAsync,
*,
format: Format = JSON,
) -> AsyncExport
Riprende un'esportazione già avviata, a partire dal suo token.
Codice sorgente in src/normattiva/esporta.py
refresh
async
¶
refresh() -> ExportStatus
Interroga il servizio una volta sullo stato dell'esportazione.
Codice sorgente in src/normattiva/esporta.py
wait
async
¶
wait(*, timeout: float = TIMEOUT) -> ExportStatus
Interroga il servizio finché l'archivio è pronto, o finché la scadenza è superata.
Se il servizio dichiara un possibile ritardo, la scadenza viene prorogata una sola volta: prorogarla a ogni dichiarazione toglierebbe ogni limite all'attesa.
Parametri:
| Nome | Tipo | Descrizione | Predefinito |
|---|---|---|---|
timeout
|
float
|
quanti secondi attendere prima di rinunciare. |
TIMEOUT
|
Restituisce:
| Tipo | Descrizione |
|---|---|
ExportStatus
|
Lo stato in cui l'esportazione si è conclusa. |
Solleva:
| Tipo | Descrizione |
|---|---|
ExportFailedError
|
il servizio l'ha dichiarata fallita,
oppure l'attesa ha superato |
OverloadedError
|
il servizio non è in grado di completarla adesso. |
Codice sorgente in src/normattiva/esporta.py
download
async
¶
download() -> Corpus
Scarica l'archivio e legge gli atti che contiene.
Solo il format JSON viene convertito in modelli; gli altri formati si
scaricano come file con save, perché la libreria non li interpreta.
Restituisce:
| Tipo | Descrizione |
|---|---|
Corpus
|
Gli atti che l'archivio contiene, e l'archivio stesso. |
Solleva:
| Tipo | Descrizione |
|---|---|
InvalidArgumentError
|
il format non è JSON; usare |
UnexpectedResponseError
|
l'archivio non è leggibile, o i nomi dei file non dichiarano più la vigenza. |
Codice sorgente in src/normattiva/esporta.py
save
async
¶
Scarica l'archivio e lo scrive su disco, in qualunque format.
ExportStatus
¶
Progress
dataclass
¶
L'avanzamento che il servizio dichiara per un'esportazione.
La percentuale da sola non dice se il lavoro sta procedendo: processed e
total sì, e sono l'unico modo per capire se un'esportazione lunga è
ferma o solo lenta. Il servizio non li invia sempre.
Corpus
dataclass
¶
Corpus(atti: tuple[AttoStorico, ...], archive: bytes = b'')
Gli atti contenuti in un archivio esportato, insieme all'archivio stesso.
from_zip
classmethod
¶
Riapre un'esportazione salvata in precedenza, senza accedere alla rete.
Parametri:
| Nome | Tipo | Descrizione | Predefinito |
|---|---|---|---|
path
|
str | Path
|
il file ZIP scritto in precedenza da |
obbligatorio |
Restituisce:
| Tipo | Descrizione |
|---|---|
Corpus
|
Gli atti che l'archivio contiene, e l'archivio stesso. |
Solleva:
| Tipo | Descrizione |
|---|---|
UnexpectedResponseError
|
l'archivio non è leggibile, o non segue la convenzione di nomi da cui si legge la data di vigenza. |
Codice sorgente in src/normattiva/esporta.py
from_data
classmethod
¶
save
¶
Scrive l'archivio su disco, per riaprirlo senza una nuova esportazione.