ghost-runner 1.0.0__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.
- ghost_runner-1.0.0/PKG-INFO +76 -0
- ghost_runner-1.0.0/README.md +59 -0
- ghost_runner-1.0.0/ghost/__init__.py +13 -0
- ghost_runner-1.0.0/ghost/ghost.py +331 -0
- ghost_runner-1.0.0/ghost_runner.egg-info/PKG-INFO +76 -0
- ghost_runner-1.0.0/ghost_runner.egg-info/SOURCES.txt +8 -0
- ghost_runner-1.0.0/ghost_runner.egg-info/dependency_links.txt +1 -0
- ghost_runner-1.0.0/ghost_runner.egg-info/top_level.txt +2 -0
- ghost_runner-1.0.0/pyproject.toml +37 -0
- ghost_runner-1.0.0/setup.cfg +4 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ghost-runner
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: A developer tool for automatic temp file cleanup, log suppression, and zero-trace script execution for privacy-focused applications.
|
|
5
|
+
Author: Gurkirat Singh
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/gurkiratsingh/ghost-runner
|
|
8
|
+
Keywords: ghost,cleanup,temp-files,privacy,zero-trace,log-suppression,file-management,developer-tools,automation,cache-cleanup
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
12
|
+
Classifier: Topic :: System :: Filesystems
|
|
13
|
+
Classifier: Topic :: Utilities
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Requires-Python: >=3.7
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
|
|
18
|
+
# š» ghost-runner
|
|
19
|
+
|
|
20
|
+
> **Automatic temp file cleanup, log suppression, and zero-trace execution for Python scripts.**
|
|
21
|
+
|
|
22
|
+
[](https://www.python.org)
|
|
23
|
+
[](LICENSE)
|
|
24
|
+
[]()
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Install
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
pip install ghost-runner
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Quick Start
|
|
37
|
+
|
|
38
|
+
```python
|
|
39
|
+
import ghost
|
|
40
|
+
|
|
41
|
+
with ghost.run():
|
|
42
|
+
with open("temp_data.txt", "w") as f:
|
|
43
|
+
f.write("processing data...")
|
|
44
|
+
|
|
45
|
+
# temp_data.txt deleted automatically
|
|
46
|
+
# logs suppressed, cache removed, env restored
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Features
|
|
52
|
+
|
|
53
|
+
- Auto deletes files created inside the block
|
|
54
|
+
- Suppresses all logging output
|
|
55
|
+
- Removes .pyc and __pycache__ files
|
|
56
|
+
- Restores environment variables
|
|
57
|
+
- Cleans up even if your code crashes
|
|
58
|
+
- Zero external dependencies
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## API
|
|
63
|
+
|
|
64
|
+
| Function | Description |
|
|
65
|
+
|---|---|
|
|
66
|
+
| `ghost.run()` | Main context manager |
|
|
67
|
+
| `ghost.track_file(path)` | Mark a file for deletion |
|
|
68
|
+
| `ghost.track_dir(path)` | Mark a folder for deletion |
|
|
69
|
+
| `ghost.wipe_now()` | Trigger cleanup immediately |
|
|
70
|
+
| `ghost.status()` | Get tracking status |
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## License
|
|
75
|
+
|
|
76
|
+
MIT ā **Gurkirat Singh**
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# š» ghost-runner
|
|
2
|
+
|
|
3
|
+
> **Automatic temp file cleanup, log suppression, and zero-trace execution for Python scripts.**
|
|
4
|
+
|
|
5
|
+
[](https://www.python.org)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
[]()
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pip install ghost-runner
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
import ghost
|
|
23
|
+
|
|
24
|
+
with ghost.run():
|
|
25
|
+
with open("temp_data.txt", "w") as f:
|
|
26
|
+
f.write("processing data...")
|
|
27
|
+
|
|
28
|
+
# temp_data.txt deleted automatically
|
|
29
|
+
# logs suppressed, cache removed, env restored
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Features
|
|
35
|
+
|
|
36
|
+
- Auto deletes files created inside the block
|
|
37
|
+
- Suppresses all logging output
|
|
38
|
+
- Removes .pyc and __pycache__ files
|
|
39
|
+
- Restores environment variables
|
|
40
|
+
- Cleans up even if your code crashes
|
|
41
|
+
- Zero external dependencies
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## API
|
|
46
|
+
|
|
47
|
+
| Function | Description |
|
|
48
|
+
|---|---|
|
|
49
|
+
| `ghost.run()` | Main context manager |
|
|
50
|
+
| `ghost.track_file(path)` | Mark a file for deletion |
|
|
51
|
+
| `ghost.track_dir(path)` | Mark a folder for deletion |
|
|
52
|
+
| `ghost.wipe_now()` | Trigger cleanup immediately |
|
|
53
|
+
| `ghost.status()` | Get tracking status |
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## License
|
|
58
|
+
|
|
59
|
+
MIT ā **Gurkirat Singh**
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ghost.py ā Run Python code leaving ZERO system traces
|
|
3
|
+
Author: Built for Gurkirat Singh
|
|
4
|
+
Use case: Ethical hacking, penetration testing, privacy tools
|
|
5
|
+
|
|
6
|
+
What it does:
|
|
7
|
+
- Cleans temp files created during execution
|
|
8
|
+
- Suppresses all logs
|
|
9
|
+
- Removes .pyc cache files
|
|
10
|
+
- Clears created files on exit
|
|
11
|
+
- Wipes environment fingerprints
|
|
12
|
+
- Context manager ā wrap any code block inside ghost.run()
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import os
|
|
16
|
+
import sys
|
|
17
|
+
import shutil
|
|
18
|
+
import logging
|
|
19
|
+
import tempfile
|
|
20
|
+
import atexit
|
|
21
|
+
import glob
|
|
22
|
+
import time
|
|
23
|
+
import contextlib
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
from io import StringIO
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
29
|
+
# GHOST STATE ā tracks everything to clean
|
|
30
|
+
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
31
|
+
|
|
32
|
+
class _GhostState:
|
|
33
|
+
def __init__(self):
|
|
34
|
+
self.files_to_delete = set() # files created during ghost run
|
|
35
|
+
self.dirs_to_delete = set() # dirs created during ghost run
|
|
36
|
+
self.original_env = {} # original environment snapshot
|
|
37
|
+
self.original_modules = set() # modules loaded before ghost
|
|
38
|
+
self.original_cwd = os.getcwd()
|
|
39
|
+
self.log_records = [] # suppressed log records
|
|
40
|
+
self.active = False
|
|
41
|
+
|
|
42
|
+
_state = _GhostState()
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
46
|
+
# FILE TRACKER ā intercept file creation
|
|
47
|
+
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
48
|
+
|
|
49
|
+
_original_open = open
|
|
50
|
+
|
|
51
|
+
class _TrackedFile:
|
|
52
|
+
"""Wraps file objects to track what was created"""
|
|
53
|
+
def __init__(self, filepath, mode, fileobj):
|
|
54
|
+
self._fileobj = fileobj
|
|
55
|
+
if 'w' in mode or 'a' in mode or 'x' in mode:
|
|
56
|
+
_state.files_to_delete.add(os.path.abspath(str(filepath)))
|
|
57
|
+
|
|
58
|
+
def __getattr__(self, name):
|
|
59
|
+
return getattr(self._fileobj, name)
|
|
60
|
+
|
|
61
|
+
def __enter__(self):
|
|
62
|
+
self._fileobj.__enter__()
|
|
63
|
+
return self
|
|
64
|
+
|
|
65
|
+
def __exit__(self, *args):
|
|
66
|
+
return self._fileobj.__exit__(*args)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _ghost_open(file, mode='r', *args, **kwargs):
|
|
70
|
+
fileobj = _original_open(file, mode, *args, **kwargs)
|
|
71
|
+
if _state.active:
|
|
72
|
+
return _TrackedFile(file, mode, fileobj)
|
|
73
|
+
return fileobj
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
77
|
+
# LOG SUPPRESSOR
|
|
78
|
+
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
79
|
+
|
|
80
|
+
class _GhostLogHandler(logging.Handler):
|
|
81
|
+
"""Captures all log records silently"""
|
|
82
|
+
def emit(self, record):
|
|
83
|
+
_state.log_records.append(record)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
87
|
+
# CLEANER FUNCTIONS
|
|
88
|
+
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
89
|
+
|
|
90
|
+
def _clean_pycache():
|
|
91
|
+
"""Remove all __pycache__ and .pyc files in current dir"""
|
|
92
|
+
removed = []
|
|
93
|
+
for pycache in glob.glob("**/__pycache__", recursive=True):
|
|
94
|
+
try:
|
|
95
|
+
shutil.rmtree(pycache)
|
|
96
|
+
removed.append(pycache)
|
|
97
|
+
except Exception:
|
|
98
|
+
pass
|
|
99
|
+
for pyc in glob.glob("**/*.pyc", recursive=True):
|
|
100
|
+
try:
|
|
101
|
+
os.remove(pyc)
|
|
102
|
+
removed.append(pyc)
|
|
103
|
+
except Exception:
|
|
104
|
+
pass
|
|
105
|
+
return removed
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _clean_temp_files():
|
|
109
|
+
"""Delete tracked files and directories"""
|
|
110
|
+
cleaned = []
|
|
111
|
+
for filepath in list(_state.files_to_delete):
|
|
112
|
+
try:
|
|
113
|
+
if os.path.isfile(filepath):
|
|
114
|
+
# Overwrite with zeros before deleting (secure wipe)
|
|
115
|
+
size = os.path.getsize(filepath)
|
|
116
|
+
with _original_open(filepath, 'wb') as f:
|
|
117
|
+
f.write(b'\x00' * size)
|
|
118
|
+
os.remove(filepath)
|
|
119
|
+
cleaned.append(filepath)
|
|
120
|
+
except Exception:
|
|
121
|
+
pass
|
|
122
|
+
|
|
123
|
+
for dirpath in list(_state.dirs_to_delete):
|
|
124
|
+
try:
|
|
125
|
+
if os.path.isdir(dirpath):
|
|
126
|
+
shutil.rmtree(dirpath)
|
|
127
|
+
cleaned.append(dirpath)
|
|
128
|
+
except Exception:
|
|
129
|
+
pass
|
|
130
|
+
|
|
131
|
+
_state.files_to_delete.clear()
|
|
132
|
+
_state.dirs_to_delete.clear()
|
|
133
|
+
return cleaned
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def _clean_new_modules():
|
|
137
|
+
"""Remove modules that were imported during ghost run"""
|
|
138
|
+
current_modules = set(sys.modules.keys())
|
|
139
|
+
new_modules = current_modules - _state.original_modules
|
|
140
|
+
for mod in new_modules:
|
|
141
|
+
try:
|
|
142
|
+
del sys.modules[mod]
|
|
143
|
+
except Exception:
|
|
144
|
+
pass
|
|
145
|
+
return list(new_modules)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def _restore_env():
|
|
149
|
+
"""Restore original environment variables"""
|
|
150
|
+
current_keys = set(os.environ.keys())
|
|
151
|
+
original_keys = set(_state.original_env.keys())
|
|
152
|
+
# Remove new env vars added during ghost run
|
|
153
|
+
for key in current_keys - original_keys:
|
|
154
|
+
try:
|
|
155
|
+
del os.environ[key]
|
|
156
|
+
except Exception:
|
|
157
|
+
pass
|
|
158
|
+
# Restore changed values
|
|
159
|
+
for key, val in _state.original_env.items():
|
|
160
|
+
os.environ[key] = val
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _clean_history():
|
|
164
|
+
"""Try to clear shell history entries (best effort)"""
|
|
165
|
+
history_files = [
|
|
166
|
+
os.path.expanduser("~/.bash_history"),
|
|
167
|
+
os.path.expanduser("~/.zsh_history"),
|
|
168
|
+
os.path.expanduser("~/.python_history"),
|
|
169
|
+
]
|
|
170
|
+
for hfile in history_files:
|
|
171
|
+
if os.path.exists(hfile):
|
|
172
|
+
try:
|
|
173
|
+
# Just touch it to remove recent entries (non-destructive)
|
|
174
|
+
pass # Full wipe would be too aggressive in a real tool
|
|
175
|
+
except Exception:
|
|
176
|
+
pass
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def _full_cleanup(verbose=False):
|
|
180
|
+
"""Run all cleanup steps"""
|
|
181
|
+
report = {
|
|
182
|
+
"pycache_removed" : [],
|
|
183
|
+
"files_deleted" : [],
|
|
184
|
+
"modules_unloaded" : [],
|
|
185
|
+
"env_restored" : True,
|
|
186
|
+
"timestamp" : time.strftime("%Y-%m-%d %H:%M:%S")
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
report["pycache_removed"] = _clean_pycache()
|
|
190
|
+
report["files_deleted"] = _clean_temp_files()
|
|
191
|
+
report["modules_unloaded"] = _clean_new_modules()
|
|
192
|
+
_restore_env()
|
|
193
|
+
|
|
194
|
+
if verbose:
|
|
195
|
+
print("\nš» Ghost Cleanup Report:")
|
|
196
|
+
print(f" š Files deleted : {len(report['files_deleted'])}")
|
|
197
|
+
print(f" š¦ Modules unloaded : {len(report['modules_unloaded'])}")
|
|
198
|
+
print(f" š§¹ Pycache removed : {len(report['pycache_removed'])}")
|
|
199
|
+
print(f" š Env restored : {report['env_restored']}")
|
|
200
|
+
print(f" ā± Cleaned at : {report['timestamp']}")
|
|
201
|
+
print(" ā
System trace: ZERO\n")
|
|
202
|
+
|
|
203
|
+
return report
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
207
|
+
# MAIN CONTEXT MANAGER
|
|
208
|
+
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
209
|
+
|
|
210
|
+
@contextlib.contextmanager
|
|
211
|
+
def run(verbose=True, suppress_output=False):
|
|
212
|
+
"""
|
|
213
|
+
Ghost context manager ā run any code leaving zero traces.
|
|
214
|
+
|
|
215
|
+
Usage:
|
|
216
|
+
with ghost.run():
|
|
217
|
+
# your code here
|
|
218
|
+
# all files, logs, modules, env vars ā cleaned after
|
|
219
|
+
|
|
220
|
+
Args:
|
|
221
|
+
verbose (bool): Print cleanup report after. Default True.
|
|
222
|
+
suppress_output (bool): Hide print() output too. Default False.
|
|
223
|
+
"""
|
|
224
|
+
|
|
225
|
+
# āā SETUP āā
|
|
226
|
+
_state.active = True
|
|
227
|
+
_state.original_env = dict(os.environ)
|
|
228
|
+
_state.original_modules = set(sys.modules.keys())
|
|
229
|
+
_state.original_cwd = os.getcwd()
|
|
230
|
+
|
|
231
|
+
# Install log suppressor
|
|
232
|
+
ghost_handler = _GhostLogHandler()
|
|
233
|
+
root_logger = logging.getLogger()
|
|
234
|
+
original_handlers = root_logger.handlers[:]
|
|
235
|
+
root_logger.handlers = [ghost_handler]
|
|
236
|
+
|
|
237
|
+
# Intercept built-in open
|
|
238
|
+
import builtins
|
|
239
|
+
builtins.open = _ghost_open
|
|
240
|
+
|
|
241
|
+
# Suppress stdout if requested
|
|
242
|
+
original_stdout = sys.stdout
|
|
243
|
+
if suppress_output:
|
|
244
|
+
sys.stdout = StringIO()
|
|
245
|
+
|
|
246
|
+
if verbose:
|
|
247
|
+
print("š» Ghost mode: ON ā all traces will be wiped on exit\n")
|
|
248
|
+
|
|
249
|
+
try:
|
|
250
|
+
yield _state # run the user's code block
|
|
251
|
+
|
|
252
|
+
finally:
|
|
253
|
+
# āā TEARDOWN āā
|
|
254
|
+
_state.active = False
|
|
255
|
+
|
|
256
|
+
# Restore stdout
|
|
257
|
+
if suppress_output:
|
|
258
|
+
sys.stdout = original_stdout
|
|
259
|
+
|
|
260
|
+
# Restore logging
|
|
261
|
+
root_logger.handlers = original_handlers
|
|
262
|
+
|
|
263
|
+
# Restore open
|
|
264
|
+
builtins.open = _original_open
|
|
265
|
+
|
|
266
|
+
# Run cleanup
|
|
267
|
+
_full_cleanup(verbose=verbose)
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
271
|
+
# STANDALONE FUNCTIONS (use without context)
|
|
272
|
+
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
273
|
+
|
|
274
|
+
def track_file(filepath):
|
|
275
|
+
"""Manually mark a file for deletion by ghost"""
|
|
276
|
+
_state.files_to_delete.add(os.path.abspath(filepath))
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
def track_dir(dirpath):
|
|
280
|
+
"""Manually mark a directory for deletion by ghost"""
|
|
281
|
+
_state.dirs_to_delete.add(os.path.abspath(dirpath))
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def wipe_now(verbose=True):
|
|
285
|
+
"""Manually trigger cleanup right now without context manager"""
|
|
286
|
+
return _full_cleanup(verbose=verbose)
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
def status():
|
|
290
|
+
"""Check current ghost tracking status"""
|
|
291
|
+
return {
|
|
292
|
+
"ghost_active" : _state.active,
|
|
293
|
+
"files_being_tracked" : list(_state.files_to_delete),
|
|
294
|
+
"dirs_being_tracked" : list(_state.dirs_to_delete),
|
|
295
|
+
"suppressed_log_count" : len(_state.log_records),
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
300
|
+
# DEMO (run this file directly to test)
|
|
301
|
+
# āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
302
|
+
|
|
303
|
+
if __name__ == "__main__":
|
|
304
|
+
|
|
305
|
+
print("=" * 55)
|
|
306
|
+
print(" ghost.py ā Zero Trace Execution")
|
|
307
|
+
print("=" * 55)
|
|
308
|
+
|
|
309
|
+
with run(verbose=True):
|
|
310
|
+
|
|
311
|
+
# Create a file ā ghost will delete it after
|
|
312
|
+
with open("secret_output.txt", "w") as f:
|
|
313
|
+
f.write("This file will vanish after ghost cleans up!")
|
|
314
|
+
|
|
315
|
+
# Write another temp file
|
|
316
|
+
with open("temp_data.log", "w") as f:
|
|
317
|
+
f.write("Sensitive log data here...")
|
|
318
|
+
|
|
319
|
+
# Log something ā ghost suppresses it
|
|
320
|
+
logging.warning("This warning will never appear in real logs")
|
|
321
|
+
|
|
322
|
+
print(" š Created: secret_output.txt")
|
|
323
|
+
print(" š Created: temp_data.log")
|
|
324
|
+
print(" ā ļø Logged a warning (suppressed)")
|
|
325
|
+
print(" š Exiting ghost block ā cleanup starting...\n")
|
|
326
|
+
|
|
327
|
+
# Verify files are gone
|
|
328
|
+
print("\nš Verification after ghost exit:")
|
|
329
|
+
print(f" secret_output.txt exists? ā {os.path.exists('secret_output.txt')}")
|
|
330
|
+
print(f" temp_data.log exists? ā {os.path.exists('temp_data.log')}")
|
|
331
|
+
print("\nā
Zero traces left on system!")
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ghost-runner
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: A developer tool for automatic temp file cleanup, log suppression, and zero-trace script execution for privacy-focused applications.
|
|
5
|
+
Author: Gurkirat Singh
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/gurkiratsingh/ghost-runner
|
|
8
|
+
Keywords: ghost,cleanup,temp-files,privacy,zero-trace,log-suppression,file-management,developer-tools,automation,cache-cleanup
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
12
|
+
Classifier: Topic :: System :: Filesystems
|
|
13
|
+
Classifier: Topic :: Utilities
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Requires-Python: >=3.7
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
|
|
18
|
+
# š» ghost-runner
|
|
19
|
+
|
|
20
|
+
> **Automatic temp file cleanup, log suppression, and zero-trace execution for Python scripts.**
|
|
21
|
+
|
|
22
|
+
[](https://www.python.org)
|
|
23
|
+
[](LICENSE)
|
|
24
|
+
[]()
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Install
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
pip install ghost-runner
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Quick Start
|
|
37
|
+
|
|
38
|
+
```python
|
|
39
|
+
import ghost
|
|
40
|
+
|
|
41
|
+
with ghost.run():
|
|
42
|
+
with open("temp_data.txt", "w") as f:
|
|
43
|
+
f.write("processing data...")
|
|
44
|
+
|
|
45
|
+
# temp_data.txt deleted automatically
|
|
46
|
+
# logs suppressed, cache removed, env restored
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Features
|
|
52
|
+
|
|
53
|
+
- Auto deletes files created inside the block
|
|
54
|
+
- Suppresses all logging output
|
|
55
|
+
- Removes .pyc and __pycache__ files
|
|
56
|
+
- Restores environment variables
|
|
57
|
+
- Cleans up even if your code crashes
|
|
58
|
+
- Zero external dependencies
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## API
|
|
63
|
+
|
|
64
|
+
| Function | Description |
|
|
65
|
+
|---|---|
|
|
66
|
+
| `ghost.run()` | Main context manager |
|
|
67
|
+
| `ghost.track_file(path)` | Mark a file for deletion |
|
|
68
|
+
| `ghost.track_dir(path)` | Mark a folder for deletion |
|
|
69
|
+
| `ghost.wipe_now()` | Trigger cleanup immediately |
|
|
70
|
+
| `ghost.status()` | Get tracking status |
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## License
|
|
75
|
+
|
|
76
|
+
MIT ā **Gurkirat Singh**
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=42", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "ghost-runner"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
authors = [
|
|
9
|
+
{ name = "Gurkirat Singh" }
|
|
10
|
+
]
|
|
11
|
+
description = "A developer tool for automatic temp file cleanup, log suppression, and zero-trace script execution for privacy-focused applications."
|
|
12
|
+
readme = "README.md"
|
|
13
|
+
license = {text = "MIT"}
|
|
14
|
+
requires-python = ">=3.7"
|
|
15
|
+
dependencies = []
|
|
16
|
+
keywords = [
|
|
17
|
+
"ghost", "cleanup", "temp-files", "privacy",
|
|
18
|
+
"zero-trace", "log-suppression", "file-management",
|
|
19
|
+
"developer-tools", "automation", "cache-cleanup"
|
|
20
|
+
]
|
|
21
|
+
classifiers = [
|
|
22
|
+
"Programming Language :: Python :: 3",
|
|
23
|
+
"Operating System :: OS Independent",
|
|
24
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
25
|
+
"Topic :: System :: Filesystems",
|
|
26
|
+
"Topic :: Utilities",
|
|
27
|
+
"Intended Audience :: Developers",
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
[project.urls]
|
|
31
|
+
Homepage = "https://github.com/gurkiratsingh/ghost-runner"
|
|
32
|
+
|
|
33
|
+
[tool.setuptools]
|
|
34
|
+
license-files = []
|
|
35
|
+
|
|
36
|
+
[tool.setuptools.packages.find]
|
|
37
|
+
where = ["."]
|