Skip to content

Commit e570c24

Browse files
committed
Fix for python2.7
listcomp leaks the target and async isn't a thing
1 parent a7760a8 commit e570c24

File tree

2 files changed

+48
-11
lines changed

2 files changed

+48
-11
lines changed

src/python_minifier/transforms/remove_explicit_return_none.py

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,35 @@
44
from python_minifier.transforms.suite_transformer import SuiteTransformer
55
from python_minifier.util import is_ast_node
66

7+
78
class RemoveExplicitReturnNone(SuiteTransformer):
89
def __call__(self, node):
910
return self.visit(node)
1011

1112
def visit_Return(self, node):
1213
assert isinstance(node, ast.Return)
1314

14-
# Remove an explicit `return None`
15+
# Transform `return None` -> `return`
1516

16-
if sys.version_info < (3, 4) and is_ast_node(node.value, 'Name') and node.value.id == 'None':
17-
# explicit return None
17+
if sys.version_info < (3, 4) and isinstance(node.value, ast.Name) and node.value.id == 'None':
1818
node.value = None
1919

2020
elif sys.version_info >= (3, 4) and is_ast_node(node.value, 'NameConstant') and node.value.value is None:
21-
# explicit return None
2221
node.value = None
2322

2423
return node
2524

2625
def visit_FunctionDef(self, node):
2726
assert is_ast_node(node, (ast.FunctionDef, 'AsyncFunctionDef'))
2827

29-
node.body = [self.visit(node) for node in node.body]
30-
31-
# Remove an explicit `return` from the end of a function
28+
node.body = [self.visit(a) for a in node.body]
3229

30+
# Remove an explicit valueless `return` from the end of a function
3331
if len(node.body) > 0 and isinstance(node.body[-1], ast.Return) and node.body[-1].value is None:
34-
# explicit return None
3532
node.body.pop()
3633

34+
# Replace empty suites with `0` expression statements
3735
if len(node.body) == 0:
3836
node.body = [self.add_child(ast.Expr(value=ast.Num(0)), parent=node)]
3937

4038
return node
41-
42-
def visit_AsyncFunctionDef(self, node):
43-
return self.visit_FunctionDef(node)

test/test_remove_explicit_return_none.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
import ast
2+
import sys
3+
4+
import pytest
5+
26
from python_minifier import unparse
37
from python_minifier.ast_compare import compare_ast
48
from python_minifier.transforms.remove_explicit_return_none import RemoveExplicitReturnNone
@@ -9,6 +13,7 @@ def remove_return_none(source):
913

1014
return RemoveExplicitReturnNone()(module)
1115

16+
1217
def test_trailing_remove_return_none():
1318
source = 'def a():a=4;return None'
1419
expected = 'def a():a=4'
@@ -19,6 +24,7 @@ def test_trailing_remove_return_none():
1924

2025
assert unparse(actual_ast) == expected
2126

27+
2228
def test_trailing_implicit_return_none():
2329
source = 'def a():a=4;return'
2430
expected = 'def a():a=4'
@@ -38,6 +44,7 @@ def test_trailing_remove_return_none_empty_suite():
3844

3945
assert unparse(actual_ast) == expected
4046

47+
4148
def test_trailing_implicit_return_none_empty_suite():
4249
source = 'def a():return'
4350
expected = 'def a():0'
@@ -46,6 +53,7 @@ def test_trailing_implicit_return_none_empty_suite():
4653
compare_ast(expected_ast, actual_ast)
4754
assert unparse(actual_ast) == expected
4855

56+
4957
def test_trailing_return_value_unchanged():
5058
source = 'def a():return 0'
5159
expected = source
@@ -54,6 +62,7 @@ def test_trailing_return_value_unchanged():
5462
compare_ast(expected_ast, actual_ast)
5563
assert unparse(actual_ast) == expected
5664

65+
5766
def test_remove_return_none():
5867
source = '''
5968
def a():
@@ -68,6 +77,7 @@ def a():
6877

6978
assert unparse(actual_ast) == expected
7079

80+
7181
def test_implicit_return_none():
7282
source = '''
7383
def a():
@@ -80,6 +90,7 @@ def a():
8090
compare_ast(expected_ast, actual_ast)
8191
assert unparse(actual_ast) == expected
8292

93+
8394
def test_return_value_unchanged():
8495
source = '''
8596
def a():
@@ -92,7 +103,11 @@ def a():
92103
compare_ast(expected_ast, actual_ast)
93104
assert unparse(actual_ast) == expected
94105

106+
95107
def test_async_trailing_remove_return_none():
108+
if sys.version_info < (3, 5):
109+
pytest.skip('Async not allowed in python < 3.5')
110+
96111
source = 'async def a():a=4;return None'
97112
expected = 'async def a():a=4'
98113

@@ -102,7 +117,11 @@ def test_async_trailing_remove_return_none():
102117

103118
assert unparse(actual_ast) == expected
104119

120+
105121
def test_async_trailing_implicit_return_none():
122+
if sys.version_info < (3, 5):
123+
pytest.skip('Async not allowed in python < 3.5')
124+
106125
source = 'async def a():a=4;return'
107126
expected = 'async def a():a=4'
108127
expected_ast = ast.parse(expected)
@@ -112,6 +131,9 @@ def test_async_trailing_implicit_return_none():
112131

113132

114133
def test_async_trailing_remove_return_none_empty_suite():
134+
if sys.version_info < (3, 5):
135+
pytest.skip('Async not allowed in python < 3.5')
136+
115137
source = 'async def a():return None'
116138
expected = 'async def a():0'
117139

@@ -121,23 +143,35 @@ def test_async_trailing_remove_return_none_empty_suite():
121143

122144
assert unparse(actual_ast) == expected
123145

146+
124147
def test_async_trailing_implicit_return_none_empty_suite():
148+
if sys.version_info < (3, 5):
149+
pytest.skip('Async not allowed in python < 3.5')
150+
125151
source = 'async def a():return'
126152
expected = 'async def a():0'
127153
expected_ast = ast.parse(expected)
128154
actual_ast = remove_return_none(source)
129155
compare_ast(expected_ast, actual_ast)
130156
assert unparse(actual_ast) == expected
131157

158+
132159
def test_async_trailing_return_value_unchanged():
160+
if sys.version_info < (3, 5):
161+
pytest.skip('Async not allowed in python < 3.5')
162+
133163
source = 'async def a():return 0'
134164
expected = source
135165
expected_ast = ast.parse(expected)
136166
actual_ast = remove_return_none(source)
137167
compare_ast(expected_ast, actual_ast)
138168
assert unparse(actual_ast) == expected
139169

170+
140171
def test_async_remove_return_none():
172+
if sys.version_info < (3, 5):
173+
pytest.skip('Async not allowed in python < 3.5')
174+
141175
source = '''
142176
async def a():
143177
if a: return None
@@ -151,7 +185,11 @@ async def a():
151185

152186
assert unparse(actual_ast) == expected
153187

188+
154189
def test_async_implicit_return_none():
190+
if sys.version_info < (3, 5):
191+
pytest.skip('Async not allowed in python < 3.5')
192+
155193
source = '''
156194
async def a():
157195
if a: return
@@ -163,7 +201,11 @@ async def a():
163201
compare_ast(expected_ast, actual_ast)
164202
assert unparse(actual_ast) == expected
165203

204+
166205
def test_async_return_value_unchanged():
206+
if sys.version_info < (3, 5):
207+
pytest.skip('Async not allowed in python < 3.5')
208+
167209
source = '''
168210
async def a():
169211
if a: return 1

0 commit comments

Comments
 (0)