def validate(self, value): if value is None: return verrors = ValidationErrors() s = set() for i, v in enumerate(value): if self.unique: if isinstance(v, dict): v = tuple(sorted(list(v.items()))) if v in s: verrors.add(f"{self.name}.{i}", "This value is not unique.") s.add(v) attr_verrors = ValidationErrors() for attr in self.items: try: attr.validate(v) except ValidationErrors as e: attr_verrors.add_child(f"{self.name}.{i}", e) else: break else: verrors.extend(attr_verrors) if verrors: raise verrors super().validate(value)
def clean_and_validate_args(args, kwargs): args = list(args) args = args[:args_index] + copy.deepcopy(args[args_index:]) kwargs = copy.deepcopy(kwargs) verrors = ValidationErrors() # Iterate over positional args first, excluding self i = 0 for _ in args[args_index:]: attr = nf.accepts[i] value = attr.clean(args[args_index + i]) args[args_index + i] = value try: attr.validate(value) except ValidationErrors as e: verrors.extend(e) i += 1 # Use i counter to map keyword argument to rpc positional for x in list(range(i + 1, f.__code__.co_argcount)): kwarg = f.__code__.co_varnames[x] if kwarg in kwargs: attr = nf.accepts[i] i += 1 value = kwargs[kwarg] elif len(nf.accepts) >= i + args_index: attr = nf.accepts[i] i += 1 value = None else: i += 1 continue value = attr.clean(value) kwargs[kwarg] = value try: attr.validate(value) except ValidationErrors as e: verrors.extend(e) if verrors: raise verrors return args, kwargs
def validate(self, value): verrors = ValidationErrors() attr_verrors = ValidationErrors() for attr in self.schemas: try: attr.validate(value) except TypeError: pass except ValidationErrors as e: attr_verrors.extend(e) else: break else: verrors.extend(attr_verrors) verrors.check()
def clean(self, value): found = False final_value = value verrors = ValidationErrors() for index, i in enumerate(self.schemas): try: tmpval = copy.deepcopy(value) final_value = i.clean(tmpval) except (Error, ValidationErrors) as e: if isinstance(e, Error): verrors.add(e.attribute, e.errmsg, e.errno) else: verrors.extend(e) else: found = True break if found is not True: raise Error(self.name, f'Result does not match specified schema: {verrors}') return final_value