file
file ¶
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 underlyingResponse
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
extension property
¶
extension: str | None
Extension of file.
Return the extension of the file in this order
- extension using the (suggested) filename taken from response headers (if filename has extension)
- extension using mimetype from object initialization
- extension using mimetype guessed from file content itself
__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)
__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)