如何使用 Kwalify 宝石在红宝石中阅读 yaml 中的合并地图



>我正在尝试文档中 Kwalify gem 的合并地图功能

当我在红宝石脚本中加载 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

亚姆输入

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

您应该不会在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"}}

查看如何合并namefoo但覆盖email

最新更新