python-minifier 3.1.0__tar.gz → 3.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {python_minifier-3.1.0/src/python_minifier.egg-info → python_minifier-3.1.1}/PKG-INFO +2 -2
- {python_minifier-3.1.0 → python_minifier-3.1.1}/README.md +1 -1
- {python_minifier-3.1.0 → python_minifier-3.1.1}/setup.py +1 -1
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/ast_compare.py +1 -1
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/ast_compat.py +1 -1
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/expression_printer.py +2 -2
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/module_printer.py +4 -4
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/renamer.py +1 -1
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/token_printer.py +1 -1
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_debug.py +28 -8
- {python_minifier-3.1.0 → python_minifier-3.1.1/src/python_minifier.egg-info}/PKG-INFO +2 -2
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/ast_annotation/test_add_parent.py +2 -2
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/conftest.py +1 -1
- python_minifier-3.1.1/test/subprocess_compat.py +37 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_best_effort_cli.py +40 -40
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_bind_names_python33.py +25 -25
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_fstring.py +5 -5
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_is_constant_node.py +6 -6
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_raw_fstring_backslash.py +2 -2
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_raw_tstring_backslash.py +3 -3
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_remove_debug.py +58 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_template_strings.py +16 -16
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_tuple_with_bug.py +1 -1
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_utf8_encoding.py +2 -2
- python_minifier-3.1.0/test/subprocess_compat.py +0 -38
- {python_minifier-3.1.0 → python_minifier-3.1.1}/LICENSE +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/MANIFEST.in +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/setup.cfg +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/__init__.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/__init__.pyi +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/__main__.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/ast_annotation/__init__.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/ast_printer.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/f_string.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/ministring.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/py.typed +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/README.md +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/__init__.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/bind_names.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/binding.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/mapper.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/name_generator.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/rename_literals.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/resolve_names.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/util.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/t_string.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/__init__.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/combine_imports.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/constant_folding.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_annotations.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_annotations_options.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_annotations_options.pyi +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_asserts.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_exception_brackets.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_explicit_return_none.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_literal_statements.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_object_base.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_pass.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_posargs.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/suite_transformer.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/util.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier.egg-info/SOURCES.txt +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier.egg-info/dependency_links.txt +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier.egg-info/entry_points.txt +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier.egg-info/top_level.txt +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier.egg-info/zip-safe +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/helpers.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/requirements.txt +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_assignment_expressions.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_await_fstring.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_bind_names.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_bind_names_namedexpr.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_bind_names_python2.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_bind_names_python312.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_bind_names_python313.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_combine_imports.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_comprehension_rename.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_decorator_expressions.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_dict_expansion.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_folding.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_generic_types.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_hoist_literals.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_import.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_iterable_unpacking.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_match.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_match_rename.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_name_generator.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_nonlocal.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_posargs.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_preserve_shebang.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_remove_annotations.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_remove_assert.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_remove_exception_brackets.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_remove_explicit_return_none.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_remove_literal_statements.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_remove_object.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_remove_pass.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_rename_builtins.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_rename_locals.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_slice.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_type_param_defaults.py +0 -0
- {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_unicode_cli.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python_minifier
|
|
3
|
-
Version: 3.1.
|
|
3
|
+
Version: 3.1.1
|
|
4
4
|
Summary: Transform Python source code into it's most compact representation
|
|
5
5
|
Home-page: https://github.com/dflook/python-minifier
|
|
6
6
|
Author: Daniel Flook
|
|
@@ -160,7 +160,7 @@ and outputs source code compatible with the version of the interpreter it is run
|
|
|
160
160
|
This means that if you minify code written for Python 3.11 using python-minifier running with Python 3.12,
|
|
161
161
|
the minified code may only run with Python 3.12.
|
|
162
162
|
|
|
163
|
-
python-minifier runs with and can minify code written for Python 2.7 and Python 3.3 to 3.
|
|
163
|
+
python-minifier runs with and can minify code written for Python 2.7 and Python 3.3 to 3.14.
|
|
164
164
|
|
|
165
165
|
## Usage
|
|
166
166
|
|
|
@@ -110,7 +110,7 @@ and outputs source code compatible with the version of the interpreter it is run
|
|
|
110
110
|
This means that if you minify code written for Python 3.11 using python-minifier running with Python 3.12,
|
|
111
111
|
the minified code may only run with Python 3.12.
|
|
112
112
|
|
|
113
|
-
python-minifier runs with and can minify code written for Python 2.7 and Python 3.3 to 3.
|
|
113
|
+
python-minifier runs with and can minify code written for Python 2.7 and Python 3.3 to 3.14.
|
|
114
114
|
|
|
115
115
|
## Usage
|
|
116
116
|
|
|
@@ -301,8 +301,8 @@ class ExpressionPrinter(object):
|
|
|
301
301
|
|
|
302
302
|
if value_precedence != 0 and (
|
|
303
303
|
(op_precedence > value_precedence)
|
|
304
|
-
or op_precedence == value_precedence
|
|
305
|
-
|
|
304
|
+
or (op_precedence == value_precedence
|
|
305
|
+
and self._is_left_associative(node.op))
|
|
306
306
|
):
|
|
307
307
|
self.printer.delimiter('(')
|
|
308
308
|
self._expression(v)
|
|
@@ -596,7 +596,7 @@ class ModulePrinter(ExpressionPrinter):
|
|
|
596
596
|
self.printer.keyword('case')
|
|
597
597
|
|
|
598
598
|
if isinstance(node.pattern, ast.MatchSequence):
|
|
599
|
-
self.visit_MatchSequence(node.pattern,
|
|
599
|
+
self.visit_MatchSequence(node.pattern, omit_brackets=True)
|
|
600
600
|
else:
|
|
601
601
|
self.pattern(node.pattern)
|
|
602
602
|
|
|
@@ -626,10 +626,10 @@ class ModulePrinter(ExpressionPrinter):
|
|
|
626
626
|
else:
|
|
627
627
|
self.printer.identifier(node.name)
|
|
628
628
|
|
|
629
|
-
def visit_MatchSequence(self, node,
|
|
629
|
+
def visit_MatchSequence(self, node, omit_brackets=False):
|
|
630
630
|
assert isinstance(node, ast.MatchSequence)
|
|
631
631
|
|
|
632
|
-
if len(node.patterns) < 2 or not
|
|
632
|
+
if len(node.patterns) < 2 or not omit_brackets:
|
|
633
633
|
self.printer.delimiter('[')
|
|
634
634
|
|
|
635
635
|
delimiter = Delimiter(self.printer)
|
|
@@ -637,7 +637,7 @@ class ModulePrinter(ExpressionPrinter):
|
|
|
637
637
|
delimiter.new_item()
|
|
638
638
|
self.pattern(pattern)
|
|
639
639
|
|
|
640
|
-
if len(node.patterns) < 2 or not
|
|
640
|
+
if len(node.patterns) < 2 or not omit_brackets:
|
|
641
641
|
self.printer.delimiter(']')
|
|
642
642
|
|
|
643
643
|
def visit_MatchMapping(self, node):
|
{python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_debug.py
RENAMED
|
@@ -27,18 +27,38 @@ class RemoveDebug(SuiteTransformer):
|
|
|
27
27
|
if not isinstance(node, ast.If):
|
|
28
28
|
return False
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
def is_simple_debug_check():
|
|
31
|
+
# Simple case: if __debug__:
|
|
32
|
+
if isinstance(node.test, ast.Name) and node.test.id == '__debug__':
|
|
33
|
+
return True
|
|
34
|
+
return False
|
|
32
35
|
|
|
33
|
-
|
|
34
|
-
|
|
36
|
+
def is_truthy_debug_comparison():
|
|
37
|
+
# Comparison case: if __debug__ is True / False / etc.
|
|
38
|
+
if not isinstance(node.test, ast.Compare):
|
|
39
|
+
return False
|
|
35
40
|
|
|
36
|
-
|
|
37
|
-
|
|
41
|
+
if not isinstance(node.test.left, ast.Name):
|
|
42
|
+
return False
|
|
38
43
|
|
|
39
|
-
|
|
40
|
-
|
|
44
|
+
if node.test.left.id != '__debug__':
|
|
45
|
+
return False
|
|
41
46
|
|
|
47
|
+
if len(node.test.ops) == 1:
|
|
48
|
+
op = node.test.ops[0]
|
|
49
|
+
comparator_value = self.constant_value(node.test.comparators[0])
|
|
50
|
+
|
|
51
|
+
if isinstance(op, ast.Is) and comparator_value is True:
|
|
52
|
+
return True
|
|
53
|
+
if isinstance(op, ast.IsNot) and comparator_value is False:
|
|
54
|
+
return True
|
|
55
|
+
if isinstance(op, ast.Eq) and comparator_value is True:
|
|
56
|
+
return True
|
|
57
|
+
|
|
58
|
+
return False
|
|
59
|
+
|
|
60
|
+
if is_simple_debug_check() or is_truthy_debug_comparison():
|
|
61
|
+
return True
|
|
42
62
|
return False
|
|
43
63
|
|
|
44
64
|
def suite(self, node_list, parent):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python_minifier
|
|
3
|
-
Version: 3.1.
|
|
3
|
+
Version: 3.1.1
|
|
4
4
|
Summary: Transform Python source code into it's most compact representation
|
|
5
5
|
Home-page: https://github.com/dflook/python-minifier
|
|
6
6
|
Author: Daniel Flook
|
|
@@ -160,7 +160,7 @@ and outputs source code compatible with the version of the interpreter it is run
|
|
|
160
160
|
This means that if you minify code written for Python 3.11 using python-minifier running with Python 3.12,
|
|
161
161
|
the minified code may only run with Python 3.12.
|
|
162
162
|
|
|
163
|
-
python-minifier runs with and can minify code written for Python 2.7 and Python 3.3 to 3.
|
|
163
|
+
python-minifier runs with and can minify code written for Python 2.7 and Python 3.3 to 3.14.
|
|
164
164
|
|
|
165
165
|
## Usage
|
|
166
166
|
|
|
@@ -30,13 +30,13 @@ class A:
|
|
|
30
30
|
def test_no_parent_for_root_node():
|
|
31
31
|
tree = ast.parse('a = 1')
|
|
32
32
|
add_parent(tree)
|
|
33
|
-
with pytest.raises(ValueError):
|
|
33
|
+
with pytest.raises(ValueError, match="Node has no parent"):
|
|
34
34
|
get_parent(tree)
|
|
35
35
|
|
|
36
36
|
|
|
37
37
|
def test_no_parent_for_unannotated_node():
|
|
38
38
|
tree = ast.parse('a = 1')
|
|
39
|
-
with pytest.raises(ValueError):
|
|
39
|
+
with pytest.raises(ValueError, match="Node has no parent"):
|
|
40
40
|
get_parent(tree.body[0])
|
|
41
41
|
|
|
42
42
|
|
|
@@ -3,4 +3,4 @@ import os
|
|
|
3
3
|
|
|
4
4
|
# Set default environment variable to preserve existing test behavior
|
|
5
5
|
# Tests can explicitly unset this if they need to test size-based behavior
|
|
6
|
-
os.environ.setdefault('PYMINIFY_FORCE_BEST_EFFORT', '1')
|
|
6
|
+
os.environ.setdefault('PYMINIFY_FORCE_BEST_EFFORT', '1')
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""Subprocess compatibility utilities for Python 2.7/3.x."""
|
|
2
|
+
import subprocess
|
|
3
|
+
import sys
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def run_subprocess(cmd, timeout=None, input_data=None, env=None):
|
|
7
|
+
"""Cross-platform subprocess runner for Python 2.7+ compatibility."""
|
|
8
|
+
if hasattr(subprocess, 'run'):
|
|
9
|
+
# Python 3.5+ - encode string input to bytes for subprocess
|
|
10
|
+
input_bytes = input_data.encode('utf-8') if isinstance(input_data, str) else input_data
|
|
11
|
+
return subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
|
|
12
|
+
input=input_bytes, timeout=timeout, env=env)
|
|
13
|
+
# Python 2.7, 3.3, 3.4 - no subprocess.run, no timeout support
|
|
14
|
+
popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
|
|
15
|
+
stdin=subprocess.PIPE if input_data else None, env=env)
|
|
16
|
+
# For Python 3.3/3.4, communicate() doesn't support timeout
|
|
17
|
+
# Also, Python 3.x needs bytes for stdin, Python 2.x needs str
|
|
18
|
+
if input_data and sys.version_info[0] >= 3 and isinstance(input_data, str):
|
|
19
|
+
input_data = input_data.encode('utf-8')
|
|
20
|
+
stdout, stderr = popen.communicate(input_data)
|
|
21
|
+
# Create a simple result object similar to subprocess.CompletedProcess
|
|
22
|
+
class Result:
|
|
23
|
+
def __init__(self, returncode, stdout, stderr):
|
|
24
|
+
self.returncode = returncode
|
|
25
|
+
self.stdout = stdout
|
|
26
|
+
self.stderr = stderr
|
|
27
|
+
return Result(popen.returncode, stdout, stderr)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def safe_decode(data, encoding='utf-8', errors='replace'):
|
|
31
|
+
"""Safe decode for Python 2.7/3.x compatibility."""
|
|
32
|
+
if isinstance(data, bytes):
|
|
33
|
+
try:
|
|
34
|
+
return data.decode(encoding, errors)
|
|
35
|
+
except UnicodeDecodeError:
|
|
36
|
+
return data.decode(encoding, 'replace')
|
|
37
|
+
return data
|
|
@@ -17,24 +17,24 @@ def hello_world():
|
|
|
17
17
|
if __name__ == "__main__":
|
|
18
18
|
hello_world()
|
|
19
19
|
'''
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
|
|
22
22
|
f.write(code)
|
|
23
23
|
temp_file = f.name
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
try:
|
|
26
26
|
env = os.environ.copy()
|
|
27
27
|
env.pop('PYMINIFY_FORCE_BEST_EFFORT', None)
|
|
28
|
-
|
|
28
|
+
|
|
29
29
|
result = run_subprocess([
|
|
30
30
|
sys.executable, '-m', 'python_minifier', temp_file
|
|
31
31
|
], timeout=30, env=env)
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
assert result.returncode == 0
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
stdout_text = safe_decode(result.stdout)
|
|
36
36
|
assert len(stdout_text) < len(code)
|
|
37
|
-
|
|
37
|
+
|
|
38
38
|
finally:
|
|
39
39
|
os.unlink(temp_file)
|
|
40
40
|
|
|
@@ -42,24 +42,24 @@ if __name__ == "__main__":
|
|
|
42
42
|
def test_returns_original_when_longer():
|
|
43
43
|
"""Test CLI returns original code when minified output would be longer."""
|
|
44
44
|
code = 'True if 0in x else False'
|
|
45
|
-
|
|
45
|
+
|
|
46
46
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
|
|
47
47
|
f.write(code)
|
|
48
48
|
temp_file = f.name
|
|
49
|
-
|
|
49
|
+
|
|
50
50
|
try:
|
|
51
51
|
env = os.environ.copy()
|
|
52
52
|
env.pop('PYMINIFY_FORCE_BEST_EFFORT', None)
|
|
53
|
-
|
|
53
|
+
|
|
54
54
|
result = run_subprocess([
|
|
55
55
|
sys.executable, '-m', 'python_minifier', temp_file
|
|
56
56
|
], timeout=30, env=env)
|
|
57
|
-
|
|
57
|
+
|
|
58
58
|
assert result.returncode == 0
|
|
59
|
-
|
|
59
|
+
|
|
60
60
|
stdout_text = safe_decode(result.stdout)
|
|
61
61
|
assert stdout_text == code
|
|
62
|
-
|
|
62
|
+
|
|
63
63
|
finally:
|
|
64
64
|
os.unlink(temp_file)
|
|
65
65
|
|
|
@@ -68,24 +68,24 @@ def test_force_minified_with_env_var():
|
|
|
68
68
|
"""Test environment variable forces minified output regardless of size."""
|
|
69
69
|
code = 'True if 0in x else False'
|
|
70
70
|
expected_output = 'True if 0 in x else False'
|
|
71
|
-
|
|
71
|
+
|
|
72
72
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
|
|
73
73
|
f.write(code)
|
|
74
74
|
temp_file = f.name
|
|
75
|
-
|
|
75
|
+
|
|
76
76
|
try:
|
|
77
77
|
env = os.environ.copy()
|
|
78
78
|
env['PYMINIFY_FORCE_BEST_EFFORT'] = '1'
|
|
79
|
-
|
|
79
|
+
|
|
80
80
|
result = run_subprocess([
|
|
81
81
|
sys.executable, '-m', 'python_minifier', temp_file
|
|
82
82
|
], timeout=30, env=env)
|
|
83
|
-
|
|
83
|
+
|
|
84
84
|
assert result.returncode == 0
|
|
85
|
-
|
|
85
|
+
|
|
86
86
|
stdout_text = safe_decode(result.stdout)
|
|
87
87
|
assert stdout_text == expected_output
|
|
88
|
-
|
|
88
|
+
|
|
89
89
|
finally:
|
|
90
90
|
os.unlink(temp_file)
|
|
91
91
|
|
|
@@ -94,26 +94,26 @@ def test_stdin_behavior():
|
|
|
94
94
|
"""Test size-based logic works with stdin input."""
|
|
95
95
|
code = 'True if 0in x else False'
|
|
96
96
|
expected_output = 'True if 0 in x else False'
|
|
97
|
-
|
|
97
|
+
|
|
98
98
|
# Without env var - should return original
|
|
99
99
|
env = os.environ.copy()
|
|
100
100
|
env.pop('PYMINIFY_FORCE_BEST_EFFORT', None)
|
|
101
|
-
|
|
101
|
+
|
|
102
102
|
result = run_subprocess([
|
|
103
103
|
sys.executable, '-m', 'python_minifier', '-'
|
|
104
104
|
], input_data=code, timeout=30, env=env)
|
|
105
|
-
|
|
105
|
+
|
|
106
106
|
assert result.returncode == 0
|
|
107
107
|
stdout_text = safe_decode(result.stdout)
|
|
108
108
|
assert stdout_text == code
|
|
109
|
-
|
|
109
|
+
|
|
110
110
|
# With env var - should return minified
|
|
111
111
|
env['PYMINIFY_FORCE_BEST_EFFORT'] = '1'
|
|
112
|
-
|
|
112
|
+
|
|
113
113
|
result = run_subprocess([
|
|
114
114
|
sys.executable, '-m', 'python_minifier', '-'
|
|
115
115
|
], input_data=code, timeout=30, env=env)
|
|
116
|
-
|
|
116
|
+
|
|
117
117
|
assert result.returncode == 0
|
|
118
118
|
stdout_text = safe_decode(result.stdout)
|
|
119
119
|
assert stdout_text == expected_output
|
|
@@ -122,30 +122,30 @@ def test_stdin_behavior():
|
|
|
122
122
|
def test_output_file_behavior():
|
|
123
123
|
"""Test size-based logic works with --output flag."""
|
|
124
124
|
code = 'True if 0in x else False'
|
|
125
|
-
|
|
125
|
+
|
|
126
126
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.py', delete=False) as input_file:
|
|
127
127
|
input_file.write(code)
|
|
128
128
|
input_filename = input_file.name
|
|
129
|
-
|
|
129
|
+
|
|
130
130
|
with tempfile.NamedTemporaryFile(delete=False) as output_file:
|
|
131
131
|
output_filename = output_file.name
|
|
132
|
-
|
|
132
|
+
|
|
133
133
|
try:
|
|
134
134
|
env = os.environ.copy()
|
|
135
135
|
env.pop('PYMINIFY_FORCE_BEST_EFFORT', None)
|
|
136
|
-
|
|
136
|
+
|
|
137
137
|
result = run_subprocess([
|
|
138
138
|
sys.executable, '-m', 'python_minifier',
|
|
139
139
|
input_filename, '--output', output_filename
|
|
140
140
|
], timeout=30, env=env)
|
|
141
|
-
|
|
141
|
+
|
|
142
142
|
assert result.returncode == 0
|
|
143
|
-
|
|
143
|
+
|
|
144
144
|
with open(output_filename, 'r') as f:
|
|
145
145
|
output_content = f.read()
|
|
146
|
-
|
|
146
|
+
|
|
147
147
|
assert output_content == code
|
|
148
|
-
|
|
148
|
+
|
|
149
149
|
finally:
|
|
150
150
|
os.unlink(input_filename)
|
|
151
151
|
os.unlink(output_filename)
|
|
@@ -154,26 +154,26 @@ def test_output_file_behavior():
|
|
|
154
154
|
def test_in_place_behavior():
|
|
155
155
|
"""Test size-based logic works with --in-place flag."""
|
|
156
156
|
code = 'True if 0in x else False'
|
|
157
|
-
|
|
157
|
+
|
|
158
158
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
|
|
159
159
|
f.write(code)
|
|
160
160
|
temp_file = f.name
|
|
161
|
-
|
|
161
|
+
|
|
162
162
|
try:
|
|
163
163
|
env = os.environ.copy()
|
|
164
164
|
env.pop('PYMINIFY_FORCE_BEST_EFFORT', None)
|
|
165
|
-
|
|
165
|
+
|
|
166
166
|
result = run_subprocess([
|
|
167
167
|
sys.executable, '-m', 'python_minifier',
|
|
168
168
|
temp_file, '--in-place'
|
|
169
169
|
], timeout=30, env=env)
|
|
170
|
-
|
|
170
|
+
|
|
171
171
|
assert result.returncode == 0
|
|
172
|
-
|
|
172
|
+
|
|
173
173
|
with open(temp_file, 'r') as f:
|
|
174
174
|
modified_content = f.read()
|
|
175
|
-
|
|
175
|
+
|
|
176
176
|
assert modified_content == code
|
|
177
|
-
|
|
177
|
+
|
|
178
178
|
finally:
|
|
179
|
-
os.unlink(temp_file)
|
|
179
|
+
os.unlink(temp_file)
|
|
@@ -6,7 +6,7 @@ from helpers import assert_namespace_tree
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
def test_module_namespace():
|
|
9
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
9
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
10
10
|
pytest.skip('Test is for python3.3 only')
|
|
11
11
|
|
|
12
12
|
source = '''
|
|
@@ -24,7 +24,7 @@ name_in_module = True
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
def test_lambda_namespace():
|
|
27
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
27
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
28
28
|
pytest.skip('Test is for python3.3 only')
|
|
29
29
|
|
|
30
30
|
source = '''
|
|
@@ -47,7 +47,7 @@ b = lambda arg, *args, **kwargs: arg + 1
|
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
def test_function_namespace():
|
|
50
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
50
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
51
51
|
pytest.skip('Test is for python3.3 only')
|
|
52
52
|
|
|
53
53
|
source = '''
|
|
@@ -84,7 +84,7 @@ def func(arg, *args, **kwargs):
|
|
|
84
84
|
# region generator namespace
|
|
85
85
|
|
|
86
86
|
def test_generator_namespace():
|
|
87
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
87
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
88
88
|
pytest.skip('Test is for python3.3 only')
|
|
89
89
|
|
|
90
90
|
source = '''
|
|
@@ -103,7 +103,7 @@ a = (x for x in range(10))
|
|
|
103
103
|
|
|
104
104
|
|
|
105
105
|
def test_multi_generator_namespace():
|
|
106
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
106
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
107
107
|
pytest.skip('Test is for python3.3 only')
|
|
108
108
|
|
|
109
109
|
source = '''
|
|
@@ -125,7 +125,7 @@ a = (x for x in f for x in x)
|
|
|
125
125
|
|
|
126
126
|
|
|
127
127
|
def test_multi_generator_namespace_2():
|
|
128
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
128
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
129
129
|
pytest.skip('Test is for python3.3 only')
|
|
130
130
|
|
|
131
131
|
source = '''
|
|
@@ -150,7 +150,7 @@ a = (c for line in file for c in line)
|
|
|
150
150
|
|
|
151
151
|
|
|
152
152
|
def test_nested_generator():
|
|
153
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
153
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
154
154
|
pytest.skip('Test is for python3.3 only')
|
|
155
155
|
|
|
156
156
|
source = '''
|
|
@@ -176,7 +176,7 @@ a = (c for c in (line for line in file))
|
|
|
176
176
|
|
|
177
177
|
|
|
178
178
|
def test_nested_generator_2():
|
|
179
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
179
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
180
180
|
pytest.skip('Test is for python3.3 only')
|
|
181
181
|
|
|
182
182
|
source = '''
|
|
@@ -203,7 +203,7 @@ a = (x for x in (x for x in x))
|
|
|
203
203
|
# region setcomp
|
|
204
204
|
|
|
205
205
|
def test_setcomp_namespace():
|
|
206
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
206
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
207
207
|
pytest.skip('Test is for python3.3 only')
|
|
208
208
|
|
|
209
209
|
source = '''
|
|
@@ -222,7 +222,7 @@ a = {x for x in range(10)}
|
|
|
222
222
|
|
|
223
223
|
|
|
224
224
|
def test_multi_setcomp_namespace():
|
|
225
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
225
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
226
226
|
pytest.skip('Test is for python3.3 only')
|
|
227
227
|
|
|
228
228
|
source = '''
|
|
@@ -244,7 +244,7 @@ a = {x for x in f for x in x}
|
|
|
244
244
|
|
|
245
245
|
|
|
246
246
|
def test_multi_setcomp_namespace_2():
|
|
247
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
247
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
248
248
|
pytest.skip('Test is for python3.3 only')
|
|
249
249
|
|
|
250
250
|
source = '''
|
|
@@ -269,7 +269,7 @@ a = {c for line in file for c in line}
|
|
|
269
269
|
|
|
270
270
|
|
|
271
271
|
def test_nested_setcomp():
|
|
272
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
272
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
273
273
|
pytest.skip('Test is for python3.3 only')
|
|
274
274
|
|
|
275
275
|
source = '''
|
|
@@ -295,7 +295,7 @@ a = {c for c in {line for line in file}}
|
|
|
295
295
|
|
|
296
296
|
|
|
297
297
|
def test_nested_setcomp_2():
|
|
298
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
298
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
299
299
|
pytest.skip('Test is for python3.3 only')
|
|
300
300
|
|
|
301
301
|
source = '''
|
|
@@ -321,7 +321,7 @@ a = {x for x in {x for x in x}}
|
|
|
321
321
|
# region listcomp
|
|
322
322
|
|
|
323
323
|
def test_listcomp_namespace():
|
|
324
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
324
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
325
325
|
pytest.skip('Test is for python3.3 only')
|
|
326
326
|
|
|
327
327
|
source = '''
|
|
@@ -340,7 +340,7 @@ a = [x for x in range(10)]
|
|
|
340
340
|
|
|
341
341
|
|
|
342
342
|
def test_multi_listcomp_namespace():
|
|
343
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
343
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
344
344
|
pytest.skip('Test is for python3.3 only')
|
|
345
345
|
|
|
346
346
|
source = '''
|
|
@@ -362,7 +362,7 @@ a = [x for x in f for x in x]
|
|
|
362
362
|
|
|
363
363
|
|
|
364
364
|
def test_multi_listcomp_namespace_2():
|
|
365
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
365
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
366
366
|
pytest.skip('Test is for python3.3 only')
|
|
367
367
|
|
|
368
368
|
source = '''
|
|
@@ -387,7 +387,7 @@ a = [c for line in file for c in line]
|
|
|
387
387
|
|
|
388
388
|
|
|
389
389
|
def test_nested_listcomp():
|
|
390
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
390
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
391
391
|
pytest.skip('Test is for python3.3 only')
|
|
392
392
|
|
|
393
393
|
source = '''
|
|
@@ -413,7 +413,7 @@ a =[c for c in [line for line in file]]
|
|
|
413
413
|
|
|
414
414
|
|
|
415
415
|
def test_nested_listcomp_2():
|
|
416
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
416
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
417
417
|
pytest.skip('Test is for python3.3 only')
|
|
418
418
|
|
|
419
419
|
source = '''
|
|
@@ -439,7 +439,7 @@ a =[x for x in [x for x in x]]
|
|
|
439
439
|
# region dictcomp
|
|
440
440
|
|
|
441
441
|
def test_dictcomp_namespace():
|
|
442
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
442
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
443
443
|
pytest.skip('Test is for python3.3 only')
|
|
444
444
|
|
|
445
445
|
source = '''
|
|
@@ -458,7 +458,7 @@ a = {x: x for x in range(10)}
|
|
|
458
458
|
|
|
459
459
|
|
|
460
460
|
def test_multi_dictcomp_namespace():
|
|
461
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
461
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
462
462
|
pytest.skip('Test is for python3.3 only')
|
|
463
463
|
|
|
464
464
|
source = '''
|
|
@@ -480,7 +480,7 @@ a = {x: x for x, x in f for x, x in x}
|
|
|
480
480
|
|
|
481
481
|
|
|
482
482
|
def test_multi_dictcomp_namespace_2():
|
|
483
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
483
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
484
484
|
pytest.skip('Test is for python3.3 only')
|
|
485
485
|
|
|
486
486
|
source = '''
|
|
@@ -505,7 +505,7 @@ a = {c: c for line, line in file for c, c in line}
|
|
|
505
505
|
|
|
506
506
|
|
|
507
507
|
def test_nested_dictcomp():
|
|
508
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
508
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
509
509
|
pytest.skip('Test is for python3.3 only')
|
|
510
510
|
|
|
511
511
|
source = '''
|
|
@@ -531,7 +531,7 @@ a = {c: c for c, c in {line: line for line in file}}
|
|
|
531
531
|
|
|
532
532
|
|
|
533
533
|
def test_nested_dictcomp_2():
|
|
534
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
534
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
535
535
|
pytest.skip('Test is for python3.3 only')
|
|
536
536
|
|
|
537
537
|
source = '''
|
|
@@ -555,7 +555,7 @@ a = {x:x for x, x in {x: x for x in x}}
|
|
|
555
555
|
# endregion
|
|
556
556
|
|
|
557
557
|
def test_class_namespace():
|
|
558
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
558
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
559
559
|
pytest.skip('Test is for python3.3 only')
|
|
560
560
|
|
|
561
561
|
source = '''
|
|
@@ -589,7 +589,7 @@ func()
|
|
|
589
589
|
|
|
590
590
|
|
|
591
591
|
def test_class_name_rebinding():
|
|
592
|
-
if sys.version_info < (3, 3) or sys.version_info
|
|
592
|
+
if sys.version_info < (3, 3) or sys.version_info >= (3, 4):
|
|
593
593
|
pytest.skip('Test is for python3.3 only')
|
|
594
594
|
|
|
595
595
|
source = '''
|