10 koraka do YAML Zena

Svi volimo Ansible, ali Ansible je YAML. Postoje mnogi formati za konfiguracijske datoteke: popisi vrijednosti, parovi parametar-vrijednost, INI datoteke, YAML, JSON, XML i mnogi drugi. Međutim, zbog nekoliko razloga od svih, YAML se često smatra posebno teškim. Konkretno, unatoč svom osvježavajućem minimalizmu i impresivnim mogućnostima za rad s hijerarhijskim vrijednostima, YAML sintaksa može smetati svojim pristupom uvlačenju nalik Pythonu.

10 koraka do YAML Zena

Ako vas YAML ljuti, možete — i trebali biste! – Poduzmite sljedećih 10 koraka kako biste svoju frustraciju sveli na prihvatljivu razinu i zaljubili se u YAML. Kako i priliči ovoj listi, naših deset savjeta bit će numerirani ispočetka, dodavat ćemo meditacije i duhovne prakse po želji 😉

0. Neka vaš urednik radi

Nije važno koji uređivač teksta imate, vjerojatno postoji barem jedan dodatak za rad s YAML-om. Ako ga nemate, odmah ga pronađite i instalirajte. Vrijeme potrošeno na traženje i postavljanje višestruko će se isplatiti svaki put kada budete morali uređivati ​​YAML.

Na primjer, urednik Atom podržava YAML prema zadanim postavkama, ali za GNU Emacs ćete morati instalirati dodatne pakete, na primjer, yaml-način.

10 koraka do YAML Zena

Emacs u YAML modu i prikaz razmaka.

Ako vaš omiljeni uređivač nema YAML način, tada se neki od problema mogu riješiti radom s postavkama. Na primjer, standardni GNOME uređivač teksta Gedit nema YAML način rada, ali prema zadanim postavkama ističe YAML sintaksu i omogućuje vam da konfigurirate rad s uvlakama:

10 koraka do YAML Zena

Postavljanje uvlaka u Geditu.

Dodatak crteži za Gedit, prikazuje razmake kao točke, eliminirajući dvosmislenosti s razinama uvlake.

Drugim riječima, provedite vrijeme učeći o svom omiljenom uredniku. Saznajte što on ili njegova razvojna zajednica nudi za rad s YAML-om i upotrijebite te značajke. Sigurno nećete požaliti.

1. Koristite linter

U idealnom slučaju, programski jezici i označni jezici koriste predvidljivu sintaksu. Računala su dobra u predvidljivosti, zbog čega je koncept lintera. Ako vas je u 40 godina postojanja prošao, a još uvijek ne koristite YAML linter, vrijeme je da isprobate yamllint.

uspostaviti yamllint Možete koristiti standardni Linux upravitelj paketa. Na primjer, u Red Hat Enterprise Linux 8 ili Fedora radi se ovako:

$ sudo dnf install yamllint

Zatim jednostavno pokrenete yamllint, prosljeđujući mu YAML datoteku na provjeru. Ovako to izgleda ako linteru proslijedite datoteku s greškom:

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

Brojevi s lijeve strane nisu vrijeme, već koordinate pogreške: broj retka i stupca. Opis greške vam možda ništa ne govori, ali točno znate gdje je. Samo pogledajte ovo mjesto u kodu i najvjerojatnije će sve postati jasno.

Kada yamllint ne pronađe greške u datoteci, ništa se ne ispisuje na ekranu. Ako vas takva tišina plaši i želite malo više povratnih informacija, onda možete pokrenuti linter s uvjetnom echo naredbom preko dvostrukog znaka & (&&), ovako:

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

U POSIX-u, dvostruki ampersand aktivira se ako i samo ako prethodna naredba vrati 0. A yamllint samo vraća broj pronađenih pogrešaka, zbog čega cijela ova uvjetna konstrukcija funkcionira.

2. Pišite u Pythonu, a ne u YAML-u

Ako vas YAML stvarno ljuti, samo nemojte pisati u njemu, doslovno. Događa se da je YAML jedini format koji aplikacija razumije. Ali čak ni u ovom slučaju nije potrebno izraditi YAML datoteku. Pišite ono što želite, a zatim pretvorite. Na primjer, postoji izvrsna biblioteka za Python pyyaml i dvije metode pretvorbe: samopretvorba i pretvorba putem skripti.

Samoobraćenje

U ovom slučaju, podatkovna datoteka također je Python skripta koja generira YAML. Ova metoda je najprikladnija za male skupove podataka. Jednostavno upišete JSON podatke u Python varijablu, prethodite im direktivom za uvoz i na kraju datoteke dodate tri retka za implementaciju izlaza.

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

Sada pokrećemo ovu datoteku u Pythonu i dobivamo datoteku 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

Ovo je savršeno valjan YAML, ali yamllint će vas upozoriti da ne počinje s -. Pa, ovo se može lako ispraviti ručno ili malo modificirati u Python skripti.

Konverzija putem skripti

U ovom slučaju, prvo pišemo u JSON-u, a zatim pokrećemo pretvarač kao zasebnu Python skriptu, koja proizvodi YAML kao izlaz. U usporedbi s prethodnom metodom, ova se metoda bolje mjeri jer je konverzija odvojena od podataka.

Prvo, stvorimo JSON datoteku example.json, na primjer, iz koje je možete preuzeti 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"
			}
		  }
		}
	  }
	}

Zatim ćemo izraditi jednostavnu skriptu pretvarača i spremiti je pod imenom json2yaml.py. Ova skripta uvozi YAML i JSON Python module i učitava JSON datoteku koju je odredio korisnik, izvodi konverziju i zapisuje podatke u datoteku 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()

Spremite ovu skriptu na put sustava i pokrenite je po potrebi:

$ ~/bin/json2yaml.py example.json

3. Raščlanjujte puno i često

Ponekad je korisno sagledati problem iz drugog kuta. Ako imate problema s predstavljanjem odnosa između svojih podataka u YAML-u, možete ih privremeno transformirati u nešto poznatije.

Na primjer, ako vam je ugodno raditi s popisima rječnika ili JSON-om, možete pretvoriti YAML u JSON sa samo dvije naredbe u interaktivnoj Python ljusci. Recimo da imate YAML datoteku mydata.yaml, onda bi to izgledalo ovako:

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

Možete pronaći mnoge druge primjere na ovu temu. Osim toga, dostupni su mnogi mrežni pretvarači i lokalni parseri. Stoga nemojte oklijevati ponovno formatirati podatke kada u njima vidite samo neshvatljivu zbrku.

4. Pročitajte specifikacije

Povratak na YAML nakon duge pauze, korisno je posjetiti yaml.org i ponovno pročitajte specifikacije (specifikacije). Ako imate poteškoća s YAML-om, ali niste shvatili specifikaciju, vrijeme je da ispravite ovu situaciju. Specifikacije je iznenađujuće lako napisati, a zahtjevi sintakse ilustrirani su velikim brojem primjera u Poglavlje 6.

5. Pseudo-konfiguracije

Kada pišete knjigu ili članak, uvijek je korisno prvo skicirati preliminarni nacrt, barem u obliku tablice sadržaja. Isto je i s YAML-om. Najvjerojatnije imate ideju koje podatke treba zapisati u YAML datoteku, ali zapravo ne razumijete kako ih međusobno povezati. Stoga, prije oblikovanja YAML-a, nacrtajte pseudo-konfiguraciju.

Pseudo-config je sličan pseudo-kodu, gdje ne morate brinuti o strukturi ili uvlačenju, odnosima roditelj-dijete, nasljeđivanju i gniježđenju. Ovdje je isto: crtate iteracije podataka kako se pojavljuju u vašoj glavi.

10 koraka do YAML Zena

Pseudo-config popis programera (Martin i Tabitha) i njihovih vještina (programski jezici: Python, Perl, Pascal i Lisp, Fortran, Erlang, redom).

Nakon što nacrtate pseudokonfiguraciju na komadu papira, pažljivo je analizirajte i, ako je sve u redu, formatirajte je u obliku valjane YAML datoteke.

6. Dilema tabulatori protiv razmaka

Morat ćete riješiti dilemu "tabulatori ili razmaci?". Ne u globalnom smislu, već samo na razini vaše organizacije ili barem projekta. Nije važno uključuje li to korištenje naknadne obrade sa sed skriptom, postavljanje uređivača teksta na programerskim strojevima ili univerzalno uzimanje potvrda o strogom pridržavanju linterovih uputa pod prijetnjom otkaza, ali svi članovi vašeg tima koji u na ovaj ili onaj način povezani s YAML-om moraju koristiti samo razmake (kao što zahtijeva YAML specifikacija).

U bilo kojem normalnom uređivaču teksta možete konfigurirati kartice s automatskim ispravljanjem na određeni broj razmaka, tako da pobuna ključnih pristaša Tabulator ne moraš se bojati.

Kao što svaki mrzitelj YAML-a dobro zna, ne možete vidjeti razliku između tabova i razmaka na ekranu. A kada se nešto ne vidi, obično je to zadnje čega se ljudi sjete, nakon što su sredili, provjerili i otklonili sve ostale moguće probleme. Sat vremena provedenog u potrazi za tabelarnom krivuljom ili blokom razmaka jednostavno vrišti da morate hitno izraditi politiku za korištenje jednog ili drugog, a zatim provesti armiranobetonsku provjeru usklađenosti s njom (na primjer, kroz Git kuka za prolazak kroz linter).

7. Manje je više (ili više je manje)

Neki ljudi vole pisati u YAML-u jer naglašava strukturu. Istodobno, oni aktivno koriste uvlačenje za isticanje blokova podataka. Ovo je neka vrsta prijevare da se oponašaju označni jezici koji koriste eksplicitne graničnike.

Evo primjera takve 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

Nekima ova opcija pomaže da razvrstaju YAML strukturu u svojim glavama; za druge, naprotiv, iritira ih puno nepotrebnih, po njihovom mišljenju, uvlaka.

Ali ako ste vlasnik YAML dokumenta i odgovorni ste za njegovo održavanje, onda ti i samo ti mora definirati kako koristiti uvlačenje. Ako vas živcira veliko ispunjavanje, svedite ga na najmanju moguću mjeru prema YAML specifikaciji. Na primjer, gornja datoteka iz Ansible dokumentacije može se prepisati ovako bez ikakvih gubitaka:

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

8. Koristite praznine

Ako stalno ponavljate iste pogreške prilikom ispunjavanja YAML datoteke, ima smisla umetnuti predložak u nju kao komentar. Zatim sljedeći put jednostavno kopirajte ovaj predložak i tamo unesite stvarne podatke, na primjer:

---
# - <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. Koristite nešto drugačije

Ako vas aplikacija ne drži, možda bi bilo vrijedno promijeniti YAML u drugi format. S vremenom konfiguracijske datoteke mogu prerasti same sebe i tada ih je bolje pretvoriti u jednostavne skripte u Lua ili Python.

YAML je sjajna stvar koju mnogi ljudi vole zbog svog minimalizma i jednostavnosti, ali daleko od toga da je jedini alat u vašem arsenalu. Tako da ga ponekad možete odbiti. Lako je pronaći biblioteke parsiranja za YAML, pa ako ponudite jednostavne opcije migracije, vaši će korisnici relativno bezbolno preživjeti ovaj kvar.

Ako ne možete bez YAML-a, poslušajte ovih 10 savjeta i nadvladajte svoju nesklonost YAML-u jednom zauvijek!

Izvor: www.habr.com

Dodajte komentar