Skip to content

Commit 0d0ccc7

Browse files
authored
add debug option in cleanup_modules to print deleted objects (#71)
* add debug option in cleanup_modules to print deleted objects * remove excludes * fix __globals__ example * clean up
1 parent 7d28f83 commit 0d0ccc7

4 files changed

Lines changed: 48 additions & 13 deletions

File tree

examples/__globals__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ async def _on_request(self, **server):
2626
async def _on_response(self, **server):
2727
response = server['response']
2828

29-
del response.headers[b'x-debug']
29+
if not response.headers_sent():
30+
del response.headers[b'x-debug']
3031

3132

3233
app.logger.info('entering %s', __file__)

httpout/httpout.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -231,11 +231,6 @@ async def _on_request(self, **server):
231231
else:
232232
server['websocket'] = None
233233

234-
excludes = (server['response'].print,
235-
server['response'].run_coroutine,
236-
g.wait,
237-
*server.values())
238-
239234
server['REQUEST_METHOD'] = request.method.decode('latin-1')
240235
server['SCRIPT_NAME'] = module_path[len(document_root):].replace(
241236
os.sep, '/'
@@ -278,7 +273,7 @@ async def _on_request(self, **server):
278273
await server['response'].handle_exception(exc)
279274
finally:
280275
await g.executor.submit(
281-
cleanup_modules, server['modules'], excludes
276+
cleanup_modules, server['modules'], g.options['debug']
282277
)
283278
await server['response'].join()
284279
server['modules'].clear()

httpout/utils/modules.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Copyright (c) 2024 nggit
22

33
import os
4+
import sys
45

56
from types import ModuleType
67

@@ -19,23 +20,41 @@ def exec_module(module, code=None, max_size=8 * 1048576):
1920
exec(code, module.__dict__) # nosec B102
2021

2122

22-
def cleanup_modules(modules, excludes=()):
23+
def cleanup_modules(modules, debug=0):
24+
if debug:
25+
if debug == 1:
26+
print(' cleanup_modules:')
27+
28+
debug += 4
29+
2330
for module_name, module in modules.items():
2431
module_dict = getattr(module, '__dict__', None)
2532

2633
if module_dict:
2734
for name, value in module_dict.items():
28-
if value in excludes or name.startswith('__'):
35+
if name.startswith('__'):
36+
continue
37+
38+
value_module = getattr(value, '__module__', '__main__')
39+
40+
if value_module != '__main__' and value_module in sys.modules:
2941
continue
3042

3143
if not (value is module or
3244
isinstance(value, (type, ModuleType))):
3345
value_dict = getattr(value, '__dict__', None)
3446

3547
if value_dict:
36-
cleanup_modules(value_dict, excludes)
48+
cleanup_modules(value_dict, debug)
3749

3850
module_dict[name] = None
3951

52+
if debug:
53+
print(' ' * debug, ',-- deleted:', name, value)
54+
4055
if not module_name.startswith('__'):
4156
modules[module_name] = None
57+
58+
if debug:
59+
print(' ' * debug, '|')
60+
print(' ' * debug, 'deleted:', module_name, module)

httpout/utils/modules.pyx

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Copyright (c) 2024 nggit
22

3+
import sys
4+
35
from types import ModuleType
46

57
from libc.stdio cimport (FILE, fopen, fclose, fread, feof, ferror,
@@ -50,26 +52,44 @@ def exec_module(module, code=None, size_t max_size=8 * 1048576):
5052
exec(code, module.__dict__)
5153

5254

53-
def cleanup_modules(modules, tuple excludes=()):
55+
def cleanup_modules(modules, int debug=0):
5456
cdef str module_name, name
5557
cdef dict module_dict, value_dict
5658

59+
if debug:
60+
if debug == 1:
61+
print(' cleanup_modules:')
62+
63+
debug += 4
64+
5765
for module_name, module in modules.items():
5866
module_dict = getattr(module, '__dict__', None)
5967

6068
if module_dict:
6169
for name, value in module_dict.items():
62-
if value in excludes or name.startswith('__'):
70+
if name.startswith('__'):
71+
continue
72+
73+
value_module = getattr(value, '__module__', '__main__')
74+
75+
if value_module != '__main__' and value_module in sys.modules:
6376
continue
6477

6578
if not (value is module or
6679
isinstance(value, (type, ModuleType))):
6780
value_dict = getattr(value, '__dict__', None)
6881

6982
if value_dict:
70-
cleanup_modules(value_dict, excludes)
83+
cleanup_modules(value_dict, debug)
7184

7285
module_dict[name] = None
7386

87+
if debug:
88+
print(' ' * debug, ',-- deleted:', name, value)
89+
7490
if not module_name.startswith('__'):
7591
modules[module_name] = None
92+
93+
if debug:
94+
print(' ' * debug, '|')
95+
print(' ' * debug, 'deleted:', module_name, module)

0 commit comments

Comments
 (0)