Прежде всего вы должны просто оставить свой шаблон работы в файле JSON, например, input.json
.:
[
{
"job-template": {
"name": "{name}_job",
"description": "job description",
"project-type": "multibranch",
"number-to-keep": 30,
"days-to-keep": 30,
"scm": [
{
"git": {
"url": "{git_url}"
}
}
]
}
}
]
Таким образом, вы можете легче адаптировать ваш скрипт для обработки разных файлов. И так
также гарантирует, что ключи в ваших объектах JSON упорядочены, что не гарантируется, когда вы включаете JSON в качестве dicts & lists в ваш код, по крайней мере, не для всех текущих версий Python
Тогда, потому что YAML 1.2 (спецификация выпущена в 2009 году) является надмножеством
YAML, вы можете просто использовать библиотеку YAML 1.2, которая сохраняет порядок ключей
при загрузке-дампе конвертировать это в нужный формат. поскольку
PyYAML все еще застрял в выпущенной в 2005 году спецификации YAML 1.1, вы
не могу использовать это, но вы можете использовать ruamel.yaml
(отказ от ответственности я
автор этого пакета).
Единственная «проблема» в том, что ruamel.yaml
также сохранит
(поток) стиль на вашем входе. Это именно то, что вы не хотите.
Итак, вы должны рекурсивно пройтись по структуре данных и изменить
атрибут, содержащий эту информацию:
import sys
import ruamel.yaml
def block_style(d):
if isinstance(d, dict):
d.fa.set_block_style()
for key, value in d. items():
try:
if '{' in value:
d[key] = ruamel.yaml.scalarstring.DoubleQuotedScalarString(value)
except TypeError:
pass
block_style(value)
elif isinstance(d, list):
d.fa.set_block_style()
for elem in d:
block_style(elem)
yaml = ruamel.yaml.YAML()
with open('input.json') as fp:
data = yaml.load(fp)
block_style(data)
yaml.dump(data, sys.stdout)
, что дает:
- job-template:
name: "{name}_job"
description: job description
project-type: multibranch
number-to-keep: 30
days-to-keep: 30
scm:
- git:
url: "{git_url}"
Вышеописанное работает одинаково хорошо для Python2 и Python3
Дополнительное тестирование кода для '{'
заключается в применении двойных кавычек вокруг строк, которые нельзя представить в виде простых скаляров. По умолчанию ruamel.yaml
будет использовать скаляры с одинарными кавычками, если дополнительные экранирующие последовательности, доступные в скалярах YAML с двойными кавычками, не нужны для представления строки.