""" ``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