From 4630e2725e84bb07fc0527c2c293b500dfe585a6 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Fri, 10 Jan 2020 19:53:57 +0100 Subject: [PATCH] Use `TYPE_CHECKING` instead of `False` This allows for e.g. Jedi to infer types (it checks the name). It was only used to support Python 3.5.0/3.5.1, where this is is not available in the `typing` module. Ref: https://github.com/davidhalter/jedi/issues/1472 Uses `TYPE_CHECKING = False` in `_pytest.outcomes` to avoid having to work around circular import. --- .coveragerc | 2 ++ doc/en/conf.py | 3 ++- src/_pytest/_code/code.py | 3 ++- src/_pytest/compat.py | 8 +++++++- src/_pytest/config/__init__.py | 3 ++- src/_pytest/config/findpaths.py | 3 ++- src/_pytest/doctest.py | 3 ++- src/_pytest/fixtures.py | 3 ++- src/_pytest/nodes.py | 3 ++- src/_pytest/outcomes.py | 4 +++- src/_pytest/pytester.py | 5 +++-- src/_pytest/python_api.py | 3 ++- src/_pytest/recwarn.py | 3 ++- src/_pytest/runner.py | 3 ++- src/_pytest/warning_types.py | 3 ++- 15 files changed, 37 insertions(+), 15 deletions(-) diff --git a/.coveragerc b/.coveragerc index ed1fb9759..fc2321e87 100644 --- a/.coveragerc +++ b/.coveragerc @@ -24,3 +24,5 @@ exclude_lines = \#\s*pragma: no cover ^\s*raise NotImplementedError\b ^\s*return NotImplemented\b + + ^\s*if TYPE_CHECKING: diff --git a/doc/en/conf.py b/doc/en/conf.py index 3fb6002bc..bd2fd9871 100644 --- a/doc/en/conf.py +++ b/doc/en/conf.py @@ -19,8 +19,9 @@ import os import sys from _pytest import __version__ as version +from _pytest.compat import TYPE_CHECKING -if False: # TYPE_CHECKING +if TYPE_CHECKING: import sphinx.application diff --git a/src/_pytest/_code/code.py b/src/_pytest/_code/code.py index d1a8ec2f1..f0e503f4f 100644 --- a/src/_pytest/_code/code.py +++ b/src/_pytest/_code/code.py @@ -32,8 +32,9 @@ import _pytest from _pytest._io.saferepr import safeformat from _pytest._io.saferepr import saferepr from _pytest.compat import overload +from _pytest.compat import TYPE_CHECKING -if False: # TYPE_CHECKING +if TYPE_CHECKING: from typing import Type from typing_extensions import Literal from weakref import ReferenceType # noqa: F401 diff --git a/src/_pytest/compat.py b/src/_pytest/compat.py index de640bdd1..cc5140b0c 100644 --- a/src/_pytest/compat.py +++ b/src/_pytest/compat.py @@ -27,7 +27,13 @@ from _pytest._io.saferepr import saferepr from _pytest.outcomes import fail from _pytest.outcomes import TEST_OUTCOME -if False: # TYPE_CHECKING +if sys.version_info < (3, 5, 2): + TYPE_CHECKING = False # type: bool +else: + from typing import TYPE_CHECKING + + +if TYPE_CHECKING: from typing import Type # noqa: F401 (used in type string) diff --git a/src/_pytest/config/__init__.py b/src/_pytest/config/__init__.py index 038695d98..2677c2bec 100644 --- a/src/_pytest/config/__init__.py +++ b/src/_pytest/config/__init__.py @@ -37,12 +37,13 @@ from .findpaths import exists from _pytest._code import ExceptionInfo from _pytest._code import filter_traceback from _pytest.compat import importlib_metadata +from _pytest.compat import TYPE_CHECKING from _pytest.outcomes import fail from _pytest.outcomes import Skipped from _pytest.pathlib import Path from _pytest.warning_types import PytestConfigWarning -if False: # TYPE_CHECKING +if TYPE_CHECKING: from typing import Type diff --git a/src/_pytest/config/findpaths.py b/src/_pytest/config/findpaths.py index 728246dfc..d9b5f7543 100644 --- a/src/_pytest/config/findpaths.py +++ b/src/_pytest/config/findpaths.py @@ -5,9 +5,10 @@ from typing import Optional import py from .exceptions import UsageError +from _pytest.compat import TYPE_CHECKING from _pytest.outcomes import fail -if False: +if TYPE_CHECKING: from . import Config # noqa: F401 diff --git a/src/_pytest/doctest.py b/src/_pytest/doctest.py index 488e91ddb..3093ddbc8 100644 --- a/src/_pytest/doctest.py +++ b/src/_pytest/doctest.py @@ -19,12 +19,13 @@ from _pytest._code.code import ExceptionInfo from _pytest._code.code import ReprFileLocation from _pytest._code.code import TerminalRepr from _pytest.compat import safe_getattr +from _pytest.compat import TYPE_CHECKING from _pytest.fixtures import FixtureRequest from _pytest.outcomes import Skipped from _pytest.python_api import approx from _pytest.warning_types import PytestWarning -if False: # TYPE_CHECKING +if TYPE_CHECKING: import doctest from typing import Type diff --git a/src/_pytest/fixtures.py b/src/_pytest/fixtures.py index cc640310e..b048f466b 100644 --- a/src/_pytest/fixtures.py +++ b/src/_pytest/fixtures.py @@ -27,12 +27,13 @@ from _pytest.compat import getlocation from _pytest.compat import is_generator from _pytest.compat import NOTSET from _pytest.compat import safe_getattr +from _pytest.compat import TYPE_CHECKING from _pytest.deprecated import FIXTURE_POSITIONAL_ARGUMENTS from _pytest.deprecated import FUNCARGNAMES from _pytest.outcomes import fail from _pytest.outcomes import TEST_OUTCOME -if False: # TYPE_CHECKING +if TYPE_CHECKING: from typing import Type from _pytest import nodes diff --git a/src/_pytest/nodes.py b/src/_pytest/nodes.py index c34dcce5c..bb89b691b 100644 --- a/src/_pytest/nodes.py +++ b/src/_pytest/nodes.py @@ -17,6 +17,7 @@ from _pytest._code.code import ExceptionInfo from _pytest._code.code import ReprExceptionInfo from _pytest.compat import cached_property from _pytest.compat import getfslineno +from _pytest.compat import TYPE_CHECKING from _pytest.config import Config from _pytest.fixtures import FixtureDef from _pytest.fixtures import FixtureLookupError @@ -26,7 +27,7 @@ from _pytest.mark.structures import MarkDecorator from _pytest.mark.structures import NodeKeywords from _pytest.outcomes import Failed -if False: # TYPE_CHECKING +if TYPE_CHECKING: # Imported here due to circular import. from _pytest.main import Session # noqa: F401 diff --git a/src/_pytest/outcomes.py b/src/_pytest/outcomes.py index 947136625..0cd1072ef 100644 --- a/src/_pytest/outcomes.py +++ b/src/_pytest/outcomes.py @@ -8,7 +8,9 @@ from typing import Optional from packaging.version import Version -if False: # TYPE_CHECKING +TYPE_CHECKING = False # avoid circular import through compat + +if TYPE_CHECKING: from typing import NoReturn diff --git a/src/_pytest/pytester.py b/src/_pytest/pytester.py index 930f7db29..d35ef3d7c 100644 --- a/src/_pytest/pytester.py +++ b/src/_pytest/pytester.py @@ -28,6 +28,7 @@ from _pytest._code import Source from _pytest._io.saferepr import saferepr from _pytest.capture import MultiCapture from _pytest.capture import SysCapture +from _pytest.compat import TYPE_CHECKING from _pytest.fixtures import FixtureRequest from _pytest.main import ExitCode from _pytest.main import Session @@ -35,7 +36,7 @@ from _pytest.monkeypatch import MonkeyPatch from _pytest.pathlib import Path from _pytest.reports import TestReport -if False: # TYPE_CHECKING +if TYPE_CHECKING: from typing import Type @@ -189,7 +190,7 @@ class ParsedCall: del d["_name"] return "".format(self._name, d) - if False: # TYPE_CHECKING + if TYPE_CHECKING: # The class has undetermined attributes, this tells mypy about it. def __getattr__(self, key): raise NotImplementedError() diff --git a/src/_pytest/python_api.py b/src/_pytest/python_api.py index 9f206ce9b..5e5eddc5b 100644 --- a/src/_pytest/python_api.py +++ b/src/_pytest/python_api.py @@ -23,9 +23,10 @@ from more_itertools.more import always_iterable import _pytest._code from _pytest.compat import overload from _pytest.compat import STRING_TYPES +from _pytest.compat import TYPE_CHECKING from _pytest.outcomes import fail -if False: # TYPE_CHECKING +if TYPE_CHECKING: from typing import Type # noqa: F401 (used in type string) diff --git a/src/_pytest/recwarn.py b/src/_pytest/recwarn.py index 5cf32c894..956a90783 100644 --- a/src/_pytest/recwarn.py +++ b/src/_pytest/recwarn.py @@ -12,10 +12,11 @@ from typing import Tuple from typing import Union from _pytest.compat import overload +from _pytest.compat import TYPE_CHECKING from _pytest.fixtures import yield_fixture from _pytest.outcomes import fail -if False: # TYPE_CHECKING +if TYPE_CHECKING: from typing import Type diff --git a/src/_pytest/runner.py b/src/_pytest/runner.py index 50e4d4307..417783b47 100644 --- a/src/_pytest/runner.py +++ b/src/_pytest/runner.py @@ -15,12 +15,13 @@ from .reports import CollectErrorRepr from .reports import CollectReport from .reports import TestReport from _pytest._code.code import ExceptionInfo +from _pytest.compat import TYPE_CHECKING from _pytest.nodes import Node from _pytest.outcomes import Exit from _pytest.outcomes import Skipped from _pytest.outcomes import TEST_OUTCOME -if False: # TYPE_CHECKING +if TYPE_CHECKING: from typing import Type # diff --git a/src/_pytest/warning_types.py b/src/_pytest/warning_types.py index 22cb17dba..2e03c578c 100644 --- a/src/_pytest/warning_types.py +++ b/src/_pytest/warning_types.py @@ -4,8 +4,9 @@ from typing import TypeVar import attr +from _pytest.compat import TYPE_CHECKING -if False: # TYPE_CHECKING +if TYPE_CHECKING: from typing import Type # noqa: F401 (used in type string)