Source code for docarray.document.mixins.property

import mimetypes
from typing import TYPE_CHECKING, Optional

from docarray.document.mixins._property import _PropertyMixin

if TYPE_CHECKING:  # pragma: no cover
    from docarray.typing import DocumentContentType, ArrayType
    from docarray import DocumentArray

_all_mime_types = set(mimetypes.types_map.values())


[docs]class PropertyMixin(_PropertyMixin): def _clear_content(self): self._data.content = None self._data.text = None self._data.tensor = None self._data.blob = None @property def content(self) -> Optional['DocumentContentType']: ct = self.content_type if ct: return getattr(self, ct) @_PropertyMixin.text.setter def text(self, value: str): if value is not None: self._clear_content() self._data.text = value @_PropertyMixin.blob.setter def blob(self, value: bytes): if value is not None: self._clear_content() self._data.blob = value @_PropertyMixin.tensor.setter def tensor(self, value: 'ArrayType'): if value is not None: self._clear_content() self._data.tensor = value @content.setter def content(self, value: 'DocumentContentType'): self._clear_content() if isinstance(value, bytes): self._data.blob = value elif isinstance(value, str): self._data.text = value elif value is not None: self._data.tensor = value @_PropertyMixin.uri.setter def uri(self, value: str): if value: mime_type = mimetypes.guess_type(value)[0] if mime_type: self._data.mime_type = mime_type self._data.uri = value @_PropertyMixin.mime_type.setter def mime_type(self, value: str): if value and value not in _all_mime_types: # given but not recognizable, do best guess r = mimetypes.guess_type(f'*.{value}')[0] value = r or value self._data.mime_type = value @_PropertyMixin.chunks.setter def chunks(self, value: 'DocumentArray'): from docarray.array.chunk import ChunkArray if not isinstance(value, ChunkArray): value = ChunkArray(value, reference_doc=self._data._reference_doc) self._data.chunks = value @_PropertyMixin.matches.setter def matches(self, value: 'DocumentArray'): from docarray.array.match import MatchArray if not isinstance(value, MatchArray): value = MatchArray(value, reference_doc=self._data._reference_doc) self._data.matches = value @property def content_type(self) -> Optional[str]: nf = self.non_empty_fields if 'text' in nf: return 'text' elif 'tensor' in nf: return 'tensor' elif 'blob' in nf: return 'blob'