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.
Files changed (102) hide show
  1. {python_minifier-3.1.0/src/python_minifier.egg-info → python_minifier-3.1.1}/PKG-INFO +2 -2
  2. {python_minifier-3.1.0 → python_minifier-3.1.1}/README.md +1 -1
  3. {python_minifier-3.1.0 → python_minifier-3.1.1}/setup.py +1 -1
  4. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/ast_compare.py +1 -1
  5. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/ast_compat.py +1 -1
  6. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/expression_printer.py +2 -2
  7. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/module_printer.py +4 -4
  8. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/renamer.py +1 -1
  9. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/token_printer.py +1 -1
  10. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_debug.py +28 -8
  11. {python_minifier-3.1.0 → python_minifier-3.1.1/src/python_minifier.egg-info}/PKG-INFO +2 -2
  12. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/ast_annotation/test_add_parent.py +2 -2
  13. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/conftest.py +1 -1
  14. python_minifier-3.1.1/test/subprocess_compat.py +37 -0
  15. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_best_effort_cli.py +40 -40
  16. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_bind_names_python33.py +25 -25
  17. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_fstring.py +5 -5
  18. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_is_constant_node.py +6 -6
  19. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_raw_fstring_backslash.py +2 -2
  20. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_raw_tstring_backslash.py +3 -3
  21. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_remove_debug.py +58 -0
  22. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_template_strings.py +16 -16
  23. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_tuple_with_bug.py +1 -1
  24. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_utf8_encoding.py +2 -2
  25. python_minifier-3.1.0/test/subprocess_compat.py +0 -38
  26. {python_minifier-3.1.0 → python_minifier-3.1.1}/LICENSE +0 -0
  27. {python_minifier-3.1.0 → python_minifier-3.1.1}/MANIFEST.in +0 -0
  28. {python_minifier-3.1.0 → python_minifier-3.1.1}/setup.cfg +0 -0
  29. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/__init__.py +0 -0
  30. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/__init__.pyi +0 -0
  31. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/__main__.py +0 -0
  32. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/ast_annotation/__init__.py +0 -0
  33. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/ast_printer.py +0 -0
  34. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/f_string.py +0 -0
  35. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/ministring.py +0 -0
  36. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/py.typed +0 -0
  37. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/README.md +0 -0
  38. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/__init__.py +0 -0
  39. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/bind_names.py +0 -0
  40. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/binding.py +0 -0
  41. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/mapper.py +0 -0
  42. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/name_generator.py +0 -0
  43. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/rename_literals.py +0 -0
  44. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/resolve_names.py +0 -0
  45. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/rename/util.py +0 -0
  46. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/t_string.py +0 -0
  47. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/__init__.py +0 -0
  48. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/combine_imports.py +0 -0
  49. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/constant_folding.py +0 -0
  50. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_annotations.py +0 -0
  51. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_annotations_options.py +0 -0
  52. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_annotations_options.pyi +0 -0
  53. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_asserts.py +0 -0
  54. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_exception_brackets.py +0 -0
  55. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_explicit_return_none.py +0 -0
  56. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_literal_statements.py +0 -0
  57. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_object_base.py +0 -0
  58. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_pass.py +0 -0
  59. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/remove_posargs.py +0 -0
  60. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/transforms/suite_transformer.py +0 -0
  61. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier/util.py +0 -0
  62. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier.egg-info/SOURCES.txt +0 -0
  63. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier.egg-info/dependency_links.txt +0 -0
  64. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier.egg-info/entry_points.txt +0 -0
  65. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier.egg-info/top_level.txt +0 -0
  66. {python_minifier-3.1.0 → python_minifier-3.1.1}/src/python_minifier.egg-info/zip-safe +0 -0
  67. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/helpers.py +0 -0
  68. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/requirements.txt +0 -0
  69. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_assignment_expressions.py +0 -0
  70. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_await_fstring.py +0 -0
  71. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_bind_names.py +0 -0
  72. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_bind_names_namedexpr.py +0 -0
  73. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_bind_names_python2.py +0 -0
  74. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_bind_names_python312.py +0 -0
  75. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_bind_names_python313.py +0 -0
  76. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_combine_imports.py +0 -0
  77. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_comprehension_rename.py +0 -0
  78. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_decorator_expressions.py +0 -0
  79. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_dict_expansion.py +0 -0
  80. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_folding.py +0 -0
  81. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_generic_types.py +0 -0
  82. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_hoist_literals.py +0 -0
  83. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_import.py +0 -0
  84. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_iterable_unpacking.py +0 -0
  85. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_match.py +0 -0
  86. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_match_rename.py +0 -0
  87. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_name_generator.py +0 -0
  88. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_nonlocal.py +0 -0
  89. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_posargs.py +0 -0
  90. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_preserve_shebang.py +0 -0
  91. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_remove_annotations.py +0 -0
  92. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_remove_assert.py +0 -0
  93. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_remove_exception_brackets.py +0 -0
  94. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_remove_explicit_return_none.py +0 -0
  95. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_remove_literal_statements.py +0 -0
  96. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_remove_object.py +0 -0
  97. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_remove_pass.py +0 -0
  98. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_rename_builtins.py +0 -0
  99. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_rename_locals.py +0 -0
  100. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_slice.py +0 -0
  101. {python_minifier-3.1.0 → python_minifier-3.1.1}/test/test_type_param_defaults.py +0 -0
  102. {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.0
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.13.
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.13.
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
 
@@ -27,7 +27,7 @@ setup(
27
27
  long_description_content_type='text/markdown',
28
28
 
29
29
  python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <3.15',
30
- version='3.1.0',
30
+ version='3.1.1',
31
31
 
32
32
  classifiers=[
33
33
  'Development Status :: 5 - Production/Stable',
@@ -63,7 +63,7 @@ def compare_ast(l_ast, r_ast):
63
63
 
64
64
  if field == 'kind' and isinstance(l_ast, ast.Constant):
65
65
  continue
66
-
66
+
67
67
  if field == 'str' and hasattr(ast, 'Interpolation') and isinstance(l_ast, ast.Interpolation):
68
68
  continue
69
69
 
@@ -77,4 +77,4 @@ for _node_type in [
77
77
  'withitem',
78
78
  ]:
79
79
  if _node_type not in globals():
80
- globals()[_node_type] = type(_node_type, (AST,), {})
80
+ globals()[_node_type] = type(_node_type, (AST,), {})
@@ -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
- and self._is_left_associative(node.op)
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, open=True)
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, open=False):
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 open:
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 open:
640
+ if len(node.patterns) < 2 or not omit_brackets:
641
641
  self.printer.delimiter(']')
642
642
 
643
643
  def visit_MatchMapping(self, node):
@@ -35,7 +35,7 @@ def sorted_bindings(module):
35
35
  """
36
36
 
37
37
  def comp(tup):
38
- namespace, binding = tup
38
+ _namespace, binding = tup
39
39
  return binding.new_mention_count()
40
40
 
41
41
  return sorted(all_bindings(module), key=comp, reverse=True)
@@ -103,7 +103,7 @@ class TokenPrinter(object):
103
103
  def __str__(self):
104
104
  """Return the output code."""
105
105
  return self._code
106
-
106
+
107
107
  def __unicode__(self):
108
108
  """Return the output code as unicode (for Python 2.7 compatibility)."""
109
109
  return self._code
@@ -27,18 +27,38 @@ class RemoveDebug(SuiteTransformer):
27
27
  if not isinstance(node, ast.If):
28
28
  return False
29
29
 
30
- if isinstance(node.test, ast.Name) and node.test.id == '__debug__':
31
- return True
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
- if isinstance(node.test, ast.Compare) and len(node.test.ops) == 1 and isinstance(node.test.ops[0], ast.Is) and self.constant_value(node.test.comparators[0]) is True:
34
- return True
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
- if isinstance(node.test, ast.Compare) and len(node.test.ops) == 1 and isinstance(node.test.ops[0], ast.IsNot) and self.constant_value(node.test.comparators[0]) is False:
37
- return True
41
+ if not isinstance(node.test.left, ast.Name):
42
+ return False
38
43
 
39
- if isinstance(node.test, ast.Compare) and len(node.test.ops) == 1 and isinstance(node.test.ops[0], ast.Eq) and self.constant_value(node.test.comparators[0]) is True:
40
- return True
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.0
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.13.
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 > (3, 4):
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 = '''