def validate(self, value: typing.Any, *, strict: bool = False) -> typing.Any: if value is None and self.allow_null: return None elif value is None: raise self.validation_error("null") elif not isinstance(value, list): raise self.validation_error("type") if (self.min_items is not None and self.min_items == self.max_items and len(value) != self.min_items): raise self.validation_error("exact_items") if self.min_items is not None and len(value) < self.min_items: if self.min_items == 1: raise self.validation_error("empty") raise self.validation_error("min_items") elif self.max_items is not None and len(value) > self.max_items: raise self.validation_error("max_items") # Ensure all items are of the right type. validated = [] error_messages: typing.List[Message] = [] if self.unique_items: seen_items = Uniqueness() for pos, item in enumerate(value): validator = None if isinstance(self.items, list): if pos < len(self.items): validator = self.items[pos] elif isinstance(self.additional_items, Field): validator = self.additional_items elif self.items is not None: validator = self.items if validator is None: validated.append(item) else: item, error = validator.validate_or_error(item, strict=strict) if error: error_messages += error.messages(add_prefix=pos) else: validated.append(item) if self.unique_items: if item in seen_items: text = self.get_error_text("unique_items") message = Message(text=text, code="unique_items", key=pos) error_messages.append(message) else: seen_items.add(item) if error_messages: raise ValidationError(messages=error_messages) return validated
def validate(self, value: typing.Any, *, strict: bool = False) -> typing.Any: if value is None and self.allow_null: return None elif value is None: raise self.validation_error("null") elif value not in Uniqueness([key for key, value in self.choices]): if value == "": if self.allow_null and not strict: return None raise self.validation_error("required") raise self.validation_error("choice") return value