From 8d73917e5498f926edbd70c5ca259e5156802db0 Mon Sep 17 00:00:00 2001 From: Quentin Peter Date: Fri, 3 Mar 2023 21:34:36 +0100 Subject: [PATCH 1/7] add exitdb command and speed optimisations --- spyder_kernels/customize/spyderpdb.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/spyder_kernels/customize/spyderpdb.py b/spyder_kernels/customize/spyderpdb.py index 24e563c5..7e23e164 100755 --- a/spyder_kernels/customize/spyderpdb.py +++ b/spyder_kernels/customize/spyderpdb.py @@ -16,6 +16,7 @@ import traceback import threading from collections import namedtuple +from functools import lru_cache from IPython.core.autocall import ZMQExitAutocall from IPython.core.debugger import Pdb as ipyPdb @@ -312,6 +313,9 @@ def print_stack_entry(self, frame_lineno, prompt_prefix='\n-> ', # --- Methods overriden for skipping libraries def stop_here(self, frame): """Check if pdb should stop here.""" + # Never stop if we are continuing unless there is a breakpoint + if self.stopframe == self.botframe: + return False if (frame is not None and "__tracebackhide__" in frame.f_locals and frame.f_locals["__tracebackhide__"] == "__pdb_exit__"): @@ -594,6 +598,21 @@ def _cmdloop(self): "For copying text while debugging, use Ctrl+Shift+C", file=self.stdout) + @lru_cache + def canonic(self, filename): + """Return canonical form of filename.""" + return super().canonic(filename) + + def do_exitdb(self, arg): + """Exit the debugger""" + self._set_stopinfo(self.botframe, None, -1) + sys.settrace(None) + frame = sys._getframe().f_back + while frame and frame is not self.botframe: + del frame.f_trace + frame = frame.f_back + return 1 + def cmdloop(self, intro=None): """ Repeatedly issue a prompt, accept input, parse an initial prefix From 0d8fc16b2b2a81c03ba25a866d1da37393cdb63d Mon Sep 17 00:00:00 2001 From: Quentin Peter Date: Sun, 5 Mar 2023 13:38:06 +0100 Subject: [PATCH 2/7] add parenthesis for py3.7 --- spyder_kernels/customize/spyderpdb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spyder_kernels/customize/spyderpdb.py b/spyder_kernels/customize/spyderpdb.py index 7e23e164..6be0eab0 100755 --- a/spyder_kernels/customize/spyderpdb.py +++ b/spyder_kernels/customize/spyderpdb.py @@ -598,7 +598,7 @@ def _cmdloop(self): "For copying text while debugging, use Ctrl+Shift+C", file=self.stdout) - @lru_cache + @lru_cache() def canonic(self, filename): """Return canonical form of filename.""" return super().canonic(filename) From 83aa205a5caaa9034839fbf728ec6d7035c474c7 Mon Sep 17 00:00:00 2001 From: Quentin Peter Date: Wed, 5 Jul 2023 20:34:16 +0200 Subject: [PATCH 3/7] Update spyder_kernels/customize/spyderpdb.py Co-authored-by: Carlos Cordoba --- spyder_kernels/customize/spyderpdb.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/spyder_kernels/customize/spyderpdb.py b/spyder_kernels/customize/spyderpdb.py index 6be0eab0..da0a432b 100755 --- a/spyder_kernels/customize/spyderpdb.py +++ b/spyder_kernels/customize/spyderpdb.py @@ -316,9 +316,12 @@ def stop_here(self, frame): # Never stop if we are continuing unless there is a breakpoint if self.stopframe == self.botframe: return False - if (frame is not None - and "__tracebackhide__" in frame.f_locals - and frame.f_locals["__tracebackhide__"] == "__pdb_exit__"): + + if ( + frame is not None + and "__tracebackhide__" in frame.f_locals + and frame.f_locals["__tracebackhide__"] == "__pdb_exit__" + ): self.onecmd('exit') return False From 34ded2ed37c030ecd590d0652c96729f40f63753 Mon Sep 17 00:00:00 2001 From: Quentin Peter Date: Wed, 5 Jul 2023 20:34:21 +0200 Subject: [PATCH 4/7] Update spyder_kernels/customize/spyderpdb.py Co-authored-by: Carlos Cordoba --- spyder_kernels/customize/spyderpdb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spyder_kernels/customize/spyderpdb.py b/spyder_kernels/customize/spyderpdb.py index da0a432b..53f754c1 100755 --- a/spyder_kernels/customize/spyderpdb.py +++ b/spyder_kernels/customize/spyderpdb.py @@ -601,7 +601,7 @@ def _cmdloop(self): "For copying text while debugging, use Ctrl+Shift+C", file=self.stdout) - @lru_cache() + @lru_cache def canonic(self, filename): """Return canonical form of filename.""" return super().canonic(filename) From 838f55d838641ec95bd0565baaac0cc34d0c93b0 Mon Sep 17 00:00:00 2001 From: jsbautista <42411448+jsbautista@users.noreply.github.com> Date: Wed, 12 Jul 2023 15:52:53 -0500 Subject: [PATCH 5/7] PR: Add a global filter flag to settings (#460) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update `globalsfilter` to have a `filter_on` kwarg and add test Co-authored-by: Daniel Althviz Moré --------- Co-authored-by: Daniel Althviz Moré --- .../console/tests/test_console_kernel.py | 28 ++++++++++++++++++- spyder_kernels/utils/nsview.py | 10 ++++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/spyder_kernels/console/tests/test_console_kernel.py b/spyder_kernels/console/tests/test_console_kernel.py index d7efae21..65870f02 100644 --- a/spyder_kernels/console/tests/test_console_kernel.py +++ b/spyder_kernels/console/tests/test_console_kernel.py @@ -227,7 +227,8 @@ def kernel(request): 'False_', 'True_' ], - 'minmax': False + 'minmax': False, + 'filter_on':True } # Teardown @@ -288,6 +289,31 @@ def test_get_namespace_view(kernel): assert "'python_type': 'int'" in nsview +@pytest.mark.parametrize("filter_on", [True, False]) +def test_get_namespace_view_filter_on(kernel, filter_on): + """ + Test the namespace view of the kernel with filters on and off. + """ + execute = asyncio.run(kernel.do_execute('a = 1', True)) + asyncio.run(kernel.do_execute('TestFilterOff = 1', True)) + + settings = kernel.namespace_view_settings + settings['filter_on'] = filter_on + settings['exclude_capitalized'] = True + nsview = kernel.get_namespace_view() + + if not filter_on: + assert 'a' in nsview + assert 'TestFilterOff' in nsview + else: + assert 'TestFilterOff' not in nsview + assert 'a' in nsview + + # Restore settings for other tests + settings['filter_on'] = True + settings['exclude_capitalized'] = False + + def test_get_var_properties(kernel): """ Test the properties fo the variables in the namespace. diff --git a/spyder_kernels/utils/nsview.py b/spyder_kernels/utils/nsview.py index c19927f8..d7e0ce5a 100644 --- a/spyder_kernels/utils/nsview.py +++ b/spyder_kernels/utils/nsview.py @@ -589,7 +589,8 @@ def is_callable_or_module(value): def globalsfilter(input_dict, check_all=False, filters=None, exclude_private=None, exclude_capitalized=None, exclude_uppercase=None, exclude_unsupported=None, - excluded_names=None, exclude_callables_and_modules=None): + excluded_names=None, exclude_callables_and_modules=None, + filter_on=True): """Keep objects in namespace view according to different criteria.""" output_dict = {} def _is_string(obj): @@ -605,7 +606,7 @@ def _is_string(obj): (exclude_callables_and_modules and is_callable_or_module(value)) or (exclude_unsupported and not is_supported(value, check_all=check_all, filters=filters)) - ) + ) and filter_on if not excluded: output_dict[key] = value return output_dict @@ -617,7 +618,8 @@ def _is_string(obj): REMOTE_SETTINGS = ('check_all', 'exclude_private', 'exclude_uppercase', 'exclude_capitalized', 'exclude_unsupported', 'excluded_names', 'minmax', 'show_callable_attributes', - 'show_special_attributes', 'exclude_callables_and_modules') + 'show_special_attributes', 'exclude_callables_and_modules', + 'filter_on') def get_supported_types(): @@ -673,7 +675,7 @@ def get_remote_data(data, settings, mode, more_excluded_names=None): exclude_capitalized=settings['exclude_capitalized'], exclude_unsupported=settings['exclude_unsupported'], exclude_callables_and_modules=settings['exclude_callables_and_modules'], - excluded_names=excluded_names) + excluded_names=excluded_names, filter_on=settings['filter_on']) def make_remote_view(data, settings, more_excluded_names=None): From f008501e3593b96a35fa8530472f4c203d6aa85d Mon Sep 17 00:00:00 2001 From: Quentin Peter Date: Sun, 23 Jul 2023 14:34:33 +0200 Subject: [PATCH 6/7] Remove locals inspection --- spyder_kernels/console/shell.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/spyder_kernels/console/shell.py b/spyder_kernels/console/shell.py index c641feb8..49cde462 100644 --- a/spyder_kernels/console/shell.py +++ b/spyder_kernels/console/shell.py @@ -263,10 +263,6 @@ def showtraceback(self, exc_tuple=None, filename=None, tb_offset=None, try: etype, value, tb = self._get_exc_info(exc_tuple) stack = traceback.extract_tb(tb.tb_next) - for f_summary, f in zip( - stack, traceback.walk_tb(tb.tb_next)): - f_summary.locals = self.kernel.get_namespace_view( - frame=f[0]) self.kernel.frontend_call(blocking=False).show_traceback( etype, value, stack) except Exception: From adb31866c64079bc023c4626f1e2cce3c51ab5f6 Mon Sep 17 00:00:00 2001 From: Quentin Peter Date: Mon, 24 Jul 2023 22:42:05 +0200 Subject: [PATCH 7/7] remove more locals call --- spyder_kernels/console/kernel.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/spyder_kernels/console/kernel.py b/spyder_kernels/console/kernel.py index f35c3fe5..d900d8a7 100644 --- a/spyder_kernels/console/kernel.py +++ b/spyder_kernels/console/kernel.py @@ -235,8 +235,7 @@ def filter_stack(self, stack, is_main): return stack @comm_handler - def get_current_frames(self, ignore_internal_threads=True, - capture_locals=False): + def get_current_frames(self, ignore_internal_threads=True): """Get the current frames.""" ignore_list = self.get_system_threads_id() main_id = threading.main_thread().ident @@ -247,9 +246,6 @@ def get_current_frames(self, ignore_internal_threads=True, for thread_id, frame in sys._current_frames().items(): stack = traceback.StackSummary.extract( traceback.walk_stack(frame)) - if capture_locals: - for f_summary, f in zip(stack, traceback.walk_stack(frame)): - f_summary.locals = self.get_namespace_view(frame=f[0]) stack.reverse() if ignore_internal_threads: if thread_id in ignore_list: