dennisangemi / frictionless2md Goto Github PK
View Code? Open in Web Editor NEWA tool to convert frictionless datapackage (YAML or JSON) to markdown
License: MIT License
A tool to convert frictionless datapackage (YAML or JSON) to markdown
License: MIT License
Add delimiter info only if key exists #8
Durante un test ho ottenuto
📄 press
- Path:
data/press.csv
- URL: https://raw.githubusercontent.com/indecis-it/data/main/data/press.csv
- Encoding:
utf-8
Field Type Description Example id integer 1 post_id integer Post ID 1 url string Post URL https://pagellapolitica.it/articoli/guida-sondaggi-politici post_title string Post title Guida alla lettura dei sondaggi politic post_subtitle string Post subtitle Nelle prossime settimane ne vedremo decine: le informazioni utili per saperli leggere type string Post type articolo source string Post source Pagella Politica subject string Subject name list string Electoral list name subject_id integer Subject ID list_id integer Electoral list ID
Evidentemente l'example contiene del testo che ha fatto fallire la corretta formattazione. Capire se mlr
può risolvere il problema. Intercettare file originario per capire quale carattere è incriminato https://raw.githubusercontent.com/indecis-it/data/main/data/press.csv
Delete template.md
Building template with script.sh permits to delete template.md and dictionary.md (no temp files needed)
usage
-u username/reponame
there is no datapackage.yaml
Currently frictionless
lets you run
frictionless convert datapackage.yaml --er-diagram
and the output is a DOT file.
Ref:
Use frictionless2md to generate a section of the output (md) with a mermaid ERD.
Take this repo as example. Note that datapackage.yaml has multiple foreign keys.
When I run
frictionless convert datapackage.yaml --er-diagram
the DOT output is
digraph "dati-tv-elezioni-ue-2019"{
"contenuti" [shape=plaintext,label=<<table bgcolor="#f5f5f5" border="0" cellborder="0" cellspacing="0" cellpadding="6"><tr><td colspan="2" bgcolor="#306996"><b><font color="#ffffff">contenuti</font></b></td></tr><tr><td port="id_contenuton" align="left">id_contenuto</td><td port="id_contenutot" align="right"><font color="#333333">string</font></td></tr><tr><td port="id_puntatan" align="left">id_puntata</td><td port="id_puntatat" align="right"><font color="#333333">string</font></td></tr><tr><td port="tipologian" align="left">tipologia</td><td port="tipologiat" align="right"><font color="#333333">string</font></td></tr><tr><td port="UEn" align="left">UE</td><td port="UEt" align="right"><font color="#333333">boolean</font></td></tr><tr><td port="id_ospiten" align="left">id_ospite</td><td port="id_ospitet" align="right"><font color="#333333">string</font></td></tr><tr><td port="keywordn" align="left">keyword</td><td port="keywordt" align="right"><font color="#333333">string</font></td></tr><tr><td port="startn" align="left">start</td><td port="startt" align="right"><font color="#333333">time</font></td></tr><tr><td port="endn" align="left">end</td><td port="endt" align="right"><font color="#333333">time</font></td></tr><tr><td port="sentimentn" align="left">sentiment</td><td port="sentimentt" align="right"><font color="#333333">string</font></td></tr></table>>]
"ospiti" [shape=plaintext,label=<<table bgcolor="#f5f5f5" border="0" cellborder="0" cellspacing="0" cellpadding="6"><tr><td colspan="2" bgcolor="#306996"><b><font color="#ffffff">ospiti</font></b></td></tr><tr><td port="id_ospiten" align="left">id_ospite</td><td port="id_ospitet" align="right"><font color="#333333">string</font></td></tr><tr><td port="nomen" align="left">nome</td><td port="nomet" align="right"><font color="#333333">string</font></td></tr><tr><td port="cognomen" align="left">cognome</td><td port="cognomet" align="right"><font color="#333333">string</font></td></tr><tr><td port="titolon" align="left">titolo</td><td port="titolot" align="right"><font color="#333333">string</font></td></tr><tr><td port="appartenenzan" align="left">appartenenza</td><td port="appartenenzat" align="right"><font color="#333333">string</font></td></tr></table>>]
"puntate" [shape=plaintext,label=<<table bgcolor="#f5f5f5" border="0" cellborder="0" cellspacing="0" cellpadding="6"><tr><td colspan="2" bgcolor="#306996"><b><font color="#ffffff">puntate</font></b></td></tr><tr><td port="id_puntatan" align="left">id_puntata</td><td port="id_puntatat" align="right"><font color="#333333">string</font></td></tr><tr><td port="trasmissionen" align="left">trasmissione</td><td port="trasmissionet" align="right"><font color="#333333">string</font></td></tr><tr><td port="datan" align="left">data</td><td port="datat" align="right"><font color="#333333">date</font></td></tr><tr><td port="durata_puntatan" align="left">durata_puntata</td><td port="durata_puntatat" align="right"><font color="#333333">time</font></td></tr></table>>]
"trasmissioni" [shape=plaintext,label=<<table bgcolor="#f5f5f5" border="0" cellborder="0" cellspacing="0" cellpadding="6"><tr><td colspan="2" bgcolor="#306996"><b><font color="#ffffff">trasmissioni</font></b></td></tr><tr><td port="trasmissionen" align="left">trasmissione</td><td port="trasmissionet" align="right"><font color="#333333">string</font></td></tr><tr><td port="reten" align="left">rete</td><td port="retet" align="right"><font color="#333333">string</font></td></tr><tr><td port="canalen" align="left">canale</td><td port="canalet" align="right"><font color="#333333">string</font></td></tr><tr><td port="numeron" align="left">numero</td><td port="numerot" align="right"><font color="#333333">integer</font></td></tr></table>>]
"puntate":id_puntatan -> "contenuti":id_puntatan;
}
If i visualize it with this tool or if I convert .dot to .png with Graphviz
dot -Tpng erd.dot > out.png
why is there only one arrow?
Come questo https://github.com/dennisangemi/tomkd/blob/main/build
#!/bin/bash
# mv tomkd to /usr/local/bin
sudo cp ./tomkd /usr/local/bin
# make tomkd executable
sudo chmod +x /usr/local/bin/tomkd
Line 12 in 72eb2f4
Else If json exists format =json else echo can't find package exit
Avoid printing null
Related issue: #3
Input:
- path: data/press.csv
name: press
profile: tabular-data-resource
scheme: file
format: csv
hashing: md5
encoding: utf-8
schema:
fields:
- name: id
type: integer
- name: post_id
type: integer
title: Post ID
- name: url
title: Post URL
type: string
format: uri
- name: post_title
type: string
- name: post_subtitle
type: string
- name: type
title: Post type
type: string
constraints:
enum:
- articolo
- fact-checking
- name: source
type: string
title: Post source
- name: subject
type: string
- name: list
type: string
- name: subject_id
type: integer
- name: list_id
type: integer
Ouput:
data/press.csv
utf-8
Field | Type | Description | Example |
---|---|---|---|
id | integer | null | 1 |
post_id | integer | Post ID | 1 |
url | string | Post URL | https://pagellapolitica.it/articoli/guida-sondaggi-politici |
post_title | string | null | Guida alla lettura dei sondaggi politic |
post_subtitle | string | null | Nelle prossime settimane ne vedremo decine: le informazioni utili per |
saperli leggere | |||
type | string | Post type | articolo |
source | string | Post source | Pagella Politica |
subject | string | null | |
list | string | null | |
subject_id | integer | null | |
list_id | integer | null |
This work is licensed under a blabla License
[x] add flags -v
and --versions
Example
#!/bin/bash
version="1.0.0"
output_file="output.txt"
while getopts ":w:t:o:v" opt; do
case ${opt} in
o | output)
# Gestisci l'opzione -o o --output
output_file=${OPTARG}
;;
v)
# Visualizza la versione
echo "frictionless2md versione $version"
exit 0
;;
\?)
echo "Opzione non valida: -$OPTARG" >&2
exit 1
;;
:)
echo "L'opzione -$OPTARG richiede un argomento." >&2
exit 1
;;
esac
done
shift $((OPTIND -1))
# Resto dello script...
—m
or —mention
mention this toolbox at the end of generated file. false
is (default). This option doesn’t require an argument
it will add at the end of the output something like
Generated from datapackage.yaml with frictionless2md
Attualmente c'è error e exit se package is not valid.
Però si potrebbe fare:
Warning: Your data package is not valid. Wanna continue?
How to check? If I use frictionless validate datapackage
I will validate the data and not the package (?)
frictionlessdata/frictionlessdata.io#665 (comment)
Attenzione pare che si siano mossi e abbiano chiuso i loro task frictionlessdata/frictionless-py#837 che succede?
Ho commentato qui frictionlessdata/frictionless-py#837 (comment) per chiedere se si può fare via cli
Estrarre titolo datapackage, descrizione, licenza e contributors e append these line to an md file. Ma come faccio a capire l'ordine?
Forse mi conviene fare un file md che abbia la struttura tipo
# {{{title}}}
{{{description}}}
vedi template.md
E poi sostituire le cose tra parentesi graffa con i contenuti dei metadati in json. Se il json non contiene alcune informazioni tipo la licenza o i contributors allora si eliminano le parentesi graffe dal md per rendere tutto pulito.
Potrei convertire yaml to json, utilizzare jq per selezionare solo resources e da esse selezionare solo i campi name, type, description, convertire in csv usando mlr e poi capire come convertire csv2md.
E se ci sono più file? Come gestisco il template md per la sezione data dictionary?
https://github.com/chiaraadornetto/dati-tv-elezioni-ue-2019#readme
ottengo:
⚠️ Warning: Delimiter key not found for sicilia_dighe_volumi
Delimiter info will not be added to METADATA.md
⚠️ Warning: Delimiter key not found for sicilia_dighe_anagrafica
Delimiter info will not be added to METADATA.md
⚠️ Warning: Delimiter key not found for italia_grandi_dighe_anagrafica
Delimiter info will not be added to METADATA.md
⚠️ Warning: Delimiter key not found for sicilia_dighe_competenza_utd_palermo
ma
resources:
- name: sicilia_dighe_volumi
description: Volumi invasati nelle dighe della Sicilia. Tabella estratta dai file PDF rilasciati dalla Regione Siciliana (vd. sources)
sources:
- title: Volumi invasati nelle dighe della Sicilia (Regione Siciliana)
description: Pagina web della Regione Siciliana che raccoglie documenti PDF contenenti le serie storiche dei volumi invasati nelle dighe della Sicilia
path: https://www.regione.sicilia.it/istituzioni/regione/strutture-regionali/presidenza-regione/autorita-bacino-distretto-idrografico-sicilia/siti-tematici/risorse-idriche/volumi-invasati-nelle-dighe-della-sicilia
type: table
path: risorse/sicilia_dighe_volumi.csv
scheme: file
format: csv
mediatype: text/csv
encoding: utf-8
dialect:
delimiter: ","
For example --file
or --output
#!/bin/bash
while getopts ":f:" opt; do
case ${opt} in
f | file)
file_path=${OPTARG}
;;
# ...
esac
done
shift $((OPTIND -1))
# Resto dello script...
alternative here
#!/bin/bash
# Funzione per mostrare l'aiuto
show_help() {
echo "Esempio di CLI con opzioni"
echo "Utilizzo: nome_script.sh [opzioni]"
echo ""
echo "Opzioni disponibili:"
echo " -a, --opzione-a Descrizione opzione A"
echo " -b, --opzione-b Descrizione opzione B"
echo " -c VAL, --opzione-c VAL Descrizione opzione C (richiede un valore)"
echo " -d VAL, --opzione-d VAL Descrizione opzione D (richiede un valore)"
echo " -h, --help Mostra questo messaggio di aiuto"
echo ""
}
# Legge le opzioni passate alla CLI
while [[ $# -gt 0 ]]; do
key="$1"
case $key in
-a|--opzione-a)
opzione_a=true
shift
;;
-b|--opzione-b)
opzione_b=true
shift
;;
-c|--opzione-c)
if [[ -n $2 ]]; then
opzione_c="$2"
shift 2
else
echo "Errore: l'opzione -c/--opzione-c richiede un valore"
exit 1
fi
;;
-d|--opzione-d)
if [[ -n $2 ]]; then
opzione_d="$2"
shift 2
else
echo "Errore: l'opzione -d/--opzione-d richiede un valore"
exit 1
fi
;;
-h|--help)
show_help
exit 0
;;
*)
echo "Errore: opzione non valida: $1"
exit 1
;;
esac
done
# Utilizzo delle opzioni
if [[ $opzione_a ]]; then
echo "Opzione A attivata"
fi
if [[ $opzione_b ]]; then
echo "Opzione B attivata"
fi
if [[ -n $opzione_c ]]; then
echo "Opzione C: $opzione_c"
fi
if [[ -n $opzione_d ]]; then
echo "Opzione D: $opzione_d"
fi
if file path of datapackage is valid add example column in data data dictionary tables
Broken
Documentation
Example code
# help message
if [[ $1 == "-h" || $1 == "--help" ]]; then
# Visualizza la documentazione
echo "frictionless2md - Convert frictionless datapackage to markdown"
echo
echo "Usage: frictionless2md [options]"
echo
echo "Options:"
echo " -h, --help Get help (this message)"
echo " -w, --warnings Show all warnings"
echo " -t, --tree Print repository structure"
echo " -u, --user Specify GitHub username and repository name"
echo " -o, --output Specify output filename"
echo ""
echo "Example:"
echo "frictionless2md -wt -u indecis-it/data -o my-project-metadata.md "
exit 0
fi
valid_package
è una variabile superflua. Possiamo sovrascrivere altre variabili
Alternatives
key_schema_check
valid_key_check
attualmente se il package non è valido, rimane un datapackage.json generato e non eliminato
converti in json solo se:
check all fields?
https://stackoverflow.com/a/68401250
https://ryanstutorials.net/bash-scripting-tutorial/bash-if-statements.php
Input
contributors:
- title: Chiara Adornetto
email: [email protected]
- title: Dennis Angemi
email: [email protected]
- title: Carlo Canepa
email: [email protected]
- title: Moreno Colaiacovo
email: [email protected]
- title: Alice Nicole Ginosa
email: [email protected]
- title: Angelo Gulina
email: [email protected]
- title: Vittorio Nicoletta
email: [email protected]
- title: Lorenzo Ruffino
email: [email protected]
Output:
Name | Role | |
---|---|---|
Chiara Adornetto | null | [email protected] |
Dennis Angemi | null | [email protected] |
Carlo Canepa | null | [email protected] |
Moreno Colaiacovo | null | [email protected] |
Alice Nicole Ginosa | null | [email protected] |
Angelo Gulina | null | [email protected] |
Vittorio Nicoletta | null | [email protected] |
Lorenzo Ruffino | null | [email protected] |
contributors
contiene almeno un role
allora bisogna creare la colonna role
, aggiungere la value se presente, mettere stringa vuota al posto di nullcontributors
non contiene role
non fare nullaPuoi utilizzare il seguente comando jq da terminale Linux per aggiungere la nuova chiave "join" ai campi esistenti "title" e "description", concatenando i loro valori con due punti ":" quando entrambi i campi sono presenti:
jq '.resources[].schema.fields |= map(if has("title") and has("description") then . + {"join": "\(.title): \(.description)"} elif has("title") then . + {"join": .title} elif has("description") then . + {"join": .description} else . end)' file.json
In questo comando, il file JSON viene passato a jq tramite l'input standard (stdin). Il comando jq seleziona quindi tutti i campi "fields" all'interno di tutti i "resources" e li mappa usando la funzione map(). Dentro la funzione map(), vengono verificate le seguenti condizioni per ogni oggetto campo:
- se il campo ha sia "title" che "description", allora viene aggiunta una nuova chiave "join" con il valore concatenato di "title" e "description" separati da due punti ":";
- se il campo ha solo "title", allora viene aggiunta una nuova chiave "join" con il valore di "title";
- se il campo ha solo "description", allora viene aggiunta una nuova chiave "join" con il valore di "description";
- se il campo non ha né "title" né "description", allora viene restituito l'oggetto campo originale senza alcuna modifica.
Il risultato finale viene quindi stampato sulla standard output (stdout).
Add auto checks for requirements.txt
forse requirements.txt
è uno standard python. GitHub linka dependencies errate
Attualmente, se il datapackage è yaml viene convertito in json e viene chiamato datapackage.json. Questo potrebbe creare non pochi problemi perché
working_datapackage="frct-temp-dp.json"
Ho lanciato il tool su un datapackage in json e mi ha restituito in output un tree in md contenente un temp json. Controllare
wget
chmod +x frictionless2md
sudo mv frictionless2md /usr/local/bin/
Documention:
Data is described in datapackage.format
To frictionless2md
ha senso? forse sì
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.