diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bc15dd696..99e092b8c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,13 +22,13 @@ repos: - id: sort-simple-yaml - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: 'v0.14.13' + rev: 'v0.15.8' hooks: - id: ruff-check args: [--fix, --exit-non-zero-on-fix] - id: ruff-format - repo: https://github.com/codespell-project/codespell - rev: v2.4.1 + rev: v2.4.2 hooks: - id: codespell additional_dependencies: ["tomli"] diff --git a/dvc/__pyinstaller/hook-celery.py b/dvc/__pyinstaller/hook-celery.py index 4b33db3fb..78918847d 100644 --- a/dvc/__pyinstaller/hook-celery.py +++ b/dvc/__pyinstaller/hook-celery.py @@ -8,7 +8,7 @@ from PyInstaller.utils.hooks import collect_submodules, is_module_or_submodule _EXCLUDES = ("celery.bin", "celery.contrib") hiddenimports = collect_submodules( "celery", - filter=lambda name: not any( - is_module_or_submodule(name, module) for module in _EXCLUDES + filter=lambda name: ( + not any(is_module_or_submodule(name, module) for module in _EXCLUDES) ), ) diff --git a/dvc/repo/experiments/__init__.py b/dvc/repo/experiments/__init__.py index e03c2d382..9f7e67735 100644 --- a/dvc/repo/experiments/__init__.py +++ b/dvc/repo/experiments/__init__.py @@ -188,7 +188,7 @@ class Experiments: rev_names = self.get_exact_name(revs) for rev in revs: name = rev_names[rev] - names.append(name if name else rev[:7]) + names.append(name or rev[:7]) ui.write("\nRan experiment(s): {}".format(", ".join(names))) if tmp_dir: ui.write( diff --git a/dvc/repo/experiments/collect.py b/dvc/repo/experiments/collect.py index 337827d5f..36c8e9fde 100644 --- a/dvc/repo/experiments/collect.py +++ b/dvc/repo/experiments/collect.py @@ -328,7 +328,7 @@ def collect( name=baseline_names.get(baseline_rev), data=baseline_data.data, error=baseline_data.error, - experiments=experiments if experiments else None, + experiments=experiments or None, ) ) return result diff --git a/dvc/repo/experiments/executor/base.py b/dvc/repo/experiments/executor/base.py index 31ddcbac1..bccb8892e 100644 --- a/dvc/repo/experiments/executor/base.py +++ b/dvc/repo/experiments/executor/base.py @@ -757,7 +757,7 @@ class BaseExecutor(ABC): logger.debug("Commit to current experiment branch '%s'", branch) else: baseline_rev = scm.get_ref(EXEC_BASELINE) - name = exp_name if exp_name else f"exp-{exp_hash[:5]}" + name = exp_name or f"exp-{exp_hash[:5]}" ref_info = ExpRefInfo(baseline_rev, name) branch = str(ref_info) old_ref = None diff --git a/dvc/repo/experiments/refs.py b/dvc/repo/experiments/refs.py index 3a34ff35a..b04c82262 100644 --- a/dvc/repo/experiments/refs.py +++ b/dvc/repo/experiments/refs.py @@ -34,7 +34,7 @@ class ExpRefInfo: def __init__(self, baseline_sha: str, name: Optional[str] = None): self.baseline_sha = baseline_sha - self.name: str = name if name else "" + self.name: str = name or "" def __str__(self): return "/".join(self.parts) diff --git a/dvc/repo/experiments/stash.py b/dvc/repo/experiments/stash.py index c2904c160..54504cd5a 100644 --- a/dvc/repo/experiments/stash.py +++ b/dvc/repo/experiments/stash.py @@ -67,7 +67,7 @@ class ExpStash(Stash): branch: Optional[str] = None, ) -> str: msg = cls.MESSAGE_FORMAT.format( - rev=rev, baseline_rev=baseline_rev, name=name if name else "" + rev=rev, baseline_rev=baseline_rev, name=name or "" ) branch_msg = f":{branch}" if branch else "" return f"{msg}{branch_msg}" @@ -124,9 +124,7 @@ class ApplyStash(Stash): @classmethod def format_message(cls, head_rev: str, rev: str, name: Optional[str] = None) -> str: - return cls.MESSAGE_FORMAT.format( - head_rev=head_rev, rev=rev, name=name if name else "" - ) + return cls.MESSAGE_FORMAT.format(head_rev=head_rev, rev=rev, name=name or "") @contextmanager def preserve_workspace( diff --git a/dvc/repo/experiments/utils.py b/dvc/repo/experiments/utils.py index e1038d541..d3b58850a 100644 --- a/dvc/repo/experiments/utils.py +++ b/dvc/repo/experiments/utils.py @@ -200,7 +200,7 @@ def exp_commits( ) -> Iterable[str]: """Iterate over all experiment commits.""" shas: set[str] = set() - refs = ref_infos if ref_infos else exp_refs(scm) + refs = ref_infos or exp_refs(scm) for ref_info in refs: shas.update(scm.branch_revs(str(ref_info), ref_info.baseline_sha)) yield from shas diff --git a/dvc/repo/scm_context.py b/dvc/repo/scm_context.py index 7435f6378..3103f4f6a 100644 --- a/dvc/repo/scm_context.py +++ b/dvc/repo/scm_context.py @@ -10,6 +10,8 @@ from dvc.utils import relpath from dvc.utils.collections import ensure_list if TYPE_CHECKING: + from typing_extensions import Self + from dvc.repo import Repo from dvc.scm import Base @@ -96,7 +98,7 @@ class SCMContext: @contextmanager def __call__( self, autostage: Optional[bool] = None, quiet: Optional[bool] = None - ) -> Iterator["SCMContext"]: + ) -> Iterator["Self"]: try: yield self except Exception: @@ -131,9 +133,10 @@ class SCMContext: self.files_to_track = set() - def __enter__(self) -> "SCMContext": + def __enter__(self) -> "Self": self._cm = self() - return self._cm.__enter__() + self._cm.__enter__() + return self def __exit__(self, *exc_args) -> None: assert self._cm diff --git a/dvc/testing/path_info.py b/dvc/testing/path_info.py index 0e125c873..ab419162d 100644 --- a/dvc/testing/path_info.py +++ b/dvc/testing/path_info.py @@ -2,7 +2,7 @@ import os import pathlib import posixpath import sys -from typing import Callable, ClassVar +from typing import Callable, ClassVar, Union from urllib.parse import urlparse from dvc.utils import relpath @@ -79,15 +79,17 @@ class PathInfo(pathlib.PurePath, _BasePath): and self._cparts[:n] == other._cparts # type: ignore[attr-defined] ) - def relative_to(self, other, *args, **kwargs): + def relative_to( + self, *other: Union[str, "os.PathLike[str]"], **kwargs + ) -> "PathInfo": # pathlib relative_to raises exception when one path is not a direct # descendant of the other when os.path.relpath would return abspath. # For DVC PathInfo we only need the relpath behavior. # See: https://bugs.python.org/issue40358 try: - path = super().relative_to(other, *args, **kwargs) + path = super().relative_to(*other, **kwargs) except ValueError: - path = relpath(self, other) + path = relpath(self, other[0]) return self.__class__(path) diff --git a/tests/func/experiments/test_experiments.py b/tests/func/experiments/test_experiments.py index 7e634f340..99a6b29fd 100644 --- a/tests/func/experiments/test_experiments.py +++ b/tests/func/experiments/test_experiments.py @@ -53,7 +53,7 @@ def test_new_simple(tmp_dir, scm, dvc, exp_stage, mocker, name, workspace): if workspace: assert (tmp_dir / "metrics.yaml").read_text().strip() == "foo: 2" - exp_name = name if name else ref_info.name + exp_name = name or ref_info.name assert dvc.experiments.get_exact_name([exp])[exp] == exp_name assert resolve_rev(scm, exp_name) == exp diff --git a/tests/func/experiments/test_save.py b/tests/func/experiments/test_save.py index c2ed3afe1..9639d3ee4 100644 --- a/tests/func/experiments/test_save.py +++ b/tests/func/experiments/test_save.py @@ -28,7 +28,7 @@ def test_exp_save(tmp_dir, dvc, scm, name): assert ref_info assert ref_info.baseline_sha == baseline - exp_name = name if name else ref_info.name + exp_name = name or ref_info.name assert dvc.experiments.get_exact_name([exp])[exp] == exp_name assert resolve_rev(scm, exp_name) == exp diff --git a/tests/unit/command/test_diff.py b/tests/unit/command/test_diff.py index 296748177..98faf285c 100644 --- a/tests/unit/command/test_diff.py +++ b/tests/unit/command/test_diff.py @@ -196,7 +196,7 @@ def test_diff_show_markdown_and_hash(mocker, show_hash, dvc): cmd = args.func(args) diff = {} - show_hash = show_hash if show_hash else False + show_hash = show_hash or False mock_show_markdown = mocker.patch("dvc.commands.diff._show_markdown") mocker.patch("dvc.repo.Repo.diff", return_value=diff.copy()) diff --git a/tests/unit/command/test_help.py b/tests/unit/command/test_help.py index 488cb63f4..b483036b5 100644 --- a/tests/unit/command/test_help.py +++ b/tests/unit/command/test_help.py @@ -47,7 +47,7 @@ def test_help(caplog, capsys, command_tuples): out, err = capsys.readouterr() # validate metavars are all in lowercase - usage = "\n".join(takewhile(lambda o: bool(o), out.splitlines())) + usage = "\n".join(takewhile(bool, out.splitlines())) message = ( "metavars not lowercased, you are likely missing formatter_class=XXX "