Hello community, here is the log from the commit of package spyder for openSUSE:Factory checked in at 2019-05-22 10:58:30 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/spyder (Old) and /work/SRC/openSUSE:Factory/.spyder.new.5148 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "spyder" Wed May 22 10:58:30 2019 rev:32 rq:695342 version:3.3.4 Changes: -------- --- /work/SRC/openSUSE:Factory/spyder/spyder.changes 2019-01-21 10:46:21.472312675 +0100 +++ /work/SRC/openSUSE:Factory/.spyder.new.5148/spyder.changes 2019-05-22 10:58:32.674877915 +0200 @@ -1,0 +2,78 @@ +Sun Apr 7 19:08:38 UTC 2019 - Sebastian Wagner <[email protected]> + +- Add changelog.sh for easier changelog conversion in packaging. +- update to version 3.3.4: + - New features: + - Fix several incompatibilities with PyQt5 5.12. + - Avoid errors when running `turtle` programs in the IPython console + multiple times. + - Avoid the UMR to reload modules installed in the user site-packages + directory. + - Issues Closed: + - [Issue 8978](https://github.com/spyder-ide/spyder/issues/8978) - Github login window is resizing automatically ([PR 8993](https://github.com/spyder-ide/spyder/pull/8993)) + - [Issue 8934](https://github.com/spyder-ide/spyder/issues/8934) - IOError raised when completion plugins fail to start ([PR 8950](https://github.com/spyder-ide/spyder/pull/8950)) + - [Issue 8927](https://github.com/spyder-ide/spyder/issues/8927) - Change "Clear variables" to "Remove variables" in French translation ([PR 8951](https://github.com/spyder-ide/spyder/pull/8951)) + - [Issue 8878](https://github.com/spyder-ide/spyder/issues/8878) - Error when try to type opening bracket in console ([PR 8879](https://github.com/spyder-ide/spyder/pull/8879)) + - [Issue 8841](https://github.com/spyder-ide/spyder/issues/8841) - Static Code Analysis can be attempted without selected file ([PR 8921](https://github.com/spyder-ide/spyder/pull/8921)) + - [Issue 8807](https://github.com/spyder-ide/spyder/issues/8807) - Error when saving LANG_FILE ([PR 8808](https://github.com/spyder-ide/spyder/pull/8808)) + - [Issue 8789](https://github.com/spyder-ide/spyder/issues/8789) - spyder_io_hdf5 plugin no longer available ([PR 8790](https://github.com/spyder-ide/spyder/pull/8790)) + - [Issue 8776](https://github.com/spyder-ide/spyder/issues/8776) - Problem with debugfile() in version >= 3.3.0 + - [Issue 8764](https://github.com/spyder-ide/spyder/issues/8764) - VersionConflict when opening a file in the Editor ([PR 8781](https://github.com/spyder-ide/spyder/pull/8781)) + - [Issue 8762](https://github.com/spyder-ide/spyder/issues/8762) - Text written in help pane gets automatically selected and replaced with every keystroke ([PR 8907](https://github.com/spyder-ide/spyder/pull/8907)) + - [Issue 8748](https://github.com/spyder-ide/spyder/issues/8748) - spyder 3.3.3 icon theme Spyder 3 problem with PyQt 5.12 ([PR 8896](https://github.com/spyder-ide/spyder/pull/8896)) + - [Issue 8747](https://github.com/spyder-ide/spyder/issues/8747) - Spyder should depend on QtWebEngine for pyqt >= 5.12 ([PR 8753](https://github.com/spyder-ide/spyder/pull/8753)) + - [Issue 6278](https://github.com/spyder-ide/spyder/issues/6278) - Problems with running turtle programs in Spyder + - Pull Requests Merged: + - [PR 9073](https://github.com/spyder-ide/spyder/pull/9073) - PR: Increase minimal required version of spyder-kernels to 0.4.3 + - [PR 9041](https://github.com/spyder-ide/spyder/pull/9041) - PR: Fix a recurrrent error with our IPython console tests + - [PR 9023](https://github.com/spyder-ide/spyder/pull/9023) - PR: Fix warning and todo action menu entries + - [PR 9020](https://github.com/spyder-ide/spyder/pull/9020) - PR: Fix our tests on Windows/Python 3.7 + - [PR 8996](https://github.com/spyder-ide/spyder/pull/8996) - PR: Generate PyPI long description from README.md + - [PR 8993](https://github.com/spyder-ide/spyder/pull/8993) - PR: Fix over-height resize of the Github login dialog ([8978](https://github.com/spyder-ide/spyder/issues/8978)) + - [PR 8953](https://github.com/spyder-ide/spyder/pull/8953) - PR: Compile French translation po file + - [PR 8951](https://github.com/spyder-ide/spyder/pull/8951) - PR: Change 'Supprimer' for 'Effacer' in remove variables text for French translation ([8927](https://github.com/spyder-ide/spyder/issues/8927)) + - [PR 8950](https://github.com/spyder-ide/spyder/pull/8950) - PR: Don't raise an error if completion plugins fail to start ([8934](https://github.com/spyder-ide/spyder/issues/8934)) + - [PR 8928](https://github.com/spyder-ide/spyder/pull/8928) - PR: Use generic Qt name instead of Qt4 when switching backend for Mayavi + - [PR 8921](https://github.com/spyder-ide/spyder/pull/8921) - PR: Set enabled value of start_button with is_valid (Static Code Analysis) ([8841](https://github.com/spyder-ide/spyder/issues/8841)) + - [PR 8910](https://github.com/spyder-ide/spyder/pull/8910) - PR: Fix tests on Windows/Python 3.7 + - [PR 8907](https://github.com/spyder-ide/spyder/pull/8907) - PR: Fix force_refresh to only force with valid object entries (Help plugin) ([8762](https://github.com/spyder-ide/spyder/issues/8762)) + - [PR 8899](https://github.com/spyder-ide/spyder/pull/8899) - PR: Run our tests with pip on Windows/Python 3.7 + - [PR 8896](https://github.com/spyder-ide/spyder/pull/8896) - PR: Increase minimal QtAwesome version to 0.5.7 ([8748](https://github.com/spyder-ide/spyder/issues/8748)) + - [PR 8895](https://github.com/spyder-ide/spyder/pull/8895) - PR: Remove Appveyor support and stop testing on Windows/Python 2 + - [PR 8879](https://github.com/spyder-ide/spyder/pull/8879) - PR: Don't fail on UnicodeEncodeError when saving Help's search history to disk ([8878](https://github.com/spyder-ide/spyder/issues/8878)) + - [PR 8808](https://github.com/spyder-ide/spyder/pull/8808) - PR: Avoid errors when trying to save LANG_FILE ([8807](https://github.com/spyder-ide/spyder/issues/8807)) + - [PR 8802](https://github.com/spyder-ide/spyder/pull/8802) - PR: Upgrade Travis config to use Xenial image + - [PR 8790](https://github.com/spyder-ide/spyder/pull/8790) - PR: Fix missing spyder_io_hdf5 plugin ([8789](https://github.com/spyder-ide/spyder/issues/8789)) + - [PR 8781](https://github.com/spyder-ide/spyder/pull/8781) - PR: Avoid errors when using Pygments to detect the lexer used to highlight a file ([8764](https://github.com/spyder-ide/spyder/issues/8764)) + - [PR 8756](https://github.com/spyder-ide/spyder/pull/8756) - PR: Fix PyQt5 pinning restrictions in setup.py + - [PR 8753](https://github.com/spyder-ide/spyder/pull/8753) - PR: Add pyqtwebengine as a new dependency ([8747](https://github.com/spyder-ide/spyder/issues/8747)) +---- +- update to version 3.3.3: + - New features: + - Fix an incompatibility with Numpy 1.16 that generated an error + when trying to open an array in the Variable Explorer. + - Increase maximum PyQt5 supported version to 5.12 + - Increase minimal required version of spyder-kernels to 0.4.2 + to get important fixes about saving/loading the current + namespace and skipping installed modules from our User Module + Reloader (UMR). + - Issues Closed: + - [Issue 8697](https://github.com/spyder-ide/spyder/issues/8697) - Starting a python file importing tensorflow the second time results in error + - [Issue 8681](https://github.com/spyder-ide/spyder/issues/8681) - PYTHONPATH environment variable not inherited if using non-default python interpreter ([PR 8685](https://github.com/spyder-ide/spyder/pull/8685)) + - [Issue 8668](https://github.com/spyder-ide/spyder/issues/8668) - Console throws error about wurlitzer on fresh install + - [Issue 8582](https://github.com/spyder-ide/spyder/issues/8582) - Spyder encountered a problem when opening numpy array ([PR 8632](https://github.com/spyder-ide/spyder/pull/8632)) + - [Issue 8581](https://github.com/spyder-ide/spyder/issues/8581) - An error ocurred while starting the kernel: b'' ([PR 8736](https://github.com/spyder-ide/spyder/pull/8736)) + - [Issue 8475](https://github.com/spyder-ide/spyder/issues/8475) - pyqt5 Dependency seems outdated ([PR 8530](https://github.com/spyder-ide/spyder/pull/8530)) + - Pull Requests Merged: + - [PR 8736](https://github.com/spyder-ide/spyder/pull/8736) - PR: Don't show empty kernel error messages ([8581](https://github.com/spyder-ide/spyder/issues/8581)) + - [PR 8731](https://github.com/spyder-ide/spyder/pull/8731) - PR: Backport PR 8559 + - [PR 8728](https://github.com/spyder-ide/spyder/pull/8728) - PR: Increase minimal spyder-kernels version in setup.py to avoid faulty release + - [PR 8696](https://github.com/spyder-ide/spyder/pull/8696) - PR: Increase minimal required version of spyder-kernels + - [PR 8689](https://github.com/spyder-ide/spyder/pull/8689) - PR: Backport PR 8363 + - [PR 8686](https://github.com/spyder-ide/spyder/pull/8686) - PR: Backport PR 8452 + - [PR 8685](https://github.com/spyder-ide/spyder/pull/8685) - PR: Avoid dropping predefined PYTHONPATH when using an external interpreter ([8681](https://github.com/spyder-ide/spyder/issues/8681)) + - [PR 8636](https://github.com/spyder-ide/spyder/pull/8636) - PR: Improve warning for when only some namespace objs couldn't be saved + - [PR 8632](https://github.com/spyder-ide/spyder/pull/8632) - PR: Don't force write flag to True in ArrayEditor, to fix compat with Numpy >=1.16 ([8582](https://github.com/spyder-ide/spyder/issues/8582)) + - [PR 8530](https://github.com/spyder-ide/spyder/pull/8530) - PR: Increase maximum PyQt5 supported version ([8475](https://github.com/spyder-ide/spyder/issues/8475)) + +------------------------------------------------------------------- Old: ---- spyder-3.3.2.tar.gz New: ---- changelog.sh spyder-3.3.4.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ spyder.spec ++++++ --- /var/tmp/diff_new_pack.rijndo/_old 2019-05-22 10:58:33.982876781 +0200 +++ /var/tmp/diff_new_pack.rijndo/_new 2019-05-22 10:58:34.006876761 +0200 @@ -19,7 +19,7 @@ %bcond_with test %define X_display ":98" Name: spyder -Version: 3.3.2 +Version: 3.3.4 Release: 0 Url: https://www.spyder-ide.org/ Summary: The Scientific Python Development Environment @@ -27,10 +27,12 @@ Group: Development/Languages/Python Source: https://files.pythonhosted.org/packages/source/s/spyder/spyder-%{version}.tar.gz Source1: spyder-rpmlintrc +# Packaging utility +Source2: changelog.sh BuildRequires: fdupes BuildRequires: python-Pygments >= 2.0 -BuildRequires: python-QtAwesome >= 0.4.1 -BuildRequires: python-QtPy >= 1.1.0 +BuildRequires: python-QtAwesome >= 0.5.7 +BuildRequires: python-QtPy >= 1.5.0 BuildRequires: python-Sphinx >= 0.6.0 BuildRequires: python-chardet >= 2.0.0 BuildRequires: python-devel @@ -63,14 +65,14 @@ BuildRequires: python-pytest-timeout BuildRequires: python-pytest-xvfb BuildRequires: python-scipy -BuildRequires: python-spyder-kernels < 1 +BuildRequires: python-spyder-kernels >= 0.4.3 BuildRequires: python-sympy BuildRequires: xauth BuildRequires: xorg-x11-server %endif Requires: python-Pygments >= 2.0 -Requires: python-QtAwesome >= 0.4.1 -Requires: python-QtPy >= 1.1.0 +Requires: python-QtAwesome >= 0.5.7 +Requires: python-QtPy >= 1.5.0 Requires: python-Sphinx >= 0.6.0 Requires: python-chardet >= 2.0.0 Requires: python-cloudpickle @@ -87,7 +89,7 @@ Requires: python-pyzmq Requires: python-qt5 >= 5.2 Requires: python-rope >= 0.10.5 -Requires: python-spyder-kernels < 1 +Requires: python-spyder-kernels >= 0.4.3 Recommends: python-Pillow Recommends: python-matplotlib >= 1.0 Recommends: python-numpy ++++++ changelog.sh ++++++ #!/bin/bash xclip -o | egrep -v "(^[-\s]*$|^In this release )" | sed -E 's/^### ([A-Za-z ]+)/ - \1:/' | sed -E 's/^\* / - /' | sed -E 's/^## Version ([0-9.]+) \([0-9-]+\)/- update to version \1:/' | xclip -i ++++++ spyder-3.3.2.tar.gz -> spyder-3.3.4.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/CHANGELOG.md new/spyder-3.3.4/CHANGELOG.md --- old/spyder-3.3.2/CHANGELOG.md 2018-11-24 16:35:50.000000000 +0100 +++ new/spyder-3.3.4/CHANGELOG.md 2019-03-31 20:48:24.000000000 +0200 @@ -1,5 +1,109 @@ # History of changes +## Version 3.3.4 (2019-03-31) + +### New features + +* Fix several incompatibilities with PyQt5 5.12. +* Avoid errors when running `turtle` programs in the IPython console + multiple times. +* Avoid the UMR to reload modules installed in the user site-packages + directory. + +### Issues Closed + +* [Issue 8978](https://github.com/spyder-ide/spyder/issues/8978) - Github login window is resizing automatically ([PR 8993](https://github.com/spyder-ide/spyder/pull/8993)) +* [Issue 8934](https://github.com/spyder-ide/spyder/issues/8934) - IOError raised when completion plugins fail to start ([PR 8950](https://github.com/spyder-ide/spyder/pull/8950)) +* [Issue 8927](https://github.com/spyder-ide/spyder/issues/8927) - Change "Clear variables" to "Remove variables" in French translation ([PR 8951](https://github.com/spyder-ide/spyder/pull/8951)) +* [Issue 8878](https://github.com/spyder-ide/spyder/issues/8878) - Error when try to type opening bracket in console ([PR 8879](https://github.com/spyder-ide/spyder/pull/8879)) +* [Issue 8841](https://github.com/spyder-ide/spyder/issues/8841) - Static Code Analysis can be attempted without selected file ([PR 8921](https://github.com/spyder-ide/spyder/pull/8921)) +* [Issue 8807](https://github.com/spyder-ide/spyder/issues/8807) - Error when saving LANG_FILE ([PR 8808](https://github.com/spyder-ide/spyder/pull/8808)) +* [Issue 8789](https://github.com/spyder-ide/spyder/issues/8789) - spyder_io_hdf5 plugin no longer available ([PR 8790](https://github.com/spyder-ide/spyder/pull/8790)) +* [Issue 8776](https://github.com/spyder-ide/spyder/issues/8776) - Problem with debugfile() in version >= 3.3.0 +* [Issue 8764](https://github.com/spyder-ide/spyder/issues/8764) - VersionConflict when opening a file in the Editor ([PR 8781](https://github.com/spyder-ide/spyder/pull/8781)) +* [Issue 8762](https://github.com/spyder-ide/spyder/issues/8762) - Text written in help pane gets automatically selected and replaced with every keystroke ([PR 8907](https://github.com/spyder-ide/spyder/pull/8907)) +* [Issue 8748](https://github.com/spyder-ide/spyder/issues/8748) - spyder 3.3.3 icon theme Spyder 3 problem with PyQt 5.12 ([PR 8896](https://github.com/spyder-ide/spyder/pull/8896)) +* [Issue 8747](https://github.com/spyder-ide/spyder/issues/8747) - Spyder should depend on QtWebEngine for pyqt >= 5.12 ([PR 8753](https://github.com/spyder-ide/spyder/pull/8753)) +* [Issue 6278](https://github.com/spyder-ide/spyder/issues/6278) - Problems with running turtle programs in Spyder + +In this release 13 issues were closed. + +### Pull Requests Merged + +* [PR 9073](https://github.com/spyder-ide/spyder/pull/9073) - PR: Increase minimal required version of spyder-kernels to 0.4.3 +* [PR 9041](https://github.com/spyder-ide/spyder/pull/9041) - PR: Fix a recurrrent error with our IPython console tests +* [PR 9023](https://github.com/spyder-ide/spyder/pull/9023) - PR: Fix warning and todo action menu entries +* [PR 9020](https://github.com/spyder-ide/spyder/pull/9020) - PR: Fix our tests on Windows/Python 3.7 +* [PR 8996](https://github.com/spyder-ide/spyder/pull/8996) - PR: Generate PyPI long description from README.md +* [PR 8993](https://github.com/spyder-ide/spyder/pull/8993) - PR: Fix over-height resize of the Github login dialog ([8978](https://github.com/spyder-ide/spyder/issues/8978)) +* [PR 8953](https://github.com/spyder-ide/spyder/pull/8953) - PR: Compile French translation po file +* [PR 8951](https://github.com/spyder-ide/spyder/pull/8951) - PR: Change 'Supprimer' for 'Effacer' in remove variables text for French translation ([8927](https://github.com/spyder-ide/spyder/issues/8927)) +* [PR 8950](https://github.com/spyder-ide/spyder/pull/8950) - PR: Don't raise an error if completion plugins fail to start ([8934](https://github.com/spyder-ide/spyder/issues/8934)) +* [PR 8928](https://github.com/spyder-ide/spyder/pull/8928) - PR: Use generic Qt name instead of Qt4 when switching backend for Mayavi +* [PR 8921](https://github.com/spyder-ide/spyder/pull/8921) - PR: Set enabled value of start_button with is_valid (Static Code Analysis) ([8841](https://github.com/spyder-ide/spyder/issues/8841)) +* [PR 8910](https://github.com/spyder-ide/spyder/pull/8910) - PR: Fix tests on Windows/Python 3.7 +* [PR 8907](https://github.com/spyder-ide/spyder/pull/8907) - PR: Fix force_refresh to only force with valid object entries (Help plugin) ([8762](https://github.com/spyder-ide/spyder/issues/8762)) +* [PR 8899](https://github.com/spyder-ide/spyder/pull/8899) - PR: Run our tests with pip on Windows/Python 3.7 +* [PR 8896](https://github.com/spyder-ide/spyder/pull/8896) - PR: Increase minimal QtAwesome version to 0.5.7 ([8748](https://github.com/spyder-ide/spyder/issues/8748)) +* [PR 8895](https://github.com/spyder-ide/spyder/pull/8895) - PR: Remove Appveyor support and stop testing on Windows/Python 2 +* [PR 8879](https://github.com/spyder-ide/spyder/pull/8879) - PR: Don't fail on UnicodeEncodeError when saving Help's search history to disk ([8878](https://github.com/spyder-ide/spyder/issues/8878)) +* [PR 8808](https://github.com/spyder-ide/spyder/pull/8808) - PR: Avoid errors when trying to save LANG_FILE ([8807](https://github.com/spyder-ide/spyder/issues/8807)) +* [PR 8802](https://github.com/spyder-ide/spyder/pull/8802) - PR: Upgrade Travis config to use Xenial image +* [PR 8790](https://github.com/spyder-ide/spyder/pull/8790) - PR: Fix missing spyder_io_hdf5 plugin ([8789](https://github.com/spyder-ide/spyder/issues/8789)) +* [PR 8781](https://github.com/spyder-ide/spyder/pull/8781) - PR: Avoid errors when using Pygments to detect the lexer used to highlight a file ([8764](https://github.com/spyder-ide/spyder/issues/8764)) +* [PR 8756](https://github.com/spyder-ide/spyder/pull/8756) - PR: Fix PyQt5 pinning restrictions in setup.py +* [PR 8753](https://github.com/spyder-ide/spyder/pull/8753) - PR: Add pyqtwebengine as a new dependency ([8747](https://github.com/spyder-ide/spyder/issues/8747)) + +In this release 23 pull requests were closed. + + +---- + + +## Version 3.3.3 (2019-02-09) + +### New features + +* Fix an incompatibility with Numpy 1.16 that generated an error + when trying to open an array in the Variable Explorer. +* Increase maximum PyQt5 supported version to 5.12 +* Increase minimal required version of spyder-kernels to 0.4.2 + to get important fixes about saving/loading the current + namespace and skipping installed modules from our User Module + Reloader (UMR). + +### Issues Closed + +* [Issue 8697](https://github.com/spyder-ide/spyder/issues/8697) - Starting a python file importing tensorflow the second time results in error +* [Issue 8681](https://github.com/spyder-ide/spyder/issues/8681) - PYTHONPATH environment variable not inherited if using non-default python interpreter ([PR 8685](https://github.com/spyder-ide/spyder/pull/8685)) +* [Issue 8668](https://github.com/spyder-ide/spyder/issues/8668) - Console throws error about wurlitzer on fresh install +* [Issue 8582](https://github.com/spyder-ide/spyder/issues/8582) - Spyder encountered a problem when opening numpy array ([PR 8632](https://github.com/spyder-ide/spyder/pull/8632)) +* [Issue 8581](https://github.com/spyder-ide/spyder/issues/8581) - An error ocurred while starting the kernel: b'' ([PR 8736](https://github.com/spyder-ide/spyder/pull/8736)) +* [Issue 8475](https://github.com/spyder-ide/spyder/issues/8475) - pyqt5 Dependency seems outdated ([PR 8530](https://github.com/spyder-ide/spyder/pull/8530)) + +In this release 6 issues were closed. + +### Pull Requests Merged + +* [PR 8736](https://github.com/spyder-ide/spyder/pull/8736) - PR: Don't show empty kernel error messages ([8581](https://github.com/spyder-ide/spyder/issues/8581)) +* [PR 8731](https://github.com/spyder-ide/spyder/pull/8731) - PR: Backport PR 8559 +* [PR 8728](https://github.com/spyder-ide/spyder/pull/8728) - PR: Increase minimal spyder-kernels version in setup.py to avoid faulty release +* [PR 8696](https://github.com/spyder-ide/spyder/pull/8696) - PR: Increase minimal required version of spyder-kernels +* [PR 8689](https://github.com/spyder-ide/spyder/pull/8689) - PR: Backport PR 8363 +* [PR 8686](https://github.com/spyder-ide/spyder/pull/8686) - PR: Backport PR 8452 +* [PR 8685](https://github.com/spyder-ide/spyder/pull/8685) - PR: Avoid dropping predefined PYTHONPATH when using an external interpreter ([8681](https://github.com/spyder-ide/spyder/issues/8681)) +* [PR 8636](https://github.com/spyder-ide/spyder/pull/8636) - PR: Improve warning for when only some namespace objs couldn't be saved +* [PR 8632](https://github.com/spyder-ide/spyder/pull/8632) - PR: Don't force write flag to True in ArrayEditor, to fix compat with Numpy >=1.16 ([8582](https://github.com/spyder-ide/spyder/issues/8582)) +* [PR 8530](https://github.com/spyder-ide/spyder/pull/8530) - PR: Increase maximum PyQt5 supported version ([8475](https://github.com/spyder-ide/spyder/issues/8475)) + +In this release 10 pull requests were closed. + + +---- + + +## Version 3.3.2 (2018-11-24) + ### New features #### Main Window diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/PKG-INFO new/spyder-3.3.4/PKG-INFO --- old/spyder-3.3.2/PKG-INFO 2018-11-24 16:45:32.000000000 +0100 +++ new/spyder-3.3.4/PKG-INFO 2019-03-31 20:54:16.000000000 +0200 @@ -1,29 +1,272 @@ Metadata-Version: 1.1 Name: spyder -Version: 3.3.2 +Version: 3.3.4 Summary: The Scientific Python Development Environment Home-page: https://www.spyder-ide.org/ Author: The Spyder Project Contributors Author-email: [email protected] License: MIT Download-URL: https://www.spyder-ide.org/#fh5co-download -Description: Spyder is a powerful scientific environment written in Python, for Python, - and designed by and for scientists, engineers and data analysts. - It features a unique combination of the advanced editing, analysis, debugging - and profiling functionality of a comprehensive development tool with the data - exploration, interactive execution, deep inspection and beautiful visualization +Description:  + + *Copyright © 2009–2019 [Spyder Project Contributors]( + https://github.com/spyder-ide/spyder/graphs/contributors)* + + *Some source files and icons may be under other authorship/licenses; see + [NOTICE.txt](https://github.com/spyder-ide/spyder/blob/master/NOTICE.txt).* + + + [](./LICENSE.txt) + [](https://pypi.org/project/spyder/) + [](https://www.anaconda.com/download/) + [](https://www.anaconda.com/download/) + [](#backers) + [](#sponsors) + [](https://gitter.im/spyder-ide/public)<br> + [](https://github.com/spyder-ide/spyder) + [](https://travis-ci.org/spyder-ide/spyder) + [](https://circleci.com/gh/spyder-ide/spyder) + [](https://coveralls.io/github/spyder-ide/spyder?branch=master) + [](https://codecov.io/gh/spyder-ide/spyder) + + +  + + + ## Overview + + Spyder is a powerful scientific environment written in Python, for Python, + and designed by and for scientists, engineers and data analysts. It offers a + unique combination of the advanced editing, analysis, debugging, and profiling + functionality of a comprehensive development tool with the data exploration, + interactive execution, deep inspection, and beautiful visualization capabilities of a scientific package. - Furthermore, Spyder offers built-in integration with many popular - scientific packages, including NumPy, SciPy, Pandas, IPython, QtConsole, - Matplotlib, SymPy, and more. - - Beyond its many built-in features, Spyder's abilities can be extended even - further via first- and third-party plugins. - - Spyder can also be used as a PyQt5 extension library, allowing you to build - upon its functionality and embed its components, such as the interactive - console or advanced editor, in your own software. + Beyond its many built-in features, its abilities can be extended even further + via its plugin system and API. Furthermore, Spyder can also be used as a PyQt5 + extension library, allowing you to build upon its functionality and embed + its components, such as the interactive console, in your own software. + + For more general information about Spyder and to stay up to date on the + latest Spyder news and information, please check out [our new website]( + https://www.spyder-ide.org/). + + + ## Core components + + * **Editor** + + Work efficiently in a multi-language editor with a function/class browser, + real-time code analysis tools (`pyflakes`, `pylint`, and `pycodestyle`), + automatic code completion (`jedi` and `rope`), + horizontal/vertical splitting, and go-to-definition. + + * **Interactive console** + + Harness the power of as many IPython consoles as you like with full + workspace and debugging support, all within the flexibility of a full + GUI interface. Instantly run your code by line, cell, or file, + and render plots right inline with the output or in interactive windows. + + * **Documentation viewer** + + Render documentation in real-time with Sphinx for any class or function, + whether external or user-created, from either the Editor or a Console. + + * **Variable explorer** + + Inspect any variables, functions or objects created during your session. + Editing and interaction is supported with many common types, including + numeric/strings/bools, Python lists/tuples/dictionaries, dates/timedeltas, + Numpy arrays, Pandas index/series/dataframes, PIL/Pillow images, and more. + + * **Development tools** + + Examine your code with the static analyzer, trace its execution with the + interactive debugger, and unleash its performance with the profiler. + Keep things organized with project support and a builtin file explorer, and + use find in files to search across entire projects with full regex support. + + + ## Documentation + + You can read the Spyder documentation online on [the Spyder Docs website]( + https://docs.spyder-ide.org/). + + + ## Installation + + For a detailed guide to installing Spyder, please refer to our + [installation instructions](https://docs.spyder-ide.org/installation.html). + + The easiest way to install Spyder on any of our supported platforms + is to download it as part of the [Anaconda](https://www.anaconda.com/download/) + distribution, and use the `conda` package and environment manager to keep it + and your other packages installed and up to date. + + If in doubt, you should always install Spyder via this method to avoid + unexpected issues we are unable to help you with; it generally has the + least likelihood of potential pitfalls for non-experts, and we may be + able to provide limited assistance if you do run into trouble. + + Other install options exist, including: + + * The [WinPython](https://winpython.github.io/) distribution for Windows + * The [MacPorts](https://www.macports.org/) project for macOS + * Your distribution's package manager (i.e. `apt-get`, `yum`, etc) on Linux + * The `pip` package manager, included with most Python installations + + **However**, we lack the resources to provide individual support for users who + install via these methods, and they may be out of date or contain bugs outside + our control, so we recommend the Anaconda version instead if you run into issues. + + + ## Troubleshooting + + Before posting a report, *please* carefully read our **[Troubleshooting Guide]( + https://github.com/spyder-ide/spyder/wiki/Troubleshooting-Guide-and-FAQ)** + and search the [issue tracker](https://github.com/spyder-ide/spyder/issues) + for your error message and problem description, as the great majority of bugs + are either duplicates, or can be fixed on the user side with a few easy steps. + Thanks! + + + ## Contributing and Credits + + Spyder was originally created by [Pierre Raybaut]( + https://github.com/PierreRaybaut), and is currently maintained by + [Carlos Córdoba](https://github.com/ccordoba12) and an international + community of volunteers. + + You can join us—everyone is welcome to help with Spyder! + Please read our [contributing instructions]( + https://github.com/spyder-ide/spyder/blob/master/CONTRIBUTING.md) + to get started! + + Certain source files are distributed under other compatible permissive licenses + and/or originally by other authors. + The icons for the Spyder 3 theme are derived from [Font Awesome]( + https://fontawesome.com/) 4.7 (© 2016 David Gandy; SIL OFL 1.1). + Most Spyder 2 theme icons are sourced from the [Crystal Project icon set]( + https://www.everaldo.com) (© 2006-2007 Everaldo Coelho; LGPL 2.1+). + Other Spyder 2 icons are from [Yusuke Kamiyamane]( + http://p.yusukekamiyamane.com/) (© 2013 Yusuke Kamiyamane; CC-BY 3.0), + the [FamFamFam Silk icon set](http://www.famfamfam.com/lab/icons/silk/) + (© 2006 Mark James; CC-BY 2.5), and the [KDE Oxygen icons]( + https://www.kde.org/) (© 2007 KDE Artists; LGPL 3.0+). + + See [NOTICE.txt](https://github.com/spyder-ide/spyder/blob/master/NOTICE.txt) + for full legal information. + + + ## Running from a Github clone + + Spyder can be run directly from the source code, hosted on the + [Spyder github repo](https://github.com/spyder-ide/spyder). + You may want to do this for fixing bugs in Spyder, adding new + features, learning how Spyder works or to try out development versions before + they are officially released. + + If using `conda` (strongly recommended), this can be done by running the + following from the command line (the Anaconda Prompt, if on Windows): + + ```bash + conda install spyder + conda remove spyder + git clone https://github.com/spyder-ide/spyder.git + cd spyder + python bootstrap.py + ``` + + You also need to make sure the correct `spyder-kernels` version is installed + for the version of Spyder you are testing. The above procedure will give you + `spyder-kernels` 0.x for the `3.x` branch (Spyder 3), + so to run the `master` branch (Spyder 4) you need to additionally execute: + + ```bash + conda install -c spyder-ide spyder-kernels=1.* + ``` + + Alternatively, you can use `pip` to install PyQt5 and the other + *runtime dependencies* listed below. However, beware: + this method is recommended for experts only, and you'll need to solve any + problems on your own. + + See the [installation instructions]( + https://docs.spyder-ide.org/installation.html) for more details on all of this. + + + ## Dependencies + + **Important Note**: Most or all of the dependencies listed below come + with *Anaconda* and other scientific Python distributions, so you don't need + to install them separately in those cases. + + ### Build dependencies + + When installing Spyder from its source package, the only requirement is to have + a Python version greater than 2.7 or 3.4 (Python <=3.3 is no longer supported). + + ### Runtime dependencies + + * **Python** 2.7 or 3.4+: The core language Spyder is written in and for. + * **PyQt5** 5.5+: Python bindings for Qt, used for Spyder's GUI. + * **qtconsole** 4.2.0+: Enhanced Python interpreter. + * **Rope** 0.9.4+ and **Jedi** 0.9.0+: Editor code completion, calltips + and go-to-definition. + * **Pyflakes**: Real-time code analysis. + * **Sphinx**: Rich text mode for the Help pane. + * **Pygments** 2.0+: Syntax highlighting for all file types it supports. + * **Pylint**: Static code analysis. + * **Pycodestyle**: Real-time code style analysis. + * **Psutil**: CPU and memory usage on the status bar. + * **Nbconvert**: Manipulation of notebooks in the Editor. + * **Qtawesome** 0.5.7+: To have an icon theme based on FontAwesome. + * **Pickleshare**: Show import completions on the Python consoles. + * **PyZMQ**: Run introspection services asynchronously. + * **QtPy** 1.5.0+: Abstraction layer for Python Qt bindings so that Spyder + can run on multiple Qt bindings and versions. + * **Chardet**: Character encoding auto-detection in Python. + * **Numpydoc**: Used by Jedi to get function return types from Numpydocstrings. + * **Cloudpickle**: Serialize variables in the IPython kernel to send to Spyder. + * **spyder-kernels** 0.4.3+;1.0-: Jupyter kernels for the Spyder console. + * **keyring**: Save Github credentials to report errors securely. + + ### Optional dependencies + + * **Matplotlib**: 2D/3D plotting in the IPython console. + * **Pandas**: View and edit DataFrames and Series in the Variable Explorer. + * **Numpy**: View and edit 2- or 3-dimensional arrays in the Variable Explorer. + * **SymPy**: Symbolic mathematics in the IPython console. + * **SciPy**: Import Matlab workspace files in the Variable Explorer. + * **Cython**: Run Cython files in the IPython console. + + + ## More information + + [Main Website](https://www.spyder-ide.org/) + + [Download Spyder (with Anaconda)](https://www.anaconda.com/download/) + + [Online Documentation](https://docs.spyder-ide.org/) + + [Spyder Github](https://github.com/spyder-ide/spyder) + + [Troubleshooting Guide and FAQ]( + https://github.com/spyder-ide/spyder/wiki/Troubleshooting-Guide-and-FAQ) + + [Development Wiki](https://github.com/spyder-ide/spyder/wiki/Dev:-Index) + + [Gitter Chatroom](https://gitter.im/spyder-ide/public) + + [Google Group](https://groups.google.com/group/spyderlib) + + [@Spyder_IDE on Twitter](https://twitter.com/spyder_ide) + + [@SpyderIDE on Facebook](https://www.facebook.com/SpyderIDE/) + + [Support Spyder on OpenCollective](https://opencollective.com/spyder/) Keywords: PyQt5 editor console widgets IDE science data analysis IPython Platform: Windows diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/README.md new/spyder-3.3.4/README.md --- old/spyder-3.3.2/README.md 2018-11-24 16:08:37.000000000 +0100 +++ new/spyder-3.3.4/README.md 2019-03-31 20:36:33.000000000 +0200 @@ -1,7 +1,7 @@  -*Copyright © 2009–2018 [Spyder Project Contributors]( +*Copyright © 2009–2019 [Spyder Project Contributors]( https://github.com/spyder-ide/spyder/graphs/contributors)* *Some source files and icons may be under other authorship/licenses; see @@ -17,7 +17,6 @@ [](https://gitter.im/spyder-ide/public)<br> [](https://github.com/spyder-ide/spyder) [](https://travis-ci.org/spyder-ide/spyder) -[](https://ci.appveyor.com/project/spyder-ide/spyder/branch/master) [](https://circleci.com/gh/spyder-ide/spyder) [](https://coveralls.io/github/spyder-ide/spyder?branch=master) [](https://codecov.io/gh/spyder-ide/spyder) @@ -214,7 +213,7 @@ * **Pycodestyle**: Real-time code style analysis. * **Psutil**: CPU and memory usage on the status bar. * **Nbconvert**: Manipulation of notebooks in the Editor. -* **Qtawesome** 0.4.1+: To have an icon theme based on FontAwesome. +* **Qtawesome** 0.5.7+: To have an icon theme based on FontAwesome. * **Pickleshare**: Show import completions on the Python consoles. * **PyZMQ**: Run introspection services asynchronously. * **QtPy** 1.5.0+: Abstraction layer for Python Qt bindings so that Spyder @@ -222,7 +221,7 @@ * **Chardet**: Character encoding auto-detection in Python. * **Numpydoc**: Used by Jedi to get function return types from Numpydocstrings. * **Cloudpickle**: Serialize variables in the IPython kernel to send to Spyder. -* **spyder-kernels** 0.2.3+;1.0-: Jupyter kernels for the Spyder console. +* **spyder-kernels** 0.4.3+;1.0-: Jupyter kernels for the Spyder console. * **keyring**: Save Github credentials to report errors securely. ### Optional dependencies diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/runtests.py new/spyder-3.3.4/runtests.py --- old/spyder-3.3.2/runtests.py 2018-11-24 16:08:37.000000000 +0100 +++ new/spyder-3.3.4/runtests.py 2019-03-31 20:36:33.000000000 +0200 @@ -33,6 +33,9 @@ if RUN_CI: pytest_args += ['-x', '--run-slow', '--cov=spyder', '--cov=spyder_profiler', '--no-cov-on-fail'] + # To display nice tests resume in Azure's web page + if os.environ.get('AZURE', None) is not None: + pytest_args += ['--cache-clear', '--junitxml=result.xml'] elif run_slow: pytest_args += ['--run-slow'] elif extra_args: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/setup.py new/spyder-3.3.4/setup.py --- old/spyder-3.3.2/setup.py 2018-11-24 16:10:42.000000000 +0100 +++ new/spyder-3.3.4/setup.py 2019-03-31 20:36:33.000000000 +0200 @@ -21,6 +21,7 @@ from __future__ import print_function +import io import os import os.path as osp import subprocess @@ -150,28 +151,21 @@ #============================================================================== +# Use Readme for long description +#============================================================================== +with io.open('README.md', encoding='utf-8') as f: + LONG_DESCRIPTION = f.read() + + +#============================================================================== # Setup arguments #============================================================================== setup_args = dict( name=NAME, version=__version__, description='The Scientific Python Development Environment', - long_description=( -"""Spyder is a powerful scientific environment written in Python, for Python, -and designed by and for scientists, engineers and data analysts. -It features a unique combination of the advanced editing, analysis, debugging -and profiling functionality of a comprehensive development tool with the data -exploration, interactive execution, deep inspection and beautiful visualization -capabilities of a scientific package.\n -Furthermore, Spyder offers built-in integration with many popular -scientific packages, including NumPy, SciPy, Pandas, IPython, QtConsole, -Matplotlib, SymPy, and more.\n -Beyond its many built-in features, Spyder's abilities can be extended even -further via first- and third-party plugins.\n -Spyder can also be used as a PyQt5 extension library, allowing you to build -upon its functionality and embed its components, such as the interactive -console or advanced editor, in your own software. -"""), + long_description=LONG_DESCRIPTION, + long_description_content_type='text/markdown', download_url=__website_url__ + "#fh5co-download", author="The Spyder Project Contributors", author_email="[email protected]", @@ -232,24 +226,27 @@ 'pycodestyle', 'pylint', 'psutil', - 'qtawesome>=0.4.1', + 'qtawesome>=0.5.7', 'qtpy>=1.5.0', 'pickleshare', 'pyzmq', 'chardet>=2.0.0', 'numpydoc', - 'spyder-kernels<1.0', + 'spyder-kernels>=0.4.3,<1.0', # Don't require keyring for Python 2 and Linux # because it depends on system packages 'keyring;sys_platform!="linux2"', # Packages for pyqt5 are only available in # Python 3 - 'pyqt5<5.10;python_version>="3"' + 'pyqt5<5.13;python_version>="3"', + # pyqt5 5.12 split WebEngine into the + # pyqtwebengine module + 'pyqtwebengine<5.13' ] extras_require = { 'test:python_version == "2.7"': ['mock'], - 'test': ['pytest', + 'test': ['pytest<4.1', 'pytest-qt', 'pytest-mock', 'pytest-cov', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/__init__.py new/spyder-3.3.4/spyder/__init__.py --- old/spyder-3.3.2/spyder/__init__.py 2018-11-24 16:43:39.000000000 +0100 +++ new/spyder-3.3.4/spyder/__init__.py 2019-03-31 20:51:31.000000000 +0200 @@ -29,7 +29,7 @@ OTHER DEALINGS IN THE SOFTWARE. """ -version_info = (3, 3, 2) +version_info = (3, 3, 4) __version__ = '.'.join(map(str, version_info)) __license__ = __doc__ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/app/mac_stylesheet.qss new/spyder-3.3.4/spyder/app/mac_stylesheet.qss --- old/spyder-3.3.2/spyder/app/mac_stylesheet.qss 2016-12-20 17:53:26.000000000 +0100 +++ new/spyder-3.3.4/spyder/app/mac_stylesheet.qss 2019-03-31 20:36:33.000000000 +0200 @@ -115,6 +115,17 @@ image: url($IMAGE_PATH/chevron-right.png); } +QTabBar::close-button{ + background-image: url($IMAGE_PATH/CloseButton.png); +} + + + +QTabBar::close-button:hover{ + background-image: url($IMAGE_PATH/CloseButtonHover.png); +} + + /* ------------------ Dock widgets ------------------- */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/app/mainwindow.py new/spyder-3.3.4/spyder/app/mainwindow.py --- old/spyder-3.3.2/spyder/app/mainwindow.py 2018-11-24 16:08:37.000000000 +0100 +++ new/spyder-3.3.4/spyder/app/mainwindow.py 2019-03-31 20:36:33.000000000 +0200 @@ -2376,7 +2376,8 @@ <b>Spyder {spyder_ver}</b> {revision} <br>The Scientific Python Development Environment | <a href="{website_url}">Spyder-IDE.org</a> - <br>Copyright © 2009-2018 Spyder Project Contributors + <br>Copyright © 2009-2019 Spyder Project Contributors and + <a href="{github_url}/blob/master/AUTHORS.txt">others</a> <br>Distributed under the terms of the <a href="{github_url}/blob/master/LICENSE.txt">MIT License</a>. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/app/tests/test_mainwindow.py new/spyder-3.3.4/spyder/app/tests/test_mainwindow.py --- old/spyder-3.3.2/spyder/app/tests/test_mainwindow.py 2018-11-24 16:08:37.000000000 +0100 +++ new/spyder-3.3.4/spyder/app/tests/test_mainwindow.py 2019-03-31 20:36:33.000000000 +0200 @@ -583,33 +583,6 @@ @pytest.mark.slow @flaky(max_runs=3) @pytest.mark.skipif(os.name == 'nt', reason="It times out sometimes on Windows") -def test_np_threshold(main_window, qtbot): - """Test that setting Numpy threshold doesn't make the Variable Explorer slow.""" - # Set Numpy threshold - shell = main_window.ipyconsole.get_current_shellwidget() - qtbot.waitUntil(lambda: shell._prompt_html is not None, timeout=SHELL_TIMEOUT) - with qtbot.waitSignal(shell.executed): - shell.execute('import numpy as np; np.set_printoptions(threshold=np.nan)') - - # Create a big Numpy array - with qtbot.waitSignal(shell.executed): - shell.execute('x = np.random.rand(75000,5)') - - # Wait a very small time to see the array in the Variable Explorer - main_window.variableexplorer.visibility_changed(True) - nsb = main_window.variableexplorer.get_focus_widget() - qtbot.waitUntil(lambda: nsb.editor.model.rowCount() == 1, timeout=500) - - # Assert that NumPy threshold remains the same as the one - # set by the user - with qtbot.waitSignal(shell.executed): - shell.execute("t = np.get_printoptions()['threshold']") - assert np.isnan(shell.get_value('t')) - - [email protected] -@flaky(max_runs=3) [email protected](os.name == 'nt', reason="It times out sometimes on Windows") def test_change_types_in_varexp(main_window, qtbot): """Test that variable types can't be changed in the Variable Explorer.""" # Create object diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/config/base.py new/spyder-3.3.4/spyder/config/base.py --- old/spyder-3.3.2/spyder/config/base.py 2018-11-24 16:08:37.000000000 +0100 +++ new/spyder-3.3.4/spyder/config/base.py 2019-03-31 20:36:33.000000000 +0200 @@ -345,8 +345,14 @@ def save_lang_conf(value): """Save language setting to language config file""" - with open(LANG_FILE, 'w') as f: - f.write(value) + # Needed to avoid an error when trying to save LANG_FILE + # but the operation fails for some reason. + # See issue 8807 + try: + with open(LANG_FILE, 'w') as f: + f.write(value) + except EnvironmentError: + pass def load_lang_conf(): Binary files old/spyder-3.3.2/spyder/images/CloseButton.png and new/spyder-3.3.4/spyder/images/CloseButton.png differ Binary files old/spyder-3.3.2/spyder/images/CloseButtonHover.png and new/spyder-3.3.4/spyder/images/CloseButtonHover.png differ Binary files old/spyder-3.3.2/spyder/locale/fr/LC_MESSAGES/spyder.mo and new/spyder-3.3.4/spyder/locale/fr/LC_MESSAGES/spyder.mo differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/locale/fr/LC_MESSAGES/spyder.po new/spyder-3.3.4/spyder/locale/fr/LC_MESSAGES/spyder.po --- old/spyder-3.3.2/spyder/locale/fr/LC_MESSAGES/spyder.po 2018-11-24 16:08:37.000000000 +0100 +++ new/spyder-3.3.4/spyder/locale/fr/LC_MESSAGES/spyder.po 2019-03-31 20:36:33.000000000 +0200 @@ -12,15 +12,15 @@ msgstr "" "Project-Id-Version: 2.1\n" "POT-Creation-Date: 2018-11-13 11:49+-05\n" -"PO-Revision-Date: 2018-11-17 23:21+0100\n" -"Last-Translator: Melaine Euzenat <[email protected]>\n" +"PO-Revision-Date: 2019-03-16 13:03+0100\n" +"Last-Translator: Carlos Cordoba <[email protected]>\n" "Language-Team: Python\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 2.2\n" +"X-Generator: Poedit 2.1.1\n" #: spyder/app/mainwindow.py:139 msgid "Initializing..." @@ -3093,7 +3093,7 @@ #: spyder/plugins/runconfig.py:45 msgid "Remove all variables before execution" -msgstr "Effacer toutes les variables avant l'exécution" +msgstr "Supprimer toutes les variables avant l'exécution" #: spyder/plugins/runconfig.py:46 msgid "Directly enter debugging when errors appear" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/plugins/editor.py new/spyder-3.3.4/spyder/plugins/editor.py --- old/spyder-3.3.2/spyder/plugins/editor.py 2018-11-24 16:08:37.000000000 +0100 +++ new/spyder-3.3.4/spyder/plugins/editor.py 2019-03-31 20:36:33.000000000 +0200 @@ -1535,11 +1535,7 @@ error = 'syntax' in message text = message[:1].upper() + message[1:] icon = ima.icon('error') if error else ima.icon('warning') - - def slot(): - self.switch_to_plugin() - self.load(filename, goto=line_number) - + slot = lambda _checked, _l=line_number: self.load(filename, goto=_l) action = create_action(self, text=text, icon=icon, triggered=slot) self.warning_menu.addAction(action) @@ -1566,11 +1562,7 @@ filename = self.get_current_filename() for text, line0 in results: icon = ima.icon('todo') - - def slot(): - self.switch_to_plugin() - self.load(filename, goto=line0) - + slot = lambda _checked, _l=line0: self.load(filename, goto=_l) action = create_action(self, text=text, icon=icon, triggered=slot) self.todo_menu.addAction(action) self.update_todo_actions() @@ -1847,6 +1839,12 @@ end of this method (set to False to prevent keyboard events from creeping through to the editor during debugging) """ + # Switch to editor before trying to load a file + try: + self.switch_to_plugin() + except AttributeError: + pass + editor0 = self.get_current_editor() if editor0 is not None: position0 = editor0.get_position('cursor') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/plugins/help.py new/spyder-3.3.4/spyder/plugins/help.py --- old/spyder-3.3.2/spyder/plugins/help.py 2018-11-24 16:08:37.000000000 +0100 +++ new/spyder-3.3.4/spyder/plugins/help.py 2019-03-31 20:36:33.000000000 +0200 @@ -397,7 +397,7 @@ self.combo.setMaxCount(self.get_option('max_history_entries')) self.combo.addItems( self.load_history() ) self.combo.setItemText(0, '') - self.combo.valid.connect(lambda valid: self.force_refresh()) + self.combo.valid.connect(lambda valid: self.force_refresh(valid)) # Plain text docstring option self.docstring = True @@ -750,11 +750,12 @@ self.rich_text.webview.load(QUrl(url)) #------ Public API --------------------------------------------------------- - def force_refresh(self): - if self.source_is_console(): - self.set_object_text(None, force_refresh=True) - elif self._last_editor_doc is not None: - self.set_editor_doc(self._last_editor_doc, force_refresh=True) + def force_refresh(self, valid=True): + if valid: + if self.source_is_console(): + self.set_object_text(None, force_refresh=True) + elif self._last_editor_doc is not None: + self.set_editor_doc(self._last_editor_doc, force_refresh=True) def set_object_text(self, text, force_refresh=False, ignore_unknown=False): """Set object analyzed by Help""" @@ -829,11 +830,14 @@ def save_history(self): """Save history to a text file in user home directory""" + # Don't fail when saving search history to disk + # See issues 8878 and 6864 try: - open(self.LOG_PATH, 'w').write("\n".join( \ - [to_text_string(self.combo.itemText(index)) - for index in range(self.combo.count())] )) - except (UnicodeDecodeError, EnvironmentError): + search_history = [to_text_string(self.combo.itemText(index)) + for index in range(self.combo.count())] + search_history = '\n'.join(search_history) + open(self.LOG_PATH, 'w').write(search_history) + except (UnicodeEncodeError, UnicodeDecodeError, EnvironmentError): pass @Slot(bool) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/plugins/ipythonconsole.py new/spyder-3.3.4/spyder/plugins/ipythonconsole.py --- old/spyder-3.3.2/spyder/plugins/ipythonconsole.py 2018-11-24 16:08:37.000000000 +0100 +++ new/spyder-3.3.4/spyder/plugins/ipythonconsole.py 2019-03-31 20:36:33.000000000 +0200 @@ -659,7 +659,8 @@ "required to create IPython consoles. Please " "make it writable.") - def __init__(self, parent, test_dir=None, test_no_stderr=False): + def __init__(self, parent, testing=False, test_dir=None, + test_no_stderr=False): """Ipython Console constructor.""" if PYQT5: SpyderPluginWidget.__init__(self, parent, main = parent) @@ -675,6 +676,7 @@ self.create_new_client_if_empty = True # Attrs for testing + self.testing = testing self.test_dir = test_dir self.test_no_stderr = test_no_stderr @@ -1136,8 +1138,13 @@ client.show_kernel_error(km) return - kc.started_channels.connect(lambda c=client: self.process_started(c)) - kc.stopped_channels.connect(lambda c=client: self.process_finished(c)) + # This avoids a recurrent, spurious NameError when running our + # tests in our CIs + if not self.testing: + kc.started_channels.connect( + lambda c=client: self.process_started(c)) + kc.stopped_channels.connect( + lambda c=client: self.process_finished(c)) kc.start_channels(shell=True, iopub=True) shellwidget = client.shellwidget diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/plugins/projects.py new/spyder-3.3.4/spyder/plugins/projects.py --- old/spyder-3.3.2/spyder/plugins/projects.py 2018-11-24 16:08:37.000000000 +0100 +++ new/spyder-3.3.4/spyder/plugins/projects.py 2019-03-31 20:36:33.000000000 +0200 @@ -179,7 +179,7 @@ self.toggle_view_action.setChecked(True) self.visibility_changed(True) - #------ Public API --------------------------------------------------------- + # ------ Public API ------------------------------------------------------- def setup_menu_actions(self): """Setup and update the menu actions.""" self.recent_project_menu.clear() @@ -188,15 +188,13 @@ for project in self.recent_projects: if self.is_valid_project(project): name = project.replace(get_home_dir(), '~') - - def slot(): - self.switch_to_plugin() - self.open_project(path=project) - - action = create_action(self, + action = create_action( + self, name, - icon = ima.icon('project'), - triggered=slot) + icon=ima.icon('project'), + triggered=( + lambda _, p=project: self.open_project(path=p)) + ) self.recent_projects_actions.append(action) else: self.recent_projects.remove(project) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/plugins/tests/test_help.py new/spyder-3.3.4/spyder/plugins/tests/test_help.py --- old/spyder-3.3.2/spyder/plugins/tests/test_help.py 2018-11-24 16:08:38.000000000 +0100 +++ new/spyder-3.3.4/spyder/plugins/tests/test_help.py 2019-03-31 20:36:33.000000000 +0200 @@ -17,6 +17,7 @@ from mock import Mock, MagicMock # Python 2 # Third party imports +from qtpy import PYQT_VERSION from qtpy.QtWidgets import QWidget from qtpy.QtWebEngineWidgets import WEBENGINE import pytest @@ -75,6 +76,7 @@ # Tests # ============================================================================= @flaky(max_runs=3) [email protected](PYQT_VERSION > '5.10', reason='Segfaults in PyQt 5.10+') def test_no_docs_message(help_plugin, qtbot): """ Test that no docs message is shown when instrospection plugins @@ -87,6 +89,7 @@ @flaky(max_runs=3) [email protected](PYQT_VERSION > '5.10', reason='Segfaults in PyQt 5.10+') def test_no_further_docs_message(help_plugin, qtbot): """ Test that no further docs message is shown when instrospection @@ -102,6 +105,7 @@ timeout=3000) [email protected](PYQT_VERSION > '5.10', reason='Segfaults in PyQt 5.10+') def test_help_opens_when_show_tutorial_unit(help_plugin, qtbot): """Test fix for #6317 : 'Show tutorial' opens the help plugin if closed.""" MockDockwidget = MagicMock() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/plugins/tests/test_init.py new/spyder-3.3.4/spyder/plugins/tests/test_init.py --- old/spyder-3.3.2/spyder/plugins/tests/test_init.py 2018-11-24 16:08:38.000000000 +0100 +++ new/spyder-3.3.4/spyder/plugins/tests/test_init.py 2019-03-31 20:36:33.000000000 +0200 @@ -16,6 +16,7 @@ # 3rd party imports import pytest +from qtpy import PYQT_VERSION from qtpy.QtCore import QEvent # Local imports @@ -25,6 +26,7 @@ # ============================================================================= # Tests # ============================================================================= [email protected](PYQT_VERSION > '5.10', reason='Segfaults in PyQt 5.10+') def test_tabfilter_typeerror_simple(): """Test for #5813 ; event filter handles None indicies when moving tabs.""" MockEvent = MagicMock() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/plugins/tests/test_ipythonconsole.py new/spyder-3.3.4/spyder/plugins/tests/test_ipythonconsole.py --- old/spyder-3.3.2/spyder/plugins/tests/test_ipythonconsole.py 2018-11-24 16:08:38.000000000 +0100 +++ new/spyder-3.3.4/spyder/plugins/tests/test_ipythonconsole.py 2019-03-31 20:36:33.000000000 +0200 @@ -112,6 +112,7 @@ # Create the console and a new client console = IPythonConsole(parent=MainWindowMock(), + testing=True, test_dir=test_dir, test_no_stderr=test_no_stderr) console.dockwidget = Mock() @@ -266,11 +267,14 @@ @pytest.mark.slow @flaky(max_runs=3) [email protected](PY2 and sys.platform == 'darwin', + reason="It hangs frequently on Python 2.7 and macOS") def test_console_import_namespace(ipyconsole, qtbot): """Test an import of the form 'from foo import *'.""" # Wait until the window is fully up shell = ipyconsole.get_current_shellwidget() - qtbot.waitUntil(lambda: shell._prompt_html is not None, timeout=SHELL_TIMEOUT) + qtbot.waitUntil(lambda: shell._prompt_html is not None, + timeout=SHELL_TIMEOUT) # Import numpy with qtbot.waitSignal(shell.executed): @@ -956,6 +960,7 @@ @pytest.mark.slow @flaky(max_runs=3) [email protected](os.name == 'nt', reason="It fails on Windows") def test_kernel_crash(ipyconsole, mocker, qtbot): """Test that we show kernel error messages when a kernel crash occurs.""" # Patch create_kernel_spec method to make it return a faulty diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/plugins/tests/test_projects.py new/spyder-3.3.4/spyder/plugins/tests/test_projects.py --- old/spyder-3.3.2/spyder/plugins/tests/test_projects.py 2018-11-24 16:08:38.000000000 +0100 +++ new/spyder-3.3.4/spyder/plugins/tests/test_projects.py 2019-03-31 20:36:33.000000000 +0200 @@ -120,5 +120,35 @@ assert projects.dockwidget.isVisible() == value +def test_recent_projects_menu_action(projects, tmpdir): + """ + Test that the actions of the submenu 'Recent Projects' in the 'Projects' + main menu are working as expected. + Regression test for Issue #8450. + """ + recent_projects_len = len(projects.recent_projects) + + # Create the directories. + path0 = to_text_string(tmpdir.mkdir('project0')) + path1 = to_text_string(tmpdir.mkdir('project1')) + path2 = to_text_string(tmpdir.mkdir('project2')) + + # Open projects in path0, path1, and path2. + projects.open_project(path=path0) + projects.open_project(path=path1) + projects.open_project(path=path2) + assert (len(projects.recent_projects_actions) == + recent_projects_len + 3 + 2) + assert projects.get_active_project().root_path == path2 + + # Trigger project1 in the list of Recent Projects actions. + projects.recent_projects_actions[1].trigger() + assert projects.get_active_project().root_path == path1 + + # Trigger project0 in the list of Recent Projects actions. + projects.recent_projects_actions[2].trigger() + assert projects.get_active_project().root_path == path0 + + if __name__ == "__main__": pytest.main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/utils/introspection/plugin_client.py new/spyder-3.3.4/spyder/utils/introspection/plugin_client.py --- old/spyder-3.3.2/spyder/utils/introspection/plugin_client.py 2018-11-24 16:08:38.000000000 +0100 +++ new/spyder-3.3.4/spyder/utils/introspection/plugin_client.py 2019-03-31 20:36:33.000000000 +0200 @@ -101,7 +101,10 @@ self.process.finished.connect(self._on_finished) running = self.process.waitForStarted() if not running: - raise IOError('Could not start %s' % self) + # Don't raise an error if the plugin fails to start + # Fixes issue 8934 + debug_print('Could not start %s' % self) + return # Set up the socket notifer. fid = self.socket.getsockopt(zmq.FD) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/utils/ipython/kernelspec.py new/spyder-3.3.4/spyder/utils/ipython/kernelspec.py --- old/spyder-3.3.2/spyder/utils/ipython/kernelspec.py 2018-11-24 16:08:38.000000000 +0100 +++ new/spyder-3.3.4/spyder/utils/ipython/kernelspec.py 2019-03-31 20:36:33.000000000 +0200 @@ -76,7 +76,7 @@ pathlist = CONF.get('main', 'spyder_pythonpath', default=[]) default_interpreter = CONF.get('main_interpreter', 'default') pypath = add_pathlist_to_PYTHONPATH([], pathlist, ipyconsole=True, - drop_env=(not default_interpreter)) + drop_env=False) # Environment variables that we need to pass to our sitecustomize umr_namelist = CONF.get('main_interpreter', 'umr/namelist') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/utils/ipython/tests/test_spyder_kernel.py new/spyder-3.3.4/spyder/utils/ipython/tests/test_spyder_kernel.py --- old/spyder-3.3.2/spyder/utils/ipython/tests/test_spyder_kernel.py 2018-11-24 16:08:38.000000000 +0100 +++ new/spyder-3.3.4/spyder/utils/ipython/tests/test_spyder_kernel.py 2019-03-31 20:36:33.000000000 +0200 @@ -12,11 +12,34 @@ import pytest from spyder.config.main import CONF -from spyder.py3compat import PY2, is_binary_string +from spyder.py3compat import PY2, is_binary_string, to_text_string from spyder.utils.encoding import to_fs_from_unicode from spyder.utils.ipython.kernelspec import SpyderKernelSpec [email protected]('default_interpreter', [True, False]) +def test_preserve_pypath(tmpdir, default_interpreter): + """ + Test that we preserve PYTHONPATH in the env vars passed to the kernel + when an external interpreter is used or not. + + Regression test for issue 8681. + """ + # Set default interpreter value + CONF.set('main_interpreter', 'default', default_interpreter) + + # Add a path to PYTHONPATH env var + pypath = to_text_string(tmpdir.mkdir('test-pypath')) + os.environ['PYTHONPATH'] = pypath + + # Check that PYTHONPATH is in our kernelspec + kernel_spec = SpyderKernelSpec() + assert pypath in kernel_spec.env['PYTHONPATH'] + + # Restore default value + CONF.set('main_interpreter', 'default', True) + + def test_python_interpreter(tmpdir): """Test the validation of the python interpreter.""" # Set a non existing python interpreter diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/utils/syntaxhighlighters.py new/spyder-3.3.4/spyder/utils/syntaxhighlighters.py --- old/spyder-3.3.2/spyder/utils/syntaxhighlighters.py 2018-11-24 16:08:38.000000000 +0100 +++ new/spyder-3.3.4/spyder/utils/syntaxhighlighters.py 2019-03-31 20:36:33.000000000 +0200 @@ -1196,16 +1196,18 @@ """ try: from pygments.lexers import get_lexer_for_filename, get_lexer_by_name - from pygments.util import ClassNotFound - except ImportError: + except Exception: return TextSH root, ext = os.path.splitext(filename) if ext in custom_extension_lexer_mapping: - lexer = get_lexer_by_name(custom_extension_lexer_mapping[ext]) + try: + lexer = get_lexer_by_name(custom_extension_lexer_mapping[ext]) + except Exception: + return TextSH else: try: lexer = get_lexer_for_filename(filename) - except ClassNotFound: + except Exception: return TextSH class GuessedPygmentsSH(PygmentsSH): _lexer = lexer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/utils/tests/test_programs.py new/spyder-3.3.4/spyder/utils/tests/test_programs.py --- old/spyder-3.3.2/spyder/utils/tests/test_programs.py 2018-11-17 22:16:47.000000000 +0100 +++ new/spyder-3.3.4/spyder/utils/tests/test_programs.py 2019-03-31 20:36:33.000000000 +0200 @@ -25,7 +25,11 @@ VALID_W_INTERPRETER = os.path.join(python_dir, 'pythonw.exe') INVALID_INTERPRETER = os.path.join(python_dir, 'Scripts', 'ipython.exe') else: - home_dir = os.environ['HOME'] + if sys.platform.startswith('linux'): + home_dir = os.environ['HOME'] + else: + # Parent Miniconda dir in macOS Azure VMs + home_dir = os.path.join('/usr', 'local') VALID_INTERPRETER = os.path.join(home_dir, 'miniconda', 'bin', 'python') VALID_W_INTERPRETER = os.path.join(home_dir, 'miniconda', 'bin', 'pythonw') INVALID_INTERPRETER = os.path.join(home_dir, 'miniconda', 'bin', 'ipython') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/widgets/github/gh_login.py new/spyder-3.3.4/spyder/widgets/github/gh_login.py --- old/spyder-3.3.2/spyder/widgets/github/gh_login.py 2018-11-17 22:16:47.000000000 +0100 +++ new/spyder-3.3.4/spyder/widgets/github/gh_login.py 2019-03-31 12:48:40.000000000 +0200 @@ -33,7 +33,7 @@ def __init__(self, parent, username, password, token, remember=False, remember_token=False): - super(DlgGitHubLogin, self).__init__(parent) + QDialog.__init__(self, parent) title = _("Sign in to Github") self.resize(415, 375) @@ -91,10 +91,10 @@ basic_layout.addSpacerItem(QSpacerItem(QSpacerItem(0, 8))) basic_layout.addWidget(basic_lbl_msg) basic_layout.addSpacerItem( - QSpacerItem(QSpacerItem(0, 1000, vPolicy=QSizePolicy.Expanding))) + QSpacerItem(QSpacerItem(0, 50, vPolicy=QSizePolicy.Expanding))) basic_layout.addLayout(basic_form_layout) basic_layout.addSpacerItem( - QSpacerItem(QSpacerItem(0, 1000, vPolicy=QSizePolicy.Expanding))) + QSpacerItem(QSpacerItem(0, 50, vPolicy=QSizePolicy.Expanding))) basic_auth.setLayout(basic_layout) self.tabs.addTab(basic_auth, _("Password Only")) @@ -137,10 +137,10 @@ token_layout.addSpacerItem(QSpacerItem(QSpacerItem(0, 8))) token_layout.addWidget(token_lbl_msg) token_layout.addSpacerItem( - QSpacerItem(QSpacerItem(0, 1000, vPolicy=QSizePolicy.Expanding))) + QSpacerItem(QSpacerItem(0, 50, vPolicy=QSizePolicy.Expanding))) token_layout.addLayout(token_form_layout) token_layout.addSpacerItem( - QSpacerItem(QSpacerItem(0, 1000, vPolicy=QSizePolicy.Expanding))) + QSpacerItem(QSpacerItem(0, 50, vPolicy=QSizePolicy.Expanding))) token_auth.setLayout(token_layout) self.tabs.addTab(token_auth, _("Access Token")) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/widgets/ipythonconsole/client.py new/spyder-3.3.4/spyder/widgets/ipythonconsole/client.py --- old/spyder-3.3.2/spyder/widgets/ipythonconsole/client.py 2018-11-24 16:08:38.000000000 +0100 +++ new/spyder-3.3.4/spyder/widgets/ipythonconsole/client.py 2019-03-31 20:36:33.000000000 +0200 @@ -668,9 +668,19 @@ def _read_stderr(self): """Read the stderr file of the kernel.""" + # We need to read stderr_file as bytes to be able to + # detect its encoding with chardet f = open(self.stderr_file, 'rb') + try: stderr_text = f.read() + + # This is needed to avoid showing an empty error message + # when the kernel takes too much time to start. + # See issue 8581 + if not stderr_text: + return '' + # This is needed since the stderr file could be encoded # in something different to utf-8. # See issue 4191 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/widgets/ipythonconsole/shell.py new/spyder-3.3.4/spyder/widgets/ipythonconsole/shell.py --- old/spyder-3.3.2/spyder/widgets/ipythonconsole/shell.py 2018-11-24 16:08:38.000000000 +0100 +++ new/spyder-3.3.4/spyder/widgets/ipythonconsole/shell.py 2019-03-31 20:36:33.000000000 +0200 @@ -429,9 +429,9 @@ calling_mayavi = True break if calling_mayavi: - message = _("Changing backend to Qt4 for Mayavi") + message = _("Changing backend to Qt for Mayavi") self._append_plain_text(message + '\n') - self.silent_execute("%gui inline\n%gui qt4") + self.silent_execute("%gui inline\n%gui qt") def change_mpl_backend(self, command): """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/widgets/variableexplorer/arrayeditor.py new/spyder-3.3.4/spyder/widgets/variableexplorer/arrayeditor.py --- old/spyder-3.3.2/spyder/widgets/variableexplorer/arrayeditor.py 2018-11-24 16:08:38.000000000 +0100 +++ new/spyder-3.3.4/spyder/widgets/variableexplorer/arrayeditor.py 2019-03-31 20:36:33.000000000 +0200 @@ -617,7 +617,7 @@ return False if data is not supported, True otherwise """ self.data = data - self.data.flags.writeable = True + readonly = readonly or not self.data.flags.writeable is_record_array = data.dtype.names is not None is_masked_array = isinstance(data, np.ma.MaskedArray) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/widgets/variableexplorer/collectionseditor.py new/spyder-3.3.4/spyder/widgets/variableexplorer/collectionseditor.py --- old/spyder-3.3.2/spyder/widgets/variableexplorer/collectionseditor.py 2018-11-24 16:08:38.000000000 +0100 +++ new/spyder-3.3.4/spyder/widgets/variableexplorer/collectionseditor.py 2019-03-31 20:36:33.000000000 +0200 @@ -578,11 +578,21 @@ value = data['editor'].get_value() conv_func = data.get('conv', lambda v: v) self.set_value(index, conv_func(value)) - self._editors.pop(editor_id) + # This is needed to avoid the problem reported on + # issue 8557 + try: + self._editors.pop(editor_id) + except KeyError: + pass self.free_memory() def editor_rejected(self, editor_id): - self._editors.pop(editor_id) + # This is needed to avoid the problem reported on + # issue 8557 + try: + self._editors.pop(editor_id) + except KeyError: + pass self.free_memory() def free_memory(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/widgets/variableexplorer/dataframeeditor.py new/spyder-3.3.4/spyder/widgets/variableexplorer/dataframeeditor.py --- old/spyder-3.3.2/spyder/widgets/variableexplorer/dataframeeditor.py 2018-11-24 16:08:38.000000000 +0100 +++ new/spyder-3.3.4/spyder/widgets/variableexplorer/dataframeeditor.py 2019-03-31 20:36:33.000000000 +0200 @@ -414,10 +414,16 @@ def rowCount(self, index=QModelIndex()): """DataFrame row number""" - if self.total_rows <= self.rows_loaded: - return self.total_rows - else: - return self.rows_loaded + # Avoid a "Qt exception in virtual methods" generated in our + # tests on Windows/Python 3.7 + # See PR 8910 + try: + if self.total_rows <= self.rows_loaded: + return self.total_rows + else: + return self.rows_loaded + except AttributeError: + return 0 def can_fetch_more(self, rows=False, columns=False): if rows: @@ -449,13 +455,19 @@ def columnCount(self, index=QModelIndex()): """DataFrame column number""" - # This is done to implement series - if len(self.df.shape) == 1: - return 2 - elif self.total_cols <= self.cols_loaded: - return self.total_cols + 1 - else: - return self.cols_loaded + 1 + # Avoid a "Qt exception in virtual methods" generated in our + # tests on Windows/Python 3.7 + # See PR 8910 + try: + # This is done to implement series + if len(self.df.shape) == 1: + return 2 + elif self.total_cols <= self.cols_loaded: + return self.total_cols + 1 + else: + return self.cols_loaded + 1 + except AttributeError: + return 0 def reset(self): self.beginResetModel() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder/widgets/variableexplorer/namespacebrowser.py new/spyder-3.3.4/spyder/widgets/variableexplorer/namespacebrowser.py --- old/spyder-3.3.2/spyder/widgets/variableexplorer/namespacebrowser.py 2018-11-24 16:08:38.000000000 +0100 +++ new/spyder-3.3.4/spyder/widgets/variableexplorer/namespacebrowser.py 2019-03-31 20:36:33.000000000 +0200 @@ -488,7 +488,14 @@ QApplication.restoreOverrideCursor() QApplication.processEvents() if error_message is not None: - QMessageBox.critical(self, _("Save data"), - _("<b>Unable to save current workspace</b>" - "<br><br>Error message:<br>%s") % error_message) + if 'Some objects could not be saved:' in error_message: + save_data_message = ( + _('<b>Some objects could not be saved:</b>') + + '<br><br><code>{obj_list}</code>'.format( + obj_list=error_message.split(': ')[1])) + else: + save_data_message = _( + '<b>Unable to save current workspace</b>' + '<br><br>Error message:<br>') + error_message + QMessageBox.critical(self, _("Save data"), save_data_message) self.save_button.setEnabled(self.filename is not None) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder_io_hdf5/__init__.py new/spyder-3.3.4/spyder_io_hdf5/__init__.py --- old/spyder-3.3.2/spyder_io_hdf5/__init__.py 2018-11-24 16:08:38.000000000 +0100 +++ new/spyder-3.3.4/spyder_io_hdf5/__init__.py 2019-03-31 20:36:33.000000000 +0200 @@ -7,3 +7,5 @@ FORMAT_EXT = ".h5" FORMAT_LOAD = load_hdf5 FORMAT_SAVE = save_hdf5 + +PLUGIN_CLASS = True diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spyder-3.3.2/spyder_pylint/widgets/pylintgui.py new/spyder-3.3.4/spyder_pylint/widgets/pylintgui.py --- old/spyder-3.3.2/spyder_pylint/widgets/pylintgui.py 2018-11-24 16:08:38.000000000 +0100 +++ new/spyder-3.3.4/spyder_pylint/widgets/pylintgui.py 2019-03-31 20:36:33.000000000 +0200 @@ -219,6 +219,7 @@ if self.rdata: self.remove_obsolete_items() self.filecombo.addItems(self.get_filenames()) + self.start_button.setEnabled(self.filecombo.is_valid()) else: self.start_button.setEnabled(False)
