Skip to content

Commit f9793ae

Browse files
committed
Adding various forwards-compatible workarounds for pending deprecations in astroid 2.0
1 parent afe6e5e commit f9793ae

File tree

6 files changed

+59
-31
lines changed

6 files changed

+59
-31
lines changed

pylint_django/augmentations/__init__.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44
from pylint.checkers.classes import ClassChecker
55
from pylint.checkers.newstyle import NewStyleConflictChecker
66
from pylint.checkers.variables import VariablesChecker
7-
from astroid import InferenceError, Getattr
8-
from astroid.nodes import Class, From
7+
from astroid import InferenceError
8+
from pylint_django.compat import ClassDef, ImportFrom, Attribute
99
from astroid.scoped_nodes import Class as ScopedClass, Module
1010
from pylint.__pkginfo__ import numversion as PYLINT_VERSION
1111
from pylint.checkers.typecheck import TypeChecker
1212
from pylint_django.utils import node_is_subclass, PY3
13+
from pylint_django.compat import inferred
1314
from pylint_plugin_utils import augment_visit, suppress_message
1415

1516

@@ -31,7 +32,7 @@ def ignore_import_warnings_for_related_fields(orig_method, self, node):
3132

3233
iterat = to_consume[0].items if PY3 else to_consume[0].iteritems
3334
for name, stmts in iterat():
34-
if isinstance(stmts[0], From):
35+
if isinstance(stmts[0], ImportFrom):
3536
if any([n[0] in ('ForeignKey', 'OneToOneField') for n in stmts[0].names]):
3637
continue
3738
new_things[name] = stmts
@@ -109,7 +110,7 @@ class ModelB(models.Model):
109110
quack = True
110111
else:
111112
# we will
112-
if isinstance(node.parent, Getattr):
113+
if isinstance(node.parent, Attribute):
113114
func_name = getattr(node.parent, 'attrname', None)
114115
if func_name in manager_attrs:
115116
quack = True
@@ -118,7 +119,7 @@ class ModelB(models.Model):
118119
children = list(node.get_children())
119120
for child in children:
120121
try:
121-
inferred = child.infered()
122+
inferred = inferred(child)()
122123
except InferenceError:
123124
pass
124125
else:
@@ -143,15 +144,15 @@ def foreign_key_ids(chain, node):
143144

144145
def is_model_admin_subclass(node):
145146
"""Checks that node is derivative of ModelAdmin class."""
146-
if node.name[-5:] != 'Admin' or isinstance(node.parent, Class):
147+
if node.name[-5:] != 'Admin' or isinstance(node.parent, ClassDef):
147148
return False
148149

149150
return node_is_subclass(node, 'django.contrib.admin.options.ModelAdmin')
150151

151152

152153
def is_model_media_subclass(node):
153154
"""Checks that node is derivative of Media class."""
154-
if node.name != 'Media' or not isinstance(node.parent, Class):
155+
if node.name != 'Media' or not isinstance(node.parent, ClassDef):
155156
return False
156157

157158
parents = ('django.contrib.admin.options.ModelAdmin',
@@ -167,7 +168,7 @@ def is_model_media_subclass(node):
167168

168169
def is_model_meta_subclass(node):
169170
"""Checks that node is derivative of Meta class."""
170-
if node.name != 'Meta' or not isinstance(node.parent, Class):
171+
if node.name != 'Meta' or not isinstance(node.parent, ClassDef):
171172
return False
172173

173174
parents = ('.Model', # for the transformed version used here
@@ -186,7 +187,7 @@ def is_model_meta_subclass(node):
186187

187188
def is_model_mpttmeta_subclass(node):
188189
"""Checks that node is derivative of MPTTMeta class."""
189-
if node.name != 'MPTTMeta' or not isinstance(node.parent, Class):
190+
if node.name != 'MPTTMeta' or not isinstance(node.parent, ClassDef):
190191
return False
191192

192193
parents = ('django.db.models.base.Model',
@@ -200,7 +201,7 @@ def is_model_mpttmeta_subclass(node):
200201

201202
def is_model_test_case_subclass(node):
202203
"""Checks that node is derivative of TestCase class."""
203-
if not node.name.endswith('Test') and not isinstance(node.parent, Class):
204+
if not node.name.endswith('Test') and not isinstance(node.parent, ClassDef):
204205
return False
205206

206207
return node_is_subclass(node, 'django.test.testcases.TestCase')
@@ -242,7 +243,7 @@ def is_model_field_display_method(node):
242243
# TODO: could validate the names of the fields on the model rather than
243244
# blindly accepting get_*_display
244245
try:
245-
for cls in node.last_child().infered():
246+
for cls in inferred(node.last_child())():
246247
if node_is_subclass(cls, 'django.db.models.base.Model', '.Model'):
247248
return True
248249
except InferenceError:

pylint_django/checkers/models.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Models."""
22
from astroid import Const
3-
from astroid.nodes import Assign, Function, AssName, Class
3+
from pylint_django.compat import ClassDef, FunctionDef, inferred, AssignName
4+
from astroid.nodes import Assign
45
from pylint.interfaces import IAstroidChecker
56
from pylint.checkers.utils import check_messages
67
from pylint.checkers import BaseChecker
@@ -28,7 +29,7 @@
2829

2930

3031
def _is_meta_with_abstract(node):
31-
if isinstance(node, Class) and node.name == 'Meta':
32+
if isinstance(node, ClassDef) and node.name == 'Meta':
3233
for meta_child in node.get_children():
3334
if not isinstance(meta_child, Assign):
3435
continue
@@ -77,21 +78,23 @@ def _visit_classdef(self, node):
7778
if isinstance(child, Assign):
7879
grandchildren = list(child.get_children())
7980

80-
if not isinstance(grandchildren[0], AssName):
81+
if not isinstance(grandchildren[0], AssignName):
8182
continue
8283

8384
name = grandchildren[0].name
8485
if name != '__unicode__':
8586
continue
8687

87-
assigned = grandchildren[1].infered()[0]
88+
grandchild = grandchildren[1]
89+
assigned = inferred(grandchild)()[0]
90+
8891
if assigned.callable():
8992
return
9093

9194
self.add_message('E%s01' % BASE_ID, args=node.name, node=node)
9295
return
9396

94-
if isinstance(child, Function) and child.name == '__unicode__':
97+
if isinstance(child, FunctionDef) and child.name == '__unicode__':
9598
if PY3:
9699
self.add_message('W%s02' % BASE_ID, args=node.name, node=node)
97100
return

pylint_django/compat.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
2+
try:
3+
from astroid.nodes import ClassDef, FunctionDef, ImportFrom, AssignName, Attribute
4+
except ImportError:
5+
from astroid.nodes import Class as ClassDef, \
6+
Function as FunctionDef, \
7+
From as ImportFrom, \
8+
AssName as AssignName, \
9+
Getattr as Attribute
10+
11+
try:
12+
from astroid.bases import YES as Uninferable
13+
except ImportError:
14+
try:
15+
from astroid.util import YES as Uninferable
16+
except ImportError:
17+
from astroid.util import Uninferable
18+
19+
20+
def inferred(node):
21+
if hasattr(node, 'inferred'):
22+
return node.inferred
23+
else:
24+
return node.infered
25+
26+
27+
def instantiate_class(node):
28+
if hasattr(node, 'instantiate_class'):
29+
return node.instantiate_class
30+
else:
31+
return node.instanciate_class

pylint_django/transforms/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def set_fake_locals(module):
2626
if module.name != package_name:
2727
return
2828
for class_name in class_names:
29-
module.locals[class_name] = fake.locals[class_name]
29+
module._locals[class_name] = fake._locals[class_name]
3030

3131
MANAGER.register_transform(nodes.Module, set_fake_locals)
3232

pylint_django/transforms/foreignkey.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
from astroid import nodes, InferenceError, inference_tip, UseInferenceDefault
2+
from pylint_django.compat import ClassDef, instantiate_class, Attribute
23

34

45
def is_foreignkey_in_class(node):
56
# is this of the form field = models.ForeignKey
67
if not isinstance(node.parent, nodes.Assign):
78
return False
8-
if not isinstance(node.parent.parent, nodes.Class):
9+
if not isinstance(node.parent.parent, ClassDef):
910
return False
1011

11-
if isinstance(node.func, nodes.Getattr):
12+
if isinstance(node.func, Attribute):
1213
attr = node.func.attrname
1314
elif isinstance(node.func, nodes.Name):
1415
attr = node.func.name
@@ -34,7 +35,7 @@ def infer_key_classes(node, context=None):
3435
break
3536
else:
3637
raise UseInferenceDefault
37-
return iter([key_cls.instanciate_class()])
38+
return iter([instantiate_class(key_cls)()])
3839

3940

4041
def add_transform(manager):

pylint_django/utils.py

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,23 @@
11
"""Utils."""
22
from astroid.exceptions import InferenceError
33
from astroid.bases import Instance
4-
from astroid.nodes import Class
4+
from pylint_django.compat import Uninferable, inferred, ClassDef
55
import sys
66

7-
try:
8-
from astroid.bases import YES as Uninferable
9-
except ImportError:
10-
try:
11-
from astroid.util import YES as Uninferable
12-
except ImportError:
13-
from astroid.util import Uninferable
14-
157

168
PY3 = sys.version_info >= (3, 0)
179

1810

1911
def node_is_subclass(cls, *subclass_names):
2012
"""Checks if cls node has parent with subclass_name."""
21-
if not isinstance(cls, (Class, Instance)):
13+
if not isinstance(cls, (ClassDef, Instance)):
2214
return False
2315

2416
if cls.bases == Uninferable:
2517
return False
2618
for base_cls in cls.bases:
2719
try:
28-
for inf in base_cls.infered():
20+
for inf in inferred(base_cls)():
2921
if inf.qname() in subclass_names:
3022
return True
3123
if inf != cls and node_is_subclass(inf, *subclass_names):

0 commit comments

Comments
 (0)