#yaml #schema #validation #command-line-interface #structure

app yaml-validator-cli

yaml-validator库的命令行界面

6个版本

0.1.1 2023年11月13日
0.1.0 2020年2月8日
0.0.3 2020年1月26日
0.0.2 2020年1月25日
0.0.1 2020年1月25日

#341 in 数据库接口

MIT 许可证

145KB
4.5K SLoC

yaml-validator-cli

使用yaml编写的模式验证YAML文件的命令行界面

快速链接

命令行帮助信息

yaml-validator-cli 0.1.0
    Command-line interface to the yaml-validator library.
    Use it to validate YAML files against a context of any number of cross-referencing schema files.
    The schema format is proprietary, and does not offer compatibility with any other known YAML tools

USAGE:
    yaml-validator-cli [OPTIONS] --uri <uri> [--] [files]...

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -s, --schema <schemas>...    Schemas to include in context to validate against. Schemas are added in order, but do
                                 not validate references to other schemas upon loading.
    -u, --uri <uri>              URI of the schema to validate the files against.

ARGS:
    <files>...    Files to validate against the selected schemas.

当前支持的数据类型

模式格式支持非常有限的数量类型,这些类型与YAML规范非常接近

  • string utf8兼容的字符串
  • integer i64整数
  • real f64浮点值
  • hash(也称为dictionaryhashmap)映射string ➞ <类型>,如items中定义
    • items: <type>(可选)哈希中值的类型
  • array类型为<type>的项目数组
    • items: <type>(可选)数组中值的类型。
  • object具有已知字段的结构(与哈希不同)。
    • items字段和它们的类型数组,如下所示
      • <名称>: <类型>
  • $ref: <uri>同一上下文中schema的引用,由<uri>标识

示例

以下所有示例也可在examples/目录中找到。

使用引用避免深度嵌套和非可重用结构

我们可以定义一个 person 对象,并在不同的模式 phonebook 中通过其 uri 来引用它

# phonebook.yaml
---
uri: person
schema:
  type: object
  items:
    name:
      type: string
    phone:
      type: integer

---
uri: phonebook
schema:
  type: object
  items:
    phonebook:
      type: array
      items:
        $ref: person

来源:examples/nesting/schema.yaml

然后我们可以使用上述模式来验证在此定义的 yaml 文档

# mybook.yaml
---
phonebook:
  - name: timmy
    phone: 123456
  - name: tammy
    phone: 987654

来源:examples/nesting/mybook.yaml

... 使用以下方式 yaml-validator-cli

$ yaml-validator-cli --schema phonebook.yaml --uri phonebook -- mybook.yaml
all files validated successfully!

跨文件边界引用模式

使用 --schema 命令行选项提供的所有模式都加载到同一个上下文中,因此引用在单独文件中定义的模式与它们在同一个文件中定义完全相同。

# person-schema.yaml
---
uri: person
schema:
  type: object
  items:
    name:
      type: string
    phone:
      type: integer

来源:examples/multiple-schemas/person-schema.yaml

# phonebook-schema.yaml
---
uri: phonebook
schema:
  type: object
  items:
    phonebook:
      type: array
      items:
        $ref: person

来源:examples/multiple-schemas/phonebook-schema.yaml

验证以下 yaml 文档与我们上面的模式

# mybook.yaml
---
phonebook:
  - name: timmy
    phone: 123456
  - name: tammy
    phone: 987654

来源:examples/multiple-schemas/mybook.yaml

... 使用以下方式 yaml-validator-cli

$ yaml-validator-cli                \
    --schema phonebook-schema.yaml  \
    --schema person-schema.yaml     \
    --uri phonebook                 \
    mybook.yaml
all files validated successfully!

将所有不同类型与嵌套引用结合

我们可以按以下3级定义一个模式,其中 customer-list 定义为一个客户数组,这些客户又包含自己的元素,以及引用第三个模式 'car'

# schema.yaml
---
uri: car
schema:
  type: object
  items:
    year:
      type: integer
    model:
      type: string
    extra features:
      type: array
      items:
        type: string
    price: 
      type: real

---
uri: customer
schema:
  type: object
  items:
    name:
      type: string
    cars:
      type: hash
      items:
        $ref: car

---
uri: customer-list
schema:
  type: array
  items:
    $ref: customer

来源:examples/all-types/schema.yaml

验证以下客户列表文档与定义的方案

# customers.yaml
---
- name: Teodor Fælgen
  cars:
    work:
      model: Ford T
      extra features:
        - gps
        - heated seats
      price: 200.00
    racing:
      model: Il Tempo Gigante
      extra features:
        - blood bank
        - radar
      price: 3000.00

- name: Lightning McQueen
  cars:
    himself:
      model: Stock
      extra features:
        - massive eyes instead of windows
        - arrogance
      price: 0.00

来源:examples/all-types/customers.yaml

... 使用以下方式 yaml-validator-cli

$ yaml-validator-cli                \
    --schema schema.yaml            \
    --uri customer-list             \
    customers.yaml
all files validated successfully!

定位文档中的错误

错误消息始终包含文档中的完整路径,以及发生验证错误时所在的文档名。这使得您可以轻松跟踪错误的精确来源。

以下是一个电话簿模式

# schema.yaml
---
uri: person
schema:
  type: object
  items:
    name:
      type: string
    age: 
      type: integer

---
uri: phonebook
schema:
  type: array
  items:
    $ref: person

来源:examples/locating-errors/schema.yaml

我们可以验证以下非常不符合规范的文档,如下定义

# phonebook.yaml
- name: John
  age: 52
- name: Karen
  age: 12.5
- name: 200
  age: Jimmy

来源:examples/locating-errors/phonebook.yaml

使用以下方式 yaml-validator-cli

$ yaml-validator-cli      \
    --schema schema.yaml  \
    --uri phonebook       \
     phonebook.yaml
phonebook.yaml:
#[1].age: wrong type, expected integer got real
#[2].age: wrong type, expected integer got string
#[2].name: wrong type, expected string got integer

错误消息正确地告诉我们提供的文档 phonebook.yaml 存在问题。Karen 的年龄是实数,不是整数,而 Jimmy 的年龄和名字已被调换。

注意: # 表示文档的根,在此情况下为 phonebook.yaml


依赖项

~6.5MB
~111K SLoC