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: ![Spyder — The Scientific Python Development Environment](
+        ./img_src/spyder_readme_banner.png)
+        
+        *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](https://img.shields.io/pypi/l/spyder.svg)](./LICENSE.txt)
+        [![pypi 
version](https://img.shields.io/pypi/v/spyder.svg)](https://pypi.org/project/spyder/)
+        [![conda 
version](https://img.shields.io/conda/vn/conda-forge/spyder.svg)](https://www.anaconda.com/download/)
+        [![download 
count](https://img.shields.io/conda/dn/conda-forge/spyder.svg)](https://www.anaconda.com/download/)
+        [![OpenCollective 
Backers](https://opencollective.com/spyder/backers/badge.svg?color=blue)](#backers)
+        [![OpenCollective 
Sponsors](https://opencollective.com/spyder/sponsors/badge.svg?color=blue)](#sponsors)
+        [![Join the chat at 
https://gitter.im/spyder-ide/public](https://badges.gitter.im/spyder-ide/spyder.svg)](https://gitter.im/spyder-ide/public)<br>
+        [![PyPI 
status](https://img.shields.io/pypi/status/spyder.svg)](https://github.com/spyder-ide/spyder)
+        [![Travis 
status](https://travis-ci.org/spyder-ide/spyder.svg?branch=master)](https://travis-ci.org/spyder-ide/spyder)
+        
[![CircleCI](https://circleci.com/gh/spyder-ide/spyder.svg?style=shield)](https://circleci.com/gh/spyder-ide/spyder)
+        [![Coverage 
Status](https://coveralls.io/repos/github/spyder-ide/spyder/badge.svg?branch=master)](https://coveralls.io/github/spyder-ide/spyder?branch=master)
+        
[![codecov](https://codecov.io/gh/spyder-ide/spyder/branch/master/graph/badge.svg)](https://codecov.io/gh/spyder-ide/spyder)
+        
+        
+        ![Screenshot of Spyder's main window](./img_src/screenshot.png)
+        
+        
+        ## 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 @@
 ![Spyder — The Scientific Python Development Environment](
 ./img_src/spyder_readme_banner.png)
 
-*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 @@
 [![Join the chat at 
https://gitter.im/spyder-ide/public](https://badges.gitter.im/spyder-ide/spyder.svg)](https://gitter.im/spyder-ide/public)<br>
 [![PyPI 
status](https://img.shields.io/pypi/status/spyder.svg)](https://github.com/spyder-ide/spyder)
 [![Travis 
status](https://travis-ci.org/spyder-ide/spyder.svg?branch=master)](https://travis-ci.org/spyder-ide/spyder)
-[![AppVeyor 
status](https://ci.appveyor.com/api/projects/status/tvjcqa4kf53br8s0/branch/master?svg=true)](https://ci.appveyor.com/project/spyder-ide/spyder/branch/master)
 
[![CircleCI](https://circleci.com/gh/spyder-ide/spyder.svg?style=shield)](https://circleci.com/gh/spyder-ide/spyder)
 [![Coverage 
Status](https://coveralls.io/repos/github/spyder-ide/spyder/badge.svg?branch=master)](https://coveralls.io/github/spyder-ide/spyder?branch=master)
 
[![codecov](https://codecov.io/gh/spyder-ide/spyder/branch/master/graph/badge.svg)](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 &copy; 2009-2018 Spyder Project Contributors
+            <br>Copyright &copy; 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)
 


Reply via email to