From dfb69d29fa44d56c8970a4d52b5c5e070daf9a5d Mon Sep 17 00:00:00 2001 From: antazoey Date: Tue, 18 Feb 2025 10:34:28 -0600 Subject: [PATCH] feat: isolate changes ctx in packages cache --- src/ape/managers/project.py | 19 +++++++++++++++++++ tests/functional/test_dependencies.py | 8 ++++++++ 2 files changed, 27 insertions(+) diff --git a/src/ape/managers/project.py b/src/ape/managers/project.py index 518be5a2c5..fc6370801a 100644 --- a/src/ape/managers/project.py +++ b/src/ape/managers/project.py @@ -1021,6 +1021,25 @@ def remove(self, package_id: str, version: str): manifest_file = self.get_manifest_path(package_id, version) manifest_file.unlink(missing_ok=True) + @contextmanager + def isolate_changes(self): + """ + Allows you to make changes affecting the Ape packages cache in a context. + For example, temporarily install local "dev" packages for testing purposes. + """ + with create_tempdir() as tmpdir: + packages_cache = tmpdir / "packages" + packages_cache.parent.mkdir(parents=True, exist_ok=True) + if self.root.is_dir(): + shutil.copytree(self.root, packages_cache) + try: + yield + finally: + shutil.rmtree(self.root) + if packages_cache.is_dir(): + # Restore. + shutil.copytree(packages_cache, self.root) + def _version_to_options(version: str) -> tuple[str, ...]: if version.startswith("v"): diff --git a/tests/functional/test_dependencies.py b/tests/functional/test_dependencies.py index 58f7987ceb..d51101bc7d 100644 --- a/tests/functional/test_dependencies.py +++ b/tests/functional/test_dependencies.py @@ -412,6 +412,14 @@ def test_get_project_path_unneeded_v_prefix(self, cache, data_folder): actual = cache.get_project_path("project-test-2", "v1.0.0") assert actual == path + def test_isolate_cache_changes(self, cache): + dep = LocalDependency(name="depabc", local=Path("depabc"), version="v1.0.0") + with cache.isolate_changes(): + path = cache.cache_api(dep) + assert path.is_file() + + assert not path.is_file() + class TestLocalDependency: NAME = "testlocaldep"