10 etap nan YAML Zen

Nou tout renmen Ansible, men Ansible se YAML. Gen anpil fòma pou fichye konfigirasyon: lis valè, pè paramèt-valè, fichye INI, YAML, JSON, XML ak anpil lòt. Sepandan, pou plizyè rezon nan tout nan yo, YAML souvan konsidere kòm patikilyèman difisil. An patikilye, malgre minimalist entérésan li yo ak kapasite enpresyonan pou travay ak valè yerarchize, sentaks YAML a ka anmèdan ak apwòch Python li yo nan endentasyon.

10 etap nan YAML Zen

Si YAML fache ou, ou kapab—e ou ta dwe! – Pran 10 etap sa yo pou redwi fristrasyon ou nan yon nivo akseptab epi tonbe damou ak YAML. Jan sa apwopriye pou lis sa a, dis konsèy nou yo pral konte apati de grafouyen, nou pral ajoute meditasyon ak pratik espirityèl nan volonte 😉

0. Fè editè ou travay

Li pa enpòtan ki editè tèks ou genyen, pwobableman gen omwen yon plugin pou travay ak YAML. Si ou pa gen youn, jwenn epi enstale li imedyatman. Tan ki pase pou chèche ak mete kanpe ap peye anpil fwa sou chak fwa ou oblije modifye YAML.

Pou egzanp, editè Atom sipòte YAML pa default, men pou GNU Emacs ou pral oblije enstale pakè adisyonèl, pou egzanp, yaml-mòd.

10 etap nan YAML Zen

Emacs nan mòd YAML ak ekspozisyon espas.

Si editè pi renmen ou a pa gen yon mòd YAML, Lè sa a, kèk nan pwoblèm yo ka rezoud pa travay ak anviwònman yo. Pou egzanp, estanda editè tèks GNOME Gedit la pa gen yon mòd YAML, men pa default li mete aksan sou sentaks YAML epi li pèmèt ou konfigirasyon travay ak endentasyon:

10 etap nan YAML Zen

Mete endentasyon nan Gedit.

Yon plugin drawspaces pou Gedit, montre espas yo kòm pwen, elimine anbigwite ak nivo endentasyon.

Nan lòt mo, pase tan aprann sou editè pi renmen ou. Chèche konnen kisa li oswa kominote devlopman li gen pou l ofri pou travay ak YAML, epi sèvi ak karakteristik sa yo. Ou definitivman pa pral regrèt li.

1. Sèvi ak yon linter

Idealman, langaj pwogramasyon ak langaj maketing itilize sentaks previzib. Òdinatè yo bon nan previzibilite, ki se poukisa konsèp nan lintera. Si nan 40 ane yo nan egzistans li te pase ou epi ou toujou pa sèvi ak yon linter YAML, Lè sa a, li lè yo eseye yamllint.

Enstale yamllint Ou ka itilize manadjè pakè Linux estanda. Pou egzanp, nan Red Hat Enterprise Linux NAN oswa Feutr li fè tankou sa a:

$ sudo dnf install yamllint

Lè sa a, ou tou senpleman kouri yamllint, pase li dosye a YAML yo tcheke. Men sa li sanble si ou pase yon dosye ki gen yon erè nan linter la:

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

Nimewo yo sou bò gòch la se pa tan an, men kowòdone yo nan erè a: nimewo ranje ak kolòn. Deskripsyon erè a ka pa di ou anyen, men ou konnen egzakteman ki kote li ye. Jis gade kote sa a nan kòd la, epi gen plis chans tout bagay pral vin klè.

Lè yamllint pa jwenn okenn erè nan yon dosye, pa gen anyen ki enprime sou ekran an. Si silans sa yo fè ou pè epi ou vle yon ti kras plis fidbak, Lè sa a, ou ka kouri linter la ak kòmandman eko kondisyonèl la atravè yon doub ampersand (&&), tankou sa a:

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

Nan POSIX, yon doub ampersand dife si epi sèlman si kòmandman anvan an retounen 0. Ak yamllint jis retounen kantite erè yo jwenn, ki se poukisa tout konstriksyon kondisyonèl sa a ap travay.

2. Ekri nan Python, pa YAML

Si YAML vrèman fè w fache, jis pa ekri ladan l, literalman. Sa rive ke YAML se fòma a sèlman ke aplikasyon an konprann. Men, menm nan ka sa a, li pa nesesè yo kreye yon dosye YAML. Ekri sou sa ou renmen epi konvèti. Pou egzanp, gen yon bibliyotèk gwo pou Python pyyaml ak de metòd konvèsyon: pwòp tèt ou-konvèsyon ak konvèsyon atravè scripts.

Oto-konvèsyon

Nan ka sa a, dosye done a se tou yon script Python ki jenere YAML. Metòd sa a pi byen adapte pou ti seri done. Ou senpleman ekri done JSON yo nan yon varyab Python, prefas li ak yon direktiv enpòte, epi nan fen fichye a ajoute twa liy pou aplike pwodiksyon an.

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

Koulye a, nou kouri dosye sa a nan Python epi jwenn dosye a 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

Sa a se parfe valab YAML, men yamllint pral avèti ou ke li pa kòmanse ak -. Oke, sa a ka fasil korije manyèlman oswa yon ti kras modifye nan script la Python.

Konvèsyon atravè scripts

Nan ka sa a, nou premye ekri nan JSON, ak Lè sa a, kouri konvètisè a kòm yon script Python separe, ki pwodui YAML kòm pwodiksyon. Konpare ak metòd anvan an, metòd sa a balanse pi byen, depi konvèsyon an separe de done yo.

Premyèman, se pou yo kreye yon dosye JSON example.json, pou egzanp, ou ka pran li nan 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"
			}
		  }
		}
	  }
	}

Lè sa a, nou pral kreye yon script konvètisè senp epi sove li anba non json2yaml.py. Script sa a enpòte tou de modil YAML ak JSON Python, epi chaje yon fichye JSON itilizatè a espesifye, fè konvèsyon an, epi ekri done yo nan fichye output.yaml la.

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

Sove script sa a nan chemen sistèm lan epi kouri li jan sa nesesè:

$ ~/bin/json2yaml.py example.json

3. Analyse anpil e souvan

Pafwa li itil pou gade yon pwoblèm nan yon ang diferan. Si w gen pwoblèm pou reprezante relasyon ki genyen ant done ou yo nan YAML, ou ka tanporèman transfòme li nan yon bagay ki pi abitye.

Pou egzanp, si w konfòtab travay ak lis diksyonè oswa JSON, ou ka konvèti YAML an JSON ak jis de kòmandman nan koki Python entèaktif la. Ann di ou gen yon fichye YAML mydata.yaml, Lè sa a, men sa li ta sanble:

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

Ou ka jwenn anpil lòt egzanp sou sijè sa a. Anplis de sa, gen anpil konvètisè sou entènèt ak analizeur lokal ki disponib. Se konsa, pa ezite reformate done yo lè ou wè sèlman yon melanj enkonpreyansib nan li.

4. Li espesifikasyon yo

Retounen nan YAML apre yon ti repo, li itil pou vizite yaml.org epi re-li espesifikasyon yo (specs). Si ou gen difikilte ak YAML, men ou pa rive nan spesifikasyon an, Lè sa a, li lè yo korije sitiyasyon sa a. Espesifikasyon yo se etonan fasil pou ekri, epi egzijans sentaks yo ilistre ak yon gwo kantite egzanp nan Chapit 6.

5. Pseudo-configs

Lè w ap ekri yon liv oswa yon atik, li toujou itil pou premye trase yon deskripsyon preliminè, omwen nan fòm yon tablo de matyè. Se menm jan ak YAML. Gen plis chans, ou gen yon lide sou ki done yo dwe ekri nan yon dosye YAML, men ou pa reyèlman konprann ki jan yo konekte li youn ak lòt. Se poutèt sa, anvan skultur YAML, trase yon pseudo-config.

Pseudo-config se menm jan ak pseudo-kod, kote ou pa bezwen enkyete sou estrikti oswa endentasyon, relasyon paran-pitit, eritaj ak nidifikasyon. Se menm bagay la tou isit la: ou trase iterasyon nan done yo jan yo leve nan tèt ou.

10 etap nan YAML Zen

Pseudo-config pwogramasyon lis (Martin ak Tabitha) ak konpetans yo (langaj pwogramasyon: Python, Perl, Pascal ak Lisp, Fortran, Erlang, respektivman).

Apre trase yon pseudo-config sou yon moso papye, ak anpil atansyon analize li epi, si tout bagay an lòd, fòma li nan fòm lan nan yon dosye YAML ki valab.

6. Dilèm Onglets yo vs Espas yo

Ou pral oblije rezoud dilèm la "onglè oswa espas?". Pa nan yon sans global, men sèlman nan nivo òganizasyon w, oswa omwen yon pwojè. Li pa enpòtan si post-traitement ak yon script sed yo itilize, mete editè tèks sou machin pwogramè yo, oswa inivèsèl pran resi nan konfòmite strik ak enstriksyon linter la anba menas ranvwa, men tout manm nan ekip ou a ki nan yon sèl. fason oswa yon lòt ki gen rapò ak YAML dwe itilize sèlman espas (jan espesifikasyon YAML egzije sa).

Nan nenpòt editè tèks nòmal, ou ka configured onglet oto-kòrèk nan yon kantite espas espesifik, kidonk rebelyon aderan kle yo. Tab ou pa bezwen pè.

Kòm chak rayi YAML konnen byen, ou pa ka wè diferans ki genyen ant onglè ak espas sou ekran an. Men, lè yon bagay pa vizib, se nòmalman dènye bagay moun sonje, apre yo fin regle, tcheke ak elimine tout lòt pwoblèm posib. Yon èdtan tan pase pou chèche yon koub tabilasyon oswa yon blòk espas tou senpleman rele ke ou bezwen ijan pou kreye yon politik pou itilize youn oswa lòt, epi answit aplike yon chèk konkrè ranfòse pou konfòmite avèk li (pa egzanp, atravè yon zen Git pou fòse li nan yon linter).

7. Mwens se plis (oswa plis se mwens)

Gen kèk moun ki renmen ekri nan YAML paske li mete aksan sou estrikti. An menm tan an, yo aktivman itilize indentation pou mete aksan sou blòk done yo. Sa a se yon kalite tronpe pou imite langaj maketing ki itilize delimiter eksplisit.

Isit la se yon egzanp estrikti sa yo soti nan Ansible dokiman:

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

Pou kèk moun, opsyon sa a ede yo regle estrikti YAML nan tèt yo; pou lòt moun, okontrè, li irite yo ak anpil ti kras ki pa nesesè, nan opinyon yo.

Men, si ou se pwopriyetè dokiman YAML la epi ou responsab pou kenbe li, lè sa a ou menm ak ou sèlman dwe defini kijan pou itilize endentasyon. Si ou anbete pa gwo padding, kenbe li nan minimòm posib dapre spesifikasyon YAML la. Pou egzanp, dosye ki anwo a ki soti nan dokiman Ansible a ka reekri tankou sa a san okenn pèt:

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

8. Sèvi ak espas vid yo

Si ou toujou ap repete menm erè yo lè w ranpli yon dosye YAML, li fè sans pou mete yon modèl nan li kòm yon kòmantè. Lè sa a, pwochen fwa ou ka senpleman kopye modèl sa a epi antre done reyèl la, pou egzanp:

---
# - <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. Sèvi ak yon bagay diferan

Si aplikasyon an pa gen yon trangle sou ou, Lè sa a, li ta ka vo chanje YAML a nan yon fòma diferan. Apre yon tan, fichye konfigirasyon yo ka depase tèt yo ak Lè sa a, li pi bon konvèti yo nan scripts senp nan Lua oswa Python.

YAML se yon gwo bagay ke anpil moun renmen pou minimalist li yo ak senplisite, men li se lwen sèlman zouti nan asenal ou. Se konsa, pafwa ou ka refize li. Bibliyotèk analiz yo fasil pou jwenn pou YAML, kidonk si ou ofri opsyon migrasyon fasil, itilizatè ou yo pral siviv echèk sa a relativman san doulè.

Si ou pa ka fè san YAML, Lè sa a, pran 10 konsèy sa yo epi simonte pa renmen YAML yon fwa pou tout!

Sous: www.habr.com

Add nouvo kòmantè