Git Product home page Git Product logo

frictionless2md's Introduction

  • 👋 Hi, I’m @dennisangemi
  • 👀 I’m interested in Science, OpenData, Photography and Genealogy
  • 🌱 I’m currently learning R, C and MATLAB

frictionless2md's People

Contributors

dennisangemi avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar

frictionless2md's Issues

Improve temp files management

Summary

Attualmente, se il datapackage è yaml viene convertito in json e viene chiamato datapackage.json. Questo potrebbe creare non pochi problemi perché

  1. Potrebbe già esistere un datapackage.json che contiene valori diversi dal yaml
  2. Rischieremmo di eliminare un file non temporaneo. Alla fine dello script, se il formato originario era yaml, viene cancellato datapackage.json (senza effettuare alcun check)

Actions

  • check if datapackage.json exists before creating it
  • If it exists, create a temp file with a different name (how?) working_datapackage="frct-temp-dp.json"
  • Edit cleaning section at the end of the script

check datapackage validity

Attualmente c'è error e exit se package is not valid.

Però si potrebbe fare:

Warning: Your data package is not valid. Wanna continue?

refs:

How to check? If I use frictionless validate datapackage I will validate the data and not the package (?)

Brainstorming

tool esistenti

frictioless says

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

struttura readme

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.

tabelle per data dictionary

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?

desired output

https://github.com/chiaraadornetto/dati-tv-elezioni-ue-2019#readme

Update setup

wget

chmod +x frictionless2md

sudo mv frictionless2md /usr/local/bin/

Mention option

Summary

—m or —mention mention this toolbox at the end of generated file. false is (default). This option doesn’t require an argument

Output

it will add at the end of the output something like

Generated from datapackage.yaml with frictionless2md

Steps

  • Add option in main code
  • Update help
  • Update readme documentation

temp file included in tree

Ho lanciato il tool su un datapackage in json e mi ha restituito in output un tree in md contenente un temp json. Controllare

build template in script

Delete template.md

Building template with script.sh permits to delete template.md and dictionary.md (no temp files needed)

check requirements

Add auto checks for requirements.txt

forse requirements.txt è uno standard python. GitHub linka dependencies errate

  • check frictionless sempre
  • check jq sempre
  • check mlr sempre
  • se il formato del package è yaml check yq and jq
  • se il formato del package è yaml check only jq
  • se -t allora check tree

handle no role in contributors

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:

👥 Contributors

Name Role Email
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]

Actions

  • Se contributors contiene almeno un role allora bisogna creare la colonna role, aggiungere la value se presente, mettere stringa vuota al posto di null
  • Se contributors non contiene role non fare nulla

handle no title or description for a field

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:

📄 press

  • Path: data/press.csv
  • Encoding: 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

errors

  • use stderr a5460a0
  • can't find datapackage #11
  • tool or package is not installed ?

Include ERD

Introduction

Currently frictionless lets you run

frictionless convert datapackage.yaml --er-diagram

and the output is a DOT file.
Ref:

Idea

Use frictionless2md to generate a section of the output (md) with a mermaid ERD.

Issue

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

I obtain
out

why is there only one arrow?

format example csv

Durante un test ho ottenuto

📄 press

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

add `-v` and `--version`

[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...

add `-h` and `--help`

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

Add support to long options

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

Include title key in Description column

ChatGPT Solution

Puoi 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).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.