10 žingsnių iki YAML Zen

Mes visi mėgstame Ansible, bet Ansible yra YAML. Yra daug konfigūracijos failų formatų: reikšmių sąrašai, parametrų ir reikšmių poros, INI failai, YAML, JSON, XML ir daugelis kitų. Tačiau dėl kelių priežasčių YAML dažnai laikoma ypač sudėtinga. Visų pirma, nepaisant gaivaus minimalizmo ir įspūdingų galimybių dirbti su hierarchinėmis reikšmėmis, YAML sintaksė gali erzinti dėl savo Python tipo įtraukos.

10 žingsnių iki YAML Zen

Jei YAML jus erzina, galite – ir turėtumėte! – Atlikite šiuos 10 žingsnių, kad sumažintumėte savo nusivylimą iki priimtino lygio ir įsimylėtumėte YAML. Kaip ir dera šiame sąraše, mūsų dešimt patarimų bus suskaičiuoti nuo nulio, mes įtrauksime meditaciją ir dvasines praktikas pagal valią 😉

0. Padarykite savo redaktorių darbą

Nesvarbu, kokį teksto rengyklę turite, tikriausiai yra bent vienas papildinys darbui su YAML. Jei jo neturite, nedelsdami suraskite ir įdiekite. Laikas, praleistas ieškant ir nustatant, atsipirks daug kartų kiekvieną kartą, kai turėsite redaguoti YAML.

Pavyzdžiui, redaktorius Atomas Pagal numatytuosius nustatymus palaiko YAML, tačiau GNU Emacs turėsite įdiegti papildomus paketus, pvz. yaml režimas.

10 žingsnių iki YAML Zen

„Emacs“ veikia YAML režimu ir rodo tarpus.

Jei jūsų mėgstamiausias redaktorius neturi YAML režimo, kai kurias problemas galima išspręsti dirbant su nustatymais. Pavyzdžiui, standartinė GNOME teksto rengyklė Gedit neturi YAML režimo, tačiau pagal numatytuosius nustatymus paryškina YAML sintaksę ir leidžia konfigūruoti darbą su įtraukomis:

10 žingsnių iki YAML Zen

Įtraukų nustatymas Gedite.

Papildinys tarpai Gedit, tarpai rodomi kaip taškai, pašalinant neaiškumus su įtraukų lygiais.

Kitaip tariant, praleiskite laiką mokydamiesi apie savo mėgstamą redaktorių. Sužinokite, ką jis arba jo kūrėjų bendruomenė gali pasiūlyti darbui su YAML, ir naudokite šias funkcijas. Tikrai nepasigailėsite.

1. Naudokite liniją

Idealiu atveju programavimo kalbos ir žymėjimo kalbos naudoja nuspėjamą sintaksę. Kompiuteriai yra gerai nuspėjami, todėl tokia koncepcija lintera. Jei per 40 gyvavimo metų jis jus aplenkė ir vis dar nenaudojate YAML linterio, laikas išbandyti yamllint.

Įdiekite yamllint Galite naudoti standartinę Linux paketų tvarkyklę. Pavyzdžiui, į „Red Hat Enterprise Linux“ 8 arba Minkšta fetrinė skrybėlė tai daroma taip:

$ sudo dnf install yamllint

Tada tiesiog paleiskite yamllint, perduodami jam YAML failą, kad patikrintumėte. Štai kaip atrodo, jei failą su klaida perduodate linteriui:

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

Skaičiai kairėje yra ne laikas, o klaidos koordinatės: eilutės ir stulpelio numeris. Klaidos aprašymas gali nieko nesakyti, bet jūs tiksliai žinote, kur ji yra. Tiesiog pažiūrėkite į šią kodo vietą ir greičiausiai viskas paaiškės.

Kai yamllint faile neranda klaidų, ekrane nieko nespausdinama. Jei tokia tyla jus gąsdina ir norite šiek tiek daugiau atsiliepimų, galite paleisti linterį naudodami sąlyginę echo komandą naudodami dvigubą ampersandą (&&), pavyzdžiui:

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

POSIX sistemoje dvigubas ampersandas suveikia tada ir tik tada, kai ankstesnė komanda grąžina 0. O yamllint tiesiog grąžina rastų klaidų skaičių, todėl visa ši sąlyginė konstrukcija veikia.

2. Rašykite Python, o ne YAML

Jei YAML tikrai jus erzina, tiesiog nerašykite. Taip atsitinka, kad YAML yra vienintelis formatas, kurį programa supranta. Tačiau net ir šiuo atveju nebūtina kurti YAML failo. Parašykite, kas jums patinka, tada konvertuokite. Pavyzdžiui, yra puiki Python biblioteka pyyaml ir du konvertavimo būdai: savaiminis konvertavimas ir konvertavimas naudojant scenarijus.

Atsivertimas į save

Šiuo atveju duomenų failas taip pat yra Python scenarijus, generuojantis YAML. Šis metodas geriausiai tinka mažiems duomenų rinkiniams. Jūs tiesiog įrašote JSON duomenis į Python kintamąjį, įvedate į jį importavimo direktyvą ir failo pabaigoje pridedate tris eilutes, kad įgyvendintumėte išvestį.

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

Dabar paleidžiame šį failą Python ir gauname failą 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

Tai visiškai tinka YAML, bet yamllint įspės, kad jis neprasideda -. Na, tai gali būti lengvai ištaisyta rankiniu būdu arba šiek tiek pakeista Python scenarijuje.

Konvertavimas naudojant scenarijus

Tokiu atveju pirmiausia rašome JSON, o tada paleidžiame keitiklį kaip atskirą Python scenarijų, kuris sukuria YAML kaip išvestį. Palyginti su ankstesniu metodu, šis metodas yra geresnis, nes konvertavimas yra atskirtas nuo duomenų.

Pirmiausia sukurkime JSON failą example.json, pavyzdžiui, galite jį paimti iš 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"
			}
		  }
		}
	  }
	}

Tada sukursime paprastą konverterio scenarijų ir išsaugosime jį pavadinimu json2yaml.py. Šis scenarijus importuoja ir YAML, ir JSON Python modulius ir įkelia vartotojo nurodytą JSON failą, atlieka konvertavimą ir įrašo duomenis į output.yaml failą.

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

Išsaugokite šį scenarijų sistemos kelyje ir paleiskite jį pagal poreikį:

$ ~/bin/json2yaml.py example.json

3. Analizuokite daug ir dažnai

Kartais naudinga į problemą pažvelgti kitu kampu. Jei kyla problemų pateikiant ryšius tarp duomenų YAML, galite laikinai pakeisti juos į ką nors labiau pažįstamą.

Pavyzdžiui, jei jums patogu dirbti su žodynų sąrašais arba JSON, galite konvertuoti YAML į JSON naudodami tik dvi komandas interaktyviame Python apvalkale. Tarkime, kad turite YAML failą mydata.yaml, tada jis atrodytų taip:

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

Šioje temoje galite rasti daug kitų pavyzdžių. Be to, yra daug internetinių keitiklių ir vietinių analizatorių. Taigi nedvejodami performatuokite duomenis, kai juose matote tik nesuprantamą maišatį.

4. Perskaitykite specifikacijas

Grįžtant į YAML po ilgos pertraukos, pravartu apsilankyti yaml.org ir dar kartą perskaitykite specifikacijas (specifikacijas). Jei turite sunkumų su YAML, bet nesilaikėte specifikacijų, laikas ištaisyti šią situaciją. Specifikacijas stebėtinai lengva parašyti, o sintaksės reikalavimai iliustruojami daugybe pavyzdžių 6 skyrius.

5. Pseudo konfigūracijos

Rašant knygą ar straipsnį, visada pravartu iš pradžių nubrėžti preliminarius kontūrus, bent jau turinio lentelės pavidalu. Tas pats yra su YAML. Greičiausiai turite idėją, kokius duomenis reikia įrašyti į YAML failą, bet nelabai suprantate, kaip juos sujungti vienas su kitu. Todėl prieš formuodami YAML nubrėžkite pseudokonfigūraciją.

Pseudokonfigūracija yra panaši į pseudo kodą, kai jums nereikia jaudintis dėl struktūros ar įtraukos, tėvų ir vaikų santykių, paveldėjimo ir įdėjimo. Čia tas pats: braižote duomenų iteracijas, kai jie atsiranda jūsų galvoje.

10 žingsnių iki YAML Zen

Pseudokonfigūracijos programuotojai (Martin ir Tabitha) ir jų įgūdžiai (programavimo kalbos: atitinkamai Python, Perl, Pascal ir Lisp, Fortran, Erlang).

Nubraižę pseudokonfigūraciją ant popieriaus lapo, atidžiai ją išanalizuokite ir, jei viskas tvarkoje, suformatuokite į galiojantį YAML failą.

6. Skirtukų ir tarpų dilema

Turėsite išspręsti dilemą "skirtukai ar tarpai?". Ne globalia prasme, o tik savo organizacijos ar bent projekto lygmeniu. Nesvarbu, ar tai susiję su tolesniu apdorojimu naudojant sed scenarijų, teksto redaktorių nustatymą programuotojų įrenginiuose ar visuotinį kvitų, patvirtinančių griežtą linterio nurodymų laikymąsi, gavimą, gresia atleidimas, bet visi jūsų komandos nariai, kurie vienaip ar kitaip susiję su YAML turi naudoti tik tarpus (kaip reikalaujama pagal YAML specifikaciją).

Bet kuriame įprastame teksto rengyklėje galite sukonfigūruoti automatinio koregavimo skirtukus iki nurodyto skaičiaus tarpų, kad būtų išvengta pagrindinių šalininkų maišto. Kortelė tau nereikia bijoti.

Kiekvienas YAML nekentėjas puikiai žino, ekrane nematote skirtumo tarp skirtukų ir tarpų. O kai ko nors nesimato, dažniausiai tai atsimena paskutinis dalykas, kai sutvarko, patikrino ir pašalina visas kitas galimas problemas. Valanda laiko, praleisto ieškant lentelės kreivės ar tarpų bloko, tiesiog rėkia, kad reikia skubiai sukurti vieno ar kito naudojimo politiką, o tada atlikti gelžbetoninį patikrinimą, ar jos laikomasi (pavyzdžiui, per Git kablys, norint priversti jį per prievartą).

7. Mažiau yra daugiau (arba daugiau yra mažiau)

Kai kurie žmonės mėgsta rašyti YAML, nes tai pabrėžia struktūrą. Tuo pačiu metu jie aktyviai naudoja įtrauką, kad paryškintų duomenų blokus. Tai apgaulė, kuria siekiama imituoti žymėjimo kalbas, kuriose naudojami aiškūs skyrikliai.

Štai tokios struktūros pavyzdys iš Galimi dokumentai:

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

Vieniems ši parinktis padeda susitvarkyti YAML struktūrą galvoje, kitus, priešingai, erzina daugybe, jų nuomone, nereikalingų įtraukų.

Bet jei esate YAML dokumento savininkas ir esate atsakingas už jo priežiūrą, tada tu ir tik tu turi apibrėžti, kaip naudoti įtrauką. Jei jus erzina didelis kamšalas, pagal YAML specifikaciją sumažinkite jo kiekį iki minimumo. Pavyzdžiui, aukščiau esantis failas iš Ansible dokumentacijos gali būti perrašytas taip be jokių nuostolių:

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

8. Naudokite ruošinius

Jei pildydami YAML failą nuolat kartojate tas pačias klaidas, prasminga į jį įterpti šabloną kaip komentarą. Tada kitą kartą galėsite tiesiog nukopijuoti šį šabloną ir įvesti tikrus duomenis, pavyzdžiui:

---
# - <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. Naudokite ką nors kitokio

Jei programa neapsaugo jūsų, gali būti verta pakeisti YAML į kitą formatą. Laikui bėgant, konfigūracijos failai gali išaugti patys ir tada geriau juos konvertuoti į paprastus scenarijus Lua arba Python.

YAML yra puikus dalykas, kurį daugelis mėgsta dėl savo minimalizmo ir paprastumo, tačiau tai toli gražu ne vienintelis įrankis jūsų arsenale. Taigi kartais galite to atsisakyti. Nagrinėjimo bibliotekas nesunku rasti YAML, taigi, jei pasiūlysite paprastas perkėlimo parinktis, jūsų vartotojai išgyvens šią nesėkmę gana neskausmingai.

Jei negalite išsiversti be YAML, pasinaudokite šiais 10 patarimų ir kartą ir visiems laikams įveik savo nemėgimą YAML!

Šaltinis: www.habr.com

Добавить комментарий