Как добавить новый элемент для массива, используя библиотеку ruamel в python? - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть файл yaml, который я хочу изменить с помощью ruamel.Я могу изменить его, если развертывание содержит только одну среду.Проблема в том, что я хочу добавить / изменить более одной среды.Вот пример кода, который работает для одной среды, используя 2 аргумента.

sample.py

import ruamel.yaml
import sys

file_name = 'Jenkinsfile.yaml'
from ruamel.yaml.util import load_yaml_guess_indent

config, ind, bsi = load_yaml_guess_indent(open(file_name))

totalArgs = len(sys.argv) - 1
print(totalArgs)
print(sys.argv[1:])

if totalArgs == 2:
    deploy = config['deploy']
    deploy[0]['env'] = sys.argv[1]
    deploy[0]['org'] = sys.argv[2]

elif totalArgs == 4:
    deploy = config['deploy']

    deploy[0]['env'] = sys.argv[1]
    deploy[0]['org'] = sys.argv[2]

    deploy[0]['env'] = sys.argv[3]
    deploy[0]['org'] = sys.argv[4]
    deploy[0]['host'] = 'https://**.com'
    deploy[0]['loc'] = 'saas'
    deploy[0]['manifest'] = 'manifest_dev.yml'
ruamel.yaml.round_trip_dump(config, open('Jenkinsfile.yaml', 'w'), 
                            indent=ind, block_seq_indent=bsi)

Результат

sample.py mitul-trial test

deploy:
- env: mitul-trial (Will change)
  org: test (Will change)
  host: https://**.com (will remain same)
  loc: saas (will remain same)
  manifest: manifest_dev.yml (will remain same)
  approval: true (will remain same)

Требуемый результат:

sample.py mitul-trial test mitul1 testsomething

deploy:
- env: mitul-trial (Will change)
  org: test (Will change)
  host: https://**.com (will remain same)
  loc: saas (will remain same)
  manifest: manifest_dev.yml (will remain same)
  approval: true (will remain same)

- env: mitul1 (Will change)
  org: testsomething (Will change)
  host: https://**.com (will remain same)
  loc: saas (will remain same)
  manifest: manifest_dev.yml (will remain same)
  approval: true (will remain same)

1 Ответ

0 голосов
/ 26 апреля 2018

Ваш код не работает, потому что вы не добавляете новый элемент в последовательность / список, который является значением для ключа deploy.Вы просто присваиваете первой записи новые значения.

Существует несколько способов скопировать такое значение, но, поскольку это диктат, вам необходимо убедиться, что вы не копируете ссылку (что может привести к обновлению).первый элемент, а также).В таких случаях лучше использовать copy.deepcopy() из стандартной библиотеки, чтобы быть в безопасности.Для этого включите

from copy import deepcopy

Ваш код elif должен поэтому читать:

elif totalArgs == 4:
    elem = deepcopy(config['deploy'][0])
    config['deploy'].append(elem)

    elem['env'] = sys.argv[1]
    elem['org'] = sys.argv[2]

    elem['env'] = sys.argv[3]
    elem['org'] = sys.argv[4]
    elem['host'] = 'https://**.com'
    elem['loc'] = 'saas'
    elem['manifest'] = 'manifest_dev.yml'

, чтобы получить желаемый результат.

...