diff --git a/dvc/config.py b/dvc/config.py index 671179438..0a8288da3 100644 --- a/dvc/config.py +++ b/dvc/config.py @@ -79,9 +79,6 @@ class Config(dict): ConfigError: thrown if config has an invalid format. """ - APPNAME = "dvc" - APPAUTHOR = "iterative" - SYSTEM_LEVELS = ("system", "global") REPO_LEVELS = ("repo", "local") # In the order they shadow each other @@ -121,14 +118,14 @@ class Config(dict): @classmethod def get_dir(cls, level): - from platformdirs import site_config_dir, user_config_dir + from dvc.dirs import global_config_dir, system_config_dir assert level in ("global", "system") if level == "global": - return user_config_dir(cls.APPNAME, cls.APPAUTHOR) + return global_config_dir() if level == "system": - return site_config_dir(cls.APPNAME, cls.APPAUTHOR) + return system_config_dir() @cached_property def files(self) -> Dict[str, str]: diff --git a/dvc/dirs.py b/dvc/dirs.py new file mode 100644 index 000000000..dcb52b9e4 --- /dev/null +++ b/dvc/dirs.py @@ -0,0 +1,26 @@ +import os + +import platformdirs + +from . import env + +APPNAME = "dvc" +APPAUTHOR = "iterative" + + +def system_config_dir(): + return os.getenv(env.DVC_SYSTEM_CONFIG_DIR) or platformdirs.site_config_dir( + APPNAME, APPAUTHOR + ) + + +def global_config_dir(): + return os.getenv(env.DVC_SYSTEM_CONFIG_DIR) or platformdirs.user_config_dir( + APPNAME, APPAUTHOR + ) + + +def site_cache_dir(): + return os.getenv(env.DVC_SITE_CACHE_DIR) or platformdirs.site_cache_dir( + APPNAME, APPAUTHOR, opinion=True + ) diff --git a/dvc/env.py b/dvc/env.py index 85b09a064..9646278d3 100644 --- a/dvc/env.py +++ b/dvc/env.py @@ -1,14 +1,17 @@ +DVCLIVE_RESUME = "DVCLIVE_RESUME" DVC_CHECKPOINT = "DVC_CHECKPOINT" DVC_DAEMON = "DVC_DAEMON" +DVC_EXP_AUTO_PUSH = "DVC_EXP_AUTO_PUSH" +DVC_EXP_BASELINE_REV = "DVC_EXP_BASELINE_REV" +DVC_EXP_GIT_REMOTE = "DVC_EXP_GIT_REMOTE" +DVC_EXP_NAME = "DVC_EXP_NAME" +DVC_GLOBAL_CONFIG_DIR = "DVC_GLOBAL_CONFIG_DIR" +DVC_IGNORE_ISATTY = "DVC_IGNORE_ISATTY" +DVC_NO_ANALYTICS = "DVC_NO_ANALYTICS" DVC_PAGER = "DVC_PAGER" DVC_ROOT = "DVC_ROOT" -DVCLIVE_RESUME = "DVCLIVE_RESUME" -DVC_IGNORE_ISATTY = "DVC_IGNORE_ISATTY" -DVC_EXP_BASELINE_REV = "DVC_EXP_BASELINE_REV" -DVC_EXP_NAME = "DVC_EXP_NAME" -DVC_EXP_GIT_REMOTE = "DVC_EXP_GIT_REMOTE" -DVC_EXP_AUTO_PUSH = "DVC_EXP_AUTO_PUSH" -DVC_NO_ANALYTICS = "DVC_NO_ANALYTICS" DVC_SHOW_TRACEBACK = "DVC_SHOW_TRACEBACK" +DVC_SITE_CACHE_DIR = "DVC_SITE_CACHE_DIR" DVC_STUDIO_TOKEN = "DVC_STUDIO_TOKEN" # noqa: S105 # nosec B105 DVC_STUDIO_URL = "DVC_STUDIO_URL" +DVC_SYSTEM_CONFIG_DIR = "DVC_SYSTEM_CONFIG_DIR" diff --git a/dvc/repo/__init__.py b/dvc/repo/__init__.py index 850e9118f..df4785a22 100644 --- a/dvc/repo/__init__.py +++ b/dvc/repo/__init__.py @@ -554,12 +554,10 @@ class Repo: import getpass import hashlib - import platformdirs - + from dvc.dirs import site_cache_dir from dvc.fs import GitFileSystem - default = platformdirs.site_cache_dir("dvc", "iterative", opinion=True) - cache_dir = self.config["core"].get("site_cache_dir") or default + cache_dir = self.config["core"].get("site_cache_dir") or site_cache_dir() if isinstance(self.fs, GitFileSystem): relparts = () diff --git a/tests/conftest.py b/tests/conftest.py index 56033439c..42ca1005c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,6 +5,7 @@ from contextlib import suppress import pytest +from dvc import env from dvc.testing.fixtures import * # noqa, pylint: disable=wildcard-import from .dir_helpers import * # noqa, pylint: disable=wildcard-import @@ -206,7 +207,13 @@ defaultBranch=master import pygit2 pygit2.settings.search_path[pygit2.GIT_CONFIG_LEVEL_GLOBAL] = str(home_dir) + + monkeypatch.setenv(env.DVC_SYSTEM_CONFIG_DIR, os.fspath(path / "system")) + monkeypatch.setenv(env.DVC_GLOBAL_CONFIG_DIR, os.fspath(path / "global")) + monkeypatch.setenv(env.DVC_SITE_CACHE_DIR, os.fspath(path / "site_cache_dir")) + yield + monkeypatch.undo()