10 stappen nei YAML Zen

Wy hâlde allegear fan Ansible, mar Ansible is YAML. D'r binne in protte formaten foar konfiguraasjebestannen: weardelisten, parameter-wearde-pearen, INI-bestannen, YAML, JSON, XML en in protte oaren. Om ferskate redenen fan allegear wurdt YAML lykwols faaks as bysûnder lestich beskôge. Benammen, nettsjinsteande syn ferrassende minimalisme en yndrukwekkende mooglikheden om te wurkjen mei hierargyske wearden, kin de YAML-syntaksis ferfelend wêze mei syn Python-like oanpak foar ynspringen.

10 stappen nei YAML Zen

As YAML jo pisje, kinne jo - en jo moatte! - nim de folgjende 10 stappen om jo frustraasje te ferminderjen nei in akseptabel nivo en fereale wurde op YAML. Lykas it past by dizze list, sille ús tsien tips fanôf nul wurde nûmere, wy sille meditaasje en spirituele praktiken tafoegje nei wille 😉

0. Meitsje jo bewurker wurk

It makket net út hokker tekstbewurker jo hawwe, d'r is wierskynlik op syn minst ien plugin foar wurkjen mei YAML. As jo ​​​​gjin ien hawwe, fine en ynstallearje it fuortendaliks. De tiid bestege oan it sykjen en ynstellen sil in protte kearen betelje elke kear as jo YAML moatte bewurkje.

Bygelyks, bewurker Atoom stipet YAML standert, mar foar GNU Emacs moatte jo ekstra pakketten ynstallearje, bygelyks, yaml-modus.

10 stappen nei YAML Zen

Emacs yn YAML-modus en spaasjes werjaan.

As jo ​​favorite bewurker gjin YAML-modus hat, dan kinne guon fan 'e problemen wurde oplost troch te wurkjen mei de ynstellingen. Bygelyks, de standert GNOME-tekstbewurker Gedit hat gjin YAML-modus, mar standert markearret it YAML-syntaksis en lit jo wurk mei ynspringen konfigurearje:

10 stappen nei YAML Zen

Ynspringen yn Gedit ynstelle.

In plugin drawspaces foar Gedit, toant spaasjes as stippen, en elimineert dûbelsinnigens mei ynspringnivo's.

Mei oare wurden, besteegje tiid oan learen oer jo favorite bewurker. Fyn út wat hy of syn ûntwikkelingsmienskip te bieden hat foar wurkjen mei YAML, en brûk dy funksjes. Jo sille der perfoarst gjin spyt fan hawwe.

1. Brûk in linter

Ideal brûke programmeartalen en markearringtalen foarsisbere syntaksis. Kompjûters binne goed op foarsisberens, dat is wêrom it konsept fan lintera. As it yn 'e 40 jier fan har bestean jo foarby is en jo noch gjin YAML linter brûke, dan is it tiid om yamllint te besykjen.

Ynstallearje yamllint Jo kinne de standert Linux-pakketbehearder brûke. Bygelyks, yn Red Hat Enterprise Linux 8 of Fedora it is sa dien:

$ sudo dnf install yamllint

Dan rinne jo gewoan yamllint, trochjaan it YAML-bestân om te kontrolearjen. Dit is hoe it derút sjocht as jo in bestân mei in flater trochjaan oan de linter:

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

De nûmers oan de linkerkant binne net de tiid, mar de koördinaten fan de flater: rige en kolom nûmer. De beskriuwing fan 'e flater kin jo neat fertelle, mar jo witte krekt wêr't it is. Sjoch gewoan nei dit plak yn 'e koade, en nei alle gedachten sil alles dúdlik wurde.

As yamllint gjin flaters fynt yn in bestân, wurdt neat op it skerm printe. As sa'n stilte jo bang makket en jo wolle wat mear feedback, dan kinne jo de linter útfiere mei it betingste echo kommando fia in dûbele ampersand (&&), sa:

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

Yn POSIX, in dûbele ampersand fjoer as en allinnich as it foargeande kommando jout werom 0. En yamllint krekt jout it oantal flaters fûn, dat is wêrom dit hiele betingst konstruksje wurket.

2. Skriuw yn Python, net YAML

As YAML jo echt pisje, skriuw der gewoan net yn, letterlik. It bart dat YAML it ienige formaat is dat de applikaasje begrypt. Mar sels yn dit gefal is it net nedich om in YAML-bestân te meitsjen. Skriuw op wat jo leuk fine en dan konvertearje. Bygelyks, d'r is in geweldige bibleteek foar Python pyyaml en twa bekearingsmetoaden: selskonverzje en bekearing fia skripts.

Self-konverzje

Yn dit gefal is it gegevensbestân ek in Python-skript dat YAML genereart. Dizze metoade is it bêste geskikt foar lytse datasets. Jo skriuwe de JSON-gegevens gewoan yn in Python-fariabele, preface it mei in ymportrjochtline, en oan 'e ein fan' e triem foegje trije rigels ta om de útfier út te fieren.

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

No rinne wy ​​dizze triem yn Python en krije de output.yaml-bestân:

$ 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

Dit is perfekt jildich YAML, mar yamllint sil warskôgje jo dat it net begjint mei -. No, dit kin maklik mei de hân korrizjearre wurde of wat oanpast wurde yn it Python-skript.

Konverzje fia skripts

Yn dit gefal, wy earst skriuwe yn JSON, en dan rinne de converter as in apart Python skript, dat produsearret YAML as útfier. Yn ferliking mei de foarige metoade, skaal dizze metoade better, om't de konverzje apart is fan 'e gegevens.

Lit ús earst in JSON-bestân example.json oanmeitsje, bygelyks kinne jo it nimme 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"
			}
		  }
		}
	  }
	}

Dan meitsje wy in ienfâldich converter skript en bewarje it ûnder de namme json2yaml.py. Dit skript ymportearret sawol YAML en JSON Python modules, en laden in brûker oantsjutte JSON triem, fiert de konverzje, en skriuwt de gegevens oan de output.yaml triem.

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

Bewarje dit skript yn it systeempaad en útfiere it as nedich:

$ ~/bin/json2yaml.py example.json

3. Parse in protte en faak

Soms is it handich om in probleem út in oare hoeke te sjen. As jo ​​​​problemen hawwe mei it fertsjintwurdigjen fan de relaasjes tusken jo gegevens yn YAML, kinne jo it tydlik transformearje yn wat bekender.

As jo ​​​​bygelyks noflik binne om te wurkjen mei wurdboeklisten of JSON, kinne jo YAML konvertearje nei JSON mei mar twa kommando's yn 'e ynteraktive Python-shell. Litte wy sizze dat jo in YAML-bestân mydata.yaml hawwe, dan soe it der sa útsjen:

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

Jo kinne in protte oare foarbylden fine oer dit ûnderwerp. Derneist binne d'r in protte online converters en lokale parsers beskikber. Wifkje dus net om de gegevens opnij te formatteren as jo allinich in ûnbegryplik gemienskip deryn sjogge.

4. Lês de specs

Werom nei YAML nei in lange pauze, it is nuttich om te besykjen yaml.org en lês de spesifikaasjes (spesifikaasjes) opnij. As jo ​​swierrichheden hawwe mei YAML, mar binne net om 'e spesifikaasje kommen, dan is it tiid om dizze situaasje te korrigearjen. De specs binne ferrassend maklik te skriuwen, en de syntaksiseasken wurde yllustrearre mei in grut oantal foarbylden yn Haadstik 6.

5. Pseudo-konfiguraasjes

By it skriuwen fan in boek of artikel is it altyd nuttich om earst in foarriedige skets út te sketsen, alteast yn de foarm fan in ynhâldsopjefte. It is itselde mei YAML. Meast wierskynlik hawwe jo in idee fan hokker gegevens moatte wurde skreaun yn in YAML-bestân, mar jo begripe net echt hoe't jo it mei elkoar kinne ferbine. Dêrom, foar it byldhouwen fan YAML, tekenje in pseudo-konfiguraasje.

Pseudo-config is gelyk oan pseudo-koade, wêr't jo gjin soargen hoege te meitsjen oer struktuer of ynspringing, âlder-bern relaasjes, erfskip en nêst. It is hjir itselde: jo tekenje iteraasjes fan 'e gegevens sa't se yn jo holle ûntsteane.

10 stappen nei YAML Zen

Pseudo-config listing programmeurs (Martin en Tabitha) en harren feardichheden (programmearring talen: Python, Perl, Pascal en Lisp, Fortran, Erlang, respektivelik).

Nei it tekenjen fan in pseudo-konfiguraasje op in stikje papier, analysearje it foarsichtich en, as alles yn oarder is, opmaak it yn 'e foarm fan in jildich YAML-bestân.

6. De ljeppers vs Spaces Dilemma

Jo moatte it dilemma oplosse "ljeppers of spaasjes?". Net yn globale betsjutting, mar allinich op it nivo fan jo organisaasje, of op syn minst in projekt. It makket net út oft it giet om it brûken fan postferwurking mei in sed-skript, it opsetten fan tekstbewurkers op masines fan programmeurs, of it universele nimme fan ûntfangsten fan strikte neilibjen fan de ynstruksjes fan 'e linter ûnder bedriging fan ûntslach, mar alle leden fan jo team dy't yn ien of oare manier relatearje oan YAML moat allinich spaasjes brûke (lykas fereaske troch de YAML-spesifikaasje).

Yn elke normale tekstbewurker kinne jo auto-korrekte ljepblêden ynstelle foar in spesifisearre oantal spaasjes, sadat de reboelje fan wichtige oanhingers Tab do moatst net bang wêze.

Lykas elke YAML-hater goed wit, kinne jo it ferskil net sjen tusken ljeppers en spaasjes op it skerm. En as der wat net sichtber is, is it meastentiids it lêste wat minsken ûnthâlde, neidat se alle oare mooglike problemen hawwe sorteare, kontrolearre en elimineare. In oere tiid bestege oan it sykjen nei in tabulaasjekromme of in blok fan spaasjes ropt gewoan dat jo driuwend in belied meitsje moatte foar it brûken fan ien of oare, en dan in wapene betonkontrôle útfiere foar it neilibjen dêrfan (bgl. in Git-haak om it troch in linter te twingen).

7. Minder is mear (of mear is minder)

Guon minsken wolle graach yn YAML skriuwe, om't it struktuer beklammet. Tagelyk brûke se aktyf ynspringen om blokken fan gegevens te markearjen. Dit is in soarte fan scam om markuptalen te imitearjen dy't eksplisite skiedingstekens brûke.

Hjir is in foarbyld fan sa'n struktuer út Ansible dokumintaasje:

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

Foar guon helpt dizze opsje har de YAML-struktuer yn 'e holle te sortearjen; foar oaren, krekt oarsom, irritearret it har mei in protte ûnnedige, nei har miening, ynspringen.

Mar as jo de eigner binne fan it YAML-dokumint en ferantwurdlik binne foar it ûnderhâlden, dan do en allinne do moat definiearje hoe't jo ynspringing brûke. As jo ​​​​argere wurde troch grutte padding, hâld it dan op it minimum mooglik neffens de YAML-spesifikaasje. Bygelyks, it boppesteande bestân fan 'e Ansible-dokumintaasje kin sa oerskreaun wurde sûnder ferlies:

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

8. Brûk blanks

As jo ​​hieltyd werhelje deselde flaters by it ynfoljen fan in YAML-bestân, it makket sin om in sjabloan yn te foegjen as kommentaar. Dan kinne jo de folgjende kear dit sjabloan gewoan kopiearje en dêr echte gegevens ynfiere, bygelyks:

---
# - <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. Brûk wat oars

As de applikaasje gjin stranglehold op jo hat, dan kin it de muoite wurdich wêze om de YAML te feroarjen nei in oar formaat. Yn 'e rin fan' e tiid kinne konfiguraasjebestannen harsels útgroeie en dan is it better om se te konvertearjen yn ienfâldige skripts yn Lua of Python.

YAML is in geweldich ding dat in protte minsken leaf ha foar syn minimalisme en ienfâld, mar it is fier fan it ienige ark yn jo arsenal. Dus soms kinne jo it wegerje. Parsearbibleteken binne maklik te finen foar YAML, dus as jo maklike migraasjeopsjes oanbiede, sille jo brûkers dit mislearjen relatyf pynlik oerlibje.

As jo ​​​​net kinne sûnder YAML, nim dan dizze 10 tips en oerwin jo ôfkear fan YAML ienris en foar altyd!

Boarne: www.habr.com

Add a comment