From 860644f40ea4dcb3e8a3c4cc4fb33e85af1613de Mon Sep 17 00:00:00 2001 From: Nicolas Noirbent Date: Thu, 23 Dec 2021 19:24:56 +0100 Subject: [PATCH] Fix dataclass inference for marshmallow_dataclass (#1298) --- ChangeLog | 3 +++ astroid/brain/brain_dataclasses.py | 9 +++++++-- tests/unittest_brain_dataclasses.py | 4 +++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8ddaae2ae7..5bfa2f6856 100644 --- a/ChangeLog +++ b/ChangeLog @@ -33,6 +33,9 @@ Release date: TBA Closes PyCQA/pylint#5461 +* Enable inference of dataclass import from marshmallow_dataclass. + This allows the dataclasses brain to recognize dataclasses annotated by marshmallow_dataclass. + What's New in astroid 2.9.0? ============================ diff --git a/astroid/brain/brain_dataclasses.py b/astroid/brain/brain_dataclasses.py index 6ea145117a..a05c46f9b6 100644 --- a/astroid/brain/brain_dataclasses.py +++ b/astroid/brain/brain_dataclasses.py @@ -3,9 +3,12 @@ """ Astroid hook for the dataclasses library -Support both built-in dataclasses and pydantic.dataclasses. References: +Support built-in dataclasses, pydantic.dataclasses, and marshmallow_dataclass-annotated +dataclasses. References: - https://docs.python.org/3/library/dataclasses.html - https://pydantic-docs.helpmanual.io/usage/dataclasses/ +- https://lovasoa.github.io/marshmallow_dataclass/ + """ from typing import FrozenSet, Generator, List, Optional, Tuple @@ -35,7 +38,9 @@ DATACLASSES_DECORATORS = frozenset(("dataclass",)) FIELD_NAME = "field" -DATACLASS_MODULES = frozenset(("dataclasses", "pydantic.dataclasses")) +DATACLASS_MODULES = frozenset( + ("dataclasses", "marshmallow_dataclass", "pydantic.dataclasses") +) DEFAULT_FACTORY = "_HAS_DEFAULT_FACTORY" # based on typing.py diff --git a/tests/unittest_brain_dataclasses.py b/tests/unittest_brain_dataclasses.py index 237d54aecd..2054aebd62 100644 --- a/tests/unittest_brain_dataclasses.py +++ b/tests/unittest_brain_dataclasses.py @@ -11,7 +11,7 @@ parametrize_module = pytest.mark.parametrize( - ("module",), (["dataclasses"], ["pydantic.dataclasses"]) + ("module",), (["dataclasses"], ["pydantic.dataclasses"], ["marshmallow_dataclass"]) ) @@ -304,6 +304,8 @@ class A: ("dataclasses", "typing"), ("pydantic.dataclasses", "typing"), ("pydantic.dataclasses", "collections.abc"), + ("marshmallow_dataclass", "typing"), + ("marshmallow_dataclass", "collections.abc"), ], ) def test_inference_callable_attribute(module: str, typing_module: str):