ruamel.yaml.cmd rt разрывает списки, если они содержат длинную строку или хэш

#ruamel.yaml

#ruamel.yaml

Вопрос:

Я просто замечаю, что инструмент командной строки, вызываемый следующим образом: «ruamel.yaml.cmd rt —save $YAML_FILE», разрывает списки, содержащие либо длинные строки, либо хэши:

Пример списка, содержащего хэш:

Источник:

 telegraf::inputs:
  cpu:
    - percpu: true
      totalcpu: true
      report_active: true
 

вывод:

 telegraf::inputs:
  cpu:
     - percpu: true
    totalcpu: true
    report_active: true
 

пример списка, содержащего длинную строку:

Источник:

 rsyslog::config::snippets:
  00_forward:
    ensure: 'present'
    lines:
      - 'if $syslogfacility != 1 then {'
      - 'action(Name="collector-syslog" Type="omfwd" Target="%{hiera("rsyslog_server")}" Port="514" Action.ResumeInterval="5" Protocol="tcp")'
      - '}'
 

вывод:

 rsyslog::config::snippets:
  00_forward:
    ensure: present
    lines:
       - if $syslogfacility != 1 then {
       - action(Name="collector-syslog" Type="omfwd" Target="%{hiera("rsyslog_server")}"
      Port="514" Action.ResumeInterval="5" Protocol="tcp")
       - '}'
 

Я уже создал отчет об ошибке для этого, но он был удален с комментарием, указывающим на https://yaml.readthedocs.io/en/latest/example.html ?выделить = отступ#вывод дампа в виде строки.

Но я не уверен, как этот сокращенный код должен помочь мне с инструментом командной строки.

Или этот инструмент устарел, и я должен использовать свой собственный?

Ответ №1:

Автоматическое определение отступа кажется неправильным для вашего ввода, поскольку этот ввод противоречив (ваши сопоставления имеют отступ в 2 позиции, а ваши последовательности — в 4 позиции со смещением для индикатора последовательности блоков, равным 2). ruamel.yaml.cmd как и в случае с PyPI, он не поддерживает разные уровни отступов для последовательностей и сопоставлений (ruamel.yaml этого не делал, когда это было написано, это происходит сейчас).

Кроме того, вы не можете установить ширину строки для вывода в ruamel.yaml.cmd для более старых версий (до 2020-12-01), и эти версии используют 80 символов по умолчанию для переноса.

Я рекомендую вам обновиться до версии 0.5.6 и использовать параметры командной строки:

 yaml rt  --indent 2 --width 1024 --save <yourfile>
 

Подходящий репозиторий для ruamel.yaml.cmd https://sourceforge.net/p/ruamel-yaml-cmd/code/ci/default/tree / . Отчет об ошибке ruamel.yaml , который можно использовать только из программы на Python, должен содержать минимальный исходный код программы, которая воспроизводит ошибку, и если он не предоставлен, проблемы будут удалены, как указано на странице создания проблемы.

Комментарии:

1. я попробую это сделать. не могли бы вы исправить URL-адреса репозитория в pypi? они указывают на то, чего там больше нет.

2. я протестировал это, и это неправильно: -/ с bsi 0 списки вообще не имеют отступов. я предполагаю, что под отображениями вы подразумеваете тип hash, а под последовательностями вы подразумеваете тип list / array? если да. проблема в том, что у меня есть структуры данных, которые содержат списки хэшей, см. Пример telegraf::inputs выше. они преобразуются в [ordereddict([(‘percpu’, True), (‘totalcpu’, True), (‘report_active’, True)])], так что это список хэшей. но когда библиотека сбрасывает их, отступ становится неправильным. я подозреваю, что у библиотеки есть проблемы с сбросом списков, содержащих хэши.

3. Теперь в pypi есть ruamel.yaml.cmd 0.5.6. Я добавил параметр —width в команду rt, поэтому попробуйте с python -m ruamel.yaml.cmd rt --wdith 1024 --indent 2 --save yourfile помощью (проверено с вашим 2-м исходным файлом для переноса длинной строки)

4. Я могу без проблем сбросить эту структуру данных. ( python -c "from ruamel.yaml import YAML; import sys; a = {'list_of_hashes': [{'a': '1', 'b': 2, 'c': None}, {'d': '1', 'e': 2, 'f': True}, {'g': '1', 'h': 2, 'j': False}]}; YAML().dump(a, sys.stdout)" )

5. Ссылки в PyPI автоматически обновляются с новой версией. Мне пришлось вернуться из bitbucket в sourceforge и установить ссылку пересылки на bitbucket, когда я это сделал. Теперь, похоже, что люди из Bitbucket удалили эти ссылки, добавив оскорбление к травме