如何使用Kwalify gem在ruby中读取yaml中的合并映射

时间:2017-07-21 05:15:29

标签: ruby scripting yaml

我正在试验documentation

中Kwalify gem的合并地图功能

当我在我的ruby脚本中加载YAML时,我没有看到合并的值。

parser = Kwalify::Yaml::Parser.new(@validator)

document = parser.parse_file(File.join(__dir__, "test_files", "values.yml"))

我认为我的理解有问题。如果我能够更好地了解YAML的地图合并功能以及检索YAML的合并值的代码,那将会非常有用。

YAML架构

type: map
mapping:
  "group":
    type: map
    mapping:
      "name": &name
        type: str
        required: yes
      "email": &email
        type: str
        pattern: /@/
        required: no
  "user":
    type: map
    mapping:
      "name":
        <<: *name             # merge
        length: { max: 16 }   # add
      "email":
        <<: *email            # merge
        required: yes         # override

YAML输入

group:
  name: foo
  email: foo@mail.com
user:
  name: bar
  email: bar@mail.com

1 个答案:

答案 0 :(得分:0)

您不应在values.yml中看到任何更改,因为您的架构中使用了合并地图功能。

基本上,这就是正在发生的事情。这部分架构

"user":
  type: map
  mapping:
    "name":
      <<: *name             # merge
      length: { max: 16 }   # add
    "email":
      <<: *email            # merge
      required: yes         # override

转换为

"user":
  type: map
  mapping:
    "name":
      type: str
      required: yes
      length: { max: 16 }   # add
    "email":
      type: str
      pattern: /@/
      required: yes         # override

如果您想查看更改,可以在values.yml中使用此功能。

# values.yml
group: &foo
  name: foo
  email: foo@mail.com
user:
  <<: *foo
  email: bar@mail.com

然后:

parser.parse_file('values.yml')
=> {"group"=>{"name"=>"foo", "email"=>"foo@mail.com"}, "user"=>{"name"=>"foo", "email"=>"bar@mail.com"}}

了解name foo的合并方式,但email会被覆盖。