10 sammu YAML Zenini

Meile kõigile meeldib Ansible, kuid Ansible on YAML. Konfiguratsioonifailide vorminguid on palju: väärtuste loendid, parameetri-väärtuste paarid, INI-failid, YAML, JSON, XML ja paljud teised. Kuid mitmel põhjusel peetakse YAMLi sageli eriti keeruliseks. Hoolimata värskendavast minimalismist ja muljetavaldavatest hierarhiliste väärtustega töötamise võimalustest võib YAML-i süntaks olla tüütu oma Pythoni-laadse lähenemisega taandele.

10 sammu YAML Zenini

Kui YAML teid vihastab, saate seda teha ja peaksite seda tegema! – tehke järgmised 10 sammu, et vähendada oma frustratsiooni vastuvõetava tasemeni ja armuda YAMLi. Nagu sellele nimekirjale kohane, nummerdatakse meie kümme näpunäidet nullist, lisame meelepäraselt meditatsiooni ja vaimseid praktikaid 😉

0. Pange oma toimetaja tööle

Pole tähtis, milline tekstiredaktor teil on, tõenäoliselt on YAML-iga töötamiseks vähemalt üks pistikprogramm. Kui teil seda pole, otsige see üles ja installige see kohe. Otsimisele ja seadistamisele kulunud aeg tasub end kordades ära iga kord, kui peate YAMLi redigeerima.

Näiteks toimetaja aatom toetab vaikimisi YAML-i, kuid GNU Emacsi jaoks peate installima lisapakette, näiteks yaml-režiim.

10 sammu YAML Zenini

Emacs YAML-režiimis ja tühikute kuvamine.

Kui teie lemmikredaktoril pole YAML-režiimi, saab mõnda probleemi lahendada seadetega töötades. Näiteks standardsel GNOME-i tekstiredaktoril Gedit ei ole YAML-i režiimi, kuid vaikimisi tõstab see esile YAML-i süntaksi ja võimaldab seadistada tööd taandega:

10 sammu YAML Zenini

Taandite määramine Geditis.

Pistikprogramm tõmberuumid Gediti puhul kuvab tühikud punktidena, kõrvaldades taandetasemete ebaselgused.

Teisisõnu kulutage aega oma lemmiktoimetaja tundmaõppimiseks. Uurige, mida tal või tema arenduskogukonnal on YAML-iga töötamiseks pakkuda, ja kasutage neid funktsioone. Te ei kahetse seda kindlasti.

1. Kasutage linterit

Ideaalis kasutavad programmeerimiskeeled ja märgistuskeeled prognoositavat süntaksit. Arvutid on hästi ennustatavad, mistõttu on kontseptsioon lintera. Kui 40 eksisteerimisaasta jooksul on see teist mööda läinud ja te ikka veel YAML linterit ei kasuta, siis on aeg proovida yamllinti.

Installi yamllint Võite kasutada tavalist Linuxi paketihaldurit. Näiteks sisse Red Hat Enterprise Linux 8 või Fedora seda tehakse nii:

$ sudo dnf install yamllint

Seejärel käivitage lihtsalt yamllint, edastades selle kontrollimiseks YAML-faili. See näeb välja selline, kui edastate linterile veaga faili:

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

Vasakpoolsed numbrid ei ole kellaaeg, vaid vea koordinaadid: rea ja veeru number. Vea kirjeldus ei pruugi teile midagi öelda, kuid teate täpselt, kus see on. Lihtsalt vaadake seda kohta koodis ja tõenäoliselt saab kõik selgeks.

Kui yamllint failis vigu ei leia, ei prindita ekraanile midagi. Kui selline vaikus teid hirmutab ja soovite veidi rohkem tagasisidet, saate linteri käivitada tingimusliku kaja käsuga topelt-A (&&) abil, näiteks järgmiselt:

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

POSIXis käivitub topelt-A siis ja ainult siis, kui eelnev käsk tagastab 0. Ja yamllint tagastab lihtsalt leitud vigade arvu, mistõttu kogu see tingimuslik konstruktsioon töötab.

2. Kirjutage Pythonis, mitte YAML-is

Kui YAML teid tõesti vihastab, siis ärge kirjutage sellesse sõna otseses mõttes. Juhtub, et YAML on ainus vorming, mida rakendus mõistab. Kuid isegi sel juhul pole YAML-faili vaja luua. Kirjutage sellele, mis teile meeldib, ja seejärel teisendage. Näiteks on Pythoni jaoks suurepärane raamatukogu pyyaml ja kaks teisendusmeetodit: isekonverteerimine ja teisendamine skriptide kaudu.

Enesemuutmine

Sellisel juhul on andmefailiks ka Pythoni skript, mis genereerib YAML-i. See meetod sobib kõige paremini väikeste andmekogumite jaoks. Kirjutate lihtsalt JSON-andmed Pythoni muutujasse, sisestate selle eeskätt impordidirektiivi ja lisate faili lõppu kolm rida väljundi rakendamiseks.

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

Nüüd käivitame selle faili Pythonis ja saame faili 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

See on täiesti kehtiv YAML, kuid yamllint hoiatab teid, et see ei alga tähega -. Noh, seda saab hõlpsasti käsitsi parandada või Pythoni skriptis pisut muuta.

Teisendamine skriptide kaudu

Sel juhul kirjutame esmalt JSON-is ja seejärel käivitame konverteri eraldi Pythoni skriptina, mis toodab väljundina YAML-i. Võrreldes eelmise meetodiga, skaleerib see meetod paremini, kuna teisendamine toimub andmetest eraldi.

Kõigepealt loome näiteks JSON-faili example.json, millest saate selle võtta 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"
			}
		  }
		}
	  }
	}

Seejärel loome lihtsa konverteriskripti ja salvestame selle nimega json2yaml.py. See skript impordib nii YAML kui ka JSON Pythoni moodulid ning laadib kasutaja määratud JSON-faili, teostab teisenduse ja kirjutab andmed faili 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()

Salvestage see skript süsteemiteele ja käivitage see vastavalt vajadusele:

$ ~/bin/json2yaml.py example.json

3. Parsi palju ja sageli

Mõnikord on kasulik vaadata probleemi teise nurga alt. Kui teil on probleeme andmete vaheliste suhete esitamisega YAML-is, saate need ajutiselt muuta millekski tuttavamaks.

Näiteks kui teile sobib sõnastikuloendite või JSON-iga töötamine, saate YAML-i JSON-iks teisendada vaid kahe käsuga interaktiivses Pythoni kestas. Oletame, et teil on YAML-fail mydata.yaml, siis näeb see välja järgmine:

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

Sellel teemal leiate palju muid näiteid. Lisaks on saadaval palju võrgumuundureid ja kohalikke parsereid. Nii et ärge kartke andmeid ümber vormindada, kui näete nendes vaid arusaamatut segadust.

4. Lugege tehnilisi andmeid

Pärast pikka pausi YAMLi naastes on kasulik külastada yaml.org ja lugege uuesti spetsifikatsioonid (spetsifikatsioonid). Kui teil on YAML-iga raskusi, kuid te pole spetsifikatsiooniga hakkama saanud, on aeg see olukord parandada. Tehnilisi andmeid on üllatavalt lihtne kirjutada ja süntaksinõudeid illustreeritakse suure hulga näidetega 6. peatükk.

5. Pseudokonfiguratsioonid

Raamatut või artiklit kirjutades on alati kasulik esmalt visandada esialgne konspekt, vähemalt sisukorra kujul. Sama on YAML-iga. Tõenäoliselt on teil ettekujutus sellest, millised andmed tuleb YAML-faili kirjutada, kuid te ei saa tegelikult aru, kuidas neid omavahel ühendada. Seetõttu joonistage enne YAMLi kujundamist pseudokonfiguratsioon.

Pseudokonfiguratsioon sarnaneb pseudokoodiga, kus te ei pea muretsema struktuuri ega taande, vanema-lapse suhete, pärimise ja pesastumise pärast. Siin on sama: joonistate andmete iteratsiooni nii, nagu need teie peas tekivad.

10 sammu YAML Zenini

Pseudokonfiguratsioonide loendis programmeerijad (Martin ja Tabitha) ja nende oskused (programmeerimiskeeled vastavalt Python, Perl, Pascal ja Lisp, Fortran, Erlang).

Pärast pseudokonfiguratsiooni paberile joonistamist analüüsige seda hoolikalt ja kui kõik on korras, vormindage see kehtiva YAML-failina.

6. Tabs vs. spaces dilemma

Peate dilemma lahendama "tabs või tühikud?". Mitte globaalses mõttes, vaid ainult oma organisatsiooni või vähemalt projekti tasandil. Pole tähtis, kas see hõlmab sed-skriptiga järeltöötlust, tekstiredaktorite seadistamist programmeerijate masinatel või üldist kviitungite võtmist linteri juhiste range järgimise kohta vallandamise ähvardusel, vaid kõik teie meeskonnaliikmed, kes ühel või teisel viisil YAML-iga seotud peavad kasutama ainult tühikuid (nagu nõuab YAML-i spetsifikatsioon).

Igas tavalises tekstiredaktoris saate automaatse parandamise tabeldusmärke seadistada teatud arvule tühikutele, nii et peamised järgijad mässavad Tab sa ei pea kartma.

Nagu iga YAMLi vihkaja teab, ei näe te ekraanil vahekaartide ja tühikute vahel vahet. Ja kui midagi pole näha, on see tavaliselt viimane asi, mida inimesed mäletavad pärast seda, kui nad on kõik muud võimalikud probleemid läbi sorteerinud, kontrollinud ja kõrvaldanud. Tund aega, mis kulub tabelikõvera või tühikute ploki otsimisele, karjub lihtsalt, et peate kiiresti looma ühe või teise kasutamise poliitika ja seejärel rakendama raudbetoonist selle järgimise kontrolli (näiteks Giti konks, et suruda see läbi linteri).

7. Vähem on rohkem (või rohkem on vähem)

Mõnele inimesele meeldib kirjutada YAML-is, kuna see rõhutab struktuuri. Samal ajal kasutavad nad andmeplokkide esiletõstmiseks aktiivselt taanet. See on omamoodi pettus, mille eesmärk on jäljendada selgesõnalisi eraldajaid kasutavaid märgistuskeeli.

Siin on näide sellisest struktuurist Võimalik dokumentatsioon:

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

Mõne jaoks aitab see valik YAML-i struktuuri oma peas selgeks teha, teisi, vastupidi, ärritab see palju nende arvates tarbetuid taane.

Aga kui olete YAML-dokumendi omanik ja vastutate selle hooldamise eest, siis sina ja ainult sina peab määratlema taande kasutamise. Kui teid häirib suur polster, hoidke seda vastavalt YAML-i spetsifikatsioonidele võimalikult vähe. Näiteks ülaltoodud faili Ansible dokumentatsioonist saab ilma kadudeta ümber kirjutada järgmiselt:

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

8. Kasutage tühikuid

Kui kordate YAML-faili täites pidevalt samu vigu, on mõttekas lisada sellesse mall kommentaarina. Järgmisel korral saate selle malli lihtsalt kopeerida ja sisestada sinna reaalsed andmed, näiteks:

---
# - <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. Kasuta midagi muud

Kui rakendusel pole kägistust, tasub YAML-i vormingusse muuta. Aja jooksul võivad konfiguratsioonifailid endast välja kasvada ja siis on parem need Lua või Pythoni lihtsateks skriptideks teisendada.

YAML on suurepärane asi, mida paljud armastavad oma minimalismi ja lihtsuse pärast, kuid see pole kaugeltki ainus tööriist teie arsenalis. Nii et mõnikord võite sellest keelduda. Parsimise teeke on YAML-i jaoks lihtne leida, nii et kui pakute lihtsaid migreerimisvalikuid, elavad teie kasutajad selle tõrke suhteliselt valutult üle.

Kui te ei saa ilma YAMLita hakkama, kasutage neid 10 näpunäidet ja saage lõplikult üle oma vastumeelsus YAMLi vastu!

Allikas: www.habr.com

Lisa kommentaar