예제 #1
0
파일: fields.py 프로젝트: jordic/typesystem
    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
예제 #2
0
파일: fields.py 프로젝트: jordic/typesystem
 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