Source code for glQiwiApi.types.arbitrary.file

from __future__ import annotations

import asyncio
import inspect
import pathlib
from typing import Any, BinaryIO, Union

from glQiwiApi.types.arbitrary.inputs import AbstractInput
from glQiwiApi.utils.compat import aiofiles

CHUNK_SIZE = 65536

StrOrBytesPath = Union[str, bytes, pathlib.Path]  # stable

_OpenFile = Union[StrOrBytesPath, int]


[docs]class File: def __init__(self, input: AbstractInput[Any]) -> None: self._input = input def get_filename(self) -> str: return self._input.get_filename() def get_underlying_file_descriptor(self) -> BinaryIO: return self._input.get_file() def get_path(self) -> str: return self._input.get_path() def save(self, path: StrOrBytesPath, chunk_size: int = CHUNK_SIZE) -> None: file_descriptor = self.get_underlying_file_descriptor() with open(path, 'wb') as fp: while True: data = file_descriptor.read(chunk_size) if not data: break fp.write(data) fp.flush() if file_descriptor.seekable(): file_descriptor.seek(0) async def save_asynchronously( self, path: StrOrBytesPath, chunk_size: int = CHUNK_SIZE ) -> None: file_descriptor = self.get_underlying_file_descriptor() async with aiofiles.open(path, 'wb') as fp: while True: data = file_descriptor.read(chunk_size) if not data: break await fp.write(data) await fp.flush() if file_descriptor.seekable(): file_descriptor.seek(0) def __str__(self) -> str: try: return self.get_filename() except TypeError: return '<File(binary stream underlies)>' def __del__(self) -> None: if not hasattr(self, '_input'): return if inspect.iscoroutinefunction(self._input.close()): # type: ignore # noqa return asyncio.ensure_future(self._input.close()) # type: ignore # noqa self._input.close() __repr__ = __str__