From 14f58f362bc901670c443afe491867e6aed76fd5 Mon Sep 17 00:00:00 2001 From: Eric Charles Date: Wed, 1 Dec 2021 14:35:40 +0100 Subject: [PATCH 1/3] Add support for the debug modules request --- ipykernel/debugger.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/ipykernel/debugger.py b/ipykernel/debugger.py index 6a73ea2a4..03c808c7e 100644 --- a/ipykernel/debugger.py +++ b/ipykernel/debugger.py @@ -1,3 +1,4 @@ +import sys import os import re import threading @@ -265,7 +266,8 @@ class Debugger: # Requests that can be handled even if the debugger is not running static_debug_msg_types = [ - 'debugInfo', 'inspectVariables', 'richInspectVariables' + 'debugInfo', 'inspectVariables', + 'richInspectVariables', 'modules' ] def __init__(self, log, debugpy_stream, event_callback, shell_socket, session): @@ -591,6 +593,24 @@ async def richInspectVariables(self, message): reply["success"] = True return reply + async def modules(self, message): + modules = [sys.modules[name] for name in sys.modules] + mods = [] + for module in modules: + m = str(module) + if ".py'" in m: + a = {} + x = re.findall(r"'(.*?)'", m) + a[x[0]] = x[1] + mods.append(a) + reply = { + 'body': { + 'modules': mods, + 'totalModules': len(modules) + } + } + return reply + async def process_request(self, message): reply = {} From 561d435cca2a9fe6dc5583bed1828eb41b3413bd Mon Sep 17 00:00:00 2001 From: Eric Charles Date: Wed, 26 Jan 2022 06:33:59 +0100 Subject: [PATCH 2/3] simpler code block to get the modules for the debugger --- ipykernel/debugger.py | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/ipykernel/debugger.py b/ipykernel/debugger.py index 03c808c7e..973cbf268 100644 --- a/ipykernel/debugger.py +++ b/ipykernel/debugger.py @@ -593,22 +593,17 @@ async def richInspectVariables(self, message): reply["success"] = True return reply - async def modules(self, message): - modules = [sys.modules[name] for name in sys.modules] + async def modules(self, message): + modules = sys.modules.values() mods = [] for module in modules: - m = str(module) - if ".py'" in m: - a = {} - x = re.findall(r"'(.*?)'", m) - a[x[0]] = x[1] - mods.append(a) - reply = { - 'body': { - 'modules': mods, - 'totalModules': len(modules) - } - } + filename = getattr(getattr(module, "__spec__", None), "origin", None) + if filename and filename.endswith(".py"): + mods.append({module.__name__: filename}) + + reply = {"body": {"modules": mods, "totalModules": len(modules)}} + return reply + reply = {"body": {"modules": mods, "totalModules": len(modules)}} return reply async def process_request(self, message): From 28a9b0f3792cb15be2d5926200fe0921b1b46f40 Mon Sep 17 00:00:00 2001 From: Eric Charles Date: Wed, 26 Jan 2022 06:35:36 +0100 Subject: [PATCH 3/3] implement startModule and moduleCount as specified by the DAP modules request --- ipykernel/debugger.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ipykernel/debugger.py b/ipykernel/debugger.py index 973cbf268..a80d88b27 100644 --- a/ipykernel/debugger.py +++ b/ipykernel/debugger.py @@ -594,17 +594,18 @@ async def richInspectVariables(self, message): return reply async def modules(self, message): - modules = sys.modules.values() + modules = list(sys.modules.values()) + startModule = message.get('startModule', 0) + moduleCount = message.get('moduleCount', len(modules)) mods = [] - for module in modules: + for i in range(startModule, moduleCount): + module = modules[i] filename = getattr(getattr(module, "__spec__", None), "origin", None) if filename and filename.endswith(".py"): mods.append({module.__name__: filename}) reply = {"body": {"modules": mods, "totalModules": len(modules)}} return reply - reply = {"body": {"modules": mods, "totalModules": len(modules)}} - return reply async def process_request(self, message): reply = {}