diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 347348a..87aa63c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,22 +22,17 @@ repos: - id: python-no-log-warn - id: python-use-type-annotations - id: text-unicode-replacement-char -- repo: https://github.com/asottile/reorder-python-imports - rev: v3.12.0 - hooks: - - id: reorder-python-imports - args: [--py38-plus, --add-import, 'from __future__ import annotations'] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.11 + rev: v0.3.3 hooks: - id: ruff - id: ruff-format - repo: https://github.com/dosisod/refurb - rev: v1.27.0 + rev: v2.0.0 hooks: - id: refurb - repo: https://github.com/kynan/nbstripout - rev: 0.6.1 + rev: 0.7.1 hooks: - id: nbstripout - repo: https://github.com/executablebooks/mdformat @@ -54,7 +49,7 @@ repos: hooks: - id: codespell - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.8.0' + rev: 'v1.9.0' hooks: - id: mypy args: [ diff --git a/pyproject.toml b/pyproject.toml index df23f52..4d65dd2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -81,21 +81,18 @@ no_implicit_optional = true warn_redundant_casts = true warn_unused_ignores = true - [[tool.mypy.overrides]] module = "tests.*" disallow_untyped_defs = false ignore_errors = true - [tool.ruff] target-version = "py38" -select = ["ALL"] fix = true +unsafe-fixes = true + +[tool.ruff.lint] extend-ignore = [ - "I", # ignore isort - "TRY", # ignore tryceratops. - "TCH", # ignore non-guarded type imports. # Others. "ANN101", # type annotating self "ANN102", # type annotating cls @@ -103,16 +100,17 @@ extend-ignore = [ "COM812", # Comply with ruff-format. "ISC001", # Comply with ruff-format. ] +select = ["ALL"] - -[tool.ruff.per-file-ignores] +[tool.ruff.lint.per-file-ignores] "tests/*" = ["D", "ANN", "PLR2004", "S101"] +[tool.ruff.lint.isort] +force-single-line = true -[tool.ruff.pydocstyle] +[tool.ruff.lint.pydocstyle] convention = "numpy" - [tool.pytest.ini_options] # Do not add src since it messes with the loading of pytask-parallel as a plugin. testpaths = ["tests"] @@ -123,3 +121,11 @@ markers = [ "end_to_end: Flag for tests that cover the whole program.", ] norecursedirs = [".idea", ".tox"] + +[tool.coverage.report] +exclude_also = [ + "pragma: no cover", + "if TYPE_CHECKING.*:", + "\\.\\.\\.", + "def __repr__", +] diff --git a/src/pytask_parallel/__init__.py b/src/pytask_parallel/__init__.py index b940c76..c937a1f 100644 --- a/src/pytask_parallel/__init__.py +++ b/src/pytask_parallel/__init__.py @@ -1,4 +1,5 @@ """Contains the main namespace of the package.""" + from __future__ import annotations try: diff --git a/src/pytask_parallel/backends.py b/src/pytask_parallel/backends.py index 981f2a0..7cefeb9 100644 --- a/src/pytask_parallel/backends.py +++ b/src/pytask_parallel/backends.py @@ -1,4 +1,5 @@ """Configures the available backends.""" + from __future__ import annotations import enum diff --git a/src/pytask_parallel/build.py b/src/pytask_parallel/build.py index b6542f3..6ba44ae 100644 --- a/src/pytask_parallel/build.py +++ b/src/pytask_parallel/build.py @@ -1,9 +1,11 @@ """Extend the build command.""" + from __future__ import annotations import click from pytask import EnumChoice from pytask import hookimpl + from pytask_parallel.backends import PARALLEL_BACKENDS_DEFAULT from pytask_parallel.backends import ParallelBackend diff --git a/src/pytask_parallel/config.py b/src/pytask_parallel/config.py index cf840a5..7e4dd2e 100644 --- a/src/pytask_parallel/config.py +++ b/src/pytask_parallel/config.py @@ -1,4 +1,5 @@ """Configure pytask.""" + from __future__ import annotations import enum @@ -6,6 +7,7 @@ from typing import Any from pytask import hookimpl + from pytask_parallel.backends import ParallelBackend diff --git a/src/pytask_parallel/execute.py b/src/pytask_parallel/execute.py index ce6d642..1632deb 100644 --- a/src/pytask_parallel/execute.py +++ b/src/pytask_parallel/execute.py @@ -1,43 +1,49 @@ """Contains code relevant to the execution.""" + from __future__ import annotations import inspect import sys import time import warnings -from concurrent.futures import Future from functools import partial -from pathlib import Path -from types import ModuleType -from types import TracebackType +from typing import TYPE_CHECKING from typing import Any from typing import Callable import cloudpickle from attrs import define from attrs import field -from pytask import console from pytask import ExecutionReport -from pytask import get_marks -from pytask import hookimpl from pytask import Mark -from pytask import parse_warning_filter from pytask import PNode from pytask import PTask from pytask import PythonNode -from pytask import remove_internal_traceback_frames_from_exc_info from pytask import Session from pytask import Task -from pytask import warning_record_to_str from pytask import WarningReport +from pytask import console +from pytask import get_marks +from pytask import hookimpl +from pytask import parse_warning_filter +from pytask import remove_internal_traceback_frames_from_exc_info +from pytask import warning_record_to_str from pytask.tree_util import PyTree from pytask.tree_util import tree_leaves from pytask.tree_util import tree_map from pytask.tree_util import tree_structure +from rich.traceback import Traceback + from pytask_parallel.backends import PARALLEL_BACKENDS from pytask_parallel.backends import ParallelBackend -from rich.console import ConsoleOptions -from rich.traceback import Traceback + +if TYPE_CHECKING: + from concurrent.futures import Future + from pathlib import Path + from types import ModuleType + from types import TracebackType + + from rich.console import ConsoleOptions @hookimpl diff --git a/src/pytask_parallel/logging.py b/src/pytask_parallel/logging.py index 1cdba94..8ee5131 100644 --- a/src/pytask_parallel/logging.py +++ b/src/pytask_parallel/logging.py @@ -1,9 +1,10 @@ """Contains code relevant to logging.""" + from __future__ import annotations +from pytask import Session from pytask import console from pytask import hookimpl -from pytask import Session @hookimpl(trylast=True) diff --git a/src/pytask_parallel/plugin.py b/src/pytask_parallel/plugin.py index 88fffee..8ccf789 100644 --- a/src/pytask_parallel/plugin.py +++ b/src/pytask_parallel/plugin.py @@ -1,13 +1,19 @@ """Entry-point for the plugin.""" + from __future__ import annotations -from pluggy import PluginManager +from typing import TYPE_CHECKING + from pytask import hookimpl + from pytask_parallel import build from pytask_parallel import config from pytask_parallel import execute from pytask_parallel import logging +if TYPE_CHECKING: + from pluggy import PluginManager + @hookimpl def pytask_add_hooks(pm: PluginManager) -> None: diff --git a/tests/conftest.py b/tests/conftest.py index ef47c25..cedd5f8 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -15,7 +15,7 @@ class SysPathsSnapshot: """A snapshot for sys.path.""" def __init__(self) -> None: - self.__saved = list(sys.path), list(sys.meta_path) + self.__saved = sys.path.copy(), sys.meta_path.copy() def restore(self) -> None: sys.path[:], sys.meta_path[:] = self.__saved @@ -26,7 +26,7 @@ class SysModulesSnapshot: def __init__(self, preserve: Callable[[str], bool] | None = None) -> None: self.__preserve = preserve - self.__saved = dict(sys.modules) + self.__saved = sys.modules.copy() def restore(self) -> None: if self.__preserve: diff --git a/tests/test_config.py b/tests/test_config.py index f173a73..f73fded 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -4,8 +4,8 @@ import textwrap import pytest -from pytask import build from pytask import ExitCode +from pytask import build from pytask_parallel.backends import ParallelBackend diff --git a/tests/test_execute.py b/tests/test_execute.py index 9786c67..dbdfbe0 100644 --- a/tests/test_execute.py +++ b/tests/test_execute.py @@ -4,9 +4,9 @@ from time import time import pytest +from pytask import ExitCode from pytask import build from pytask import cli -from pytask import ExitCode from pytask_parallel.backends import PARALLEL_BACKENDS from pytask_parallel.backends import ParallelBackend from pytask_parallel.execute import _Sleeper diff --git a/tests/test_jupyter/test_functional_interface.ipynb b/tests/test_jupyter/test_functional_interface.ipynb index abbce24..3750b24 100644 --- a/tests/test_jupyter/test_functional_interface.ipynb +++ b/tests/test_jupyter/test_functional_interface.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": null, - "id": "12bc75b1", + "id": "0", "metadata": {}, "outputs": [], "source": [ @@ -18,7 +18,7 @@ { "cell_type": "code", "execution_count": null, - "id": "29ac7311", + "id": "1", "metadata": {}, "outputs": [], "source": [ @@ -39,7 +39,7 @@ { "cell_type": "code", "execution_count": null, - "id": "738c9418", + "id": "2", "metadata": {}, "outputs": [], "source": [ diff --git a/tests/test_jupyter/test_functional_interface_w_relative_path.ipynb b/tests/test_jupyter/test_functional_interface_w_relative_path.ipynb index 1202ccf..57303eb 100644 --- a/tests/test_jupyter/test_functional_interface_w_relative_path.ipynb +++ b/tests/test_jupyter/test_functional_interface_w_relative_path.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": null, - "id": "12bc75b1", + "id": "0", "metadata": {}, "outputs": [], "source": [ @@ -18,7 +18,7 @@ { "cell_type": "code", "execution_count": null, - "id": "29ac7311", + "id": "1", "metadata": {}, "outputs": [], "source": [ @@ -39,7 +39,7 @@ { "cell_type": "code", "execution_count": null, - "id": "738c9418", + "id": "2", "metadata": {}, "outputs": [], "source": [