from __future__ import annotations
import os
import shutil
import zipfile
from abc import abstractmethod
from typing import IO
def _unzip_file(fp: str | IO[bytes] | os.PathLike[str], extract_dir: str) -> None:
zip_file = zipfile.ZipFile(fp)
zip_file.extractall(extract_dir)
zip_file.close()
[docs]
class ZipClient:
[docs]
@abstractmethod
def exists(self) -> bool:
pass
[docs]
@abstractmethod
def make_archive(self) -> None:
pass
[docs]
@abstractmethod
def unpack_archive(self) -> None:
pass
[docs]
@abstractmethod
def remove(self) -> None:
pass
@property
@abstractmethod
def path(self) -> str:
pass
[docs]
class LocalZipClient(ZipClient):
def __init__(self, file_path: str, temporary_directory: str) -> None:
self._file_path = file_path
self._temporary_directory = temporary_directory
[docs]
def exists(self) -> bool:
return os.path.exists(self._file_path)
[docs]
def make_archive(self) -> None:
[base, extension] = os.path.splitext(self._file_path)
shutil.make_archive(base_name=base, format=extension[1:], root_dir=self._temporary_directory)
[docs]
def unpack_archive(self) -> None:
_unzip_file(fp=self._file_path, extract_dir=self._temporary_directory)
[docs]
def remove(self) -> None:
shutil.rmtree(self._file_path, ignore_errors=True)
@property
def path(self) -> str:
return self._file_path