|
7 | 7 |
|
8 | 8 | import astroid |
9 | 9 | import pytest |
10 | | -from pylint.checkers.variables import VariablesChecker |
11 | 10 |
|
12 | 11 | from ..utils import ( |
13 | 12 | _can_use_fixture, |
14 | 13 | _is_pytest_fixture, |
15 | 14 | _is_pytest_mark, |
16 | 15 | _is_pytest_mark_usefixtures, |
17 | | - _is_same_module, |
18 | 16 | ) |
19 | 17 | from . import BasePytestChecker |
20 | | -from .types import FixtureDict, replacement_add_message |
| 18 | +from .types import FixtureDict |
21 | 19 |
|
22 | 20 | # TODO: support pytest python_files configuration |
23 | 21 | FILE_NAME_PATTERNS: tuple[str, ...] = ("test_*.py", "*_test.py") |
@@ -75,38 +73,28 @@ class FixtureChecker(BasePytestChecker): |
75 | 73 | } |
76 | 74 |
|
77 | 75 | # Store all fixtures discovered by pytest session |
78 | | - _pytest_fixtures: FixtureDict = {} |
| 76 | + pytest_fixtures: FixtureDict = {} |
79 | 77 | # Stores all used function arguments |
80 | | - _invoked_with_func_args: set[str] = set() |
| 78 | + invoked_with_func_args: set[str] = set() |
81 | 79 | # Stores all invoked fixtures through @pytest.mark.usefixture(...) |
82 | | - _invoked_with_usefixtures: set[str] = set() |
83 | | - _original_add_message = replacement_add_message |
84 | | - |
85 | | - def open(self): |
86 | | - # patch VariablesChecker.add_message |
87 | | - FixtureChecker._original_add_message = VariablesChecker.add_message |
88 | | - VariablesChecker.add_message = FixtureChecker.patch_add_message |
| 80 | + invoked_with_usefixtures: set[str] = set() |
89 | 81 |
|
90 | 82 | def close(self): |
91 | 83 | """restore & reset class attr for testing""" |
92 | | - # restore add_message |
93 | | - VariablesChecker.add_message = FixtureChecker._original_add_message |
94 | | - FixtureChecker._original_add_message = replacement_add_message |
95 | | - |
96 | 84 | # reset fixture info storage |
97 | | - FixtureChecker._pytest_fixtures = {} |
98 | | - FixtureChecker._invoked_with_func_args = set() |
99 | | - FixtureChecker._invoked_with_usefixtures = set() |
| 85 | + FixtureChecker.pytest_fixtures = {} |
| 86 | + FixtureChecker.invoked_with_func_args = set() |
| 87 | + FixtureChecker.invoked_with_usefixtures = set() |
100 | 88 |
|
101 | 89 | def visit_module(self, node): |
102 | 90 | """ |
103 | 91 | - only run once per module |
104 | 92 | - invoke pytest session to collect available fixtures |
105 | 93 | - create containers for the module to store args and fixtures |
106 | 94 | """ |
107 | | - FixtureChecker._pytest_fixtures = {} |
108 | | - FixtureChecker._invoked_with_func_args = set() |
109 | | - FixtureChecker._invoked_with_usefixtures = set() |
| 95 | + FixtureChecker.pytest_fixtures = {} |
| 96 | + FixtureChecker.invoked_with_func_args = set() |
| 97 | + FixtureChecker.invoked_with_usefixtures = set() |
110 | 98 |
|
111 | 99 | is_test_module = False |
112 | 100 | for pattern in FILE_NAME_PATTERNS: |
@@ -140,7 +128,7 @@ def visit_module(self, node): |
140 | 128 | # restore sys.path |
141 | 129 | sys.path = sys_path |
142 | 130 |
|
143 | | - FixtureChecker._pytest_fixtures = fixture_collector.fixtures |
| 131 | + FixtureChecker.pytest_fixtures = fixture_collector.fixtures |
144 | 132 |
|
145 | 133 | legitimate_failure_paths = set( |
146 | 134 | collection_report.nodeid |
@@ -224,92 +212,11 @@ def visit_functiondef(self, node): |
224 | 212 | if _is_pytest_mark_usefixtures(decorator): |
225 | 213 | # save all visited fixtures |
226 | 214 | for arg in decorator.args: |
227 | | - self._invoked_with_usefixtures.add(arg.value) |
| 215 | + self.invoked_with_usefixtures.add(arg.value) |
228 | 216 | if int(pytest.__version__.split(".")[0]) >= 3 and _is_pytest_fixture( |
229 | 217 | decorator, fixture=False |
230 | 218 | ): |
231 | 219 | # raise deprecated warning for @pytest.yield_fixture |
232 | 220 | self.add_message("deprecated-pytest-yield-fixture", node=node) |
233 | 221 | for arg in node.args.args: |
234 | | - self._invoked_with_func_args.add(arg.name) |
235 | | - |
236 | | - # pylint: disable=bad-staticmethod-argument # The function itself is an if-return logic. |
237 | | - @staticmethod |
238 | | - def patch_add_message( |
239 | | - self, msgid, line=None, node=None, args=None, confidence=None, col_offset=None |
240 | | - ): |
241 | | - """ |
242 | | - - intercept and discard unwanted warning messages |
243 | | - """ |
244 | | - # check W0611 unused-import |
245 | | - if msgid == "unused-import": |
246 | | - # actual attribute name is not passed as arg so...dirty hack |
247 | | - # message is usually in the form of '%s imported from %s (as %)' |
248 | | - message_tokens = args.split() |
249 | | - fixture_name = message_tokens[0] |
250 | | - |
251 | | - # ignoring 'import %s' message |
252 | | - if message_tokens[0] == "import" and len(message_tokens) == 2: |
253 | | - pass |
254 | | - |
255 | | - # fixture is defined in other modules and being imported to |
256 | | - # conftest for pytest magic |
257 | | - elif ( |
258 | | - isinstance(node.parent, astroid.Module) |
259 | | - and node.parent.name.split(".")[-1] == "conftest" |
260 | | - and fixture_name in FixtureChecker._pytest_fixtures |
261 | | - ): |
262 | | - return |
263 | | - |
264 | | - # imported fixture is referenced in test/fixture func |
265 | | - elif ( |
266 | | - fixture_name in FixtureChecker._invoked_with_func_args |
267 | | - and fixture_name in FixtureChecker._pytest_fixtures |
268 | | - ): |
269 | | - if _is_same_module( |
270 | | - fixtures=FixtureChecker._pytest_fixtures, |
271 | | - import_node=node, |
272 | | - fixture_name=fixture_name, |
273 | | - ): |
274 | | - return |
275 | | - |
276 | | - # fixture is referenced in @pytest.mark.usefixtures |
277 | | - elif ( |
278 | | - fixture_name in FixtureChecker._invoked_with_usefixtures |
279 | | - and fixture_name in FixtureChecker._pytest_fixtures |
280 | | - ): |
281 | | - if _is_same_module( |
282 | | - fixtures=FixtureChecker._pytest_fixtures, |
283 | | - import_node=node, |
284 | | - fixture_name=fixture_name, |
285 | | - ): |
286 | | - return |
287 | | - |
288 | | - # check W0613 unused-argument |
289 | | - if ( |
290 | | - msgid == "unused-argument" |
291 | | - and _can_use_fixture(node.parent.parent) |
292 | | - and isinstance(node.parent, astroid.Arguments) |
293 | | - ): |
294 | | - if node.name in FixtureChecker._pytest_fixtures: |
295 | | - # argument is used as a fixture |
296 | | - return |
297 | | - |
298 | | - fixnames = ( |
299 | | - arg.name for arg in node.parent.args if arg.name in FixtureChecker._pytest_fixtures |
300 | | - ) |
301 | | - for fixname in fixnames: |
302 | | - if node.name in FixtureChecker._pytest_fixtures[fixname][0].argnames: |
303 | | - # argument is used by a fixture |
304 | | - return |
305 | | - |
306 | | - # check W0621 redefined-outer-name |
307 | | - if ( |
308 | | - msgid == "redefined-outer-name" |
309 | | - and _can_use_fixture(node.parent.parent) |
310 | | - and isinstance(node.parent, astroid.Arguments) |
311 | | - and node.name in FixtureChecker._pytest_fixtures |
312 | | - ): |
313 | | - return |
314 | | - |
315 | | - FixtureChecker._original_add_message(self, msgid, line, node, args, confidence, col_offset) |
| 222 | + self.invoked_with_func_args.add(arg.name) |
0 commit comments