VAlidators Adapter makes validation by any existing validator with the same interface.
Supported validators:
| validator | adapter |
|---|---|
| Cerberus | va.cerberus |
| Django Forms | va.django |
| Marshmallow | va.marshmallow |
| PySchemes | va.pyschemes |
| Django REST Framework | va.restframework |
| WTForms | va.wtforms |
python3 -m pip install --user vaaimport marshmallow
import vaa
@vaa.marshmallow
class Scheme(marshmallow.Schema):
id = marshmallow.fields.Int(required=True)
name = marshmallow.fields.Str(required=True)All schemes adopted by vaa has the same interface:
validator = Scheme({'id': '1', 'name': 'Oleg'})
validator.is_valid() # True
validator.cleaned_data # {'name': 'Oleg', 'id': 1}
validator = Scheme({'id': 'no', 'name': 'Oleg'})
validator.is_valid() # False
validator.errors # [Error(message='Not a valid integer.', field='id')]If you want to do validation with simple function, you can use va.simple adapter. For example, you want to check that in dict {'a': ..., 'b': ...} both values are positive. There are many ways to do so.
It can return bool:
@vaa.simple
def validate(a, b) -> bool:
return a > 0 and b > 0Or return message for error:
@vaa.simple
def validate(a, b) -> bool:
if a > 0 and b > 0:
return True
return 'should be positive'Or return errors dict:
@vaa.simple
def validate(a, b) -> bool:
if a <= 0:
return {'a': 'should be positive'}
if b <= 0:
return {'b': 'should be positive'}
return TrueOr raise va.ValidationError with error message or dict:
@vaa.simple
def validate(a, b) -> bool:
if a > 0 and b > 0:
return True
raise vaa.ValidationError('should be positive')Also, if you want to get the original dict without unpacking it into keyword arguments, do a function that accepts only one _ argument:
@vaa.simple
def validate(_):
return _['a'] > 0 and _['b'] > 0In that dict keys can be accessed as attributes:
@vaa.simple
def validate(_):
return _.a > 0 and _.b > 0Choose the best way and follow it. Avoid mixing them in one project.
If you're making a library that should accept any validator without explicit vaa usage, use vaa.wrap:
class Scheme(marshmallow.Schema):
id = marshmallow.fields.Int(required=True)
name = marshmallow.fields.Str(required=True)
validator = vaa.wrap(Scheme)({'id': 'no', 'name': 'Oleg'})
validator = Scheme({'id': 'no', 'name': 'Oleg'})
validator.is_valid() # False
validator.errors # [Error(message='Not a valid integer.', field='id')]