mirror of
https://github.com/Stone-Red-Code/dvc.git
synced 2026-11-02 07:18:25 +01:00
dvc: separate data and objects
Initial simple separation to get the process of extracting dvc-objects and dvc-data packages out of dvc. dvc-objects is for: * defining base Object (aka HashFile) and ObjectDB * providing tools to work with those objects (check/transfer/etc) * etc dvc-data is for: * defining higher level objects (e.g. Tree) * bulding objects from the workspace (aka staging) * projecting objects back into the workspace (aka checkout) * comparing Tree objects (aka diff) * defining misc object databases (e.g LocalObjectDB) * higher-level transfer (e.g. with Tree indexes) * etc For example, the objects we use in run-cache are based on dvc-objects and not on dvc-data, as they have absolutely nothing to do with data management. There are still some mixups in the code that will be addressed in the followups.
This commit is contained in:
@@ -5,9 +5,8 @@ from .tree import Tree
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from dvc.hash_info import HashInfo
|
||||
|
||||
from .db.base import ObjectDB
|
||||
from .file import HashFile
|
||||
from dvc.objects.db import ObjectDB
|
||||
from dvc.objects.file import HashFile
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -5,14 +5,13 @@ from dvc import prompt
|
||||
from dvc.exceptions import CacheLinkError, CheckoutError, ConfirmRemoveError
|
||||
from dvc.fs.utils import test_links, transfer
|
||||
from dvc.ignore import DvcIgnoreFilter
|
||||
from dvc.objects.db.slow_link_detection import ( # type: ignore[attr-defined]
|
||||
slow_link_guard,
|
||||
)
|
||||
from dvc.objects.diff import ROOT
|
||||
from dvc.objects.diff import diff as odiff
|
||||
from dvc.objects.stage import stage
|
||||
from dvc.types import Optional
|
||||
|
||||
from .diff import ROOT
|
||||
from .diff import diff as odiff
|
||||
from .slow_link_detection import slow_link_guard # type: ignore[attr-defined]
|
||||
from .stage import stage
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -7,7 +7,8 @@ if TYPE_CHECKING:
|
||||
|
||||
|
||||
def get_odb(fs, fs_path, **config):
|
||||
from .base import ObjectDB
|
||||
from dvc.objects.db import ObjectDB
|
||||
|
||||
from .local import LocalObjectDB
|
||||
|
||||
if fs.scheme == Schemes.LOCAL:
|
||||
@@ -3,7 +3,7 @@ import os
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import TYPE_CHECKING, Iterable, Set
|
||||
|
||||
from ..errors import ObjectDBError
|
||||
from dvc.objects.errors import ObjectDBError
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from dvc.types import StrPath
|
||||
@@ -6,13 +6,12 @@ from funcy import cached_property
|
||||
from shortuuid import uuid
|
||||
|
||||
from dvc.hash_info import HashInfo
|
||||
from dvc.objects.db import ObjectDB
|
||||
from dvc.objects.errors import ObjectFormatError
|
||||
from dvc.progress import Tqdm
|
||||
from dvc.utils import relpath
|
||||
from dvc.utils.fs import copyfile, remove, umask, walk_files
|
||||
|
||||
from .base import ObjectDB
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -3,11 +3,11 @@ import logging
|
||||
import os
|
||||
from typing import TYPE_CHECKING, Dict
|
||||
|
||||
from dvc.objects.db import ObjectDB
|
||||
from dvc.objects.errors import ObjectFormatError
|
||||
from dvc.scheme import Schemes
|
||||
|
||||
from ..errors import ObjectFormatError
|
||||
from ..reference import ReferenceHashFile
|
||||
from .base import ObjectDB
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from dvc.fs.base import FileSystem
|
||||
@@ -3,8 +3,7 @@ from typing import TYPE_CHECKING, List, Optional, Tuple
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from dvc.hash_info import HashInfo
|
||||
|
||||
from .file import HashFile
|
||||
from dvc.objects.file import HashFile
|
||||
|
||||
ADD = "add"
|
||||
MODIFY = "modify"
|
||||
@@ -96,7 +95,7 @@ def diff(
|
||||
return entry_obj.hash_info if entry_obj else None
|
||||
|
||||
def _in_cache(oid, cache):
|
||||
from .errors import ObjectFormatError
|
||||
from dvc.objects.errors import ObjectFormatError
|
||||
|
||||
if not oid:
|
||||
return False
|
||||
@@ -4,16 +4,15 @@ import os
|
||||
import pickle
|
||||
from typing import TYPE_CHECKING, Optional
|
||||
|
||||
from .errors import ObjectFormatError
|
||||
from .file import HashFile
|
||||
from dvc.objects.errors import ObjectFormatError
|
||||
from dvc.objects.file import HashFile
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from dvc.fs.base import FileSystem
|
||||
from dvc.hash_info import HashInfo
|
||||
from dvc.objects.db import ObjectDB
|
||||
from dvc.types import AnyPath
|
||||
|
||||
from .db.base import ObjectDB
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -8,19 +8,18 @@ from typing import TYPE_CHECKING, Dict, Optional, Tuple
|
||||
from dvc.exceptions import DvcIgnoreInCollectedDirError
|
||||
from dvc.hash_info import HashInfo
|
||||
from dvc.ignore import DvcIgnore
|
||||
from dvc.objects.file import HashFile
|
||||
from dvc.progress import Tqdm
|
||||
from dvc.utils import file_md5
|
||||
|
||||
from .db.reference import ReferenceObjectDB
|
||||
from .file import HashFile
|
||||
from .meta import Meta
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from dvc.fs.base import FileSystem
|
||||
from dvc.objects.db import ObjectDB
|
||||
from dvc.types import AnyPath
|
||||
|
||||
from .db.base import ObjectDB
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -245,8 +244,9 @@ def _get_staging(odb: "ObjectDB") -> "ObjectDB":
|
||||
|
||||
|
||||
def _load_from_state(odb, staging, fs_path, fs, name):
|
||||
from dvc.objects.errors import ObjectFormatError
|
||||
|
||||
from . import check, load
|
||||
from .errors import ObjectFormatError
|
||||
from .tree import Tree
|
||||
|
||||
state = odb.state
|
||||
@@ -7,9 +7,10 @@ from dvc.scheme import Schemes
|
||||
from .tree import Tree
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .db.base import ObjectDB
|
||||
from dvc.objects.db import ObjectDB
|
||||
from dvc.objects.file import HashFile
|
||||
|
||||
from .db.index import ObjectDBIndexBase
|
||||
from .file import HashFile
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -10,8 +10,8 @@ from dvc.utils.threadpool import ThreadPoolExecutor
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from dvc.hash_info import HashInfo
|
||||
from dvc.objects.db import ObjectDB
|
||||
|
||||
from .db.base import ObjectDB
|
||||
from .db.index import ObjectDBIndexBase
|
||||
from .tree import Tree
|
||||
|
||||
@@ -40,7 +40,8 @@ def _log_exceptions(func):
|
||||
def find_tree_by_obj_id(
|
||||
odbs: Iterable[Optional["ObjectDB"]], obj_id: "HashInfo"
|
||||
) -> Optional["Tree"]:
|
||||
from .errors import ObjectFormatError
|
||||
from dvc.objects.errors import ObjectFormatError
|
||||
|
||||
from .tree import Tree
|
||||
|
||||
for odb in odbs:
|
||||
@@ -5,8 +5,9 @@ from typing import TYPE_CHECKING, Dict, Optional, Tuple
|
||||
|
||||
from funcy import cached_property
|
||||
|
||||
from .errors import ObjectFormatError
|
||||
from .file import HashFile
|
||||
from dvc.objects.errors import ObjectFormatError
|
||||
from dvc.objects.file import HashFile
|
||||
|
||||
from .stage import get_file_hash
|
||||
|
||||
if TYPE_CHECKING:
|
||||
+6
-6
@@ -3,11 +3,11 @@
|
||||
import logging
|
||||
from typing import TYPE_CHECKING, Iterable, Optional
|
||||
|
||||
from dvc.objects.db import get_index
|
||||
from dvc.data.db import get_index
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from dvc.hash_info import HashInfo
|
||||
from dvc.objects.db.base import ObjectDB
|
||||
from dvc.objects.db import ObjectDB
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -55,8 +55,8 @@ class DataCloud:
|
||||
raise NoRemoteError(error_msg)
|
||||
|
||||
def _init_odb(self, name):
|
||||
from dvc.data.db import get_odb
|
||||
from dvc.fs import get_cloud_fs
|
||||
from dvc.objects.db import get_odb
|
||||
|
||||
cls, config, fs_path = get_cloud_fs(self.repo, name=name)
|
||||
config["tmp_dir"] = self.repo.index_db_dir
|
||||
@@ -78,7 +78,7 @@ class DataCloud:
|
||||
By default remote from core.remote config option is used.
|
||||
odb: optional ODB to push to. Overrides remote.
|
||||
"""
|
||||
from dvc.objects.transfer import transfer
|
||||
from dvc.data.transfer import transfer
|
||||
|
||||
if not odb:
|
||||
odb = self.get_remote_odb(remote, "push")
|
||||
@@ -107,7 +107,7 @@ class DataCloud:
|
||||
By default remote from core.remote config option is used.
|
||||
odb: optional ODB to pull from. Overrides remote.
|
||||
"""
|
||||
from dvc.objects.transfer import transfer
|
||||
from dvc.data.transfer import transfer
|
||||
|
||||
if not odb:
|
||||
odb = self.get_remote_odb(remote, "pull")
|
||||
@@ -141,7 +141,7 @@ class DataCloud:
|
||||
log_missing: log warning messages if file doesn't exist
|
||||
neither in cache, neither in cloud.
|
||||
"""
|
||||
from dvc.objects.status import compare_status
|
||||
from dvc.data.status import compare_status
|
||||
|
||||
if not odb:
|
||||
odb = self.get_remote_odb(remote, "status")
|
||||
|
||||
@@ -9,7 +9,7 @@ from .base import Dependency
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from dvc.hash_info import HashInfo
|
||||
from dvc.objects.db.base import ObjectDB
|
||||
from dvc.objects.db import ObjectDB
|
||||
from dvc.objects.file import HashFile
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@ class RepoDependency(Dependency):
|
||||
return {self.PARAM_PATH: self.def_path, self.PARAM_REPO: self.def_repo}
|
||||
|
||||
def download(self, to, jobs=None):
|
||||
from dvc.objects.checkout import checkout
|
||||
from dvc.data.checkout import checkout
|
||||
|
||||
for odb, objs in self.get_used_objs().items():
|
||||
self.repo.cloud.pull(objs, jobs=jobs, odb=odb)
|
||||
@@ -98,9 +98,9 @@ class RepoDependency(Dependency):
|
||||
self, obj_only=False, **kwargs
|
||||
) -> Tuple[Dict[Optional["ObjectDB"], Set["HashInfo"]], "HashFile"]:
|
||||
from dvc.config import NoRemoteError
|
||||
from dvc.data.stage import stage
|
||||
from dvc.data.tree import Tree
|
||||
from dvc.exceptions import NoOutputOrStageError, PathMissingError
|
||||
from dvc.objects.stage import stage
|
||||
from dvc.objects.tree import Tree
|
||||
|
||||
local_odb = self.repo.odb.local
|
||||
locked = kwargs.pop("locked", True)
|
||||
@@ -150,10 +150,10 @@ class RepoDependency(Dependency):
|
||||
return used_obj_ids, staged_obj
|
||||
|
||||
def _check_circular_import(self, odb, obj_ids):
|
||||
from dvc.data.db.reference import ReferenceObjectDB
|
||||
from dvc.data.tree import Tree
|
||||
from dvc.exceptions import CircularImportError
|
||||
from dvc.fs.repo import RepoFileSystem
|
||||
from dvc.objects.db.reference import ReferenceObjectDB
|
||||
from dvc.objects.tree import Tree
|
||||
|
||||
if not isinstance(odb, ReferenceObjectDB):
|
||||
return
|
||||
|
||||
@@ -357,7 +357,7 @@ class ObjectDB:
|
||||
pass
|
||||
|
||||
def gc(self, used, jobs=None, cache_odb=None, shallow=True):
|
||||
from ..tree import Tree
|
||||
from dvc.data.tree import Tree
|
||||
|
||||
if self.read_only:
|
||||
raise ObjectDBPermissionError("Cannot gc read-only ODB")
|
||||
+3
-4
@@ -3,14 +3,12 @@ import logging
|
||||
import os
|
||||
from typing import TYPE_CHECKING, Optional
|
||||
|
||||
from .errors import ObjectFormatError
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from dvc.fs.base import FileSystem
|
||||
from dvc.hash_info import HashInfo
|
||||
from dvc.types import AnyPath
|
||||
|
||||
from .db.base import ObjectDB
|
||||
from .db import ObjectDB
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -68,7 +66,8 @@ class HashFile:
|
||||
self._check_hash(odb)
|
||||
|
||||
def _check_hash(self, odb):
|
||||
from .stage import get_file_hash
|
||||
from dvc.data.stage import get_file_hash
|
||||
from dvc.objects.errors import ObjectFormatError
|
||||
|
||||
_, actual = get_file_hash(
|
||||
self.fs_path, self.fs, self.hash_info.name, odb.state
|
||||
|
||||
+15
-13
@@ -7,7 +7,7 @@ from urllib.parse import urlparse
|
||||
from funcy import collecting, project
|
||||
from voluptuous import And, Any, Coerce, Length, Lower, Required, SetTo
|
||||
|
||||
from dvc import objects, prompt
|
||||
from dvc import prompt
|
||||
from dvc.exceptions import (
|
||||
CheckoutError,
|
||||
CollectCacheError,
|
||||
@@ -15,25 +15,27 @@ from dvc.exceptions import (
|
||||
MergeError,
|
||||
RemoteCacheRequiredError,
|
||||
)
|
||||
from dvc.objects.checkout import checkout
|
||||
|
||||
from .data import check as ocheck
|
||||
from .data import load as oload
|
||||
from .data.checkout import checkout
|
||||
from .data.meta import Meta
|
||||
from .data.stage import stage as ostage
|
||||
from .data.transfer import transfer as otransfer
|
||||
from .data.tree import Tree
|
||||
from .fs import get_cloud_fs
|
||||
from .fs.hdfs import HDFSFileSystem
|
||||
from .fs.local import LocalFileSystem
|
||||
from .fs.s3 import S3FileSystem
|
||||
from .hash_info import HashInfo
|
||||
from .istextfile import istextfile
|
||||
from .objects import Tree
|
||||
from .objects.errors import ObjectFormatError
|
||||
from .objects.meta import Meta
|
||||
from .objects.stage import stage as ostage
|
||||
from .objects.transfer import transfer as otransfer
|
||||
from .scheme import Schemes
|
||||
from .utils import relpath
|
||||
from .utils.fs import path_isin
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .objects.db.base import ObjectDB
|
||||
from .objects.db import ObjectDB
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -456,7 +458,7 @@ class Output:
|
||||
return True
|
||||
|
||||
try:
|
||||
objects.check(self.odb, obj)
|
||||
ocheck(self.odb, obj)
|
||||
return False
|
||||
except (FileNotFoundError, ObjectFormatError):
|
||||
return True
|
||||
@@ -710,7 +712,7 @@ class Output:
|
||||
obj = self.obj
|
||||
elif self.hash_info:
|
||||
try:
|
||||
obj = objects.load(self.odb, self.hash_info)
|
||||
obj = oload(self.odb, self.hash_info)
|
||||
except FileNotFoundError:
|
||||
return None
|
||||
else:
|
||||
@@ -857,7 +859,7 @@ class Output:
|
||||
|
||||
obj = self.odb.get(self.hash_info)
|
||||
try:
|
||||
objects.check(self.odb, obj)
|
||||
ocheck(self.odb, obj)
|
||||
except FileNotFoundError:
|
||||
if self.remote:
|
||||
kwargs["remote"] = self.remote
|
||||
@@ -867,7 +869,7 @@ class Output:
|
||||
return self.obj
|
||||
|
||||
try:
|
||||
self.obj = objects.load(self.odb, self.hash_info)
|
||||
self.obj = oload(self.odb, self.hash_info)
|
||||
except (FileNotFoundError, ObjectFormatError):
|
||||
self.obj = None
|
||||
|
||||
@@ -884,7 +886,7 @@ class Output:
|
||||
logger.debug(f"failed to pull cache for '{self}'")
|
||||
|
||||
try:
|
||||
objects.check(self.odb, self.odb.get(self.hash_info))
|
||||
ocheck(self.odb, self.odb.get(self.hash_info))
|
||||
except FileNotFoundError:
|
||||
msg = (
|
||||
"Missing cache for directory '{}'. "
|
||||
@@ -1012,7 +1014,7 @@ class Output:
|
||||
)
|
||||
|
||||
def merge(self, ancestor, other):
|
||||
from dvc.objects.tree import du, merge
|
||||
from dvc.data.tree import du, merge
|
||||
|
||||
assert other
|
||||
|
||||
|
||||
@@ -150,11 +150,11 @@ class Repo:
|
||||
repo_factory=None,
|
||||
):
|
||||
from dvc.config import Config
|
||||
from dvc.data.db import ODBManager
|
||||
from dvc.data_cloud import DataCloud
|
||||
from dvc.fs.git import GitFileSystem
|
||||
from dvc.fs.local import localfs
|
||||
from dvc.lock import LockNoop, make_lock
|
||||
from dvc.objects.db import ODBManager
|
||||
from dvc.repo.live import Live
|
||||
from dvc.repo.metrics import Metrics
|
||||
from dvc.repo.params import Params
|
||||
@@ -406,7 +406,7 @@ class Repo:
|
||||
def _add_suffix(objs: Set["HashFile"], suffix: str) -> None:
|
||||
from itertools import chain
|
||||
|
||||
from dvc.objects import iterobjs
|
||||
from dvc.data import iterobjs
|
||||
|
||||
for obj in chain.from_iterable(map(iterobjs, objs)):
|
||||
if obj.name is not None:
|
||||
|
||||
+1
-1
@@ -113,8 +113,8 @@ def _paths_checksums(repo, targets):
|
||||
|
||||
|
||||
def _output_paths(repo, targets):
|
||||
from dvc.data.stage import stage as ostage
|
||||
from dvc.fs.local import LocalFileSystem
|
||||
from dvc.objects.stage import stage as ostage
|
||||
|
||||
on_working_fs = isinstance(repo.fs, LocalFileSystem)
|
||||
|
||||
|
||||
@@ -156,7 +156,7 @@ class SSHExecutor(BaseExecutor):
|
||||
return sshfs.fs.execute(f"cd {working_dir};{cmd}", **kwargs)
|
||||
|
||||
def init_cache(self, dvc: "Repo", rev: str, run_cache: bool = True):
|
||||
from dvc.objects.db import ODBManager, get_odb
|
||||
from dvc.data.db import ODBManager, get_odb
|
||||
from dvc.repo import Repo
|
||||
from dvc.repo.push import push
|
||||
|
||||
|
||||
+1
-1
@@ -44,7 +44,7 @@ def gc(
|
||||
|
||||
from contextlib import ExitStack
|
||||
|
||||
from dvc.objects.db import get_index
|
||||
from dvc.data.db import get_index
|
||||
from dvc.repo import Repo
|
||||
|
||||
if not repos:
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@ from collections.abc import Mapping
|
||||
from voluptuous import Any, Optional, Required, Schema
|
||||
|
||||
from dvc import dependency, output
|
||||
from dvc.objects.meta import Meta
|
||||
from dvc.data.meta import Meta
|
||||
from dvc.output import CHECKSUMS_SCHEMA, Output
|
||||
from dvc.parsing import DO_KWD, FOREACH_KWD, VARS_KWD
|
||||
from dvc.parsing.versions import SCHEMA_KWD, lockfile_version_schema
|
||||
|
||||
+3
-3
@@ -21,7 +21,7 @@ class RunCacheNotFoundError(DvcException):
|
||||
|
||||
|
||||
def _get_cache_hash(cache, key=False):
|
||||
from dvc.objects.meta import Meta
|
||||
from dvc.data.meta import Meta
|
||||
|
||||
if key:
|
||||
cache["outs"] = [out["path"] for out in cache.get("outs", [])]
|
||||
@@ -236,7 +236,7 @@ class StageCache:
|
||||
return ret
|
||||
|
||||
def push(self, remote: Optional[str], odb: Optional["ObjectDB"] = None):
|
||||
from dvc.objects.transfer import _log_exceptions
|
||||
from dvc.data.transfer import _log_exceptions
|
||||
|
||||
if odb is None:
|
||||
odb = self.repo.cloud.get_remote_odb(remote)
|
||||
@@ -247,7 +247,7 @@ class StageCache:
|
||||
)
|
||||
|
||||
def pull(self, remote: Optional[str]):
|
||||
from dvc.objects.transfer import _log_exceptions
|
||||
from dvc.data.transfer import _log_exceptions
|
||||
|
||||
odb = self.repo.cloud.get_remote_odb(remote)
|
||||
return self._transfer(
|
||||
|
||||
+1
-1
@@ -6,8 +6,8 @@ from itertools import chain
|
||||
from funcy import cached_property, get_in, lcat, once, project
|
||||
|
||||
from dvc import dependency, output
|
||||
from dvc.data.meta import Meta
|
||||
from dvc.hash_info import HashInfo
|
||||
from dvc.objects.meta import Meta
|
||||
from dvc.parsing import FOREACH_KWD, JOIN, DataResolver, EntryNotFound
|
||||
from dvc.parsing.versions import LOCKFILE_VERSION
|
||||
|
||||
|
||||
+1
-1
@@ -4,8 +4,8 @@ from typing import TYPE_CHECKING, Union
|
||||
|
||||
from funcy import concat, first, lsplit, rpartial, without
|
||||
|
||||
from dvc.data.meta import Meta
|
||||
from dvc.exceptions import InvalidArgumentError
|
||||
from dvc.objects.meta import Meta
|
||||
|
||||
from .exceptions import (
|
||||
MissingDataSource,
|
||||
|
||||
+1
-1
@@ -103,7 +103,7 @@ class State(StateBase): # pylint: disable=too-many-instance-attributes
|
||||
HashInfo or None: hash for the specified path info or None if it
|
||||
doesn't exist in the state database.
|
||||
"""
|
||||
from .objects.meta import Meta
|
||||
from .data.meta import Meta
|
||||
|
||||
if not isinstance(fs, LocalFileSystem):
|
||||
return None, None
|
||||
|
||||
@@ -149,7 +149,7 @@ def local_remote(make_remote):
|
||||
@pytest.fixture
|
||||
def make_workspace(tmp_dir, dvc, make_cloud):
|
||||
def _make_workspace(name, typ="local"):
|
||||
from dvc.objects.db import ODBManager
|
||||
from dvc.data.db import ODBManager
|
||||
|
||||
cloud = make_cloud(typ) # pylint: disable=W0621
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ class TestImport:
|
||||
pytest.skip()
|
||||
|
||||
def test_import_dir(self, tmp_dir, dvc, workspace, stage_md5, dir_md5):
|
||||
from dvc.objects.db import ODBManager
|
||||
from dvc.data.db import ODBManager
|
||||
|
||||
workspace.gen(
|
||||
{"dir": {"file": "file", "subdir": {"subfile": "subfile"}}}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import pytest
|
||||
|
||||
from dvc.data.db import get_index
|
||||
from dvc.exceptions import DownloadError, UploadError
|
||||
from dvc.fs.local import LocalFileSystem
|
||||
from dvc.objects.db import get_index
|
||||
from dvc.utils.fs import remove
|
||||
from tests.utils import clean_staging
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ import colorama
|
||||
import pytest
|
||||
|
||||
import dvc as dvc_module
|
||||
from dvc.data.db import ODBManager
|
||||
from dvc.dvcfile import DVC_FILE_SUFFIX
|
||||
from dvc.exceptions import (
|
||||
DvcException,
|
||||
@@ -22,7 +23,6 @@ from dvc.exceptions import (
|
||||
from dvc.fs.local import LocalFileSystem
|
||||
from dvc.hash_info import HashInfo
|
||||
from dvc.main import main
|
||||
from dvc.objects.db import ODBManager
|
||||
from dvc.output import (
|
||||
OutputAlreadyTrackedError,
|
||||
OutputDoesNotExistError,
|
||||
@@ -102,7 +102,7 @@ def test_add_unsupported_file(dvc):
|
||||
|
||||
|
||||
def test_add_directory(tmp_dir, dvc):
|
||||
from dvc.objects import load
|
||||
from dvc.data import load
|
||||
|
||||
(stage,) = tmp_dir.dvc_gen({"dir": {"file": "file"}})
|
||||
|
||||
@@ -378,7 +378,7 @@ class TestDoubleAddUnchanged(TestDvc):
|
||||
|
||||
|
||||
def test_should_update_state_entry_for_file_after_add(mocker, dvc, tmp_dir):
|
||||
file_md5_counter = mocker.spy(dvc_module.objects.stage, "file_md5")
|
||||
file_md5_counter = mocker.spy(dvc_module.data.stage, "file_md5")
|
||||
tmp_dir.gen("foo", "foo")
|
||||
|
||||
ret = main(["config", "cache.type", "copy"])
|
||||
@@ -409,7 +409,7 @@ def test_should_update_state_entry_for_file_after_add(mocker, dvc, tmp_dir):
|
||||
def test_should_update_state_entry_for_directory_after_add(
|
||||
mocker, dvc, tmp_dir
|
||||
):
|
||||
file_md5_counter = mocker.spy(dvc_module.objects.stage, "file_md5")
|
||||
file_md5_counter = mocker.spy(dvc_module.data.stage, "file_md5")
|
||||
|
||||
tmp_dir.gen({"data/data": "foo", "data/data_sub/sub_data": "foo"})
|
||||
|
||||
@@ -456,7 +456,7 @@ class TestAddCommit(TestDvc):
|
||||
|
||||
def test_should_collect_dir_cache_only_once(mocker, tmp_dir, dvc):
|
||||
tmp_dir.gen({"data/data": "foo"})
|
||||
counter = mocker.spy(dvc_module.objects.stage, "_stage_tree")
|
||||
counter = mocker.spy(dvc_module.data.stage, "_stage_tree")
|
||||
ret = main(["add", "data"])
|
||||
assert ret == 0
|
||||
assert counter.mock.call_count == 1
|
||||
@@ -880,7 +880,7 @@ def test_add_with_cache_link_error(tmp_dir, dvc, mocker, capsys):
|
||||
tmp_dir.gen("foo", "foo")
|
||||
|
||||
mocker.patch(
|
||||
"dvc.objects.checkout.test_links",
|
||||
"dvc.data.checkout.test_links",
|
||||
return_value=[],
|
||||
)
|
||||
dvc.add("foo")
|
||||
|
||||
@@ -85,7 +85,7 @@ class TestCheckoutCorruptedCacheFile(TestRepro):
|
||||
|
||||
class TestCheckoutCorruptedCacheDir(TestDvc):
|
||||
def test(self):
|
||||
from dvc.objects import load
|
||||
from dvc.data import load
|
||||
|
||||
# NOTE: using 'copy' so that cache and link don't have same inode
|
||||
ret = main(["config", "cache.type", "copy"])
|
||||
|
||||
@@ -107,7 +107,7 @@ def test_warn_on_outdated_stage(tmp_dir, dvc, local_remote, caplog):
|
||||
|
||||
def test_hash_recalculation(mocker, dvc, tmp_dir, local_remote):
|
||||
tmp_dir.gen({"foo": "foo"})
|
||||
test_file_md5 = mocker.spy(dvc_module.objects.stage, "file_md5")
|
||||
test_file_md5 = mocker.spy(dvc_module.data.stage, "file_md5")
|
||||
ret = main(["config", "cache.type", "hardlink"])
|
||||
assert ret == 0
|
||||
ret = main(["add", "foo"])
|
||||
@@ -169,7 +169,7 @@ def test_verify_hashes(
|
||||
remove("dir")
|
||||
remove(dvc.odb.local.cache_dir)
|
||||
|
||||
hash_spy = mocker.spy(dvc_module.objects.stage, "file_md5")
|
||||
hash_spy = mocker.spy(dvc_module.data.stage, "file_md5")
|
||||
|
||||
dvc.pull()
|
||||
assert hash_spy.call_count == 0
|
||||
|
||||
@@ -3,9 +3,9 @@ from unittest.mock import ANY, patch
|
||||
|
||||
from scmrepo.git import Git
|
||||
|
||||
from dvc.data.stage import stage
|
||||
from dvc.data.transfer import transfer
|
||||
from dvc.external_repo import CLONES, external_repo
|
||||
from dvc.objects.stage import stage
|
||||
from dvc.objects.transfer import transfer
|
||||
from dvc.utils import relpath
|
||||
from dvc.utils.fs import makedirs, remove
|
||||
from tests.unit.fs.test_repo import make_subrepo
|
||||
|
||||
@@ -6,10 +6,10 @@ import configobj
|
||||
import pytest
|
||||
from git import Repo
|
||||
|
||||
from dvc.data.db.local import LocalObjectDB
|
||||
from dvc.exceptions import CollectCacheError
|
||||
from dvc.fs.local import LocalFileSystem
|
||||
from dvc.main import main
|
||||
from dvc.objects.db.local import LocalObjectDB
|
||||
from dvc.repo import Repo as DvcRepo
|
||||
from dvc.utils.fs import remove
|
||||
from tests.basic_env import TestDir, TestDvcGit
|
||||
|
||||
@@ -3,8 +3,8 @@ import os
|
||||
|
||||
import pytest
|
||||
|
||||
from dvc.data.db import ODBManager
|
||||
from dvc.main import main
|
||||
from dvc.objects.db import ODBManager
|
||||
from dvc.repo import Repo
|
||||
from dvc.repo.get import GetDVCFileError
|
||||
from dvc.system import System
|
||||
|
||||
@@ -7,9 +7,9 @@ from funcy import first
|
||||
from scmrepo.git import Git
|
||||
|
||||
from dvc.config import NoRemoteError
|
||||
from dvc.data.db import ODBManager
|
||||
from dvc.dvcfile import Dvcfile
|
||||
from dvc.exceptions import DownloadError, PathMissingError
|
||||
from dvc.objects.db import ODBManager
|
||||
from dvc.stage.exceptions import StagePathNotFoundError
|
||||
from dvc.system import System
|
||||
from dvc.utils.fs import makedirs, remove
|
||||
@@ -529,7 +529,7 @@ def test_import_with_no_exec(tmp_dir, dvc, erepo_dir):
|
||||
|
||||
|
||||
def test_import_with_jobs(mocker, dvc, erepo_dir):
|
||||
import dvc.objects.transfer as otransfer
|
||||
import dvc.data.transfer as otransfer
|
||||
|
||||
with erepo_dir.chdir():
|
||||
erepo_dir.dvc_gen(
|
||||
|
||||
@@ -4,9 +4,9 @@ import stat
|
||||
import configobj
|
||||
import pytest
|
||||
|
||||
from dvc.data.db import ODBManager
|
||||
from dvc.hash_info import HashInfo
|
||||
from dvc.main import main
|
||||
from dvc.objects.db import ODBManager
|
||||
from dvc.objects.errors import ObjectFormatError
|
||||
from dvc.utils import relpath
|
||||
from tests.basic_env import TestDir, TestDvc
|
||||
@@ -47,7 +47,7 @@ class TestCacheLoadBadDirCache(TestDvc):
|
||||
self.assertEqual(len(ret), 0)
|
||||
|
||||
def test(self):
|
||||
from dvc.objects import load
|
||||
from dvc.data import load
|
||||
|
||||
dir_hash = "123.dir"
|
||||
fname = os.fspath(self.dvc.odb.local.hash_to_path(dir_hash))
|
||||
|
||||
@@ -139,8 +139,8 @@ def test_upper_case_remote(tmp_dir, dvc, local_cloud):
|
||||
|
||||
|
||||
def test_dir_hash_should_be_key_order_agnostic(tmp_dir, dvc):
|
||||
from dvc.objects.stage import stage
|
||||
from dvc.objects.tree import Tree
|
||||
from dvc.data.stage import stage
|
||||
from dvc.data.tree import Tree
|
||||
|
||||
tmp_dir.gen({"data": {"1": "1 content", "2": "2 content"}})
|
||||
|
||||
@@ -150,7 +150,7 @@ def test_dir_hash_should_be_key_order_agnostic(tmp_dir, dvc):
|
||||
[{"relpath": "1", "md5": "1"}, {"relpath": "2", "md5": "2"}]
|
||||
)
|
||||
tree.digest()
|
||||
with patch("dvc.objects.stage._stage_tree", return_value=(None, tree)):
|
||||
with patch("dvc.data.stage._stage_tree", return_value=(None, tree)):
|
||||
_, _, obj = stage(dvc.odb.local, path, dvc.odb.local.fs, "md5")
|
||||
hash1 = obj.hash_info
|
||||
|
||||
@@ -158,7 +158,7 @@ def test_dir_hash_should_be_key_order_agnostic(tmp_dir, dvc):
|
||||
[{"md5": "1", "relpath": "1"}, {"md5": "2", "relpath": "2"}]
|
||||
)
|
||||
tree.digest()
|
||||
with patch("dvc.objects.stage._stage_tree", return_value=(None, tree)):
|
||||
with patch("dvc.data.stage._stage_tree", return_value=(None, tree)):
|
||||
_, _, obj = stage(dvc.odb.local, path, dvc.odb.local.fs, "md5")
|
||||
hash2 = obj.hash_info
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
from dvc.data.db import ODBManager
|
||||
from dvc.dvcfile import PIPELINE_FILE, PIPELINE_LOCK
|
||||
from dvc.objects.db import ODBManager
|
||||
from dvc.system import System
|
||||
|
||||
|
||||
|
||||
@@ -4,9 +4,9 @@ import shutil
|
||||
import pytest
|
||||
|
||||
from dvc.config import NoRemoteError
|
||||
from dvc.data.stage import stage
|
||||
from dvc.fs.dvc import DvcFileSystem
|
||||
from dvc.hash_info import HashInfo
|
||||
from dvc.objects.stage import stage
|
||||
from dvc.utils.fs import remove
|
||||
|
||||
|
||||
@@ -227,7 +227,7 @@ def test_get_hash_dir(tmp_dir, dvc, mocker):
|
||||
{"dir": {"foo": "foo", "bar": "bar", "subdir": {"data": "data"}}}
|
||||
)
|
||||
fs = DvcFileSystem(repo=dvc)
|
||||
get_file_hash_spy = mocker.spy(dvc_module.objects.stage, "get_file_hash")
|
||||
get_file_hash_spy = mocker.spy(dvc_module.data.stage, "get_file_hash")
|
||||
assert (
|
||||
fs.info((tmp_dir / "dir").fs_path)["md5"]
|
||||
== "8761c4e9acad696bee718615e23e22db.dir"
|
||||
|
||||
@@ -4,9 +4,9 @@ from unittest import mock
|
||||
|
||||
import pytest
|
||||
|
||||
from dvc.data.stage import stage
|
||||
from dvc.fs.repo import RepoFileSystem
|
||||
from dvc.hash_info import HashInfo
|
||||
from dvc.objects.stage import stage
|
||||
from tests.utils import clean_staging
|
||||
|
||||
|
||||
@@ -584,9 +584,9 @@ def test_get_hash_mixed_dir(tmp_dir, scm, dvc):
|
||||
|
||||
|
||||
def test_get_hash_dirty_file(tmp_dir, dvc):
|
||||
from dvc.objects import check
|
||||
from dvc.data import check
|
||||
from dvc.data.stage import get_file_hash
|
||||
from dvc.objects.errors import ObjectFormatError
|
||||
from dvc.objects.stage import get_file_hash
|
||||
|
||||
tmp_dir.dvc_gen("file", "file")
|
||||
file_hash_info = HashInfo("md5", "8c7dd922ad47494fc02c388e12c00eac")
|
||||
|
||||
@@ -3,9 +3,9 @@ import os
|
||||
|
||||
import pytest
|
||||
|
||||
from dvc.data.db.local import LocalObjectDB
|
||||
from dvc.fs.local import LocalFileSystem
|
||||
from dvc.hash_info import HashInfo
|
||||
from dvc.objects.db.local import LocalObjectDB
|
||||
|
||||
|
||||
def test_status_download_optimization(mocker, dvc):
|
||||
@@ -13,7 +13,7 @@ def test_status_download_optimization(mocker, dvc):
|
||||
And the desired files to fetch are already on the local cache,
|
||||
Don't check the existence of the desired files on the remote cache
|
||||
"""
|
||||
from dvc.objects.status import compare_status
|
||||
from dvc.data.status import compare_status
|
||||
|
||||
odb = LocalObjectDB(LocalFileSystem(), os.getcwd())
|
||||
obj_ids = {
|
||||
@@ -85,9 +85,9 @@ def test_set_exec_ignore_errors(tmp_dir, dvc, mocker, err):
|
||||
|
||||
|
||||
def test_staging_file(tmp_dir, dvc):
|
||||
from dvc.objects import check
|
||||
from dvc.objects.stage import stage
|
||||
from dvc.objects.transfer import transfer
|
||||
from dvc.data import check
|
||||
from dvc.data.stage import stage
|
||||
from dvc.data.transfer import transfer
|
||||
|
||||
tmp_dir.gen("foo", "foo")
|
||||
fs = LocalFileSystem()
|
||||
@@ -113,9 +113,9 @@ def test_staging_file(tmp_dir, dvc):
|
||||
|
||||
|
||||
def test_staging_dir(tmp_dir, dvc):
|
||||
from dvc.objects import check
|
||||
from dvc.objects.stage import stage
|
||||
from dvc.objects.transfer import transfer
|
||||
from dvc.data import check
|
||||
from dvc.data.stage import stage
|
||||
from dvc.data.transfer import transfer
|
||||
|
||||
tmp_dir.gen({"dir": {"foo": "foo", "bar": "bar"}})
|
||||
fs = LocalFileSystem()
|
||||
|
||||
@@ -2,9 +2,9 @@ from operator import itemgetter
|
||||
|
||||
import pytest
|
||||
|
||||
from dvc.data.meta import Meta
|
||||
from dvc.data.tree import Tree, _merge
|
||||
from dvc.hash_info import HashInfo
|
||||
from dvc.objects.meta import Meta
|
||||
from dvc.objects.tree import Tree, _merge
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import os
|
||||
from unittest.mock import patch
|
||||
|
||||
from dvc.data.meta import Meta
|
||||
from dvc.hash_info import HashInfo
|
||||
from dvc.objects.meta import Meta
|
||||
from dvc.output import Output
|
||||
from dvc.stage import Stage
|
||||
from dvc.utils import relpath
|
||||
|
||||
@@ -3,7 +3,7 @@ import posixpath
|
||||
from unittest import mock
|
||||
|
||||
from dvc.fs.base import FileSystem
|
||||
from dvc.objects.db.base import ObjectDB
|
||||
from dvc.objects.db import ObjectDB
|
||||
|
||||
|
||||
class _CallableOrNone:
|
||||
|
||||
@@ -3,7 +3,7 @@ import os
|
||||
import pytest
|
||||
from funcy import first
|
||||
|
||||
from dvc.objects.db.index import ObjectDBIndex
|
||||
from dvc.data.db.index import ObjectDBIndex
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
||||
@@ -2,10 +2,10 @@ import os
|
||||
|
||||
import pytest
|
||||
|
||||
from dvc.data.db import get_index
|
||||
from dvc.fs import get_cloud_fs
|
||||
from dvc.fs.gs import GSFileSystem
|
||||
from dvc.fs.s3 import S3FileSystem
|
||||
from dvc.objects.db import get_index
|
||||
|
||||
|
||||
def test_remote_with_hash_jobs(dvc):
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
import pytest
|
||||
|
||||
import dvc.objects.db.slow_link_detection
|
||||
from dvc.objects.db.slow_link_detection import slow_link_guard
|
||||
import dvc.data.slow_link_detection
|
||||
from dvc.data.slow_link_detection import slow_link_guard
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def timeout_immediately(monkeypatch):
|
||||
monkeypatch.setattr(
|
||||
dvc.objects.db.slow_link_detection, "timeout_seconds", 0.0
|
||||
)
|
||||
monkeypatch.setattr(dvc.data.slow_link_detection, "timeout_seconds", 0.0)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@@ -27,7 +25,7 @@ def test_show_warning_once(caplog, make_remote):
|
||||
slow_link_guard(lambda x, y: None)(None, remote)
|
||||
slow_link_guard(lambda x, y: None)(None, remote)
|
||||
|
||||
slow_link_detection = dvc.objects.db.slow_link_detection
|
||||
slow_link_detection = dvc.data.slow_link_detection
|
||||
message = slow_link_detection.message # noqa, pylint: disable=no-member
|
||||
assert len(caplog.records) == 1
|
||||
assert caplog.records[0].message == message
|
||||
|
||||
@@ -167,7 +167,7 @@ def test_stage_cache_wdir(tmp_dir, dvc, mocker):
|
||||
def test_shared_stage_cache(tmp_dir, dvc, run_copy):
|
||||
import stat
|
||||
|
||||
from dvc.objects.db import ODBManager
|
||||
from dvc.data.db import ODBManager
|
||||
|
||||
tmp_dir.gen("foo", "foo")
|
||||
|
||||
|
||||
@@ -45,8 +45,8 @@ def dump_sv(stream, metrics, delimiter=",", header=True):
|
||||
|
||||
|
||||
def clean_staging():
|
||||
from dvc.data.stage import _STAGING_MEMFS_PATH
|
||||
from dvc.fs.memory import MemoryFileSystem
|
||||
from dvc.objects.stage import _STAGING_MEMFS_PATH
|
||||
|
||||
try:
|
||||
MemoryFileSystem().fs.rm(
|
||||
|
||||
Reference in New Issue
Block a user