10 nga mga lakang sa YAML Zen

Kitang tanan nahigugma sa Ansible, apan ang Ansible kay YAML. Adunay daghang mga format alang sa mga file sa pag-configure: mga lista sa mga kantidad, mga pares nga kantidad sa parameter, mga file sa INI, YAML, JSON, XML ug daghan pa. Bisan pa, alang sa daghang mga hinungdan sa tanan niini, ang YAML kanunay giisip nga labi ka lisud. Sa partikular, bisan pa sa makapalagsik nga minimalism ug makapahingangha nga mga kapabilidad sa pagtrabaho uban ang hierarchical values, ang YAML syntax mahimong makalagot sa iyang Python-like nga pamaagi sa indentation.

10 nga mga lakang sa YAML Zen

Kung ang YAML makapasuko kanimo, mahimo nimo-ug kinahanglan nimo! – buhata ang mosunud nga 10 nga mga lakang aron makunhuran ang imong kapakyasan sa usa ka madawat nga lebel ug mahigugma sa YAML. Ingon nga angay niini nga lista, ang among napulo ka mga tip maihap gikan sa wala, among idugang ang pagpamalandong ug espirituhanong mga buhat sa gusto 😉

0. Himua ang imong editor nga molihok

Dili igsapayan kung unsa ang imong editor sa teksto, tingali adunay labing menos usa ka plugin alang sa pagtrabaho kauban ang YAML. Kung wala kay usa, pangitaa ug i-install kini dayon. Ang oras nga gigugol sa pagpangita ug pag-set up magbayad sa daghang mga higayon sa matag higayon nga kinahanglan nimo nga i-edit ang YAML.

Pananglitan, editor atomo nagsuporta sa YAML sa default, apan alang sa GNU Emacs kinahanglan nimo nga i-install ang dugang nga mga pakete, pananglitan, yaml-mode.

10 nga mga lakang sa YAML Zen

Emacs sa YAML mode ug nagpakita sa mga luna.

Kung ang imong paborito nga editor wala’y YAML mode, nan ang pipila sa mga problema mahimong masulbad pinaagi sa pagtrabaho sa mga setting. Pananglitan, ang standard GNOME text editor nga Gedit walay YAML mode, apan sa default kini nagpasiugda sa YAML syntax ug nagtugot kanimo sa pag-configure sa trabaho nga adunay mga indentasyon:

10 nga mga lakang sa YAML Zen

Pagbutang sa mga indent sa Gedit.

Usa ka plugin mga drawspace alang sa Gedit, nagpakita sa mga luna isip mga tuldok, nga nagwagtang sa mga ambiguity nga adunay mga lebel sa indentation.

Sa laing pagkasulti, paggahin og panahon sa pagkat-on mahitungod sa imong paborito nga editor. Hibal-i kung unsa ang gitanyag niya o sa iyang komunidad sa pagpalambo alang sa pagtrabaho kauban ang YAML, ug gamita ang mga bahin. Seguradong dili ka magmahay.

1. Gamit ug linter

Sa tinuud, ang mga programming language ug markup nga mga pinulongan naggamit sa matag-an nga syntax. Ang mga kompyuter maayo sa predictability, mao nga ang konsepto sa lintera. Kung sa 40 ka tuig nga paglungtad niini milabay na kini kanimo ug wala ka gihapon mogamit usa ka YAML linter, nan panahon na nga sulayan ang yamllint.

Pag-instalar yamllint Mahimo nimong gamiton ang standard Linux package manager. Pananglitan, sa Red Hat Enterprise Linux 8 o Fedora kini gibuhat sama niini:

$ sudo dnf install yamllint

Unya nagpadagan ka lang sa yamllint, gipasa kini sa YAML file aron susihon. Kini ang hitsura kung imong gipasa ang usa ka file nga adunay sayup sa linter:

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

Ang mga numero sa wala dili ang oras, apan ang mga koordinasyon sa sayup: numero sa linya ug kolum. Ang paghulagway sa sayup mahimong dili isulti kanimo bisan unsa, apan nahibal-an nimo kung diin kini. Tan-awa lang kini nga lugar sa code, ug lagmit ang tanan mahimong klaro.

Kung wala’y nakit-an nga mga sayup ang yamllint sa usa ka file, wala’y giimprinta sa screen. Kung ang ingon nga kahilom makahadlok kanimo ug gusto nimo ang usa ka gamay nga feedback, nan mahimo nimong ipadagan ang linter gamit ang conditional echo command pinaagi sa doble nga ampersand (&&), sama niini:

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

Sa POSIX, ang usa ka doble nga ampersand nagdilaab kung ug kung ang nag-una nga mando mobalik 0. Ug ang yamllint nagbalik lang sa gidaghanon sa mga sayup nga nakit-an, mao nga kini nga tibuuk nga kondisyon nga pagtukod molihok.

2. Isulat sa Python, dili YAML

Kung ang YAML makapasuko kanimo, ayaw lang pagsulat niini, sa literal. Nahitabo nga ang YAML mao ra ang format nga nasabtan sa aplikasyon. Apan bisan sa kini nga kaso, dili kinahanglan nga maghimo usa ka YAML file. Isulat ang imong gusto ug dayon i-convert. Pananglitan, adunay usa ka maayo nga librarya alang sa Python pyyaml ug duha ka paagi sa pagkakabig: pagkakabig sa kaugalingon ug pagkakabig pinaagi sa mga script.

Pagkakabig sa kaugalingon

Sa kini nga kaso, ang data file usa usab ka script sa Python nga nagpatunghag YAML. Kini nga pamaagi labing angay alang sa gagmay nga mga set sa datos. Isulat ra nimo ang data sa JSON sa usa ka variable sa Python, pasiuna kini sa usa ka direktiba sa pag-import, ug sa katapusan sa file pagdugang tulo ka linya aron ipatuman ang output.

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

Karon among gipadagan kini nga file sa Python ug makuha ang output.yaml file:

$ 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

Kini hingpit nga balido nga YAML, apan ang yamllint magpasidaan kanimo nga dili kini magsugod sa -. Aw, kini dali nga matul-id sa mano-mano o gamay nga pagbag-o sa script sa Python.

Pagkakabig pinaagi sa mga script

Sa kini nga kaso, una namong isulat sa JSON, ug dayon ipadagan ang converter isip usa ka bulag nga script sa Python, nga nagpatunghag YAML isip output. Kung itandi sa miaging pamaagi, kini nga pamaagi mas maayo nga timbangan, tungod kay ang pagkakabig lahi sa datos.

Una, maghimo kita og JSON file example.json, pananglitan, mahimo nimo kini kuhaon 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"
			}
		  }
		}
	  }
	}

Dayon maghimo kami og usa ka yano nga converter script ug i-save kini ubos sa ngalan nga json2yaml.py. Kini nga script nag-import sa duha ka YAML ug JSON Python modules, ug nag-load sa usa ka user-specified JSON file, nagpahigayon sa conversion, ug misulat sa data ngadto sa output.yaml file.

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

I-save kini nga script sa agianan sa sistema ug padagana kini kung gikinahanglan:

$ ~/bin/json2yaml.py example.json

3. Pag-parse og daghan ug kanunay

Usahay mapuslanon ang pagtan-aw sa usa ka problema gikan sa lainlaing anggulo. Kung naproblema ka sa pagrepresentar sa mga relasyon tali sa imong data sa YAML, mahimo nimo kining temporaryo nga usbon ngadto sa mas pamilyar.

Pananglitan, kung komportable ka nga magtrabaho sa mga lista sa diksyonaryo o JSON, mahimo nimong i-convert ang YAML ngadto sa JSON nga adunay duha lang ka mga sugo sa interactive nga Python shell. Ingnon ta nga naa kay YAML file mydata.yaml, unya mao ni ang hitsura niini:

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

Makita nimo ang daghang uban pang mga pananglitan bahin niini nga hilisgutan. Dugang pa, adunay daghang mga online converter ug lokal nga parser nga magamit. Busa ayaw pagpanuko sa pag-reformat sa datos kung makakita ka lang og dili masabtan nga pagkahugno niini.

4. Basaha ang mga detalye

Pagbalik sa YAML pagkahuman sa taas nga pahulay, mapuslanon ang pagbisita yaml.org ug basaha pag-usab ang mga detalye (specs). Kung adunay ka mga kalisud sa YAML, apan wala pa makaabut sa detalye, nan panahon na aron matul-id kini nga sitwasyon. Ang mga espesipiko sayon ​​​​nga isulat, ug ang mga kinahanglanon sa syntax gihulagway nga adunay daghang mga pananglitan sa Kapitulo 6.

5. Pseudo-configs

Kung nagsulat usa ka libro o artikulo, kanunay nga mapuslanon ang una nga pag-sketch sa usa ka pasiuna nga outline, labing menos sa porma sa usa ka talaan sa mga sulud. Parehas ra sa YAML. Lagmit, aduna kay ideya kon unsa nga datos ang kinahanglang isulat ngadto sa YAML file, apan dili nimo masabtan kon unsaon kini pagkonektar sa usag usa. Busa, sa dili pa mag-sculpting sa YAML, pagdrowing og pseudo-config.

Ang pseudo-config susama sa pseudo-code, diin dili ka kinahanglan mabalaka bahin sa istruktura o indentation, relasyon sa ginikanan-anak, kabilin ug pagpuga. Parehas kini dinhi: nagdibuho ka nga mga pag-uli sa datos samtang kini mitungha sa imong ulo.

10 nga mga lakang sa YAML Zen

Pseudo-config list programmers (Martin ug Tabitha) ug ang ilang mga kahanas (programming language: Python, Perl, Pascal ug Lisp, Fortran, Erlang, matag usa).

Human sa pagdrowing og pseudo-config sa usa ka piraso nga papel, pag-analisar pag-ayo ug, kung ang tanan naa sa kahusay, i-format kini sa porma sa usa ka balido nga YAML file.

6. Ang Tabs vs. Spaces Dilemma

Kinahanglan nimong sulbaron ang dilemma "mga tab o mga espasyo?". Dili sa usa ka global nga diwa, apan sa lebel lamang sa imong organisasyon, o labing menos usa ka proyekto. Dili igsapayan kung kini naglakip sa paggamit sa post-processing nga adunay sed script, pag-set up sa mga editor sa text sa mga makina sa mga programmer, o sa tibuok kalibutan nga pagkuha sa mga resibo sa higpit nga pagsunod sa mga instruksyon sa linter ubos sa hulga sa pagtangtang, apan ang tanan nga mga miyembro sa imong team kinsa sa usa ka paagi o lain nga may kalabutan sa YAML kinahanglan nga mogamit lamang sa mga luna (sumala sa gikinahanglan sa YAML specification).

Sa bisan unsang normal nga editor sa teksto, mahimo nimong i-configure ang mga tab nga auto-correct sa usa ka piho nga gidaghanon sa mga wanang, mao nga ang pagrebelde sa mga yawe nga nagsunod. Tab dili ka angay mahadlok.

Ingon nga nahibal-an pag-ayo sa matag nagdumot sa YAML, dili nimo makita ang kalainan tali sa mga tab ug mga espasyo sa screen. Ug kung dili makita ang usa ka butang, kasagaran kini ang katapusan nga butang nga mahinumduman sa mga tawo, pagkahuman nga ilang nahan-ay, gisusi ug giwagtang ang tanan nga posible nga mga problema. Usa ka oras nga oras nga gigugol sa pagpangita alang sa usa ka kurba sa tabulasyon o usa ka bloke sa mga wanang nagsinggit nga kinahanglan nimo dayon nga maghimo usa ka palisiya alang sa paggamit sa usa o sa lain, ug dayon ipatuman ang usa ka gipalig-on nga konkreto nga pagsusi alang sa pagsunod niini (pananglitan, pinaagi sa usa ka Git hook aron pugson kini pinaagi sa usa ka linter).

7. Dili kaayo mas daghan (o mas daghan ang dili kaayo)

Ang ubang mga tawo ganahan nga magsulat sa YAML tungod kay kini nagpasiugda sa istruktura. Sa samang higayon, sila aktibong naggamit sa indentation aron i-highlight ang mga bloke sa datos. Kini usa ka matang sa pangilad aron masundog ang mga markup nga mga pinulongan nga naggamit ug klaro nga mga delimiter.

Ania ang usa ka pananglitan sa ingon nga istruktura gikan sa Mahimong dokumentasyon:

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

Alang sa pipila, kini nga kapilian makatabang kanila sa paghan-ay sa istruktura sa YAML sa ilang mga ulo; alang sa uban, sa kasukwahi, kini makapasuko kanila sa daghang wala kinahanglana, sa ilang opinyon, mga indent.

Apan kung ikaw ang tag-iya sa dokumento sa YAML ug responsable sa pagpadayon niini, nan ikaw ug ikaw ra kinahanglan ipasabut kung giunsa paggamit ang indentation. Kung nasuko ka sa dako nga padding, ipadayon kini sa labing gamay nga posible sumala sa detalye sa YAML. Pananglitan, ang labaw nga file gikan sa Ansible nga dokumentasyon mahimong isulat pag-usab sama niini nga walay pagkawala:

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

8. Gamita ang mga blangko

Kung kanunay nimo nga gisubli ang parehas nga mga sayup sa pagpuno sa usa ka file sa YAML, makatarunganon nga magsulud usa ka template niini ingon usa ka komento. Unya sa sunod mahimo nimong kopyahon kini nga template ug isulod ang tinuod nga datos didto, pananglitan:

---
# - <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. Gamit ug lain

Kung ang aplikasyon wala’y stranglehold kanimo, nan mahimo’g angay nga usbon ang YAML sa usa ka lahi nga format. Sa paglabay sa panahon, ang mga file sa pag-configure mahimong modako sa ilang kaugalingon ug unya mas maayo nga i-convert kini sa yano nga mga script sa Lua o Python.

Ang YAML usa ka maayo nga butang nga gihigugma sa daghang mga tawo tungod sa minimalism ug kayano niini, apan kini layo sa bugtong himan sa imong arsenal. Busa usahay makabalibad ka niini. Ang pag-parse sa mga librarya sayon ​​​​nga pangitaon alang sa YAML, busa kung nagtanyag ka og sayon ​​​​nga mga kapilian sa paglalin, ang imong mga tiggamit makalahutay niini nga kapakyasan nga medyo walay sakit.

Kung dili nimo mahimo kung wala ang YAML, unya kuhaa kini nga mga tip sa 10 ug buntoga ang imong dili gusto sa YAML sa makausa ug alang sa tanan!

Source: www.habr.com

Idugang sa usa ka comment