diff --git a/dvc/utils/serialize/_common.py b/dvc/utils/serialize/_common.py index 828c32e15..36f14b00d 100644 --- a/dvc/utils/serialize/_common.py +++ b/dvc/utils/serialize/_common.py @@ -6,7 +6,6 @@ from typing import TYPE_CHECKING, Any, Callable, ContextManager, Dict, Union from typing_extensions import Protocol from dvc.exceptions import DvcException -from dvc.utils import relpath if TYPE_CHECKING: from dvc.tree.base import BaseTree @@ -40,6 +39,8 @@ class ParseError(DvcException): """Errors while parsing files""" def __init__(self, path: "AnyPath", message: str): + from dvc.utils import relpath + path = relpath(path) super().__init__(f"unable to read: '{path}', {message}") diff --git a/dvc/utils/serialize/_toml.py b/dvc/utils/serialize/_toml.py index ce703a8a7..05eee7a8d 100644 --- a/dvc/utils/serialize/_toml.py +++ b/dvc/utils/serialize/_toml.py @@ -1,6 +1,5 @@ from contextlib import contextmanager -import toml from funcy import reraise from ._common import ParseError, _dump_data, _load_data, _modify_data @@ -16,8 +15,10 @@ def load_toml(path, tree=None): def parse_toml(text, path, decoder=None): - with reraise(toml.TomlDecodeError, TOMLFileCorruptedError(path)): - return toml.loads(text, decoder=decoder) + from toml import TomlDecodeError, loads + + with reraise(TomlDecodeError, TOMLFileCorruptedError(path)): + return loads(text, decoder=decoder) def parse_toml_for_update(text, path): @@ -27,11 +28,15 @@ def parse_toml_for_update(text, path): keys may be re-ordered between load/dump, but this function will at least preserve comments. """ - decoder = toml.TomlPreserveCommentDecoder() + from toml import TomlPreserveCommentDecoder + + decoder = TomlPreserveCommentDecoder() return parse_toml(text, path, decoder=decoder) def _dump(data, stream): + import toml + return toml.dump(data, stream, encoder=toml.TomlPreserveCommentEncoder()) diff --git a/dvc/utils/serialize/_yaml.py b/dvc/utils/serialize/_yaml.py index f913fa790..15ba436c9 100644 --- a/dvc/utils/serialize/_yaml.py +++ b/dvc/utils/serialize/_yaml.py @@ -3,9 +3,6 @@ from collections import OrderedDict from contextlib import contextmanager from funcy import reraise -from ruamel.yaml import YAML -from ruamel.yaml.constructor import DuplicateKeyError -from ruamel.yaml.error import YAMLError as _YAMLError from ._common import ParseError, _dump_data, _load_data, _modify_data @@ -24,6 +21,10 @@ def load_yaml(path, tree=None): def parse_yaml(text, path, typ="safe"): + from ruamel.yaml import YAML + from ruamel.yaml import YAMLError as _YAMLError + from ruamel.yaml.constructor import DuplicateKeyError + yaml = YAML(typ=typ) try: with reraise(_YAMLError, YAMLFileCorruptedError(path)): @@ -48,6 +49,8 @@ def parse_yaml_for_update(text, path): def _get_yaml(): + from ruamel.yaml import YAML + yaml = YAML() yaml.default_flow_style = False @@ -67,6 +70,8 @@ def dump_yaml(path, data, tree=None): def loads_yaml(s, typ="safe"): + from ruamel.yaml import YAML + return YAML(typ=typ).load(s)