diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 30d53f9..66d36bb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,10 +21,10 @@ jobs: with: fetch-depth: 0 - - name: Set up Python 3.14 + - name: Set up Python 3.15 uses: actions/setup-python@v6 with: - python-version: '3.14' + python-version: '3.15' - name: Upgrade pip and nox run: | diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 692ba39..254c69e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -21,7 +21,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] - pyv: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14'] + pyv: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14', '3.15'] steps: - name: Check out the repository diff --git a/pyproject.toml b/pyproject.toml index e4912b3..46d0e7e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,6 +19,7 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Development Status :: 4 - Beta", ] requires-python = ">=3.9" @@ -39,7 +40,7 @@ tests = [ "pytest-cov>=4.1.0", "pytest-mock", "pytest-benchmark", - "pytest-asyncio>=0.23.2,<2", + "pytest-asyncio>=0.24,<2", "reflink", ] dev = [ @@ -56,6 +57,7 @@ dvc_objects = ["py.typed"] [tool.pytest.ini_options] addopts = "-ra -Werror --benchmark-skip" +asyncio_default_fixture_loop_scope = "function" [tool.coverage.run] branch = true diff --git a/src/dvc_objects/fs/base.py b/src/dvc_objects/fs/base.py index 0fe15ba..29e1b56 100644 --- a/src/dvc_objects/fs/base.py +++ b/src/dvc_objects/fs/base.py @@ -5,7 +5,7 @@ import os import posixpath import shutil -from collections.abc import Iterable, Iterator, Sequence +from collections.abc import Iterable, Iterator from functools import partial from multiprocessing import cpu_count from typing import ( @@ -133,10 +133,6 @@ def abspath(self, path: str) -> str: path = self.join(self.getcwd(), path) return self.normpath(path) - @classmethod - def commonprefix(cls, paths: Sequence[str]) -> str: - return cls.flavour.commonprefix(paths) - @classmethod def commonpath(cls, paths: Iterable[str]) -> str: return cls.flavour.commonpath(list(paths)) diff --git a/src/dvc_objects/fs/utils.py b/src/dvc_objects/fs/utils.py index f7e0e1f..e8166d3 100644 --- a/src/dvc_objects/fs/utils.py +++ b/src/dvc_objects/fs/utils.py @@ -53,7 +53,10 @@ def resolve_network_drive_windows(path_to_resolve): path = resolve_network_drive_windows(os.path.abspath(path)) start = resolve_network_drive_windows(start) - if not os.path.commonprefix([start, path]): + try: + os.path.commonpath([start, path]) + except ValueError: + # paths are on different drives return path return os.path.relpath(path, start)