5
5
from pylint .checkers .variables import VariablesChecker
6
6
from pylint .interfaces import IAstroidChecker
7
7
import pytest
8
- from ..utils import _can_use_fixture , _is_same_module , _is_pytest_mark_usefixtures
8
+ from ..utils import _can_use_fixture , _is_same_module , _is_pytest_mark_usefixtures , _is_pytest_fixture
9
9
from . import BasePytestChecker
10
10
11
11
@@ -17,9 +17,15 @@ def pytest_sessionfinish(self, session):
17
17
self .fixtures = session ._fixturemanager ._arg2fixturedefs
18
18
19
19
20
- class FixtureLoader (BasePytestChecker ):
20
+ class FixtureChecker (BasePytestChecker ):
21
21
__implements__ = IAstroidChecker
22
- msgs = {'E6401' : ('' , 'pytest-fixture-loader' , '' )}
22
+ msgs = {
23
+ 'W6401' : (
24
+ 'Using a deprecated @pytest.yield_fixture decorator' ,
25
+ 'deprecated-pytest-yield-fixture' ,
26
+ 'Used when using a deprecated pytest decorator that has been deprecated in pytest-3.0'
27
+ ),
28
+ }
23
29
24
30
_pytest_fixtures = {}
25
31
_invoked_with_func_args = set ()
@@ -28,19 +34,19 @@ class FixtureLoader(BasePytestChecker):
28
34
29
35
def open (self ):
30
36
# patch VariablesChecker.add_message
31
- FixtureLoader ._original_add_message = VariablesChecker .add_message
32
- VariablesChecker .add_message = FixtureLoader .patch_add_message
37
+ FixtureChecker ._original_add_message = VariablesChecker .add_message
38
+ VariablesChecker .add_message = FixtureChecker .patch_add_message
33
39
34
40
def close (self ):
35
41
'''restore & reset class attr for testing'''
36
42
# restore add_message
37
- VariablesChecker .add_message = FixtureLoader ._original_add_message
38
- FixtureLoader ._original_add_message = callable
43
+ VariablesChecker .add_message = FixtureChecker ._original_add_message
44
+ FixtureChecker ._original_add_message = callable
39
45
40
46
# reset fixture info storage
41
- FixtureLoader ._pytest_fixtures = {}
42
- FixtureLoader ._invoked_with_func_args = set ()
43
- FixtureLoader ._invoked_with_usefixtures = set ()
47
+ FixtureChecker ._pytest_fixtures = {}
48
+ FixtureChecker ._invoked_with_func_args = set ()
49
+ FixtureChecker ._invoked_with_usefixtures = set ()
44
50
45
51
def visit_module (self , node ):
46
52
'''
@@ -49,13 +55,13 @@ def visit_module(self, node):
49
55
- create containers for the module to store args and fixtures
50
56
'''
51
57
# storing all fixtures discovered by pytest session
52
- FixtureLoader ._pytest_fixtures = {} # Dict[List[_pytest.fixtures.FixtureDef]]
58
+ FixtureChecker ._pytest_fixtures = {} # Dict[List[_pytest.fixtures.FixtureDef]]
53
59
54
60
# storing all used function arguments
55
- FixtureLoader ._invoked_with_func_args = set () # Set[str]
61
+ FixtureChecker ._invoked_with_func_args = set () # Set[str]
56
62
57
63
# storing all invoked fixtures through @pytest.mark.usefixture(...)
58
- FixtureLoader ._invoked_with_usefixtures = set () # Set[str]
64
+ FixtureChecker ._invoked_with_usefixtures = set () # Set[str]
59
65
60
66
try :
61
67
with open (os .devnull , 'w' ) as devnull :
@@ -69,7 +75,7 @@ def visit_module(self, node):
69
75
[node .file , '--fixtures' ],
70
76
plugins = [fixture_collector ],
71
77
)
72
- FixtureLoader ._pytest_fixtures = fixture_collector .fixtures
78
+ FixtureChecker ._pytest_fixtures = fixture_collector .fixtures
73
79
finally :
74
80
# restore output devices
75
81
sys .stdout , sys .stderr = stdout , stderr
@@ -87,6 +93,10 @@ def visit_functiondef(self, node):
87
93
# save all visited fixtures
88
94
for arg in decorator .args :
89
95
self ._invoked_with_usefixtures .add (arg .value )
96
+ if int (pytest .__version__ .split ('.' )[0 ]) >= 3 and \
97
+ _is_pytest_fixture (decorator , fixture = False ):
98
+ # raise deprecated warning for @pytest.yield_fixture
99
+ self .add_message ('deprecated-pytest-yield-fixture' , node = node )
90
100
for arg in node .args .args :
91
101
self ._invoked_with_func_args .add (arg .name )
92
102
@@ -109,17 +119,17 @@ def patch_add_message(self, msgid, line=None, node=None, args=None,
109
119
pass
110
120
111
121
# imported fixture is referenced in test/fixture func
112
- elif fixture_name in FixtureLoader ._invoked_with_func_args \
113
- and fixture_name in FixtureLoader ._pytest_fixtures :
114
- if _is_same_module (fixtures = FixtureLoader ._pytest_fixtures ,
122
+ elif fixture_name in FixtureChecker ._invoked_with_func_args \
123
+ and fixture_name in FixtureChecker ._pytest_fixtures :
124
+ if _is_same_module (fixtures = FixtureChecker ._pytest_fixtures ,
115
125
import_node = node ,
116
126
fixture_name = fixture_name ):
117
127
return
118
128
119
129
# fixture is referenced in @pytest.mark.usefixtures
120
- elif fixture_name in FixtureLoader ._invoked_with_usefixtures \
121
- and fixture_name in FixtureLoader ._pytest_fixtures :
122
- if _is_same_module (fixtures = FixtureLoader ._pytest_fixtures ,
130
+ elif fixture_name in FixtureChecker ._invoked_with_usefixtures \
131
+ and fixture_name in FixtureChecker ._pytest_fixtures :
132
+ if _is_same_module (fixtures = FixtureChecker ._pytest_fixtures ,
123
133
import_node = node ,
124
134
fixture_name = fixture_name ):
125
135
return
@@ -128,20 +138,20 @@ def patch_add_message(self, msgid, line=None, node=None, args=None,
128
138
if msgid == 'unused-argument' and \
129
139
_can_use_fixture (node .parent .parent ) and \
130
140
isinstance (node .parent , astroid .Arguments ) and \
131
- node .name in FixtureLoader ._pytest_fixtures :
141
+ node .name in FixtureChecker ._pytest_fixtures :
132
142
return
133
143
134
144
# check W0621 redefined-outer-name
135
145
if msgid == 'redefined-outer-name' and \
136
146
_can_use_fixture (node .parent .parent ) and \
137
147
isinstance (node .parent , astroid .Arguments ) and \
138
- node .name in FixtureLoader ._pytest_fixtures :
148
+ node .name in FixtureChecker ._pytest_fixtures :
139
149
return
140
150
141
151
if int (pylint .__version__ .split ('.' )[0 ]) >= 2 :
142
- FixtureLoader ._original_add_message (
152
+ FixtureChecker ._original_add_message (
143
153
self , msgid , line , node , args , confidence , col_offset )
144
154
else :
145
155
# python2 + pylint1.9 backward compatibility
146
- FixtureLoader ._original_add_message (
156
+ FixtureChecker ._original_add_message (
147
157
self , msgid , line , node , args , confidence )
0 commit comments