diff --git a/external-deps/spyder-kernels/.gitrepo b/external-deps/spyder-kernels/.gitrepo index eec367ff4bc..4471e595570 100644 --- a/external-deps/spyder-kernels/.gitrepo +++ b/external-deps/spyder-kernels/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/spyder-ide/spyder-kernels.git branch = 2.x - commit = cd095059d7957b5929854e279ca75cd3c658d620 - parent = e29db93e2a67ca98cd9e7da4b356bb685bf53a29 + commit = 52f9b9c09a4c07f1b9ab00ada87a0d741341db64 + parent = 97e14d2e8876460f7fdf1306fbc852274edb2ea4 method = merge cmdver = 0.4.3 diff --git a/external-deps/spyder-kernels/spyder_kernels/customize/namespace_manager.py b/external-deps/spyder-kernels/spyder_kernels/customize/namespace_manager.py index 1f293882edb..359db302aba 100755 --- a/external-deps/spyder-kernels/spyder_kernels/customize/namespace_manager.py +++ b/external-deps/spyder-kernels/spyder_kernels/customize/namespace_manager.py @@ -4,8 +4,9 @@ # Licensed under the terms of the MIT License # (see spyder_kernels/__init__.py for details) -import sys import linecache +import os.path +import sys from IPython.core.getipython import get_ipython @@ -103,5 +104,5 @@ def __exit__(self, exc_type, exc_val, exc_tb): sys.modules['__main__'] = self._previous_main elif '__main__' in sys.modules and self._reset_main: del sys.modules['__main__'] - if self.filename in linecache.cache: + if self.filename in linecache.cache and os.path.exists(self.filename): linecache.cache.pop(self.filename) diff --git a/external-deps/spyder-kernels/spyder_kernels/customize/spydercustomize.py b/external-deps/spyder-kernels/spyder_kernels/customize/spydercustomize.py index b9781a4fdb9..bdcb4fe59ab 100644 --- a/external-deps/spyder-kernels/spyder_kernels/customize/spydercustomize.py +++ b/external-deps/spyder-kernels/spyder_kernels/customize/spydercustomize.py @@ -543,6 +543,10 @@ def runfile(filename=None, args=None, wdir=None, namespace=None, _print("Could not get code from editor.\n") return + # Normalise the filename + filename = os.path.abspath(filename) + filename = os.path.normcase(filename) + with NamespaceManager(filename, namespace, current_namespace, file_code=file_code) as (ns_globals, ns_locals): sys.argv = [filename] @@ -676,6 +680,11 @@ def runcell(cellname, filename=None, post_mortem=False): file_code = get_file_code(filename, save_all=False) except Exception: file_code = None + + # Normalise the filename + filename = os.path.abspath(filename) + filename = os.path.normcase(filename) + with NamespaceManager(filename, current_namespace=True, file_code=file_code) as (ns_globals, ns_locals): exec_code(cell_code, filename, ns_globals, ns_locals, diff --git a/spyder/app/tests/test_mainwindow.py b/spyder/app/tests/test_mainwindow.py index b50c743bf78..3c2ca38b2a8 100644 --- a/spyder/app/tests/test_mainwindow.py +++ b/spyder/app/tests/test_mainwindow.py @@ -4409,6 +4409,7 @@ def crash_func(): @flaky(max_runs=3) @pytest.mark.skipif(os.name == 'nt', reason="Tour messes up focus on Windows") @pytest.mark.parametrize("focus_to_editor", [True, False]) +@pytest.mark.skipif(os.name == 'nt', reason="Fails on Windows") def test_focus_to_editor(main_window, qtbot, tmpdir, focus_to_editor): """Test that the focus_to_editor option works as expected.""" # Write code with cells to a file @@ -4593,5 +4594,41 @@ def test_history_from_ipyconsole(main_window, qtbot): assert text.splitlines()[-1] == code +@pytest.mark.slow +def test_debug_unsaved_function(main_window, qtbot): + """ + Test that a breakpoint in an unsaved file is reached. + """ + # Main variables + shell = main_window.ipyconsole.get_current_shellwidget() + control = shell._control + run_action = main_window.run_toolbar_actions[0] + run_button = main_window.run_toolbar.widgetForAction(run_action) + + # Clear all breakpoints + main_window.editor.clear_all_breakpoints() + + # create new file + main_window.editor.new() + code_editor = main_window.editor.get_focus_widget() + code_editor.set_text('def foo():\n print(1)') + + # Set breakpoint + code_editor.debugger.toogle_breakpoint(line_number=2) + + # run file + with qtbot.waitSignal(shell.executed): + qtbot.mouseClick(run_button, Qt.LeftButton) + + # debug foo + with qtbot.waitSignal(shell.executed): + shell.execute('%debug foo()') + + with qtbot.waitSignal(shell.executed): + shell.execute('continue') + + assert "1---> 2 print(1)" in control.toPlainText() + + if __name__ == "__main__": pytest.main()