Skip to content

Commit 7430738

Browse files
committed
Add is_ast_node
1 parent 892d0f5 commit 7430738

13 files changed

Lines changed: 91 additions & 102 deletions

src/python_minifier/ast_compare.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import ast
22

3+
from python_minifier.util import is_ast_node
4+
35

46
class CompareError(RuntimeError):
57
"""
@@ -16,9 +18,7 @@ def __repr__(self):
1618

1719
def namespace(self, node):
1820
if hasattr(node, 'namespace'):
19-
if isinstance(node.namespace, (ast.FunctionDef, ast.ClassDef)) or (
20-
hasattr(ast, 'AsyncFunctionDef') and isinstance(node.namespace, ast.AsyncFunctionDef)
21-
):
21+
if is_ast_node(node.namespace, (ast.FunctionDef, ast.ClassDef, 'AsyncFunctionDef')):
2222
return self.namespace(node.namespace) + '.' + node.namespace.name
2323
elif isinstance(node.namespace, ast.Module):
2424
return ''

src/python_minifier/expression_printer.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import ast
22
import sys
33

4+
from python_minifier.util import is_ast_node
5+
46

57
class ExpressionPrinter(object):
68
"""
@@ -691,27 +693,27 @@ def visit_Expression(self, node):
691693
self._expression(node.body)
692694

693695
def _expression(self, expression):
694-
if isinstance(expression, ast.Yield) or (hasattr(ast, 'YieldFrom') and isinstance(expression, ast.YieldFrom)):
696+
if is_ast_node(expression, (ast.Yield, 'YieldFrom')):
695697
self.code += '('
696698
self._yield_expr(expression)
697699
self.code += ')'
698700
elif isinstance(expression, ast.Tuple) and len(expression.elts) > 0:
699701
self.code += '('
700702
self.visit_Tuple(expression)
701703
self.code += ')'
702-
elif hasattr(ast, 'NamedExpr') and isinstance(expression, ast.NamedExpr):
704+
elif is_ast_node(expression, 'NamedExpr'):
703705
self.code += '('
704706
self.visit_NamedExpr(expression)
705707
self.code += ')'
706708
else:
707709
self.visit(expression)
708710

709711
def _testlist(self, test):
710-
if isinstance(test, ast.Yield) or (hasattr(ast, 'YieldFrom') and isinstance(test, ast.YieldFrom)):
712+
if is_ast_node(test, (ast.Yield, 'YieldFrom')):
711713
self.code += '('
712714
self._yield_expr(test)
713715
self.code += ')'
714-
elif hasattr(ast, 'NamedExpr') and isinstance(test, ast.NamedExpr):
716+
elif is_ast_node(test, 'NamedExpr'):
715717
self.code += '('
716718
self.visit_NamedExpr(test)
717719
self.code += ')'

src/python_minifier/f_string.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from python_minifier.ast_compare import compare_ast
1515
from python_minifier.expression_printer import ExpressionPrinter
1616
from python_minifier.ministring import MiniString
17-
from python_minifier.rename.util import is_str
17+
from python_minifier.util import is_ast_node
1818

1919

2020
class FString(object):
@@ -44,7 +44,7 @@ def candidates(self):
4444
nested_allowed = copy.copy(self.allowed_quotes)
4545
nested_allowed.remove(quote)
4646
for v in self.node.values:
47-
if is_str(v):
47+
if is_ast_node(v, ast.Str):
4848
try:
4949
candidates = [x + self.str_for(v.s, quote) for x in candidates]
5050
except Exception as e:
@@ -293,7 +293,7 @@ def candidates(self):
293293

294294
candidates = ['']
295295
for v in self.node.values:
296-
if is_str(v):
296+
if is_ast_node(v, ast.Str):
297297
candidates = [x + self.str_for(v.s) for x in candidates]
298298
elif isinstance(v, ast.FormattedValue):
299299
candidates = [

src/python_minifier/module_printer.py

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import sys
33

44
from .expression_printer import ExpressionPrinter
5+
from .util import is_ast_node
56

67

78
class ModulePrinter(ExpressionPrinter):
@@ -64,9 +65,7 @@ def visit_Exec(self, node):
6465
def visit_Expr(self, node):
6566
assert isinstance(node, ast.Expr)
6667

67-
if isinstance(node.value, ast.Yield):
68-
self._yield_expr(node.value)
69-
elif hasattr(ast, 'YieldFrom') and isinstance(node.value, ast.YieldFrom):
68+
if is_ast_node(node.value, (ast.Yield, 'YieldFrom')):
7069
self._yield_expr(node.value)
7170
else:
7271
self._testlist(node.value)
@@ -95,9 +94,7 @@ def visit_Assign(self, node):
9594
self.code += '='
9695

9796
# Yield nodes that are the sole node on the right hand side of an assignment do not need parens
98-
if isinstance(node.value, ast.Yield):
99-
self._yield_expr(node.value)
100-
elif hasattr(ast, 'YieldFrom') and isinstance(node.value, ast.YieldFrom):
97+
if is_ast_node(node.value, (ast.Yield, 'YieldFrom')):
10198
self._yield_expr(node.value)
10299
else:
103100
self._testlist(node.value)
@@ -112,9 +109,7 @@ def visit_AugAssign(self, node):
112109
self.code += '='
113110

114111
# Yield nodes that are the sole node on the right hand side of an assignment do not need parens
115-
if isinstance(node.value, ast.Yield):
116-
self._yield_expr(node.value)
117-
elif hasattr(ast, 'YieldFrom') and isinstance(node.value, ast.YieldFrom):
112+
if is_ast_node(node.value, (ast.Yield, 'YieldFrom')):
118113
self._yield_expr(node.value)
119114
else:
120115
self._testlist(node.value)
@@ -162,7 +157,7 @@ def visit_Return(self, node):
162157
self.token_break()
163158
self.code += 'return'
164159
if isinstance(node.value, ast.Tuple):
165-
if sys.version_info < (3, 8) and hasattr(ast, 'Starred') and [n for n in node.value.elts if isinstance(n, ast.Starred)]:
160+
if sys.version_info < (3, 8) and [n for n in node.value.elts if is_ast_node(n, 'Starred')]:
166161
self.code += '('
167162
self._testlist(node.value)
168163
self.code += ')'

src/python_minifier/rename/binding.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import ast
22

33
from python_minifier.rename.util import arg_rename_in_place, insert
4+
from python_minifier.util import is_ast_node
45

56

67
class Binding(object):
@@ -209,9 +210,7 @@ def rename(self, new_name):
209210
)
210211
)
211212

212-
elif isinstance(node, ast.FunctionDef) or (
213-
hasattr(ast, 'AsyncFunctionDef') and isinstance(node, ast.AsyncFunctionDef)
214-
):
213+
elif is_ast_node(node, (ast.FunctionDef, 'AsyncFunctionDef')):
215214
node.name = new_name
216215
elif isinstance(node, ast.ClassDef):
217216
node.name = new_name
@@ -220,7 +219,7 @@ def rename(self, new_name):
220219
node.asname = None
221220
else:
222221
node.asname = new_name
223-
elif hasattr(ast, 'arg') and isinstance(node, ast.arg):
222+
elif is_ast_node(node, 'arg'):
224223

225224
if arg_rename_in_place(node):
226225
node.arg = new_name
@@ -238,7 +237,7 @@ def rename(self, new_name):
238237

239238
elif isinstance(node, ast.ExceptHandler):
240239
node.name = new_name
241-
elif isinstance(node, ast.Global) or (hasattr(ast, 'Nonlocal') and isinstance(node, ast.Nonlocal)):
240+
elif is_ast_node(node, (ast.Global, 'Nonlocal')):
242241
node.names = [new_name if n == self._name else n for n in node.names]
243242
elif isinstance(node, ast.arguments):
244243

src/python_minifier/rename/mapper.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import ast
66

77
from python_minifier.rename.util import is_namespace
8+
from python_minifier.util import is_ast_node
89

910

1011
def add_parent_to_arguments(arguments, func):
@@ -111,9 +112,7 @@ def add_parent(node, parent=None, namespace=None):
111112
node.global_names = set()
112113
node.nonlocal_names = set()
113114

114-
if isinstance(node, ast.FunctionDef) or (
115-
hasattr(ast, 'AsyncFunctionDef') and isinstance(node, ast.AsyncFunctionDef)
116-
):
115+
if is_ast_node(node, (ast.FunctionDef, 'AsyncFunctionDef')):
117116
add_parent_to_functiondef(node)
118117
elif isinstance(node, ast.Lambda):
119118
add_parent_to_arguments(node.args, func=node)
@@ -135,7 +134,7 @@ def add_parent(node, parent=None, namespace=None):
135134

136135
if isinstance(node, ast.Global):
137136
namespace.global_names.update(node.names)
138-
if hasattr(ast, 'Nonlocal') and isinstance(node, ast.Nonlocal):
137+
if is_ast_node(node, 'Nonlocal'):
139138
namespace.nonlocal_names.update(node.names)
140139

141140
for child in ast.iter_child_nodes(node):

src/python_minifier/rename/rename_literals.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import ast
22

33
from python_minifier.rename.binding import Binding
4-
from python_minifier.rename.util import insert, is_str
4+
from python_minifier.rename.util import insert
55
from python_minifier.transforms.suite_transformer import NodeVisitor
6+
from python_minifier.util import is_ast_node
67

78

89
def replace(old_node, new_node):
@@ -42,7 +43,7 @@ def set_local_namespace(self, node):
4243

4344
@property
4445
def value(self):
45-
if is_str(self._value_node) or (hasattr(ast, 'Bytes') and isinstance(self._value_node, ast.Bytes)):
46+
if is_ast_node(self._value_node, (ast.Str, 'Bytes')):
4647
return self._value_node.s
4748
else:
4849
return self._value_node.value
@@ -118,9 +119,7 @@ def nearest_function_namespace(self, node):
118119
119120
"""
120121

121-
if isinstance(node.namespace, (ast.FunctionDef, ast.Module)):
122-
return node.namespace
123-
if hasattr(ast, 'AsyncFunctionDef') and isinstance(node.namespace, ast.AsyncFunctionDef):
122+
if is_ast_node(node.namespace, (ast.FunctionDef, ast.Module, 'AsyncFunctionDef')):
124123
return node.namespace
125124
return self.nearest_function_namespace(node.namespace)
126125

@@ -201,7 +200,7 @@ def visit_Bytes(self, node):
201200

202201
def visit_JoinedStr(self, node):
203202
for v in node.values:
204-
if is_str(v):
203+
if is_ast_node(v, ast.Str):
205204
# Can't hoist this!
206205
continue
207206
else:

src/python_minifier/rename/resolve_names.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from python_minifier.rename.binding import BuiltinBinding, NameBinding
44
from python_minifier.rename.util import get_global_namespace, get_nonlocal_namespace, builtins
5+
from python_minifier.util import is_ast_node
56

67

78
def get_binding(name, namespace):
@@ -45,7 +46,7 @@ def resolve_names(node):
4546

4647
if isinstance(node, ast.Name) and isinstance(node.ctx, ast.Load):
4748
get_binding(node.id, node.namespace).add_reference(node)
48-
elif hasattr(ast, 'Exec') and isinstance(node, ast.Exec):
49+
elif is_ast_node(node, 'Exec'):
4950
get_global_namespace(node).tainted = True
5051

5152
for child in ast.iter_child_nodes(node):

src/python_minifier/rename/util.py

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import ast
22
import sys
33

4+
from python_minifier.util import is_ast_node
5+
46

57
def create_is_namespace():
68

@@ -113,7 +115,7 @@ def insert(suite, new_node):
113115

114116
if not inserted:
115117
if (isinstance(node, ast.ImportFrom) and node.module == '__future__') or (
116-
isinstance(node, ast.Expr) and is_str(node.value)
118+
isinstance(node, ast.Expr) and is_ast_node(node.value, ast.Str)
117119
):
118120
pass
119121
else:
@@ -152,7 +154,7 @@ def is_assign_all_node(node):
152154
if isinstance(name, ast.Name) and name.id == '__all__':
153155
return True
154156

155-
elif isinstance(node, ast.AugAssign) or (hasattr(ast, 'AnnAssign') and isinstance(node, ast.AnnAssign)):
157+
elif is_ast_node(node, (ast.AugAssign, 'AnnAssign')):
156158
if isinstance(node.target, ast.Name) and node.target.id == '__all__':
157159
return True
158160

@@ -166,7 +168,7 @@ def is_assign_all_node(node):
166168
continue
167169

168170
for el in node.value.elts:
169-
if is_str(el):
171+
if is_ast_node(el, ast.Str):
170172
names.append(el.s)
171173

172174
return names
@@ -184,18 +186,8 @@ def allow_rename_globals(module, rename_globals=False, preserve_globals=None):
184186
binding.disallow_rename()
185187

186188

187-
def is_str(node):
188-
if isinstance(node, ast.Str):
189-
return True
190-
191-
if hasattr(ast, 'Constant') and isinstance(node, ast.Constant):
192-
if isinstance(node.value, str):
193-
return True
194-
195-
return False
196-
197-
198189
try:
199190
import builtins
200191
except ImportError:
192+
# noinspection PyCompatibility
201193
import __builtin__ as builtins

src/python_minifier/transforms/remove_literal_statements.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import ast
22

33
from python_minifier.transforms.suite_transformer import SuiteTransformer
4+
from python_minifier.util import is_ast_node
45

56

67
def find_doc(node):
@@ -46,7 +47,7 @@ def is_literal_statement(self, node):
4647
if not isinstance(node, ast.Expr):
4748
return False
4849

49-
return self.is_node(node.value, (ast.Num, ast.Str, 'NameConstant', 'Bytes'))
50+
return is_ast_node(node.value, (ast.Num, ast.Str, 'NameConstant', 'Bytes'))
5051

5152
def suite(self, node_list, parent):
5253
without_literals = [self.visit(n) for n in node_list if not self.is_literal_statement(n)]

0 commit comments

Comments
 (0)