ruamel.yaml.round_trip_dump ожидал 4, но нашел 2 (отступ) - PullRequest
0 голосов
/ 04 июля 2018

Код:

#!/usr/bin/env python2

import sys
import ruamel.yaml

yaml_str = '''
---
project: ''
project_lead: &ptl
    name: ''
    company: ''
    email: ''
    id: ''
    timezone: ''
primary_contact: *ptl
committers:
    - <<: *ptl
    - name: ''
      email: ''
      company: ''
      id: ''
      timezone: ''
    - name: ''
      email: ''
      company: ''
      id: ''
      timezone: ''
'''


DATA = ruamel.yaml.round_trip_load(yaml_str, version=None, preserve_quotes=True)
indent = 4
block_seq_indent = 2
ruamel.yaml.round_trip_dump(DATA, sys.stdout, default_flow_style=True, indent=indent,
                            block_seq_indent=block_seq_indent)

Выход:

project: ''
project_lead: &ptl
    name: ''
    company: ''
    email: ''
    id: ''
    timezone: ''
primary_contact: *ptl
committers:
  - <<: *ptl
  - name: ''
    email: ''
    company: ''
    id: ''
    timezone: ''
  - name: ''
    email: ''
    company: ''
    id: ''
    timezone: ''

ВОПРОС:

foo.yaml|10 col 3 error| wrong indentation: expected 4 but found 2 (indentation)

Если я увеличу

block_seq_indent = 4

значения, следующие за ним (адрес электронной почты, компания, идентификатор, часовой пояс), не следуют за его отступом.

Является ли мой источник YAML "неправильным"? Могу ли я обойти это? Модуль ruamel великолепен, и я могу программно добавлять значения, но я не могу получить действительный YAML в своем выводе.

1 Ответ

0 голосов
/ 04 июля 2018

Ваш ввод имеет четыре позиции отступа для (вложенного) отображения блока, которое является значением для project_lead, и имеет шесть отступов для последовательности, которая является значением для committers, со смещением для тире четыре (в последовательностях отступ отсчитывается до начала элемента последовательности).

Это действительно пойдет не так, если вы используете старый API, как и вы, но с новым API (и соответствующими значениями) вы можете сделать:

import sys
import ruamel.yaml
from cStringIO import StringIO

yaml_str = '''\
---
project: ''
project_lead: &ptl
    name: ''
    company: ''
    email: ''
    id: ''
    timezone: ''
primary_contact: *ptl
committers:
    - <<: *ptl
    - name: ''
      email: ''
      company: ''
      id: ''
      timezone: ''
    - name: ''
      email: ''
      company: ''
      id: ''
      timezone: ''
'''

yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
yaml.indent(mapping=4, sequence=6, offset=4)
yaml.explicit_start = True
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)
buf = StringIO()
yaml.dump(data, buf)
assert buf.getvalue() == yaml_str

без получения ошибки.

Обратите внимание:

  • default_flow_style=True не действует в вашем примере, они влияют только на новые сопоставления и списки, и я не уверен, что вы хотите сделать это для всех добавленных значений.
  • Я добавил yaml.explicit_start = True, чтобы получить ведущий ---
  • Ваш пример начинается с пустой строки (сразу после ''', как если бы вы сделали yaml_str = '\n---\nproject: .....'). Вы не можете получить этот вывод с ruamel.yaml() из структуры данных, поэтому обратная косая черта в моем yaml_str.
  • хотя это и можно считать ошибкой в ​​старом API, я не собираюсь ее исправлять.
...