Source code for statham.schema.elements.array

from typing import Any, List, TypeVar, Union

from statham.schema.constants import Maybe, NotPassed
from statham.schema.elements.base import Element
from statham.schema.helpers import remove_duplicates
from statham.schema.validation import InstanceOf


Item = TypeVar("Item")


# pylint: disable=too-many-instance-attributes
[docs]class Array(Element[List[Item]]): # pylint: disable=missing-param-doc """JSON Schema ``"array"`` element. :param items: As in :class:`statham.schema.elements.Element`, but as a required positional argument. """ items: Union[Element[Item], List[Element]] def __init__( self, items: Union[Element[Item], List[Element]], *, default: Maybe[List] = NotPassed(), const: Maybe[Any] = NotPassed(), enum: Maybe[List[Any]] = NotPassed(), additionalItems: Union[Element, bool] = True, minItems: Maybe[int] = NotPassed(), maxItems: Maybe[int] = NotPassed(), uniqueItems: bool = False, contains: Maybe[Element] = NotPassed(), description: Maybe[str] = NotPassed(), ): self.items = items self.default = default self.const = const self.enum = enum self.additionalItems = additionalItems self.minItems = minItems self.maxItems = maxItems self.uniqueItems = uniqueItems self.contains = contains self.description = description @property def annotation(self) -> str: if not self.item_annotations: return "List" if len(self.item_annotations) == 1: return f"List[{self.item_annotations[0]}]" return f"List[Union[{', '.join(self.item_annotations)}]]" @property def item_annotations(self) -> List[str]: """Get a list of possible type annotations.""" if isinstance(self.items, Element): return [self.items.annotation] annotations: List[str] = [item.annotation for item in self.items] if self.additionalItems is True: return ["Any"] if isinstance(self.additionalItems, Element): annotations.append(self.additionalItems.annotation) if "Any" in annotations: return ["Any"] return remove_duplicates(annotations) @property def type_validator(self): return InstanceOf(list)