summaryrefslogtreecommitdiff
path: root/src/tox
diff options
context:
space:
mode:
authorBernát Gábor <bgabor8@bloomberg.net>2020-10-26 09:16:37 +0000
committerBernát Gábor <bgabor8@bloomberg.net>2020-10-26 09:28:50 +0000
commitd1b667210817d0706c93da4d3cd01f51a0334443 (patch)
treecbcc6b7da9b56ad6d86a7789b4bb86b13d913bba /src/tox
parent9ef0d811a3ce9e85ba86cec142f2c346c1d420c7 (diff)
downloadtox-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.py22
-rw-r--r--src/tox/config/sets.py12
-rw-r--r--src/tox/config/source/ini/__init__.py2
-rw-r--r--src/tox/execute/local_sub_process/read_via_thread_unix.py5
-rw-r--r--src/tox/pytest.py33
-rw-r--r--src/tox/session/cmd/show_config.py3
-rw-r--r--src/tox/tox_env/python/api.py12
-rw-r--r--src/tox/tox_env/python/virtual_env/package/api.py5
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