aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/pytest/py3/_pytest/nose.py
diff options
context:
space:
mode:
authorarcadia-devtools <arcadia-devtools@yandex-team.ru>2022-02-14 00:49:36 +0300
committerarcadia-devtools <arcadia-devtools@yandex-team.ru>2022-02-14 00:49:36 +0300
commit82cfd1b7cab2d843cdf5467d9737f72597a493bd (patch)
tree1dfdcfe81a1a6b193ceacc2a828c521b657a339b /contrib/python/pytest/py3/_pytest/nose.py
parent3df7211d3e3691f8e33b0a1fb1764fe810d59302 (diff)
downloadydb-82cfd1b7cab2d843cdf5467d9737f72597a493bd.tar.gz
intermediate changes
ref:68b1302de4b5da30b6bdf02193f7a2604d8b5cf8
Diffstat (limited to 'contrib/python/pytest/py3/_pytest/nose.py')
-rw-r--r--contrib/python/pytest/py3/_pytest/nose.py57
1 files changed, 30 insertions, 27 deletions
diff --git a/contrib/python/pytest/py3/_pytest/nose.py b/contrib/python/pytest/py3/_pytest/nose.py
index bb8f99772a..b0699d22bd 100644
--- a/contrib/python/pytest/py3/_pytest/nose.py
+++ b/contrib/python/pytest/py3/_pytest/nose.py
@@ -1,39 +1,42 @@
"""Run testsuites written for nose."""
-from _pytest import python
-from _pytest import unittest
from _pytest.config import hookimpl
+from _pytest.fixtures import getfixturemarker
from _pytest.nodes import Item
+from _pytest.python import Function
+from _pytest.unittest import TestCaseFunction
@hookimpl(trylast=True)
-def pytest_runtest_setup(item):
- if is_potential_nosetest(item):
- if not call_optional(item.obj, "setup"):
- # Call module level setup if there is no object level one.
- call_optional(item.parent.obj, "setup")
- # XXX This implies we only call teardown when setup worked.
- item.session._setupstate.addfinalizer((lambda: teardown_nose(item)), item)
+def pytest_runtest_setup(item: Item) -> None:
+ if not isinstance(item, Function):
+ return
+ # Don't do nose style setup/teardown on direct unittest style classes.
+ if isinstance(item, TestCaseFunction):
+ return
+ # Capture the narrowed type of item for the teardown closure,
+ # see https://github.com/python/mypy/issues/2608
+ func = item
-def teardown_nose(item):
- if is_potential_nosetest(item):
- if not call_optional(item.obj, "teardown"):
- call_optional(item.parent.obj, "teardown")
+ call_optional(func.obj, "setup")
+ func.addfinalizer(lambda: call_optional(func.obj, "teardown"))
+ # NOTE: Module- and class-level fixtures are handled in python.py
+ # with `pluginmanager.has_plugin("nose")` checks.
+ # It would have been nicer to implement them outside of core, but
+ # it's not straightforward.
-def is_potential_nosetest(item: Item) -> bool:
- # Extra check needed since we do not do nose style setup/teardown
- # on direct unittest style classes.
- return isinstance(item, python.Function) and not isinstance(
- item, unittest.TestCaseFunction
- )
-
-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