10 léngkah pikeun YAML Zen

Urang sadayana resep Ansible, tapi Ansible nyaéta YAML. Aya seueur format file konfigurasi: daptar nilai, pasangan parameter-nilai, file INI, YAML, JSON, XML sareng seueur deui. Nanging, kusabab sababaraha alesan tina sadayana, YAML sering dianggap sesah. Khususna, sanaos minimalisme nyegerkeun sareng kamampuan anu pikaresepeun pikeun damel sareng nilai hierarkis, sintaksis YAML tiasa ngaganggu ku pendekatan sapertos Python pikeun indentasi.

10 léngkah pikeun YAML Zen

Upami YAML ngaganggu anjeun, anjeun tiasa-sareng anjeun kedah! - laksanakeun 10 léngkah ieu pikeun ngirangan hanjelu anjeun ka tingkat anu tiasa ditampi sareng cinta ka YAML. Sapertos daptar ieu, sapuluh tip kami bakal dinomerkeun ti mimiti, kami bakal nambihan semedi sareng prakték spiritual anu dipikahoyong 😉

0. Jieun redaktur Anjeun jalan

Henteu janten masalah naon pangropéa téksu anu anjeun gaduh, sigana sahenteuna aya hiji plugin pikeun damel sareng YAML. Upami anjeun teu acan gaduh, panggihan sareng pasang langsung. Waktu anu dianggo pikeun milarian sareng nyetél bakal mayar sababaraha kali unggal waktos anjeun kedah ngédit YAML.

Contona, redaktur atom ngadukung YAML sacara standar, tapi pikeun GNU Emacs anjeun kedah masang pakét tambahan, contona, yaml-modus.

10 léngkah pikeun YAML Zen

Emacs dina modeu YAML tur mintonkeun spasi.

Upami pangropéa karesep anjeun henteu gaduh mode YAML, maka sababaraha masalah tiasa direngsekeun ku cara damel sareng setélan. Salaku conto, pangropéa téksu GNOME standar Gedit teu gaduh mode YAML, tapi sacara standar nyorot sintaksis YAML sareng ngamungkinkeun anjeun ngonpigurasikeun damel sareng indentations:

10 léngkah pikeun YAML Zen

Nyetel indents dina Gedit.

Hiji plugin drawspaces pikeun Gedit, nembongkeun spasi sakumaha titik-titik, ngaleungitkeun ambiguities kalawan tingkat indentation.

Dina basa sejen, méakkeun waktu diajar ngeunaan redaktur favorit anjeun. Panggihan naon anu ditawarkeunana atanapi komunitas pangembanganana pikeun damel sareng YAML, sareng nganggo fitur-fitur éta. Anjeun pasti moal kuciwa.

1. Paké linter a

Ideally, basa programming jeung basa markup ngagunakeun sintaksis bisa diprediksi. Komputer anu alus di predictability, naha éta konsép lintera. Upami dina 40 taun ayana éta parantos ngalangkungan anjeun sareng anjeun masih henteu nganggo linter YAML, maka waktosna nyobian yamllint.

Pasang yamllint Anjeun tiasa nganggo manajer pakét Linux standar. Contona, dina Red Hat Perusahaan Linux 8 atanapi Fedora parantos siga kieu:

$ sudo dnf install yamllint

Teras anjeun ngan saukur ngajalankeun yamllint, ngalangkungan file YAML pikeun dipariksa. Ieu sapertos upami anjeun ngaliwat file anu aya kasalahan 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)

Angka anu aya di kénca sanés waktosna, tapi koordinat kasalahan: nomer baris sareng kolom. Katerangan ngeunaan kasalahan bisa jadi teu ngabejaan Anjeun nanaon, tapi anjeun terang persis dimana éta. Ngan kasampak di tempat ieu dina kode, sarta paling dipikaresep sagalana bakal jelas.

Nalika yamllint henteu mendakan kasalahan dina file, teu aya anu dicitak dina layar. Upami tiiseun sapertos kitu nyingsieunan anjeun sareng anjeun hoyong eupan balik sakedik, maka anjeun tiasa ngajalankeun linter kalayan paréntah gema kondisional liwat ampersand ganda (&&), sapertos kieu:

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

Dina POSIX, a ampersand ganda kahuruan lamun jeung ngan lamun paréntah saméméhna mulih 0. Sarta yamllint ngan mulangkeun jumlah kasalahan kapanggih, nu naha sakabeh konstruksi kondisional ieu jalan.

2. Tulis dina Python, moal YAML

Upami YAML leres-leres ngaganggu anjeun, ngan ulah nyerat di dinya, sacara harfiah. Éta kajadian yén YAML mangrupikeun hiji-hijina format anu kahartos ku aplikasi. Tapi sanajan dina hal ieu, teu perlu nyieun file YAML. Tulis naon anu anjeun pikahoyong teras konvérsi. Contona, aya perpustakaan gede pikeun Python pyyaml sareng dua metode konvérsi: konvérsi diri sareng konvérsi ngalangkungan naskah.

Konversi diri

Dina hal ieu, file data ogé mangrupa Aksara Python anu ngahasilkeun YAML. Metoda ieu paling cocog pikeun set data leutik. Anjeun saukur nulis data JSON kana variabel Python, miheulaan eta kalawan diréktif impor, sarta dina tungtung file nambahkeun tilu garis pikeun nerapkeun kaluaran.

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

Ayeuna urang ngajalankeun file ieu dina Python sareng kéngingkeun file 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

Ieu YAML sampurna valid, tapi yamllint bakal ngingetkeun yén éta henteu dimimitian ku -. Nya, ieu tiasa gampang dilereskeun sacara manual atanapi rada dirobih dina skrip Python.

Konversi via skrip

Dina hal ieu, urang mimiti nulis dina JSON, lajeng ngajalankeun converter salaku Aksara Python misah, nu ngahasilkeun YAML salaku kaluaran. Dibandingkeun jeung métode saméméhna, metoda ieu skala leuwih hadé, sabab konversi misah ti data.

Mimiti, hayu urang ngadamel file JSON example.json, contona, anjeun tiasa nyandak tina 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"
			}
		  }
		}
	  }
	}

Teras urang bakal nyiptakeun skrip konvérsi saderhana sareng simpen dina nami json2yaml.py. Skrip ieu ngimpor duanana modul YAML sareng JSON Python, sareng ngamuat file JSON anu dikhususkeun ku pangguna, ngalaksanakeun konvérsi, sareng nyerat data kana file 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()

Simpen skrip ieu dina jalur sistem sareng jalankeun upami diperyogikeun:

$ ~/bin/json2yaml.py example.json

3. Parse loba tur mindeng

Kadangkala kacida mangpaat pikeun nempo hiji masalah ti sudut nu beda. Upami anjeun ngalaman masalah ngagambarkeun hubungan antara data anjeun dina YAML, anjeun tiasa samentawis ngarobih kana hal anu langkung akrab.

Salaku conto, upami anjeun teu nyaman damel sareng daptar kamus atanapi JSON, anjeun tiasa ngarobih YAML ka JSON kalayan ngan ukur dua paréntah dina cangkang Python interaktif. Anggap anjeun gaduh file YAML mydata.yaml, teras ieu sapertos kieu:

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

Anjeun tiasa mendakan seueur conto sanés ngeunaan topik ieu. Salaku tambahan, aya seueur konvérsi online sareng parser lokal anu sayogi. Janten entong ragu ngarobih deui data nalika anjeun ngan ukur ningali anu teu kaharti.

4. Baca spésifikasi

Balik deui ka YAML saatos istirahat panjang, éta mangpaat pikeun nganjang yaml.org jeung maca deui spésifikasi (spésifikasi). Upami Anjeun gaduh kasusah jeung YAML, tapi teu meunang sabudeureun spésifikasi nu, lajeng éta waktu pikeun ngabenerkeun kaayaan ieu. Spésifikasina gampang pisan ditulis, sareng sarat sintaksis digambarkeun ku sajumlah ageung conto dina Bab 6.

5. Pseudo-configs

Nalika nulis buku atawa artikel, sok aya mangpaatna pikeun mimiti nyieun sketsa outline awal, sahenteuna dina wangun daptar eusi. Éta sami sareng YAML. Paling dipikaresep, anjeun boga pamanggih naon data nu kudu ditulis kana file YAML, tapi anjeun teu ngarti kumaha nyambungkeun eta saling. Ku alatan éta, saméméh sculpting YAML, ngagambar pseudo-config.

Pseudo-config téh sarupa jeung pseudo-kode, dimana anjeun teu kudu salempang ngeunaan struktur atawa indentation, hubungan indungna-anak, warisan jeung nyarang. Éta sami di dieu: anjeun ngagambar iterasi data nalika timbul dina sirah anjeun.

10 léngkah pikeun YAML Zen

Programer daptar pseudo-config (Martin sareng Tabitha) sareng kaahlianna (basa pemrograman: Python, Perl, Pascal sareng Lisp, Fortran, Erlang, masing-masing).

Saatos ngagambar pseudo-config dina salembar kertas, analisa sacara saksama sareng, upami sadayana leres, pormat dina bentuk file YAML anu sah.

6. The Tab vs Spasi dilema

Anjeun bakal kudu ngajawab dilema "tab atanapi spasi?". Henteu dina rasa global, tapi ngan ukur dina tingkat organisasi anjeun, atanapi sahenteuna proyék. Henteu masalah naha ieu ngalibatkeun ngagunakeun pos-processing kalawan skrip séd, nyetel éditor téks dina mesin programer ', atawa sacara universal nyandak kuitansi minuhan ketat jeung parentah linter di handapeun ancaman PHK, tapi sakabeh anggota tim anjeun anu di salah sahiji atawa cara séjén patali jeung YAML kudu make ngan spasi (sakumaha diperlukeun ku spésifikasi YAML).

Dina naon waé pangropéa téksu normal, anjeun tiasa ngonpigurasikeun tab anu leres-otomatis ka sajumlah rohangan anu ditangtukeun, janten pemberontakan para penganut konci. tab anjeun teu kudu sieun.

Kusabab unggal YAML hater terang ogé, anjeun moal tiasa ningali bédana antara tab sareng rohangan dina layar. Sareng nalika aya anu teu katingali, biasana mangrupikeun hal anu terakhir anu émut, saatos aranjeunna diurutkeun, pariksa sareng ngaleungitkeun sagala masalah anu sanés. Sajam waktos nyéépkeun pikeun milarian kurva tabulasi atanapi blok rohangan ngan saukur ngajerit yén anjeun kedah urgent nyieun kawijakan pikeun pamakéan hiji atawa lianna, lajeng nerapkeun cek beton bertulang pikeun minuhan eta (contona, ngaliwatan hook Git pikeun maksakeun ngaliwatan linter).

7. Kurang leuwih (atawa leuwih kurang)

Sababaraha urang resep nulis dina YAML sabab nekenkeun struktur. Dina waktos anu sami, aranjeunna aktip ngagunakeun indentasi pikeun nyorot blok data. Ieu mangrupikeun panipuan pikeun niru basa markup anu nganggo pembatas eksplisit.

Ieu conto struktur sapertos ti dokuméntasi ansible:

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

Kanggo sababaraha, pilihan ieu ngabantosan aranjeunna nyortir struktur YAML dina sirahna; pikeun anu sanés, sabalikna, éta ngaganggu aranjeunna kalayan seueur anu teu perlu, dina pamadegan maranéhna, indents.

Tapi upami anjeun anu gaduh dokumén YAML sareng tanggung jawab pikeun ngajaga éta, teras anjeun ngan anjeun kudu nangtukeun kumaha ngagunakeun indentation. Upami anjeun kaganggu ku padding ageung, jaga kana saminimal mungkin numutkeun spésifikasi YAML. Salaku conto, file di luhur tina dokuméntasi Ansible tiasa ditulis deui sapertos kieu tanpa kaleungitan:

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

8. Paké blanks

Upami anjeun terus-terusan ngulang kasalahan anu sami nalika ngeusian file YAML, éta masuk akal pikeun nyelapkeun template kana éta salaku koméntar. Teras waktos salajengna anjeun tiasa nyalin template ieu sareng lebetkeun data nyata di dinya, contona:

---
# - <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. Paké hal béda

Upami aplikasina henteu gaduh stranglehold ka anjeun, maka panginten kedah ngarobih YAML kana format anu sanés. Leuwih waktos, file konfigurasi bisa outgrow sorangan lajeng eta leuwih hade pikeun ngarobah kana Aksara basajan dina Lua atawa Python.

YAML mangrupikeun hal anu hébat anu dipikacinta ku seueur jalma pikeun minimalism sareng kesederhanaan na, tapi jauh tina hiji-hijina alat dina arsenal anjeun. Janten sakapeung anjeun tiasa nolak. Parsing perpustakaan gampang pikeun manggihan pikeun YAML, jadi lamun anjeun nawiskeun pilihan migrasi gampang, pamaké anjeun bakal salamet kagagalan ieu rélatif painlessly.

Upami anjeun teu tiasa ngalakukeun tanpa YAML, teras cobian 10 tip ieu sareng atasi henteu resep anjeun ka YAML sakali sareng salamina!

sumber: www.habr.com

Tambahkeun komentar