Skip to content

Commit 3b91b84

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 56a5dbe commit 3b91b84

27 files changed

+227
-126
lines changed

src/_pytest/assertion/__init__.py

Lines changed: 3 additions & 2 deletions
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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import os
99
from collections import OrderedDict
1010
from typing import List
11+
from typing import Optional
12+
from typing import Union
1113

1214
import attr
1315
import py
@@ -19,6 +21,8 @@
1921
from _pytest import nodes
2022
from _pytest._io import TerminalWriter
2123
from _pytest.config import Config
24+
from _pytest.config import ExitCode
25+
from _pytest.config.argparsing import Parser
2226
from _pytest.main import Session
2327

2428
README_CONTENT = """\
@@ -264,7 +268,7 @@ def pytest_collection_modifyitems(self, session, config, items):
264268
else:
265269
self._report_status += "not deselecting items."
266270

267-
def pytest_sessionfinish(self, session):
271+
def pytest_sessionfinish(self, session: Session) -> None:
268272
config = self.config
269273
if config.getoption("cacheshow") or hasattr(config, "slaveinput"):
270274
return
@@ -306,15 +310,15 @@ def pytest_collection_modifyitems(
306310
def _get_increasing_order(self, items):
307311
return sorted(items, key=lambda item: item.fspath.mtime(), reverse=True)
308312

309-
def pytest_sessionfinish(self, session):
313+
def pytest_sessionfinish(self, session: Session) -> None:
310314
config = self.config
311315
if config.getoption("cacheshow") or hasattr(config, "slaveinput"):
312316
return
313317

314318
config.cache.set("cache/nodeids", self.cached_nodeids)
315319

316320

317-
def pytest_addoption(parser):
321+
def pytest_addoption(parser: Parser) -> None:
318322
group = parser.getgroup("general")
319323
group.addoption(
320324
"--lf",
@@ -372,16 +376,18 @@ def pytest_addoption(parser):
372376
)
373377

374378

375-
def pytest_cmdline_main(config):
379+
def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]:
376380
if config.option.cacheshow:
377381
from _pytest.main import wrap_session
378382

379383
return wrap_session(config, cacheshow)
384+
return None
380385

381386

382387
@pytest.hookimpl(tryfirst=True)
383-
def pytest_configure(config):
384-
config.cache = Cache.for_config(config)
388+
def pytest_configure(config: Config) -> None:
389+
# Type ignored: pending mechanism to store typed objects scoped to config.
390+
config.cache = Cache.for_config(config) # type: ignore # noqa: F821
385391
config.pluginmanager.register(LFPlugin(config), "lfplugin")
386392
config.pluginmanager.register(NFPlugin(config), "nfplugin")
387393

src/_pytest/capture.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@
1818
from _pytest.compat import CaptureAndPassthroughIO
1919
from _pytest.compat import CaptureIO
2020
from _pytest.config import Config
21+
from _pytest.config.argparsing import Parser
2122
from _pytest.fixtures import FixtureRequest
2223

2324
patchsysdict = {0: "stdin", 1: "stdout", 2: "stderr"}
2425

2526

26-
def pytest_addoption(parser):
27+
def pytest_addoption(parser: Parser) -> None:
2728
group = parser.getgroup("general")
2829
group._addoption(
2930
"--capture",

src/_pytest/config/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ def hasplugin(self, name):
391391
"""Return True if the plugin with the given name is registered."""
392392
return bool(self.get_plugin(name))
393393

394-
def pytest_configure(self, config):
394+
def pytest_configure(self, config: "Config") -> None:
395395
# XXX now that the pluginmanager exposes hookimpl(tryfirst...)
396396
# we should remove tryfirst/trylast as markers
397397
config.addinivalue_line(
@@ -824,7 +824,9 @@ def _ensure_unconfigure(self):
824824
def get_terminal_writer(self):
825825
return self.pluginmanager.get_plugin("terminalreporter")._tw
826826

827-
def pytest_cmdline_parse(self, pluginmanager, args):
827+
def pytest_cmdline_parse(
828+
self, pluginmanager: PytestPluginManager, args: List[str]
829+
) -> object:
828830
try:
829831
self.parse(args)
830832
except UsageError:

src/_pytest/debugging.py

Lines changed: 7 additions & 4 deletions
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

Lines changed: 3 additions & 2 deletions
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 Skipped
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

Lines changed: 12 additions & 8 deletions
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

Lines changed: 3 additions & 2 deletions
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

Lines changed: 10 additions & 4 deletions
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",
@@ -105,7 +110,7 @@ def pytest_cmdline_parse():
105110
undo_tracing = config.pluginmanager.enable_tracing()
106111
sys.stderr.write("writing pytestdebug information to %s\n" % path)
107112

108-
def unset_tracing():
113+
def unset_tracing() -> None:
109114
debugfile.close()
110115
sys.stderr.write("wrote pytestdebug information to %s\n" % debugfile.name)
111116
config.trace.root.setwriter(None)
@@ -126,7 +131,7 @@ def showversion(config):
126131
sys.stderr.write(line + "\n")
127132

128133

129-
def pytest_cmdline_main(config):
134+
def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]:
130135
if config.option.version:
131136
showversion(config)
132137
return 0
@@ -135,9 +140,10 @@ def pytest_cmdline_main(config):
135140
showhelp(config)
136141
config._ensure_unconfigure()
137142
return 0
143+
return None
138144

139145

140-
def showhelp(config):
146+
def showhelp(config: Config) -> None:
141147
import textwrap
142148

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

0 commit comments

Comments
 (0)