10 pasos hacia el zen de YAML

Todos amamos Ansible, pero Ansible es YAML. Hay muchos formatos para archivos de configuración: listas de valores, pares 'clave-valor', archivos INI, YAML, JSON, XML y muchos otros. Sin embargo, por varias razones, YAML a menudo se considera particularmente complicado. En particular, a pesar de su refrescante minimalismo y sus impresionantes capacidades para trabajar con valores jerárquicos, la sintaxis de YAML puede resultar molesta debido a su enfoque al estilo Python sobre los espacios en blanco.

10 pasos hacia el zen de YAML

Si YAML te molesta, puedes – y deberías! – tomar los siguientes 10 pasos para reducir tu irritación a un nivel aceptable y aprender a amar YAML. Como buen listado, nuestra decena de consejos comenzará desde cero, añadiendo meditación y prácticas espirituales si lo deseas 😉

0. Haz que tu editor trabaje

No importa qué editor de texto uses, seguramente exista al menos un complemento para trabajar con YAML. Si no tienes uno, encuentra e instálalo de inmediato. El tiempo invertido en buscar y configurar será recompensado cada vez que tengas que editar YAML.

Por ejemplo, el editor Atom soporta YAML por defecto, mientras que para GNU Emacs tendrás que instalar paquetes adicionales, como yaml-mode.

10 pasos hacia el zen de YAML

Emacs en modo YAML y mostrando espacios en blanco.

Si tu editor favorito no tiene modo YAML, parte de los problemas se pueden resolver trabajando con la configuración. Por ejemplo, el editor de texto Gedit, que viene por defecto con GNOME, no tiene un modo YAML, pero resalta la sintaxis de YAML por defecto y permite configurar la indentación:

10 pasos hacia el zen de YAML

Configuración de la indentación en Gedit.

Y el complemento drawspaces para Gedit muestra los espacios como puntos, eliminando la confusión con los niveles de indentación.

En otras palabras, dedica tiempo a aprender sobre tu editor favorito. Averigua qué ofrece por sí mismo o su comunidad de desarrollo para trabajar con YAML y utiliza estas posibilidades. No te arrepentirás.

1. Usa un linter

Idealmente, los lenguajes de programación y los lenguajes de marcado utilizan una sintaxis predecible. Las computadoras manejan bien la previsibilidad, por lo que, desde 1978, existe el concepto de linter. Si durante 40 años se te ha pasado por alto y aún no usas un linter para YAML, es hora de probar yamllint.

Instalar yamllint se puede hacer con el gestor de paquetes estándar de Linux. Por ejemplo, en Red Hat Enterprise Linux 8 o Fedora así es como se hace:

$ sudo dnf install yamllint

Luego solo ejecutas yamllint, pasándole el archivo YAML para verificar. Así es como se ve si le pasas un archivo con errores:

$ yamllint errorprone.yaml
errorprone.yaml
23:10     error    error de sintaxis: no se permiten valores de mapeo aquí
23:11     error    espacios en blanco al final (trailing-spaces)

Los números de la izquierda no son tiempos, sino coordenadas del error: número de línea y columna. La descripción del error puede no decirte nada, pero sabes exactamente dónde se encuentra. Solo mira ese lugar en el código y, lo más probable, todo se aclarará.

Cuando yamllint no encuentra errores en el archivo, no se muestra nada en la pantalla. Si te asusta ese silencio y deseas un poco más de retroalimentación, puedes ejecutar el linter con un comando condicional echo a través de un doble ampersand (&&), así:

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

En POSIX, el doble ampersand se activa solo cuando el comando anterior devuelve 0. Y yamllint devuelve la cantidad de errores encontrados, por eso toda esta construcción condicional funciona.

2. Escribe en Python, no en YAML

Si realmente te molesta YAML, simplemente no escribas en él, en sentido literal. A veces, YAML es el único formato que acepta la aplicación. Pero incluso en este caso no es necesario crear un archivo YAML. Escribe en el lenguaje que prefieras y luego convierte. Por ejemplo, para Python hay una excelente biblioteca pyyaml y hay dos formas de convertir: autoconversión y conversión a través de scripts.

Autoconversión

En este caso, el archivo de datos también es un script de Python que genera YAML. Este método es el mejor para conjuntos de datos pequeños. Simplemente escribes los datos JSON en una variable de Python, precediéndolo con la directiva import, y al final del archivo agregas tres líneas para implementar la salida.

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

Ahora ejecutamos este archivo en Python y obtenemos el archivo output.yaml:

$ python3 ./example.json
$ cat output.yaml
glossary:
  GlossDiv:
	GlossList:
	  GlossEntry:
		Abbrev: ISO 8879:1986
		Acronym: SGML
		GlossDef:
		  GlossSeeAlso: [GML, XML]
		  para: Un lenguaje de metamarcado, utilizado para crear lenguajes de marcado como DocBook.
		GlossSee: marcado
		GlossTerm: Lenguaje de Marcado Generalizado Estándar
		ID: SGML
		SortAs: SGML
	title: S
  title: glosario de ejemplo

Este es un YAML absolutamente correcto, pero yamllint emitirá una advertencia de que no comienza con —. Bueno, esto se puede corregir fácilmente a mano o afinar un poco el script de Python.

Conversión a través de scripts

En este caso, primero escribimos en JSON y luego ejecutamos el conversor como un script de Python separado, que produce YAML como salida. En comparación con el anterior, este método se escala mejor, ya que la conversión está separada de los datos.

Primero crearemos un archivo JSON example.json, por ejemplo, se puede obtener en json.org:

{
	"glossary": {
	  "title": "ejemplo de glosario",
	  "GlossDiv": {
		"title": "S",
		"GlossList": {
		  "GlossEntry": {
			"ID": "SGML",
			"SortAs": "SGML",
			"GlossTerm": "Lenguaje de Marcado Generalizado Estándar",
			"Acronym": "SGML",
			"Abbrev": "ISO 8879:1986",
			"GlossDef": {
			  "para": "Un lenguaje de meta-marcado, utilizado para crear lenguajes de marcado como DocBook.",
			  "GlossSeeAlso": ["GML", "XML"]
			  },
			"GlossSee": "marcado"
			}
		  }
		}
	  }
	}

Luego crearemos un script convertidor simple y lo guardaremos como json2yaml.py. Este script importa ambos módulos: YAML y JSON de Python, y carga el archivo JSON indicado por el usuario, realiza la conversión y escribe los datos en el archivo 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()

Guarde este script en el path del sistema y ejecútelo según sea necesario:

$ ~/bin/json2yaml.py example.json

3. Analiza mucho y a menudo

A veces, es útil observar el problema desde un ángulo diferente. Si te cuesta imaginar las relaciones entre los datos en YAML, puedes convertir temporalmente esos datos a algo más familiar.

Por ejemplo, si te resulta cómodo trabajar con listas de diccionarios o con JSON, puedes convertir YAML a JSON con solo dos comandos en el intérprete interactivo de Python. Supongamos que tienes un archivo YAML mydata.yaml, así es como se verí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': 'Buen artículo. Podría ser mejor.'}

Hay muchos otros ejemplos sobre este tema. Además, existen numerosos conversores en línea y analizadores locales. Así que no dudes en reformatear los datos cuando veas en ellos solo un desorden incomprensible.

4. Lee las especificaciones

Volviendo a YAML después de un largo tiempo, es útil visitar yaml.org y leer las especificaciones. Si tienes dificultades con YAML, pero no has llegado a leer las especificaciones, es hora de corregir esa situación. Las especificaciones están sorprendentemente bien escritas, y los requisitos de sintaxis se ilustran con muchos ejemplos en Capítulo 6.

5. Pseudoconfigs

Al escribir un libro o artículo, siempre es útil primero esbozar un plan preliminar, al menos en forma de índice. Lo mismo ocurre con YAML. Probablemente, tienes una idea de qué datos necesitas registrar en el archivo YAML, pero no estás seguro de cómo enlazarlos entre sí. Así que antes de crear YAML, dibuja un pseudoconfiguración.

La pseudoconfiguración es similar al pseudocódigo, donde no es necesario preocuparse por la estructura o la indentación, las relaciones 'padre-hijo', la herencia y la anidación. Aquí también: dibujas las iteraciones de datos a medida que se te ocurren.

10 pasos hacia el zen de YAML

Pseudoconfiguración con la enumeración de programadores (Martin y Tabitha) y sus habilidades (lenguajes de programación: Python, Perl, Pascal y Lisp, Fortran, Erlang, respectivamente).

Una vez que hayas dibujado la pseudoconfiguración en una hoja de papel, analízala detenidamente y, si todo está en orden, formalízala como un archivo YAML válido.

6. El dilema 'tabulaciones o espacios'

Tendrás que resolver el dilema '¿tabulaciones o espacios?'. No a nivel global, sino solo dentro de tu organización, o al menos dentro del proyecto. No importa si se utiliza un script sed para el post-procesamiento, la configuración de editores de texto en las máquinas de los programadores o si se exigen recibos de cumplimiento estricto de las indicaciones del linter bajo la amenaza de despido, pero todos los miembros de tu equipo que tengan alguna relación con YAML deben usar solo espacios (como lo exige la especificación YAML).

En cualquier editor de texto normal, se puede configurar la autocorrección de tabulaciones por un número determinado de espacios, por lo que no hay que temer una revuelta entre los partidarios de la tecla Tab .

Como es bien sabido por cada enemigo de YAML, en la pantalla no se ve la diferencia entre tabulaciones y espacios. Y cuando algo no es visible, por lo general se recuerda en último lugar, después de haber revisado y resuelto todos los demás problemas posibles. Una hora perdida buscando una tabulación defectuosa o un bloque de espacios grita que necesitas crear urgentemente una política de uso de uno u otro, y luego implementar un control estricto para garantizar su cumplimiento (por ejemplo, a través de un hook de Git para forzar la ejecución de un linter).

7. Mejor menos que más (o más es menos)

A algunas personas les gusta escribir en YAML, ya que resalta la estructura. Utilizan activamente la indentación para distinguir los bloques de datos. Este es un tipo de trampa para simular lenguajes de marcado, que utilizan separadores explícitos.

Aquí hay un ejemplo de tal estructuración de la documentación de Ansible:

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

A algunos, esta opción les ayuda a organizar en su mente la estructura de YAML, mientras que a otros les irrita la cantidad de sangrías innecesarias, a su juicio.

Pero si usted es el propietario de un documento YAML y es responsable de su mantenimiento, entonces usted y solo usted debe determinar cómo utilizar las sangrías. Si le molestan las sangrías grandes, redúzcalas al mínimo permitido por la especificación de YAML. Por ejemplo, el archivo mencionado anteriormente de la documentación de Ansible se puede reescribir de esta manera sin pérdida alguna:

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

8. Use plantillas

Si al llenar un archivo YAML constantemente comete los mismos errores, tiene sentido insertar en él una plantilla como comentario. Entonces, la próxima vez podrá simplemente copiar esta plantilla y escribir los datos reales, por ejemplo:

---
# - <nombre común>:
#   name: Apellido dado
#   job: OCUPACIÓN
#   skills:
#   - LENGUAJE
- martin:
  name: Martin D'vloper
  job: Developer
  skills:
  - python
  - perl
  - pascal
- tabitha:
  name: Tabitha Bitumen
  job: Developer
  skills:
  - lisp
  - fortran
  - erlang

9. Utilice algo diferente

Si la aplicación no lo mantiene atado, tal vez deba cambiar YAML por otro formato. Con el tiempo, los archivos de configuración pueden volverse obsoletos, y es mejor convertirlos en simples scripts en Lua o Python.

YAML es una gran herramienta, que muchos aprecian por su minimalismo y simplicidad, pero no es el único recurso en su arsenal. Por lo tanto, a veces puede renunciar a él. Es fácil encontrar bibliotecas de análisis para YAML, así que si usted propone opciones de migración accesibles, sus usuarios podrán manejar ese cambio sin mayores contratiempos.

Si no puede prescindir de YAML, entonces tome en cuenta estos 10 consejos y venza su aversión a YAML de una vez por todas.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster