10 etapas para YAML Zen

Todos nós amamos o Ansible, mas Ansible é YAML. Existem muitos formatos para arquivos de configuração: listas de valores, pares parâmetro-valor, arquivos INI, YAML, JSON, XML e muitos outros. No entanto, por vários motivos, o YAML é frequentemente considerado particularmente difícil. Em particular, apesar de seu minimalismo refrescante e capacidades impressionantes para trabalhar com valores hierárquicos, a sintaxe YAML pode ser irritante com sua abordagem de indentação semelhante ao Python.

10 etapas para YAML Zen

Se o YAML te irrita, você pode – e deve! – siga as 10 etapas a seguir para reduzir sua frustração a um nível aceitável e se apaixonar pelo YAML. Como convém a esta lista, nossas dez dicas serão numeradas do zero, adicionaremos meditação e práticas espirituais à vontade 😉

0. Faça seu editor funcionar

Não importa qual editor de texto você possui, provavelmente existe pelo menos um plugin para trabalhar com YAML. Se você não tiver um, encontre-o e instale-o imediatamente. O tempo gasto na pesquisa e configuração será recompensado muitas vezes sempre que você precisar editar o YAML.

Por exemplo, redator Atom suporta YAML por padrão, mas para GNU Emacs você terá que instalar pacotes adicionais, por exemplo, modo yaml.

10 etapas para YAML Zen

Emacs no modo YAML e exibindo espaços.

Se o seu editor favorito não tiver o modo YAML, alguns dos problemas podem ser resolvidos trabalhando com as configurações. Por exemplo, o editor de texto GNOME padrão Gedit não possui um modo YAML, mas por padrão destaca a sintaxe YAML e permite configurar o trabalho com recuos:

10 etapas para YAML Zen

Configurando recuos no Gedit.

Um plug-in espaços de desenho para Gedit, exibe espaços como pontos, eliminando ambigüidades com níveis de recuo.

Em outras palavras, passe algum tempo aprendendo sobre seu editor favorito. Descubra o que ele ou sua comunidade de desenvolvimento tem a oferecer para trabalhar com YAML e use esses recursos. Você definitivamente não vai se arrepender.

1. Use um linter

Idealmente, as linguagens de programação e de marcação usam sintaxe previsível. Os computadores são bons em previsibilidade, e é por isso que o conceito de lintera. Se nos 40 anos de existência ele passou por você e você ainda não usa um linter YAML, então é hora de experimentar o yamllint.

Instalar yamllint Você pode usar o gerenciador de pacotes padrão do Linux. Por exemplo, em Red Hat Enterprise Linux 8 ou Fedora é feito assim:

$ sudo dnf install yamllint

Então você simplesmente executa o yamllint, passando o arquivo YAML para verificação. Isto é o que acontece se você passar um arquivo com erro para o 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 à esquerda não são a hora, mas as coordenadas do erro: número da linha e da coluna. A descrição do erro pode não lhe dizer nada, mas você sabe exatamente onde ele está. Basta olhar para este local no código e provavelmente tudo ficará claro.

Quando o yamllint não encontra erros em um arquivo, nada é impresso na tela. Se esse silêncio assusta você e você deseja um pouco mais de feedback, você pode executar o linter com o comando de eco condicional por meio de um e comercial duplo (&&), assim:

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

No POSIX, um E comercial duplo é acionado se e somente se o comando anterior retornar 0. E o yamllint apenas retorna o número de erros encontrados, e é por isso que toda essa construção condicional funciona.

2. Escreva em Python, não em YAML

Se o YAML realmente te irrita, simplesmente não escreva nele, literalmente. Acontece que YAML é o único formato que a aplicação entende. Mas mesmo neste caso não é necessário criar um arquivo YAML. Escreva o que você gosta e depois converta. Por exemplo, existe uma ótima biblioteca para Python pyyaml e dois métodos de conversão: autoconversão e conversão por meio de scripts.

Autoconversão

Neste caso, o arquivo de dados também é um script Python que gera YAML. Este método é mais adequado para pequenos conjuntos de dados. Você simplesmente escreve os dados JSON em uma variável Python, prefacia-os com uma diretiva de importação e, no final do arquivo, adiciona três linhas 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 arquivo em Python e obtemos o arquivo 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 é um YAML perfeitamente válido, mas o yamllint irá avisá-lo de que não começa com -. Bem, isso pode ser facilmente corrigido manualmente ou ligeiramente modificado no script Python.

Conversão via scripts

Nesse caso, primeiro escrevemos em JSON e depois executamos o conversor como um script Python separado, que produz YAML como saída. Comparado ao método anterior, este método é melhor dimensionado, pois a conversão é separada dos dados.

Primeiro, vamos criar um arquivo JSON example.json, por exemplo, você pode pegá-lo em 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"
			}
		  }
		}
	  }
	}

Em seguida, criaremos um script conversor simples e o salvaremos com o nome json2yaml.py. Este script importa módulos YAML e JSON Python e carrega um arquivo JSON especificado pelo usuário, executa a conversão e grava os dados no arquivo 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()

Salve este script no caminho do sistema e execute-o conforme necessário:

$ ~/bin/json2yaml.py example.json

3. Analise muito e com frequência

Às vezes é útil olhar para um problema de um ângulo diferente. Se estiver com problemas para representar os relacionamentos entre seus dados em YAML, você poderá transformá-los temporariamente em algo mais familiar.

Por exemplo, se você se sentir confortável trabalhando com listas de dicionário ou JSON, poderá converter YAML em JSON com apenas dois comandos no shell Python interativo. Digamos que você tenha um arquivo YAML mydata.yaml, então seria assim:

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

Você pode encontrar muitos outros exemplos sobre este tópico. Além disso, existem muitos conversores online e analisadores locais disponíveis. Portanto, não hesite em reformatar os dados quando vir apenas uma confusão incompreensível neles.

4. Leia as especificações

Voltando ao YAML após uma longa pausa, é útil visitar yaml.org e releia as especificações (especificações). Se você tiver dificuldades com YAML, mas ainda não chegou à especificação, então é hora de corrigir esta situação. As especificações são surpreendentemente fáceis de escrever e os requisitos de sintaxe são ilustrados com um grande número de exemplos em Capítulo 6.

5. Pseudo-configurações

Ao escrever um livro ou artigo, é sempre útil esboçar primeiro um esboço preliminar, pelo menos na forma de um índice. É o mesmo com YAML. Provavelmente, você tem uma ideia de quais dados precisam ser gravados em um arquivo YAML, mas não entende realmente como conectá-los. Portanto, antes de esculpir o YAML, desenhe uma pseudoconfiguração.

A pseudoconfiguração é semelhante ao pseudocódigo, onde você não precisa se preocupar com estrutura ou indentação, relacionamentos pai-filho, herança e aninhamento. É a mesma coisa aqui: você desenha iterações dos dados conforme eles surgem na sua cabeça.

10 etapas para YAML Zen

Programadores de listagem de pseudo-configuração (Martin e Tabitha) e suas habilidades (linguagens de programação: Python, Perl, Pascal e Lisp, Fortran, Erlang, respectivamente).

Após desenhar uma pseudoconfiguração em um pedaço de papel, analise-a cuidadosamente e, se tudo estiver em ordem, formate-a na forma de um arquivo YAML válido.

6. O dilema das guias versus espaços

Você terá que resolver o dilema “guias ou espaços?”. Não no sentido global, mas apenas no nível da sua organização, ou pelo menos de um projeto. Não importa se isso envolve o uso de pós-processamento com um script sed, a instalação de editores de texto nas máquinas dos programadores ou a obtenção universal de recibos de estrita conformidade com as instruções do linter sob ameaça de demissão, mas todos os membros de sua equipe que em de uma forma ou de outra relacionados ao YAML devem usar apenas espaços (conforme exigido pela especificação YAML).

Em qualquer editor de texto normal, você pode configurar guias de correção automática para um número específico de espaços, para que a rebelião dos principais adeptos Aba você não precisa ter medo.

Como todo odiador de YAML sabe bem, você não consegue ver a diferença entre tabulações e espaços na tela. E quando algo não está visível, geralmente é a última coisa que as pessoas lembram, depois de terem resolvido, verificado e eliminado todos os outros possíveis problemas. Uma hora gasta procurando uma curva de tabulação ou um bloco de espaços simplesmente grita que você precisa criar urgentemente uma política para o uso de um ou de outro e, em seguida, implementar uma verificação de concreto armado para conformidade com ela (por exemplo, por meio de um gancho Git para forçá-lo através de um linter).

7. Menos é mais (ou mais é menos)

Algumas pessoas gostam de escrever em YAML porque enfatiza a estrutura. Ao mesmo tempo, eles usam ativamente o recuo para destacar blocos de dados. Isso é uma espécie de golpe para imitar linguagens de marcação que usam delimitadores explícitos.

Aqui está um exemplo de tal estrutura de Documentação 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 alguns, esta opção ajuda-os a resolver a estrutura YAML na sua cabeça, para outros, pelo contrário, irrita-os com muitos recuos desnecessários, na sua opinião.

Mas se você é o proprietário do documento YAML e é responsável por mantê-lo, então tu e apenas tu deve definir como usar o recuo. Se você se incomoda com o preenchimento grande, mantenha-o no mínimo possível de acordo com a especificação YAML. Por exemplo, o arquivo acima da documentação do Ansible pode ser reescrito assim sem qualquer perda:

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

8. Use espaços em branco

Se você repetir constantemente os mesmos erros ao preencher um arquivo YAML, faz sentido inserir um modelo nele como comentário. Da próxima vez, você pode simplesmente copiar este modelo e inserir dados reais nele, 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. Use algo diferente

Se o aplicativo não tiver controle sobre você, talvez valha a pena alterar o YAML para um formato diferente. Com o tempo, os arquivos de configuração podem crescer e então é melhor convertê-los em scripts simples em Lua ou Python.

YAML é algo excelente que muitas pessoas adoram por seu minimalismo e simplicidade, mas está longe de ser a única ferramenta em seu arsenal. Então às vezes você pode recusar. Bibliotecas de análise são fáceis de encontrar para YAML, portanto, se você oferecer opções fáceis de migração, seus usuários sobreviverão a essa falha de forma relativamente fácil.

Se você não consegue viver sem o YAML, siga estas 10 dicas e supere sua antipatia pelo YAML de uma vez por todas!

Fonte: habr.com

Adicionar um comentário