opendatasicilia / tansignari

"T'ansignari e t'appeddiri"
http://tansignari.opendatasicilia.it
Creative Commons Attribution 4.0 International
18 stars 10 forks source link

[frictionless] validare un datapackage e non i dati #250

Closed dennisangemi closed 1 year ago

dennisangemi commented 1 year ago

Sera! Mi chiedevo se ci fosse un modo per validare un datapackage di frictionless.

Se lancio

frictionless validate datapackage.yaml

frictionless validerà i dati che sono descritti nel package. Io invece sono interessato ad una validazione formale della struttura del package: ci sono errori di sintassi? ci sono values che non possono essere associati a determinate keys (violando gli standard)?

Da (frictionless validate --help) ho visto che si possono usare i flag --skip-errors e --pick-errors. Io sarei interessato a skippare tutti gli errori relativi alle risorse descritte ma vorrei invece ottenere gli errori legati ai metadati.

Ho provato a lanciare questo

frictionless validate datapackage.yaml --pick-errors "metadata-error" --skip-errors "resource-error" --json

ma ottengo ancora validazione dei dati.

Qui documentazione relativa agli errori. Ho letto che ci sono una marea di errori legati ai dati: devo skipparli uno ad uno? Non c'è un modo ad esempio per fare una cosa del tipo "pick only metadata errors"?

aborruso commented 1 year ago

Ciao @dennisangemi,

Io invece sono interessato ad una validazione formale della struttura del package: ci sono errori di sintassi? ci sono values che non possono essere associati a determinate keys (violando gli standard)?

se lanci una validazione, usando un file yaml con degli errori formali, avrai restituito uno o più errori a schermo.

Quindi diciamo che se riesci ad avere una validazione di uno o più file di un datapackage, vuol dire che è formalmente valido. Prova a rompere la forma di un tuo file yaml. Detto questo, magari c'è un modo diretto, ma non lo conosco.

Ho provato a lanciare questo

frictionless validate datapackage.yaml --pick-errors "metadata-error" --skip-errors "resource-error" --json

ma ottengo ancora validazione dei dati.

Sì, sono tutte opzioni per validare i dati.

dennisangemi commented 1 year ago

mhh grazie @aborruso in effetti rompendo un package si ottiene un errore di tipo package-error. Indago ancora un po' per capire come selezionare solo questo tipo di errori evitando la validazione dei dati (potrei filtrarli in jq ma solo a seguito della validazione completa che utilizzerebbe risorse inutili).

Sarei interessato ad una cosa del genere per evitare che frictionless2md provi a convertire package non validi

aborruso commented 1 year ago

mhh grazie @aborruso in effetti rompendo un package si ottiene un errore di tipo package-error.

E allora potrai usare --pick-errors "package-error"

dennisangemi commented 1 year ago

Ho notato che lanciando

frictionless validate datapackage.yaml --pick-errors "package-error"

Confrontando gli output json di un package valido e uno non valido mi rendo conto del fatto che

Quindi potrei usare l'emptiness dell'array tasks come discriminante.

Per verificare se l'array tasks ha elementi, posso lanciare

frictionless validate datapackage.yaml --pick-errors "package-error" --json | jq '.tasks | has(0)'

che restituisce

Resta il fatto che se il package è valido allora la nostra macchinina utilizzerà un po' delle sue risorse per validare inutilmente i dati

aborruso commented 1 year ago

Ciao @dennisangemi

Resta il fatto che se il package è valido allora la nostra macchinina utilizzerà un po' delle sue risorse per validare inutilmente i dati

ripeto su questo non ti so dire. Tieni conto che puoi generare un file temporaneo di una riga e validare solo quello per validare il package.

Oltre a jq e ai task, puoi usare quasi sicuramente di codici di uscita del programma. Ma testalo.

Uno script bash restituisce sempre un codice del programma. Se è 0 è ok, altrimenti non va bene.

Prova a lanciare frictionless validate datapackage.yaml --pick-errors "package-error" a partire da un file yaml scorretto. E poi lancia echo "$?" per avere il codice di errore.

Dovrebbe essere pari a 1.

I codici di uscita sono il modo principe per gestire queste cose. Ma anche il tuo jq way sembra ok.

dennisangemi commented 1 year ago

Dovrebbe essere pari a 1.

Grazie @aborruso. Solo che sto notando che "$?" è pari a 1 anche quando frictionless validate datapackage.yaml --pick-errors "package-error" viene eseguito su un package valido ma con dati non validi

aborruso commented 1 year ago

Grazie @aborruso. Solo che sto notando che "$?" è pari a 1 anche quando frictionless validate datapackage.yaml --pick-errors "package-error" viene eseguito su un package valido ma con dati non validi

Per questo ti dicevo di testare, perché non è detto che ci siano exit code distinti. Ok, vai in quell'altra modalità

dennisangemi commented 1 year ago

Ricetta qui https://tansignari.opendatasicilia.it/ricette/utilities/frictionless_validare_struttura_datapackage/

Grazie capo! @aborruso

aborruso commented 1 year ago

Che bella ricetta!