Source code for validx.py.pipelines
from .. import contracts
from .. import exc
from . import abstract
[docs]class AllOf(abstract.Validator):
"""
AND-style Pipeline Validator
All steps must be succeeded.
The last step returns result.
:param Validator \\*steps:
nested validators.
:raises ValidationError:
raised by the first failed step.
:note:
it uses :class:`validx.exc.Step` marker to indicate,
which step is failed.
"""
__slots__ = ("steps",)
def __init__(self, *args, **kw):
# Python 2.7 complains on key-word only arguments
kw.setdefault("steps", args)
self.__init(**kw)
def __init(self, steps=None, alias=None, replace=False):
steps = contracts.expect_sequence(
self, "steps", steps, item_type=abstract.Validator
)
setattr = object.__setattr__
setattr(self, "steps", steps)
self._register(alias, replace)
def __call__(self, value, __context=None):
if __context is None:
__context = {} # Setup context, if it's top level call
for num, step in enumerate(self.steps):
try:
value = step(value, __context)
except exc.ValidationError as e:
raise e.add_context(exc.Step(num))
return value
[docs]class OneOf(abstract.Validator):
"""
OR-style Pipeline Validator
The first succeeded step returns result.
:param Validator \\*steps:
nested validators.
:raises SchemaError:
if all steps are failed,
so it contains all errors,
raised by each step.
:note:
it uses :class:`validx.exc.Step` marker to indicate,
which step is failed.
"""
__slots__ = ("steps",)
def __init__(self, *args, **kw):
# Python 2.7 complains on key-word only arguments
kw.setdefault("steps", args)
self.__init(**kw)
def __init(self, steps=None, alias=None, replace=False):
steps = contracts.expect_sequence(
self, "steps", steps, item_type=abstract.Validator
)
setattr = object.__setattr__
setattr(self, "steps", steps)
self._register(alias, replace)
def __call__(self, value, __context=None):
if __context is None:
__context = {} # Setup context, if it's top level call
errors = []
for num, step in enumerate(self.steps):
try:
return step(value, __context)
except exc.ValidationError as e:
errors.extend(ne.add_context(exc.Step(num)) for ne in e)
if errors:
raise exc.SchemaError(errors)