10 passaggi per YAML Zen

Tutti amiamo Ansible, ma Ansible è YAML. Esistono molti formati per i file di configurazione: elenchi di valori, coppie parametro-valore, file INI, YAML, JSON, XML e molti altri. Tuttavia, per diverse ragioni, YAML è spesso considerato particolarmente difficile. In particolare, nonostante il suo minimalismo rinfrescante e le impressionanti capacità di lavorare con valori gerarchici, la sintassi YAML può essere fastidiosa con il suo approccio simile a Python al rientro.

10 passaggi per YAML Zen

Se YAML ti fa incazzare, puoi e dovresti! – segui i seguenti 10 passaggi per ridurre la tua frustrazione a un livello accettabile e innamorarti di YAML. Come si conviene a questa lista, i nostri dieci consigli saranno numerati da zero, aggiungeremo meditazione e pratiche spirituali a piacimento 😉

0. Fai funzionare il tuo editor

Non importa quale editor di testo possiedi, probabilmente esiste almeno un plugin per lavorare con YAML. Se non ne hai uno, trovalo e installalo immediatamente. Il tempo impiegato nella ricerca e nella configurazione verrà ripagato molte volte ogni volta che dovrai modificare YAML.

Ad esempio, redattore Atom supporta YAML per impostazione predefinita, ma per GNU Emacs dovrai installare pacchetti aggiuntivi, ad esempio, modalità yaml.

10 passaggi per YAML Zen

Emacs in modalità YAML e visualizzazione degli spazi.

Se il tuo editor preferito non dispone della modalità YAML, alcuni problemi possono essere risolti lavorando con le impostazioni. Ad esempio, l'editor di testo GNOME standard Gedit non ha una modalità YAML, ma per impostazione predefinita evidenzia la sintassi YAML e consente di configurare il lavoro con i rientri:

10 passaggi per YAML Zen

Impostazione dei rientri in Gedit.

Un plugin spazi di disegno per Gedit, visualizza gli spazi come punti, eliminando le ambiguità con i livelli di rientro.

In altre parole, dedica del tempo a conoscere il tuo editor preferito. Scopri cosa lui o la sua comunità di sviluppo ha da offrire per lavorare con YAML e usa quelle funzionalità. Sicuramente non te ne pentirai.

1. Utilizzare una linter

Idealmente, i linguaggi di programmazione e i linguaggi di markup utilizzano una sintassi prevedibile. I computer sono bravi nella prevedibilità, ecco perché il concetto di intera. Se nei 40 anni della sua esistenza ti è passato e ancora non usi un linter YAML, allora è il momento di provare yamllint.

stabilire yamllint È possibile utilizzare il gestore pacchetti Linux standard. Ad esempio, nel Red Hat Enterprise Linux 8 o Fedora è fatto così:

$ sudo dnf install yamllint

Quindi esegui semplicemente yamllint, passandogli il file YAML da controllare. Ecco come appare se passi un file con un errore al linter:

$ yamllint errorprone.yaml
errorprone.yaml
23:10     error    syntax error: mapping values are not allowed here
23:11     error    trailing spaces  (trailing-spaces)

I numeri a sinistra non sono l'ora, ma le coordinate dell'errore: numero di riga e di colonna. La descrizione dell'errore potrebbe non dirti nulla, ma sai esattamente dove si trova. Basta guardare questo punto nel codice e molto probabilmente tutto diventerà chiaro.

Quando yamllint non trova errori in un file, sullo schermo non viene stampato nulla. Se questo silenzio ti spaventa e desideri un po' più di feedback, allora puoi eseguire il linter con il comando echo condizionale tramite una doppia e commerciale (&&), in questo modo:

$ yamllint perfect.yaml && echo "OK"
OK

In POSIX, una doppia e commerciale si attiva se e solo se il comando precedente restituisce 0. E yamllint restituisce semplicemente il numero di errori trovati, motivo per cui l'intero costrutto condizionale funziona.

2. Scrivi in ​​Python, non in YAML

Se YAML ti fa davvero incazzare, non scriverci, letteralmente. Succede che YAML è l'unico formato che l'applicazione comprende. Ma anche in questo caso non è necessario creare un file YAML. Scrivi su ciò che ti piace e poi converti. Ad esempio, c'è un'ottima libreria per Python pyyaml e due metodi di conversione: autoconversione e conversione tramite script.

Autoconversione

In questo caso, il file di dati è anche uno script Python che genera YAML. Questo metodo è più adatto per set di dati di piccole dimensioni. Scrivi semplicemente i dati JSON in una variabile Python, premetti una direttiva di importazione e alla fine del file aggiungi tre righe per implementare l'output.

#!/usr/bin/python3	
import yaml 

d={
"glossary": {
  "title": "example glossary",
  "GlossDiv": {
	"title": "S",
	"GlossList": {
	  "GlossEntry": {
		"ID": "SGML",
		"SortAs": "SGML",
		"GlossTerm": "Standard Generalized Markup Language",
		"Acronym": "SGML",
		"Abbrev": "ISO 8879:1986",
		"GlossDef": {
		  "para": "A meta-markup language, used to create markup languages such as DocBook.",
		  "GlossSeeAlso": ["GML", "XML"]
		  },
		"GlossSee": "markup"
		}
	  }
	}
  }
}

f=open('output.yaml','w')
f.write(yaml.dump(d))
f.close

Ora eseguiamo questo file in Python e otteniamo il file output.yaml:

$ python3 ./example.json
$ cat output.yaml
glossary:
  GlossDiv:
	GlossList:
	  GlossEntry:
		Abbrev: ISO 8879:1986
		Acronym: SGML
		GlossDef:
		  GlossSeeAlso: [GML, XML]
		  para: A meta-markup language, used to create markup languages such as DocBook.
		GlossSee: markup
		GlossTerm: Standard Generalized Markup Language
		ID: SGML
		SortAs: SGML
	title: S
  title: example glossary

Questo è YAML perfettamente valido, ma yamllint ti avviserà che non inizia con -. Bene, questo può essere facilmente corretto manualmente o leggermente modificato nello script Python.

Conversione tramite script

In questo caso, prima scriviamo in JSON e poi eseguiamo il convertitore come uno script Python separato, che produce YAML come output. Rispetto al metodo precedente, questo metodo scala meglio, poiché la conversione è separata dai dati.

Innanzitutto, creiamo un file JSON example.json, ad esempio, da cui puoi prenderlo json.org:

{
	"glossary": {
	  "title": "example glossary",
	  "GlossDiv": {
		"title": "S",
		"GlossList": {
		  "GlossEntry": {
			"ID": "SGML",
			"SortAs": "SGML",
			"GlossTerm": "Standard Generalized Markup Language",
			"Acronym": "SGML",
			"Abbrev": "ISO 8879:1986",
			"GlossDef": {
			  "para": "A meta-markup language, used to create markup languages such as DocBook.",
			  "GlossSeeAlso": ["GML", "XML"]
			  },
			"GlossSee": "markup"
			}
		  }
		}
	  }
	}

Quindi creeremo un semplice script di conversione e lo salveremo con il nome json2yaml.py. Questo script importa moduli Python sia YAML che JSON e carica un file JSON specificato dall'utente, esegue la conversione e scrive i dati nel file output.yaml.

#!/usr/bin/python3
import yaml
import sys
import json

OUT=open('output.yaml','w')
IN=open(sys.argv[1], 'r')

JSON = json.load(IN)
IN.close()
yaml.dump(JSON, OUT)
OUT.close()

Salva questo script nel percorso di sistema ed eseguilo secondo necessità:

$ ~/bin/json2yaml.py example.json

3. Analizza molto e spesso

A volte è utile guardare un problema da una prospettiva diversa. Se hai problemi a rappresentare le relazioni tra i tuoi dati in YAML, puoi trasformarli temporaneamente in qualcosa di più familiare.

Ad esempio, se hai dimestichezza con elenchi di dizionari o JSON, puoi convertire YAML in JSON con solo due comandi nella shell interattiva di Python. Supponiamo che tu abbia un file YAML mydata.yaml, quindi ecco come apparirebbe:

$ python3
>>> f=open('mydata.yaml','r')
>>> yaml.load(f)
{'document': 34843, 'date': datetime.date(2019, 5, 23), 'bill-to': {'given': 'Seth', 'family': 'Kenlon', 'address': {'street': '51b Mornington Roadn', 'city': 'Brooklyn', 'state': 'Wellington', 'postal': 6021, 'country': 'NZ'}}, 'words': 938, 'comments': 'Good article. Could be better.'}

Puoi trovare molti altri esempi su questo argomento. Inoltre, sono disponibili molti convertitori online e parser locali. Quindi non esitate a riformattare i dati quando vedete solo un miscuglio incomprensibile.

4. Leggi le specifiche

Tornando a YAML dopo una lunga pausa, è utile visitare yaml.org e rileggere le specifiche (specs). Se hai difficoltà con YAML, ma non sei riuscito a raggiungere le specifiche, è tempo di correggere questa situazione. Le specifiche sono sorprendentemente facili da scrivere e i requisiti di sintassi sono illustrati con un gran numero di esempi Capitolo 6.

5. Pseudo-configurazioni

Quando si scrive un libro o un articolo è sempre utile abbozzare prima uno schema preliminare, almeno sotto forma di sommario. È lo stesso con YAML. Molto probabilmente, hai un'idea di quali dati devono essere scritti in un file YAML, ma non capisci veramente come collegarli tra loro. Pertanto, prima di scolpire YAML, disegna uno pseudo-config.

La pseudo-config è simile allo pseudo-codice, in cui non devi preoccuparti della struttura o del rientro, delle relazioni genitore-figlio, dell'ereditarietà e della nidificazione. Qui è lo stesso: disegni iterazioni dei dati man mano che ti vengono in mente.

10 passaggi per YAML Zen

Elenco pseudo-configurazione dei programmatori (Martin e Tabitha) e le loro competenze (linguaggi di programmazione: Python, Perl, Pascal e Lisp, Fortran, Erlang, rispettivamente).

Dopo aver disegnato una pseudo-config su un pezzo di carta, analizzala attentamente e, se è tutto in ordine, formattala sotto forma di file YAML valido.

6. Il dilemma delle tabulazioni e degli spazi

Dovrai risolvere il dilemma "tabulazioni o spazi?". Non in senso globale, ma solo a livello della tua organizzazione, o almeno di progetto. Non importa se ciò implica l'uso della post-elaborazione con uno script sed, l'impostazione di editor di testo sulle macchine dei programmatori o l'accettazione universale di ricevute di stretta osservanza delle istruzioni del linter sotto minaccia di licenziamento, ma tutti i membri del tuo team che in in un modo o nell'altro riferirsi a YAML deve utilizzare solo spazi (come richiesto dalle specifiche YAML).

In qualsiasi normale editor di testo, puoi configurare le tabulazioni con correzione automatica su un numero specificato di spazi, in modo che la ribellione dei principali aderenti Linguetta non devi avere paura.

Come sa bene ogni odiatore di YAML, non puoi vedere la differenza tra schede e spazi sullo schermo. E quando qualcosa non è visibile, di solito è l'ultima cosa che le persone ricordano, dopo aver esaminato, controllato ed eliminato tutti gli altri possibili problemi. Un’ora trascorsa a cercare una curva di tabulazione o un blocco di spazi significa semplicemente che è necessario creare urgentemente una politica per l’uso dell’uno o dell’altro, e poi implementare un controllo in cemento armato per verificarne il rispetto (ad esempio, attraverso un hook Git per forzarlo attraverso un linter).

7. Meno è di più (o più è di meno)

Ad alcune persone piace scrivere in YAML perché enfatizza la struttura. Allo stesso tempo, utilizzano attivamente il rientro per evidenziare blocchi di dati. Questa è una specie di truffa per imitare i linguaggi di markup che utilizzano delimitatori espliciti.

Ecco un esempio di tale struttura da Documentazione ansible:

# Employee records
-  martin:
        name: Martin D'vloper
        job: Developer
        skills:
            - python
            - perl
            - pascal
-  tabitha:
        name: Tabitha Bitumen
        job: Developer
        skills:
            - lisp
            - fortran
            - erlang

Per alcuni, questa opzione li aiuta a sistemare la struttura YAML nelle loro teste, per altri, al contrario, li irrita con molti rientri non necessari, a loro avviso.

Ma se sei il proprietario del documento YAML e sei responsabile della sua manutenzione, allora tu e solo tu deve definire come utilizzare il rientro. Se sei infastidito dall'ampio riempimento, mantienilo al minimo possibile secondo le specifiche YAML. Ad esempio, il file sopra della documentazione Ansible può essere riscritto in questo modo senza alcuna perdita:

---
- martin:
   name: Martin D'vloper
   job: Developer
   skills:
   - python
   - perl
   - pascal
- tabitha:
   name: Tabitha Bitumen
   job: Developer
   skills:
   - lisp
   - fortran
   - erlang

8. Usa spazi vuoti

Se ripeti costantemente gli stessi errori quando compili un file YAML, ha senso inserirvi un modello come commento. La prossima volta potrai semplicemente copiare questo modello e inserire lì dati reali, ad esempio:

---
# - <common name>:
#   name: Given Surname
#   job: JOB
#   skills:
#   - LANG
- martin:
  name: Martin D'vloper
  job: Developer
  skills:
  - python
  - perl
  - pascal
- tabitha:
  name: Tabitha Bitumen
  job: Developer
  skills:
  - lisp
  - fortran
  - erlang

9. Usa qualcosa di diverso

Se l'applicazione non ha una stretta mortale su di te, potrebbe valere la pena cambiare lo YAML in un formato diverso. Con il passare del tempo, i file di configurazione possono diventare troppo grandi e quindi è meglio convertirli in semplici script in Lua o Python.

YAML è una cosa fantastica che molte persone amano per il suo minimalismo e semplicità, ma non è l'unico strumento nel tuo arsenale. Quindi a volte puoi rifiutarlo. Le librerie di analisi sono facili da trovare per YAML, quindi se offri opzioni di migrazione semplici, i tuoi utenti sopravvivranno a questo fallimento in modo relativamente indolore.

Se non puoi fare a meno di YAML, segui questi 10 suggerimenti e supera la tua antipatia per YAML una volta per tutte!

Fonte: habr.com

Aggiungi un commento