diff --git a/docs/tox_conf.py b/docs/tox_conf.py index 341c002b8..d1f2c0c14 100644 --- a/docs/tox_conf.py +++ b/docs/tox_conf.py @@ -5,7 +5,6 @@ from docutils.nodes import Element, Node, Text, container, fully_normalize_name, literal, paragraph, reference, strong from docutils.parsers.rst.directives import flag, unchanged, unchanged_required from docutils.statemachine import StringList, string2lines -from sphinx.domains.std import StandardDomain from sphinx.locale import __ from sphinx.util.docutils import SphinxDirective from sphinx.util.logging import getLogger @@ -14,6 +13,7 @@ from typing import Final from docutils.parsers.rst.states import RSTState, RSTStateMachine + from sphinx.domains.std import StandardDomain LOGGER = getLogger(__name__) @@ -53,7 +53,7 @@ def __init__( # noqa: PLR0913 state, state_machine, ) - self._std_domain: StandardDomain = cast(StandardDomain, self.env.get_domain("std")) + self._std_domain: StandardDomain = cast("StandardDomain", self.env.get_domain("std")) def run(self) -> list[Node]: self.env.note_reread() # this document needs to be always updated diff --git a/src/tox/config/cli/parse.py b/src/tox/config/cli/parse.py index b62d3fb0a..a61de06ba 100644 --- a/src/tox/config/cli/parse.py +++ b/src/tox/config/cli/parse.py @@ -67,7 +67,7 @@ def _get_base(args: Sequence[str]) -> tuple[int, ToxHandler, Source]: def _get_all(args: Sequence[str]) -> tuple[Parsed, dict[str, Callable[[State], int]]]: """Parse all the options.""" tox_parser = _get_parser() - parsed = cast(Parsed, tox_parser.parse_args(args)) + parsed = cast("Parsed", tox_parser.parse_args(args)) handlers = {k: p for k, (_, p) in tox_parser.handlers.items()} return parsed, handlers diff --git a/src/tox/config/cli/parser.py b/src/tox/config/cli/parser.py index 35fd3b7c7..afbe578c9 100644 --- a/src/tox/config/cli/parser.py +++ b/src/tox/config/cli/parser.py @@ -123,7 +123,7 @@ def verbosity(self) -> int: @property def is_colored(self) -> bool: """:return: flag indicating if the output is colored or not""" - return cast(bool, self.colored == "yes") + return cast("bool", self.colored == "yes") exit_and_dump_after: int @@ -205,7 +205,7 @@ def __call__( result = None else: try: - result = int(cast(str, values)) + result = int(cast("str", values)) if result <= 0: msg = "must be greater than zero" raise ValueError(msg) # noqa: TRY301 diff --git a/src/tox/config/loader/convert.py b/src/tox/config/loader/convert.py index 9acec5d99..22cba11e6 100644 --- a/src/tox/config/loader/convert.py +++ b/src/tox/config/loader/convert.py @@ -87,7 +87,7 @@ def _to_typing(self, raw: T, of_type: type[V], factory: Factory[V]) -> V: # noq raise ValueError(msg) result = raw if result is not _NO_MAPPING: - return cast(V, result) + return cast("V", result) msg = f"{raw} cannot cast to {of_type!r}" raise TypeError(msg) diff --git a/src/tox/config/loader/toml/__init__.py b/src/tox/config/loader/toml/__init__.py index 08b387e50..fb402bcfe 100644 --- a/src/tox/config/loader/toml/__init__.py +++ b/src/tox/config/loader/toml/__init__.py @@ -43,7 +43,7 @@ def load_raw(self, key: str, conf: Config | None, env_name: str | None) -> TomlT return self.content[key] def load_raw_from_root(self, path: str) -> TomlTypes: - current = cast(TomlTypes, self._root_content) + current = cast("TomlTypes", self._root_content) for key in path.split(self.section.SEP): if isinstance(current, dict): current = current[key] @@ -98,7 +98,7 @@ def to_path(value: TomlTypes) -> Path: @staticmethod def to_command(value: TomlTypes) -> Command | None: if value: - return Command(args=cast(List[str], value)) # validated during load in _ensure_type_correct + return Command(args=cast("List[str]", value)) # validated during load in _ensure_type_correct return None @staticmethod diff --git a/src/tox/config/loader/toml/_replace.py b/src/tox/config/loader/toml/_replace.py index 0a02346ae..a7664aee1 100644 --- a/src/tox/config/loader/toml/_replace.py +++ b/src/tox/config/loader/toml/_replace.py @@ -6,7 +6,6 @@ from tox.config.loader.replacer import MatchRecursionError, ReplaceReference, load_posargs, replace, replace_env from tox.config.loader.stringify import stringify -from ._api import TomlTypes from ._validate import validate if TYPE_CHECKING: @@ -16,6 +15,8 @@ from tox.config.sets import ConfigSet from tox.config.source.toml_pyproject import TomlSection + from ._api import TomlTypes + class Unroll: def __init__(self, conf: Config | None, loader: TomlLoader, args: ConfigLoadArgs) -> None: @@ -39,7 +40,7 @@ def __call__(self, value: TomlTypes, depth: int = 0) -> TomlTypes: # noqa: C901 for val in value: # apply replacement for every entry got = self(val, depth) if isinstance(val, dict) and val.get("replace") and val.get("extend"): - res_list.extend(cast(List[Any], got)) + res_list.extend(cast("List[Any]", got)) else: res_list.append(got) value = res_list @@ -49,7 +50,7 @@ def __call__(self, value: TomlTypes, depth: int = 0) -> TomlTypes: # noqa: C901 if replace_type == "posargs" and self.conf is not None: got_posargs = load_posargs(self.conf, self.args) return ( - [self(v, depth) for v in cast(List[str], value.get("default", []))] + [self(v, depth) for v in cast("List[str]", value.get("default", []))] if got_posargs is None else list(got_posargs) ) @@ -57,8 +58,8 @@ def __call__(self, value: TomlTypes, depth: int = 0) -> TomlTypes: # noqa: C901 return replace_env( self.conf, [ - cast(str, validate(value["name"], str)), - cast(str, validate(self(value.get("default", ""), depth), str)), + cast("str", validate(value["name"], str)), + cast("str", validate(self(value.get("default", ""), depth), str)), ], self.args, ) @@ -73,9 +74,9 @@ def __call__(self, value: TomlTypes, depth: int = 0) -> TomlTypes: # noqa: C901 def _replace_ref(self, value: dict[str, TomlTypes], depth: int) -> TomlTypes: if self.conf is not None and (env := value.get("env")) and (key := value.get("key")): - return cast(TomlTypes, self.conf.get_env(cast(str, env))[cast(str, key)]) + return cast("TomlTypes", self.conf.get_env(cast("str", env))[cast("str", key)]) if of := value.get("of"): - validated_of = cast(List[str], validate(of, List[str])) + validated_of = cast("List[str]", validate(of, List[str])) loaded = self.loader.load_raw_from_root(self.loader.section.SEP.join(validated_of)) return self(loaded, depth) return value diff --git a/src/tox/config/loader/toml/_validate.py b/src/tox/config/loader/toml/_validate.py index 080c07b7f..89258990e 100644 --- a/src/tox/config/loader/toml/_validate.py +++ b/src/tox/config/loader/toml/_validate.py @@ -76,7 +76,7 @@ def validate(val: TomlTypes, of_type: type[T]) -> TypeGuard[T]: # noqa: C901, P msg = f"{val!r} is not of type {of_type.__name__!r}" if msg: raise TypeError(msg) - return cast(T, val) # type: ignore[return-value] # logic too complicated for mypy + return cast("T", val) # type: ignore[return-value] # logic too complicated for mypy __all__ = [ diff --git a/src/tox/config/of_type.py b/src/tox/config/of_type.py index fd978bb4a..d31922f6c 100644 --- a/src/tox/config/of_type.py +++ b/src/tox/config/of_type.py @@ -118,7 +118,7 @@ def __call__( if self.post_process is not None: value = self.post_process(value) self._cache = value - return cast(T, self._cache) + return cast("T", self._cache) def __repr__(self) -> str: values = ((k, v) for k, v in vars(self).items() if k not in {"post_process", "_cache"} and v is not None) diff --git a/src/tox/config/sets.py b/src/tox/config/sets.py index b78ff84cb..3a1ff171a 100644 --- a/src/tox/config/sets.py +++ b/src/tox/config/sets.py @@ -67,7 +67,7 @@ def add_config( # noqa: PLR0913 keys_ = self._make_keys(keys) definition = ConfigDynamicDefinition(keys_, desc, of_type, default, post_process, factory) result = self._add_conf(keys_, definition) - return cast(ConfigDynamicDefinition[V], result) + return cast("ConfigDynamicDefinition[V]", result) def add_constant(self, keys: str | Sequence[str], desc: str, value: V) -> ConfigConstantDefinition[V]: """ @@ -84,7 +84,7 @@ def add_constant(self, keys: str | Sequence[str], desc: str, value: V) -> Config keys_ = self._make_keys(keys) definition = ConfigConstantDefinition(keys_, desc, value) result = self._add_conf(keys_, definition) - return cast(ConfigConstantDefinition[V], result) + return cast("ConfigConstantDefinition[V]", result) @staticmethod def _make_keys(keys: str | Sequence[str]) -> Sequence[str]: @@ -182,10 +182,10 @@ def __init__(self, conf: Config, section: Section, root: Path, src_path: Path) - self.add_config(keys=["env_list", "envlist"], of_type=EnvList, default=EnvList([]), desc=desc) def _default_work_dir(self, conf: Config, env_name: str | None) -> Path: # noqa: ARG002 - return cast(Path, self["tox_root"] / ".tox") + return cast("Path", self["tox_root"] / ".tox") def _default_temp_dir(self, conf: Config, env_name: str | None) -> Path: # noqa: ARG002 - return cast(Path, self["work_dir"] / ".tmp") + return cast("Path", self["work_dir"] / ".tmp") def _work_dir_post_process(self, folder: Path) -> Path: return self._conf.work_dir if self._conf.options.work_dir else folder diff --git a/src/tox/config/source/toml_pyproject.py b/src/tox/config/source/toml_pyproject.py index bf0ac0cb1..4c03e41ac 100644 --- a/src/tox/config/source/toml_pyproject.py +++ b/src/tox/config/source/toml_pyproject.py @@ -92,7 +92,7 @@ def transform_section(self, section: Section) -> Section: def get_loader(self, section: Section, override_map: OverrideMap) -> Loader[Any] | None: current = self._our_content - sec = cast(TomlSection, section) + sec = cast("TomlSection", section) for key in sec.keys: if key in current: current = current[key] diff --git a/src/tox/execute/api.py b/src/tox/execute/api.py index 5ab22609a..80487a169 100644 --- a/src/tox/execute/api.py +++ b/src/tox/execute/api.py @@ -52,15 +52,15 @@ def register_conf(cls, env: ToxEnv) -> None: @property def suicide_timeout(self) -> float: - return cast(float, self._env.conf["suicide_timeout"]) + return cast("float", self._env.conf["suicide_timeout"]) @property def interrupt_timeout(self) -> float: - return cast(float, self._env.conf["interrupt_timeout"]) + return cast("float", self._env.conf["interrupt_timeout"]) @property def terminate_timeout(self) -> float: - return cast(float, self._env.conf["terminate_timeout"]) + return cast("float", self._env.conf["terminate_timeout"]) class ExecuteStatus(ABC): diff --git a/src/tox/provision.py b/src/tox/provision.py index 6ca51cb4f..c989c39dd 100644 --- a/src/tox/provision.py +++ b/src/tox/provision.py @@ -20,12 +20,12 @@ from tox.report import HandledError from tox.tox_env.errors import Skip from tox.tox_env.python.pip.req_file import PythonDeps -from tox.tox_env.python.runner import PythonRun if TYPE_CHECKING: from argparse import ArgumentParser from tox.session.state import State + from tox.tox_env.python.runner import PythonRun @impl @@ -141,7 +141,7 @@ def _get_missing(requires: list[Requirement]) -> list[tuple[Requirement, str | N def run_provision(name: str, state: State) -> int: - tox_env: PythonRun = cast(PythonRun, state.envs[name]) + tox_env: PythonRun = cast("PythonRun", state.envs[name]) env_python = tox_env.env_python() logging.info("will run in a automatically provisioned python environment under %s", env_python) try: @@ -152,4 +152,4 @@ def run_provision(name: str, state: State) -> int: args: list[str] = [str(env_python), "-m", "tox"] args.extend(state.args) outcome = tox_env.execute(cmd=args, stdin=StdinSource.user_only(), show=True, run_id="provision", cwd=Path.cwd()) - return cast(int, outcome.exit_code) + return cast("int", outcome.exit_code) diff --git a/src/tox/pytest.py b/src/tox/pytest.py index ca42a5b27..72f410bf5 100644 --- a/src/tox/pytest.py +++ b/src/tox/pytest.py @@ -291,7 +291,7 @@ def our_setup_state(value: Sequence[str]) -> State: msg = "exit code not set" raise RuntimeError(msg) out, err = self._capfd.readouterr() - return ToxRunOutcome(args, self.path, cast(int, code), out, err, state) + return ToxRunOutcome(args, self.path, cast("int", code), out, err, state) def __repr__(self) -> str: return f"{type(self).__name__}(path={self.path}) at {id(self)}" @@ -488,7 +488,7 @@ def pypi_server(tmp_path_factory: pytest.TempPathFactory) -> Iterator[IndexServe def _invalid_index_fake_port() -> int: with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as socket_handler: socket_handler.bind(("", 0)) - return cast(int, socket_handler.getsockname()[1]) + return cast("int", socket_handler.getsockname()[1]) @pytest.fixture(autouse=True) diff --git a/src/tox/session/cmd/depends.py b/src/tox/session/cmd/depends.py index b6393fb34..9dfc9a994 100644 --- a/src/tox/session/cmd/depends.py +++ b/src/tox/session/cmd/depends.py @@ -4,11 +4,11 @@ from tox.plugin import impl from tox.session.cmd.run.common import env_run_create_flags, run_order -from tox.tox_env.runner import RunToxEnv if TYPE_CHECKING: from tox.config.cli.parser import ToxParser from tox.session.state import State + from tox.tox_env.runner import RunToxEnv @impl @@ -34,7 +34,7 @@ def _handle(at: int, env: str) -> None: print(" " * at, end="") # noqa: T201 print(env, end="") # noqa: T201 if env != "ALL": - run_env = cast(RunToxEnv, state.envs[env]) + run_env = cast("RunToxEnv", state.envs[env]) packager_list: list[str] = [] try: for pkg_env in run_env.package_envs: diff --git a/src/tox/session/cmd/legacy.py b/src/tox/session/cmd/legacy.py index a78d8bac7..1642ce4b4 100644 --- a/src/tox/session/cmd/legacy.py +++ b/src/tox/session/cmd/legacy.py @@ -7,20 +7,20 @@ from tox.config.cli.parser import DEFAULT_VERBOSITY, Parsed, ToxParser from tox.config.loader.memory import MemoryLoader -from tox.config.set_env import SetEnv from tox.plugin import impl from tox.session.cmd.run.common import env_run_create_flags from tox.session.cmd.run.parallel import OFF_VALUE, parallel_flags, run_parallel from tox.session.cmd.run.sequential import run_sequential from tox.session.env_select import CliEnv, EnvSelector, register_env_select_flags -from tox.tox_env.python.pip.req_file import PythonDeps from .devenv import devenv from .list_env import list_env from .show_config import show_config if TYPE_CHECKING: + from tox.config.set_env import SetEnv from tox.session.state import State + from tox.tox_env.python.pip.req_file import PythonDeps @impl @@ -131,10 +131,10 @@ def _handle_legacy_only_flags(option: Parsed, envs: EnvSelector) -> None: # noq if override: env_conf.loaders.insert(0, MemoryLoader(**override)) if set_env: - cast(SetEnv, env_conf["set_env"]).update(set_env, override=True) + cast("SetEnv", env_conf["set_env"]).update(set_env, override=True) if forced: to_force = forced.copy() - deps = cast(PythonDeps, env_conf["deps"]) + deps = cast("PythonDeps", env_conf["deps"]) as_root_args = deps.as_root_args for at, entry in enumerate(as_root_args): try: diff --git a/src/tox/session/cmd/run/common.py b/src/tox/session/cmd/run/common.py index 1ef0a934e..465507633 100644 --- a/src/tox/session/cmd/run/common.py +++ b/src/tox/session/cmd/run/common.py @@ -14,17 +14,17 @@ from colorama import Fore -from tox.config.types import EnvList from tox.execute import Outcome from tox.journal import write_journal from tox.session.cmd.run.single import ToxEnvRunResult, run_one -from tox.tox_env.runner import RunToxEnv from tox.util.graph import stable_topological_sort from tox.util.spinner import MISS_DURATION, Spinner if TYPE_CHECKING: + from tox.config.types import EnvList from tox.session.state import State from tox.tox_env.api import ToxEnv + from tox.tox_env.runner import RunToxEnv class SkipMissingInterpreterAction(Action): @@ -51,7 +51,7 @@ def __call__( ) -> None: if not values: raise ArgumentError(self, "cannot be empty") - path = Path(cast(str, values)).absolute() + path = Path(cast("str", values)).absolute() if not path.exists(): raise ArgumentError(self, f"{path} does not exist") if not path.is_file(): @@ -167,7 +167,7 @@ def execute(state: State, max_workers: int | None, has_spinner: bool, live: bool state.envs.ensure_only_run_env_is_active() to_run_list: list[str] = list(state.envs.iter()) for name in to_run_list: - cast(RunToxEnv, state.envs[name]).mark_active() + cast("RunToxEnv", state.envs[name]).mark_active() previous, has_previous = None, False try: spinner = ToxSpinner(has_spinner, state, len(to_run_list)) @@ -260,7 +260,7 @@ def _run(tox_env: RunToxEnv) -> ToxEnvRunResult: env_list: list[str] = [] while True: for env in env_list: # queue all available - tox_env_to_run = cast(RunToxEnv, state.envs[env]) + tox_env_to_run = cast("RunToxEnv", state.envs[env]) if interrupt.is_set(): # queue the rest as failed upfront tox_env_to_run.teardown() future: Future[ToxEnvRunResult] = Future() @@ -322,7 +322,7 @@ def _handle_one_run_done( ) -> None: success = result.code == Outcome.OK spinner.update_spinner(result, success) - tox_env = cast(RunToxEnv, state.envs[result.name]) + tox_env = cast("RunToxEnv", state.envs[result.name]) if tox_env.journal: # add overall journal entry tox_env.journal["result"] = { "success": success, @@ -362,8 +362,8 @@ def run_order(state: State, to_run: list[str]) -> tuple[list[str], dict[str, set to_run_set = set(to_run) todo: dict[str, set[str]] = {} for env in to_run: - run_env = cast(RunToxEnv, state.envs[env]) - depends = set(cast(EnvList, run_env.conf["depends"]).envs) + run_env = cast("RunToxEnv", state.envs[env]) + depends = set(cast("EnvList", run_env.conf["depends"]).envs) todo[env] = to_run_set & depends order = stable_topological_sort(todo) return order, todo diff --git a/src/tox/session/cmd/run/single.py b/src/tox/session/cmd/run/single.py index a742dc86a..8871e48b0 100644 --- a/src/tox/session/cmd/run/single.py +++ b/src/tox/session/cmd/run/single.py @@ -62,7 +62,7 @@ def _evaluate(tox_env: RunToxEnv, no_test: bool) -> tuple[bool, int, list[Outcom finally: tox_env.teardown() except SystemExit as exception: # setup command fails (interrupted or via invocation) - code = cast(int, exception.code) + code = cast("int", exception.code) return skipped, code, outcomes @@ -122,9 +122,9 @@ def run_command_set( continue if ignore_errors: if exit_code == Outcome.OK: - exit_code = cast(int, exception.code) # ignore errors continues ahead but saves the exit code + exit_code = cast("int", exception.code) # ignore errors continues ahead but saves the exit code continue - return cast(int, exception.code) + return cast("int", exception.code) return exit_code diff --git a/src/tox/session/cmd/version_flag.py b/src/tox/session/cmd/version_flag.py index 6b1a889fc..91c44e930 100644 --- a/src/tox/session/cmd/version_flag.py +++ b/src/tox/session/cmd/version_flag.py @@ -5,14 +5,16 @@ import sys from argparse import SUPPRESS, Action, ArgumentParser, Namespace from pathlib import Path -from typing import Any, Sequence, cast +from typing import TYPE_CHECKING, Any, Sequence, cast import tox -from tox.config.cli.parser import HelpFormatter, ToxParser from tox.plugin import impl from tox.plugin.manager import MANAGER from tox.version import version +if TYPE_CHECKING: + from tox.config.cli.parser import HelpFormatter, ToxParser + @impl def tox_add_option(parser: ToxParser) -> None: @@ -28,7 +30,7 @@ def __call__( values: str | Sequence[Any] | None, # noqa: ARG002 option_string: str | None = None, # noqa: ARG002 ) -> None: - formatter = cast(HelpFormatter, parser._get_formatter()) # noqa: SLF001 + formatter = cast("HelpFormatter", parser._get_formatter()) # noqa: SLF001 formatter.add_raw_text(get_version_info()) parser._print_message(formatter.format_help(), sys.stdout) # noqa: SLF001 parser.exit() diff --git a/src/tox/session/env_select.py b/src/tox/session/env_select.py index bcab8761f..1949aa173 100644 --- a/src/tox/session/env_select.py +++ b/src/tox/session/env_select.py @@ -205,7 +205,7 @@ def _ensure_envs_valid(self) -> None: invalid_envs[env] = ( None if any(i is None for i in factors.values()) - else "-".join(cast(Iterable[str], factors.values())) + else "-".join(cast("Iterable[str]", factors.values())) ) if invalid_envs: msg = "provided environments not found in configuration file:\n" @@ -316,7 +316,7 @@ def _build_run_env(self, name: str) -> RunToxEnv | None: env_conf = self._state.conf.get_env(name, package=False) desc = "the tox execute used to evaluate this environment" env_conf.add_config(keys="runner", desc=desc, of_type=str, default=self._state.conf.options.default_runner) - runner = REGISTER.runner(cast(str, env_conf["runner"])) + runner = REGISTER.runner(cast("str", env_conf["runner"])) journal = self._journal.get_env_journal(name) args = ToxEnvCreateArgs(env_conf, self._state.conf.core, self._state.conf.options, journal, self._log_handler) run_env = runner(args) diff --git a/src/tox/tox_env/api.py b/src/tox/tox_env/api.py index ddb6c3c14..c90021252 100644 --- a/src/tox/tox_env/api.py +++ b/src/tox/tox_env/api.py @@ -10,7 +10,6 @@ import sys from abc import ABC, abstractmethod from contextlib import contextmanager -from io import BytesIO from pathlib import Path from typing import TYPE_CHECKING, Any, Iterator, List, NamedTuple, Sequence, Set, cast @@ -20,6 +19,8 @@ from tox.util.path import ensure_empty_dir if TYPE_CHECKING: + from io import BytesIO + from tox.config.cli.parser import Parsed from tox.config.main import Config from tox.config.set_env import SetEnv @@ -111,19 +112,19 @@ def register_config(self) -> None: self.conf.add_config( keys=["env_dir", "envdir"], of_type=Path, - default=lambda conf, name: cast(Path, conf.core["work_dir"]) / self.name, # noqa: ARG005 + default=lambda conf, name: cast("Path", conf.core["work_dir"]) / self.name, # noqa: ARG005 desc="directory assigned to the tox environment", ) self.conf.add_config( keys=["env_tmp_dir", "envtmpdir"], of_type=Path, - default=lambda conf, name: cast(Path, conf.core["work_dir"]) / self.name / "tmp", # noqa: ARG005 + default=lambda conf, name: cast("Path", conf.core["work_dir"]) / self.name / "tmp", # noqa: ARG005 desc="a folder that is always reset at the start of the run", ) self.conf.add_config( keys=["env_log_dir", "envlogdir"], of_type=Path, - default=lambda conf, name: cast(Path, conf.core["work_dir"]) / self.name / "log", # noqa: ARG005 + default=lambda conf, name: cast("Path", conf.core["work_dir"]) / self.name / "log", # noqa: ARG005 desc="a folder for logging where tox will put logs of tool invocation", ) self.executor.register_conf(self) @@ -177,26 +178,26 @@ def pass_env_post_process(values: list[str]) -> list[str]: assert self.installer is not None # noqa: S101 # trigger installer creation to allow config registration def _recreate_default(self, conf: Config, value: str | None) -> bool: # noqa: ARG002 - return cast(bool, self.options.recreate) + return cast("bool", self.options.recreate) @property def env_dir(self) -> Path: """:return: the tox environments environment folder""" - return cast(Path, self.conf["env_dir"]) + return cast("Path", self.conf["env_dir"]) @property def env_tmp_dir(self) -> Path: """:return: the tox environments temp folder""" - return cast(Path, self.conf["env_tmp_dir"]) + return cast("Path", self.conf["env_tmp_dir"]) @property def env_log_dir(self) -> Path: """:return: the tox environments log folder""" - return cast(Path, self.conf["env_log_dir"]) + return cast("Path", self.conf["env_log_dir"]) @property def name(self) -> str: - return cast(str, self.conf["env_name"]) + return cast("str", self.conf["env_name"]) def _default_set_env(self) -> dict[str, str]: # noqa: PLR6301 return {} @@ -249,7 +250,7 @@ def setup(self) -> None: """Setup the tox environment.""" if self._run_state["setup"] is False: # pragma: no branch self._platform_check() - recreate = cast(bool, self.conf["recreate"]) + recreate = cast("bool", self.conf["recreate"]) if recreate: self._clean(transitive=True) try: @@ -504,7 +505,7 @@ def close_and_read_out_err(self) -> tuple[bytes, bytes] | None: if self._suspended_out_err is None: # pragma: no branch return None # pragma: no cover (out, err), self._suspended_out_err = self._suspended_out_err, None - out_b, err_b = cast(BytesIO, out.buffer).getvalue(), cast(BytesIO, err.buffer).getvalue() + out_b, err_b = cast("BytesIO", out.buffer).getvalue(), cast("BytesIO", err.buffer).getvalue() out.close() err.close() return out_b, err_b diff --git a/src/tox/tox_env/package.py b/src/tox/tox_env/package.py index 008910e8e..a870d3649 100644 --- a/src/tox/tox_env/package.py +++ b/src/tox/tox_env/package.py @@ -46,7 +46,7 @@ def _func(*args: Any, **kwargs: Any) -> Any: return meth(*args, **kwargs) finally: if file_locks: - cast(FileLock, file_lock).release() + cast("FileLock", file_lock).release() return _func @@ -73,13 +73,13 @@ def register_config(self) -> None: self.core.add_config( keys=["package_root", "setupdir"], of_type=Path, - default=cast(Path, self.core["tox_root"]), + default=cast("Path", self.core["tox_root"]), desc="indicates where the packaging root file exists (historically setup.py file or pyproject.toml now)", ) self.conf.add_config( keys=["package_root", "setupdir"], of_type=Path, - default=cast(Path, self.core["package_root"]), + default=cast("Path", self.core["package_root"]), desc="indicates where the packaging root file exists (historically setup.py file or pyproject.toml now)", ) diff --git a/src/tox/tox_env/python/api.py b/src/tox/tox_env/python/api.py index 6f87af180..37bfba55f 100644 --- a/src/tox/tox_env/python/api.py +++ b/src/tox/tox_env/python/api.py @@ -290,7 +290,7 @@ def base_python(self) -> PythonInfo: raise Skip(msg) raise NoInterpreter(base_pythons) - return cast(PythonInfo, self._base_python) + return cast("PythonInfo", self._base_python) def _get_env_journal_python(self) -> dict[str, Any]: return { diff --git a/src/tox/tox_env/python/package.py b/src/tox/tox_env/python/package.py index f47d6aaac..0b65d06ea 100644 --- a/src/tox/tox_env/python/package.py +++ b/src/tox/tox_env/python/package.py @@ -90,7 +90,7 @@ def default_wheel_tag(conf: Config, env_name: str | None) -> str: # noqa: ARG00 # c-extension codes are trickier, but as of today both poetry/setuptools uses pypa/wheels logic # https://github.com/pypa/wheel/blob/master/src/wheel/bdist_wheel.py#L234-L280 try: - run_py = cast(Python, run_env).base_python + run_py = cast("Python", run_env).base_python except NoInterpreter: run_py = None @@ -116,7 +116,7 @@ def default_wheel_tag(conf: Config, env_name: str | None) -> str: # noqa: ARG00 ) pkg_env = run_env.conf["wheel_build_env"] result = yield pkg_env, run_env.conf["package_tox_env_type"] - self._wheel_build_envs[pkg_env] = cast(PythonPackageToxEnv, result) + self._wheel_build_envs[pkg_env] = cast("PythonPackageToxEnv", result) def child_pkg_envs(self, run_conf: EnvConfigSet) -> Iterator[PackageToxEnv]: if run_conf["package"] == "wheel": diff --git a/src/tox/tox_env/python/pip/req/file.py b/src/tox/tox_env/python/pip/req/file.py index 5581a798e..03357dede 100644 --- a/src/tox/tox_env/python/pip/req/file.py +++ b/src/tox/tox_env/python/pip/req/file.py @@ -168,7 +168,7 @@ def options(self) -> Namespace: @property def requirements(self) -> list[ParsedRequirement]: self._ensure_requirements_parsed() - return cast(List[ParsedRequirement], self._requirements) + return cast("List[ParsedRequirement]", self._requirements) @property def _parser(self) -> ArgumentParser: diff --git a/src/tox/tox_env/python/virtual_env/api.py b/src/tox/tox_env/python/virtual_env/api.py index 733860262..861cd7847 100644 --- a/src/tox/tox_env/python/virtual_env/api.py +++ b/src/tox/tox_env/python/virtual_env/api.py @@ -154,13 +154,13 @@ def prepend_env_var_path(self) -> list[Path]: return list(dict.fromkeys((self.creator.bin_dir, self.creator.script_dir))) def env_site_package_dir(self) -> Path: - return cast(Path, self.creator.purelib) + return cast("Path", self.creator.purelib) def env_python(self) -> Path: - return cast(Path, self.creator.exe) + return cast("Path", self.creator.exe) def env_bin_dir(self) -> Path: - return cast(Path, self.creator.script_dir) + return cast("Path", self.creator.script_dir) @property def runs_on_platform(self) -> str: diff --git a/src/tox/tox_env/python/virtual_env/package/cmd_builder.py b/src/tox/tox_env/python/virtual_env/package/cmd_builder.py index 49113f1af..95f0a16b1 100644 --- a/src/tox/tox_env/python/virtual_env/package/cmd_builder.py +++ b/src/tox/tox_env/python/virtual_env/package/cmd_builder.py @@ -72,7 +72,7 @@ def register_config(self) -> None: ) def requires(self) -> PythonDeps: - return cast(PythonDeps, self.conf["deps"]) + return cast("PythonDeps", self.conf["deps"]) def perform_packaging(self, for_env: EnvConfigSet) -> list[Package]: self.setup() @@ -121,7 +121,7 @@ def register_run_env(self, run_env: RunToxEnv) -> Generator[tuple[str, str], Pac yield from super().register_run_env(run_env) # in case the outcome is a sdist we'll use this to find out its metadata result = yield f"{self.conf.name}_sdist_meta", Pep517VirtualEnvPackager.id() - self._sdist_meta_tox_env = cast(Pep517VirtualEnvPackager, result) + self._sdist_meta_tox_env = cast("Pep517VirtualEnvPackager", result) def child_pkg_envs(self, run_conf: EnvConfigSet) -> Iterator[PackageToxEnv]: # noqa: ARG002 if self._sdist_meta_tox_env is not None: # pragma: no branch diff --git a/src/tox/tox_env/python/virtual_env/package/pyproject.py b/src/tox/tox_env/python/virtual_env/package/pyproject.py index b70fc677c..4b4be011f 100644 --- a/src/tox/tox_env/python/virtual_env/package/pyproject.py +++ b/src/tox/tox_env/python/virtual_env/package/pyproject.py @@ -171,7 +171,7 @@ def _add_config_settings(self, build_type: str) -> None: @property def pkg_dir(self) -> Path: - return cast(Path, self.conf["pkg_dir"]) + return cast("Path", self.conf["pkg_dir"]) @property def meta_folder(self) -> Path: @@ -238,7 +238,7 @@ def perform_packaging(self, for_env: EnvConfigSet) -> list[Package]: "package config for %s is editable, however the build backend %s does not support PEP-660, falling " "back to editable-legacy - change your configuration to it", names, - cast(Pep517VirtualEnvFrontend, self._frontend_).backend, + cast("Pep517VirtualEnvFrontend", self._frontend_).backend, ) for env in targets: env._defined["package"].value = "editable-legacy" # type: ignore[attr-defined] # noqa: SLF001 @@ -285,7 +285,7 @@ def perform_packaging(self, for_env: EnvConfigSet) -> list[Package]: @property def _package_temp_path(self) -> Path: - return cast(Path, self.core["temp_dir"]) / "package" + return cast("Path", self.core["temp_dir"]) / "package" def _load_deps(self, for_env: EnvConfigSet) -> list[Requirement]: # first check if this is statically available via PEP-621 @@ -344,7 +344,7 @@ def get_package_dependencies(self, for_env: EnvConfigSet) -> list[Requirement]: with self._pkg_lock: if self._package_dependencies is None: # pragma: no branch self._ensure_meta_present(for_env) - requires: list[str] = cast(PathDistribution, self._distribution_meta).requires or [] + requires: list[str] = cast("PathDistribution", self._distribution_meta).requires or [] self._package_dependencies = [Requirement(i) for i in requires] # pragma: no branch return self._package_dependencies @@ -352,7 +352,7 @@ def get_package_name(self, for_env: EnvConfigSet) -> str: with self._pkg_lock: if self._package_name is None: # pragma: no branch self._ensure_meta_present(for_env) - self._package_name = cast(PathDistribution, self._distribution_meta).metadata["Name"] + self._package_name = cast("PathDistribution", self._distribution_meta).metadata["Name"] return self._package_name def _ensure_meta_present(self, for_env: EnvConfigSet) -> None: diff --git a/src/tox/tox_env/python/virtual_env/package/util.py b/src/tox/tox_env/python/virtual_env/package/util.py index add52e58d..4d262a7f5 100644 --- a/src/tox/tox_env/python/virtual_env/package/util.py +++ b/src/tox/tox_env/python/virtual_env/package/util.py @@ -3,9 +3,9 @@ from copy import deepcopy from typing import TYPE_CHECKING, Optional, Set, cast -from packaging.markers import Marker, Op, Variable # type: ignore[attr-defined] - if TYPE_CHECKING: + from packaging._parser import Op, Variable + from packaging.markers import Marker from packaging.requirements import Requirement @@ -67,10 +67,10 @@ def _extract_extra_markers(req: Requirement) -> tuple[Requirement, set[str | Non new_markers.append(marker) marker = markers.pop(0) if markers else None if new_markers: - cast(Marker, req.marker)._markers = new_markers # noqa: SLF001 + cast("Marker", req.marker)._markers = new_markers # noqa: SLF001 else: req.marker = None - return req, cast(Set[Optional[str]], extra_markers) or {None} + return req, cast("Set[Optional[str]]", extra_markers) or {None} def _get_extra(_marker: str | tuple[Variable, Op, Variable]) -> str | None: diff --git a/src/tox/tox_env/util.py b/src/tox/tox_env/util.py index 550a8cd13..cd1acc8d9 100644 --- a/src/tox/tox_env/util.py +++ b/src/tox/tox_env/util.py @@ -16,7 +16,7 @@ def _post_process_change_dir(value: Path) -> Path: config.add_config( keys=["change_dir", "changedir"], of_type=Path, - default=lambda conf, name: cast(Path, conf.core["tox_root"]), # noqa: ARG005 + default=lambda conf, name: cast("Path", conf.core["tox_root"]), # noqa: ARG005 desc="change to this working directory when executing the test command", post_process=_post_process_change_dir, ) diff --git a/tests/tox_env/python/virtual_env/test_setuptools.py b/tests/tox_env/python/virtual_env/test_setuptools.py index 3c11938a3..63724a406 100644 --- a/tests/tox_env/python/virtual_env/test_setuptools.py +++ b/tests/tox_env/python/virtual_env/test_setuptools.py @@ -8,12 +8,12 @@ from tox.tox_env.python.package import WheelPackage from tox.tox_env.python.virtual_env.package.pyproject import Pep517VirtualEnvPackager -from tox.tox_env.runner import RunToxEnv if TYPE_CHECKING: from pathlib import Path from tox.pytest import ToxProjectCreator + from tox.tox_env.runner import RunToxEnv @pytest.mark.integration @@ -35,7 +35,7 @@ def test_setuptools_package( outcome.assert_success() assert f"\ngreetings from demo_pkg_setuptools{os.linesep}" in outcome.out - tox_env = cast(RunToxEnv, outcome.state.envs["py"]) + tox_env = cast("RunToxEnv", outcome.state.envs["py"]) (package_env,) = list(tox_env.package_envs) assert isinstance(package_env, Pep517VirtualEnvPackager)