Source code for wheezy.validation.validator

""" ``validator`` module.
"""

from gettext import NullTranslations

from wheezy.validation.comp import ref_getter

null_translations = NullTranslations()


[docs]class Validator(object): """Container of validation rules that all together provide object validation. """ __slots__ = ("rules", "inner") def __init__(self, mapping): """Split `mapping` by one that holds iteratable of rules and the other with nested validators. """ rules = [] inner = [] for name, value in mapping.items(): if hasattr(value, "__iter__"): rules.append((name, tuple(value))) else: inner.append((name, value)) self.rules = tuple(rules) self.inner = tuple(inner)
[docs] def validate( self, model, results, stop=True, translations=None, gettext=None ): """Validates given `model` with results of validation stored in `results`. Be default the validation stops on first rule fail, however with supplied `stop` argument set `False` the `result` will get all errors reported by a rule. There is a way to internationalize validation errors with `translations` or `gettext`. """ if gettext is None: if translations is None: translations = null_translations gettext = translations.gettext succeed = True getter = ref_getter(model) for name, rules in self.rules: value = getter(model, name) result = [] for rule in rules: rule_succeed = rule.validate( value, name, model, result, gettext ) succeed &= rule_succeed if not rule_succeed and stop: break if result: results[name] = result for name, validator in self.inner: succeed &= validator.validate( getter(model, name), results, stop, None, gettext ) return succeed