def __init__(self, validator, schema=None): """ :param validator: An instance of Validator-(sub-)class that uses this schema. :param schema: A definition-schema as ``dict``. Defaults to an empty one. """ self._repr = ("unvalidated schema: {}", schema) if not isinstance(validator, UnconcernedValidator): raise RuntimeError('validator argument must be a Validator-' 'instance.') self.validator = validator self.regenerate_validation_schema() self.schema_validator = SchemaValidator( None, allow_unknown=self.validation_schema, error_handler=errors.SchemaErrorHandler, target_validator=validator, ) if isinstance(schema, str): schema = validator.schema_registry.get(schema, schema) if not isinstance(schema, abc.Mapping): raise SchemaError(errors.SCHEMA_TYPE.format(schema)) else: schema = normalize_schema(schema) self.validate(schema) self._repr = ("{}", schema) self.schema = schema
def __delitem__(self, key): _new_schema = self.schema.copy() try: del _new_schema[key] except ValueError: raise SchemaError("Schema has no field '{}' defined".format(key)) except Exception: raise else: del self.schema[key]
def _validate(self, schema): """ Validates a schema that defines rules against supported rules. :param schema: The schema to be validated as a legal cerberus schema according to the rules of this Validator object. """ if isinstance(schema, str): schema = self.validator.schema_registry.get(schema, schema) if schema is None: raise SchemaError(errors.SCHEMA_MISSING) schema = copy(schema) for field in schema: if isinstance(schema[field], str): schema[field] = rules_set_registry.get(schema[field], schema[field]) if not self.schema_validator(schema, normalize=False): raise SchemaError(self.schema_validator.errors)
def _validate(self, schema): """ Validates a schema that defines rules against supported rules. :param schema: The schema to be validated as a legal cerberus schema according to the rules of the related Validator object. """ if isinstance(schema, str): schema = self.validator.schema_registry.get(schema, schema) if schema is None: raise SchemaError(errors.SCHEMA_MISSING) resolved = { k: self.validator.rules_set_registry.get(v, v) for k, v in schema.items() if isinstance(v, str) } if not self.schema_validator(ChainMap(resolved, schema), normalize=False): raise SchemaError(self.schema_validator.errors)
def update(self, schema): try: schema = normalize_schema(schema) _new_schema = self.schema.copy() _new_schema.update(schema) self.validate(_new_schema) except ValueError: raise SchemaError(errors.SCHEMA_TYPE.format(schema)) except Exception as e: raise e else: self.schema = _new_schema