如何将 Ruby Hash 转换为 YAML 并保留注释?

问题描述 投票:0回答:1

如何将 Ruby Hash 转换为 YAML 并保留注释

对于以下 ruby 示例

require 'yaml'

h = {
  # The garage in Miami
  'garage_A' => {
    'car_x' => {
      # Bought in Gotham
      'name' => 'Batmobile',
      'color' => 'black'
    }
  },
  'garage_B' => {
    # Mike's bike
    'bike_m' => {
      # Cherry red
      'color' => 'red',
      'wheels' => 2
    }
  }
}

puts YAML.dump(h)

我希望获得以下结果:

---
# The garage in Miami
garage_A:
  car_x:
    # Bought in Gotham
    name: Batmobile
    color: black
garage_B:
  # Mike's bike
  bike_m:
    # Cherry red
    color: red
    wheels: 2

这是我目前得到的:

---                                                                                                                                                                                                                  
garage_A:                                                                                                                                                                                                            
  car_x:                                                                                                                                                                                                             
    name: Batmobile                                                                                                                                                                                                  
    color: black                                                                                                                                                                                                     
garage_B:                                                                                                                                                                                                            
  bike_m:                                                                                                                                                                                                            
    color: red                                                                                                                                                                                                       
    wheels: 2  

我也可能对反向操作感兴趣。

用例:具有工具默认配置的 Ruby 哈希。当配置文件不存在时,它将哈希转储到 YAML 并写入配置文件。为了用户友好性,最好在配置文件中添加注释,而不是必须参考文档。

ruby yaml comments
1个回答
0
投票

为每个哈希添加评论键

您确实应该将 YAML 文件模板化为此处文档,或者使用像 erb 这样的模板语言。如果可能的话,您还应该为 Hash 元素使用更多能够揭示意图的名称,这样就不需要注释了。

如果您确实需要注释,请记住 JSON 和 Ruby Hash 对象本身都不支持注释作为其语法的一部分。因此,您需要为 Ruby Hash 中的每个嵌套对象创建一个“注释”键/值对,以便在您生成的 JSON 或 YAML 中显示它。例如:

require "yaml"

# Assign a comment key to each nested element.
hash_with_comments = {
  "comment"  => "nested hashes contain 'comment' keys",
  "garage_a" => {
    "comment" => "The garage in Miami",
    "car_x"   => {
      "comment" => "Bought in Gotham",
      "name"    => "Batmobile",
      "color"   => "black",
    }
  }
}

现在

hash_with_comments.to_yaml
将产生以下 YAML:

---
comment: nested hashes contain 'comment' keys
garage_a:
  comment: The garage in Miami
  car_x:
    comment: Bought in Gotham
    name: Batmobile
    color: black

根据您的用例,您可以停在那里,忽略解析 YAML 的任何代码中的注释键。否则,您可以使用 String#gsub 块语法(必须使用块以避免污染不匹配行的

$1
)将注释元素转换为实际注释。将注释键转换为实际注释后,调用
hash_with_comments.to_yaml.gsub(/^(\s*)comment:/) { "#{$1}#" }
将产生以下 YAML:

---
# each Hash contains a 'comment' key
garage_a:
  # The garage in Miami
  car_x:
    # Bought in Gotham
    name: Batmobile
    color: black
© www.soinside.com 2019 - 2024. All rights reserved.