用注释美化 YAML

Prettify YAML with comments

1。摘要

我找不到如何自动美化我的 YAML 文件。


2。数据

示例:

‍‍‍‍‍‍‍‍我有 SashaPrettifyYAML.yaml 个文件:

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

3。预期行为

我想删除{大括号}:

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

4。没有帮助

  1. Pretty YAML (based on PyYAML) and online formatters as YAML Formatter and OnlineYAMLTools删除评论;
  2. 我在 ruamel.yaml.cmd 中找不到所需的选项;
  3. align-yaml 对齐,而不是美化 YAML 文件。

ruamel.yaml.cmd 中没有执行此操作的选项,但是使用 python 小程序并使用 ruamel.yaml 通过在 ruamel.yaml 中加载和转储来执行此操作相当简单=34=] 模式(默认)。

您唯一需要做的就是确保 data-structure 上的 flow-style 是键 sasha_command_help 的值设置为 block-style(这我是这样解释你对 "prettifying 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,您将看不到任何变化。但是,如果您使用了双引号标量,那么该行将确保双引号被保留。

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

我尝试了 Google 的最佳结果,但其中 none 满足了我领导的 https://sqlflow.org/sqlflow 的要求:

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

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