diff options
author | Bernát Gábor <bgabor8@bloomberg.net> | 2020-10-26 09:16:37 +0000 |
---|---|---|
committer | Bernát Gábor <bgabor8@bloomberg.net> | 2020-10-26 09:28:50 +0000 |
commit | d1b667210817d0706c93da4d3cd01f51a0334443 (patch) | |
tree | cbcc6b7da9b56ad6d86a7789b4bb86b13d913bba /src/tox | |
parent | 9ef0d811a3ce9e85ba86cec142f2c346c1d420c7 (diff) | |
download | tox-git-d1b667210817d0706c93da4d3cd01f51a0334443.tar.gz |
Add typing to test suite
Signed-off-by: Bernát Gábor <bgabor8@bloomberg.net>
Diffstat (limited to 'src/tox')
-rw-r--r-- | src/tox/config/cli/parser.py | 22 | ||||
-rw-r--r-- | src/tox/config/sets.py | 12 | ||||
-rw-r--r-- | src/tox/config/source/ini/__init__.py | 2 | ||||
-rw-r--r-- | src/tox/execute/local_sub_process/read_via_thread_unix.py | 5 | ||||
-rw-r--r-- | src/tox/pytest.py | 33 | ||||
-rw-r--r-- | src/tox/session/cmd/show_config.py | 3 | ||||
-rw-r--r-- | src/tox/tox_env/python/api.py | 12 | ||||
-rw-r--r-- | src/tox/tox_env/python/virtual_env/package/api.py | 5 |
8 files changed, 48 insertions, 46 deletions
diff --git a/src/tox/config/cli/parser.py b/src/tox/config/cli/parser.py index 93bdb5d8..36fdb0a4 100644 --- a/src/tox/config/cli/parser.py +++ b/src/tox/config/cli/parser.py @@ -6,27 +6,9 @@ import argparse import logging import os import sys -from argparse import ( - SUPPRESS, - Action, - ArgumentDefaultsHelpFormatter, - ArgumentParser, - Namespace, - _SubParsersAction, -) +from argparse import SUPPRESS, Action, ArgumentDefaultsHelpFormatter, ArgumentParser, Namespace, _SubParsersAction from itertools import chain -from typing import ( - Any, - Callable, - Dict, - List, - Optional, - Sequence, - Tuple, - Type, - TypeVar, - cast, -) +from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Type, TypeVar, cast from tox.config.source.ini.convert import StrConvert from tox.plugin import NAME diff --git a/src/tox/config/sets.py b/src/tox/config/sets.py index e6e900ad..448bbad0 100644 --- a/src/tox/config/sets.py +++ b/src/tox/config/sets.py @@ -137,22 +137,26 @@ class ConfigSet: desc: str, post_process: Optional[Callable[[V, "Config"], V]] = None, overwrite: bool = False, - ) -> None: + ) -> ConfigDynamicDefinition[V]: """ Add configuration value. """ keys_ = self._make_keys(keys) for key in keys_: if key in self._defined and overwrite is False: - # already added - return + defined = self._defined[key] + if isinstance(defined, ConfigDynamicDefinition): + return defined + raise TypeError(f"{keys} already defined with differing type {type(defined).__name__}") definition = ConfigDynamicDefinition(keys_, of_type, default, desc, post_process) self._add_conf(keys_, definition) + return definition - def add_constant(self, keys: Sequence[str], desc: str, value: V) -> None: + def add_constant(self, keys: Sequence[str], desc: str, value: V) -> ConfigConstantDefinition[V]: keys_ = self._make_keys(keys) definition = ConfigConstantDefinition(keys_, desc, value) self._add_conf(keys, definition) + return definition def make_package_conf(self) -> None: self._raw.make_package_conf() diff --git a/src/tox/config/source/ini/__init__.py b/src/tox/config/source/ini/__init__.py index b8be6779..f96bd2e1 100644 --- a/src/tox/config/source/ini/__init__.py +++ b/src/tox/config/source/ini/__init__.py @@ -222,4 +222,6 @@ class ToxIni(Source): __all__ = ( "ToxIni", "IniLoader", + "filter_for_env", + "find_envs", ) diff --git a/src/tox/execute/local_sub_process/read_via_thread_unix.py b/src/tox/execute/local_sub_process/read_via_thread_unix.py index a5b1b69b..b16b0c66 100644 --- a/src/tox/execute/local_sub_process/read_via_thread_unix.py +++ b/src/tox/execute/local_sub_process/read_via_thread_unix.py @@ -27,7 +27,10 @@ class ReadViaThreadUnix(ReadViaThread): def _drain_stream(self) -> bytes: result = bytearray() # on closed file read returns empty while True: - last_result = os.read(self.file_no, 1) + try: + last_result = os.read(self.file_no, 1) + except OSError: # ignore failing to read the pipe - already closed + break if last_result: result.append(last_result[0]) else: diff --git a/src/tox/pytest.py b/src/tox/pytest.py index 1fd7c22d..1da38fce 100644 --- a/src/tox/pytest.py +++ b/src/tox/pytest.py @@ -7,10 +7,11 @@ import sys import textwrap from contextlib import contextmanager from pathlib import Path -from typing import Any, Callable, Dict, Iterator, List, Optional, Sequence +from typing import TYPE_CHECKING, Any, Callable, Dict, Iterator, List, Optional, Sequence import pytest -from _pytest.capture import CaptureFixture +from _pytest.capture import CaptureFixture as _CaptureFixture +from _pytest.logging import LogCaptureFixture from _pytest.monkeypatch import MonkeyPatch import tox.run @@ -23,6 +24,11 @@ from tox.run import setup_state as previous_setup_state from tox.session.cmd.run.parallel import ENV_VAR_KEY from tox.session.state import State +if TYPE_CHECKING: + CaptureFixture = _CaptureFixture[str] +else: + CaptureFixture = _CaptureFixture + @pytest.fixture(autouse=True) def ensure_logging_framework_not_altered() -> Iterator[None]: @@ -77,7 +83,7 @@ class ToxProject: self, files: Dict[str, Any], path: Path, - capsys: CaptureFixture[str], + capsys: CaptureFixture, monkeypatch: MonkeyPatch, ) -> None: self.path = path @@ -156,7 +162,13 @@ class ToxRunOutcome: self.code: int = code self.out: str = out self.err: str = err - self.state: Optional[State] = state + self._state: Optional[State] = state + + @property + def state(self) -> State: + if self._state is None: + raise RuntimeError("no state") + return self._state @property def success(self) -> bool: @@ -188,7 +200,7 @@ ToxProjectCreator = Callable[[Dict[str, Any]], ToxProject] @pytest.fixture(name="tox_project") -def init_fixture(tmp_path: Path, capsys: CaptureFixture[str], monkeypatch: MonkeyPatch) -> ToxProjectCreator: +def init_fixture(tmp_path: Path, capsys: CaptureFixture, monkeypatch: MonkeyPatch) -> ToxProjectCreator: def _init(files: Dict[str, Any]) -> ToxProject: """create tox projects""" return ToxProject(files, tmp_path, capsys, monkeypatch) @@ -201,3 +213,14 @@ def empty_project(tox_project: ToxProjectCreator, monkeypatch: MonkeyPatch) -> T project = tox_project({"tox.ini": ""}) monkeypatch.chdir(project.path) return project + + +__all__ = ( + "CaptureFixture", + "LogCaptureFixture", + "MonkeyPatch", + "ToxRunOutcome", + "ToxProject", + "ToxProjectCreator", + "check_os_environ", +) diff --git a/src/tox/session/cmd/show_config.py b/src/tox/session/cmd/show_config.py index 3fef8f83..e335fab3 100644 --- a/src/tox/session/cmd/show_config.py +++ b/src/tox/session/cmd/show_config.py @@ -19,7 +19,7 @@ def tox_add_option(parser: ToxParser) -> None: env_list_flag(our) -def display_config(state: State) -> None: +def display_config(state: State) -> int: first = True if not state.options.env: print("[tox]") @@ -33,6 +33,7 @@ def display_config(state: State) -> None: print(f"[testenv:{name}]") print(f"type = {type(tox_env).__name__}") print_conf(tox_env.conf) + return 0 def print_conf(conf: ConfigSet) -> None: diff --git a/src/tox/tox_env/python/api.py b/src/tox/tox_env/python/api.py index 88cd79ad..567f404d 100644 --- a/src/tox/tox_env/python/api.py +++ b/src/tox/tox_env/python/api.py @@ -4,17 +4,7 @@ Declare the abstract base class for tox environments that handle the Python lang import sys from abc import ABC, abstractmethod from pathlib import Path -from typing import ( - Any, - Dict, - List, - NamedTuple, - NoReturn, - Optional, - Sequence, - Union, - cast, -) +from typing import Any, Dict, List, NamedTuple, NoReturn, Optional, Sequence, Union, cast from packaging.requirements import Requirement from virtualenv.discovery.py_spec import PythonSpec diff --git a/src/tox/tox_env/python/virtual_env/package/api.py b/src/tox/tox_env/python/virtual_env/package/api.py index 0e7151ad..16277c31 100644 --- a/src/tox/tox_env/python/virtual_env/package/api.py +++ b/src/tox/tox_env/python/virtual_env/package/api.py @@ -17,10 +17,7 @@ from tox.tox_env.python.package import PythonPackage from ..api import VirtualEnv try: - from importlib.metadata import ( # type: ignore[attr-defined] - Distribution, - PathDistribution, - ) + from importlib.metadata import Distribution, PathDistribution # type: ignore[attr-defined] except ImportError: from importlib_metadata import Distribution, PathDistribution # noqa |