|
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