Предварительная обработка проста, и я рекомендую вам использовать решение на основе YAML loaderd / dumper, так как замена может потребовать кавычек вокруг скаляра замены.(Например, вы подставляете строку true
, если она не была заключена в кавычки, результирующий YAML будет читаться как логическое значение).
Предполагается, что ваш «источник» находится в input.yaml
, а ваш env.переменная ORDER_APP_URL
установлена на https://some.site/and/url
.И следующий скрипт в expand.py
:
import sys
import os
from pathlib import Path
import ruamel.yaml
def substenv(d, env):
if isinstance(d, dict):
for k, v in d.items():
if isinstance(v, str) and '${' in v:
d[k] = v.replace('${', '{').format(**env)
else:
substenv(v, env)
elif isinstance(d, list):
for idx, item in enumerate(d):
if isinstance(v, str) and '${' in v:
d[idx] = item.replace('${', '{').format(**env)
else:
substenv(item, env)
yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
data = yaml.load(Path(sys.argv[1]))
substenv(data, os.environ)
yaml.dump(data, Path(sys.argv[2]))
Затем вы можете сделать:
python expand.py input.yaml output.yaml
, который пишет output.yaml
:
order-lunch-app-health:
request:
url: https://some.site/and/url
headers:
content-type: 'application/text'
method: get
expectedResponse:
statusCode: 200
maxRetryCount: 5
Обратите внимание, чтоложные кавычки вокруг 'application / text' сохраняются, как и любые комментарии в исходном файле.
Кавычки вокруг замещенного URL не обязательны, но они были бы добавлены, если бы они были.
Подпрограмма substenv
рекурсивно пересекает загруженные данные и выполняет замену, даже если подстановка находится в среднем скаляре, и если в одном скаляре больше, чем подстановка.Вы можете «затянуть» тест:
if isinstance(v, str) and '${' in v:
, если это будет соответствовать слишком большому количеству строк, загруженных из YAML.