10 mau ʻanuʻu i YAML Zen

Aloha mākou a pau iā Ansible, akā ʻo Ansible ʻo YAML. Nui nā ʻano no nā faila hoʻonohonoho: nā papa inoa o nā waiwai, nā pālua-waiwai, nā faila INI, YAML, JSON, XML a me nā mea ʻē aʻe he nui. Eia nō naʻe, no nā kumu he nui o lākou a pau, manaʻo pinepine ʻia ʻo YAML he paʻakikī. ʻOiai, ʻoiai ʻo kona minimalism hōʻoluʻolu a me nā mana hoihoi no ka hana ʻana me nā waiwai hierarchical, hiki i ka YAML syntax ke hoʻonāukiuki me kāna ʻano Python-like i ka indentation.

10 mau ʻanuʻu i YAML Zen

Inā huhū ʻo YAML iā ʻoe, hiki iā ʻoe - a pono ʻoe! - e hana i nā ʻanuʻu 10 aʻe e hōʻemi i kou huhū i kahi pae ʻae a aloha iā YAML. E like me ke kūpono o kēia papa inoa, e helu ʻia kā mākou ʻōlelo aʻoaʻo he ʻumi mai ka wā ʻōpala, e hoʻohui mākou i ka noʻonoʻo a me nā hana ʻuhane ma ka makemake 😉

0. E hana i kāu mea hoʻoponopono

ʻAʻole pili ka mea hoʻoponopono kikokikona i loaʻa iā ʻoe, aia paha ma kahi o hoʻokahi plugin no ka hana ʻana me YAML. Inā ʻaʻohe āu, e ʻimi a hoʻokomo koke iā ia. ʻO ka manawa e ʻimi ai a hoʻonohonoho e uku i nā manawa he nui i kēlā me kēia manawa āu e hoʻoponopono ai iā YAML.

Eia kekahi laʻana, hoʻoponopono 'Anom kākoʻo iā YAML ma ke ʻano maʻamau, akā no GNU Emacs pono ʻoe e hoʻokomo i nā pūʻulu hou, no ka laʻana, ʻano ʻano yaml.

10 mau ʻanuʻu i YAML Zen

Emacs ma ke ʻano YAML a hōʻike i nā wahi.

Inā ʻaʻohe YAML mode kāu mea hoʻoponopono punahele, a laila hiki ke hoʻoponopono ʻia kekahi o nā pilikia ma ka hana ʻana me nā hoʻonohonoho. No ka laʻana, ʻaʻohe ʻano YAML ka hoʻoponopono kikokikona GNOME maʻamau ʻo Gedit, akā ma ke ʻano maʻamau, hōʻike ia i ka syntax YAML a hiki iā ʻoe ke hoʻonohonoho i ka hana me nā indentations:

10 mau ʻanuʻu i YAML Zen

Hoʻonohonoho i nā indents ma Gedit.

He pākuʻi kaha kiʻi no Gedit, hōʻike i nā hakahaka ma ke ʻano he kiko, me ka hoʻopau ʻana i nā mea ʻokoʻa me nā pae indentation.

ʻO ia hoʻi, e hoʻolilo i ka manawa e aʻo ai e pili ana i kāu mea hoʻoponopono punahele. E ʻike i ka mea a kāna kaiāulu hoʻomohala e hāʻawi ai no ka hana pū me YAML, a hoʻohana i kēlā mau hiʻohiʻona. ʻAʻole ʻoe e mihi.

1. E hoʻohana i kahi linter

Ma ke kūpono, hoʻohana nā ʻōlelo papahana a me nā ʻōlelo markup i ka syntax hiki ke wānana. Maikaʻi nā kamepiula i ka wānana, ʻo ia ke kumu o ka manaʻo o lintera. Inā i loko o nā makahiki 40 o kona ola ʻana ua hala ʻoe a ʻaʻole ʻoe e hoʻohana i kahi YAML linter, a laila ua hiki i ka manawa e hoʻāʻo ai i ka yamllint.

Hoʻohui yamllint Hiki iā ʻoe ke hoʻohana i ka Linux package manager. Eia kekahi laʻana, ma ʻO Red Hat Enterprise Linux 8 a i ʻole ʻO Fedora ua hana ʻia e like me kēia:

$ sudo dnf install yamllint

A laila holo wale ʻoe i ka yamllint, e hāʻawi iā ia i ka faila YAML e nānā. Penei ke ʻano inā hāʻawi ʻoe i kahi faila me ka hewa i ka linter:

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

ʻO nā helu ma ka hema ʻaʻole ia ka manawa, akā ʻo nā hoʻonohonoho o ka hewa: helu lālani a me ke kolamu. ʻAʻole paha e haʻi aku ka wehewehe ʻana o ka hewa iā ʻoe, akā ʻike pono ʻoe i hea ia. E nānā wale i kēia wahi i loko o ke code, a e maopopo ana nā mea a pau.

Ke ʻike ʻole ʻo yamllint i nā hewa i loko o kahi faila, ʻaʻohe mea i paʻi ʻia i ka pale. Inā hoʻoweliweli kēia ʻano leo iā ʻoe a makemake ʻoe i kahi manaʻo hou aʻe, a laila hiki iā ʻoe ke holo i ka linter me ke kauoha echo conditional ma o ka ampersand pālua (&&), e like me kēia:

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

I ka POSIX, e puhi ana ka lua ampersand ina a ina e hoi mai ke kauoha mua i ka 0. A e hoihoi wale mai ana o yamllint i ka helu o na hewa i loaa, no ia mea ke hana nei keia kukulu conditional a pau.

2. Kākau ma Python, ʻaʻole YAML

Inā hoʻonāukiuki maoli ʻo YAML iā ʻoe, mai kākau i loko, ʻoiaʻiʻo. ʻO YAML wale nō ke ʻano i hoʻomaopopo ʻia e ka noi. Akā i kēia hihia, ʻaʻole pono e hana i kahi faila YAML. E kākau i kāu makemake a laila e hoʻololi. No ka laʻana, aia kahi waihona nui no Python pyyaml a me nā ʻano hoʻololi ʻelua: hoʻohuli ponoʻī a me ka hoʻololi ʻana ma o nā palapala.

Ka hoohuli ana iho

I kēia hihia, ʻo ka faila data he palapala Python e hoʻopuka ai iā YAML. Ua kūpono kēia ʻano hana no nā ʻikepili liʻiliʻi. Kākau wale ʻoe i ka ʻikepili JSON i loko o kahi ʻano Python, e hoʻomaka me kahi kuhikuhi import, a ma ka hope o ka faila e hoʻohui i ʻekolu laina e hoʻokō i ka hopena.

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

I kēia manawa, holo mākou i kēia faila ma Python a loaʻa ka faila 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

He YAML kūpono kēia, akā e ao aku ʻo yamllint iā ʻoe ʻaʻole ia e hoʻomaka me -. ʻAe, hiki ke hoʻoponopono maʻalahi me ka lima a hoʻololi iki paha i ka palapala Python.

Hoʻololi ʻia ma o nā palapala

I kēia hihia, kākau mua mākou ma JSON, a laila holo i ka mea hoʻololi ma ke ʻano he palapala Python ʻokoʻa, e hana ana i ka YAML ma ke ʻano he puka. Ke hoʻohālikelike ʻia i ke ʻano ma mua, ʻoi aku ka maikaʻi o kēia ala, no ka mea, ua kaʻawale ka hoʻololi ʻana mai ka ʻikepili.

ʻO ka mea mua, e hana mākou i kahi faila JSON example.json, no ka laʻana, hiki iā ʻoe ke lawe mai 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"
			}
		  }
		}
	  }
	}

A laila e hana mākou i kahi palapala hoʻololi maʻalahi a mālama iā ia ma lalo o ka inoa json2yaml.py. Hoʻokomo kēia palapala i nā modula YAML a me JSON Python, a hoʻouka i kahi faila JSON i kuhikuhi ʻia e ka mea hoʻohana, hana i ka hoʻololi ʻana, a kākau i ka ʻikepili i ka faila 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()

E mālama i kēia palapala ma ke ala ʻōnaehana a holo i ka mea e pono ai:

$ ~/bin/json2yaml.py example.json

3. E hoʻopaʻa nui a pinepine

I kekahi manawa he mea pono ke nānā i kahi pilikia mai kahi ʻaoʻao ʻē aʻe. Inā pilikia ʻoe i ka hōʻike ʻana i nā pilina ma waena o kāu ʻikepili ma YAML, hiki iā ʻoe ke hoʻololi iā ia i kahi mea i kamaʻāina.

No ka laʻana, inā ʻoluʻolu ʻoe i ka hana ʻana me ka papa inoa puke wehewehe ʻōlelo a i ʻole JSON, hiki iā ʻoe ke hoʻololi iā YAML i JSON me ʻelua mau kauoha i loko o ka pūpū Python interactive. E ʻōlelo mākou he faila YAML mydata.yaml kāu, a laila ʻo ia ke ʻano:

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

Hiki iā ʻoe ke ʻike i nā laʻana he nui e pili ana i kēia kumuhana. Eia kekahi, nui nā mea hoʻololi pūnaewele a me nā parser kūloko i loaʻa. No laila, mai kānalua e hoʻololi hou i ka ʻikepili inā ʻike ʻoe i kahi jumble hiki ʻole ke hoʻomaopopo ʻia i loko.

4. E heluhelu i nā kikoʻī

Ke hoʻi nei i YAML ma hope o ka hoʻomaha lōʻihi, pono ke kipa yaml.org a heluhelu hou i nā kikoʻī (specs). Inā pilikia ʻoe me YAML, akā ʻaʻole ʻoe i hele a puni i ka kikoʻī, a laila ua hiki i ka manawa e hoʻoponopono i kēia kūlana. He mea maʻalahi ke kākau ʻana i nā kikoʻī, a ua hōʻike ʻia nā koi syntax me ka nui o nā hiʻohiʻona ma Mokuna 6.

5. Pseudo-configs

Ke kākau ʻana i puke a ʻatikala paha, pono mau ke kahakaha mua ʻana i kahi papa kuhikuhi mua, ma ka liʻiliʻi loa ma ke ʻano o ka papa ʻike. Ua like ia me YAML. Loaʻa paha, loaʻa iā ʻoe kahi manaʻo o ka ʻikepili e pono e kākau ʻia i kahi faila YAML, akā ʻaʻole maopopo ʻoe pehea e hoʻopili ai kekahi i kekahi. No laila, ma mua o ke kālai ʻana iā YAML, e kaha kiʻi i kahi pseudo-config.

Ua like ka Pseudo-config me ka pseudo-code, kahi ʻaʻole pono ʻoe e hopohopo e pili ana i ka hoʻolālā a i ʻole ka indentation, ka pilina makua-keiki, ka hoʻoilina a me ka nesting. Ua like ia ma ʻaneʻi: ke kahakiʻi nei ʻoe i nā ʻikepili o ka ʻikepili i ko lākou ala ʻana i kou poʻo.

10 mau ʻanuʻu i YAML Zen

Pseudo-config papa inoa papahana (Martin a me Tabitha) a me kā lākou mau mākau (nā ʻōlelo papahana: Python, Perl, Pascal a me Lisp, Fortran, Erlang, kēlā me kēia).

Ma hope o ke kahakiʻi ʻana i kahi pseudo-config ma kahi ʻāpana pepa, e noʻonoʻo pono iā ia a, inā pololei nā mea a pau, e hoʻopili iā ia ma ke ʻano o kahi faila YAML kūpono.

6. ʻO nā Tabs vs. Spaces Dilemma

Pono ʻoe e hoʻoponopono i ka pilikia "nā papa a i ʻole nā ​​​​wāwae?". ʻAʻole ma ka manaʻo honua, akā ma ka pae wale nō o kāu hui, a i ʻole kahi papahana. ʻAʻole ia he mea nui inā pili kēia i ka hoʻohana ʻana i ka hoʻoponopono hope me kahi script sed, ka hoʻonohonoho ʻana i nā mea hoʻoponopono kikokikona ma nā mīkini polokalamu, a i ʻole ka lawe ʻana i nā loaʻa o ka hoʻokō pono ʻana i nā ʻōlelo a ka linter ma lalo o ka hoʻoweliweli o ka hoʻokuʻu ʻana, akā nā lālā āpau o kāu hui i ʻO kekahi ala a i ʻole e pili ana iā YAML pono e hoʻohana i nā hakahaka wale nō (e like me ke koi ʻia e ka YAML kikoʻī).

Ma nā mea hoʻoponopono kikokikona maʻamau, hiki iā ʻoe ke hoʻonohonoho i nā ʻaoʻao pololei pololei i kahi helu o nā hakahaka, no laila ke kipi ʻana o nā mea pili nui. Kuhi ʻAʻole pono ʻoe e makaʻu.

E like me ka ʻike pono ʻana o kēlā me kēia YAML inaina, ʻaʻole hiki iā ʻoe ke ʻike i ka ʻokoʻa ma waena o nā tab a me nā hakahaka ma ka pale. A i ʻike ʻole ʻia kekahi mea, ʻo ia ka mea maʻamau e hoʻomanaʻo ai ka poʻe, ma hope o ka hoʻokaʻawale ʻana, nānā a hoʻopau i nā pilikia ʻē aʻe. Hoʻokahi hola o ka manawa i hoʻohana ʻia e ʻimi ai i kahi pihi papahelu a i ʻole kahi poloka o nā hakahaka e hoʻōho wale ana ʻoe e pono koke ʻoe e hana i kahi kulekele no ka hoʻohana ʻana i kekahi a i ʻole kekahi, a laila e hoʻokō i kahi loiloi paʻa i hoʻopaʻa ʻia no ka hoʻokō ʻana me ia (no ka laʻana, ma o kahi makau Git e hoʻoikaika iā ia ma ka linter).

7. ʻOi aku ka liʻiliʻi (a ʻoi aku ka liʻiliʻi)

Makemake kekahi poʻe e kākau ma YAML no ka mea e hoʻoikaika ana i ka hoʻolālā. I ka manawa like, hoʻohana ikaika lākou i ka indentation e hōʻike i nā poloka o ka ʻikepili. He ʻano scam kēia e hoʻohālike i nā ʻōlelo markup e hoʻohana ana i nā delimiters.

Eia kekahi laʻana o ia ʻano hana mai Palapala hiki:

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

No kekahi, kōkua kēia koho iā lākou e hoʻokaʻawale i ka hoʻolālā YAML i ko lākou mau poʻo; no nā poʻe ʻē aʻe, ma kahi ʻē aʻe, hoʻonāukiuki ia iā lākou me ka nui o nā mea pono ʻole, i ko lākou manaʻo, indents.

Akā inā ʻo ʻoe ka mea nona ka palapala YAML a ʻo ʻoe ke kuleana no ka mālama ʻana, a laila ʻo ʻoe a ʻo ʻoe wale nō pono e wehewehe pehea e hoʻohana ai i ka indentation. Inā huhū ʻoe i ka padding nui, e mālama i ka liʻiliʻi loa e like me ka kikoʻī YAML. No ka laʻana, hiki ke kākau hou ʻia ka faila i luna mai ka palapala Ansible e like me kēia me ka ʻole o ka nalowale:

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

8. E hoʻohana i nā hakahaka

Inā hana mau ʻoe i nā hewa like ʻole i ka hoʻopiha ʻana i kahi faila YAML, kūpono ke hoʻokomo ʻana i kahi template ma ke ʻano he manaʻo. A laila hiki iā ʻoe ke kope kope i kēia template a hoʻokomo i ka ʻikepili maoli ma laila, no ka laʻana:

---
# - <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. E hoʻohana i kekahi mea ʻokoʻa

Inā ʻaʻohe paʻa o ka noi iā ʻoe, a laila pono paha e hoʻololi i ka YAML i kahi ʻano ʻē aʻe. I ka wā lōʻihi, hiki i nā faila hoʻonohonoho ke hoʻonui iā lākou iho a laila ʻoi aku ka maikaʻi o ka hoʻololi ʻana iā lākou i mau palapala maʻalahi ma Lua a i ʻole Python.

He mea nui ka YAML i makemake nui ʻia e ka poʻe no kāna minimalism a me ka maʻalahi, akā mamao loa ia mai ka mea hana wale nō i kāu arsenal. No laila i kekahi manawa hiki iā ʻoe ke hōʻole. Maʻalahi ka loaʻa ʻana o nā hale waihona puke parsing no YAML, no laila inā hāʻawi ʻoe i nā koho neʻe maʻalahi, e ola ana kāu mea hoʻohana i kēia hemahema me ka ʻeha ʻole.

Inā ʻaʻole hiki iā ʻoe ke hana me ka ʻole o YAML, a laila e lawe i kēia mau ʻōlelo aʻoaʻo 10 a lanakila i kou makemake ʻole iā YAML i hoʻokahi manawa a no nā mea āpau!

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka