10 koraka do YAML zena

Svi volimo Ansible, ali Ansible je YAML. Postoji mnogo formata za konfiguracijske datoteke: liste vrijednosti, parovi parametar-vrijednost, INI datoteke, YAML, JSON, XML i mnogi drugi. Međutim, iz nekoliko razloga, od svih njih, YAML se često smatra posebno teškim. Konkretno, uprkos svom osvježavajućem minimalizmu i impresivnim mogućnostima za rad sa hijerarhijskim vrijednostima, YAML sintaksa može biti neugodna sa svojim pristupom uvlačenju nalik na Python.

10 koraka do YAML zena

Ako vas YAML iznervira, možete - i trebali biste! - poduzmite sljedećih 10 koraka da smanjite svoju iritaciju na prihvatljiv nivo i volite YAML. Kako i priliči ovoj listi, naših deset savjeta će biti numerisano od nule, dodajemo meditaciju i duhovne prakse po želji 😉

0. Neka vaš urednik radi

Nije bitno koji uređivač teksta imate, vjerovatno postoji barem jedan YAML dodatak za njega. Ako ga nemate, odmah ga pronađite i instalirajte. Vrijeme koje potrošite na pretraživanje i podešavanje će se višestruko isplatiti svaki put kada trebate uređivati ​​YAML.

Na primjer, urednik atom podržava YAML po defaultu, ali za GNU Emacs morat ćete instalirati dodatne pakete, na primjer, yaml-mode.

10 koraka do YAML zena

Emacs u YAML modu i prikazuje razmake.

Ako vaš omiljeni uređivač nema YAML mod, onda se neki od problema mogu riješiti radom s postavkama. Na primjer, standardni GNOME uređivač teksta Gedit nema YAML način rada, ali po defaultu naglašava YAML sintaksu i omogućava vam da prilagodite uvlačenje:

10 koraka do YAML zena

Postavljanje uvlaka u Geditu.

Dodatak drawspaces za Gedit, prikazuje razmake kao tačke, eliminišući nejasnoće sa nivoima uvlačenja.

Drugim riječima, odvojite vrijeme da naučite svoj omiljeni uređivač. Saznajte šta on ili njegova razvojna zajednica mogu ponuditi za rad sa YAML-om i iskoristite ove mogućnosti. Definitivno nećete požaliti.

1. Koristite linter

U idealnom slučaju, programski jezici i jezici za označavanje koriste predvidljivu sintaksu. Kompjuteri su dobri u predvidljivosti, zbog čega se davne 1978. godine pojavio koncept linter. Ako vas je za 40 godina postojanja prošao, a još uvijek ne koristite YAML linter, onda je vrijeme da isprobate yamllint.

Instalacija yamllint Možete koristiti izvorni Linux menadžer paketa. Na primjer, u Red Hat Enterprise Linux 8 ili fedora radi se ovako:

$ sudo dnf install yamllint

Zatim jednostavno pokrenite yamllint, proslijeđujući mu YAML datoteku za testiranje. Evo kako to izgleda ako linteru prosledite datoteku sa 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 na lijevoj strani nisu vrijeme, već koordinate greške: broj reda i kolone. Opis greške vam možda neće ništa reći, ali znate tačno gdje se nalazi. Samo pogledajte ovo mjesto u kodu i najvjerovatnije će vam sve postati jasno.

Kada yamllint ne pronađe greške u datoteci, ništa se ne ispisuje na ekran. Ako vas takva tišina plaši i želite još malo povratne informacije, onda možete pokrenuti linter sa uslovnom naredbom echo kroz dvostruki ampersand (&&), ovako:

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

U POSIX-u, dvostruki ampersand se aktivira ako i samo ako prethodna komanda vrati 0. A yamllint samo vraća broj pronađenih grešaka, zbog čega cela ova uslovna konstrukcija funkcioniše.

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

Ako vas YAML stvarno ljuti, samo nemojte pisati u njemu, doslovno. Dešava se da je YAML jedini format koji aplikacija prihvata. Ali u ovom slučaju nije potrebno kreirati YAML datoteku. Napišite šta želite, a zatim pretvorite. Na primjer, postoji odlična biblioteka za Python pyyaml i dva cijela načina pretvaranja: samokonvertiranje i pretvaranje putem skripti.

Samopretvaranje

U ovom slučaju, datoteka podataka je također Python skripta koja generiše YAML. Ova metoda je najbolja za male skupove podataka. Jednostavno pišete JSON podatke u Python varijablu, stavljate joj prefiks sa direktivom uvoza i dodajete tri reda na kraju datoteke da implementirate izlaz.

#!/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 dobijamo output.yaml datoteku kao izlaz:

$ 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 važeći YAML, ali yamllint će vas upozoriti da ne počinje sa -. Pa, ovo se može lako ispraviti rukom, ili malo podesiti Python skriptom.

Konvertovanje putem skripti

U ovom slučaju prvo pišemo u JSON-u, a zatim pokrećemo konvertor kao zasebnu Python skriptu, koja proizvodi YAML kao izlaz. U poređenju sa prethodnom metodom, ova metoda se bolje skalira, jer je konverzija odvojenih podataka.

Prvo, napravimo JSON datoteku example.json, na primjer, iz koje je možete uzeti 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, napravimo jednostavnu skriptu za pretvaranje i spremimo je kao json2yaml.py. Ova skripta uvozi i YAML i JSON Python module, učitava JSON datoteku koju je odredio korisnik, izvodi konverziju i upisuje 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()

Sačuvajte ovu skriptu na sistemskoj putanji i pokrenite je po potrebi:

$ ~/bin/json2yaml.py example.json

3. Parsirajte mnogo i često

Ponekad pomaže da se problem sagleda iz drugog ugla. Ako vam je teško predstaviti odnose između podataka u YAML-u, možete ih privremeno transformirati u nešto poznatije.

Na primjer, ako vam je ugodno raditi sa listama rječnika ili JSON-om, tada se YAML može konvertirati u JSON sa samo dvije naredbe u interaktivnoj Python ljusci. Recimo da imate YAML datoteku mydata.yaml, a 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.'}

Postoji mnogo drugih primjera na ovu temu. Osim toga, dostupni su mnogi online konverteri i lokalni parseri. Stoga slobodno preformatirajte podatke kada vidite samo neshvatljivu zbrku u njima.

4. Pročitajte specifikacije

Vraćajući se na YAML nakon duže pauze, korisno je provjeriti yaml.org i ponovo pročitajte specifikacije (specifikacije). Ako imate poteškoća s YAML-om, ali vaše ruke nisu dostigle specifikaciju, onda je vrijeme da ispravite ovu situaciju. Specifikacije je iznenađujuće lako napisati, a sintaktički zahtjevi ilustrirani su s puno primjera u Poglavlje 6.

5. Pseudoconfigs

Kada pišete knjigu ili članak, uvijek je dobra ideja prvo skicirati preliminarni nacrt, barem u obliku tabele sadržaja. Isto i sa YAML-om. Najvjerovatnije imate ideju o tome koje podatke treba upisati u YAML datoteku, ali ne razumijete kako ih međusobno povezati. Stoga, prije oblikovanja YAML-a, nacrtajte pseudo-konfiguraciju.

Pseudoconfig je poput pseudokoda gdje ne morate da brinete o strukturi ili uvlačenju, odnosima roditelj-dijete, nasljeđivanju i ugniježđenju. Tako je i ovdje: crtate iteracije podataka onako kako se pojavljuju u vašoj glavi.

10 koraka do YAML zena

Pseudoconfig lista programera (Martin i Tabitha) i njihove vještine (programski jezici: Python, Perl, Pascal i Lisp, Fortran, Erlang, respektivno).

Nakon što ste nacrtali pseudo-konfiguraciju na komadu papira, pažljivo je analizirajte i, ako je sve u redu, formatirajte je kao važeću YAML datoteku.

6. Dilema o karticama ili razmacima

Morate riješiti dilemu "tabulatori ili razmaci?". Ne u globalnom smislu, već samo na nivou vaše organizacije, ili barem projekta. Nije bitno da li ovo uključuje naknadnu obradu sa sed skriptom, postavljanje uređivača teksta na programerskim mašinama ili potpuno uzimanje računa za striktno pridržavanje uputa lintera pod prijetnjom otpuštanja, ali svi članovi vašeg tima koji u na ovaj ili onaj način koji se odnosi na YAML mora koristiti samo razmake (kao što zahtijeva YAML specifikacija).

U svakom normalnom uređivaču teksta možete podesiti automatsku zamjenu tabulatora za određeni broj razmaka, tako da pobuna pristalica ključa štampanje ne možete se bojati.

Kao što svi mrzitelji YAML-a dobro znaju, ne postoji razlika između tabova i razmaka na ekranu. A kada se nešto ne vidi, to se po pravilu zadnje pamti, nakon što se sredi, proveri i otkloni svi ostali mogući problemi. Sat vremena izgubljenog u potrazi za tabom ili blokom prostora samo vapi da hitno morate kreirati politiku za korištenje jednog ili drugog, a zatim implementirati armiranobetonsku provjeru njegove usklađenosti (na primjer, putem Git kuke za prisilno proći kroz linter).

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

Neki ljudi vole pisati na YAML-u jer naglašava strukturu. Istovremeno, oni aktivno koriste uvlake za isticanje blokova podataka. To je neka vrsta prevara oponašati jezike za označavanje koji koriste eksplicitne graničnike.

Evo primjera takve strukture iz Ansible 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 u razgradnji YAML strukture u njihovim glavama, dok ih drugima, naprotiv, nervira masom nepotrebnih, po njihovom mišljenju, uvlaka.

Ali ako ste vlasnik YAML dokumenta i odgovorni ste za njegovo održavanje, onda ti i samo ti treba odrediti kako koristiti udubljenje. Ako vas nervira veliko udubljenje, smanjite ga na najmanju moguću mjeru prema YAML specifikaciji. Na primjer, gornji fajl iz Ansible dokumentacije može se prepisati ovako bez ikakvog gubitka:

---
- 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 greške prilikom popunjavanja YAML datoteke, ima smisla umetnuti prazan predložak u njega kao komentar. Onda sljedeći put možete jednostavno kopirati ovo prazno mjesto i unijeti 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 zadaje, možda bi bilo vrijedno promijeniti YAML u drugi format. Vremenom, konfiguracioni fajlovi mogu prerasti sami sebe, i tada ih je bolje konvertovati u jednostavne Lua ili Python skripte.

YAML je sjajna stvar koju mnogi ljudi vole zbog svog minimalizma i jednostavnosti, ali je daleko od jedinog alata u vašem arsenalu. Tako da ponekad možete to odbiti. Lako je pronaći biblioteke za raščlanjivanje za YAML, tako da ako ponudite zgodne opcije migracije, vaši korisnici će preživjeti takvo odbijanje relativno bezbolno.

Ako ne možete bez YAML-a, upotrijebite ovih 10 savjeta i pobijedite svoju nesklonost prema YAML-u jednom zauvijek!

izvor: www.habr.com

Dodajte komentar