Hello community,

here is the log from the commit of package python-jupyter_ipython for 
openSUSE:Factory checked in at 2019-03-26 15:45:11
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-jupyter_ipython (Old)
 and      /work/SRC/openSUSE:Factory/.python-jupyter_ipython.new.25356 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-jupyter_ipython"

Tue Mar 26 15:45:11 2019 rev:16 rq:688366 version:7.4.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-jupyter_ipython/python-jupyter_ipython-doc.changes
        2019-03-04 09:22:16.432580482 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-jupyter_ipython.new.25356/python-jupyter_ipython-doc.changes
     2019-03-26 15:45:17.236088989 +0100
@@ -1,0 +2,17 @@
+Sun Mar 24 01:20:20 UTC 2019 - Arun Persaud <a...@gmx.de>
+
+- update to version 7.4.0:
+  * Previously, we provided completion for a unicode name with its
+    relative symbol.With this, now IPython provides complete
+    suggestions to unicode name symbols.
+  * Make audio normalization optional
+  * Miscelanious
+    + Fix improper acceptation of "return" outside of
+      functions. :ghpull:`11641`.
+    + Fixed PyQt 5.11 backwards incompatibility causing sip import
+      failure.  :ghpull:`11613`.
+    + Fix Bug where "type?" woudl crash IPython. :ghpull:`1608`.
+    + Allow to apply "@needs_local_scope" to cell magics for
+      convenience.  :ghpull:`11542`.
+
+-------------------------------------------------------------------
python-jupyter_ipython.changes: same change

Old:
----
  ipython-7.3.0.tar.gz

New:
----
  ipython-7.4.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-jupyter_ipython-doc.spec ++++++
--- /var/tmp/diff_new_pack.nb2S1U/_old  2019-03-26 15:45:19.592086228 +0100
+++ /var/tmp/diff_new_pack.nb2S1U/_new  2019-03-26 15:45:19.596086223 +0100
@@ -21,7 +21,7 @@
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 %define         oldpython python
 Name:           python-jupyter_ipython-doc
-Version:        7.3.0
+Version:        7.4.0
 Release:        0
 Summary:        Documentation for python3-jupyter_ipython
 License:        BSD-3-Clause

++++++ python-jupyter_ipython.spec ++++++
--- /var/tmp/diff_new_pack.nb2S1U/_old  2019-03-26 15:45:19.616086200 +0100
+++ /var/tmp/diff_new_pack.nb2S1U/_new  2019-03-26 15:45:19.620086195 +0100
@@ -20,7 +20,7 @@
 %define         skip_python2 1
 %bcond_without  iptest
 Name:           python-jupyter_ipython
-Version:        7.3.0
+Version:        7.4.0
 Release:        0
 Summary:        Rich architecture for interactive computing with Python
 License:        BSD-3-Clause


++++++ ipython-7.3.0.tar.gz -> ipython-7.4.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/.mailmap new/ipython-7.4.0/.mailmap
--- old/ipython-7.3.0/.mailmap  2018-11-04 18:33:17.000000000 +0100
+++ new/ipython-7.4.0/.mailmap  2019-03-21 22:02:41.000000000 +0100
@@ -93,6 +93,7 @@
 Laurent Dufréchou <laurent.dufrec...@gmail.com> Laurent Dufrechou <>
 Laurent Dufréchou <laurent.dufrec...@gmail.com> laurent.dufrec...@gmail.com <>
 Laurent Dufréchou <laurent.dufrec...@gmail.com> ldufrechou <ldufrechou@PEP>
+Luciana da Costa Marques <lucianadacostamarq...@gmail.com> luciana 
<lucianadacostamarq...@gmail.com>
 Lorena Pantano <lorena.pant...@gmail.com> Lorena <lorena.pant...@gmail.com>
 Luis Pedro Coelho <l...@luispedro.org> Luis Pedro Coelho <l...@cmu.edu>
 Marc Molla <marcmo...@gmail.com> marcmolla <marcmo...@gmail.com>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/IPython/core/async_helpers.py 
new/ipython-7.4.0/IPython/core/async_helpers.py
--- old/ipython-7.3.0/IPython/core/async_helpers.py     2018-11-04 
18:33:17.000000000 +0100
+++ new/ipython-7.4.0/IPython/core/async_helpers.py     2019-03-21 
21:34:04.000000000 +0100
@@ -112,6 +112,7 @@
         if isinstance(node, func_types) and should_traverse:
             self.depth += 1
             super().generic_visit(node)
+            self.depth -= 1
         elif isinstance(node, invalid_types_by_depth[self.depth]):
             raise SyntaxError()
         else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/IPython/core/completer.py 
new/ipython-7.4.0/IPython/core/completer.py
--- old/ipython-7.3.0/IPython/core/completer.py 2019-02-18 22:35:17.000000000 
+0100
+++ new/ipython-7.4.0/IPython/core/completer.py 2019-03-21 21:34:00.000000000 
+0100
@@ -67,9 +67,9 @@
 
 Starting with IPython 6.0, this module can make use of the Jedi library to
 generate completions both using static analysis of the code, and dynamically
-inspecting multiple namespaces. The APIs attached to this new mechanism is
-unstable and will raise unless use in an :any:`provisionalcompleter` context
-manager.
+inspecting multiple namespaces. Jedi is an autocompletion and static analysis 
+for Python. The APIs attached to this new mechanism is unstable and will 
+raise unless use in an :any:`provisionalcompleter` context manager.
 
 You will find that the following are experimental:
 
@@ -84,7 +84,7 @@
 
 We welcome any feedback on these new API, and we also encourage you to try this
 module in debug mode (start IPython with ``--Completer.debug=True``) in order
-to have extra logging information is :any:`jedi` is crashing, or if current
+to have extra logging information if :any:`jedi` is crashing, or if current
 IPython completer pending deprecations are returning results not yet handled
 by :any:`jedi`
 
@@ -168,6 +168,12 @@
 
 _deprecation_readline_sentinel = object()
 
+names = []
+for c in range(0,0x10FFFF + 1):
+    try:
+        names.append(unicodedata.name(chr(c)))
+    except ValueError:
+        pass
 
 class ProvisionalCompleterWarning(FutureWarning):
     """
@@ -1989,7 +1995,8 @@
                 return latex_text, latex_matches, 
['latex_matches']*len(latex_matches), ()
             name_text = ''
             name_matches = []
-            for meth in (self.unicode_name_matches, back_latex_name_matches, 
back_unicode_name_matches):
+            # need to add self.fwd_unicode_match() function here when done
+            for meth in (self.unicode_name_matches, back_latex_name_matches, 
back_unicode_name_matches, self.fwd_unicode_match):
                 name_text, name_matches = meth(base_text)
                 if name_text:
                     return name_text, name_matches[:MATCHES_LIMIT], \
@@ -2064,3 +2071,19 @@
         self.matches = _matches
 
         return text, _matches, origins, completions
+        
+    def fwd_unicode_match(self, text:str) -> Tuple[str, list]:
+        # initial code based on latex_matches() method
+        slashpos = text.rfind('\\')
+        # if text starts with slash
+        if slashpos > -1:
+            s = text[slashpos+1:]
+            candidates = [x for x in names if x.startswith(s)]
+            if candidates:
+                return s, [x for x in names if x.startswith(s)]
+            else:
+                return '', ()
+        
+        # if text does not start with slash
+        else:
+            return u'', ()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/IPython/core/events.py 
new/ipython-7.4.0/IPython/core/events.py
--- old/ipython-7.3.0/IPython/core/events.py    2018-11-03 22:32:57.000000000 
+0100
+++ new/ipython-7.4.0/IPython/core/events.py    2019-03-21 21:34:04.000000000 
+0100
@@ -86,7 +86,7 @@
         for func in self.callbacks[event][:]:
             try:
                 func(*args, **kwargs)
-            except Exception:
+            except (Exception, KeyboardInterrupt):
                 print("Error in callback {} (for {}):".format(func, event))
                 self.shell.showtraceback()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/IPython/core/interactiveshell.py 
new/ipython-7.4.0/IPython/core/interactiveshell.py
--- old/ipython-7.3.0/IPython/core/interactiveshell.py  2019-02-18 
22:35:17.000000000 +0100
+++ new/ipython-7.4.0/IPython/core/interactiveshell.py  2019-03-21 
21:34:04.000000000 +0100
@@ -2343,8 +2343,13 @@
                 magic_arg_s = line
             else:
                 magic_arg_s = self.var_expand(line, stack_depth)
+            kwargs = {}
+            if getattr(fn, "needs_local_scope", False):
+                kwargs['local_ns'] = sys._getframe(stack_depth).f_locals
+
             with self.builtin_trap:
-                result = fn(magic_arg_s, cell)
+                args = (magic_arg_s, cell)
+                result = fn(*args, **kwargs)
             return result
 
     def find_line_magic(self, magic_name):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/IPython/core/oinspect.py 
new/ipython-7.4.0/IPython/core/oinspect.py
--- old/ipython-7.3.0/IPython/core/oinspect.py  2019-01-06 21:28:19.000000000 
+0100
+++ new/ipython-7.4.0/IPython/core/oinspect.py  2019-03-21 21:34:00.000000000 
+0100
@@ -860,7 +860,7 @@
             if init_ds:
                 out['init_docstring'] = init_ds
 
-            names = [sub.__name__ for sub in obj.__subclasses__()]
+            names = [sub.__name__ for sub in type.__subclasses__(obj)]
             if len(names) < 10:
                 all_names = ', '.join(names)
             else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/IPython/core/release.py 
new/ipython-7.4.0/IPython/core/release.py
--- old/ipython-7.3.0/IPython/core/release.py   2019-02-18 22:58:52.000000000 
+0100
+++ new/ipython-7.4.0/IPython/core/release.py   2019-03-21 22:17:21.000000000 
+0100
@@ -20,7 +20,7 @@
 # release.  'dev' as a _version_extra string means this is a development
 # version
 _version_major = 7
-_version_minor = 3
+_version_minor = 4
 _version_patch = 0
 _version_extra = '.dev'
 # _version_extra = 'b1'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ipython-7.3.0/IPython/core/tests/test_async_helpers.py 
new/ipython-7.4.0/IPython/core/tests/test_async_helpers.py
--- old/ipython-7.3.0/IPython/core/tests/test_async_helpers.py  2018-11-04 
18:33:17.000000000 +0100
+++ new/ipython-7.4.0/IPython/core/tests/test_async_helpers.py  2019-03-21 
21:34:04.000000000 +0100
@@ -139,7 +139,13 @@
             tl_err_test_cases = self._get_top_level_cases()
             tl_err_test_cases.extend(self._get_ry_syntax_errors())
 
-            vals = ('return', 'yield', 'yield from (_ for _ in range(3))')
+            vals = ('return', 'yield', 'yield from (_ for _ in range(3))',
+                    dedent('''
+                        def f():
+                            pass
+                        return
+                        '''),
+                    )
 
             for test_name, test_case in tl_err_test_cases:
                 # This example should work if 'pass' is used as the value
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/IPython/core/tests/test_events.py 
new/ipython-7.4.0/IPython/core/tests/test_events.py
--- old/ipython-7.3.0/IPython/core/tests/test_events.py 2018-11-03 
22:32:57.000000000 +0100
+++ new/ipython-7.4.0/IPython/core/tests/test_events.py 2019-03-21 
21:34:04.000000000 +0100
@@ -51,6 +51,12 @@
         with tt.AssertPrints("Error in callback"):
             self.em.trigger('ping_received')
 
+    def test_cb_keyboard_interrupt(self):
+        cb = Mock(side_effect=KeyboardInterrupt)
+        self.em.register('ping_received', cb)
+        with tt.AssertPrints("Error in callback"):
+            self.em.trigger('ping_received')
+
     def test_unregister_during_callback(self):
         invoked = [False] * 3
         
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/IPython/core/tests/test_oinspect.py 
new/ipython-7.4.0/IPython/core/tests/test_oinspect.py
--- old/ipython-7.3.0/IPython/core/tests/test_oinspect.py       2019-01-06 
21:28:19.000000000 +0100
+++ new/ipython-7.4.0/IPython/core/tests/test_oinspect.py       2019-03-21 
21:34:00.000000000 +0100
@@ -363,6 +363,12 @@
     ip.user_ns['nonascii2'] = nonascii2
     ip._inspect('pinfo', 'nonascii2', detail_level=1)
 
+def test_pinfo_type():
+    """
+    type can fail in various edge case, for example `type.__subclass__()`
+    """
+    ip._inspect('pinfo', 'type')
+
 
 def test_pinfo_docstring_no_source():
     """Docstring should be included with detail_level=1 if there is no 
source"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/IPython/external/qt_loaders.py 
new/ipython-7.4.0/IPython/external/qt_loaders.py
--- old/ipython-7.3.0/IPython/external/qt_loaders.py    2018-11-19 
20:37:00.000000000 +0100
+++ new/ipython-7.4.0/IPython/external/qt_loaders.py    2019-03-21 
21:34:00.000000000 +0100
@@ -217,10 +217,9 @@
 
     ImportErrors rasied within this function are non-recoverable
     """
-    import sip
 
     from PyQt5 import QtCore, QtSvg, QtWidgets, QtGui
-
+    
     # Alias PyQt-specific functions for PySide compatibility.
     QtCore.Signal = QtCore.pyqtSignal
     QtCore.Slot = QtCore.pyqtSlot
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/IPython/lib/display.py 
new/ipython-7.4.0/IPython/lib/display.py
--- old/ipython-7.3.0/IPython/lib/display.py    2019-01-06 21:28:19.000000000 
+0100
+++ new/ipython-7.4.0/IPython/lib/display.py    2019-03-21 21:34:04.000000000 
+0100
@@ -54,6 +54,12 @@
     autoplay : bool
         Set to True if the audio should immediately start playing.
         Default is `False`.
+    normalize : bool
+        Whether audio should be normalized (rescaled) to the maximum possible
+        range. Default is `True`. When set to `False`, `data` must be between
+        -1 and 1 (inclusive), otherwise an error is raised.
+        Applies only when `data` is a list or array of samples; other types of
+        audio are never normalized.
 
     Examples
     --------
@@ -83,9 +89,9 @@
     """
     _read_flags = 'rb'
 
-    def __init__(self, data=None, filename=None, url=None, embed=None, 
rate=None, autoplay=False):
+    def __init__(self, data=None, filename=None, url=None, embed=None, 
rate=None, autoplay=False, normalize=True):
         if filename is None and url is None and data is None:
-            raise ValueError("No image data found. Expecting filename, url, or 
data.")
+            raise ValueError("No audio data found. Expecting filename, url, or 
data.")
         if embed is False and url is None:
             raise ValueError("No url found. Expecting url when embed=False")
 
@@ -97,7 +103,9 @@
         super(Audio, self).__init__(data=data, url=url, filename=filename)
 
         if self.data is not None and not isinstance(self.data, bytes):
-            self.data = self._make_wav(data,rate)
+            if rate is None:
+                raise ValueError("rate must be specified when data is a numpy 
array or list of audio samples.")
+            self.data = Audio._make_wav(data, rate, normalize)
 
     def reload(self):
         """Reload the raw data from file or URL."""
@@ -112,41 +120,17 @@
         else:
             self.mimetype = "audio/wav"
 
-    def _make_wav(self, data, rate):
+    @staticmethod
+    def _make_wav(data, rate, normalize):
         """ Transform a numpy array to a PCM bytestring """
         import struct
         from io import BytesIO
         import wave
 
         try:
-            import numpy as np
-
-            data = np.array(data, dtype=float)
-            if len(data.shape) == 1:
-                nchan = 1
-            elif len(data.shape) == 2:
-                # In wave files,channels are interleaved. E.g.,
-                # "L1R1L2R2..." for stereo. See
-                # 
http://msdn.microsoft.com/en-us/library/windows/hardware/dn653308(v=vs.85).aspx
-                # for channel ordering
-                nchan = data.shape[0]
-                data = data.T.ravel()
-            else:
-                raise ValueError('Array audio input must be a 1D or 2D array')
-            scaled = np.int16(data/np.max(np.abs(data))*32767).tolist()
+            scaled, nchan = Audio._validate_and_normalize_with_numpy(data, 
normalize)
         except ImportError:
-            # check that it is a "1D" list
-            idata = iter(data)  # fails if not an iterable
-            try:
-                iter(idata.next())
-                raise TypeError('Only lists of mono audio are '
-                    'supported if numpy is not installed')
-            except TypeError:
-                # this means it's not a nested list, which is what we want
-                pass
-            maxabsvalue = float(max([abs(x) for x in data]))
-            scaled = [int(x/maxabsvalue*32767) for x in data]
-            nchan = 1
+            scaled, nchan = Audio._validate_and_normalize_without_numpy(data, 
normalize)
 
         fp = BytesIO()
         waveobj = wave.open(fp,mode='wb')
@@ -160,6 +144,48 @@
 
         return val
 
+    @staticmethod
+    def _validate_and_normalize_with_numpy(data, normalize):
+        import numpy as np
+
+        data = np.array(data, dtype=float)
+        if len(data.shape) == 1:
+            nchan = 1
+        elif len(data.shape) == 2:
+            # In wave files,channels are interleaved. E.g.,
+            # "L1R1L2R2..." for stereo. See
+            # 
http://msdn.microsoft.com/en-us/library/windows/hardware/dn653308(v=vs.85).aspx
+            # for channel ordering
+            nchan = data.shape[0]
+            data = data.T.ravel()
+        else:
+            raise ValueError('Array audio input must be a 1D or 2D array')
+        
+        max_abs_value = np.max(np.abs(data))
+        normalization_factor = Audio._get_normalization_factor(max_abs_value, 
normalize)
+        scaled = np.int16(data / normalization_factor * 32767).tolist()
+        return scaled, nchan
+
+
+    @staticmethod
+    def _validate_and_normalize_without_numpy(data, normalize):
+        try:
+            max_abs_value = float(max([abs(x) for x in data]))
+        except TypeError:
+            raise TypeError('Only lists of mono audio are '
+                'supported if numpy is not installed')
+
+        normalization_factor = Audio._get_normalization_factor(max_abs_value, 
normalize)
+        scaled = [int(x / normalization_factor * 32767) for x in data]
+        nchan = 1
+        return scaled, nchan
+
+    @staticmethod
+    def _get_normalization_factor(max_abs_value, normalize):
+        if not normalize and max_abs_value > 1:
+            raise ValueError('Audio data must be between -1 and 1 when 
normalize=False.')
+        return max_abs_value if normalize else 1
+
     def _data_and_metadata(self):
         """shortcut for returning metadata with url information, if defined"""
         md = {}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/IPython/lib/tests/test_display.py 
new/ipython-7.4.0/IPython/lib/tests/test_display.py
--- old/ipython-7.3.0/IPython/lib/tests/test_display.py 2018-11-03 
22:32:57.000000000 +0100
+++ new/ipython-7.4.0/IPython/lib/tests/test_display.py 2019-03-21 
21:34:04.000000000 +0100
@@ -19,13 +19,17 @@
     import pathlib
 except ImportError:
     pass
+from unittest import TestCase, mock
+import struct
+import wave
+from io import BytesIO
 
 # Third-party imports
 import nose.tools as nt
+import numpy
 
 # Our own imports
 from IPython.lib import display
-from IPython.testing.decorators import skipif_not_numpy
 
 #-----------------------------------------------------------------------------
 # Classes and functions
@@ -179,11 +183,71 @@
     actual = actual.split('\n')
     nt.assert_equal(len(actual), 2, actual)
 
-@skipif_not_numpy
 def test_audio_from_file():
     path = pjoin(dirname(__file__), 'test.wav')
     display.Audio(filename=path)
 
+class TestAudioDataWithNumpy(TestCase):
+    def test_audio_from_numpy_array(self):
+        test_tone = get_test_tone()
+        audio = display.Audio(test_tone, rate=44100)
+        nt.assert_equal(len(read_wav(audio.data)), len(test_tone))
+
+    def test_audio_from_list(self):
+        test_tone = get_test_tone()
+        audio = display.Audio(list(test_tone), rate=44100)
+        nt.assert_equal(len(read_wav(audio.data)), len(test_tone))
+
+    def test_audio_from_numpy_array_without_rate_raises(self):
+        nt.assert_raises(ValueError, display.Audio, get_test_tone())
+
+    def test_audio_data_normalization(self):
+        expected_max_value = numpy.iinfo(numpy.int16).max
+        for scale in [1, 0.5, 2]:
+            audio = display.Audio(get_test_tone(scale), rate=44100)
+            actual_max_value = numpy.max(numpy.abs(read_wav(audio.data)))
+            nt.assert_equal(actual_max_value, expected_max_value)
+
+    def test_audio_data_without_normalization(self):
+        max_int16 = numpy.iinfo(numpy.int16).max
+        for scale in [1, 0.5, 0.2]:
+            test_tone = get_test_tone(scale)
+            test_tone_max_abs = numpy.max(numpy.abs(test_tone))
+            expected_max_value = int(max_int16 * test_tone_max_abs)
+            audio = display.Audio(test_tone, rate=44100, normalize=False)
+            actual_max_value = numpy.max(numpy.abs(read_wav(audio.data)))
+            nt.assert_equal(actual_max_value, expected_max_value)
+
+    def test_audio_data_without_normalization_raises_for_invalid_data(self):
+        nt.assert_raises(
+            ValueError,
+            lambda: display.Audio([1.001], rate=44100, normalize=False))
+        nt.assert_raises(
+            ValueError,
+            lambda: display.Audio([-1.001], rate=44100, normalize=False))
+
+def simulate_numpy_not_installed():
+    return mock.patch('numpy.array', mock.MagicMock(side_effect=ImportError))
+
+@simulate_numpy_not_installed()
+class TestAudioDataWithoutNumpy(TestAudioDataWithNumpy):
+    # All tests from `TestAudioDataWithNumpy` are inherited.
+
+    def test_audio_raises_for_nested_list(self):
+        stereo_signal = [list(get_test_tone())] * 2
+        nt.assert_raises(
+            TypeError,
+            lambda: display.Audio(stereo_signal, rate=44100))
+
+def get_test_tone(scale=1):
+    return numpy.sin(2 * numpy.pi * 440 * numpy.linspace(0, 1, 44100)) * scale
+
+def read_wav(data):
+    with wave.open(BytesIO(data)) as wave_file:
+        wave_data = wave_file.readframes(wave_file.getnframes())
+        num_samples = wave_file.getnframes() * wave_file.getnchannels()
+        return struct.unpack('<%sh' % num_samples, wave_data)
+
 def test_code_from_file():
     c = display.Code(filename=__file__)
     assert c._repr_html_().startswith('<style>')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ipython-7.3.0/IPython/terminal/tests/test_debug_magic.py 
new/ipython-7.4.0/IPython/terminal/tests/test_debug_magic.py
--- old/ipython-7.3.0/IPython/terminal/tests/test_debug_magic.py        
2019-01-06 21:28:33.000000000 +0100
+++ new/ipython-7.4.0/IPython/terminal/tests/test_debug_magic.py        
2019-03-21 21:34:00.000000000 +0100
@@ -31,9 +31,12 @@
     env = os.environ.copy()
     child = pexpect.spawn(sys.executable, ['-m', 'IPython', 
'--colors=nocolor', '--simple-prompt'],
                           env=env)
-    child.timeout = 2
+    child.timeout = 15
 
     child.expect(in_prompt)
+
+    child.timeout = 2
+
     child.sendline("def f(x):")
     child.sendline("    raise Exception")
     child.sendline("")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/IPython/testing/iptest.py 
new/ipython-7.4.0/IPython/testing/iptest.py
--- old/ipython-7.3.0/IPython/testing/iptest.py 2019-01-06 21:28:19.000000000 
+0100
+++ new/ipython-7.4.0/IPython/testing/iptest.py 2019-03-21 21:34:04.000000000 
+0100
@@ -8,9 +8,9 @@
    calling this script (with different arguments) recursively.  This
    causes modules and package to be tested in different processes, using nose
    or trial where appropriate.
-2. With the regular nose syntax, like `iptest -vvs IPython`.  In this form
+2. With the regular nose syntax, like `iptest IPython -- -vvs`. In this form
    the script simply calls nose, but with special command line flags and
-   plugins loaded.
+   plugins loaded. Options after `--` are passed to nose.
 
 """
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/IPython/utils/_sysinfo.py 
new/ipython-7.4.0/IPython/utils/_sysinfo.py
--- old/ipython-7.3.0/IPython/utils/_sysinfo.py 2019-02-18 22:59:11.000000000 
+0100
+++ new/ipython-7.4.0/IPython/utils/_sysinfo.py 2019-03-21 22:18:12.000000000 
+0100
@@ -1,2 +1,2 @@
 # GENERATED BY setup.py
-commit = u"2e1cca5bc"
+commit = u"d774f565b"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/PKG-INFO new/ipython-7.4.0/PKG-INFO
--- old/ipython-7.3.0/PKG-INFO  2019-02-18 22:59:11.000000000 +0100
+++ new/ipython-7.4.0/PKG-INFO  2019-03-21 22:18:12.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: ipython
-Version: 7.3.0
+Version: 7.4.0
 Summary: IPython: Productive Interactive Computing
 Home-page: https://ipython.org
 Author: The IPython Development Team
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/docs/source/conf.py 
new/ipython-7.4.0/docs/source/conf.py
--- old/ipython-7.3.0/docs/source/conf.py       2018-11-04 18:33:17.000000000 
+0100
+++ new/ipython-7.4.0/docs/source/conf.py       2019-03-21 21:34:04.000000000 
+0100
@@ -224,7 +224,6 @@
 
 intersphinx_mapping = {'python': ('https://docs.python.org/3/', None),
                        'rpy2': 
('https://rpy2.readthedocs.io/en/version_2.8.x/', None),
-                       'traitlets': 
('https://traitlets.readthedocs.io/en/latest/', None),
                        'jupyterclient': 
('https://jupyter-client.readthedocs.io/en/latest/', None),
                        'ipyparallel': 
('https://ipyparallel.readthedocs.io/en/latest/', None),
                        'jupyter': 
('https://jupyter.readthedocs.io/en/latest/', None),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/docs/source/config/custommagics.rst 
new/ipython-7.4.0/docs/source/config/custommagics.rst
--- old/ipython-7.3.0/docs/source/config/custommagics.rst       2018-11-03 
22:32:57.000000000 +0100
+++ new/ipython-7.4.0/docs/source/config/custommagics.rst       2019-03-21 
21:34:04.000000000 +0100
@@ -134,6 +134,18 @@
    :func:`define_magic` function are advised to adjust their code
    for the current API.
 
+
+Accessing user namespace and local scope
+========================================
+
+When creating line magics, you may need to access surrounding scope  to get 
user
+variables (e.g when called inside functions). IPython provide the
+``@needs_local_scope`` decorator that can be imported from
+``IPython.core.magics``. When decorated with ``@needs_local_scope`` a magic 
will
+be passed ``local_ns`` as an argument. As a convenience ``@needs_local_scope``
+can also be applied to cell magics even if cell magics cannot appear at local
+scope context.
+
 Complete Example
 ================
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/docs/source/coredev/index.rst 
new/ipython-7.4.0/docs/source/coredev/index.rst
--- old/ipython-7.3.0/docs/source/coredev/index.rst     2019-02-18 
22:58:52.000000000 +0100
+++ new/ipython-7.4.0/docs/source/coredev/index.rst     2019-03-21 
21:34:04.000000000 +0100
@@ -39,32 +39,6 @@
 If the pull request cannot be automatically backported, the bot should tell you
 so on the PR and apply a "Need manual backport" tag to the origin PR.
 
-
-Backport with ghpro
--------------------
-
-We can also use `ghpro <https://pypi.python.org/pypi/ghpro>`_
-to automatically list and apply the PR on other branches. For example:
-
-.. code-block:: bash
-    
-    $ backport-pr todo --milestone 5.2
-    [...snip..]
-    The following PRs have been backported
-    9848
-    9851
-    9953
-    9955
-    The following PRs should be backported:
-    9417
-    9863
-    9925
-    9947
-
-    $ backport-pr apply 5.x 9947
-    [...snip...]
-
-
 .. _release_process:
 
 IPython release process
@@ -84,6 +58,9 @@
 
 Make sure you have all the required dependencies to run the tests as well.
 
+You can try to ``source tools/release_helper.sh`` when releasing via bash, it 
+should guide you through most of the process.
+
 
 1. Set Environment variables
 ----------------------------
@@ -222,13 +199,12 @@
 
 Create and push the tag::
 
-    git tag -am "release $VERSION" "$VERSION" -S
+    git tag -am "release $VERSION" "$VERSION" -s
     git push origin $VERSION
 
-(omit the ``-S`` if you are no signing the package)
+(omit the ``-s`` if you are no signing the package)
 
-Update release.py back to ``x.y-dev`` or ``x.y-maint``, and re-add the
-``development`` entry in ``docs/source/whatsnew/index.rst`` and push::
+Update release.py back to ``x.y-dev`` or ``x.y-maint`` commit and push::
 
     git commit -am "back to development" -S
     git push origin $BRANCH
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/docs/source/whatsnew/development.rst 
new/ipython-7.4.0/docs/source/whatsnew/development.rst
--- old/ipython-7.3.0/docs/source/whatsnew/development.rst      2018-11-29 
03:51:04.000000000 +0100
+++ new/ipython-7.4.0/docs/source/whatsnew/development.rst      2019-03-21 
21:34:04.000000000 +0100
@@ -23,6 +23,33 @@
    pr/*
 
 
+Unicode name completions
+========================
+
+Previously, we provided completion for a unicode name with its relative symbol.
+With this, now IPython provides complete suggestions to unicode name symbols.
+
+As on the PR, if user types ``\LAT<tab>``, IPython provides a list of
+possible completions. In this case, it would be something like:
+
+'LATIN CAPITAL LETTER A',
+'LATIN CAPITAL LETTER B',
+'LATIN CAPITAL LETTER C',
+'LATIN CAPITAL LETTER D',
+....
+
+This help to type unicode character that do not have short latex aliases, and
+have long unicode names. for example ``Ͱ``, ``\GREEK CAPITAL LETTER HETA``.
+
+This feature was contributed by Luciana Marques `ghpull:`#11583`.
+
+Make audio normalization optional
+=================================
+
+Added 'normalize' argument to `IPython.display.Audio`. This argument applies
+when audio data is given as an array of samples. The default of 
`normalize=True`
+preserves prior behavior of normalizing the audio to the maximum possible 
range.
+Setting to `False` disables normalization.
 
 .. DO NOT EDIT THIS LINE BEFORE RELEASE. FEATURE INSERTION POINT.
 
@@ -30,4 +57,4 @@
 Backwards incompatible changes
 ------------------------------
 
-.. DO NOT EDIT THIS LINE BEFORE RELEASE. INCOMPAT INSERTION POINT.
+.. DO NOT EDIT THIS LINE BEFORE RELEASE. INCOMPAT INSERTION POINT.
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ipython-7.3.0/docs/source/whatsnew/github-stats-7.rst 
new/ipython-7.4.0/docs/source/whatsnew/github-stats-7.rst
--- old/ipython-7.3.0/docs/source/whatsnew/github-stats-7.rst   2019-02-18 
22:50:03.000000000 +0100
+++ new/ipython-7.4.0/docs/source/whatsnew/github-stats-7.rst   2019-03-21 
21:34:04.000000000 +0100
@@ -1,6 +1,43 @@
 Issues closed in the 7.x development cycle
 ==========================================
 
+Issues closed in 7.4
+--------------------
+
+GitHub stats for 2019/02/18 - 2019/03/21 (tag: 7.3.0)
+
+These lists are automatically generated, and may be incomplete or contain 
duplicates.
+
+We closed 9 issues and merged 20 pull requests.
+The full list can be seen `on GitHub 
<https://github.com/ipython/ipython/issues?q=milestone%3A7.3>`__
+
+The following 23 authors contributed 69 commits.
+
+* anatoly techtonik
+* Benjamin Ragan-Kelley
+* bnables
+* Frédéric Chapoton
+* Gabriel Potter
+* Ian Bell
+* Jake VanderPlas
+* Jan S. (Milania1)
+* Jesse Widner
+* jsnydes
+* Kyungdahm Yun
+* Laurent Gautier
+* Luciana da Costa Marques
+* Matan Gover
+* Matthias Bussonnier
+* memeplex
+* Mickaël Schoentgen
+* Partha P. Mukherjee
+* Philipp A
+* Sanyam Agarwal
+* Steve Nicholson
+* Tony Fast
+* Wouter Overmeire
+
+
 Issues closed in 7.3
 --------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipython-7.3.0/docs/source/whatsnew/version7.rst 
new/ipython-7.4.0/docs/source/whatsnew/version7.rst
--- old/ipython-7.3.0/docs/source/whatsnew/version7.rst 2019-02-18 
22:38:24.000000000 +0100
+++ new/ipython-7.4.0/docs/source/whatsnew/version7.rst 2019-03-21 
21:34:04.000000000 +0100
@@ -2,6 +2,50 @@
  7.x Series
 ============
 
+.. _whatsnew740:
+
+IPython 7.4.0
+=============
+
+Unicode name completions
+------------------------
+
+Previously, we provided completion for a unicode name with its relative symbol.
+With this, now IPython provides complete suggestions to unicode name symbols.
+
+As on the PR, if user types ``\LAT<tab>``, IPython provides a list of
+possible completions. In this case, it would be something like::
+
+   'LATIN CAPITAL LETTER A',
+   'LATIN CAPITAL LETTER B',
+   'LATIN CAPITAL LETTER C',
+   'LATIN CAPITAL LETTER D',
+   ....
+
+This help to type unicode character that do not have short latex aliases, and
+have long unicode names. for example ``Ͱ``, ``\GREEK CAPITAL LETTER HETA``.
+
+This feature was contributed by Luciana Marques :ghpull:`11583`.
+
+Make audio normalization optional
+---------------------------------
+
+Added 'normalize' argument to `IPython.display.Audio`. This argument applies
+when audio data is given as an array of samples. The default of 
`normalize=True`
+preserves prior behavior of normalizing the audio to the maximum possible 
range.
+Setting to `False` disables normalization.
+
+
+Miscelanious
+------------
+
+ - Fix improper acceptation of ``return`` outside of functions. 
:ghpull:`11641`.
+ - Fixed PyQt 5.11 backwards incompatibility causing sip import failure.
+   :ghpull:`11613`.
+ - Fix Bug where ``type?`` woudl crash IPython. :ghpull:`1608`.
+ - Allow to apply ``@needs_local_scope`` to cell magics for convenience.
+   :ghpull:`11542`.
+
 .. _whatsnew730:
 
 IPython 7.3.0

++++++ ipython.pdf ++++++
(binary differes)

++++++ ipython.zip ++++++
Binary files /var/tmp/diff_new_pack.nb2S1U/_old and 
/var/tmp/diff_new_pack.nb2S1U/_new differ


Reply via email to