Skip to main content

一个非常简单的实用程序,用于验证对象是否具有某种结构。

项目描述

简单的模式验证器

覆盖范围

一个非常简单的实用程序,用于验证对象是否具有某种结构。在我们的一些项目中使用。

基本用法

pip install simple_schema_validator

一个例子:

假设我们有一个返回以下数据的 API:

{
  "user": 1,
  "profile": {
    "email": "some@user.com",
    "name": "Some User",
    "age": 20
  },
  "tokens": {
    "jwt": "...",
    "refresh": "...",
    "firebase": "...",
  }
}

我们正在编写一个简单的集成测试,以确保响应具有一定的结构。

然后我们可以像这样使用模式验证器:

from simple_schema_validator import schema_validator

data = get_data_from_api()

schema = {
  'user': Any,
  'profile': {
    'email': Any,
    'name': Any,
    'age': Any
  },
  'tokens': {
    'jwt': Any,
    'refresh': Any,
    'firebase': Any
  }
}

validation = schema_validator(schema, data)

if not validation:
    print(f'Keys in data, but not in schema: {validation.additional_keys}')
    print(f'Keys in schema, but not in data: {validation.missing_keys}')
    print(f'Keys with different type from schema {validation.type_errors}')
  • missing_keys是那些在 中需要schema但在 中找不到的键data。
  • additional_keys是那些存在于data中但不是schema.
  • validation_errors是那些与 indata中定义的类型不同的键schema。

嵌套键用“点”表示法 - profile.email、tokens.jwt等表示。

类型检查

该实用程序支持简单的模式类型检查。

目前,模式中支持的类型有:

  • int
  • float
  • str
  • bool
  • typing.Any(来自 Pythontyping库)
  • simple_schema_validator.types.Optional(自定义类型,在包中定义)

如果类型是Any,则不进行类型检查。

如果存在类型不匹配,则将错误放置在type_errors结果的属性中,该属性是类型错误的列表。

单一类型错误的一般格式是:

{
  'path': 'the.path.to.the.value.in.data',
  'expected': the_expected_type_as_defined_in_the_schema,
  'actual': the_actual_type_of_the_value
}

这是一个例子:

from simple_schema_validator import schema_validator, types


schema = {
  'user': str,
  'profile': {
    'email': str,
    'name': str,
    'age': int
  },
  'tokens': {
    'jwt': str,
    'refresh': str,
    'firebase': str
  }
}

data = {
  'user': 'Some User',
  'profile': {
    'email': 'someuser@hacksoft.io',
    'name': 'Some User',
    'age': "29"
  },
  'tokens': {
    'jwt': 'some token value',
    'refresh': 'some token value',
    'firebase': 'some token value'
  }

}

result = schema_validator(schema, data)


assert bool(result) is False
assert result.type_errors == [{'path': 'profile.age', 'expected': int, 'actual': str}]

可选类型

模式验证器支持可选类型。

您可以执行以下操作:

from simple_schema_validator import schema_validator, types

schema = {
  'a': types.Optional[int]
}

data_1 = {
  'a': None
}

data_2 = {
  'a': 1
}

data_3 = {
  'a': 'some_string'
}

assert bool(schema_validator(schema, data_1)) is True
assert bool(schema_validator(schema, data_2)) is True
assert bool(schema_validator(schema, data_3)) is False

此外,您可以在架构中定义可选分支:

from simple_schema_validator import schema_validator, types

schema = {
  'a': types.Optional[{
    'b': int
  }]
}

data_1 = {
  'a': None
}

data_2 = {
  'a': 1
}

data_3 = {
  'a': {
    'b': 1
  }
}

data_4 = {
  'a': {
    'b': 'some_string'
  }
}

assert bool(schema_validator(schema, data_1)) is True
assert bool(schema_validator(schema, data_2)) is False
assert bool(schema_validator(schema, data_3)) is True
assert bool(schema_validator(schema, data_4)) is False

您也可以将它与可选列表一起使用:

from simple_schema_validator import schema_validator, types

schema = {
  'a': types.Optional[[int]]
}

data_1 = {
  'a': None
}

data_2 = {
  'a': 1
}

data_3 = {
  'a': [1, 2, 3]
}

data_4 = {
  'a': ['some_string']
}

assert bool(schema_validator(schema, data_1)) is True
assert bool(schema_validator(schema, data_2)) is False
assert bool(schema_validator(schema, data_3)) is True
assert bool(schema_validator(schema, data_4)) is False

列表类型

架构验证器支持列表类型。

您可以执行以下操作:

from simple_schema_validator import schema_validator, types

schema = {
  'a': types.List[int]
}

data_1 = {
  'a': [1, 2, 3]
}

data_3 = {
  'a': ['some_string']
}

assert bool(schema_validator(schema, data_1)) is True
assert bool(schema_validator(schema, data_2)) is False

递归模式

模式验证器支持列表中模式的类型检查。

您可以执行以下操作:

from simple_schema_validator import schema_validator, types

schema = {
  'a': [{'b': int}]
}

data_1 = {
  'a': [{'b': 1}]
}

data_2 = {
  'a': [{'b': 'some_string'}]
}

assert bool(schema_validator(schema, data_1)) is True
assert bool(schema_validator(schema, data_2)) is False
from simple_schema_validator import schema_validator, types

schema = {
  'a': [{'b': [int]}]
}

data_1 = {
  'a': [{'b': [1]}]
}

data_2 = {
  'a': [{'b': [1, 2, 3]}]
}

data_3 = {
  'a': [{'b': ['some_string']}]
}

data_4 = {
  'a': [{'b': [1, 'some_string']}]
}

data_5 = {
  'a': [{'b': ['some_string', 'other_string']}]
}

data_6 = {
  'a': [{'b': ['some_string', 1]}]
}

assert bool(schema_validator(schema, data_1)) is True
assert bool(schema_validator(schema, data_2)) is True
assert bool(schema_validator(schema, data_3)) is False
assert bool(schema_validator(schema, data_4)) is False
assert bool(schema_validator(schema, data_5)) is False
assert bool(schema_validator(schema, data_6)) is False

您也可以对可选分支执行相同操作:

from simple_schema_validator import schema_validator, types

schema = {
  'a': [{'b': types.Optional[int]}]
}

data_1 = {
  'a': [{
    'b': {
      'c': 1,
      'd': 2
    }
  }]
}

data_2 = {
  'a': [{'b': 'some_string'}]
}

assert bool(schema_validator(schema, data_1)) is True
assert bool(schema_validator(schema, data_2)) is False

例子

例如,检查示例文件夹或项目的测试。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

simple_schema_validator-0.0.9.tar.gz (8.0 kB 查看哈希)

已上传 source

内置分布

simple_schema_validator-0.0.9-py2.py3-none-any.whl (9.1 kB 查看哈希)

已上传 py2 py3