diff --git a/README.md b/README.md index c5f869d52..4a30345a2 100644 --- a/README.md +++ b/README.md @@ -157,5 +157,15 @@ post_hooks: - "black ." ``` +### protected_dirs + +Specify directories to preserve when updating the client. + +```yaml +protected_dirs: + - "util" + - "cli" +``` + [changelog.md]: CHANGELOG.md [poetry]: https://python-poetry.org/ diff --git a/openapi_python_client/__init__.py b/openapi_python_client/__init__.py index 978b3d8df..afb0b794a 100644 --- a/openapi_python_client/__init__.py +++ b/openapi_python_client/__init__.py @@ -2,6 +2,7 @@ import json import mimetypes +import os import shutil import subprocess import sys @@ -127,7 +128,21 @@ def update(self) -> Sequence[GeneratorError]: if not self.package_dir.is_dir(): return [GeneratorError(detail=f"Directory {self.package_dir} not found")] print(f"Updating {self.package_name}") - shutil.rmtree(self.package_dir) + + if not self.config.protected_dirs: + shutil.rmtree(self.package_dir) + else: + files_and_dirs: List[str] = os.listdir(self.package_dir) + for protected_dir in self.config.protected_dirs: + files_and_dirs.remove(protected_dir) + + for file_or_dir in files_and_dirs: + path = os.path.join(self.package_dir, file_or_dir) + if os.path.isfile(path): + os.remove(path) + if os.path.isdir(path): + shutil.rmtree(path) + self._create_package() self._build_models() self._build_api() @@ -170,7 +185,7 @@ def _get_errors(self) -> List[GeneratorError]: return errors def _create_package(self) -> None: - self.package_dir.mkdir() + self.package_dir.mkdir(exist_ok=True) # Package __init__.py package_init = self.package_dir / "__init__.py" diff --git a/openapi_python_client/config.py b/openapi_python_client/config.py index ace95c6b1..116d2bb09 100644 --- a/openapi_python_client/config.py +++ b/openapi_python_client/config.py @@ -27,6 +27,7 @@ class Config(BaseModel): project_name_override: Optional[str] package_name_override: Optional[str] package_version_override: Optional[str] + protected_dirs: Optional[List[str]] post_hooks: List[str] = [ "autoflake -i -r --remove-all-unused-imports --remove-unused-variables --ignore-init-module-imports .", "isort .",