10 korakov do YAML Zen

Vsi imamo radi Ansible, vendar je Ansible YAML. Obstaja veliko formatov za konfiguracijske datoteke: seznami vrednosti, pari parameter-vrednost, datoteke INI, YAML, JSON, XML in mnogi drugi. Vendar se YAML zaradi več razlogov od vseh pogosto šteje za posebej težkega. Kljub svojemu osvežujočemu minimalizmu in impresivnim zmožnostim za delo s hierarhičnimi vrednostmi je sintaksa YAML lahko moteča s svojim Pythonu podobnim pristopom k zamiku.

10 korakov do YAML Zen

Če vas YAML razjezi, lahko – in bi morali! – naredite naslednjih 10 korakov, da zmanjšate svoje frustracije na sprejemljivo raven in se zaljubite v YAML. Kot se za ta seznam spodobi, bo naših deset nasvetov oštevilčenih od začetka, dodajali bomo meditacije in duhovne prakse po želji 😉

0. Naj vaš urejevalnik deluje

Ni pomembno, kateri urejevalnik besedila imate, verjetno obstaja vsaj en vtičnik za delo z YAML. Če ga nimate, ga takoj poiščite in namestite. Čas, porabljen za iskanje in nastavitev, se vam bo večkrat povrnil vsakič, ko boste morali urejati YAML.

Na primer urednik Atom privzeto podpira YAML, vendar boste za GNU Emacs morali namestiti dodatne pakete, npr. način yaml.

10 korakov do YAML Zen

Emacs v načinu YAML in prikaz presledkov.

Če vaš najljubši urejevalnik nima načina YAML, lahko nekatere težave rešite z delom z nastavitvami. Na primer, standardni urejevalnik besedil GNOME Gedit nima načina YAML, vendar privzeto osvetli sintakso YAML in vam omogoča konfiguracijo dela z zamiki:

10 korakov do YAML Zen

Nastavitev zamikov v Geditu.

Vtičnik risalni prostori za Gedit prikaže presledke kot pike, odpravlja dvoumnosti s stopnjami zamikov.

Z drugimi besedami, porabite čas za učenje o svojem najljubšem urejevalniku. Ugotovite, kaj on ali njegova razvojna skupnost ponuja za delo z YAML, in uporabite te funkcije. Zagotovo vam ne bo žal.

1. Uporabite linter

V idealnem primeru programski jeziki in označevalni jeziki uporabljajo predvidljivo sintakso. Računalniki so dobri v predvidljivosti, zato je koncept lintera. Če vas je v 40 letih obstoja minil in še vedno ne uporabljate linterja YAML, potem je čas, da preizkusite yamllint.

Namestite yamllint Uporabite lahko standardni upravitelj paketov Linux. Na primer, v Red Hat Enterprise Linux 8 ali Fedora naredi se takole:

$ sudo dnf install yamllint

Nato preprosto zaženete yamllint in mu posredujete datoteko YAML v preverjanje. Tako je videti, če linterju posredujete datoteko z napako:

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

Številke na levi niso čas, temveč koordinate napake: številka vrstice in stolpca. Opis napake vam morda ne pove ničesar, vendar točno veste, kje je. Samo poglejte to mesto v kodi in najverjetneje bo vse jasno.

Ko yamllint v datoteki ne najde napak, se nič ne natisne na zaslon. Če vas takšna tišina prestraši in želite malo več povratnih informacij, potem lahko linter zaženete z ukazom pogojnega odmeva prek dvojnega znaka & (&&), takole:

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

V POSIX-u se dvojni ampersand sproži, če in samo če prejšnji ukaz vrne 0. In yamllint samo vrne število najdenih napak, zato ta celotna pogojna konstrukcija deluje.

2. Pišite v Pythonu, ne v YAML

Če vas YAML res razjezi, preprosto ne pišite vanj, dobesedno. Zgodi se, da je YAML edini format, ki ga aplikacija razume. Toda tudi v tem primeru ni treba ustvariti datoteke YAML. Napišite, kar vam je všeč, in nato pretvorite. Na primer, obstaja odlična knjižnica za Python pyyaml in dva načina pretvorbe: samopretvorba in pretvorba s skripti.

Samospreobrnjenje

V tem primeru je podatkovna datoteka tudi skript Python, ki generira YAML. Ta metoda je najbolj primerna za majhne nize podatkov. Podatke JSON preprosto zapišete v spremenljivko Python, jim predpišete uvozno direktivo in na koncu datoteke dodate tri vrstice za izvedbo izhoda.

#!/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

Zdaj zaženemo to datoteko v Pythonu in dobimo datoteko 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

To je popolnoma veljaven YAML, vendar vas bo yamllint opozoril, da se ne začne z -. No, to je mogoče enostavno popraviti ročno ali rahlo spremeniti v skriptu Python.

Pretvorba preko skript

V tem primeru najprej pišemo v JSON, nato pa zaženemo pretvornik kot ločen skript Python, ki ustvari YAML kot izhod. V primerjavi s prejšnjo metodo se ta metoda bolje skalira, saj je pretvorba ločena od podatkov.

Najprej ustvarimo datoteko JSON example.json, iz katere jo lahko na primer vzamete 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"
			}
		  }
		}
	  }
	}

Nato bomo ustvarili preprost pretvorniški skript in ga shranili pod imenom json2yaml.py. Ta skript uvozi oba modula YAML in JSON Python ter naloži uporabniško določeno datoteko JSON, izvede pretvorbo in zapiše podatke v datoteko 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()

Shranite ta skript na sistemsko pot in ga po potrebi zaženite:

$ ~/bin/json2yaml.py example.json

3. Razčlenjujte veliko in pogosto

Včasih je koristno pogledati na problem z drugega zornega kota. Če imate težave s predstavljanjem odnosov med svojimi podatki v YAML, jih lahko začasno spremenite v nekaj bolj znanega.

Če na primer ne znate delati s seznami slovarjev ali JSON, lahko YAML pretvorite v JSON s samo dvema ukazoma v interaktivni lupini Python. Recimo, da imate datoteko YAML mydata.yaml, potem bi izgledala takole:

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

Na to temo lahko najdete veliko drugih primerov. Poleg tega je na voljo veliko spletnih pretvornikov in lokalnih razčlenjevalcev. Zato ne odlašajte s preoblikovanjem podatkov, ko v njih vidite samo nerazumljivo zmešnjavo.

4. Preberite specifikacije

Ob vrnitvi na YAML po dolgem premoru je koristno obiskati yaml.org in ponovno preberite specifikacije (specifikacije). Če imate težave z YAML, vendar še niste prišli do specifikacije, potem je čas, da popravite to situacijo. Specifikacije je presenetljivo enostavno napisati, sintaksne zahteve pa so ponazorjene z velikim številom primerov v 6. poglavje.

5. Psevdokonfiguracije

Ko pišete knjigo ali članek, je vedno koristno najprej skicirati predhodni oris, vsaj v obliki kazala. Enako je z YAML. Najverjetneje imate predstavo o tem, katere podatke je treba zapisati v datoteko YAML, vendar v resnici ne razumete, kako jih povezati med seboj. Zato pred oblikovanjem YAML narišite psevdokonfiguracijo.

Pseudo-config je podoben psevdo-kodi, kjer vam ni treba skrbeti za strukturo ali zamik, odnose med staršem in otrokom, dedovanje in gnezdenje. Tukaj je enako: rišete iteracije podatkov, ko se pojavijo v vaši glavi.

10 korakov do YAML Zen

Pseudo-config navaja programerje (Martin in Tabitha) in njihove veščine (programski jeziki: Python, Perl, Pascal in Lisp, Fortran, Erlang).

Ko na list papirja narišete psevdokonfiguracijo, jo natančno analizirajte in, če je vse v redu, formatirajte v obliki veljavne datoteke YAML.

6. Dilema med zavihki in presledki

Dilemo boste morali rešiti "zavihki ali presledki?". Ne v globalnem smislu, ampak samo na ravni vaše organizacije ali vsaj projekta. Ni pomembno, ali to vključuje uporabo naknadne obdelave s skriptom sed, nastavitev urejevalnikov besedil na strojih programerjev ali vsesplošno sprejemanje potrdil o strogem upoštevanju navodil linterja pod grožnjo odpuščanja, vendar vsi člani vaše ekipe, ki v tako ali drugače povezani z YAML, morajo uporabljati samo presledke (kot zahteva specifikacija YAML).

V katerem koli običajnem urejevalniku besedila lahko nastavite samopopravne zavihke na določeno število presledkov, tako da upor ključnih privržencev Tab ni se ti treba bati.

Kot dobro ve vsak sovražnik YAML, na zaslonu ne vidite razlike med zavihki in presledki. In ko nekaj ni vidno, je to največkrat zadnje, česar se ljudje spomnijo, potem ko so preuredili, preverili in odpravili vse morebitne težave. Ena ura časa, porabljenega za iskanje tabelarne krivulje ali bloka presledkov, preprosto kriči, da morate nujno ustvariti pravilnik za uporabo enega ali drugega in nato izvesti armiranobetonsko preverjanje skladnosti z njim (na primer prek kavelj Git, da ga vsili skozi linter).

7. Manj je več (ali več je manj)

Nekateri ljudje radi pišejo v YAML, ker poudarja strukturo. Hkrati aktivno uporabljajo zamik za poudarjanje blokov podatkov. To je neke vrste prevara za posnemanje označevalnih jezikov, ki uporabljajo eksplicitna ločila.

Tukaj je primer takšne strukture iz Anzibilna dokumentacija:

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

Nekaterim ta možnost pomaga urediti strukturo YAML v svojih glavah, druge pa, nasprotno, razdraži s številnimi nepotrebnimi, po njihovem mnenju, alinejami.

Če pa ste lastnik dokumenta YAML in ste odgovorni za njegovo vzdrževanje, potem ti in samo ti mora določiti, kako uporabljati zamik. Če vas moti veliko oblazinjenje, naj bo čim manjše glede na specifikacijo YAML. Na primer, zgornjo datoteko iz dokumentacije Ansible je mogoče prepisati takole brez izgube:

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

8. Uporabite praznine

Če pri izpolnjevanju datoteke YAML nenehno ponavljate iste napake, je smiselno vanjo vstaviti predlogo kot komentar. Potem lahko naslednjič preprosto kopirate to predlogo in vanjo vnesete prave podatke, na primer:

---
# - <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. Uporabite nekaj drugačnega

Če vas aplikacija ne zadavi, bi bilo morda vredno spremeniti YAML v drugo obliko. Sčasoma lahko konfiguracijske datoteke prerastejo same sebe in takrat jih je bolje pretvoriti v preproste skripte v Lua ali Python.

YAML je odlična stvar, ki jo mnogi obožujejo zaradi minimalizma in preprostosti, vendar še zdaleč ni edino orodje v vašem arzenalu. Zato ga včasih lahko zavrnete. Knjižnice za razčlenjevanje za YAML je enostavno najti, tako da če ponudite enostavne možnosti selitve, bodo vaši uporabniki relativno neboleče preživeli to napako.

Če ne morete brez YAML-ja, potem upoštevajte teh 10 nasvetov in enkrat za vselej premagajte svojo odpor do YAML-ja!

Vir: www.habr.com

Dodaj komentar