Skip to content

Commit f83f45e

Browse files
committed
Don't remove annotations on NamedTuples
1 parent 8112398 commit f83f45e

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed

src/python_minifier/transforms/remove_annotations.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,25 @@ def is_dataclass_field(node):
7373

7474
return False
7575

76-
if is_dataclass_field(node):
76+
def is_named_tuple(node):
77+
if sys.version_info < (3, 5):
78+
return False
79+
80+
if not isinstance(node.parent, ast.ClassDef):
81+
return False
82+
83+
if len(node.parent.bases) == 0:
84+
return False
85+
86+
for node in node.parent.bases:
87+
if isinstance(node, ast.Name) and node.id == 'NamedTuple':
88+
return True
89+
elif isinstance(node, ast. Attribute) and node.attr == 'NamedTuple':
90+
return True
91+
92+
return False
93+
94+
if is_dataclass_field(node) or is_named_tuple(node):
7795
return node
7896
elif node.value:
7997
return self.add_child(ast.Assign([node.target], node.value), parent=node.parent)

test/test_remove_annotations.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,53 @@ class MyClass:
107107
expected_ast = ast.parse(expected)
108108
actual_ast = remove_annotations(source)
109109
compare_ast(expected_ast, actual_ast)
110+
111+
112+
def test_no_remove_namedtuple():
113+
if sys.version_info < (3, 6):
114+
pytest.skip('annotations unavailable in python < 3.6')
115+
116+
source = '''
117+
class MyClass(NamedTuple):
118+
myfield: int
119+
mysecondfile: str
120+
121+
class MyClass2(typing.NamedTuple):
122+
myfield: int
123+
mysecondfile: str
124+
125+
class MyClass2(blah.NamedTuple):
126+
myfield: int
127+
mysecondfile: str
128+
'''
129+
expected = source
130+
131+
expected_ast = ast.parse(expected)
132+
actual_ast = remove_annotations(source)
133+
compare_ast(expected_ast, actual_ast)
134+
135+
def test_remove():
136+
if sys.version_info < (3, 6):
137+
pytest.skip('annotations unavailable in python < 3.6')
138+
139+
source = '''
140+
class Dummy(NermedTupel):
141+
myfield: int
142+
mysecondfile: str
143+
144+
class Dummy(typing.NermedTupel):
145+
myfield: int
146+
mysecondfile: str
147+
'''
148+
expected = '''
149+
class Dummy(NermedTupel):
150+
myfield: 0
151+
mysecondfile: 0
152+
153+
class Dummy(typing.NermedTupel):
154+
myfield: 0
155+
mysecondfile: 0
156+
'''
157+
expected_ast = ast.parse(expected)
158+
actual_ast = remove_annotations(source)
159+
compare_ast(expected_ast, actual_ast)

0 commit comments

Comments
 (0)