Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_config_and_base():
with pytest.raises(errors.ConfigError):
create_model('FooModel', __config__=BaseModel.Config, __base__=BaseModel)
def test_unable_to_infer():
with pytest.raises(errors.ConfigError) as exc_info:
class InvalidDefinitionModel(BaseModel):
x = None
assert exc_info.value.args[0] == 'unable to infer type for attribute "x"'
def check_for_unused(self) -> None:
unused_validators = set(
chain(
*[
(v.func.__name__ for v in self.validators[f] if v.check_fields)
for f in (self.validators.keys() - self.used_validators)
]
)
)
if unused_validators:
fn = ', '.join(unused_validators)
raise ConfigError(
f"Validators defined with incorrect fields: {fn} " # noqa: Q000
f"(use check_fields=False if you're inheriting from the model and intended this)"
def add_root_validator(
cls,
validator: Callable,
*,
pre: bool = False,
skip_on_failure: bool = False,
index: int = -1,
):
""" """
from inspect import signature
from inspect import isfunction
if not isfunction(validator):
raise ConfigError(
f"'{validator.__qualname__}' must be function not method from class."
)
sig = signature(validator)
args = list(sig.parameters.keys())
if args[0] != "cls":
raise ConfigError(
f"Invalid signature for root validator {validator.__qualname__}: {sig}, "
f'"args[0]" not permitted as first argument, '
f"should be: (cls, values)."
)
if len(args) != 2:
raise ConfigError(
f"Invalid signature for root validator {validator.__qualname__}: {sig}, "
"should be: (cls, values)."
)
if pre:
def __new__(cls, name: str, bases: Any, dct: Dict[str, Any]) -> 'ConstrainedInt': # type: ignore
new_cls = cast('ConstrainedInt', type.__new__(cls, name, bases, dct))
if new_cls.gt is not None and new_cls.ge is not None:
raise errors.ConfigError('bounds gt and ge cannot be specified at the same time')
if new_cls.lt is not None and new_cls.le is not None:
raise errors.ConfigError('bounds lt and le cannot be specified at the same time')
return new_cls
def __new__(cls, name: str, bases: Any, dct: Dict[str, Any]) -> 'ConstrainedInt': # type: ignore
new_cls = cast('ConstrainedInt', type.__new__(cls, name, bases, dct))
if new_cls.gt is not None and new_cls.ge is not None:
raise errors.ConfigError('bounds gt and ge cannot be specified at the same time')
if new_cls.lt is not None and new_cls.le is not None:
raise errors.ConfigError('bounds lt and le cannot be specified at the same time')
return new_cls
def _generic_validator_basic(validator: AnyCallable, sig: Signature, args: Set[str]) -> 'ValidatorCallable':
has_kwargs = False
if 'kwargs' in args:
has_kwargs = True
args -= {'kwargs'}
if not args.issubset(all_kwargs):
raise ConfigError(
f'Invalid signature for validator {validator}: {sig}, should be: '
f'(value, values, config, field), "values", "config" and "field" are all optional.'
)
if has_kwargs:
return lambda cls, v, values, field, config: validator(v, values=values, field=field, config=config)
elif args == set():
return lambda cls, v, values, field, config: validator(v)
elif args == {'values'}:
return lambda cls, v, values, field, config: validator(v, values=values)
elif args == {'field'}:
return lambda cls, v, values, field, config: validator(v, field=field)
elif args == {'config'}:
return lambda cls, v, values, field, config: validator(v, config=config)
elif args == {'values', 'field'}:
return lambda cls, v, values, field, config: validator(v, values=values, field=field)
def from_orm(cls: Type['Model'], obj: Any) -> 'Model':
if not cls.__config__.orm_mode:
raise ConfigError('You must have the config attribute orm_mode=True to use from_orm')
obj = cls._decompose_class(obj)
m = cls.__new__(cls)
values, fields_set, validation_error = validate_model(cls, obj)
if validation_error:
raise validation_error
object.__setattr__(m, '__dict__', values)
object.__setattr__(m, '__fields_set__', fields_set)
return m
pre: bool = False,
skip_on_failure: bool = False,
index: int = -1,
):
""" """
from inspect import signature
from inspect import isfunction
if not isfunction(validator):
raise ConfigError(
f"'{validator.__qualname__}' must be function not method from class."
)
sig = signature(validator)
args = list(sig.parameters.keys())
if args[0] != "cls":
raise ConfigError(
f"Invalid signature for root validator {validator.__qualname__}: {sig}, "
f'"args[0]" not permitted as first argument, '
f"should be: (cls, values)."
)
if len(args) != 2:
raise ConfigError(
f"Invalid signature for root validator {validator.__qualname__}: {sig}, "
"should be: (cls, values)."
)
if pre:
if validator not in cls.__pre_root_validators__:
if index == -1:
cls.__pre_root_validators__.append(validator)
else:
cls.__pre_root_validators__.insert(index, validator)
return
def prepare(self) -> None:
"""
Prepare the field but inspecting self.default, self.type_ etc.
Note: this method is **not** idempotent (because _type_analysis is not idempotent),
e.g. calling it it multiple times may modify the field and configure it incorrectly.
"""
if self.default is not None and self.type_ is None:
self.type_ = type(self.default)
self.outer_type_ = self.type_
if self.type_ is None:
raise errors_.ConfigError(f'unable to infer type for attribute "{self.name}"')
if type(self.type_) == ForwardRef:
# self.type_ is currently a ForwardRef and there's nothing we can do now,
# user will need to call model.update_forward_refs()
return
self.validate_always = getattr(self.type_, 'validate_always', False) or any(
v.always for v in self.class_validators.values()
)
if self.required is False and self.default is None:
self.allow_none = True
self._type_analysis()
if self.required is Undefined:
self.required = True