diff --git a/dvc/cache/__init__.py b/dvc/cache/__init__.py index 73b13dedc..b9e7dd95a 100644 --- a/dvc/cache/__init__.py +++ b/dvc/cache/__init__.py @@ -65,18 +65,23 @@ class Cache: self._cache[Schemes.LOCAL] = _get_cache(repo, settings) - for scheme in self.CLOUD_SCHEMES: + def _initalize_cloud_cache(self, schemes): + for scheme in schemes: remote = self.config.get(scheme) settings = {"name": remote} if remote else None - self._cache[scheme] = _get_cache(repo, settings) + self._cache[scheme] = _get_cache(self.repo, settings) def __getattr__(self, name): + if name not in self._cache and name in self.CLOUD_SCHEMES: + self._initalize_cloud_cache([name]) + try: return self._cache[name] except KeyError as exc: raise AttributeError from exc def by_scheme(self): + self._initalize_cloud_cache(self.CLOUD_SCHEMES) yield from self._cache.items() diff --git a/tests/unit/repo/test_repo.py b/tests/unit/repo/test_repo.py index 5b9b6f536..64495e782 100644 --- a/tests/unit/repo/test_repo.py +++ b/tests/unit/repo/test_repo.py @@ -132,3 +132,12 @@ def test_branch_config(tmp_dir, scm): dvc = Repo(scm=scm, rev="branch") assert dvc.config["remote"]["branch"]["url"] == "/some/path" + + +def test_dynamic_cache_initalization(tmp_dir, scm): + dvc = Repo.init() + with dvc.config.edit() as conf: + conf["cache"]["ssh"] = "foo" + conf["remote"]["foo"] = {"url": "remote://bar/baz"} + + Repo(str(tmp_dir))