Eu tenho o seguinte YAML:
paths:
patha: /path/to/root/a
pathb: /path/to/root/b
pathc: /path/to/root/c
Como posso "normalizar" isso, removendo /path/to/root/
dos três caminhos e defini-lo como sua própria configuração, algo como:
paths:
root: /path/to/root/
patha: *root* + a
pathb: *root* + b
pathc: *root* + c
Obviamente, isso é inválido, eu apenas inventei. Qual é a verdadeira sintaxe? Isso pode ser feito?
syntax
yaml
transclusion
Andrew Bullock
fonte
fonte
Respostas:
Eu não acho que isso é possível. Você pode reutilizar o "nó", mas não faz parte dele.
Isso é YAML e campos perfeitamente válidos
given
efamily
são reutilizados emship-to
bloco. Você pode reutilizar um nó escalar da mesma maneira, mas não há como alterar o que está dentro e adicionar a última parte de um caminho a partir do YAML.Se a repetição o incomoda tanto, sugiro que seu aplicativo fique ciente das
root
propriedades e adicione-o a todos os caminhos que parecem relativos, não absolutos.fonte
root
código. nada demais.Sim, usando tags personalizadas. Exemplo em Python, fazendo a
!join
tag unir cadeias de caracteres em uma matriz:O que resulta em:
A matriz de argumentos para
!join
pode ter qualquer número de elementos de qualquer tipo de dados, desde que eles possam ser convertidos em cadeia de caracteres, assim!join [*a, "/", *b, "/", *c]
como o que você esperaria.fonte
python3
?), No entanto, com uma simples modificação do acima, ela funciona conforme o esperado. Especificamente:yaml.SafeLoader.add_constructor(tag='!join', constructor=join)
yaml.load(open(fpth, mode='r'), Loader=yaml.SafeLoader)
Outra maneira de ver isso é simplesmente usar outro campo.
fonte
Definição YML:
Em algum lugar do thymeleaf
Saída: / home / data / in / / home / data / in / p1
fonte
Criei uma biblioteca, disponível no Packagist, que executa esta função: https://packagist.org/packages/grasmash/yaml-expander
Arquivo YAML de exemplo:
Exemplo de lógica:
Matriz resultante:
fonte
Em alguns idiomas, você pode usar uma biblioteca alternativa. Por exemplo, tampax é uma implementação de variáveis de manipulação YAML:
fonte
Seu exemplo é inválido apenas porque você escolheu um caractere reservado para iniciar seus escalares. Se você substituir
*
por outro caractere não reservado (eu costumo usar caracteres não ASCII para isso, pois eles raramente são usados como parte de alguma especificação), você terminará com YAML perfeitamente legal:Isso será carregado na representação padrão para mapeamentos no idioma que seu analisador usa e não expande magicamente nada.
Para fazer isso, use um tipo de objeto localmente padrão, como no seguinte programa Python:
que imprimirá:
A expansão é feita em tempo real e lida com definições aninhadas, mas você deve ter cuidado para não chamar a recursão infinita.
Ao especificar o dumper, você pode despejar o YAML original dos dados carregados, devido à expansão on-the-fly:
isso mudará a ordem das chaves de mapeamento. Se esse é um problema, você deve fazer
self.d
umCommentedMap
(importado deruamel.yaml.comments.py
)fonte
Eu escrevi minha própria biblioteca em Python para expandir variáveis sendo carregadas de diretórios com uma hierarquia como:
A principal diferença aqui é que a expansão deve ser aplicada somente após o
config.yaml
carregamento de todos os arquivos, onde as variáveis do próximo arquivo podem substituir as variáveis do anterior, portanto, o pseudocódigo deve ficar assim:Como opção adicional, o
xonsh
script pode exportar as variáveis resultantes para variáveis de ambiente (consulte ayaml_update_global_vars
função).Os scripts:
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
Prós :
${MYUNDEFINEDVAR}
->*$/{MYUNDEFINEDVAR}
)${env:MYVAR}
)\\
a/
em uma variável de caminho (${env:MYVAR:path}
)Contras :
${MYSCOPE.MYVAR}
não está implementado)fonte
Com Yglu , você pode escrever seu exemplo como:
Disclaimer: Eu sou o autor de Yglu.
fonte