2017-10-07 21 views
0

私はケルベロスを使って、typedataフィールドを持つペイロードを検証しています。 typetestまたはbuild)の値に応じて、異なる制約に対してdataを検証したいと思います。 Cerberusの別のフィールドの値に応じて、スキーマに対してフィールドを検証するにはどうすればよいですか?

>>> validator = cerberus.Validator(schemas.abstract_task) 
>>> validator.validate({ 
...  "type": "build", 
...  "data": {"environment": "staging"}}) 
>>> pp validator.errors 
{'data': {'anyof': 'no definitions validated', 
      'definition 0': {'environment': 'unknown field', 
          'folder': 'required field'}, 
      'definition 1': {'environment': 'unallowed value bad'}}} 

は条件付きで使用する方法があります:意図したサブスキーマが失敗したとき

test_task = {"folder": {"required": True}} 
build_task = {"environment": {"allowed": ["staging", "product"]}} 
abstract_task = {'type': {'allowed': ['test', 'build']}, 
       'data': {'type': 'dict', 
          'required': True, 
          'anyof': [{'schema': test_task}, 
            {'schema': build_task}]}} 

しかし、他に関するエラーが報告されます。

はこれまでのところ、私は、このセットアップを肝炎definition 1兄弟typeの値がbuildの場合は?

この質問はthis issueに由来しています。

答えて

0
あなたはまさにそれを達成することはできませんが、より明確なエラー報告を取得するために oneofの使用と dependenciesルールを作ることができる単一のスキーマと検証して

test_task = {"folder": {"required": True}} 
build_task = {"environment": {"allowed": ["staging", "product"]}} 
abstract_task = {'type': {'allowed': ['test', 'build']}, 
       'data': {'type': 'dict', 
          'required': True, 
          'oneof': [{'dependencies': {'type': 'test'}, 
            'schema': test_task}, 
            {'dependencies': {'type': 'build'}, 
            'schema': build_task}]}} 

これで判明する方法でありますサブスキーマの1つに対して許容されない値:

>>> document = {"type": "build", "data": {"environment": "legacy"}} 
>>> validator(document, abstract_task) 
{'data': [{'oneof': ['none or more than one rule validate', 
        {'oneof definition 0': ["depends on these values: {'type': 'test'}", 
              {'environment': ['unknown field'], 
               'folder': ['required field']}], 
         'oneof definition 1': [{'environment': ['unallowed value legacy']}]} 
        ]}]} 
関連する問題