10 βήματα για το YAML Zen

Όλοι αγαπάμε το Ansible, αλλά το Ansible είναι το YAML. Υπάρχουν πολλές μορφές για αρχεία διαμόρφωσης: λίστες τιμών, ζεύγη παραμέτρων-τιμών, αρχεία INI, YAML, JSON, XML και πολλά άλλα. Ωστόσο, για πολλούς λόγους από όλους αυτούς, το YAML θεωρείται συχνά ιδιαίτερα δύσκολο. Συγκεκριμένα, παρά τον αναζωογονητικό μινιμαλισμό και τις εντυπωσιακές δυνατότητες εργασίας με ιεραρχικές τιμές, η σύνταξη YAML μπορεί να είναι ενοχλητική με την προσέγγιση που μοιάζει με Python στην εσοχή.

10 βήματα για το YAML Zen

Αν το YAML σε εξοργίζει, μπορείς—και πρέπει! – Κάντε τα παρακάτω 10 βήματα για να μειώσετε την απογοήτευσή σας σε ένα αποδεκτό επίπεδο και να ερωτευτείτε το YAML. Όπως αρμόζει σε αυτή τη λίστα, οι δέκα συμβουλές μας θα αριθμηθούν από την αρχή, θα προσθέσουμε διαλογισμό και πνευματικές πρακτικές κατά βούληση 😉

0. Κάντε τον συντάκτη σας να λειτουργήσει

Δεν έχει σημασία τι πρόγραμμα επεξεργασίας κειμένου έχετε, πιθανότατα υπάρχει τουλάχιστον ένα πρόσθετο για εργασία με το YAML. Εάν δεν έχετε, βρείτε και εγκαταστήστε το αμέσως. Ο χρόνος που αφιερώνεται στην αναζήτηση και τη ρύθμιση θα αποδίδει πολλές φορές κάθε φορά που πρέπει να επεξεργαστείτε το YAML.

Για παράδειγμα, συντάκτης άτομο υποστηρίζει το YAML από προεπιλογή, αλλά για το GNU Emacs θα πρέπει να εγκαταστήσετε πρόσθετα πακέτα, για παράδειγμα, λειτουργία yaml.

10 βήματα για το YAML Zen

Emacs σε λειτουργία YAML και εμφάνιση διαστημάτων.

Εάν ο αγαπημένος σας επεξεργαστής δεν διαθέτει λειτουργία YAML, τότε ορισμένα από τα προβλήματα μπορούν να λυθούν δουλεύοντας με τις ρυθμίσεις. Για παράδειγμα, το τυπικό πρόγραμμα επεξεργασίας κειμένου GNOME Gedit δεν έχει λειτουργία YAML, αλλά από προεπιλογή επισημαίνει τη σύνταξη YAML και σας επιτρέπει να διαμορφώσετε την εργασία με εσοχές:

10 βήματα για το YAML Zen

Ρύθμιση εσοχών στο Gedit.

Ένα πρόσθετο χώρους σχεδίασης για το Gedit, εμφανίζει τα κενά ως κουκκίδες, εξαλείφοντας τις ασάφειες με τα επίπεδα εσοχής.

Με άλλα λόγια, αφιερώστε χρόνο μαθαίνοντας για τον αγαπημένο σας συντάκτη. Μάθετε τι έχει να προσφέρει ο ίδιος ή η κοινότητα ανάπτυξης του για τη συνεργασία με το YAML και χρησιμοποιήστε αυτές τις δυνατότητες. Σίγουρα δεν θα το μετανιώσετε.

1. Χρησιμοποίησε λίτρο

Στην ιδανική περίπτωση, οι γλώσσες προγραμματισμού και οι γλώσσες σήμανσης χρησιμοποιούν προβλέψιμη σύνταξη. Οι υπολογιστές είναι καλοί στην προβλεψιμότητα, γι' αυτό και η έννοια του lintera. Αν στα 40 χρόνια της ύπαρξής του σας έχει περάσει και εξακολουθείτε να μην χρησιμοποιείτε YAML linter, τότε ήρθε η ώρα να δοκιμάσετε το yamllint.

Εγκαθιστώ yamllint Μπορείτε να χρησιμοποιήσετε τον τυπικό διαχειριστή πακέτων Linux. Για παράδειγμα, σε Red Hat Enterprise Linux 8 ή Μαλακό καπέλλο γίνεται έτσι:

$ sudo dnf install yamllint

Στη συνέχεια, απλά εκτελείτε το yamllint, περνώντας του το αρχείο YAML για έλεγχο. Έτσι φαίνεται αν περάσετε ένα αρχείο με σφάλμα στο linter:

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

Οι αριθμοί στα αριστερά δεν είναι ο χρόνος, αλλά οι συντεταγμένες του σφάλματος: αριθμός γραμμής και στήλης. Η περιγραφή του σφάλματος μπορεί να μην σας λέει τίποτα, αλλά ξέρετε ακριβώς πού βρίσκεται. Απλώς κοιτάξτε αυτό το μέρος στον κώδικα και πιθανότατα όλα θα γίνουν ξεκάθαρα.

Όταν το yamllint δεν βρίσκει σφάλματα σε ένα αρχείο, τίποτα δεν εκτυπώνεται στην οθόνη. Εάν μια τέτοια σιωπή σας τρομάζει και θέλετε λίγο περισσότερη ανατροφοδότηση, τότε μπορείτε να εκτελέσετε το linter με την εντολή echo υπό όρους μέσω ενός διπλού σύμφωνου (&&), ως εξής:

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

Στο POSIX, ένα διπλό σύμφωνο ενεργοποιείται εάν και μόνο εάν η προηγούμενη εντολή επιστρέψει 0. Και το yamllint επιστρέφει απλώς τον αριθμό των σφαλμάτων που βρέθηκαν, γι' αυτό λειτουργεί όλη αυτή η υπό όρους κατασκευή.

2. Γράψτε σε Python, όχι YAML

Εάν το YAML σας εξοργίζει πραγματικά, απλά μην το γράφετε, κυριολεκτικά. Συμβαίνει ότι το YAML είναι η μόνη μορφή που κατανοεί η εφαρμογή. Αλλά ακόμη και σε αυτήν την περίπτωση, δεν είναι απαραίτητο να δημιουργήσετε ένα αρχείο YAML. Γράψτε σε αυτό που σας αρέσει και μετά μετατρέψτε. Για παράδειγμα, υπάρχει μια εξαιρετική βιβλιοθήκη για την Python pyyaml και δύο μεθόδους μετατροπής: αυτο-μετατροπή και μετατροπή μέσω σεναρίων.

Αυτομετατροπή

Σε αυτήν την περίπτωση, το αρχείο δεδομένων είναι επίσης ένα σενάριο Python που δημιουργεί YAML. Αυτή η μέθοδος είναι η πλέον κατάλληλη για μικρά σύνολα δεδομένων. Απλώς γράφετε τα δεδομένα JSON σε μια μεταβλητή Python, την προλογίζετε με μια οδηγία εισαγωγής και στο τέλος του αρχείου προσθέτετε τρεις γραμμές για να εφαρμόσετε την έξοδο.

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

Τώρα τρέχουμε αυτό το αρχείο στην Python και παίρνουμε το αρχείο 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

Αυτό είναι απολύτως έγκυρο YAML, αλλά το yamllint θα σας προειδοποιήσει ότι δεν ξεκινά με -. Λοιπόν, αυτό μπορεί εύκολα να διορθωθεί με το χέρι ή να τροποποιηθεί ελαφρώς στο σενάριο Python.

Μετατροπή μέσω σεναρίων

Σε αυτήν την περίπτωση, γράφουμε πρώτα σε JSON και, στη συνέχεια, εκτελούμε τον μετατροπέα ως ξεχωριστό σενάριο Python, το οποίο παράγει το YAML ως έξοδο. Σε σύγκριση με την προηγούμενη μέθοδο, αυτή η μέθοδος κλιμακώνεται καλύτερα, καθώς η μετατροπή είναι ξεχωριστή από τα δεδομένα.

Αρχικά, ας δημιουργήσουμε ένα αρχείο JSON example.json, για παράδειγμα, από το οποίο μπορείτε να το πάρετε 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"
			}
		  }
		}
	  }
	}

Στη συνέχεια, θα δημιουργήσουμε ένα απλό σενάριο μετατροπέα και θα το αποθηκεύσουμε με το όνομα json2yaml.py. Αυτό το σενάριο εισάγει λειτουργικές μονάδες YAML και JSON Python και φορτώνει ένα αρχείο JSON που καθορίζεται από το χρήστη, εκτελεί τη μετατροπή και εγγράφει τα δεδομένα στο αρχείο 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()

Αποθηκεύστε αυτό το σενάριο στη διαδρομή συστήματος και εκτελέστε το όπως απαιτείται:

$ ~/bin/json2yaml.py example.json

3. Αναλύστε πολύ και συχνά

Μερικές φορές είναι χρήσιμο να δούμε ένα πρόβλημα από διαφορετική οπτική γωνία. Εάν αντιμετωπίζετε πρόβλημα με την αναπαράσταση των σχέσεων μεταξύ των δεδομένων σας στο YAML, μπορείτε να τα μετατρέψετε προσωρινά σε κάτι πιο οικείο.

Για παράδειγμα, εάν αισθάνεστε άνετα να εργάζεστε με λίστες λεξικών ή JSON, μπορείτε να μετατρέψετε το YAML σε JSON με δύο μόνο εντολές στο διαδραστικό κέλυφος της Python. Ας υποθέσουμε ότι έχετε ένα αρχείο YAML mydata.yaml, τότε αυτό θα ήταν:

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

Μπορείτε να βρείτε πολλά άλλα παραδείγματα για αυτό το θέμα. Επιπλέον, υπάρχουν πολλοί διαδικτυακοί μετατροπείς και τοπικοί αναλυτές διαθέσιμοι. Επομένως, μη διστάσετε να διαμορφώσετε ξανά τα δεδομένα όταν βλέπετε μόνο ένα ακατανόητο μπέρδεμα σε αυτά.

4. Διαβάστε τις προδιαγραφές

Επιστρέφοντας στο YAML μετά από ένα μεγάλο διάλειμμα, είναι χρήσιμο να το επισκεφθείτε yaml.org και ξαναδιαβάστε τις προδιαγραφές (προδιαγραφές). Εάν αντιμετωπίζετε δυσκολίες με το YAML, αλλά δεν έχετε προσεγγίσει τις προδιαγραφές, τότε ήρθε η ώρα να διορθώσετε αυτήν την κατάσταση. Οι προδιαγραφές είναι εκπληκτικά εύκολο να γραφτούν και οι απαιτήσεις σύνταξης απεικονίζονται με μεγάλο αριθμό παραδειγμάτων στο Κεφάλαιο 6.

5. Ψευδοδιαμορφώσεις

Όταν γράφετε ένα βιβλίο ή ένα άρθρο, είναι πάντα χρήσιμο να σκιαγραφείτε πρώτα ένα προκαταρκτικό περίγραμμα, τουλάχιστον με τη μορφή πίνακα περιεχομένων. Το ίδιο συμβαίνει και με το YAML. Πιθανότατα, έχετε μια ιδέα για το ποια δεδομένα πρέπει να εγγραφούν σε ένα αρχείο YAML, αλλά δεν καταλαβαίνετε πραγματικά πώς να τα συνδέσετε μεταξύ τους. Επομένως, προτού σμιλέψετε το YAML, σχεδιάστε μια ψευδο-διαμόρφωση.

Το Pseudo-config είναι παρόμοιο με τον ψευδο-κώδικα, όπου δεν χρειάζεται να ανησυχείτε για τη δομή ή την εσοχή, τις σχέσεις γονέα-παιδιού, την κληρονομικότητα και την ένθεση. Είναι το ίδιο εδώ: σχεδιάζετε επαναλήψεις των δεδομένων καθώς προκύπτουν στο μυαλό σας.

10 βήματα για το YAML Zen

Προγραμματιστές καταχώρισης ψευδο-config (Martin και Tabitha) και τις δεξιότητές τους (γλώσσες προγραμματισμού: Python, Perl, Pascal και Lisp, Fortran, Erlang, αντίστοιχα).

Αφού σχεδιάσετε ένα ψευδο-config σε ένα κομμάτι χαρτί, αναλύστε το προσεκτικά και, εάν όλα είναι εντάξει, μορφοποιήστε το με τη μορφή ενός έγκυρου αρχείου YAML.

6. Το δίλημμα Tabs vs. Spaces

Θα πρέπει να λύσετε το δίλημμα "καρτέλες ή κενά;". Όχι με παγκόσμια έννοια, αλλά μόνο στο επίπεδο του οργανισμού σας, ή τουλάχιστον ενός έργου. Δεν έχει σημασία αν αυτό περιλαμβάνει τη χρήση μετα-επεξεργασίας με ένα σενάριο sed, τη ρύθμιση προγραμμάτων επεξεργασίας κειμένου σε μηχανές προγραμματιστών ή καθολική λήψη αποδείξεων αυστηρής συμμόρφωσης με τις οδηγίες του linter υπό την απειλή απόλυσης, αλλά όλα τα μέλη της ομάδας σας που σε με τον ένα ή τον άλλο τρόπο που σχετίζονται με το YAML πρέπει να χρησιμοποιούν μόνο κενά (όπως απαιτείται από την προδιαγραφή YAML).

Σε οποιοδήποτε κανονικό πρόγραμμα επεξεργασίας κειμένου, μπορείτε να διαμορφώσετε τις καρτέλες αυτόματης διόρθωσης σε έναν καθορισμένο αριθμό διαστημάτων, έτσι ώστε η εξέγερση των βασικών οπαδών Tab δεν χρειάζεται να φοβάσαι.

Όπως κάθε μισητής της YAML γνωρίζει καλά, δεν μπορείτε να δείτε τη διαφορά μεταξύ καρτελών και διαστημάτων στην οθόνη. Και όταν κάτι δεν είναι ορατό, είναι συνήθως το τελευταίο πράγμα που θυμούνται οι άνθρωποι, αφού τακτοποιήσουν, ελέγξουν και εξαλείψουν όλα τα άλλα πιθανά προβλήματα. Μια ώρα χρόνου που αφιερώνεται στην αναζήτηση μιας καμπύλης πίνακα ή ενός μπλοκ διαστημάτων απλώς φωνάζει ότι χρειάζεστε επειγόντως για να δημιουργήσετε μια πολιτική για τη χρήση του ενός ή του άλλου και στη συνέχεια να εφαρμόσετε έναν έλεγχο από οπλισμένο σκυρόδεμα για τη συμμόρφωσή του με αυτό (για παράδειγμα, μέσω ένα άγκιστρο Git για να το πιέσετε μέσα από μια ράβδο).

7. Το λιγότερο είναι περισσότερο (ή το περισσότερο είναι λιγότερο)

Σε κάποιους αρέσει να γράφουν σε YAML επειδή δίνει έμφαση στη δομή. Ταυτόχρονα, χρησιμοποιούν ενεργά την εσοχή για να επισημάνουν μπλοκ δεδομένων. Αυτό είναι ένα είδος απάτης για τη μίμηση γλωσσών σήμανσης που χρησιμοποιούν ρητούς οριοθέτες.

Εδώ είναι ένα παράδειγμα τέτοιας δομής από Ανεξάρτητη τεκμηρίωση:

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

Για κάποιους, αυτή η επιλογή τους βοηθά να ξεχωρίσουν τη δομή YAML στο κεφάλι τους· για άλλους, αντίθετα, τους ερεθίζει με πολλές περιττές, κατά τη γνώμη τους, εσοχές.

Αλλά αν είστε ο κάτοχος του εγγράφου YAML και είστε υπεύθυνοι για τη διατήρησή του, τότε εσύ και μόνο εσύ πρέπει να καθορίσει τον τρόπο χρήσης της εσοχής. Εάν σας ενοχλεί η μεγάλη επένδυση, κρατήστε την στο ελάχιστο δυνατό σύμφωνα με τις προδιαγραφές YAML. Για παράδειγμα, το παραπάνω αρχείο από την τεκμηρίωση του Ansible μπορεί να ξαναγραφτεί ως εξής χωρίς καμία απώλεια:

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

8. Χρησιμοποιήστε κενά

Εάν επαναλαμβάνετε συνεχώς τα ίδια λάθη όταν συμπληρώνετε ένα αρχείο YAML, είναι λογικό να εισάγετε ένα πρότυπο σε αυτό ως σχόλιο. Στη συνέχεια, την επόμενη φορά, μπορείτε απλώς να αντιγράψετε αυτό το πρότυπο και να εισαγάγετε πραγματικά δεδομένα εκεί, για παράδειγμα:

---
# - <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. Χρησιμοποιήστε κάτι διαφορετικό

Εάν η εφαρμογή δεν έχει ασφυξία επάνω σας, τότε ίσως αξίζει να αλλάξετε το YAML σε διαφορετική μορφή. Με την πάροδο του χρόνου, τα αρχεία διαμόρφωσης μπορεί να ξεπεράσουν τον εαυτό τους και, στη συνέχεια, είναι καλύτερο να τα μετατρέψετε σε απλά σενάρια σε Lua ή Python.

Το YAML είναι ένα υπέροχο πράγμα που πολλοί άνθρωποι αγαπούν για τον μινιμαλισμό και την απλότητά του, αλλά απέχει πολύ από το μόνο εργαλείο στο οπλοστάσιό σας. Έτσι μερικές φορές μπορείς να το αρνηθείς. Οι βιβλιοθήκες ανάλυσης είναι εύκολο να βρεθούν για το YAML, επομένως εάν προσφέρετε εύκολες επιλογές μετεγκατάστασης, οι χρήστες σας θα επιβιώσουν σχετικά ανώδυνα από αυτήν την αποτυχία.

Εάν δεν μπορείτε χωρίς το YAML, τότε λάβετε αυτές τις 10 συμβουλές και ξεπεράστε την απέχθειά σας για το YAML μια για πάντα!

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο