@Boris19

Как вынести алиасы в другой файл?

У Yaml есть поддержка алиасов
Т.е. например:
references:
    value1: &reference "Don't repeat yourself!"  
    value2: *reference

Т.е. можно указывать ссылку на элемент. Но вот проблема, хочется вынести эти алиасы в отдельный файл, чтобы можно было сразу для нескольких yaml файлов, указывать все алиасы по дефолту.
Готовых решений не нашел, пытался свой костыль сделать с подгрузкой файла через добавление конструктора (Loader.add_constructor), но похоже что ссылки подменяются раньше, т.к. до конструктора выполнение не доходило и выпадало с ошибкой found undefined alias

Может кто сталкивался с таким и нашел решение, подсобите, пожалуйста!
  • Вопрос задан
  • 250 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Спецификация YAML не поддерживает каких-либо отношений между документами. Более того, она явно постулирует, что каждый документ независим. Но есть библиотеки это игнорирующие.
import sys
from ruamel.std.pathlib import Path
from ruamel.yaml import YAML, version_info

yaml = YAML(typ='safe', pure=True)
yaml.default_flow_style = False

def my_compose_document(self):
    self.parser.get_event()
    node = self.compose_node(None, None)
    self.parser.get_event()
    return node

yaml.Composer.compose_document = my_compose_document

def yaml_include(loader, node):
    y = loader.loader
    yaml = YAML(typ=y.typ, pure=y.pure)
    yaml.composer.anchors = loader.composer.anchors
    return yaml.load(Path(node.value))

yaml.Constructor.add_constructor("!include", yaml_include)

data = yaml.load(Path('warehouse.yaml'))
yaml.dump(data, sys.stdout)

specific.yaml
specific:
  spec1:
    <<: *obj1
  spec2:
    <<: *obj1
    key1: 10

warehouse.yaml
warehouse:
  obj1: &obj1
    key1: 1
    key2: 2
specific: !include specific.yaml
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы