FreeToGenerate.com

Pega YAML y mira qué valores cambian de significado entre YAML 1.1 y 1.2: el problema de Noruega y toda su familia. No se sube nada.

Prueba con:
Valores simples leídos
6
Valores que cambian de significado
5

Estos valores significan cosas distintas según la versión de YAML que lea el archivo.

LíneaEscritoYAML 1.1YAML 1.2Por qué
2debug: ontrue"on"una forma de booleano que 1.1 acepta y 1.2 no
3retries: 010810un cero delante, que en 1.1 significa octal
4timeout: 12:30750"12:30"base sesenta, que 1.1 lee como un solo número
5port: 8_0808080"8_080"separadores de dígitos, que solo 1.1 quita
6region: NOfalse"NO"una forma de booleano que 1.1 acepta y 1.2 no

La solución

Ponlo entre comillas. Un escalar entrecomillado es una cadena en todas las versiones de YAML y en todos los analizadores, y por eso 'NO' y "on" nunca aparecen en esta lista.

Booleanos, por versión

YAML 1.1 acepta veintidós formas de escribir un booleano y YAML 1.2 acepta seis, así que dieciséis palabras corrientes significan una cosa para un analizador y otra para el siguiente.

22 / 6

Las dieciséis

  • y
  • Y
  • yes
  • Yes
  • YES
  • n
  • N
  • no
  • No
  • NO
  • on
  • On
  • ON
  • off
  • Off
  • OFF

Los valores se leen línea a línea y no con un analizador: solo se comprueban las claves y los elementos de lista simples, y se deja en paz todo lo entrecomillado o dentro de un escalar de bloque. Las reglas de 1.1 vienen de las propias páginas de tipos de yaml.org y las respuestas de 1.2 se contrastan con js-yaml.

También disponible en: English · Português · Français · العربية

El problema de Noruega en YAML

Por qué country: NO acaba siendo false, qué otros valores hacen lo mismo y cómo revisar un archivo entero de una vez.

¿Qué es el problema de Noruega?

Escribe country: NO en un archivo YAML y muchísimos analizadores te devolverán el booleano false en lugar de la cadena «NO». El código de país de Noruega es una forma de escribir false en YAML 1.1, junto con otras quince palabras corrientes, y nada en el archivo lo señala: el valor llega convertido en booleano y algo falla mucho más adelante.

Pasa porque hay dos especificaciones de YAML en uso diario. YAML 1.1, de 2005, acepta veintidós formas de escribir un booleano: y, Y, yes, Yes, YES, n, N, no, No, NO, true, True, TRUE, false, False, FALSE, on, On, ON, off, Off y OFF. YAML 1.2 las redujo a seis —true, True, TRUE, false, False, FALSE—, así que las otras dieciséis pasaron a ser texto normal. Las dos versiones están ampliamente implementadas, o sea que el mismo archivo significa de verdad dos cosas.

Los booleanos son el caso famoso, no el único. En YAML 1.1 un valor como 12:30 es un número en base sesenta y se convierte en 750; un cero delante significa octal, así que 0755 es 493; y los guiones bajos son separadores de dígitos, así que 1_000 es mil. En YAML 1.2 los tres son cadenas o decimales normales. Esta página revisa un archivo buscando toda esa familia a la vez.

Cómo usarlo

  1. Pega tu YAML. Un archivo entero o solo el fragmento que te preocupa. No se sube nada: la comprobación se hace en la página.
  2. Lee la tabla. Cada valor simple cuyo significado depende de la versión, con lo que hace YAML 1.1, lo que hace 1.2 y qué regla es la responsable.
  3. Pon comillas a lo que te señale. Un escalar entrecomillado es una cadena en todas las versiones y en todos los analizadores. Ponerle comillas es la solución entera, y la tabla se va vaciando conforme lo haces.

¿Qué analizador estoy usando en realidad?

Esta es la pregunta de la que depende de verdad el problema de Noruega, y la respuesta pocas veces se ve desde fuera. PyYAML —con diferencia la biblioteca de YAML más usada en Python, y por tanto lo que hay debajo de muchísimas herramientas de infraestructura— implementa YAML 1.1, así que hoy lee NO como false. En JavaScript, js-yaml resuelve el esquema básico de YAML 1.2, así que el mismo archivo te da la cadena. Las bibliotecas de Go, Ruby y Java varían según la versión y el esquema con el que se configuraron.

La consecuencia práctica es que un archivo puede pasar todas las pruebas en una máquina y cambiar de significado en otra, sin un solo error por ninguna parte. Una configuración escrita y validada en una cadena de herramientas de JavaScript y luego leída por un servicio en Python es exactamente la forma de ese fallo, y los códigos de país, los interruptores escritos como on y off y las horas escritas como 12:30 son bastante comunes como para topárselo.

Por eso además la solución es entrecomillar y no elegir bando. No controlas qué analizador leerá tu archivo más adelante, y una cadena entre comillas significa lo mismo para todos.

Límites honestos

Esta página lee los valores línea a línea en vez de analizar YAML de verdad, y es deliberadamente estricta al respecto: solo mira las líneas de clave y valor y los elementos de lista simples, se salta todo lo que ya está entrecomillado y se salta entero cualquier escalar de bloque introducido con una barra vertical o un signo de mayor, junto con todo su cuerpo indentado. Esto último importa: un script de shell dentro de un escalar de bloque puede tener líneas que parecen YAML exactamente, y señalarlas sería un falso positivo, no un hallazgo.

Esa estrechez cuesta algo. Las colecciones en línea, los archivos con varios documentos, las anclas y las claves de fusión no se analizan, así que un valor escondido en una de esas cosas no aparecerá. El escáner prefiere callarse a decir algo equivocado.

Las reglas de YAML 1.1 están transcritas de las propias páginas de tipos de yaml.org, que publican las expresiones regulares de resolución, y la transcripción se comprueba contra esas páginas en lugar de darse por buena. Las respuestas de 1.2 se contrastan con js-yaml, la biblioteca que este sitio ya usa en otras páginas. Nada de eso convierte esta página en un sustituto de ejecutar tu analizador real sobre tu archivo real.

Y que un valor salga señalado no significa que tu montaje esté roto. Si todo lo que lee el archivo va con YAML 1.2, NO ya es una cadena y no pasa nada. La tabla te dice dónde el archivo depende de esa suposición, no que la suposición sea falsa ahora mismo.

¿Por qué es gratis?

La comprobación son unos cientos de líneas de comparación de patrones que se ejecutan en tu navegador. No hay servidor de por medio, así que no hay nada que cobrar ni cuenta que crear, y aquí importa: un archivo de configuración suele nombrar servidores internos, buckets y servicios.

No se sube nada y no se guarda nada. Recarga la página y habrá olvidado el archivo.