Source code for glQiwiApi.types.arbitrary.inputs
from __future__ import annotations
import abc
import io
import os
import pathlib
from types import TracebackType
from typing import Any, BinaryIO, Generic, Optional, Type, TypeVar
InputType = TypeVar('InputType')
__all__ = ('AbstractInput', 'PlainPathInput', 'PathlibPathInput', 'BinaryIOInput')
[docs]class AbstractInput(abc.ABC, Generic[InputType]):
def __init__(self, input_: InputType) -> None:
self._input = input_
self._file_descriptor: Optional[BinaryIO] = None
@abc.abstractmethod
def get_file(self) -> BinaryIO:
...
def get_path(self) -> str:
raise TypeError(
f"{self.__class__.__qualname__} doesn't provide a mechanism to get path to file"
)
def get_filename(self) -> str:
raise TypeError(
f"{self.__class__.__qualname__} doesn't provide a mechanism to get filename"
)
def close(self) -> None:
if self._file_descriptor is None:
return None
self._file_descriptor.close()
def __enter__(self) -> AbstractInput[Any]:
self._file_descriptor = self.get_file()
return self
def __exit__(
self,
exc_type: Optional[Type[BaseException]],
exc_value: Optional[BaseException],
traceback: Optional[TracebackType],
) -> None:
self.close()
[docs]class PlainPathInput(AbstractInput[str]):
def get_file(self) -> BinaryIO:
if pathlib.Path(self._input).is_file() is False:
raise TypeError(f'Input {self._input} is not a file!')
descriptor = open(self._input, 'rb')
self._file_descriptor = descriptor
return descriptor
def get_path(self) -> str:
return self._input
def get_filename(self) -> str:
return os.path.split(self._input)[-1]
[docs]class PathlibPathInput(AbstractInput[pathlib.Path]):
def get_file(self) -> BinaryIO:
descriptor = open(self._input, 'rb')
self._file_descriptor = descriptor
return descriptor
def get_path(self) -> str:
return str(self._input.resolve())
def get_filename(self) -> str:
return self._input.name
[docs]class BinaryIOInput(AbstractInput[BinaryIO]):
def get_file(self) -> BinaryIO:
return self._input
@classmethod
def from_bytes(cls: Type[BinaryIOInput], b: bytes) -> BinaryIOInput:
return cls(input_=io.BytesIO(b))