【问题标题】:Prettify YAML with comments用注释美化 YAML
【发布时间】:2018-09-11 12:27:45
【问题描述】:

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删除cmets;
  2. ruamel.yaml.cmd中找不到需要的选项;
  3. align-yaml 对齐,而不是美化 YAML 文件。

【问题讨论】:

    标签: yaml pyyaml ruamel.yaml


    【解决方案1】:

    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)
    

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

    可以在ruamel.yaml 源代码中的scalarstring.py 中找到递归数据结构walker,它适用于制作通用的“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,您将不会看到任何变化。但是,如果您使用了双引号标量,那么该行将确保保留双引号。

    【讨论】:

    • Anthon, // 1. 你为什么拒绝我的版本?请参阅prettifyyaml.py 中的flake8 . and pydocstyle output。 // 2. 也许你添加了这个功能并将 YAML 排序为ruamel.yaml.cmd?我认为,其他用户也会对 YAML 美化感兴趣。谢谢。
    • @СашаЧерных 从标准库导入应该总是在非标准库之前(然后是本地导入),不加选择地排序。大多数其他的东西也是不可接受的,所以我拒绝了你的编辑。 flake 这样很好,但不应在 SO 上发布的代码限制范围内不加选择地应用。如果您在回答您发布的问题时发现问题,请告诉我,我将删除我的答案。
    • Anthon,你觉得将你的代码包含在ruamel.yaml.cmd 中怎么样?谢谢。
    【解决方案2】:

    我遇到了同样的问题。我写了自己的 YAML 美化器https://github.com/wangkuiyi/yamlfmt。希望对你有帮助。

    我尝试了来自 Google 的顶级结果,但没有一个满足我领导的 https://sqlflow.org/sqlflow 的要求:

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2018-03-05
        • 2021-12-24
        • 2017-04-10
        • 1970-01-01
        • 1970-01-01
        • 2018-10-15
        • 2017-03-15
        • 2012-01-04
        • 1970-01-01
        相关资源
        最近更新 更多