Skip to content

Commit 190e01c

Browse files
committed
Type annotate some hookspecs & impls
Annotate some "easy" arguments of hooks that repeat in a lot of internal plugins. Not all of the arguments are annotated fully for now.
1 parent f77d606 commit 190e01c

26 files changed

+223
-124
lines changed

src/_pytest/assertion/__init__.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@
99
from _pytest.assertion import util
1010
from _pytest.compat import TYPE_CHECKING
1111
from _pytest.config import hookimpl
12+
from _pytest.config.argparsing import Parser
1213

1314
if TYPE_CHECKING:
1415
from _pytest.main import Session
1516

1617

17-
def pytest_addoption(parser):
18+
def pytest_addoption(parser: Parser) -> None:
1819
group = parser.getgroup("debugconfig")
1920
group.addoption(
2021
"--assert",
@@ -162,7 +163,7 @@ def call_assertion_pass_hook(lineno, orig, expl):
162163
util._reprcompare, util._assertion_pass = saved_assert_hooks
163164

164165

165-
def pytest_sessionfinish(session):
166+
def pytest_sessionfinish(session: "Session") -> None:
166167
assertstate = getattr(session.config, "_assertstate", None)
167168
if assertstate:
168169
if assertstate.hook is not None:

src/_pytest/cacheprovider.py

+11-5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from typing import List
1313
from typing import Optional
1414
from typing import Set
15+
from typing import Union
1516

1617
import attr
1718
import py
@@ -24,6 +25,8 @@
2425
from _pytest import nodes
2526
from _pytest._io import TerminalWriter
2627
from _pytest.config import Config
28+
from _pytest.config import ExitCode
29+
from _pytest.config.argparsing import Parser
2730
from _pytest.main import Session
2831
from _pytest.python import Module
2932

@@ -316,11 +319,12 @@ def pytest_collection_modifyitems(self, session, config, items):
316319
else:
317320
self._report_status += "not deselecting items."
318321

319-
def pytest_sessionfinish(self, session):
322+
def pytest_sessionfinish(self, session: Session) -> None:
320323
config = self.config
321324
if config.getoption("cacheshow") or hasattr(config, "slaveinput"):
322325
return
323326

327+
assert config.cache is not None
324328
saved_lastfailed = config.cache.get("cache/lastfailed", {})
325329
if saved_lastfailed != self.lastfailed:
326330
config.cache.set("cache/lastfailed", self.lastfailed)
@@ -358,15 +362,15 @@ def pytest_collection_modifyitems(
358362
def _get_increasing_order(self, items):
359363
return sorted(items, key=lambda item: item.fspath.mtime(), reverse=True)
360364

361-
def pytest_sessionfinish(self, session):
365+
def pytest_sessionfinish(self, session: Session) -> None:
362366
config = self.config
363367
if config.getoption("cacheshow") or hasattr(config, "slaveinput"):
364368
return
365369

366370
config.cache.set("cache/nodeids", self.cached_nodeids)
367371

368372

369-
def pytest_addoption(parser):
373+
def pytest_addoption(parser: Parser) -> None:
370374
group = parser.getgroup("general")
371375
group.addoption(
372376
"--lf",
@@ -424,16 +428,18 @@ def pytest_addoption(parser):
424428
)
425429

426430

427-
def pytest_cmdline_main(config):
431+
def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]:
428432
if config.option.cacheshow:
429433
from _pytest.main import wrap_session
430434

431435
return wrap_session(config, cacheshow)
436+
return None
432437

433438

434439
@pytest.hookimpl(tryfirst=True)
435440
def pytest_configure(config: Config) -> None:
436-
config.cache = Cache.for_config(config)
441+
# Type ignored: pending mechanism to store typed objects scoped to config.
442+
config.cache = Cache.for_config(config) # type: ignore # noqa: F821
437443
config.pluginmanager.register(LFPlugin(config), "lfplugin")
438444
config.pluginmanager.register(NFPlugin(config), "nfplugin")
439445

src/_pytest/capture.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from _pytest.compat import CaptureIO
2020
from _pytest.compat import TYPE_CHECKING
2121
from _pytest.config import Config
22+
from _pytest.config.argparsing import Parser
2223
from _pytest.fixtures import FixtureRequest
2324

2425
if TYPE_CHECKING:
@@ -29,7 +30,7 @@
2930
patchsysdict = {0: "stdin", 1: "stdout", 2: "stderr"}
3031

3132

32-
def pytest_addoption(parser):
33+
def pytest_addoption(parser: Parser) -> None:
3334
group = parser.getgroup("general")
3435
group._addoption(
3536
"--capture",

src/_pytest/config/__init__.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ def hasplugin(self, name):
393393
"""Return True if the plugin with the given name is registered."""
394394
return bool(self.get_plugin(name))
395395

396-
def pytest_configure(self, config):
396+
def pytest_configure(self, config: "Config") -> None:
397397
# XXX now that the pluginmanager exposes hookimpl(tryfirst...)
398398
# we should remove tryfirst/trylast as markers
399399
config.addinivalue_line(
@@ -831,7 +831,9 @@ def _ensure_unconfigure(self):
831831
def get_terminal_writer(self):
832832
return self.pluginmanager.get_plugin("terminalreporter")._tw
833833

834-
def pytest_cmdline_parse(self, pluginmanager, args):
834+
def pytest_cmdline_parse(
835+
self, pluginmanager: PytestPluginManager, args: List[str]
836+
) -> object:
835837
try:
836838
self.parse(args)
837839
except UsageError:

src/_pytest/debugging.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
import sys
55

66
from _pytest import outcomes
7+
from _pytest.config import Config
78
from _pytest.config import hookimpl
9+
from _pytest.config import PytestPluginManager
10+
from _pytest.config.argparsing import Parser
811
from _pytest.config.exceptions import UsageError
912

1013

@@ -19,7 +22,7 @@ def _validate_usepdb_cls(value):
1922
return (modname, classname)
2023

2124

22-
def pytest_addoption(parser):
25+
def pytest_addoption(parser: Parser) -> None:
2326
group = parser.getgroup("general")
2427
group._addoption(
2528
"--pdb",
@@ -43,7 +46,7 @@ def pytest_addoption(parser):
4346
)
4447

4548

46-
def pytest_configure(config):
49+
def pytest_configure(config: Config) -> None:
4750
import pdb
4851

4952
if config.getvalue("trace"):
@@ -73,8 +76,8 @@ def fin():
7376
class pytestPDB:
7477
""" Pseudo PDB that defers to the real pdb. """
7578

76-
_pluginmanager = None
77-
_config = None
79+
_pluginmanager = None # type: PytestPluginManager
80+
_config = None # type: Config
7881
_saved = [] # type: list
7982
_recursive_debug = 0
8083
_wrapped_pdb_cls = None

src/_pytest/doctest.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from _pytest._io import TerminalWriter
2424
from _pytest.compat import safe_getattr
2525
from _pytest.compat import TYPE_CHECKING
26+
from _pytest.config.argparsing import Parser
2627
from _pytest.fixtures import FixtureRequest
2728
from _pytest.outcomes import OutcomeException
2829
from _pytest.python_api import approx
@@ -52,7 +53,7 @@
5253
CHECKER_CLASS = None # type: Optional[Type[doctest.OutputChecker]]
5354

5455

55-
def pytest_addoption(parser):
56+
def pytest_addoption(parser: Parser) -> None:
5657
parser.addini(
5758
"doctest_optionflags",
5859
"option flags for doctests",
@@ -102,7 +103,7 @@ def pytest_addoption(parser):
102103
)
103104

104105

105-
def pytest_unconfigure():
106+
def pytest_unconfigure() -> None:
106107
global RUNNER_CLASS
107108

108109
RUNNER_CLASS = None

src/_pytest/faulthandler.py

+12-8
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
import sys
44

55
import pytest
6+
from _pytest.config import Config
7+
from _pytest.config.argparsing import Parser
68

79

8-
def pytest_addoption(parser):
10+
def pytest_addoption(parser: Parser) -> None:
911
help = (
1012
"Dump the traceback of all threads if a test takes "
1113
"more than TIMEOUT seconds to finish.\n"
@@ -14,7 +16,7 @@ def pytest_addoption(parser):
1416
parser.addini("faulthandler_timeout", help, default=0.0)
1517

1618

17-
def pytest_configure(config):
19+
def pytest_configure(config: Config) -> None:
1820
import faulthandler
1921

2022
if not faulthandler.is_enabled():
@@ -42,23 +44,25 @@ class FaultHandlerHooks:
4244
"""Implements hooks that will actually install fault handler before tests execute,
4345
as well as correctly handle pdb and internal errors."""
4446

45-
def pytest_configure(self, config):
47+
def pytest_configure(self, config: Config) -> None:
4648
import faulthandler
4749

4850
stderr_fd_copy = os.dup(self._get_stderr_fileno())
49-
config.fault_handler_stderr = os.fdopen(stderr_fd_copy, "w")
50-
faulthandler.enable(file=config.fault_handler_stderr)
51+
fault_handler_stderr = os.fdopen(stderr_fd_copy, "w")
52+
# Type ignored: pending mechanism to store typed objects scoped to config.
53+
config.fault_handler_stderr = fault_handler_stderr # type: ignore # noqa: F821
54+
faulthandler.enable(file=fault_handler_stderr)
5155

52-
def pytest_unconfigure(self, config):
56+
def pytest_unconfigure(self, config: Config) -> None:
5357
import faulthandler
5458

5559
faulthandler.disable()
5660
# close our dup file installed during pytest_configure
5761
# re-enable the faulthandler, attaching it to the default sys.stderr
5862
# so we can see crashes after pytest has finished, usually during
5963
# garbage collection during interpreter shutdown
60-
config.fault_handler_stderr.close()
61-
del config.fault_handler_stderr
64+
config.fault_handler_stderr.close() # type: ignore[attr-defined] # noqa: F821
65+
del config.fault_handler_stderr # type: ignore[attr-defined] # noqa: F821
6266
faulthandler.enable(file=self._get_stderr_fileno())
6367

6468
@staticmethod

src/_pytest/fixtures.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from _pytest.compat import NOTSET
2929
from _pytest.compat import safe_getattr
3030
from _pytest.compat import TYPE_CHECKING
31+
from _pytest.config.argparsing import Parser
3132
from _pytest.deprecated import FIXTURE_POSITIONAL_ARGUMENTS
3233
from _pytest.deprecated import FUNCARGNAMES
3334
from _pytest.mark import ParameterSet
@@ -47,7 +48,7 @@ class PseudoFixtureDef:
4748
scope = attr.ib()
4849

4950

50-
def pytest_sessionstart(session: "Session"):
51+
def pytest_sessionstart(session: "Session") -> None:
5152
import _pytest.python
5253
import _pytest.nodes
5354

@@ -1200,7 +1201,7 @@ def test_foo(pytestconfig):
12001201
return request.config
12011202

12021203

1203-
def pytest_addoption(parser):
1204+
def pytest_addoption(parser: Parser) -> None:
12041205
parser.addini(
12051206
"usefixtures",
12061207
type="args",

src/_pytest/helpconfig.py

+10-4
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,16 @@
22
import os
33
import sys
44
from argparse import Action
5+
from typing import Optional
6+
from typing import Union
57

68
import py
79

810
import pytest
11+
from _pytest.config import Config
12+
from _pytest.config import ExitCode
913
from _pytest.config import PrintHelp
14+
from _pytest.config.argparsing import Parser
1015

1116

1217
class HelpAction(Action):
@@ -36,7 +41,7 @@ def __call__(self, parser, namespace, values, option_string=None):
3641
raise PrintHelp
3742

3843

39-
def pytest_addoption(parser):
44+
def pytest_addoption(parser: Parser) -> None:
4045
group = parser.getgroup("debugconfig")
4146
group.addoption(
4247
"--version",
@@ -106,7 +111,7 @@ def pytest_cmdline_parse():
106111
undo_tracing = config.pluginmanager.enable_tracing()
107112
sys.stderr.write("writing pytestdebug information to %s\n" % path)
108113

109-
def unset_tracing():
114+
def unset_tracing() -> None:
110115
debugfile.close()
111116
sys.stderr.write("wrote pytestdebug information to %s\n" % debugfile.name)
112117
config.trace.root.setwriter(None)
@@ -127,7 +132,7 @@ def showversion(config):
127132
sys.stderr.write(line + "\n")
128133

129134

130-
def pytest_cmdline_main(config):
135+
def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]:
131136
if config.option.version:
132137
showversion(config)
133138
return 0
@@ -136,9 +141,10 @@ def pytest_cmdline_main(config):
136141
showhelp(config)
137142
config._ensure_unconfigure()
138143
return 0
144+
return None
139145

140146

141-
def showhelp(config):
147+
def showhelp(config: Config) -> None:
142148
import textwrap
143149

144150
reporter = config.pluginmanager.get_plugin("terminalreporter")

0 commit comments

Comments
 (0)