Source code for cfglib.validation

from typing import *


__all__ = [
    'ValidationContext',
    'Validator',
    'ValidationError',

    'value_type',
]


[docs]class ValidationContext: def __init__(self, field_name: Optional[str]): self.field_name = field_name
Validator = Callable[[ValidationContext, Any], Any] # Exceptions
[docs]class ValidationError(Exception): """Raised when a setting value is not valid according to the setting parameters""" pass
[docs]def value_type(type_spec: Union[type, Tuple[type, ...]]): def _type_validator(ctx: ValidationContext, value: Any) -> Any: if not isinstance(value, type_spec): if isinstance(type_spec, type): expected = type_spec.__name__ else: expected = f'one of: {", ".join(t.__name__ for t in type_spec)}' raise ValidationError( f'The type of a value for setting {ctx.field_name or "<?>"}' f' must be {expected}' ) return value return _type_validator
def one_of(options: Iterable[Any]): def _oneof_validator(ctx: ValidationContext, value: Any) -> Any: if value not in options: expected = f'one of: {", ".join(map(repr, options))}' raise ValidationError( f'A value for setting {ctx.field_name or "<?>"} must be {expected}' ) return value return _oneof_validator