Tengo el siguiente YAML:
paths:
patha: /path/to/root/a
pathb: /path/to/root/b
pathc: /path/to/root/c
¿Cómo puedo "normalizar" esto, quitando /path/to/root/
de los tres caminos, y tenerlo como su propia configuración, algo como:
paths:
root: /path/to/root/
patha: *root* + a
pathb: *root* + b
pathc: *root* + c
Obviamente eso no es válido, lo acabo de inventar. ¿Cuál es la sintaxis real? Se puede hacer?
syntax
yaml
transclusion
Andrew Bullock
fuente
fuente
Respuestas:
No creo que sea posible. Puede reutilizar "nodo" pero no parte de él.
Este es YAML y campos perfectamente válidos
given
yfamily
se reutilizan enship-to
bloque. Puede reutilizar un nodo escalar de la misma manera, pero no hay forma de cambiar lo que hay dentro y agregarle la última parte de una ruta desde dentro de YAML.Si la repetición le molesta tanto, sugiero que su aplicación conozca la
root
propiedad y la agregue a cada ruta que parezca relativa, no absoluta.fuente
root
código. No es gran cosa.Sí, usando etiquetas personalizadas. Ejemplo en Python, haciendo que la
!join
etiqueta una las cadenas en una matriz:Lo que resulta en:
La matriz de argumentos
!join
puede tener cualquier cantidad de elementos de cualquier tipo de datos, siempre y cuando se puedan convertir en una cadena, así!join [*a, "/", *b, "/", *c]
es lo que cabría esperar.fuente
python3
?) Sin embargo, con una simple modificación a lo anterior, funciona como se esperaba. Específicamente:yaml.SafeLoader.add_constructor(tag='!join', constructor=join)
yaml.load(open(fpth, mode='r'), Loader=yaml.SafeLoader)
Otra forma de ver esto es simplemente usar otro campo.
fuente
Definición YML:
En algún lugar de la hoja de tomillo
Salida: / home / data / in / / home / data / in / p1
fuente
He creado una biblioteca, disponible en Packagist, que realiza esta función: https://packagist.org/packages/grasmash/yaml-expander
Ejemplo de archivo YAML:
Lógica de ejemplo:
Matriz resultante:
fuente
En algunos idiomas, puede usar una biblioteca alternativa. Por ejemplo, tampax es una implementación de variables de manejo de YAML:
fuente
Que su ejemplo no sea válido es solo porque eligió un carácter reservado para comenzar con sus escalares. Si reemplaza el
*
con algún otro carácter no reservado (tiendo a usar caracteres no ASCII para eso, ya que rara vez se usan como parte de alguna especificación), termina con YAML perfectamente legal:Esto se cargará en la representación estándar para las asignaciones en el lenguaje que usa su analizador y no expande mágicamente nada.
Para hacerlo, use un tipo de objeto predeterminado localmente como en el siguiente programa Python:
que imprimirá:
La expansión se realiza sobre la marcha y maneja definiciones anidadas, pero debe tener cuidado de no invocar una recursión infinita.
Al especificar el volquete, puede volcar el YAML original de los datos cargados, debido a la expansión sobre la marcha:
esto cambiará el orden de las claves de mapeo. Si eso es un problema, debe hacer
self.d
unCommentedMap
(importado deruamel.yaml.comments.py
)fuente
He escrito mi propia biblioteca en Python para expandir las variables que se cargan desde directorios con una jerarquía como:
La diferencia clave aquí es que la expansión debe aplicarse solo después de
config.yaml
cargar todos los archivos, donde las variables del siguiente archivo pueden anular las variables del anterior, por lo que el pseudocódigo debería tener este aspecto:Como una opción adicional, el
xonsh
script puede exportar las variables resultantes a variables de entorno (vea layaml_update_global_vars
función).Los guiones:
https://sourceforge.net/p/contools/contools/HEAD/tree/trunk/Scripts/Tools/cmdoplib.yaml.py https://sourceforge.net/p/contools/contools/HEAD/tree/trunk/Scripts /Tools/cmdoplib.yaml.xsh
Pros :
${MYUNDEFINEDVAR}
->*$/{MYUNDEFINEDVAR}
)${env:MYVAR}
)\\
que/
en una variable de ruta (${env:MYVAR:path}
)Contras :
${MYSCOPE.MYVAR}
no está implementado)fuente
Con Yglu , puedes escribir tu ejemplo como:
Descargo de responsabilidad: soy el autor de Yglu.
fuente