10 soļi līdz YAML Zen

Mums visiem patÄ«k Ansible, bet Ansible ir YAML. Konfigurācijas failiem ir daudz formātu: vērtÄ«bu saraksti, parametru-vērtÄ«bu pāri, INI faili, YAML, JSON, XML un daudzi citi. Tomēr vairāku iemeslu dēļ YAML bieži tiek uzskatÄ«ts par Ä«paÅ”i sarežģītu. Jo Ä«paÅ”i, neskatoties uz tās atsvaidzinoÅ”o minimālismu un iespaidÄ«gajām iespējām strādāt ar hierarhiskām vērtÄ«bām, YAML sintakse var bÅ«t kaitinoÅ”a ar tās Python lÄ«dzÄ«go pieeju atkāpei.

10 soļi līdz YAML Zen

Ja YAML jÅ«s sadusmo, jÅ«s varat ā€” un jums vajadzētu! - Veiciet tālāk norādÄ«tās 10 darbÄ«bas, lai samazinātu savu neapmierinātÄ«bu lÄ«dz pieņemamam lÄ«menim un iemÄ«lētu YAML. Kā jau Å”im sarakstam pienākas, mÅ«su desmit padomi tiks numurēti no nulles, pēc vēlÄ“Å”anās pievienosim meditāciju un garÄ«gās prakses šŸ˜‰

0. Padariet savu redaktoru darbu

Nav svarÄ«gi, kāds teksta redaktors jums ir, iespējams, ir vismaz viens spraudnis darbam ar YAML. Ja jums tāda nav, nekavējoties atrodiet un instalējiet to. MeklÄ“Å”anai un iestatÄ«Å”anai pavadÄ«tais laiks atmaksāsies daudzkārt ikreiz, kad bÅ«s jārediģē YAML.

Piemēram, redaktors Atoms atbalsta YAML pēc noklusējuma, bet GNU Emacs jums būs jāinstalē papildu pakotnes, piemēram, yaml režīms.

10 soļi līdz YAML Zen

Emacs YAML režīmā un parāda atstarpes.

Ja jūsu iecienītākajam redaktoram nav YAML režīma, dažas problēmas var atrisināt, strādājot ar iestatījumiem. Piemēram, standarta GNOME teksta redaktoram Gedit nav YAML režīma, bet pēc noklusējuma tas izceļ YAML sintaksi un ļauj konfigurēt darbu ar atkāpēm:

10 soļi līdz YAML Zen

Atkāpju iestatīŔana Geditā.

Spraudnis atstarpes Gedit parāda atstarpes kā punktus, novērÅ”ot neskaidrÄ«bas ar atkāpes lÄ«meņiem.

Citiem vārdiem sakot, veltiet laiku, lai uzzinātu par savu iecienÄ«tāko redaktoru. Uzziniet, ko viņŔ vai viņa izstrādātāju kopiena var piedāvāt darbam ar YAML, un izmantojiet Ŕīs funkcijas. JÅ«s noteikti to nenožēlosiet.

1. Izmantojiet linteri

Ideālā gadÄ«jumā programmÄ“Å”anas valodas un iezÄ«mÄ“Å”anas valodas izmanto paredzamu sintaksi. Datoriem ir laba paredzamÄ«ba, tāpēc tiek izmantots jēdziens lintera. Ja 40 pastāvÄ“Å”anas gados tas jums ir pagājis garām un jÅ«s joprojām neizmantojat YAML linteri, tad ir pienācis laiks izmēģināt yamllint.

Instalēt yamllint Varat izmantot standarta Linux pakotņu pārvaldnieku. Piemēram, iekŔā Red Hat Enterprise Linux 8 vai Fedora tas tiek darÄ«ts Ŕādi:

$ sudo dnf install yamllint

Pēc tam vienkārÅ”i palaidiet yamllint, nododot tam YAML failu, lai pārbaudÄ«tu. Šādi izskatās, ja nododat failu ar kļūdu linteram:

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

Kreisajā pusē esoÅ”ie skaitļi ir nevis laiks, bet kļūdas koordinātas: rindas un kolonnas numurs. Kļūdas apraksts var jums neko nepateikt, taču jÅ«s precÄ«zi zināt, kur tā atrodas. Paskatieties uz Å”o vietu kodā, un visticamāk viss kļūs skaidrs.

Ja yamllint failā neatrod kļūdas, ekrānā nekas netiek izdrukāts. Ja Ŕāds klusums jÅ«s biedē un vēlaties saņemt vairāk atsauksmju, varat palaist linteru ar nosacÄ«jumu atbalss komandu, izmantojot dubulto &&, piemēram:

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

Sistēmā POSIX dubultā un tikai tad, ja iepriekŔējā komanda atgriež 0. Un yamllint tikai atgriež atrasto kļūdu skaitu, tāpēc visa Ŕī nosacÄ«juma konstrukcija darbojas.

2. Rakstiet Python, nevis YAML

Ja YAML jÅ«s patieŔām kaitina, vienkārÅ”i nerakstiet tajā burtiski. Gadās, ka YAML ir vienÄ«gais formāts, ko lietojumprogramma saprot. Bet pat Å”ajā gadÄ«jumā nav nepiecieÅ”ams izveidot YAML failu. Uzrakstiet to, kas jums patÄ«k, un pēc tam konvertējiet. Piemēram, Python ir lieliska bibliotēka pyyaml un divas konvertÄ“Å”anas metodes: paÅ”pārveidoÅ”ana un konvertÄ“Å”ana, izmantojot skriptus.

PaÅ”pārvērÅ”anās

Å ajā gadÄ«jumā datu fails ir arÄ« Python skripts, kas Ä£enerē YAML. Å Ä« metode ir vislabāk piemērota mazām datu kopām. JÅ«s vienkārÅ”i ierakstiet JSON datus Python mainÄ«gajā, ievadiet to ar importÄ“Å”anas direktÄ«vu un faila beigās pievienojiet trÄ«s rindiņas, lai ieviestu izvadi.

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

Tagad mēs palaižam Å”o failu programmā Python un iegÅ«stam failu 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

Tas ir pilnīgi derīgs YAML, taču yamllint brīdinās, ka tas nesākas ar -. To var viegli labot manuāli vai nedaudz mainīt Python skriptā.

KonvertēŔana, izmantojot skriptus

Å ajā gadÄ«jumā mēs vispirms rakstām JSON un pēc tam palaižam pārveidotāju kā atseviŔķu Python skriptu, kas kā izvadi rada YAML. SalÄ«dzinot ar iepriekŔējo metodi, Ŕī metode mērogojas labāk, jo konvertÄ“Å”ana notiek atseviŔķi no datiem.

Vispirms izveidosim JSON failu example.json, piemēram, varat to ņemt no 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"
			}
		  }
		}
	  }
	}

Pēc tam mēs izveidosim vienkārÅ”u pārveidotāja skriptu un saglabāsim to ar nosaukumu json2yaml.py. Å is skripts importē gan YAML, gan JSON Python moduļus un ielādē lietotāja norādÄ«tu JSON failu, veic konvertÄ“Å”anu un ieraksta datus failā 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()

Saglabājiet Å”o skriptu sistēmas ceļā un palaidiet to pēc vajadzÄ«bas:

$ ~/bin/json2yaml.py example.json

3. Parsējiet daudz un bieži

Dažreiz ir lietderīgi paskatīties uz problēmu no cita leņķa. Ja jums ir problēmas attēlot attiecības starp jūsu datiem YAML, varat īslaicīgi pārveidot tos par kaut ko pazīstamāku.

Piemēram, ja jums patÄ«k strādāt ar vārdnÄ«cu sarakstiem vai JSON, varat konvertēt YAML par JSON, izmantojot tikai divas komandas interaktÄ«vajā Python čaulā. Pieņemsim, ka jums ir YAML fails mydata.yaml, tad tas izskatās Ŕādi:

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

JÅ«s varat atrast daudzus citus piemērus par Å”o tēmu. Turklāt ir pieejami daudzi tieÅ”saistes pārveidotāji un vietējie parsētāji. Tāpēc nevilcinieties pārformatēt datus, kad redzat tikai nesaprotamu jucekli.

4. Izlasiet specifikācijas

Atgriežoties YAML pēc ilgāka pārtraukuma, ir lietderÄ«gi apmeklēt yaml.org un vēlreiz izlasiet specifikācijas (specifikācijas). Ja jums ir problēmas ar YAML, bet neesat izpildÄ«jis specifikāciju, ir pienācis laiks Å”o situāciju labot. Specifikācijas ir pārsteidzoÅ”i viegli uzrakstāmas, un sintakses prasÄ«bas ir ilustrētas ar lielu skaitu piemēru 6. nodaļa.

5. Pseidokonfigurācijas

Rakstot grāmatu vai rakstu, vienmēr ir lietderÄ«gi vispirms ieskicēt iepriekŔēju izklāstu, vismaz satura rādÄ«tāja veidā. Tas pats ir ar YAML. Visticamāk, jums ir priekÅ”stats par to, kādi dati ir jāieraksta YAML failā, taču jÅ«s Ä«sti nesaprotat, kā tos savienot savā starpā. Tāpēc pirms YAML veidoÅ”anas uzzÄ«mējiet pseidokonfigurāciju.

Pseidokonfigurācija ir lÄ«dzÄ«ga pseidokodam, kur jums nav jāuztraucas par struktÅ«ru vai atkāpi, vecāku un bērnu attiecÄ«bām, mantoÅ”anu un ligzdoÅ”anu. Å eit ir tas pats: jÅ«s zÄ«mējat datu iterācijas, kad tie rodas jÅ«su galvā.

10 soļi līdz YAML Zen

Pseido-konfigurāciju uzskaites programmētāji (Martin un Tabitha) un viņu prasmes (programmÄ“Å”anas valodas: attiecÄ«gi Python, Perl, Pascal un Lisp, Fortran, Erlang).

Pēc pseidokonfigurācijas uzzÄ«mÄ“Å”anas uz papÄ«ra rÅ«pÄ«gi analizējiet to un, ja viss ir kārtÄ«bā, formatējiet to derÄ«ga YAML faila formā.

6. Cilņu un atstarpu dilemma

Jums bÅ«s jāatrisina dilemma ā€œcilnes vai atstarpes?ā€. Nevis globālā izpratnē, bet tikai savas organizācijas vai vismaz projekta lÄ«menÄ«. Nav svarÄ«gi, vai tas ietver pēcapstrādi ar sed skriptu, teksta redaktoru iestatÄ«Å”anu programmētāju iekārtās vai vispārēju kvÄ«Å”u saņemÅ”anu par stingru lintera norādÄ«jumu ievēroÅ”anu, draudot atlaiÅ”anai, bet visiem jÅ«su komandas locekļiem, kuri vienā vai otrā veidā saistÄ«bā ar YAML ir jāizmanto tikai atstarpes (kā to prasa YAML specifikācija).

Jebkurā parastā teksta redaktorā jÅ«s varat konfigurēt automātiskās laboÅ”anas ciļņus noteiktam atstarpju skaitam, tādējādi novērÅ”ot galveno piekritēju sacelÅ”anos. Tab tev nav jābaidās.

Kā katrs YAML nÄ«dējs labi zina, jÅ«s nevarat redzēt atŔķirÄ«bu starp cilnēm un atstarpēm ekrānā. Un, kad kaut kas nav redzams, tas parasti ir pēdējais, ko cilvēki atceras pēc tam, kad viņi ir sakārtojuÅ”i, pārbaudÄ«juÅ”i un novērsuÅ”i visas citas iespējamās problēmas. Stunda laika, kas pavadÄ«ts, meklējot tabulas lÄ«kni vai atstarpju bloku, vienkārÅ”i kliedz, ka steidzami jāizveido politika viena vai otra izmantoÅ”anai un pēc tam jāveic dzelzsbetona atbilstÄ«bas pārbaude (piemēram, caur a Git āķis, lai ar spēku izspiestu to caur lÄ«nijmalu).

7. Mazāk ir vairāk (vai vairāk ir mazāk)

Dažiem cilvēkiem patÄ«k rakstÄ«t YAML, jo tas uzsver struktÅ«ru. Tajā paŔā laikā viņi aktÄ«vi izmanto atkāpi, lai izceltu datu blokus. Å Ä« ir sava veida krāpniecÄ«ba, lai atdarinātu iezÄ«mÄ“Å”anas valodas, kurās tiek izmantoti skaidri norobežotāji.

Å eit ir Ŕādas struktÅ«ras piemērs no Iespējama dokumentācija:

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

Dažiem Ŕī iespēja palÄ«dz sakārtot YAML struktÅ«ru savā galvā, citus, gluži pretēji, tas kaitina ar daudziem, viņuprāt, nevajadzÄ«giem ievilkumiem.

Bet, ja esat YAML dokumenta Ä«paÅ”nieks un esat atbildÄ«gs par tā uzturÄ“Å”anu, tad tu un tikai tu jādefinē, kā izmantot atkāpi. Ja jÅ«s kaitina lielais polsterējums, samaziniet to lÄ«dz minimumam saskaņā ar YAML specifikāciju. Piemēram, iepriekÅ” minēto failu no Ansible dokumentācijas bez zaudējumiem var pārrakstÄ«t Ŕādi:

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

8. Izmantojiet sagataves

Ja, aizpildot YAML failu, pastāvÄ«gi atkārtojat tās paÅ”as kļūdas, ir lietderÄ«gi tajā ievietot veidni kā komentāru. Nākamreiz varat vienkārÅ”i nokopēt Å”o veidni un ievadÄ«t tur reālus datus, piemēram:

---
# - <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. Izmantojiet kaut ko citu

Ja lietojumprogramma jums nav bloķēta, iespējams, ir vērts mainÄ«t YAML uz citu formātu. Laika gaitā konfigurācijas faili var pāraugt paÅ”i par sevi, un tad labāk tos pārvērst vienkārÅ”os skriptos programmā Lua vai Python.

YAML ir lieliska lieta, kas daudziem patÄ«k tās minimālisma un vienkārŔības dēļ, taču tā nebÅ«t nav vienÄ«gais rÄ«ks jÅ«su arsenālā. Tāpēc dažreiz jÅ«s varat to atteikties. ParsÄ“Å”anas bibliotēkas YAML ir viegli atrast, tādēļ, ja piedāvāsit vienkārÅ”as migrācijas iespējas, lietotāji salÄ«dzinoÅ”i nesāpÄ«gi pārdzÄ«vos Å”o kļūmi.

Ja nevarat iztikt bez YAML, izmantojiet Å”os 10 padomus un uz visiem laikiem pārvarējiet savu nepatiku pret YAML!

Avots: www.habr.com

Pievieno komentāru