10 langkah menuju YAML Zen

Kita semua menyukai Ansible, tapi Ansible adalah YAML. Ada banyak format untuk file konfigurasi: daftar nilai, pasangan nilai parameter, file INI, YAML, JSON, XML dan banyak lainnya. Namun, karena beberapa alasan, YAML sering kali dianggap sangat sulit. Secara khusus, meskipun memiliki minimalis yang menyegarkan dan kemampuan yang mengesankan untuk bekerja dengan nilai hierarki, sintaksis YAML dapat mengganggu dengan pendekatan lekukan yang mirip Python.

10 langkah menuju YAML Zen

Jika YAML membuat Anda kesal, Anda bisaβ€”dan Anda harus melakukannya! – lakukan 10 langkah berikut untuk mengurangi rasa frustrasi Anda ke tingkat yang dapat diterima dan jatuh cinta dengan YAML. Sesuai dengan daftar ini, sepuluh tips kami akan diberi nomor dari awal, kami akan menambahkan meditasi dan latihan spiritual sesuka hati πŸ˜‰

0. Jadikan editor Anda berfungsi

Apa pun editor teks yang Anda miliki, mungkin setidaknya ada satu plugin untuk bekerja dengan YAML. Jika belum punya, segera cari dan instal. Waktu yang dihabiskan untuk mencari dan menyiapkan akan terbayar berkali-kali lipat setiap kali Anda harus mengedit YAML.

Misalnya saja redaktur Atom mendukung YAML secara default, tetapi untuk GNU Emacs Anda harus menginstal paket tambahan, misalnya, mode yaml.

10 langkah menuju YAML Zen

Emacs dalam mode YAML dan menampilkan spasi.

Jika editor favorit Anda tidak memiliki mode YAML, maka beberapa masalah dapat diselesaikan dengan menggunakan pengaturan. Misalnya, editor teks GNOME standar Gedit tidak memiliki mode YAML, tetapi secara default ia menyoroti sintaks YAML dan memungkinkan Anda mengonfigurasi pekerjaan dengan lekukan:

10 langkah menuju YAML Zen

Mengatur indentasi di Gedit.

Sebuah plugin ruang gambar untuk Gedit, menampilkan spasi sebagai titik, menghilangkan ambiguitas dengan tingkat lekukan.

Dengan kata lain, luangkan waktu untuk mempelajari editor favorit Anda. Cari tahu apa yang dia atau komunitas pengembangannya tawarkan untuk bekerja dengan YAML, dan gunakan fitur tersebut. Anda pasti tidak akan menyesalinya.

1. Gunakan linter

Idealnya, bahasa pemrograman dan bahasa markup menggunakan sintaksis yang dapat diprediksi. Komputer pandai dalam hal prediktabilitas, itulah sebabnya konsep ltera. Jika dalam 40 tahun keberadaannya Anda sudah melewatinya dan Anda masih belum menggunakan linter YAML, inilah saatnya mencoba yamllint.

Untuk menginstal yamlint Anda dapat menggunakan manajer paket Linux standar. Misalnya, di Red Hat Enterprise Linux 8 atau Fedora itu dilakukan seperti ini:

$ sudo dnf install yamllint

Kemudian Anda cukup menjalankan yamllint, meneruskannya ke file YAML untuk diperiksa. Ini adalah tampilannya jika Anda meneruskan file yang error ke 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 di sebelah kiri bukanlah waktu, melainkan koordinat kesalahan: nomor baris dan kolom. Deskripsi kesalahannya mungkin tidak memberi tahu Anda apa pun, tetapi Anda tahu persis di mana letaknya. Lihat saja tempat ini di kode, dan kemungkinan besar semuanya akan menjadi jelas.

Ketika yamllint tidak menemukan kesalahan dalam file, tidak ada yang dicetak ke layar. Jika keheningan seperti itu membuat Anda takut dan Anda menginginkan lebih banyak masukan, maka Anda dapat menjalankan linter dengan perintah echo bersyarat melalui tanda ampersand ganda (&&), seperti ini:

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

Di POSIX, ampersand ganda diaktifkan jika dan hanya jika perintah sebelumnya mengembalikan 0. Dan yamllint hanya mengembalikan jumlah kesalahan yang ditemukan, itulah sebabnya seluruh konstruksi kondisional ini berfungsi.

2. Tulis dengan Python, bukan YAML

Jika YAML benar-benar membuat Anda kesal, jangan menulisnya secara harfiah. Kebetulan YAML adalah satu-satunya format yang dipahami aplikasi. Namun meskipun demikian, tidak perlu membuat file YAML. Tulis apa yang Anda suka dan kemudian konversi. Misalnya, ada perpustakaan yang bagus untuk Python pyyaml dan dua metode konversi: konversi mandiri dan konversi melalui skrip.

Konversi diri

Dalam hal ini, file data juga merupakan skrip Python yang menghasilkan YAML. Metode ini paling cocok untuk kumpulan data kecil. Anda cukup menulis data JSON ke dalam variabel Python, mengawalinya dengan arahan impor, dan di akhir file tambahkan tiga baris untuk mengimplementasikan 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

Sekarang kita jalankan file ini dengan Python dan dapatkan 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

Ini adalah YAML yang benar-benar valid, tetapi yamllint akan memperingatkan Anda bahwa ini tidak dimulai dengan -. Nah, ini dapat dengan mudah diperbaiki secara manual atau sedikit dimodifikasi dalam skrip Python.

Konversi melalui skrip

Dalam hal ini, pertama-tama kita menulis dalam JSON, lalu menjalankan konverter sebagai skrip Python terpisah, yang menghasilkan YAML sebagai keluaran. Dibandingkan dengan metode sebelumnya, metode ini memiliki skala yang lebih baik, karena konversinya terpisah dari data.

Pertama, mari kita buat file JSON example.json, misalnya Anda dapat mengambilnya 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"
			}
		  }
		}
	  }
	}

Kemudian kita akan membuat skrip konverter sederhana dan menyimpannya dengan nama json2yaml.py. Skrip ini mengimpor modul YAML dan JSON Python, dan memuat file JSON yang ditentukan pengguna, melakukan konversi, dan menulis data ke 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()

Simpan skrip ini di jalur sistem dan jalankan sesuai kebutuhan:

$ ~/bin/json2yaml.py example.json

3. Parsing yang banyak dan sering

Terkadang berguna untuk melihat suatu masalah dari sudut yang berbeda. Jika Anda kesulitan merepresentasikan hubungan antar data di YAML, Anda dapat mengubahnya untuk sementara menjadi sesuatu yang lebih familiar.

Misalnya, jika Anda merasa nyaman bekerja dengan daftar kamus atau JSON, Anda dapat mengonversi YAML ke JSON hanya dengan dua perintah di shell Python interaktif. Katakanlah Anda memiliki file YAML mydata.yaml, maka tampilannya akan seperti ini:

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

Anda dapat menemukan banyak contoh lain mengenai topik ini. Selain itu, ada banyak konverter online dan parser lokal yang tersedia. Jadi jangan ragu untuk memformat ulang data ketika Anda hanya melihat tumpukan data yang tidak dapat dipahami di dalamnya.

4. Baca spesifikasinya

Kembali ke YAML setelah istirahat panjang, ada gunanya berkunjung yaml.org dan membaca kembali spesifikasinya (spec). Jika Anda mengalami kesulitan dengan YAML, tetapi belum memahami spesifikasinya, inilah saatnya untuk memperbaiki situasi ini. Spesifikasinya sangat mudah untuk ditulis, dan persyaratan sintaksisnya diilustrasikan dengan banyak contoh bagian 6.

5. Konfigurasi semu

Saat menulis buku atau artikel, ada baiknya jika terlebih dahulu membuat sketsa kerangka awal, setidaknya dalam bentuk daftar isi. Sama halnya dengan YAML. Kemungkinan besar, Anda memiliki gambaran tentang data apa saja yang perlu ditulis ke dalam file YAML, tetapi Anda tidak begitu memahami cara menghubungkannya satu sama lain. Oleh karena itu, sebelum membuat YAML, buatlah konfigurasi semu.

Pseudo-config mirip dengan pseudo-code, di mana Anda tidak perlu khawatir tentang struktur atau lekukan, hubungan orangtua-anak, pewarisan, dan penumpukan. Hal yang sama terjadi di sini: Anda menggambar iterasi data yang muncul di kepala Anda.

10 langkah menuju YAML Zen

Pemrogram daftar konfigurasi semu (Martin dan Tabitha) dan keahlian mereka (bahasa pemrograman: Python, Perl, Pascal dan Lisp, Fortran, Erlang, masing-masing).

Setelah menggambar pseudo-config di selembar kertas, analisislah dengan cermat dan, jika semuanya beres, formatlah dalam bentuk file YAML yang valid.

6. Dilema Tab vs. Spasi

Anda harus memecahkan dilema tersebut β€œtab atau spasi?”. Bukan dalam arti global, tetapi hanya pada tingkat organisasi Anda, atau setidaknya sebuah proyek. Tidak masalah apakah ini melibatkan penggunaan pasca-pemrosesan dengan skrip sed, menyiapkan editor teks pada mesin pemrogram, atau secara universal menerima tanda terima kepatuhan ketat terhadap instruksi linter di bawah ancaman pemecatan, tetapi semua anggota tim Anda yang di dengan satu atau lain cara yang berhubungan dengan YAML harus hanya menggunakan spasi (seperti yang disyaratkan oleh spesifikasi YAML).

Di editor teks normal mana pun, Anda dapat mengonfigurasi tab koreksi otomatis ke jumlah spasi tertentu, sehingga pemberontakan penganut kunci Tab kamu tidak perlu takut.

Seperti yang diketahui dengan baik oleh setiap pembenci YAML, Anda tidak dapat melihat perbedaan antara tab dan spasi di layar. Dan ketika ada sesuatu yang tidak terlihat, biasanya hal itu menjadi hal terakhir yang diingat orang, setelah mereka memilah, memeriksa, dan menghilangkan semua kemungkinan masalah lainnya. Satu jam waktu yang dihabiskan untuk mencari kurva tabulasi atau blok ruang hanya menunjukkan bahwa Anda perlu segera membuat kebijakan untuk penggunaan salah satu atau yang lain, dan kemudian menerapkan pemeriksaan beton bertulang untuk kepatuhan terhadap kebijakan tersebut (misalnya, melalui kait Git untuk memaksanya melewati linter).

7. Lebih sedikit lebih banyak (atau lebih banyak lebih sedikit)

Beberapa orang suka menulis dalam YAML karena menekankan struktur. Pada saat yang sama, mereka secara aktif menggunakan indentasi untuk menyorot blok data. Ini semacam penipuan untuk meniru bahasa markup yang menggunakan pembatas eksplisit.

Berikut adalah contoh struktur tersebut dari Dokumentasi yang memungkinkan:

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

Bagi sebagian orang, opsi ini membantu mereka memilah struktur YAML di kepala mereka; bagi yang lain, sebaliknya, opsi ini mengganggu mereka dengan banyak indentasi yang menurut mereka tidak perlu.

Namun jika Anda adalah pemilik dokumen YAML dan bertanggung jawab untuk memeliharanya, maka kamu dan hanya kamu harus mendefinisikan cara menggunakan indentasi. Jika Anda terganggu dengan padding yang besar, pertahankan seminimal mungkin sesuai dengan spesifikasi YAML. Misalnya, file di atas dari dokumentasi Ansible dapat ditulis ulang seperti ini tanpa kehilangan apa pun:

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

8. Gunakan yang kosong

Jika Anda terus-menerus mengulangi kesalahan yang sama saat mengisi file YAML, masuk akal untuk memasukkan template ke dalamnya sebagai komentar. Kemudian lain kali Anda cukup menyalin template ini dan memasukkan data nyata di sana, misalnya:

---
# - <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. Gunakan sesuatu yang berbeda

Jika aplikasi tidak mencekik Anda, mungkin ada baiknya mengubah YAML ke format lain. Seiring waktu, file konfigurasi dapat berkembang lebih besar dan lebih baik mengubahnya menjadi skrip sederhana di Lua atau Python.

YAML adalah hal hebat yang disukai banyak orang karena minimalis dan kesederhanaannya, namun ini bukan satu-satunya alat di gudang senjata Anda. Jadi terkadang Anda bisa menolaknya. Pustaka penguraian mudah ditemukan untuk YAML, jadi jika Anda menawarkan opsi migrasi yang mudah, pengguna Anda akan selamat dari kegagalan ini tanpa kesulitan.

Jika Anda tidak bisa hidup tanpa YAML, ikuti 10 tips ini dan atasi ketidaksukaan Anda terhadap YAML untuk selamanya!

Sumber: www.habr.com

Tambah komentar