10 pasos para YAML Zen

A todos amamos Ansible, pero Ansible é YAML. Hai moitos formatos para os ficheiros de configuración: listas de valores, pares parámetro-valor, ficheiros INI, YAML, JSON, XML e moitos outros. Non obstante, por varias razóns de todas elas, YAML adoita considerarse particularmente difícil. En particular, a pesar do seu minimalismo refrescante e das súas impresionantes capacidades para traballar con valores xerárquicos, a sintaxe YAML pode resultar molesta co seu enfoque de sangría similar a Python.

10 pasos para YAML Zen

Se YAML te cabrea, podes e deberías! – toma os seguintes 10 pasos para reducir a túa frustración a un nivel aceptable e namórate de YAML. Como corresponde a esta lista, os nosos dez consellos estarán numerados desde cero, engadiremos meditación e prácticas espirituais a vontade 😉

0. Fai que o teu editor funcione

Non importa o editor de texto que teñas, probablemente haxa polo menos un complemento para traballar con YAML. Se non tes un, busca e instálao inmediatamente. O tempo que dediques á procura e á configuración dará vantaxes moitas veces cada vez que teñas que editar YAML.

Por exemplo, editor Átomo admite YAML por defecto, pero para GNU Emacs terás que instalar paquetes adicionais, por exemplo, modo-yaml.

10 pasos para YAML Zen

Emacs en modo YAML e mostrando espazos.

Se o teu editor favorito non ten un modo YAML, algúns dos problemas pódense resolver traballando coa configuración. Por exemplo, o editor de texto estándar de GNOME Gedit non ten un modo YAML, pero por defecto destaca a sintaxe YAML e permíteche configurar o traballo con sangrías:

10 pasos para YAML Zen

Establecer sangrías en Gedit.

Un complemento espazos de debuxo para Gedit, mostra os espazos como puntos, eliminando ambigüidades cos niveis de sangría.

Noutras palabras, pase tempo aprendendo sobre o teu editor favorito. Descubra o que el ou a súa comunidade de desenvolvemento teñen para ofrecer para traballar con YAML e utiliza esas funcións. Seguro que non te arrepentirás.

1. Usa un linter

Idealmente, as linguaxes de programación e as linguaxes de marcado usan unha sintaxe previsible. Os ordenadores son bos en previsibilidade, polo que o concepto de lintera. Se nos 40 anos da súa existencia pasou por ti e aínda non usas un linter YAML, entón é hora de probar yamllint.

Instala yamllint Podes usar o xestor de paquetes estándar de Linux. Por exemplo, en Red Hat Enterprise Linux 8 ou Fedora Faise así:

$ sudo dnf install yamllint

Entón simplemente executa yamllint, pasándolle o ficheiro YAML para comprobar. Isto é o que parece se pasas un ficheiro cun erro ao linter:

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

Os números da esquerda non son a hora, senón as coordenadas do erro: número de fila e columna. A descrición do erro pode non dicirche nada, pero sabes exactamente onde está. Basta con mirar este lugar no código, e moi probablemente todo quedará claro.

Cando yamllint non atopa erros nun ficheiro, non se imprime nada na pantalla. Se tal silencio te asusta e queres un pouco máis de comentarios, podes executar o linter co comando de eco condicional mediante un dobre e (&&), así:

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

En POSIX, un dobre ampersand dispara se e só se o comando anterior devolve 0. E yamllint só devolve o número de erros atopados, polo que funciona toda esta construción condicional.

2. Escribe en Python, non en YAML

Se YAML realmente te cabrea, simplemente non escribas nel, literalmente. Ocorre que YAML é o único formato que entende a aplicación. Pero mesmo neste caso, non é necesario crear un ficheiro YAML. Escribe o que che gusta e despois convérteo. Por exemplo, hai unha gran biblioteca para Python piyaml e dous métodos de conversión: autoconversión e conversión mediante scripts.

Autoconversión

Neste caso, o ficheiro de datos tamén é un script de Python que xera YAML. Este método é o máis adecuado para pequenos conxuntos de datos. Só tes que escribir os datos JSON nunha variable de Python, prefacelo cunha directiva de importación e, ao final do ficheiro, engade tres liñas para implementar a saída.

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

Agora executamos este ficheiro en Python e obtemos o ficheiro 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

Este YAML é perfectamente válido, pero yamllint avisará de que non comeza por -. Ben, isto pódese corrixir facilmente manualmente ou modificar lixeiramente no script de Python.

Conversión mediante scripts

Neste caso, primeiro escribimos en JSON e despois executamos o conversor como un script Python separado, que produce YAML como saída. En comparación co método anterior, este método escala mellor, xa que a conversión está separada dos datos.

Primeiro, imos crear un ficheiro JSON example.json, por exemplo, podes tomalo de 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 continuación, crearemos un script de conversor sinxelo e gardaremos co nome json2yaml.py. Este script importa módulos YAML e JSON Python e carga un ficheiro JSON especificado polo usuario, realiza a conversión e escribe os datos no ficheiro 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()

Garda este script na ruta do sistema e execútao segundo sexa necesario:

$ ~/bin/json2yaml.py example.json

3. Analiza moito e a miúdo

Ás veces é útil mirar un problema desde un ángulo diferente. Se tes problemas para representar as relacións entre os teus datos en YAML, podes transformalos temporalmente en algo máis familiar.

Por exemplo, se estás cómodo traballando con listas de dicionario ou JSON, podes converter YAML en JSON con só dous comandos no shell interactivo de Python. Digamos que tes un ficheiro YAML mydata.yaml, entón así sería:

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

Podes atopar moitos outros exemplos sobre este tema. Ademais, hai moitos conversores en liña e analizadores locais dispoñibles. Polo tanto, non dubides en reformatear os datos cando vexas só un revolto incomprensible nel.

4. Le as especificacións

Volvendo a YAML despois dunha longa pausa, é útil visitalo yaml.org e volva ler as especificacións (especificacións). Se tes dificultades con YAML, pero non alcanzaches a especificación, é hora de corrixir esta situación. As especificacións son sorprendentemente fáciles de escribir, e os requisitos de sintaxe están ilustrados cunha gran cantidade de exemplos en Capítulo 6.

5. Pseudo-configs

Ao escribir un libro ou artigo, sempre é útil esbozar primeiro un esquema preliminar, polo menos en forma de índice. É o mesmo con YAML. O máis probable é que teñas unha idea de que datos hai que escribir nun ficheiro YAML, pero realmente non entendes como conectalos entre si. Polo tanto, antes de esculpir YAML, debuxa unha pseudo-configuración.

Pseudo-config é semellante ao pseudo-código, no que non tes que preocuparte pola estrutura ou sangría, as relacións entre pais e fillos, a herdanza e a anidación. Aquí pasa o mesmo: debuxas iteracións dos datos a medida que xorden na túa cabeza.

10 pasos para YAML Zen

Programadores de listas de pseudoconfiguración (Martin e Tabitha) e as súas habilidades (linguaxes de programación: Python, Perl, Pascal e Lisp, Fortran, Erlang, respectivamente).

Despois de debuxar unha pseudo-configuración nun anaco de papel, analízaa coidadosamente e, se todo está en orde, formatea en forma de ficheiro YAML válido.

6. O dilema das pestanas contra os espazos

Terás que resolver o dilema "pestanas ou espazos?". Non nun sentido global, senón só a nivel da túa organización, ou polo menos dun proxecto. Non importa se isto implica usar un post-procesamento cun script sed, configurar editores de texto nas máquinas dos programadores ou recibir de forma universal recibos de estrito cumprimento das instrucións do linter baixo ameaza de despedimento, pero todos os membros do seu equipo que dun xeito ou doutro relacionarse con YAML debe usar só espazos (como esixe a especificación YAML).

En calquera editor de texto normal, pode configurar as pestanas de corrección automática para un número especificado de espazos, polo que a rebelión dos principais adherentes Aba non tes que ter medo.

Como todos os que odian YAML saben ben, non podes ver a diferenza entre as pestanas e os espazos na pantalla. E cando algo non é visible, adoita ser o último que recorda a xente, despois de resolver, comprobar e eliminar todos os demais problemas posibles. Unha hora de tempo dedicado a buscar unha curva de tabulación ou un bloque de espazos simplemente grita que precisa urxentemente para crear unha política para o uso dun ou outro e, a continuación, implementar unha comprobación de cumprimento do formigón armado (por exemplo, mediante un gancho Git para forzalo a través dun linter).

7. Menos é máis (ou máis é menos)

Algunhas persoas gústalles escribir en YAML porque enfatiza a estrutura. Ao mesmo tempo, usan activamente a sangría para resaltar bloques de datos. Esta é unha especie de estafa para imitar linguaxes de marcado que usan delimitadores explícitos.

Aquí tes un exemplo de tal estrutura de Documentación Ansible:

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

Para algúns, esta opción axúdalles a resolver a estrutura YAML na súa cabeza; para outros, pola contra, irritalles con moitas sangrías innecesarias, na súa opinión.

Pero se es o propietario do documento YAML e é responsable de mantelo, entón ti e só ti debe definir como usar a sangría. Se che molesta o acolchado grande, manténo ao mínimo posible segundo a especificación YAML. Por exemplo, o ficheiro anterior da documentación de Ansible pódese reescribir así sen ningunha perda:

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

8. Usa espazos en branco

Se repites constantemente os mesmos erros ao cubrir un ficheiro YAML, ten sentido inserir un modelo nel como comentario. A próxima vez pode simplemente copiar este modelo e introducir datos reais alí, por exemplo:

---
# - <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. Usa algo diferente

Se a aplicación non ten un control sobre ti, pode valer a pena cambiar o YAML a un formato diferente. Co paso do tempo, os ficheiros de configuración poden superarse e entón é mellor convertelos en scripts sinxelos en Lua ou Python.

YAML é unha gran cousa que moitas persoas adoran polo seu minimalismo e sinxeleza, pero dista moito de ser a única ferramenta do teu arsenal. Así que ás veces podes rexeitalo. As bibliotecas de análise para YAML son fáciles de atopar, polo que se ofrece opcións de migración sinxelas, os usuarios sobrevivirán a este fallo de forma relativamente sen dor.

Se non podes prescindir de YAML, toma estes 10 consellos e supera a túa aversión por YAML dunha vez por todas.

Fonte: www.habr.com

Engadir un comentario