Почему двухсторонний YAML не анализируется как четырехслойный YAML? - PullRequest
0 голосов
/ 30 мая 2018

Я вижу странное поведение при разборе YAML (с использованием Ruby 2.5 / Psych), созданного с использованием двух пробелов.На мой взгляд, тот же файл, с отступом в четыре пробела на строку, работает, как и ожидалось.

Два пробела:

windows:
  - shell:
    panes:
      - echo hello

приводит к следующему хешу:

{"windows"=>[{"shell"=>nil, "panes"=>["echo hello"]}]}

Принимая во внимание, что использование четырех пробелов:

windows:
    - shell:
        panes:
            - echo hello

приводит к:

{"windows"=>[{"shell"=>{"panes"=>["echo hello"]}}]}

Я только пролистал спецификацию и не увидел ничего релевантногок этой проблеме.

Ожидается ли такое поведение?Если это так, я был бы очень признателен за ссылки на ресурсы, объясняющие почему.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Хотя решение Уэйна верное, объяснение кажется немного неправильным, поэтому я добавлю мое:

В YAML - для элементов последовательности блоков (например, ? и :для сопоставлений блоков) рассматривается как отступ ( spec ):

Символы «-», «?» и «:», используемые для обозначения блоказаписи в коллекции воспринимаются людьми как часть отступа.Это обрабатывается в каждом конкретном случае соответствующими производствами.

Более того, все наборы блоков (последовательности и отображения) получают отступ от своего первого элемента (поскольку нет явного начального индикатора).Таким образом, в строке - shell:, - определяет уровень отступа вновь начатой ​​последовательности, в то же время, shell: определяет уровень отступа вновь начатого отображения, который является содержимым элемента последовательности.Обратите внимание, как - рассматривается как отступ для определения уровня отступа отображения.

Теперь вернемся к первому примеру:

windows:
  - shell:
    panes:
      - echo hello

panes: находится на том же уровне, что иshell:.Это означает, что YAML анализирует его как ключ сопоставления, начатого с shell:, что означает, что ключ shell имеет пустое значение.Значения сопоставления неявных ключей, если они не находятся на одной строке, всегда должны иметь отступ больше соответствующего ключа сопоставления ( spec ):

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

OTOH, во втором примере:

windows:
    - shell:
        panes:
            - echo hello

panes: находится на более глубоком уровне отступа по сравнению с shell:.Это означает, что он анализируется как значение ключа shell и, таким образом, запускает новое отображение вложенных блоков.

Наконец, учтите, что, поскольку - рассматривается как частьотступ, «отступ с двумя пробелами» также может означать следующее:

windows:
- shell:
    panes:
    - echo hello

Обратите внимание, что - не имеют больше отступа, чем их ключи отображения.Это работает, потому что spec говорит:

Поскольку люди воспринимают индикатор «-» как отступ, вложенные последовательности блоков могут иметь отступ на одно меньше места для компенсации, за исключением, конечно,, если вложено в другую последовательность блоков (контекст блокировки против контекста блокировки).

0 голосов
/ 30 мая 2018

Проблема в том, что вы не можете просто заменить каждые два пробела четырьмя пробелами.Это потому, что в этой паре строк:

  - shell:
    panes:

эти два пробела во второй строке:

    panes:
  ^^

являются сокращением для "-" в строке выше.Если бы вторая строка не была сокращена, то пара строк была бы:

  - shell:
  - panes:

Таким образом, при удвоении отступа вторая из этих строк должна иметь только двойную первую пару пробелов, а не вторую.Это дало бы правильный отступ для пары:

    - shell:
      panes:

Итак, если вы расширите только первую пару пробелов в строке "panes:", вы получите:

windows:
    - shell:
      panes:
          - git status

Который правильно анализирует ожидаемый результат.

...