summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhippo91 <guillaume.peillex@gmail.com>2019-02-09 11:04:51 +0100
committerhippo91 <guillaume.peillex@gmail.com>2019-02-09 11:04:51 +0100
commite6ec4fdb36d3e085b2d82e878520e72178ff8acc (patch)
tree917b96fcfd9d5eec39197db3149705eb2dc8ad66
parent2aaad9c3e94b2f9b4eb1898e3a0f9c5f68635e3e (diff)
parent6b5991d570a3743335816c5ecda0d07f5309a337 (diff)
downloadastroid-git-e6ec4fdb36d3e085b2d82e878520e72178ff8acc.tar.gz
Merge branch 'master' into bug_pylint_2436
-rw-r--r--ChangeLog9
-rw-r--r--astroid/brain/brain_namedtuple_enum.py11
-rw-r--r--astroid/tests/unittest_brain.py38
3 files changed, 54 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 88818cb7..aab855ad 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,15 @@ What's New in astroid 2.2.0?
============================
Release Date: TBA
+
+* Support non-const nodes as values of Enum attributes.
+
+ Close #612
+
+* Fix a crash in the ``enum`` brain tip caused by non-assign members in class definitions.
+
+ Close PyCQA/pylint#2719
+
* ``brain_numpy`` returns an undefined type for ``numpy`` methods to avoid ``assignment-from-no-return``
Close PyCQA/pylint#2694
diff --git a/astroid/brain/brain_namedtuple_enum.py b/astroid/brain/brain_namedtuple_enum.py
index 58402f18..69e5eb8c 100644
--- a/astroid/brain/brain_namedtuple_enum.py
+++ b/astroid/brain/brain_namedtuple_enum.py
@@ -320,11 +320,14 @@ def infer_enum_class(node):
targets = [stmt.target]
inferred_return_value = None
- if isinstance(stmt.value, nodes.Const):
- if isinstance(stmt.value.value, str):
- inferred_return_value = repr(stmt.value.value)
+ if isinstance(stmt, nodes.Assign):
+ if isinstance(stmt.value, nodes.Const):
+ if isinstance(stmt.value.value, str):
+ inferred_return_value = repr(stmt.value.value)
+ else:
+ inferred_return_value = stmt.value.value
else:
- inferred_return_value = stmt.value.value
+ inferred_return_value = stmt.value.as_string()
new_targets = []
for target in targets:
diff --git a/astroid/tests/unittest_brain.py b/astroid/tests/unittest_brain.py
index 5eec16ad..10649f15 100644
--- a/astroid/tests/unittest_brain.py
+++ b/astroid/tests/unittest_brain.py
@@ -764,6 +764,44 @@ class EnumBrainTest(unittest.TestCase):
inferred_string = next(node.infer())
assert inferred_string.value == "\N{NULL}"
+ def test_dont_crash_on_for_loops_in_body(self):
+ node = builder.extract_node(
+ """
+
+ class Commands(IntEnum):
+ _ignore_ = 'Commands index'
+ _init_ = 'value string'
+
+ BEL = 0x07, 'Bell'
+ Commands = vars()
+ for index in range(4):
+ Commands[f'DC{index + 1}'] = 0x11 + index, f'Device Control {index + 1}'
+
+ Commands
+ """
+ )
+ inferred = next(node.infer())
+ assert isinstance(inferred, astroid.ClassDef)
+
+ def test_enum_tuple_list_values(self):
+ tuple_node, list_node = builder.extract_node(
+ """
+ import enum
+
+ class MyEnum(enum.Enum):
+ a = (1, 2)
+ b = [2, 4]
+ MyEnum.a.value #@
+ MyEnum.b.value #@
+ """
+ )
+ inferred_tuple_node = next(tuple_node.infer())
+ inferred_list_node = next(list_node.infer())
+ assert isinstance(inferred_tuple_node, astroid.Tuple)
+ assert isinstance(inferred_list_node, astroid.List)
+ assert inferred_tuple_node.as_string() == "(1, 2)"
+ assert inferred_list_node.as_string() == "[2, 4]"
+
@unittest.skipUnless(HAS_DATEUTIL, "This test requires the dateutil library.")
class DateutilBrainTest(unittest.TestCase):