用评论来为YAML做好准备

时间:2018-04-02 09:31:46

标签: yaml pyyaml ruamel.yaml

1。摘要

我无法找到,如何自动美化我的YAML文件。

2。数据

示例:

我有SashaPrettifyYAML.yaml个文件:

sasha_commands:
  # Sasha comment
  sasha_command_help: {call: sublime.command_help, caption: 'Sasha Command: Command Help'}

3。预期的行为

我想删除{braces}:

sasha_commands:
  # Sasha comment
  sasha_command_help:
    call: sublime.command_help
    caption: 'Sasha Command: Command Help'

4。没帮忙

  1. Pretty YAML(基于PyYAML)和在线格式化工具YAML FormatterOnlineYAMLTools删除评论;
  2. 我无法在ruamel.yaml.cmd;
  3. 中找到所需的选项
  4. align-yaml对齐,而不是美化YAML文件。

3 个答案:

答案 0 :(得分:2)

ruamel.yaml.cmd中没有选项可以做到这一点,但使用小型python程序并使用ruamel.yaml,通过在往返模式下加载和转储(默认情况下)来完成此操作非常简单)。

您唯一需要做的就是确保数据结构上的流式样式(即密钥sasha_command_help的值)设置为块样式(这就是我如何解释您的定义“美化YAML“):

import sys
import ruamel.yaml

yaml_str = """\
sasha_commands:
  # Sasha comment
  sasha_command_help: {call: sublime.command_help, caption: 'Sasha Command: Command Help'}
"""

yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
data = yaml.load(yaml_str)
data['sasha_commands']['sasha_command_help'].fa.set_block_style()
yaml.dump(data, sys.stdout)

这将完全给出您期望的输出。

递归数据结构walker可以在scalarstring.py源代码的ruamel.yaml中找到,并且适用于制作通用的“make-everything-block-style”例程:

import sys
import ruamel.yaml

def block_style(base):
    """
    This routine walks over a simple, i.e. consisting of dicts, lists and
    primitives, tree loaded from YAML. It recurses into dict values and list 
    items, and sets block-style on these.
    """
    if isinstance(base, dict):
        for k in base:
            try:
                base.fa.set_block_style()
            except AttributeError:
                pass
            block_style(base[k])
    elif isinstance(base, list):
        for elem in base:
            try:
                base.fa.set_block_style()
            except AttributeError:
                pass
            block_style(elem)

yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
file_in = sys.argv[1]
file_out = sys.argv[2]
with open(file_in) as fp:
    data = yaml.load(fp)
block_style(data)
with open(file_out, 'w') as fp:
    yaml.dump(data, fp)

如果您将上述内容存储在prettifyyaml.py中,则可以使用以下方式进行调用:

python prettifyyaml.py SashaPrettifyYAML.yaml Prettified.yaml

由于您已经在具有嵌入空格的标量周围使用单引号,因此如果省略yaml.preserve_quotes = True,则不会看到更改。但是如果你使用了双引号标量,则该行确保保留双引号。

答案 1 :(得分:1)

我有同样的问题。我编写了自己的YAML美化工具https://github.com/wangkuiyi/yamlfmt。希望对您有所帮助。

我尝试了Google的最高结果,但是没有一个能满足我所领导的https://sqlflow.org/sqlflow的要求:

答案 2 :(得分:1)

您可以使用yq工具-它易于安装和使用,并且维护良好。 假设您有example.yml格式的文件,可以通过以下方式进行处理:

  • 来自文件:yq r --unwrapScalar -p pv -P example.yml '*'
  • 来自标准输入:cat example.yml | yq r --unwrapScalar -p pv -P - '*'