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 <[email protected]>
+
+- 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 <[email protected]> Laurent Dufrechou <>
Laurent Dufréchou <[email protected]> [email protected] <>
Laurent Dufréchou <[email protected]> ldufrechou <ldufrechou@PEP>
+Luciana da Costa Marques <[email protected]> luciana
<[email protected]>
Lorena Pantano <[email protected]> Lorena <[email protected]>
Luis Pedro Coelho <[email protected]> Luis Pedro Coelho <[email protected]>
Marc Molla <[email protected]> marcmolla <[email protected]>
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