Skip to content

models

models

BinaryFile

BinaryFile(
    fptr: IO[bytes], suggested_filename=None, mimetype=None
)

Bases: Response

Base class for handling files.

Added in version 0.4.0

Changed in version 0.6.10

  • added __enter__ and __exit__ methods that map to the underlying Response object
Source code in src/itkdb/models/file.py
def __init__(self, fptr: IO[bytes], suggested_filename=None, mimetype=None):
    super().__init__()
    self.status_code = 200
    self.fptr = fptr

    self._suggested_filename = suggested_filename
    self._mimetype = mimetype

content property

content: bytes

Raw bytes of the content.

content_type property

content_type: str

Mimetype of the content.

extension property

extension: str | None

Extension of file.

Return the extension of the file in this order
  1. extension using the (suggested) filename taken from response headers (if filename has extension)
  2. extension using mimetype from object initialization
  3. extension using mimetype guessed from file content itself

filename property

filename: str

Filename of file on disk.

fptr instance-attribute

fptr = fptr

mimetype property

mimetype: str | None

Mimetype of the file.

size property

size: int

Size of file in bytes.

size_fmt property

size_fmt: str

Human-readable size of file.

status_code instance-attribute

status_code = 200

suggested_filename property

suggested_filename: str | None

Suggested filename.

__del__

__del__() -> None
Source code in src/itkdb/models/file.py
def __del__(self) -> None:
    if not self.fptr.closed:
        self.fptr.close()

__len__

__len__() -> int
Source code in src/itkdb/models/file.py
def __len__(self) -> int:
    return self.size

__repr__

__repr__() -> str
Source code in src/itkdb/models/file.py
def __repr__(self) -> str:
    cls = type(self)
    module = cls.__module__
    qualname = cls.__qualname__

    return f"<{module}.{qualname}(suggested_filename={self.suggested_filename}, size={self.size_fmt} [{self.size} bytes]) file-like object at {self.filename}>"

from_response classmethod

from_response(response) -> Self

Factory to create BinaryFile-like object from requests.Response.

Source code in src/itkdb/models/file.py
@classmethod
def from_response(cls, response) -> Self:
    """
    Factory to create BinaryFile-like object from requests.Response.
    """
    if isinstance(response, BinaryFile):
        # Translation already done
        return response

    mimetype = response.headers.get("content-type")
    content_disposition = response.headers.get("content-disposition", "")
    # NB: cgi module deprecated in 3.11
    msg = EmailMessage()
    msg["content-disposition"] = content_disposition
    filename = msg["content-disposition"].params.get("filename")

    temp_fp = (
        NamedTemporaryFile()  # pylint: disable=consider-using-with # noqa: SIM115
    )
    for chunk in response.iter_content(chunk_size=512 * 1024):
        temp_fp.write(chunk)

    temp_fp.seek(0)
    response.close()
    binary = cls(temp_fp, suggested_filename=filename, mimetype=mimetype)

    # from https://github.com/psf/requests/blob/a6cf27a77f6f5dd6116096e95c16e7c1a616b419/src/requests/adapters.py#L359-L394
    for attr in [
        "status_code",
        "headers",
        "encoding",
        "raw",
        "reason",
        "request",
        "url",
    ]:
        setattr(binary, attr, getattr(response, attr))

    return binary

save

save(filename=None) -> int

Save the file.

Source code in src/itkdb/models/file.py
def save(self, filename=None) -> int:
    """
    Save the file.
    """
    new_filename = filename or self.suggested_filename
    if new_filename is None:
        msg = "Please set a filename to save to first."
        raise ValueError(msg)

    copyfile(self.filename, Path(new_filename))
    log.info("Written %s (%d bytes) to %s", self.size_fmt, self.size, new_filename)
    return self.size

ImageFile

ImageFile(
    fptr: IO[bytes], suggested_filename=None, mimetype=None
)

Bases: BinaryFile

Class to handle image files.

Changed in version 0.4.0

Source code in src/itkdb/models/file.py
def __init__(self, fptr: IO[bytes], suggested_filename=None, mimetype=None):
    super().__init__()
    self.status_code = 200
    self.fptr = fptr

    self._suggested_filename = suggested_filename
    self._mimetype = mimetype

TextFile

TextFile(
    fptr: IO[bytes], suggested_filename=None, mimetype=None
)

Bases: BinaryFile

Class to handle text files.

Changed in version 0.4.0

Source code in src/itkdb/models/file.py
def __init__(self, fptr: IO[bytes], suggested_filename=None, mimetype=None):
    super().__init__()
    self.status_code = 200
    self.fptr = fptr

    self._suggested_filename = suggested_filename
    self._mimetype = mimetype

ZipFile

ZipFile(binary_file)

Bases: ZipFile

Class to handle zip files.

Added in version 0.4.0

Source code in src/itkdb/models/file.py
def __init__(self, binary_file):
    self._file = binary_file
    super().__init__(self._file.fptr)

content property

content: bytes

Raw bytes of the content.

content_type property

content_type: str

Mimetype of the content.

extension property

extension

Extension of file. See BinaryFile.extension.

mimetype property

mimetype: str

Mimetype of the file.

size property

size

Size of file in bytes.

size_fmt property

size_fmt: str

Human-readable size of file.

suggested_filename property

suggested_filename

Suggested filename.

__enter__

__enter__() -> BinaryFile
Source code in src/itkdb/models/file.py
def __enter__(self) -> BinaryFile:
    return self._file.__enter__()

__exit__

__exit__(*args) -> None
Source code in src/itkdb/models/file.py
def __exit__(self, *args) -> None:
    return self._file.__exit__()

__repr__

__repr__() -> str
Source code in src/itkdb/models/file.py
def __repr__(self) -> str:
    cls = type(self)
    module = cls.__module__
    qualname = cls.__qualname__

    return f"<{module}.{qualname}(suggested_filename={self.suggested_filename}, size={self.size_fmt} [{self.size} bytes]) file-like object at {self.filename}>"

from_response classmethod

from_response(response)

Factory to create BinaryFile-like object from requests.Response.

Source code in src/itkdb/models/file.py
@classmethod
def from_response(cls, response):
    """
    Factory to create BinaryFile-like object from requests.Response.
    """
    return cls(BinaryFile.from_response(response))

save

save(filename=None) -> int

Save the file.

Source code in src/itkdb/models/file.py
def save(self, filename=None) -> int:
    """
    Save the file.
    """
    return self._file.save(filename=filename)