Skip to content

Commit e67b3d1

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 ab7a5b0 commit e67b3d1

27 files changed

+219
-125
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: 10 additions & 5 deletions
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,7 +319,7 @@ 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
@@ -358,15 +361,15 @@ def pytest_collection_modifyitems(
358361
def _get_increasing_order(self, items):
359362
return sorted(items, key=lambda item: item.fspath.mtime(), reverse=True)
360363

361-
def pytest_sessionfinish(self, session):
364+
def pytest_sessionfinish(self, session: Session) -> None:
362365
config = self.config
363366
if config.getoption("cacheshow") or hasattr(config, "slaveinput"):
364367
return
365368

366369
config.cache.set("cache/nodeids", self.cached_nodeids)
367370

368371

369-
def pytest_addoption(parser):
372+
def pytest_addoption(parser: Parser) -> None:
370373
group = parser.getgroup("general")
371374
group.addoption(
372375
"--lf",
@@ -424,16 +427,18 @@ def pytest_addoption(parser):
424427
)
425428

426429

427-
def pytest_cmdline_main(config):
430+
def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]:
428431
if config.option.cacheshow:
429432
from _pytest.main import wrap_session
430433

431434
return wrap_session(config, cacheshow)
435+
return None
432436

433437

434438
@pytest.hookimpl(tryfirst=True)
435439
def pytest_configure(config: Config) -> None:
436-
config.cache = Cache.for_config(config)
440+
# Type ignored: pending mechanism to store typed objects scoped to config.
441+
config.cache = Cache.for_config(config) # type: ignore # noqa: F821
437442
config.pluginmanager.register(LFPlugin(config), "lfplugin")
438443
config.pluginmanager.register(NFPlugin(config), "nfplugin")
439444

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(
@@ -834,7 +834,9 @@ def _ensure_unconfigure(self) -> None:
834834
def get_terminal_writer(self):
835835
return self.pluginmanager.get_plugin("terminalreporter")._tw
836836

837-
def pytest_cmdline_parse(self, pluginmanager, args):
837+
def pytest_cmdline_parse(
838+
self, pluginmanager: PytestPluginManager, args: List[str]
839+
) -> object:
838840
try:
839841
self.parse(args)
840842
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 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

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",
@@ -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)