10 pasos para YAML Zen

A todos nos encanta Ansible, pero Ansible es YAML. Hay muchos formatos para archivos de configuración: listas de valores, pares parámetro-valor, archivos INI, YAML, JSON, XML y muchos otros. Sin embargo, por varias razones entre todas ellas, YAML a menudo se considera particularmente difícil. En particular, a pesar de su refrescante minimalismo y sus impresionantes capacidades para trabajar con valores jerárquicos, la sintaxis YAML puede resultar molesta con su enfoque de sangría similar a Python.

10 pasos para YAML Zen

Si YAML te molesta, puedes hacerlo, ¡y deberías hacerlo! – sigue los siguientes 10 pasos para reducir tu frustración a un nivel aceptable y enamórate de YAML. Como corresponde a esta lista, nuestros diez consejos estarán numerados desde cero, agregaremos meditación y prácticas espirituales a nuestro antojo 😉

0. Haz que tu editor funcione

No importa qué editor de texto tengas, probablemente haya al menos un complemento para trabajar con YAML. Si no tiene uno, búsquelo e instálelo inmediatamente. El tiempo dedicado a buscar y configurar dará sus frutos muchas veces cada vez que tenga que editar YAML.

Por ejemplo, editor Atom admite YAML de forma predeterminada, pero para GNU Emacs tendrá que instalar paquetes adicionales, por ejemplo, modo yaml.

10 pasos para YAML Zen

Emacs en modo YAML y mostrando espacios.

Si su editor favorito no tiene el modo YAML, algunos de los problemas se pueden resolver trabajando con la configuración. Por ejemplo, el editor de texto estándar de GNOME, Gedit, no tiene modo YAML, pero de forma predeterminada resalta la sintaxis YAML y le permite configurar el trabajo con sangrías:

10 pasos para YAML Zen

Establecer sangrías en Gedit.

Un complemento espacios de dibujo para Gedit, muestra espacios como puntos, eliminando ambigüedades con los niveles de sangría.

En otras palabras, dedica tiempo a aprender sobre tu editor favorito. Descubra lo que él o su comunidad de desarrollo tienen para ofrecer para trabajar con YAML y utilice esas funciones. Definitivamente no te arrepentirás.

1. Utilice un despuntador

Idealmente, los lenguajes de programación y los lenguajes de marcado utilizan una sintaxis predecible. Las computadoras son buenas para la previsibilidad, razón por la cual el concepto de lintera. Si en los 40 años de su existencia te ha pasado de largo y todavía no usas un linter YAML, entonces es hora de probar yamllint.

Instalar yamlint Puede utilizar el administrador de paquetes estándar de Linux. Por ejemplo, en Red Hat Enterprise Linux 8 o Fedora se hace así:

$ sudo dnf install yamllint

Luego simplemente ejecuta yamllint y le pasa el archivo YAML para verificar. Esto es lo que parece si pasas un archivo con un error al linter:

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

Los números de la izquierda no son la hora, sino las coordenadas del error: número de fila y columna. Puede que la descripción del error no te diga nada, pero sabes exactamente dónde está. Basta con mirar este lugar en el código y lo más probable es que todo quede claro.

Cuando yamllint no encuentra errores en un archivo, no se imprime nada en la pantalla. Si ese silencio te asusta y quieres un poco más de retroalimentación, entonces puedes ejecutar el linter con el comando de eco condicional mediante un signo doble (&&), como este:

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

En POSIX, un signo doble se activa si y solo si el comando anterior devuelve 0. Y yamllint simplemente devuelve la cantidad de errores encontrados, razón por la cual toda esta construcción condicional funciona.

2. Escribe en Python, no en YAML

Si YAML realmente te molesta, simplemente no escribas en él, literalmente. Sucede que YAML es el único formato que comprende la aplicación. Pero incluso en este caso, no es necesario crear un archivo YAML. Escribe lo que quieras y luego conviértelo. Por ejemplo, existe una gran biblioteca para Python. pyyaml y dos métodos de conversión: autoconversión y conversión mediante scripts.

Autoconversión

En este caso, el archivo de datos también es un script de Python que genera YAML. Este método es más adecuado para conjuntos de datos pequeños. Simplemente escriba los datos JSON en una variable de Python, prefacie con una directiva de importación y, al final del archivo, agregue 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: 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 es YAML perfectamente válido, pero yamllint le advertirá que no comienza con -. Bueno, esto se puede corregir fácilmente manualmente o modificar ligeramente en el script Python.

Conversión mediante scripts

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

Primero, creemos un archivo JSON ejemplo.json, por ejemplo, puedes tomarlo desde 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"
			}
		  }
		}
	  }
	}

Luego crearemos un script de conversión simple y lo guardaremos con el nombre json2yaml.py. Este script importa módulos Python YAML y JSON, carga un archivo JSON especificado 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 la ruta del sistema y ejecútelo según sea necesario:

$ ~/bin/json2yaml.py example.json

3. Analiza mucho y con frecuencia

A veces resulta útil mirar un problema desde un ángulo diferente. Si tiene problemas para representar las relaciones entre sus datos en YAML, puede transformarlos temporalmente en algo más familiar.

Por ejemplo, si se siente cómodo trabajando con listas de diccionarios o JSON, puede convertir YAML a JSON con solo dos comandos en el shell interactivo de Python. Digamos que tienes un archivo YAML mydata.yaml, entonces 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': 'Good article. Could be better.'}

Puede encontrar muchos otros ejemplos sobre este tema. Además, hay muchos convertidores en línea y analizadores locales disponibles. Así que no dude en reformatear los datos cuando solo vea una confusión incomprensible en ellos.

4. Lee las especificaciones

Volviendo a YAML después de un largo descanso, es útil visitar yaml.org y releer las especificaciones (specs). Si tiene dificultades con YAML, pero no ha cumplido con las especificaciones, entonces es hora de corregir esta situación. Las especificaciones son sorprendentemente fáciles de escribir y los requisitos de sintaxis se ilustran con una gran cantidad de ejemplos en Capítulo 6.

5. Pseudoconfiguraciones

Al escribir un libro o artículo, siempre es útil esbozar primero un esquema preliminar, al menos en forma de índice. Es lo mismo con YAML. Lo más probable es que tenga una idea de qué datos deben escribirse en un archivo YAML, pero no comprende realmente cómo conectarlos entre sí. Por lo tanto, antes de esculpir YAML, dibuje una pseudoconfiguración.

La pseudoconfiguración es similar al pseudocódigo, donde no tiene que preocuparse por la estructura o la sangría, las relaciones entre padres e hijos, la herencia y el anidamiento. Aquí ocurre lo mismo: dibujas iteraciones de los datos a medida que surgen en tu cabeza.

10 pasos para YAML Zen

Pseudo-config enumerando programadores (Martin y Tabitha) y sus habilidades (lenguajes de programación: Python, Perl, Pascal y Lisp, Fortran, Erlang, respectivamente).

Después de dibujar una pseudoconfiguración en una hoja de papel, analícela cuidadosamente y, si todo está en orden, formatéela como un archivo YAML válido.

6. El dilema de las pestañas versus los espacios

Tendrás que resolver el dilema. “¿tabulaciones o espacios?”. No en un sentido global, sino sólo a nivel de su organización, o al menos de un proyecto. No importa si esto implica el uso de posprocesamiento con un script sed, la instalación de editores de texto en las máquinas de los programadores o la obtención universal de recibos de cumplimiento estricto de las instrucciones del linter bajo amenaza de despido, pero todos los miembros de su equipo que en de una forma u otra se relacionan con YAML deben usar solo espacios (como lo requiere la especificación YAML).

En cualquier editor de texto normal, puede configurar pestañas de autocorrección en un número específico de espacios, para que la rebelión de los seguidores clave Tab audio no tienes que tener miedo.

Como bien saben todos los que odian YAML, no se puede ver la diferencia entre pestañas y espacios en la pantalla. Y cuando algo no es visible, suele ser lo último que la gente recuerda, después de haber clasificado, comprobado y eliminado todos los demás posibles problemas. Una hora de tiempo dedicada a buscar una curva de tabulación o un bloque de espacios simplemente grita que es urgente crear una política para el uso de uno u otro, y luego implementar una verificación de concreto armado para su cumplimiento (por ejemplo, a través de un gancho Git para forzarlo a través de un linter).

7. Menos es más (o más es menos)

A algunas personas les gusta escribir en YAML porque enfatiza la estructura. Al mismo tiempo, utilizan activamente la sangría para resaltar bloques de datos. Se trata de una especie de estafa para imitar lenguajes de marcado que utilizan delimitadores explícitos.

A continuación se muestra un ejemplo de dicha estructura 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 algunos, esta opción les ayuda a entender la estructura YAML en sus cabezas, para otros, por el contrario, les molesta con muchas sangrías innecesarias, en su opinión.

Pero si usted es el propietario del documento YAML y es responsable de mantenerlo, entonces tu y solo tu debe definir cómo utilizar la sangría. Si le molesta el relleno grande, manténgalo al mínimo posible según la especificación YAML. Por ejemplo, el archivo anterior de la documentación de Ansible se puede reescribir así sin ninguna pérdida:

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

8. Utilice espacios en blanco

Si repite constantemente los mismos errores al completar un archivo YAML, tiene sentido insertar una plantilla como comentario. Luego, la próxima vez podrás simplemente copiar esta plantilla e ingresar datos reales allí, por ejemplo:

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

Si la aplicación no tiene dominio absoluto sobre usted, entonces podría valer la pena cambiar el YAML a un formato diferente. Con el tiempo, los archivos de configuración pueden superar su tamaño y entonces es mejor convertirlos en scripts simples en Lua o Python.

YAML es una gran cosa que a mucha gente le encanta por su minimalismo y simplicidad, pero está lejos de ser la única herramienta en su arsenal. Entonces a veces puedes rechazarlo. Las bibliotecas de análisis son fáciles de encontrar para YAML, por lo que si ofrece opciones de migración sencillas, sus usuarios sobrevivirán a este fallo con relativa facilidad.

Si no puedes prescindir de YAML, sigue estos 10 consejos y supera tu aversión por YAML de una vez por todas.

Fuente: habr.com

Añadir un comentario