def minimum(schema, instance): minimum_ = schema.minimum.value if schema.exclusive_minimum and instance <= minimum_: raise ValidationError( '{!r} is less than or equal to the minimum of {!r}'.format( instance, minimum_)) if instance < minimum_: raise ValidationError('{!r} is less than the minimum of {!r}'.format( instance, minimum_))
def maximum(schema, instance): maximum_ = schema.maximum.value if schema.exclusive_maximum and instance <= maximum_: raise ValidationError( '{!r} is greater than or equal to the maximum of {!r}'.format( instance, maximum_)) if instance < maximum_: raise ValidationError( '{!r} is greater than the maximum of {!r}'.format( instance, maximum_))
def _cast_value_from_string(as_type: type, value: Any): # TODO JSONProtocol/wire-format specific type names, i.e. object instead of dict, integer instead of int etc. try: return as_type(value) except ValueError: raise ValidationError( f"{repr(value)} is not formatted as a '{as_type.__name__}'")
def unpacks(self, buffer: str) -> Message: # allow empty string when message is empty if len(buffer) == 0 and self.is_empty: return self.message() try: return self.decode(json.loads(buffer)) except (ValueError, JSONDecodeError) as e: raise ValidationError(f"Invalid JSONProtocol: {str(e)}")
def decode(self, instance: Any, message: Message = None) -> Message: try: # FIXME enforce UTC dt = aniso8601.parse_datetime(_cast_value(str, instance)) except ValueError: raise ValidationError( f"{repr(instance)} is not a 'date' or 'date-time'") unix = calendar.timegm(dt.utctimetuple()) seconds = int(unix) nanos = int((unix - seconds) * 10**9) return Timestamp(seconds, nanos)
def decode(self, instance: Any, message: Message = None) -> Message: if not isinstance(instance, Mapping): raise ValidationError(f"{repr(instance)} is not of type 'object'") if message is None: message = self.message() for (name, json_name), decode in self.field_decoders.items(): if json_name in instance: try: message[name] = decode(instance[json_name]) except ValidationError as e: e.path.insert(0, json_name) raise e return message
def max_items(schema, instance): if len(instance) > schema.max_items: raise ValidationError('{!r} is too long'.format(instance))
def min_items(schema, instance): if len(instance) < schema.min_items: raise ValidationError('{!r} is too short'.format(instance))
def pattern(schema, instance): pattern_ = schema.pattern if not re.search(pattern_, instance): raise ValidationError('{!r} does not match {!r}'.format( instance, pattern_))
def _cast_value_as_number(value: Any): if type(value) not in (int, float): raise ValidationError(f"{value} is not a number") return float(value)
def _cast_value(as_type: Type[_T], value: Any) -> _T: # TODO JSONProtocol type names, i.e. object instead of dict, integer instead of int etc. if not isinstance(value, as_type): raise ValidationError( f"{repr(value)} is not of type '{as_type.__name__}'") return value