summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJacob Bogdanov <jacob@bogdanov.dev>2022-01-20 11:36:11 -0500
committerGitHub <noreply@github.com>2022-01-20 17:36:11 +0100
commite00545978158ced5bacf8fede365efd0d690d320 (patch)
treee216a74773fb8de4dc699ef135c2e2cd564eba97 /tests
parent9363c34934f94124f4867caf1bdf8f6755201ccd (diff)
downloadastroid-git-e00545978158ced5bacf8fede365efd0d690d320.tar.gz
Add support for attrs v21.3.0+ (#1331)
* Add support for attrs v21.3.0+ Since version [21.3.0](https://github.com/python-attrs/attrs/releases/tag/21.3.0) you can now `import attrs` instead of just `import attr`. This patch adds support so that astroid doesn't barf on classes created using `@attrs.define`. Co-authored-by: Daniƫl van Noord <13665637+DanielNoord@users.noreply.github.com> Co-authored-by: Pierre Sassoulas <pierre.sassoulas@gmail.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/unittest_brain.py67
1 files changed, 67 insertions, 0 deletions
diff --git a/tests/unittest_brain.py b/tests/unittest_brain.py
index 71cee383..7dfbdff2 100644
--- a/tests/unittest_brain.py
+++ b/tests/unittest_brain.py
@@ -2211,6 +2211,73 @@ class AttrsTest(unittest.TestCase):
should_be_unknown = next(module.getattr(name)[0].infer()).getattr("d")[0]
self.assertIsInstance(should_be_unknown, astroid.Unknown)
+ def test_attrs_transform(self) -> None:
+ """Test brain for decorators of the 'attrs' package.
+
+ Package added support for 'attrs' a long side 'attr' in v21.3.0.
+ See: https://github.com/python-attrs/attrs/releases/tag/21.3.0
+ """
+ module = astroid.parse(
+ """
+ import attrs
+ from attrs import field, mutable, frozen
+
+ @attrs.define
+ class Foo:
+
+ d = attrs.field(attrs.Factory(dict))
+
+ f = Foo()
+ f.d['answer'] = 42
+
+ @attrs.define(slots=True)
+ class Bar:
+ d = field(attrs.Factory(dict))
+
+ g = Bar()
+ g.d['answer'] = 42
+
+ @attrs.mutable
+ class Bah:
+ d = field(attrs.Factory(dict))
+
+ h = Bah()
+ h.d['answer'] = 42
+
+ @attrs.frozen
+ class Bai:
+ d = attrs.field(attrs.Factory(dict))
+
+ i = Bai()
+ i.d['answer'] = 42
+
+ @attrs.define
+ class Spam:
+ d = field(default=attrs.Factory(dict))
+
+ j = Spam(d=1)
+ j.d['answer'] = 42
+
+ @attrs.mutable
+ class Eggs:
+ d = attrs.field(default=attrs.Factory(dict))
+
+ k = Eggs(d=1)
+ k.d['answer'] = 42
+
+ @attrs.frozen
+ class Eggs:
+ d = attrs.field(default=attrs.Factory(dict))
+
+ l = Eggs(d=1)
+ l.d['answer'] = 42
+ """
+ )
+
+ for name in ("f", "g", "h", "i", "j", "k", "l"):
+ should_be_unknown = next(module.getattr(name)[0].infer()).getattr("d")[0]
+ self.assertIsInstance(should_be_unknown, astroid.Unknown)
+
def test_special_attributes(self) -> None:
"""Make sure special attrs attributes exist"""