10 kroků k YAML Zen

Všichni milujeme Ansible, ale Ansible je YAML. Existuje mnoho formátů pro konfigurační soubory: seznamy hodnot, páry parametr-hodnota, INI soubory, YAML, JSON, XML a mnoho dalších. Z několika důvodů, ze všech, je však YAML často považován za obzvláště obtížný. Zejména syntaxe YAML může i přes svůj osvěžující minimalismus a působivé možnosti práce s hierarchickými hodnotami otravovat svým přístupem k odsazení jako v Pythonu.

10 kroků k YAML Zen

Pokud vás YAML naštve, můžete – a měli byste! - udělejte dalších 10 kroků, abyste snížili své podráždění na přijatelnou úroveň a milovali YAML. Jak se na tento seznam sluší a patří, našich deset tipů bude očíslováno od nuly, podle přání přidáme meditaci a duchovní praktiky 😉

0. Nechte svůj editor fungovat

Nezáleží na tom, jaký textový editor máte, pravděpodobně pro něj existuje alespoň jeden YAML plugin. Pokud žádný nemáte, okamžitě jej najděte a nainstalujte. Čas, který strávíte hledáním a přizpůsobováním, se vám mnohonásobně vrátí pokaždé, když budete potřebovat upravit YAML.

Například editor Atom standardně podporuje YAML, ale pro GNU Emacs budete muset nainstalovat další balíčky, např. režim yaml.

10 kroků k YAML Zen

Emacs v režimu YAML a zobrazování mezer.

Pokud váš oblíbený editor nemá režim YAML, pak lze některé problémy vyřešit prací s nastavením. Například výchozí textový editor pro GNOME, Gedit, nemá režim YAML, ale ve výchozím nastavení zvýrazňuje syntaxi YAML a umožňuje vám přizpůsobit odsazení:

10 kroků k YAML Zen

Nastavení odsazení v Gedit.

Plugin čerpací prostory pro Gedit zobrazuje mezery jako tečky, čímž eliminuje nejednoznačnosti s úrovněmi odsazení.

Jinými slovy, věnujte čas tomu, abyste se naučili svůj oblíbený editor. Zjistěte, co může on nebo jeho vývojová komunita nabídnout pro práci s YAML, a využijte těchto příležitostí. Rozhodně nebudete litovat.

1. Použijte linter

V ideálním případě programovací jazyky a značkovací jazyky používají předvídatelnou syntaxi. Počítače jsou dobré v předvídatelnosti, což je důvod, proč koncept linter. Pokud vás za 40 let své existence minul a YAML linter stále nepoužíváte, pak je na čase yamllint vyzkoušet.

Chcete-li nainstalovat yamllint Můžete použít standardního správce balíčků Linuxu. Například v Red Hat Enterprise Linux 8 nebo Fedora dělá se to takto:

$ sudo dnf install yamllint

Poté jednoduše spustíte yamllint a předáte mu soubor YAML k testování. Takto to vypadá, když linteru předáte soubor s chybou:

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

Čísla vlevo nejsou čas, ale souřadnice chyby: číslo řádku a sloupce. Popis chyby vám možná nic neřekne, ale vy přesně víte, kde se nachází. Stačí se podívat na toto místo v kódu a s největší pravděpodobností bude vše jasné.

Když yamllint nenajde v souboru žádné chyby, nic se na obrazovku nevytiskne. Pokud vás takové ticho děsí a chcete trochu více zpětné vazby, můžete spustit linter s podmíněným příkazem echo přes dvojitý ampersand (&&), takto:

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

V POSIX se dvojitý ampersand spustí tehdy a pouze tehdy, když předchozí příkaz vrátí 0. A yamllint vrací pouze počet nalezených chyb, což je důvod, proč celá tato podmíněná konstrukce funguje.

2. Pište v Pythonu, ne v YAML

Pokud vás YAML opravdu štve, prostě do něj nepište, doslova. Stává se, že YAML je jediný formát, který aplikace akceptuje. V tomto případě však není nutné vytvářet soubor YAML. Pište na to, co se vám líbí, a pak převeďte. Existuje například skvělá knihovna pro Python pyyaml a dvě metody konverze: vlastní konverze a konverze pomocí skriptů.

Samopřeměna

V tomto případě je datovým souborem také skript Python, který generuje YAML. Tato metoda je nejlepší pro malé datové sady. Jednoduše zapíšete data JSON do proměnné Pythonu, předpíšete ji direktivou importu a na konec souboru přidáte tři řádky pro implementaci výstupu.

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

Nyní spustíme tento soubor v Pythonu a získáme soubor output.yaml jako výstup:

$ 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

Toto je dokonale platný YAML, ale yamllint vás upozorní, že nezačíná znakem -. To lze snadno opravit ručně nebo mírně upravit pomocí skriptu Python.

Konverze pomocí skriptů

V tomto případě nejprve zapíšeme v JSON a poté spustíme převodník jako samostatný skript Python, který jako výstup vytvoří YAML. Ve srovnání s předchozí metodou je tato metoda škálovatelná lépe, protože konverze je oddělená od dat.

Nejprve si vytvořte soubor JSON example.json, ze kterého si jej můžete vzít 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"
			}
		  }
		}
	  }
	}

Dále vytvoříme jednoduchý skript převodníku a uložíme jej jako json2yaml.py. Tento skript importuje moduly YAML i JSON Python, načte uživatelem zadaný soubor JSON, provede konverzi a zapíše data do souboru 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()

Uložte tento skript do systémové cesty a spusťte jej podle potřeby:

$ ~/bin/json2yaml.py example.json

3. Parsujte hodně a často

Někdy je užitečné podívat se na problém z jiného úhlu. Pokud máte potíže s reprezentací vztahů mezi vašimi daty v YAML, můžete je dočasně převést na něco známějšího.

Pokud vám například vyhovuje práce se seznamy slovníků nebo JSON, pak lze YAML převést na JSON pomocí pouhých dvou příkazů v interaktivním prostředí Pythonu. Řekněme, že máte soubor YAML mydata.yaml, pak by to vypadalo takto:

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

Existuje mnoho dalších příkladů na toto téma. Kromě toho je k dispozici mnoho online konvertorů a místních analyzátorů. Data tedy klidně přeformátujte, když v nich vidíte jen nesrozumitelný mišmaš.

4. Přečtěte si specifikace

Když se po dlouhé přestávce vracíme do YAML, je užitečné navštívit yaml.org a znovu si přečtěte specifikace (specifikace). Pokud máte potíže s YAML, ale nedostali jste se ke specifikaci, pak je čas tuto situaci napravit. Specifikace se překvapivě snadno píší a požadavky na syntaxi jsou ilustrovány velkým množstvím příkladů v Kapitola 6.

5. Pseudokonfigurace

Při psaní knihy nebo článku je vždy dobré si nejprve načrtnout předběžnou osnovu, alespoň v podobě obsahu. To samé s YAML. S největší pravděpodobností máte představu o tom, jaká data by měla být zapsána do souboru YAML, ale ve skutečnosti nerozumíte tomu, jak je vzájemně propojit. Proto před vyřezáváním YAML nakreslete pseudo-config.

Pseudoconfig je jako pseudokód, kde se nemusíte starat o strukturu nebo odsazení, vztahy rodič-dítě, dědičnost a vnořování. Tak je to tady: kreslíte iterace dat tak, jak se objevují ve vaší hlavě.

10 kroků k YAML Zen

Pseudoconfig seznam programátorů (Martin a Tabitha) a jejich dovednosti (programovací jazyky: Python, Perl, Pascal a Lisp, Fortran, Erlang, v tomto pořadí).

Po nakreslení pseudo-konfigurace na kus papíru ji pečlivě analyzujte, a pokud je vše v pořádku, naformátujte ji jako platný soubor YAML.

6. Dilema tabulátorů nebo mezer

Musíte vyřešit dilema "tabulátory nebo mezery?". Ne v globálním smyslu, ale pouze na úrovni vaší organizace nebo alespoň projektu. Nezáleží na tom, zda se jedná o následné zpracování pomocí sed skriptu, nastavení textových editorů na strojích programátorů nebo úplné odebírání účtenek za přísné dodržování pokynů linteru pod hrozbou propuštění, ale všichni členové vašeho týmu, kteří v tak či onak související s YAML musí používat pouze mezery (jak vyžaduje specifikace YAML).

V každém normálním textovém editoru si můžete nastavit automatické nahrazování tabulátorů pro daný počet mezer, takže vzpoura vyznavačů klíče Tab nemůžete se bát.

Jak každý hater YAML dobře ví, mezi kartami a mezerami na obrazovce není žádný rozdíl. A když něco není vidět, pamatuje se to zpravidla jako poslední, až se to vytřídí, zkontroluje a odstraní všechny ostatní možné problémy. Hodina času promarněného hledáním karty nebo bloku mezer jen křičí, že naléhavě potřebujete vytvořit politiku pro používání jednoho nebo druhého a poté implementovat železobetonovou kontrolu jejich souladu (například pomocí háčku Git vynutit běh přes linter).

7. Méně je lepší (nebo více je méně)

Někteří lidé rádi píší v YAML, protože klade důraz na strukturu. Zároveň aktivně využívají odsazení ke zvýraznění bloků dat. Je to druh podvodu, který napodobuje značkovací jazyky, které používají explicitní oddělovače.

Zde je příklad takové struktury z Přípustná dokumentace:

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

Někomu tato možnost pomáhá rozložit strukturu YAML v hlavě, jiného naopak otravuje spoustou zbytečných, dle jejich názoru, odsazení.

Ale pokud jste vlastníkem dokumentu YAML a jste odpovědní za jeho údržbu, pak ty a jen ty by měl určit, jak používat odsazení. Pokud vás obtěžuje velké odsazení, omezte jej na minimum možné podle specifikace YAML. Například výše uvedený soubor z dokumentace Ansible lze přepsat takto bez jakékoli ztráty:

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

8. Použijte polotovary

Pokud při vyplňování YAML souboru stále opakujete stejné chyby, má smysl do něj jako komentář vložit prázdnou šablonu. Příště pak můžete toto prázdné místo jednoduše zkopírovat a zadat tam skutečná data, například:

---
# - <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. Použijte něco jiného

Pokud na vás aplikace netlačí, může být vhodné změnit YAML na jiný formát. Konfigurační soubory mohou časem přerůst samy a pak je lepší je převést na jednoduché skripty Lua nebo Python.

YAML je skvělá věc, kterou mnoho lidí miluje pro její minimalismus a jednoduchost, ale není to zdaleka jediný nástroj ve vašem arzenálu. Někdy to tedy můžete odmítnout. Je snadné najít parsovací knihovny pro YAML, takže pokud nabídnete pohodlné možnosti migrace, vaši uživatelé takové odmítnutí přežijí relativně bezbolestně.

Pokud se bez YAML neobejdete, pak využijte těchto 10 tipů a porazte svou nechuť k YAML jednou provždy!

Zdroj: www.habr.com

Přidat komentář