auto-code-fixer 0.3.2__tar.gz → 0.3.4__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 (27) hide show
  1. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/PKG-INFO +1 -1
  2. auto_code_fixer-0.3.4/auto_code_fixer/__init__.py +1 -0
  3. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/auto_code_fixer/cli.py +51 -10
  4. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/auto_code_fixer.egg-info/PKG-INFO +1 -1
  5. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/pyproject.toml +1 -1
  6. auto_code_fixer-0.3.2/auto_code_fixer/__init__.py +0 -1
  7. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/LICENSE +0 -0
  8. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/README.md +0 -0
  9. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/auto_code_fixer/command_runner.py +0 -0
  10. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/auto_code_fixer/fixer.py +0 -0
  11. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/auto_code_fixer/installer.py +0 -0
  12. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/auto_code_fixer/models.py +0 -0
  13. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/auto_code_fixer/patcher.py +0 -0
  14. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/auto_code_fixer/plan.py +0 -0
  15. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/auto_code_fixer/runner.py +0 -0
  16. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/auto_code_fixer/sandbox.py +0 -0
  17. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/auto_code_fixer/traceback_utils.py +0 -0
  18. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/auto_code_fixer/utils.py +0 -0
  19. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/auto_code_fixer/venv_manager.py +0 -0
  20. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/auto_code_fixer.egg-info/SOURCES.txt +0 -0
  21. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/auto_code_fixer.egg-info/dependency_links.txt +0 -0
  22. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/auto_code_fixer.egg-info/entry_points.txt +0 -0
  23. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/auto_code_fixer.egg-info/requires.txt +0 -0
  24. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/auto_code_fixer.egg-info/top_level.txt +0 -0
  25. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/setup.cfg +0 -0
  26. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/tests/test_fix_imported_file.py +0 -0
  27. {auto_code_fixer-0.3.2 → auto_code_fixer-0.3.4}/tests/test_internal_imports.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: auto-code-fixer
3
- Version: 0.3.2
3
+ Version: 0.3.4
4
4
  Summary: Automatically fix Python code using ChatGPT
5
5
  Author-email: Arif Shah <ashah7775@gmail.com>
6
6
  License: MIT
@@ -0,0 +1 @@
1
+ __version__ = "0.3.4"
@@ -29,6 +29,19 @@ def fix_file(file_path, project_root, api_key, ask, verbose, *, dry_run: bool, m
29
29
  from auto_code_fixer.sandbox import make_sandbox
30
30
  sandbox_root, sandbox_entry = make_sandbox(entry_file=file_path, project_root=project_root)
31
31
 
32
+ # Always delete temp sandbox (best-effort). Also register atexit cleanup in case of crashes.
33
+ import atexit
34
+
35
+ def cleanup_sandbox() -> None:
36
+ try:
37
+ shutil.rmtree(sandbox_root)
38
+ except FileNotFoundError:
39
+ return
40
+ except Exception as e:
41
+ log(f"WARN: failed to delete sandbox dir {sandbox_root}: {e}")
42
+
43
+ atexit.register(cleanup_sandbox)
44
+
32
45
  # Create isolated venv in sandbox
33
46
  from auto_code_fixer.venv_manager import create_venv
34
47
  from auto_code_fixer.patcher import backup_file
@@ -82,23 +95,51 @@ def fix_file(file_path, project_root, api_key, ask, verbose, *, dry_run: bool, m
82
95
 
83
96
  if confirm != "y":
84
97
  log("User declined overwrite", "WARN")
85
- shutil.rmtree(sandbox_root)
98
+ cleanup_sandbox()
86
99
  return False
87
100
 
88
101
  if dry_run:
89
102
  log("DRY RUN: would apply fixes:\n" + "\n".join(rel_changes), "WARN")
90
103
  else:
104
+ sr = os.path.realpath(os.path.abspath(sandbox_root))
105
+ pr = os.path.realpath(os.path.abspath(project_root))
106
+
91
107
  for p in sorted(changed_sandbox_files):
92
- rel = os.path.relpath(p, sandbox_root)
93
- dst = os.path.join(project_root, rel)
94
- if os.path.exists(dst):
95
- bak = backup_file(dst)
108
+ p_real = os.path.realpath(os.path.abspath(p))
109
+
110
+ # compute rel using real paths to avoid macOS /private path weirdness
111
+ rel = os.path.relpath(p_real, sr)
112
+
113
+ # Safety: never allow paths escaping the sandbox
114
+ if rel.startswith(".." + os.sep) or rel == "..":
115
+ log(f"Skipping suspicious path outside sandbox: {p}", "WARN")
116
+ continue
117
+
118
+ dst = os.path.join(pr, rel)
119
+ dst_real = os.path.realpath(os.path.abspath(dst))
120
+
121
+ # Safety: never write outside the project root
122
+ if not (dst_real.startswith(pr + os.sep) or dst_real == pr):
123
+ log(f"Skipping suspicious destination outside project: {dst}", "WARN")
124
+ continue
125
+
126
+ # Avoid shutil.SameFileError
127
+ try:
128
+ if os.path.exists(dst_real) and os.path.samefile(p_real, dst_real):
129
+ log(f"Skip copy (same file): {dst_real}", "DEBUG")
130
+ continue
131
+ except Exception:
132
+ pass
133
+
134
+ if os.path.exists(dst_real):
135
+ bak = backup_file(dst_real)
96
136
  log(f"Backup created: {bak}", "DEBUG")
97
- os.makedirs(os.path.dirname(dst), exist_ok=True)
98
- shutil.copy(p, dst)
99
- log(f"File updated: {dst}")
100
137
 
101
- shutil.rmtree(sandbox_root)
138
+ os.makedirs(os.path.dirname(dst_real), exist_ok=True)
139
+ shutil.copy(p_real, dst_real)
140
+ log(f"File updated: {dst_real}")
141
+
142
+ cleanup_sandbox()
102
143
  log(f"Fix completed in {attempt + 1} attempt(s) 🎉")
103
144
  return True
104
145
 
@@ -166,7 +207,7 @@ def fix_file(file_path, project_root, api_key, ask, verbose, *, dry_run: bool, m
166
207
  time.sleep(1)
167
208
 
168
209
  log("Failed to auto-fix file after max retries ❌", "ERROR")
169
- shutil.rmtree(sandbox_root)
210
+ cleanup_sandbox()
170
211
  return False
171
212
 
172
213
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: auto-code-fixer
3
- Version: 0.3.2
3
+ Version: 0.3.4
4
4
  Summary: Automatically fix Python code using ChatGPT
5
5
  Author-email: Arif Shah <ashah7775@gmail.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "auto-code-fixer"
7
- version = "0.3.2"
7
+ version = "0.3.4"
8
8
  description = "Automatically fix Python code using ChatGPT"
9
9
  readme = "README.md"
10
10
 
@@ -1 +0,0 @@
1
- __version__ = "0.3.2"
File without changes