Agnostic validators for python 3
Freely based on [WTF-Forms](https://github.com/wtforms/wtforms) validators.
Warning
Be aware about incompatible changes on Version 0.6.0.
- Python 3 package.
- Easy to create a validator.
- Chained validations.
- Conditional validations.
- Specific error control messages.
- Dirty model integration (https://github.com/alfred82santa/dirty-models)
- No database dependent.
- Asynchronous validators.
- Stateless validators.
- Deferred validators.
The stateless refactor. Dirty validators now are full stateless.
It means now there is no messages on validator instance. The is_valid
method returns
a validation context. It is evaluated as True
if there were no errors and false
otherwise. So, it is possible to still to use checks like if validator.is_valid(my_data):
but we recomend to use the Walruf operator (https://peps.python.org/pep-0572/):
if result := validator.is_valid(my_data):
.
That is important because messages are stored on context.
# Python +3.8
if result := validator.is_valid(my_data):
# some code
else:
print(result.error_messages)
#or
if not (result := validator.is_valid(my_data)):
print(result.error_messages)
On the other hand, validation error messages now are an object. It stores error code, error message
template and context values. There is a helper function from_context_to_legacy_message
in order
to convert a context to legacy message format.
- Stateless refactor
- New
Context
class stores state of validation process. - New
ValidationErrorMessage
class to store validation error messages. - New
Deferred
validator in order to build validator on runtime depending on context. - New
from_context_to_legacy_message
helper.
- Allow model validator inheritance.
- Remove hard dependency from Dirty Models.
- Fix bug iterating ListModels.
- Added value validators for mappings.
- Added asynchronous validators.
- Added
<root>
keyword in order to look up a field from root model of context. - Added
key_validator
argument for spec validators in order to validate keys on hashmaps.
$ pip install dirty-validators
from dirty_validators.basic import EqualTo, Length, Regexp, Email
from dirty_validators.complex import Optional, ModelValidate
validator = Optional(validators=[EqualTo(comp_value="test")])
assert validator.is_valid("test") is True
# Chained validation
validator_chain = Chain(validators=[Length(min=14, max=16), Regexp(regex='^abc'), Email()])
assert validator_chain.is_valid('abcdefg@test.com')
# Model validation
class MyModelValidator(ModelValidate):
fieldName1 = Optional(validators=[Length(min=4, max=6)])
fieldName2 = Optional(validators=[Length(min=1, max=2)])
fieldName3 = Required(validators=[Length(min=7, max=8)])
validator_model = MyModelValidator()
data = {
"fieldName1": "1234",
"fieldName1": "12",
"fieldName3": "123456qw"
}
assert validator_model.is_valid(FakeModel(data)) is True
Note
Look at tests for more examples