Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-spyder-kernels for openSUSE:Factory checked in at 2021-02-23 20:21:31 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-spyder-kernels (Old) and /work/SRC/openSUSE:Factory/.python-spyder-kernels.new.2378 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-spyder-kernels" Tue Feb 23 20:21:31 2021 rev:21 rq:874444 version:1.10.2 Changes: -------- --- /work/SRC/openSUSE:Factory/python-spyder-kernels/python-spyder-kernels.changes 2021-02-15 23:23:01.975999149 +0100 +++ /work/SRC/openSUSE:Factory/.python-spyder-kernels.new.2378/python-spyder-kernels.changes 2021-02-23 20:23:05.543798265 +0100 @@ -1,0 +2,11 @@ +Mon Feb 22 17:55:31 UTC 2021 - Ben Greiner <c...@bnavigator.de> + +- Update to version 1.10.2 + * Warn when comm call creates text output, by @impact27 + * Increase minimal required version of ipykernel, by @ccordoba12 + * Better test for non-interactive context, by @juliangilbey + * Fix assignment detection in exclamation mark mode (Pdb), by + @impact27 + * Fix recursive debugger, by @impact27 + +------------------------------------------------------------------- Old: ---- python-spyder-kernels-1.10.1.tar.gz New: ---- python-spyder-kernels-1.10.2.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-spyder-kernels.spec ++++++ --- /var/tmp/diff_new_pack.QCZGC7/_old 2021-02-23 20:23:06.107798764 +0100 +++ /var/tmp/diff_new_pack.QCZGC7/_new 2021-02-23 20:23:06.111798767 +0100 @@ -19,7 +19,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} %define skip_python2 1 Name: python-spyder-kernels -Version: 1.10.1 +Version: 1.10.2 Release: 0 Summary: Jupyter kernels for Spyder's console License: MIT @@ -37,7 +37,7 @@ BuildRequires: %{python_module cloudpickle} BuildRequires: %{python_module dask-distributed} BuildRequires: %{python_module flaky} -BuildRequires: %{python_module ipykernel >= 5.1.3} +BuildRequires: %{python_module ipykernel >= 5.3.0} BuildRequires: %{python_module ipython >= 7.6.0} BuildRequires: %{python_module jupyter_client >= 5.3.4} BuildRequires: %{python_module pytest} @@ -50,7 +50,7 @@ BuildRequires: %{python_module xarray if (%python-base without python36-base)} # /SECTION Requires: python-cloudpickle -Requires: python-ipykernel >= 5.1.3 +Requires: python-ipykernel >= 5.3.0 Requires: python-ipython >= 7.6.0 Requires: python-jupyter_client >= 5.3.4 Requires: python-pyzmq >= 17 ++++++ python-spyder-kernels-1.10.1.tar.gz -> python-spyder-kernels-1.10.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-kernels-1.10.1/.github/workflows/linux-tests.yml new/spyder-kernels-1.10.2/.github/workflows/linux-tests.yml --- old/spyder-kernels-1.10.1/.github/workflows/linux-tests.yml 2020-12-18 01:40:05.000000000 +0100 +++ new/spyder-kernels-1.10.2/.github/workflows/linux-tests.yml 2021-02-21 17:09:34.000000000 +0100 @@ -42,6 +42,7 @@ run: | conda install nomkl -y -q conda install --file requirements/tests.txt -y -q + if [ "$PYTHON_VERSION" != "2.7" ]; then conda install -y -q jedi=0.17.2; fi - name: Install Package shell: bash -l {0} run: pip install -e . diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-kernels-1.10.1/.github/workflows/macos-tests.yml new/spyder-kernels-1.10.2/.github/workflows/macos-tests.yml --- old/spyder-kernels-1.10.1/.github/workflows/macos-tests.yml 2020-12-18 01:40:05.000000000 +0100 +++ new/spyder-kernels-1.10.2/.github/workflows/macos-tests.yml 2021-02-21 17:09:34.000000000 +0100 @@ -38,6 +38,7 @@ run: | conda install nomkl -y -q conda install --file requirements/tests.txt -y -q + if [ "$PYTHON_VERSION" != "2.7" ]; then conda install -y -q jedi=0.17.2; fi - name: Install Package shell: bash -l {0} run: pip install -e . diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-kernels-1.10.1/.github/workflows/windows-tests.yml new/spyder-kernels-1.10.2/.github/workflows/windows-tests.yml --- old/spyder-kernels-1.10.1/.github/workflows/windows-tests.yml 2020-12-18 01:40:05.000000000 +0100 +++ new/spyder-kernels-1.10.2/.github/workflows/windows-tests.yml 2021-02-21 17:09:34.000000000 +0100 @@ -35,7 +35,9 @@ run: conda install --file requirements/windows.txt -y -q - name: Install test dependencies shell: bash -l {0} - run: conda install --file requirements/tests.txt -y -q + run: | + conda install --file requirements/tests.txt -y -q + if [ "$PYTHON_VERSION" != "2.7" ]; then conda install -q -y jedi=0.17.2; fi - name: Install Package shell: bash -l {0} run: pip install -e . diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-kernels-1.10.1/CHANGELOG.md new/spyder-kernels-1.10.2/CHANGELOG.md --- old/spyder-kernels-1.10.1/CHANGELOG.md 2020-12-18 01:40:05.000000000 +0100 +++ new/spyder-kernels-1.10.2/CHANGELOG.md 2021-02-21 17:09:34.000000000 +0100 @@ -1,5 +1,21 @@ # History of changes +## Version 1.10.2 (2021-02-21) + +### Pull Requests Merged + +* [PR 278](https://github.com/spyder-ide/spyder-kernels/pull/278) - PR: Warn when comm call creates text output, by [@impact27](https://github.com/impact27) +* [PR 277](https://github.com/spyder-ide/spyder-kernels/pull/277) - PR: Increase minimal required version of ipykernel, by [@ccordoba12](https://github.com/ccordoba12) +* [PR 275](https://github.com/spyder-ide/spyder-kernels/pull/275) - PR: Better test for non-interactive context, by [@juliangilbey](https://github.com/juliangilbey) +* [PR 272](https://github.com/spyder-ide/spyder-kernels/pull/272) - PR: Fix assignment detection in exclamation mark mode (Pdb), by [@impact27](https://github.com/impact27) +* [PR 271](https://github.com/spyder-ide/spyder-kernels/pull/271) - PR: Fix recursive debugger, by [@impact27](https://github.com/impact27) + +In this release 5 pull requests were closed. + + +---- + + ## Version 1.10.1 (2020-12-18) ### Issues Closed diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-kernels-1.10.1/requirements/tests.txt new/spyder-kernels-1.10.2/requirements/tests.txt --- old/spyder-kernels-1.10.1/requirements/tests.txt 2020-12-18 01:40:05.000000000 +0100 +++ new/spyder-kernels-1.10.2/requirements/tests.txt 2021-02-21 17:09:34.000000000 +0100 @@ -10,4 +10,4 @@ pytest-cov scipy xarray -pillow \ No newline at end of file +pillow diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-kernels-1.10.1/setup.py new/spyder-kernels-1.10.2/setup.py --- old/spyder-kernels-1.10.1/setup.py 2020-12-18 01:40:05.000000000 +0100 +++ new/spyder-kernels-1.10.2/setup.py 2021-02-21 17:09:34.000000000 +0100 @@ -38,7 +38,7 @@ REQUIREMENTS = [ 'cloudpickle', 'ipykernel<5; python_version<"3"', - 'ipykernel>=5.1.3; python_version>="3"', + 'ipykernel>=5.3.0; python_version>="3"', 'ipython<6; python_version<"3"', 'ipython>=7.6.0; python_version>="3"', 'jupyter-client>=5.3.4', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-kernels-1.10.1/spyder_kernels/_version.py new/spyder-kernels-1.10.2/spyder_kernels/_version.py --- old/spyder-kernels-1.10.1/spyder_kernels/_version.py 2020-12-18 01:40:05.000000000 +0100 +++ new/spyder-kernels-1.10.2/spyder_kernels/_version.py 2021-02-21 17:09:34.000000000 +0100 @@ -8,5 +8,5 @@ """Version File.""" -VERSION_INFO = (1, 10, 1) +VERSION_INFO = (1, 10, 2) __version__ = '.'.join(map(str, VERSION_INFO)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-kernels-1.10.1/spyder_kernels/comms/frontendcomm.py new/spyder-kernels-1.10.2/spyder_kernels/comms/frontendcomm.py --- old/spyder-kernels-1.10.1/spyder_kernels/comms/frontendcomm.py 2020-12-18 01:40:05.000000000 +0100 +++ new/spyder-kernels-1.10.2/spyder_kernels/comms/frontendcomm.py 2021-02-21 17:09:34.000000000 +0100 @@ -229,3 +229,34 @@ comm._msg_callback(msg) comm.handle_msg = handle_msg super(FrontendComm, self)._register_comm(comm) + + def _remote_callback(self, call_name, call_args, call_kwargs): + """Call the callback function for the remote call.""" + saved_stdout_write = sys.stdout.write + saved_stderr_write = sys.stderr.write + sys.stdout.write = WriteWrapper(saved_stdout_write, call_name) + sys.stderr.write = WriteWrapper(saved_stderr_write, call_name) + try: + return super(FrontendComm, self)._remote_callback( + call_name, call_args, call_kwargs) + finally: + sys.stdout.write = saved_stdout_write + sys.stderr.write = saved_stderr_write + + +class WriteWrapper(): + """Wrapper to warn user when text is printed.""" + + def __init__(self, write, name): + self._write = write + self._name = name + self._warning_shown = False + + def __call__(self, string): + """Print warning once.""" + if not self._warning_shown: + self._warning_shown = True + self._write( + "\nOutput from spyder call " + + repr(self._name) + ":\n") + return self._write(string) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-kernels-1.10.1/spyder_kernels/console/tests/test_console_kernel.py new/spyder-kernels-1.10.2/spyder_kernels/console/tests/test_console_kernel.py --- old/spyder-kernels-1.10.1/spyder_kernels/console/tests/test_console_kernel.py 2020-12-18 01:40:05.000000000 +0100 +++ new/spyder-kernels-1.10.2/spyder_kernels/console/tests/test_console_kernel.py 2021-02-21 17:09:34.000000000 +0100 @@ -43,13 +43,6 @@ TIMEOUT = 15 SETUP_TIMEOUT = 60 -TKINTER_INSTALLED = False -try: - import tkinter - TKINTER_INSTALLED = True -except: - pass - @contextmanager def setup_kernel(cmd): @@ -605,9 +598,21 @@ assert "{'float_kind': <built-in method format of str object" in content +# We declare this constant immediately before the test, as determining +# that TURTLE_ACTIVE is True will briefly pop up a window, similar to the +# windows that will pop up during the test itself. +TURTLE_ACTIVE = False +try: + import turtle + turtle.Screen() + turtle.bye() + TURTLE_ACTIVE = True +except: + pass + @flaky(max_runs=3) -@pytest.mark.skipif(not TKINTER_INSTALLED, - reason="Doesn't work on Python installations without Tk") +@pytest.mark.skipif(not TURTLE_ACTIVE, + reason="Doesn't work on non-interactive settings or Python installations without Tk") def test_turtle_launch(tmpdir): """Test turtle scripts running in the same kernel.""" # Command to start the kernel diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-kernels-1.10.1/spyder_kernels/customize/spydercustomize.py new/spyder-kernels-1.10.2/spyder_kernels/customize/spydercustomize.py --- old/spyder-kernels-1.10.1/spyder_kernels/customize/spydercustomize.py 2020-12-18 01:40:05.000000000 +0100 +++ new/spyder-kernels-1.10.2/spyder_kernels/customize/spydercustomize.py 2021-02-21 17:09:34.000000000 +0100 @@ -27,7 +27,7 @@ from spyder_kernels.comms.frontendcomm import CommError, frontend_request from spyder_kernels.customize.namespace_manager import NamespaceManager -from spyder_kernels.customize.spyderpdb import SpyderPdb +from spyder_kernels.customize.spyderpdb import SpyderPdb, enter_debugger from spyder_kernels.customize.umr import UserModuleReloader from spyder_kernels.py3compat import TimeoutError, PY2, _print, encode @@ -374,18 +374,6 @@ return None -def get_debugger(filename): - """Get a debugger for a given filename.""" - debugger = pdb.Pdb() - filename = debugger.canonic(filename) - debugger._wait_for_mainpyfile = 1 - debugger.mainpyfile = filename - debugger._user_requested_quit = 0 - if os.name == 'nt': - filename = filename.replace('\\', '/') - return debugger, filename - - def count_leading_empty_lines(cell): """Count the number of leading empty cells.""" if PY2: @@ -597,10 +585,12 @@ filename = get_current_file_name() if filename is None: return - debugger, filename = get_debugger(filename) - debugger.continue_if_has_breakpoints = True - debugger.run("runfile(%r, args=%r, wdir=%r, current_namespace=%r)" % ( - filename, args, wdir, current_namespace)) + + enter_debugger( + filename, True, + "runfile({}" + + ", args=%r, wdir=%r, current_namespace=%r)" % ( + args, wdir, current_namespace)) builtins.debugfile = debugfile @@ -678,11 +668,10 @@ if filename is None: return - debugger, filename = get_debugger(filename) - # The breakpoint might not be in the cell - debugger.continue_if_has_breakpoints = False - debugger.run("runcell({}, {})".format( - repr(cellname), repr(filename))) + enter_debugger( + filename, False, + "runcell({}, ".format(repr(cellname)) + + "{})") builtins.debugcell = debugcell diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-kernels-1.10.1/spyder_kernels/customize/spyderpdb.py new/spyder-kernels-1.10.2/spyder_kernels/customize/spyderpdb.py --- old/spyder-kernels-1.10.1/spyder_kernels/customize/spyderpdb.py 2020-12-18 01:40:05.000000000 +0100 +++ new/spyder-kernels-1.10.2/spyder_kernels/customize/spyderpdb.py 2021-02-21 17:09:34.000000000 +0100 @@ -6,9 +6,11 @@ """Spyder debugger.""" +import ast import bdb -import sys import logging +import os +import sys import traceback from collections import namedtuple @@ -144,7 +146,16 @@ cmd_in_namespace = False cmd_func = getattr(self, 'do_' + cmd, None) is_pdb_cmd = cmd_func is not None - is_assignment = arg and arg[0] == "=" + # Look for assignment + is_assignment = False + try: + for node in ast.walk(ast.parse(line)): + if isinstance(node, ast.Assign): + is_assignment = True + break + except SyntaxError: + pass + if is_pdb_cmd: if not cmd_in_namespace and not is_assignment: # This is a pdb command without the '!' prefix. @@ -512,7 +523,7 @@ if (self.mainpyfile != self.canonic(frame.f_code.co_filename) or frame.f_lineno <= 0): return - self._wait_for_mainpyfile = 0 + self._wait_for_mainpyfile = False super(SpyderPdb, self).user_return(frame, return_value) def _cmdloop(self): @@ -700,3 +711,44 @@ """ with DebugWrapper(self): super(SpyderPdb, self).runcall(*args, **kwds) + + +def enter_debugger(filename, continue_if_has_breakpoints, code_format): + """Enter debugger. Code format should be a format that accept filename.""" + kernel = get_ipython().kernel + recursive = kernel.is_debugging() + if recursive: + parent_debugger = kernel._pdb_obj + sys.settrace(None) + globals = parent_debugger.curframe.f_globals + locals = parent_debugger.curframe_locals + # Create child debugger + debugger = SpyderPdb( + completekey=parent_debugger.completekey, + stdin=parent_debugger.stdin, stdout=parent_debugger.stdout) + debugger.use_rawinput = parent_debugger.use_rawinput + debugger.prompt = "(%s) " % parent_debugger.prompt.strip() + else: + debugger = SpyderPdb() + + filename = debugger.canonic(filename) + debugger._wait_for_mainpyfile = True + debugger.mainpyfile = filename + debugger.continue_if_has_breakpoints = continue_if_has_breakpoints + debugger._user_requested_quit = False + + if os.name == 'nt': + filename = filename.replace('\\', '/') + + code = code_format.format(repr(filename)) + + if recursive: + # Enter recursive debugger + sys.call_tracing(debugger.run, (code, globals, locals)) + # Reset parent debugger + sys.settrace(parent_debugger.trace_dispatch) + parent_debugger.lastcmd = debugger.lastcmd + kernel._register_pdb_session(parent_debugger) + else: + # The breakpoint might not be in the cell + debugger.run(code)