diff options
author | Jacob Bogdanov <jacob@bogdanov.dev> | 2022-01-20 11:36:11 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-20 17:36:11 +0100 |
commit | e00545978158ced5bacf8fede365efd0d690d320 (patch) | |
tree | e216a74773fb8de4dc699ef135c2e2cd564eba97 /tests | |
parent | 9363c34934f94124f4867caf1bdf8f6755201ccd (diff) | |
download | astroid-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.py | 67 |
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""" |