Skip to content

Commit

Permalink
Don't transform dataclass ClassVars (#914)
Browse files Browse the repository at this point in the history
Co-authored-by: Pierre Sassoulas <pierre.sassoulas@gmail.com>
  • Loading branch information
cdce8p and Pierre-Sassoulas committed Feb 28, 2021
1 parent 0f8e233 commit 5f2cfb8
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 0 deletions.
2 changes: 2 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ Release Date: TBA

Closes #895 #899

* Don't transform dataclass ClassVars

* Improve typing.TypedDict inference


Expand Down
12 changes: 12 additions & 0 deletions astroid/brain/brain_dataclasses.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,18 @@ def dataclass_transform(node):
if not isinstance(assign_node, (astroid.AnnAssign, astroid.Assign)):
continue

if (
isinstance(assign_node, astroid.AnnAssign)
and isinstance(assign_node.annotation, astroid.Subscript)
and (
isinstance(assign_node.annotation.value, astroid.Name)
and assign_node.annotation.value.name == "ClassVar"
or isinstance(assign_node.annotation.value, astroid.Attribute)
and assign_node.annotation.value.attrname == "ClassVar"
)
):
continue

targets = (
assign_node.targets
if hasattr(assign_node, "targets")
Expand Down
12 changes: 12 additions & 0 deletions tests/unittest_brain.py
Original file line number Diff line number Diff line change
Expand Up @@ -2108,6 +2108,8 @@ def test_dataclasses():
code = """
import dataclasses
from dataclasses import dataclass
import typing
from typing import ClassVar
@dataclass
class InventoryItem:
Expand All @@ -2117,6 +2119,8 @@ class InventoryItem:
@dataclasses.dataclass
class Other:
name: str
CONST_1: ClassVar[int] = 42
CONST_2: typing.ClassVar[int] = 42
"""

module = astroid.parse(code)
Expand All @@ -2135,6 +2139,14 @@ class Other:
assert len(name) == 1
assert isinstance(name[0], astroid.Unknown)

const_1 = second.getattr("CONST_1")
assert len(const_1) == 1
assert isinstance(const_1[0], astroid.AssignName)

const_2 = second.getattr("CONST_2")
assert len(const_2) == 1
assert isinstance(const_2[0], astroid.AssignName)


@pytest.mark.parametrize(
"code,expected_class,expected_value",
Expand Down

0 comments on commit 5f2cfb8

Please sign in to comment.