summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRan Benita <ran@unusedvar.com>2021-01-04 22:47:32 +0200
committerGitHub <noreply@github.com>2021-01-04 22:47:32 +0200
commit5336ba28ccc583f4cbde0082ee1d0bcc4e2002eb (patch)
tree39029a102da732b04960fc60799f79ed8a68dfe6 /src
parent8e00df4c4b62f08df0003e578c581e0b5728e571 (diff)
parent2ff88098a7340142ed2c6d2c090b8c9fac001a5e (diff)
downloadpytest-5336ba28ccc583f4cbde0082ee1d0bcc4e2002eb.tar.gz
Merge pull request #8218 from bluetech/reports2
Misc small code improvements
Diffstat (limited to 'src')
-rw-r--r--src/_pytest/fixtures.py17
-rw-r--r--src/_pytest/nose.py24
-rw-r--r--src/_pytest/python.py7
-rw-r--r--src/_pytest/reports.py21
4 files changed, 41 insertions, 28 deletions
diff --git a/src/_pytest/fixtures.py b/src/_pytest/fixtures.py
index 53f33d3e1..5bdee3096 100644
--- a/src/_pytest/fixtures.py
+++ b/src/_pytest/fixtures.py
@@ -16,6 +16,7 @@ from typing import Generic
from typing import Iterable
from typing import Iterator
from typing import List
+from typing import MutableMapping
from typing import Optional
from typing import overload
from typing import Sequence
@@ -525,9 +526,10 @@ class FixtureRequest:
return self._pyfuncitem.fspath # type: ignore
@property
- def keywords(self):
+ def keywords(self) -> MutableMapping[str, Any]:
"""Keywords/markers dictionary for the underlying node."""
- return self.node.keywords
+ node: nodes.Node = self.node
+ return node.keywords
@property
def session(self) -> "Session":
@@ -607,14 +609,11 @@ class FixtureRequest:
def _get_fixturestack(self) -> List["FixtureDef[Any]"]:
current = self
values: List[FixtureDef[Any]] = []
- while 1:
- fixturedef = getattr(current, "_fixturedef", None)
- if fixturedef is None:
- values.reverse()
- return values
- values.append(fixturedef)
- assert isinstance(current, SubRequest)
+ while isinstance(current, SubRequest):
+ values.append(current._fixturedef) # type: ignore[has-type]
current = current._parent_request
+ values.reverse()
+ return values
def _compute_fixture_value(self, fixturedef: "FixtureDef[object]") -> None:
"""Create a SubRequest based on "self" and call the execute method
diff --git a/src/_pytest/nose.py b/src/_pytest/nose.py
index bb8f99772..de91af85a 100644
--- a/src/_pytest/nose.py
+++ b/src/_pytest/nose.py
@@ -2,11 +2,12 @@
from _pytest import python
from _pytest import unittest
from _pytest.config import hookimpl
+from _pytest.fixtures import getfixturemarker
from _pytest.nodes import Item
@hookimpl(trylast=True)
-def pytest_runtest_setup(item):
+def pytest_runtest_setup(item) -> None:
if is_potential_nosetest(item):
if not call_optional(item.obj, "setup"):
# Call module level setup if there is no object level one.
@@ -15,7 +16,7 @@ def pytest_runtest_setup(item):
item.session._setupstate.addfinalizer((lambda: teardown_nose(item)), item)
-def teardown_nose(item):
+def teardown_nose(item) -> None:
if is_potential_nosetest(item):
if not call_optional(item.obj, "teardown"):
call_optional(item.parent.obj, "teardown")
@@ -29,11 +30,16 @@ def is_potential_nosetest(item: Item) -> bool:
)
-def call_optional(obj, name):
+def call_optional(obj: object, name: str) -> bool:
method = getattr(obj, name, None)
- isfixture = hasattr(method, "_pytestfixturefunction")
- if method is not None and not isfixture and callable(method):
- # If there's any problems allow the exception to raise rather than
- # silently ignoring them.
- method()
- return True
+ if method is None:
+ return False
+ is_fixture = getfixturemarker(method) is not None
+ if is_fixture:
+ return False
+ if not callable(method):
+ return False
+ # If there are any problems allow the exception to raise rather than
+ # silently ignoring it.
+ method()
+ return True
diff --git a/src/_pytest/python.py b/src/_pytest/python.py
index 50ea60c2d..29ebd176b 100644
--- a/src/_pytest/python.py
+++ b/src/_pytest/python.py
@@ -922,10 +922,6 @@ class CallSpec2:
cs._idlist = list(self._idlist)
return cs
- def _checkargnotcontained(self, arg: str) -> None:
- if arg in self.params or arg in self.funcargs:
- raise ValueError(f"duplicate {arg!r}")
-
def getparam(self, name: str) -> object:
try:
return self.params[name]
@@ -947,7 +943,8 @@ class CallSpec2:
param_index: int,
) -> None:
for arg, val in zip(argnames, valset):
- self._checkargnotcontained(arg)
+ if arg in self.params or arg in self.funcargs:
+ raise ValueError(f"duplicate {arg!r}")
valtype_for_arg = valtypes[arg]
if valtype_for_arg == "params":
self.params[arg] = val
diff --git a/src/_pytest/reports.py b/src/_pytest/reports.py
index bcd40fb36..d2d7115b2 100644
--- a/src/_pytest/reports.py
+++ b/src/_pytest/reports.py
@@ -65,6 +65,7 @@ class BaseReport:
]
sections: List[Tuple[str, str]]
nodeid: str
+ outcome: "Literal['passed', 'failed', 'skipped']"
def __init__(self, **kw: Any) -> None:
self.__dict__.update(kw)
@@ -141,9 +142,17 @@ class BaseReport:
content for (prefix, content) in self.get_sections("Captured stderr")
)
- passed = property(lambda x: x.outcome == "passed")
- failed = property(lambda x: x.outcome == "failed")
- skipped = property(lambda x: x.outcome == "skipped")
+ @property
+ def passed(self) -> bool:
+ return self.outcome == "passed"
+
+ @property
+ def failed(self) -> bool:
+ return self.outcome == "failed"
+
+ @property
+ def skipped(self) -> bool:
+ return self.outcome == "skipped"
@property
def fspath(self) -> str:
@@ -348,8 +357,10 @@ class CollectReport(BaseReport):
def __init__(
self,
nodeid: str,
- outcome: "Literal['passed', 'skipped', 'failed']",
- longrepr,
+ outcome: "Literal['passed', 'failed', 'skipped']",
+ longrepr: Union[
+ None, ExceptionInfo[BaseException], Tuple[str, int, str], str, TerminalRepr
+ ],
result: Optional[List[Union[Item, Collector]]],
sections: Iterable[Tuple[str, str]] = (),
**extra,