10 Passi per YAML Zen

Tutti amemu Ansible, ma Ansible hè YAML. Ci sò parechji formati per i schedarii di cunfigurazione: listi di valori, paràmetri-valori, file INI, YAML, JSON, XML è assai altri. In ogni casu, per parechje ragioni fora di tutti, YAML hè spessu cunsideratu particularmente difficiule. In particulare, malgradu u so minimalismu rinfrescante è e capacità impressiunanti per travaglià cù i valori gerarchichi, a sintassi YAML pò esse fastidiosa cù u so approcciu Python-like à l'indentazione.

10 Passi per YAML Zen

Se YAML ti piscia, pudete - è duvete! - pigliate i seguenti 10 passi per riduce a vostra frustrazione à un livellu accettabile è innamurà di YAML. Cume si cunvene à sta lista, i nostri dece cunsiglii seranu numerati da zero, aghjunghjemu meditazioni è pratiche spirituali à vuluntà 😉

0. Fate u vostru editore travaglià

Ùn importa micca quale editore di testu avete, ci hè probabilmente almenu un plugin per travaglià cù YAML. Se ùn avete micca unu, truvate è installate immediatamente. U tempu passatu à circà è a stallazione hà da pagà parechje volte ogni volta chì avete da edità YAML.

Per esempiu, editore Atom supporta YAML per difettu, ma per GNU Emacs duverete installà pacchetti supplementari, per esempiu, yaml-mode.

10 Passi per YAML Zen

Emacs in modu YAML è mostra spazii.

Se u vostru editore preferitu ùn hà micca un modu YAML, allora alcuni di i prublemi ponu esse risolti travagliendu cù i paràmetri. Per esempiu, l'editore di testu standard di GNOME Gedit ùn hà micca un modu YAML, ma per automaticamente mette in risaltu a sintassi YAML è vi permette di cunfigurà u travagliu cù indentazioni:

10 Passi per YAML Zen

Impostazione di indentazioni in Gedit.

Un plugin drawspaces per Gedit, mostra spazii cum'è punti, eliminendu ambiguità cù livelli di indentazione.

In altre parolle, passanu u tempu à amparà nantu à u vostru editore preferitu. Scuprite ciò chì ellu o a so cumunità di sviluppu hà da offre per travaglià cù YAML, è utilizate queste funzioni. Di sicuru, ùn ti dispiace micca.

1. Aduprate un linter

Ideale, i linguaggi di prugrammazione è i linguaggi di marcatura utilizanu sintassi prevedibile. L'urdinatori sò boni à prevedibilità, per quessa chì u cuncettu di lintera. Se in i 40 anni di a so esistenza vi hà passatu è ùn avete micca aduprà un linter YAML, allora hè ora di pruvà yamllint.

Installà yamllint Pudete aduprà u gestore di pacchetti Linux standard. Per esempiu, in Red Hat Enterprise Linux 8 o Fedora hè fattu cusì:

$ sudo dnf install yamllint

Allora simpricimenti eseguite yamllint, passendu u schedariu YAML per verificà. Questu hè ciò chì pare si passa un schedariu cù un errore à 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 à manca ùn sò micca u tempu, ma i coordenate di l'errore: u numeru di fila è colonna. A descrizzione di l'errore ùn pò micca dì nunda, ma sapete esattamente induve hè. Basta à vede stu locu in u codice, è più prubabilmente tuttu diventerà chjaru.

Quandu yamllint ùn trova micca errore in un schedariu, nunda ùn hè stampatu à u screnu. Se un tali silenziu ti fa paura è vulete un pocu di più feedback, allora pudete eseguisce u linter cù u cumandamentu di ecu cundizionale via un doppiu ampersand (&&), cum'è questu:

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

In POSIX, un doppiu ampersand spara se è solu s'ellu u cumandamentu precedente torna 0. È yamllint torna solu u numeru d'errori truvati, chì hè per quessa chì tutta a custruzzione cundizionale travaglia.

2. Scrivite in Python, micca YAML

Se YAML ti piscia veramente, ùn scrivite micca, literalmente. Succece chì YAML hè u solu furmatu chì l'applicazione capisce. Ma ancu in questu casu, ùn hè micca necessariu di creà un schedariu YAML. Scrivite nantu à ciò chì ti piace è poi cunvertisce. Per esempiu, ci hè una grande biblioteca per Python pyyaml è dui metudi di cunversione: self-conversione è cunversione attraversu scripts.

Autoconversione

In questu casu, u schedariu di dati hè ancu un script Python chì genera YAML. Stu metudu hè megliu adattatu per i picculi gruppi di dati. Simply scrivite i dati JSON in una variabile Python, preface cù una direttiva d'importazione, è à a fine di u schedariu aghjunghje trè linee per implementà 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

Avà eseguimu stu schedariu in Python è uttene u schedariu 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

Questu hè YAML perfettamente validu, ma yamllint vi avviserà chì ùn principia micca cù -. Ebbè, questu pò esse facilmente correttu manualmente o ligeramente mudificatu in u script Python.

Cunversione via scripts

In questu casu, prima scrivemu in JSON, è poi eseguite u cunvertitore cum'è un script Python separatu, chì pruduce YAML cum'è output. Comparatu à u metudu precedente, stu metudu scala megliu, postu chì a cunversione hè separata da i dati.

Prima, creamu un schedariu JSON example.json, per esempiu, pudete piglià da 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"
			}
		  }
		}
	  }
	}

Allora creeremu un script di cunvertitore simplice è salvà sottu u nome json2yaml.py. Stu script importa i moduli YAML è JSON Python, è carica un schedariu JSON specificatu da l'utilizatore, esegue a cunversione, è scrive i dati à u schedariu 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()

Salvà stu script in u percorsu di u sistema è eseguite cum'è necessariu:

$ ~/bin/json2yaml.py example.json

3. Parse assai è spessu

Calchì volta hè utile à guardà un prublema da un altru angulu. Sè avete prublemi à rapprisintà e relazioni trà i vostri dati in YAML, pudete trasfurmà temporaneamente in qualcosa di più familiar.

Per esempiu, sè vo site còmode di travaglià cù listi di dizziunariu o JSON, pudete cunvertisce YAML à JSON cù solu dui cumandamenti in a cunchiglia interattiva di Python. Diciamu chì avete un schedariu YAML mydata.yaml, allora questu hè ciò chì parerebbe:

$ 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.'}

Pudete truvà parechje altre esempi nantu à questu tema. Inoltre, ci sò parechji cunvertitori in linea è parsers lucali dispunibili. Allora ùn esitò à riformattà i dati quandu vi vede solu un mischju incomprensibile in questu.

4. Leghjite e specifiche

Riturnà à YAML dopu una longa pausa, hè utile per visità yaml.org è rileghje e specificazioni (specs). Sì avete difficultà cù YAML, ma ùn avete micca ghjuntu à a specificazione, allora hè u tempu di corregge sta situazione. E specifiche sò sorprendentemente faciuli di scrive, è i requisiti di sintassi sò illustrati cù un gran numaru d'esempi in Capitulu 6.

5. Pseudo-configs

Quandu scrivite un libru o un articulu, hè sempre utile à prima sketch out un schema preliminare, almenu in a forma di una tabella di cuntenutu. Hè u listessu cù YAML. Hè assai prubabile, avete una idea di quale dati deve esse scritti in un schedariu YAML, ma ùn avete micca veramente capitu cumu cunnetta cù l'altri. Dunque, prima di sculptà YAML, disegnate una pseudo-config.

Pseudo-config hè simile à pseudo-codice, induve ùn avete micca da preoccupassi di struttura o indentazione, relazioni genitori-figlioli, eredi è nidificazione. Hè listessa quì: disegnà iterazioni di e dati cumu si sviluppanu in a vostra testa.

10 Passi per YAML Zen

Pseudo-config lista di programatori (Martin è Tabitha) è e so cumpetenze (lingue di prugrammazione: Python, Perl, Pascal è Lisp, Fortran, Erlang, rispettivamente).

Dopu avè disegnatu una pseudo-configurazione nantu à un pezzu di carta, analizà cù cura è, se tuttu hè in ordine, formate in a forma di un schedariu YAML validu.

6. U Tabs vs Spaces Dilemma

Avete da risolve u dilema "tabulazioni o spazii?". Micca in un sensu globale, ma solu à u livellu di a vostra urganizazione, o almenu un prughjettu. Ùn importa micca s'ellu implica l'usu di post-processing cù un script sed, l'installazione di editori di testu nantu à i macchinari di i programatori, o di piglià universalmente ricevute di rispettu strettu di l'istruzzioni di linter in minaccia di licenziamentu, ma tutti i membri di a vostra squadra chì in un modu o un altru in relazione à YAML deve aduprà solu spazii (cum'è necessariu da a specificazione YAML).

In ogni editore di testu normale, pudete cunfigurà tabulazioni auto-corrette à un numeru specificu di spazii, cusì a rivolta di aderenti chjave. Tabulature ùn avete micca a paura.

Cum'è ogni hater YAML sapi bè, ùn pudete micca vede a diffarenza trà tabulazioni è spazii nantu à u screnu. È quandu qualcosa ùn hè micca visibile, hè di solitu l'ultimu ciò chì a ghjente si ricorda, dopu avè risoltu, verificatu è eliminatu tutti l'altri prublemi pussibuli. Una ora di tempu spentu per circà una curva di tabulazione o un bloccu di spazii simpricimenti grida chì avete bisognu urgente di creà una pulitica per l'usu di l'una o l'altru, è poi implementà un cuntrollu di béton armatu per u rispettu di questu (per esempiu, attraversu un ganciu Git per furzà à traversu un linter).

7. Meno hè più (o più hè menu)

Certi pirsuni piace à scrive in YAML perchè enfatiza a struttura. À u listessu tempu, usanu attivamente l'indentazione per evidenziare blocchi di dati. Questa hè una spezia di scam per imità e lingue di marcatura chì utilizanu delimitatori espliciti.

Quì hè un esempiu di tali 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, sta opzione li aiuta à risolve a struttura YAML in i so capi; per altri, à u cuntrariu, li irrita cù assai indici innecessarii, in u so parè.

Ma s'è vo site u pruprietariu di u documentu YAML è sò rispunsevuli di mantene, allora voi è solu voi deve definisce cumu utilizà l'indentazione. Sè vo site fastidiu da grande padding, mantene à u minimu pussibule secondu a specificazione YAML. Per esempiu, u schedariu di sopra da a documentazione Ansible pò esse riscritta cusì 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. Aduprà spazii

Se ripetite constantemente i stessi errori quandu cumplete un schedariu YAML, hè sensu per inserisce un mudellu in questu cum'è cumentu. Allora a prossima volta pudete simpricimenti copià stu mudellu è inserisce dati reali, per esempiu:

---
# - <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. Aduprate qualcosa di differente

Se l'applicazione ùn hà micca un stranglehold nantu à voi, allora puderia vale a pena cambià u YAML à un furmatu diversu. À u tempu, i schedarii di cunfigurazione ponu superà elli stessi è allora hè megliu cunvertisce in script simplici in Lua o Python.

YAML hè una grande cosa chì assai persone amanu per u so minimalismu è simplicità, ma hè luntanu da l'unicu strumentu in u vostru arsenale. Allora qualchì volta pudete ricusà. E biblioteche di analisi sò faciuli di truvà per YAML, dunque se offre opzioni di migrazione facili, i vostri utenti sopravviveranu à questu fallimentu relativamente indolore.

Se ùn pudete micca fà senza YAML, allora pigliate questi 10 cunsiglii è superà a vostra disgrazia di YAML una volta per tutte!

Source: www.habr.com

Add a comment