#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 удалили эти ссылки, добавив оскорбление к травме