YAML Zen'e 10 adım

Hepimiz Ansible'ı seviyoruz ama Ansible YAML'dir. Yapılandırma dosyaları için birçok format vardır: değer listeleri, parametre-değer çiftleri, INI dosyaları, YAML, JSON, XML ve diğerleri. Ancak tüm bunların arasında çeşitli nedenlerden dolayı YAML'nin genellikle özellikle zor olduğu düşünülmektedir. Özellikle, canlandırıcı minimalizmine ve hiyerarşik değerlerle çalışma konusundaki etkileyici yeteneklerine rağmen, YAML sözdizimi, girintiye yönelik Python benzeri yaklaşımı nedeniyle can sıkıcı olabilir.

YAML Zen'e 10 adım

YAML seni sinirlendiriyorsa yapabilirsin ve yapmalısın! – Hayal kırıklığınızı kabul edilebilir bir seviyeye indirmek ve YAML'a aşık olmak için aşağıdaki 10 adımı izleyin. Bu listeye yakışır şekilde on ipucumuz sıfırdan numaralandırılacak, isteğe göre meditasyon ve manevi uygulamaları da ekleyeceğiz 😉

0. Düzenleyicinizin çalışmasını sağlayın

Hangi metin düzenleyiciye sahip olduğunuz önemli değil, muhtemelen YAML ile çalışmak için en az bir eklenti vardır. Eğer sizde yoksa hemen bulun ve kurun. Arama ve kurulum için harcadığınız zaman, YAML'yi her düzenlemeniz gerektiğinde birçok kez karşılığını verecektir.

Örneğin editör Atom varsayılan olarak YAML'yi destekler, ancak GNU Emacs için ek paketler yüklemeniz gerekecektir; örneğin, yaml modu.

YAML Zen'e 10 adım

YAML modunda Emacs ve boşluklar görüntüleniyor.

Favori düzenleyicinizde YAML modu yoksa, bazı sorunlar ayarlarla çalışılarak çözülebilir. Örneğin, standart GNOME metin düzenleyicisi Gedit'in YAML modu yoktur, ancak varsayılan olarak YAML sözdizimini vurgular ve çalışmayı girintilerle yapılandırmanıza olanak tanır:

YAML Zen'e 10 adım

Gedit'te girintileri ayarlama.

Bir eklenti çizim alanları Gedit için boşlukları noktalar halinde görüntüler ve girinti düzeyleriyle belirsizlikleri ortadan kaldırır.

Başka bir deyişle, favori editörünüz hakkında bilgi edinmeye zaman ayırın. Kendisinin veya geliştirme topluluğunun YAML ile çalışmak için neler sunabileceğini öğrenin ve bu özellikleri kullanın. Kesinlikle pişman olmayacaksınız.

1. Bir linter kullanın

İdeal olarak, programlama dilleri ve işaretleme dilleri öngörülebilir sözdizimi kullanır. Bilgisayarlar öngörülebilirlik konusunda iyidir, bu nedenle lintera. Eğer 40 yıllık varlığına rağmen hala YAML linter kullanmıyorsanız, yamllint'i denemenin zamanı gelmiştir.

kurmak yamlint Standart Linux paket yöneticisini kullanabilirsiniz. Örneğin, Red Hat Enterprise Linux 8 veya Fötr şapka şu şekilde yapılır:

$ sudo dnf install yamllint

Daha sonra yamllint'i çalıştırıp YAML dosyasını kontrol etmek için iletmeniz yeterlidir. Hatalı bir dosyayı linter'a iletirseniz şöyle görünür:

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

Soldaki sayılar zaman değil, hatanın koordinatlarıdır: satır ve sütun sayısı. Hatanın açıklaması size hiçbir şey söylemeyebilir, ancak tam olarak nerede olduğunu biliyorsunuz. Sadece koddaki bu yere bakın ve büyük olasılıkla her şey netleşecektir.

Yamllint bir dosyada hata bulamadığında ekrana hiçbir şey yazdırılmaz. Böyle bir sessizlik sizi korkutuyorsa ve biraz daha geri bildirim istiyorsanız, linter'ı koşullu echo komutuyla çift ve işareti (&&) aracılığıyla şu şekilde çalıştırabilirsiniz:

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

POSIX'te, çift ve işareti ancak ve ancak önceki komut 0 döndürdüğünde tetiklenir. Ve yamllint yalnızca bulunan hataların sayısını döndürür, bu nedenle tüm bu koşullu yapı işe yarar.

2. YAML'da değil Python'da yazın

YAML sizi gerçekten sinirlendiriyorsa, kelimenin tam anlamıyla yazmayın. Uygulamanın anladığı tek formatın YAML olduğu görülüyor. Ancak bu durumda bile YAML dosyası oluşturmanıza gerek yoktur. Neyi beğendiğinizi yazın ve ardından dönüştürün. Örneğin Python için harika bir kütüphane var piyaml ve iki dönüştürme yöntemi: kendi kendine dönüştürme ve komut dosyaları aracılığıyla dönüştürme.

Kendi kendine dönüşüm

Bu durumda veri dosyası aynı zamanda YAML üreten bir Python betiğidir. Bu yöntem küçük veri kümeleri için en uygunudur. JSON verilerini bir Python değişkenine yazmanız, önüne bir içe aktarma yönergesi koymanız ve çıktıyı uygulamak için dosyanın sonuna üç satır eklemeniz yeterlidir.

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

Şimdi bu dosyayı Python'da çalıştırıyoruz ve çıktı.yaml dosyasını alıyoruz:

$ 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

Bu tamamen geçerli bir YAML'dir, ancak yamllint sizi - ile başlamadığı konusunda uyaracaktır. Bu, elle kolayca düzeltilebilir veya Python betiğinde biraz değiştirilebilir.

Komut dosyaları aracılığıyla dönüştürme

Bu durumda önce JSON'da yazıyoruz ve ardından dönüştürücüyü ayrı bir Python betiği olarak çalıştırıyoruz, bu da çıktı olarak YAML üretiyor. Önceki yöntemle karşılaştırıldığında bu yöntem, dönüşümün verilerden ayrı olması nedeniyle daha iyi ölçeklenir.

Öncelikle example.json JSON dosyası oluşturalım, örneğin onu şuradan alabilirsiniz. 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"
			}
		  }
		}
	  }
	}

Daha sonra basit bir dönüştürücü betiği oluşturup onu json2yaml.py adı altında kaydedeceğiz. Bu komut dosyası hem YAML hem de JSON Python modüllerini içe aktarır ve kullanıcı tarafından belirlenen bir JSON dosyasını yükler, dönüştürmeyi gerçekleştirir ve verileri çıktı.yaml dosyasına yazar.

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

Bu betiği sistem yoluna kaydedin ve gerektiği gibi çalıştırın:

$ ~/bin/json2yaml.py example.json

3. Çok ve sık ayrıştırın

Bazen bir soruna farklı bir açıdan bakmak faydalı olabilir. YAML'de verileriniz arasındaki ilişkileri temsil etmekte sorun yaşıyorsanız, verileri geçici olarak daha tanıdık bir şeye dönüştürebilirsiniz.

Örneğin, sözlük listeleri veya JSON ile çalışma konusunda rahatsanız, etkileşimli Python kabuğundaki yalnızca iki komutla YAML'yi JSON'a dönüştürebilirsiniz. Diyelim ki mydata.yaml adlı bir YAML dosyanız var, o zaman şöyle görünecektir:

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

Bu konuyla ilgili daha birçok örnek bulabilirsiniz. Ek olarak, birçok çevrimiçi dönüştürücü ve yerel ayrıştırıcı mevcuttur. Bu nedenle, içinde yalnızca anlaşılmaz bir karmakarışıklık gördüğünüzde verileri yeniden biçimlendirmekten çekinmeyin.

4. Teknik özellikleri okuyun

Uzun bir aradan sonra YAML'a döndüğümüzde ziyaret etmekte fayda var yaml.org ve teknik özellikleri (teknik özellikleri) tekrar okuyun. YAML ile ilgili zorluk yaşıyorsanız ancak spesifikasyona ulaşamadıysanız, bu durumu düzeltmenin zamanı gelmiştir. Spesifikasyonların yazılması şaşırtıcı derecede kolaydır ve sözdizimi gereklilikleri çok sayıda örnekle gösterilmiştir. Bölüm 6.

5. Sözde yapılandırmalar

Bir kitap veya makale yazarken, en azından içindekiler tablosu biçiminde, ilk önce bir ön taslağın taslağını çıkarmak her zaman faydalıdır. YAML'de de durum aynı. Büyük olasılıkla, bir YAML dosyasına hangi verilerin yazılması gerektiğine dair bir fikriniz var, ancak bunları birbirine nasıl bağlayacağınızı gerçekten anlamıyorsunuz. Bu nedenle, YAML'yi şekillendirmeden önce sözde bir yapılandırma çizin.

Sözde yapılandırma, yapı veya girinti, ebeveyn-çocuk ilişkileri, miras ve yuvalama konusunda endişelenmenize gerek olmayan sözde koda benzer. Burada da durum aynı: kafanızda ortaya çıktıkça verilerin yinelemelerini çiziyorsunuz.

YAML Zen'e 10 adım

Programcıları (Martin ve Tabitha) ve becerilerini (programlama dilleri: sırasıyla Python, Perl, Pascal ve Lisp, Fortran, Erlang) listeleyen sözde yapılandırma.

Bir kağıda sözde yapılandırma çizdikten sonra, onu dikkatlice analiz edin ve her şey yolundaysa geçerli bir YAML dosyası biçiminde biçimlendirin.

6. Sekmeler ve Boşluklar İkilemi

İkilemi çözmeniz gerekecek “sekmeler mi yoksa boşluklar mı?”. Küresel anlamda değil, yalnızca kuruluşunuz veya en azından bir proje düzeyinde. Bunun bir sed betiğiyle son işlemeyi kullanmayı, programcıların makinelerine metin editörleri kurmayı veya işten çıkarılma tehdidi altında linter'in talimatlarına sıkı bir şekilde uyulduğuna dair evrensel olarak makbuz almayı içermesi önemli değil, ancak ekibinizin tüm üyeleri öyle ya da böyle YAML ile ilgili olanlarda yalnızca boşluk kullanılmalıdır (YAML spesifikasyonunun gerektirdiği şekilde).

Herhangi bir normal metin düzenleyicide, sekmeleri belirli sayıda boşlukla otomatik olarak düzeltebilirsiniz, böylece önemli taraftarların isyanı çıkıntı korkmanıza gerek yok.

Her YAML düşmanının çok iyi bildiği gibi ekrandaki sekmeler ve boşluklar arasındaki farkı göremezsiniz. Ve bir şey görünür olmadığında, bu genellikle insanların diğer olası sorunları ayıkladıktan, kontrol ettikten ve ortadan kaldırdıktan sonra hatırladığı son şeydir. Bir tablolama eğrisi veya bir alan bloğu aramak için harcanan bir saatlik zaman, birinin veya diğerinin kullanımı için acilen bir politika oluşturmanız ve ardından buna uyum için betonarme bir kontrol uygulamanız gerektiğini haykırır (örneğin, bir linter boyunca zorlamak için bir Git kancası).

7. Daha azı daha fazladır (veya daha fazlası daha azdır)

Bazı insanlar yapıyı vurguladığı için YAML'da yazmayı sever. Aynı zamanda veri bloklarını vurgulamak için girintiyi aktif olarak kullanırlar. Bu, açık sınırlayıcılar kullanan işaretleme dillerini taklit etmeye yönelik bir tür dolandırıcılıktır.

İşte böyle bir yapıya bir örnek Ansible dokümantasyonu:

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

Bazıları için bu seçenek, YAML yapısını kafalarında çözmelerine yardımcı olurken, diğerleri için ise tam tersine, kendilerine göre pek çok gereksiz girinti ile onları rahatsız ediyor.

Ancak YAML belgesinin sahibiyseniz ve onun bakımından sorumluysanız, o zaman sen ve sadece sen Girintinin nasıl kullanılacağını tanımlamanız gerekir. Büyük dolgudan rahatsız oluyorsanız, bunu YAML spesifikasyonuna göre mümkün olan en düşük seviyede tutun. Örneğin, Ansible belgelerindeki yukarıdaki dosya herhangi bir kayıp olmadan şu şekilde yeniden yazılabilir:

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

8. Boşlukları kullanın

Bir YAML dosyasını doldururken sürekli aynı hataları tekrarlıyorsanız, içine yorum olarak bir şablon eklemek mantıklı olacaktır. Daha sonra bir dahaki sefere bu şablonu kopyalayıp oraya gerçek verileri girebilirsiniz, örneğin:

---
# - <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. Farklı bir şey kullanın

Uygulama sizi boğmuyorsa YAML'yi farklı bir formata değiştirmek faydalı olabilir. Zamanla yapılandırma dosyaları büyüyebilir ve bunları Lua veya Python'da basit komut dosyalarına dönüştürmek daha iyidir.

YAML, minimalizmi ve sadeliği nedeniyle birçok insanın sevdiği harika bir şeydir, ancak cephaneliğinizdeki tek araç olmaktan çok uzaktır. Yani bazen reddedebilirsin. YAML için ayrıştırma kitaplıklarını bulmak kolaydır; bu nedenle, kolay geçiş seçenekleri sunarsanız, kullanıcılarınız bu başarısızlıktan nispeten sorunsuz bir şekilde kurtulacaktır.

YAML olmadan yapamıyorsanız, o zaman bu 10 ipucunu alın ve YAML'a olan nefretinizi kesin olarak ortadan kaldırın!

Kaynak: habr.com

Yorum ekle