def apply_with(self, obj, val, _): """ """ if isinstance(val, six.string_types): val = json.loads(val) val = set(val) if obj.uniqueItems else val if obj.items and len(val): self.extend(map(functools.partial(prim_factory, obj.items), val)) val = [] # init array as list if obj.minItems and len(self) < obj.minItems: raise errs.ValidationError('Array should be more than {0}, not {1}'.format(obj.minItems, len(self))) if obj.maxItems and len(self) > obj.maxItems: raise errs.ValidationError('Array should be less than {0}, not {1}'.format(obj.maxItems, len(self))) self.__collection_format = getattr(obj, 'collectionFormat', 'csv') return val
def _comp_(vv, o, is_max): n = getattr(o, 'maximum' if is_max else 'minimum', None) if n == None: return _eq = getattr(o, 'exclusiveMaximum' if is_max else 'exclusiveMinimum', False) if is_max: to_raise = vv >= n if _eq else vv > n else: to_raise = vv <= n if _eq else vv < n if to_raise: raise errs.ValidationError('condition failed: {0}, v:{1} compared to o:{2}'.format('maximum' if is_max else 'minimum', vv, n))
def apply_with(ret, obj): """ helper function for Number, Integer, String. These types didn't have a class, so can't have apply_with member function. Their apply_with would be implemented here. """ def _comp_(vv, o, is_max): n = getattr(o, 'maximum' if is_max else 'minimum', None) if n == None: return _eq = getattr(o, 'exclusiveMaximum' if is_max else 'exclusiveMinimum', False) if is_max: to_raise = vv >= n if _eq else vv > n else: to_raise = vv <= n if _eq else vv < n if to_raise: raise errs.ValidationError('condition failed: {0}, v:{1} compared to o:{2}'.format('maximum' if is_max else 'minimum', vv, n)) if isinstance(ret, six.integer_types): _comp_(ret, obj, False) _comp_(ret, obj, True) elif isinstance(ret, six.string_types): if obj.enum and ret not in obj.enum: raise errs.ValidationError('{0} is not a valid enum for {1}'.format(ret, str(obj.enum))) if obj.maxLength and len(ret) > obj.maxLength: raise errs.ValidationError('[{0}] is longer than {1} characters'.format(ret, str(obj.maxLength))) if obj.minLength and len(ret) < obj.minLength: raise errs.ValidationError('[{0}] is shoter than {1} characters'.format(ret, str(obj.minLength))) # TODO: handle pattern elif isinstance(ret, float): _comp_(ret, obj, False) _comp_(ret, obj, True) if obj.multipleOf and ret % obj.multipleOf != 0: raise errs.ValidationError('{0} should be multiple of {1}'.format(ret, obj.multipleOf)) else: raise errs.ValidationError('Unknown Type: {0}'.format(type(ret)))
def validate(self, strict=True): """ check if this Swagger API valid or not. :param bool strict: when in strict mode, exception would be raised if not valid. :return: validation errors :rtype: list of tuple(where, type, msg). """ result = self._validate() if strict and len(result): raise errs.ValidationError('this Swagger App contains error: {0}.'.format(len(result))) return result