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