dvc: move Updater out of Repo()

Fixes #2039

Required by #2012 to be able to fetch data through the API without
interuption from updater.

Signed-off-by: Ruslan Kuprieiev <[email protected]>
This commit is contained in:
Ruslan Kuprieiev
2019-06-14 00:54:36 +03:00
parent b1eebe2f86
commit 0d330c1b9b
4 changed files with 59 additions and 47 deletions
+3
View File
@@ -38,10 +38,13 @@ def append_doc_link(help_message, path):
class CmdBase(object):
def __init__(self, args):
from dvc.repo import Repo
from dvc.updater import Updater
self.repo = Repo()
self.config = self.repo.config
self.args = args
updater = Updater(self.repo.dvc_dir)
updater.check()
@property
def default_targets(self):
+6 -6
View File
@@ -47,7 +47,6 @@ class Repo(object):
from dvc.scm import SCM
from dvc.cache import Cache
from dvc.data_cloud import DataCloud
from dvc.updater import Updater
from dvc.repo.metrics import Metrics
from dvc.scm.tree import WorkingTree
from dvc.repo.tag import Tag
@@ -76,7 +75,6 @@ class Repo(object):
self.cache = Cache(self)
self.cloud = DataCloud(self)
self.updater = Updater(self.dvc_dir)
self.metrics = Metrics(self)
self.tag = Tag(self)
@@ -84,8 +82,6 @@ class Repo(object):
self._ignore()
self.updater.check()
def __repr__(self):
return "Repo: '{root_dir}'".format(root_dir=self.root_dir)
@@ -121,12 +117,16 @@ class Repo(object):
return self.cache.local.unprotect(PathInfo(target))
def _ignore(self):
from dvc.updater import Updater
updater = Updater(self.dvc_dir)
flist = [
self.state.state_file,
self.lock.lock_file,
self.config.config_local_file,
self.updater.updater_file,
self.updater.lock.lock_file,
updater.updater_file,
updater.lock.lock_file,
] + self.state.temp_files
if self.cache.local.cache_dir.startswith(self.root_dir):
+37 -29
View File
@@ -1,43 +1,51 @@
import os
import mock
import pytest
from tests.basic_env import TestDvc
from dvc.updater import Updater
class TestUpdater(TestDvc):
def test(self):
# NOTE: only test on travis CRON to avoid generating too much logs
travis = os.getenv("TRAVIS") == "true"
if not travis:
return
@pytest.fixture
def updater(dvc_repo):
return Updater(dvc_repo.dvc_dir)
cron = os.getenv("TRAVIS_EVENT_TYPE") == "cron"
if not cron:
return
env = os.environ.copy()
if os.getenv("CI"):
del os.environ["CI"]
def test_updater(updater):
# NOTE: only test on travis CRON to avoid generating too much logs
travis = os.getenv("TRAVIS") == "true"
if not travis:
return
self.dvc.updater.check()
self.dvc.updater.check()
self.dvc.updater.check()
cron = os.getenv("TRAVIS_EVENT_TYPE") == "cron"
if not cron:
return
os.environ = env.copy()
env = os.environ.copy()
if env.get("CI"):
del env["CI"]
def test_check_version_newer(self):
self.dvc.updater.latest = "0.20.8"
self.dvc.updater.current = "0.21.0"
with mock.patch.dict(os.environ, env):
updater.check()
updater.check()
updater.check()
self.assertFalse(self.dvc.updater._is_outdated())
def test_check_version_equal(self):
self.dvc.updater.latest = "0.20.8"
self.dvc.updater.current = "0.20.8"
def test_check_version_newer(updater):
updater.latest = "0.20.8"
updater.current = "0.21.0"
self.assertFalse(self.dvc.updater._is_outdated())
assert not updater._is_outdated()
def test_check_version_outdated(self):
self.dvc.updater.latest = "0.21.0"
self.dvc.updater.current = "0.20.8"
self.assertTrue(self.dvc.updater._is_outdated())
def test_check_version_equal(updater):
updater.latest = "0.20.8"
updater.current = "0.20.8"
assert not updater._is_outdated()
def test_check_version_outdated(updater):
updater.latest = "0.21.0"
updater.current = "0.20.8"
assert updater._is_outdated()
+13 -12
View File
@@ -1,9 +1,8 @@
import os
import json
import mock
from dvc import __version__
from tests.basic_env import TestDvc
from dvc.updater import Updater
class MockResponse(object):
@@ -27,13 +26,15 @@ def mocked_requests_get(*args, **kwargs):
return MockResponse({"version": __version__}, 200)
class TestUpdater(TestDvc):
@mock.patch("requests.get", side_effect=mocked_requests_get)
def test_fetch(self, mock_get):
self.assertFalse(os.path.exists(self.dvc.updater.updater_file))
self.dvc.updater.fetch(detach=False)
mock_get.assert_called_once()
self.assertTrue(os.path.isfile(self.dvc.updater.updater_file))
with open(self.dvc.updater.updater_file, "r") as fobj:
info = json.load(fobj)
self.assertEqual(info["version"], __version__)
def test_fetch(dvc_repo, mocker):
updater = Updater(dvc_repo.dvc_dir)
assert not os.path.exists(updater.updater_file)
mock_get = mocker.patch("requests.get", side_effect=mocked_requests_get)
updater.fetch(detach=False)
mock_get.assert_called_once_with(Updater.URL, timeout=Updater.TIMEOUT_GET)
assert os.path.isfile(updater.updater_file)
with open(updater.updater_file, "r") as fobj:
info = json.load(fobj)
assert info["version"] == __version__