Hello community,
here is the log from the commit of package python-jupyter_ipython for
openSUSE:Factory checked in at 2019-03-04 09:22:02
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-jupyter_ipython (Old)
and /work/SRC/openSUSE:Factory/.python-jupyter_ipython.new.28833 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-jupyter_ipython"
Mon Mar 4 09:22:02 2019 rev:15 rq:680627 version:7.3.0
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-jupyter_ipython/python-jupyter_ipython-doc.changes
2018-12-24 11:48:13.769089710 +0100
+++
/work/SRC/openSUSE:Factory/.python-jupyter_ipython.new.28833/python-jupyter_ipython-doc.changes
2019-03-04 09:22:16.432580482 +0100
@@ -1,0 +2,26 @@
+Fri Mar 1 18:00:07 UTC 2019 - Arun Persaud <[email protected]>
+
+- specfile:
+ * update copyright year
+
+- update to version 7.3.0:
+ * The biggest change to this release is the implementation of the
+ "%conda" and "%pip" magics, that will attempt to install packages
+ in the **current environment**. You may still need to restart your
+ interpreter or kernel for the change to be taken into account, but
+ it should simplify installation of packages into remote
+ environment. Installing using pip/conda from the command line is
+ still the prefer method.
+ * The "%pip" magic was already present, but was only printing a
+ warning; now it will actually forward commands to pip.
+ * Misc bug fixes and improvements:
+ + Compatibility with Python 3.8.
+ + Do not expand shell variable in execution magics, and added the
+ "no_var_expand" decorator for magic requiring a similar
+ functionality :ghpull:`11516`
+ + Add "%pip" and "%conda" magic :ghpull:`11524`
+ + Re-initialize posix aliases after a "%reset" :ghpull:`11528`
+ + Allow the IPython command line to run "*.ipynb" files
+ :ghpull:`11529`
+
+-------------------------------------------------------------------
python-jupyter_ipython.changes: same change
Old:
----
ipython-7.2.0.tar.gz
New:
----
ipython-7.3.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-jupyter_ipython-doc.spec ++++++
--- /var/tmp/diff_new_pack.OQ4G8y/_old 2019-03-04 09:22:18.508580108 +0100
+++ /var/tmp/diff_new_pack.OQ4G8y/_new 2019-03-04 09:22:18.512580107 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-jupyter_ipython-doc
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -18,16 +18,15 @@
# This package has to be kept separate from the main package to avoid
# dependency loops with most of the core jupyter packages.
-
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
%define oldpython python
Name: python-jupyter_ipython-doc
-Version: 7.2.0
+Version: 7.3.0
Release: 0
Summary: Documentation for python3-jupyter_ipython
License: BSD-3-Clause
Group: Documentation/Other
-Url: https://github.com/ipython/ipython
+URL: https://github.com/ipython/ipython
Source0:
https://files.pythonhosted.org/packages/source/i/ipython/ipython-%{version}.tar.gz
# Please make sure you update the documentation files at every release
Source1: https://media.readthedocs.org/pdf/ipython/stable/ipython.pdf
++++++ python-jupyter_ipython.spec ++++++
--- /var/tmp/diff_new_pack.OQ4G8y/_old 2019-03-04 09:22:18.524580106 +0100
+++ /var/tmp/diff_new_pack.OQ4G8y/_new 2019-03-04 09:22:18.524580106 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-jupyter_ipython
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -20,12 +20,12 @@
%define skip_python2 1
%bcond_without iptest
Name: python-jupyter_ipython
-Version: 7.2.0
+Version: 7.3.0
Release: 0
Summary: Rich architecture for interactive computing with Python
License: BSD-3-Clause
Group: Development/Languages/Python
-Url: https://github.com/ipython/ipython
+URL: https://github.com/ipython/ipython
Source:
https://files.pythonhosted.org/packages/source/i/ipython/ipython-%{version}.tar.gz
Source1:
https://raw.githubusercontent.com/jupyter/qtconsole/4.0.0/qtconsole/resources/icon/JupyterConsole.svg
BuildRequires: %{python_module backcall}
@@ -56,15 +56,14 @@
Recommends: python-jupyter_nbformat
Recommends: python-jupyter_notebook
Recommends: python-jupyter_qtconsole
-BuildArch: noarch
-%if %{with ico}
-BuildRequires: icoutils
-%endif
Provides: IPython3 = %{version}
Obsoletes: IPython3 < %{version}
Provides: python3-IPython = %{version}
Obsoletes: python3-IPython < %{version}
-
+BuildArch: noarch
+%if %{with ico}
+BuildRequires: icoutils
+%endif
%python_subpackages
%description
++++++ ipython-7.2.0.tar.gz -> ipython-7.3.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/completer.py
new/ipython-7.3.0/IPython/core/completer.py
--- old/ipython-7.2.0/IPython/core/completer.py 2018-11-29 03:45:49.000000000
+0100
+++ new/ipython-7.3.0/IPython/core/completer.py 2019-02-18 22:35:17.000000000
+0100
@@ -1134,10 +1134,15 @@
self.dict_key_matches,
]
- def all_completions(self, text):
+ def all_completions(self, text) -> List[str]:
"""
- Wrapper around the complete method for the benefit of emacs.
+ Wrapper around the completions method for the benefit of emacs.
"""
+ prefix = text[:text.rfind(".") + 1]
+ with provisionalcompleter():
+ return list(map(lambda c: prefix + c.text,
+ self.completions(text, len(text))))
+
return self.complete(text)[1]
def _clean_glob(self, text):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/crashhandler.py
new/ipython-7.3.0/IPython/core/crashhandler.py
--- old/ipython-7.2.0/IPython/core/crashhandler.py 2018-11-03
22:32:57.000000000 +0100
+++ new/ipython-7.3.0/IPython/core/crashhandler.py 2019-01-06
21:28:33.000000000 +0100
@@ -179,13 +179,14 @@
print('Could not create crash report on disk.', file=sys.stderr)
return
- # Inform user on stderr of what happened
- print('\n'+'*'*70+'\n', file=sys.stderr)
- print(self.message_template.format(**self.info), file=sys.stderr)
+ with report:
+ # Inform user on stderr of what happened
+ print('\n'+'*'*70+'\n', file=sys.stderr)
+ print(self.message_template.format(**self.info), file=sys.stderr)
+
+ # Construct report on disk
+ report.write(self.make_report(traceback))
- # Construct report on disk
- report.write(self.make_report(traceback))
- report.close()
input("Hit <Enter> to quit (your terminal may close):")
def make_report(self,traceback):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/debugger.py
new/ipython-7.3.0/IPython/core/debugger.py
--- old/ipython-7.2.0/IPython/core/debugger.py 2018-11-04 18:33:17.000000000
+0100
+++ new/ipython-7.3.0/IPython/core/debugger.py 2019-01-06 21:28:33.000000000
+0100
@@ -206,9 +206,8 @@
except IOError:
return []
else:
- out = outfile.readlines()
- outfile.close()
- return out
+ with out:
+ return outfile.readlines()
class Pdb(OldPdb):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/interactiveshell.py
new/ipython-7.3.0/IPython/core/interactiveshell.py
--- old/ipython-7.2.0/IPython/core/interactiveshell.py 2018-11-29
03:45:49.000000000 +0100
+++ new/ipython-7.3.0/IPython/core/interactiveshell.py 2019-02-18
22:35:17.000000000 +0100
@@ -107,6 +107,14 @@
"""
pass
+if sys.version_info > (3,8):
+ from ast import Module
+else :
+ # mock the new API, ignore second argument
+ # see https://github.com/ipython/ipython/issues/11590
+ from ast import Module as OriginalModule
+ Module = lambda nodelist, type_ignores: OriginalModule(nodelist)
+
if sys.version_info > (3,6):
_assign_nodes = (ast.AugAssign, ast.AnnAssign, ast.Assign)
_single_targets_nodes = (ast.AugAssign, ast.AnnAssign)
@@ -1433,6 +1441,13 @@
self.alias_manager.clear_aliases()
self.alias_manager.init_aliases()
+ # Now define aliases that only make sense on the terminal, because they
+ # need direct access to the console in a way that we can't emulate in
+ # GUI or web frontend
+ if os.name == 'posix':
+ for cmd in ('clear', 'more', 'less', 'man'):
+ self.alias_manager.soft_define_alias(cmd, cmd)
+
# Flush the private list of module references kept for script
# execution protection
self.clear_main_mod_cache()
@@ -2220,7 +2235,8 @@
self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
m.ConfigMagics, m.DisplayMagics, m.ExecutionMagics,
m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
- m.NamespaceMagics, m.OSMagics, m.PylabMagics, m.ScriptMagics,
+ m.NamespaceMagics, m.OSMagics, m.PackagingMagics,
+ m.PylabMagics, m.ScriptMagics,
)
if sys.version_info >(3,5):
self.register_magics(m.AsyncMagics)
@@ -2273,10 +2289,14 @@
# Note: this is the distance in the stack to the user's frame.
# This will need to be updated if the internal calling logic gets
# refactored, or else we'll be expanding the wrong variables.
-
+
# Determine stack_depth depending on where run_line_magic() has
been called
stack_depth = _stack_depth
- magic_arg_s = self.var_expand(line, stack_depth)
+ if getattr(fn, magic.MAGIC_NO_VAR_EXPAND_ATTR, False):
+ # magic has opted out of var_expand
+ magic_arg_s = line
+ else:
+ magic_arg_s = self.var_expand(line, stack_depth)
# Put magic args in a list so we can call with f(*a) syntax
args = [magic_arg_s]
kwargs = {}
@@ -2284,12 +2304,12 @@
if getattr(fn, "needs_local_scope", False):
kwargs['local_ns'] = sys._getframe(stack_depth).f_locals
with self.builtin_trap:
- result = fn(*args,**kwargs)
+ result = fn(*args, **kwargs)
return result
def run_cell_magic(self, magic_name, line, cell):
"""Execute the given cell magic.
-
+
Parameters
----------
magic_name : str
@@ -2318,7 +2338,11 @@
# This will need to be updated if the internal calling logic gets
# refactored, or else we'll be expanding the wrong variables.
stack_depth = 2
- magic_arg_s = self.var_expand(line, stack_depth)
+ if getattr(fn, magic.MAGIC_NO_VAR_EXPAND_ATTR, False):
+ # magic has opted out of var_expand
+ magic_arg_s = line
+ else:
+ magic_arg_s = self.var_expand(line, stack_depth)
with self.builtin_trap:
result = fn(magic_arg_s, cell)
return result
@@ -3172,15 +3196,15 @@
if _async:
# If interactivity is async the semantics of run_code are
# completely different Skip usual machinery.
- mod = ast.Module(nodelist)
- async_wrapper_code = compiler(mod, 'cell_name', 'exec')
+ mod = Module(nodelist, [])
+ async_wrapper_code = compiler(mod, cell_name, 'exec')
exec(async_wrapper_code, self.user_global_ns, self.user_ns)
async_code =
removed_co_newlocals(self.user_ns.pop('async-def-wrapper')).__code__
if (yield from self.run_code(async_code, result, async_=True)):
return True
else:
for i, node in enumerate(to_run_exec):
- mod = ast.Module([node])
+ mod = Module([node], [])
code = compiler(mod, cell_name, "exec")
if (yield from self.run_code(code, result)):
return True
@@ -3460,9 +3484,8 @@
self.tempfiles.append(filename)
if data:
- tmp_file = open(filename,'w')
- tmp_file.write(data)
- tmp_file.close()
+ with open(filename, 'w') as tmp_file:
+ tmp_file.write(data)
return filename
@undoc
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/magic.py
new/ipython-7.3.0/IPython/core/magic.py
--- old/ipython-7.2.0/IPython/core/magic.py 2018-11-04 18:33:17.000000000
+0100
+++ new/ipython-7.3.0/IPython/core/magic.py 2019-01-06 21:28:19.000000000
+0100
@@ -265,6 +265,25 @@
return magic_deco
+MAGIC_NO_VAR_EXPAND_ATTR = '_ipython_magic_no_var_expand'
+
+
+def no_var_expand(magic_func):
+ """Mark a magic function as not needing variable expansion
+
+ By default, IPython interprets `{a}` or `$a` in the line passed to magics
+ as variables that should be interpolated from the interactive namespace
+ before passing the line to the magic function.
+ This is not always desirable, e.g. when the magic executes Python code
+ (%timeit, %time, etc.).
+ Decorate magics with `@no_var_expand` to opt-out of variable expansion.
+
+ .. versionadded:: 7.3
+ """
+ setattr(magic_func, MAGIC_NO_VAR_EXPAND_ATTR, True)
+ return magic_func
+
+
# Create the actual decorators for public use
# These three are used to decorate methods in class definitions
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/magics/__init__.py
new/ipython-7.3.0/IPython/core/magics/__init__.py
--- old/ipython-7.2.0/IPython/core/magics/__init__.py 2018-11-04
18:33:17.000000000 +0100
+++ new/ipython-7.3.0/IPython/core/magics/__init__.py 2019-01-06
21:28:19.000000000 +0100
@@ -24,6 +24,7 @@
from .logging import LoggingMagics
from .namespace import NamespaceMagics
from .osm import OSMagics
+from .packaging import PackagingMagics
from .pylab import PylabMagics
from .script import ScriptMagics
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/magics/basic.py
new/ipython-7.3.0/IPython/core/magics/basic.py
--- old/ipython-7.2.0/IPython/core/magics/basic.py 2018-11-29
03:45:49.000000000 +0100
+++ new/ipython-7.3.0/IPython/core/magics/basic.py 2019-01-06
21:28:19.000000000 +0100
@@ -179,7 +179,7 @@
@line_magic
def lsmagic(self, parameter_s=''):
"""List currently available magic functions."""
- return MagicsDisplay(self.shell.magics_manager, ignore=[self.pip])
+ return MagicsDisplay(self.shell.magics_manager, ignore=[])
def _magic_docs(self, brief=False, rest=False):
"""Return docstrings from magic functions."""
@@ -379,25 +379,6 @@
except:
xmode_switch_err('user')
-
-
- @line_magic
- def pip(self, args=''):
- """
- Intercept usage of ``pip`` in IPython and direct user to run command
outside of IPython.
- """
- print(textwrap.dedent('''
- The following command must be run outside of the IPython shell:
-
- $ pip {args}
-
- The Python package manager (pip) can only be used from outside of
IPython.
- Please reissue the `pip` command in a separate terminal or command
prompt.
-
- See the Python documentation for more information on how to install
packages:
-
- https://docs.python.org/3/installing/'''.format(args=args)))
-
@line_magic
def quickref(self, arg):
""" Show a quick reference sheet """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/magics/code.py
new/ipython-7.3.0/IPython/core/magics/code.py
--- old/ipython-7.2.0/IPython/core/magics/code.py 2018-11-03
22:32:57.000000000 +0100
+++ new/ipython-7.3.0/IPython/core/magics/code.py 2019-01-06
21:28:33.000000000 +0100
@@ -722,7 +722,8 @@
if is_temp:
try:
- return open(filename).read()
+ with open(filename) as f:
+ return f.read()
except IOError as msg:
if msg.filename == filename:
warn('File not found. Did you forget to save?')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/magics/execution.py
new/ipython-7.3.0/IPython/core/magics/execution.py
--- old/ipython-7.2.0/IPython/core/magics/execution.py 2018-11-29
03:45:49.000000000 +0100
+++ new/ipython-7.3.0/IPython/core/magics/execution.py 2019-01-06
21:28:33.000000000 +0100
@@ -36,7 +36,8 @@
from IPython.core.error import UsageError
from IPython.core.macro import Macro
from IPython.core.magic import (Magics, magics_class, line_magic, cell_magic,
- line_cell_magic, on_off, needs_local_scope)
+ line_cell_magic, on_off, needs_local_scope,
+ no_var_expand)
from IPython.testing.skipdoctest import skip_doctest
from IPython.utils.contexts import preserve_keys
from IPython.utils.capture import capture_output
@@ -184,6 +185,7 @@
python-profiler package from non-free.""")
@skip_doctest
+ @no_var_expand
@line_cell_magic
def prun(self, parameter_s='', cell=None):
@@ -293,6 +295,11 @@
You can read the complete documentation for the profile module with::
In [1]: import profile; profile.help()
+
+ .. versionchanged:: 7.3
+ User variables are no longer expanded,
+ the magic line is always left unmodified.
+
"""
opts, arg_str = self.parse_options(parameter_s, 'D:l:rs:T:q',
list_all=True, posix=False)
@@ -363,9 +370,8 @@
print('\n*** Profile stats marshalled to file',\
repr(dump_file)+'.',sys_exit)
if text_file:
- pfile = open(text_file,'w')
- pfile.write(output)
- pfile.close()
+ with open(text_file, 'w') as pfile:
+ pfile.write(output)
print('\n*** Profile printout saved to text file',\
repr(text_file)+'.',sys_exit)
@@ -422,6 +428,7 @@
You can omit this in cell magic mode.
"""
)
+ @no_var_expand
@line_cell_magic
def debug(self, line='', cell=None):
"""Activate the interactive debugger.
@@ -442,6 +449,11 @@
If you want IPython to automatically do this on every exception, see
the %pdb magic for more details.
+
+ .. versionchanged:: 7.3
+ When running code, user variables are no longer expanded,
+ the magic line is always left unmodified.
+
"""
args = magic_arguments.parse_argstring(self.debug, line)
@@ -972,6 +984,7 @@
print("Wall time: %10.2f s." % (twall1 - twall0))
@skip_doctest
+ @no_var_expand
@line_cell_magic
@needs_local_scope
def timeit(self, line='', cell=None, local_ns=None):
@@ -1017,6 +1030,9 @@
-o: return a TimeitResult that can be stored in a variable to inspect
the result in more details.
+ .. versionchanged:: 7.3
+ User variables are no longer expanded,
+ the magic line is always left unmodified.
Examples
--------
@@ -1161,6 +1177,7 @@
return timeit_result
@skip_doctest
+ @no_var_expand
@needs_local_scope
@line_cell_magic
def time(self,line='', cell=None, local_ns=None):
@@ -1175,12 +1192,16 @@
- In line mode you can time a single-line statement (though multiple
ones can be chained with using semicolons).
- - In cell mode, you can time the cell body (a directly
+ - In cell mode, you can time the cell body (a directly
following statement raises an error).
- This function provides very basic timing functionality. Use the
timeit
+ This function provides very basic timing functionality. Use the timeit
magic for more control over the measurement.
+ .. versionchanged:: 7.3
+ User variables are no longer expanded,
+ the magic line is always left unmodified.
+
Examples
--------
::
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/magics/osm.py
new/ipython-7.3.0/IPython/core/magics/osm.py
--- old/ipython-7.2.0/IPython/core/magics/osm.py 2018-11-20
19:37:09.000000000 +0100
+++ new/ipython-7.3.0/IPython/core/magics/osm.py 2019-02-18
22:35:17.000000000 +0100
@@ -825,7 +825,7 @@
The file will be overwritten unless the -a (--append) flag is
specified.
"""
args = magic_arguments.parse_argstring(self.writefile, line)
- if re.match(r'[\'*\']|["*"]', args.filename):
+ if re.match(r'^(\'.*\')|(".*")$', args.filename):
filename = os.path.expanduser(args.filename[1:-1])
else:
filename = os.path.expanduser(args.filename)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/magics/packaging.py
new/ipython-7.3.0/IPython/core/magics/packaging.py
--- old/ipython-7.2.0/IPython/core/magics/packaging.py 1970-01-01
01:00:00.000000000 +0100
+++ new/ipython-7.3.0/IPython/core/magics/packaging.py 2019-01-06
21:28:33.000000000 +0100
@@ -0,0 +1,104 @@
+"""Implementation of packaging-related magic functions.
+"""
+#-----------------------------------------------------------------------------
+# Copyright (c) 2018 The IPython Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
+
+import os
+import re
+import shlex
+import sys
+from subprocess import Popen, PIPE
+
+from IPython.core.magic import Magics, magics_class, line_magic
+
+
+def _is_conda_environment():
+ """Return True if the current Python executable is in a conda env"""
+ # TODO: does this need to change on windows?
+ conda_history = os.path.join(sys.prefix, 'conda-meta', 'history')
+ return os.path.exists(conda_history)
+
+
+def _get_conda_executable():
+ """Find the path to the conda executable"""
+ # Check if there is a conda executable in the same directory as the Python
executable.
+ # This is the case within conda's root environment.
+ conda = os.path.join(os.path.dirname(sys.executable), 'conda')
+ if os.path.isfile(conda):
+ return conda
+
+ # Otherwise, attempt to extract the executable from conda history.
+ # This applies in any conda environment.
+ R = re.compile(r"^#\s*cmd:\s*(?P<command>.*conda)\s[create|install]")
+ with open(os.path.join(sys.prefix, 'conda-meta', 'history')) as f:
+ for line in f:
+ match = R.match(line)
+ if match:
+ return match.groupdict()['command']
+
+ # Fallback: assume conda is available on the system path.
+ return "conda"
+
+
+CONDA_COMMANDS_REQUIRING_PREFIX = {
+ 'install', 'list', 'remove', 'uninstall', 'update', 'upgrade',
+}
+CONDA_COMMANDS_REQUIRING_YES = {
+ 'install', 'remove', 'uninstall', 'update', 'upgrade',
+}
+CONDA_ENV_FLAGS = {'-p', '--prefix', '-n', '--name'}
+CONDA_YES_FLAGS = {'-y', '--y'}
+
+
+@magics_class
+class PackagingMagics(Magics):
+ """Magics related to packaging & installation"""
+
+ @line_magic
+ def pip(self, line):
+ """Run the pip package manager within the current kernel.
+
+ Usage:
+ %pip install [pkgs]
+ """
+ self.shell.system(' '.join([sys.executable, '-m', 'pip', line]))
+ print("Note: you may need to restart the kernel to use updated
packages.")
+
+ @line_magic
+ def conda(self, line):
+ """Run the conda package manager within the current kernel.
+
+ Usage:
+ %conda install [pkgs]
+ """
+ if not _is_conda_environment():
+ raise ValueError("The python kernel does not appear to be a conda
environment. "
+ "Please use ``%pip install`` instead.")
+
+ conda = _get_conda_executable()
+ args = shlex.split(line)
+ command = args[0]
+ args = args[1:]
+ extra_args = []
+
+ # When the subprocess does not allow us to respond "yes" during the
installation,
+ # we need to insert --yes in the argument list for some commands
+ stdin_disabled = getattr(self.shell, 'kernel', None) is not None
+ needs_yes = command in CONDA_COMMANDS_REQUIRING_YES
+ has_yes = set(args).intersection(CONDA_YES_FLAGS)
+ if stdin_disabled and needs_yes and not has_yes:
+ extra_args.append("--yes")
+
+ # Add --prefix to point conda installation to the current environment
+ needs_prefix = command in CONDA_COMMANDS_REQUIRING_PREFIX
+ has_prefix = set(args).intersection(CONDA_ENV_FLAGS)
+ if needs_prefix and not has_prefix:
+ extra_args.extend(["--prefix", sys.prefix])
+
+ self.shell.system(' '.join([conda, command] + extra_args + args))
+ print("\nNote: you may need to restart the kernel to use updated
packages.")
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/oinspect.py
new/ipython-7.3.0/IPython/core/oinspect.py
--- old/ipython-7.2.0/IPython/core/oinspect.py 2018-11-29 03:57:26.000000000
+0100
+++ new/ipython-7.3.0/IPython/core/oinspect.py 2019-01-06 21:28:19.000000000
+0100
@@ -1051,7 +1051,9 @@
# add up name, parameters, braces (2), and commas
if len(obj_name) + sum(len(r) + 2 for r in result) > 75:
# This doesn’t fit behind “Signature: ” in an inspect window.
- rendered = '{}(\n{})'.format(obj_name, ''.join('
{},\n'.format(result)))
+ rendered = '{}(\n{})'.format(obj_name, ''.join(
+ ' {},\n'.format(r) for r in result)
+ )
else:
rendered = '{}({})'.format(obj_name, ', '.join(result))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/release.py
new/ipython-7.3.0/IPython/core/release.py
--- old/ipython-7.2.0/IPython/core/release.py 2018-11-30 02:17:33.000000000
+0100
+++ new/ipython-7.3.0/IPython/core/release.py 2019-02-18 22:58:52.000000000
+0100
@@ -20,7 +20,7 @@
# release. 'dev' as a _version_extra string means this is a development
# version
_version_major = 7
-_version_minor = 2
+_version_minor = 3
_version_patch = 0
_version_extra = '.dev'
# _version_extra = 'b1'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/shellapp.py
new/ipython-7.3.0/IPython/core/shellapp.py
--- old/ipython-7.2.0/IPython/core/shellapp.py 2018-11-29 03:45:49.000000000
+0100
+++ new/ipython-7.3.0/IPython/core/shellapp.py 2019-01-06 21:28:33.000000000
+0100
@@ -329,7 +329,7 @@
# behavior.
with preserve_keys(self.shell.user_ns, '__file__'):
self.shell.user_ns['__file__'] = fname
- if full_filename.endswith('.ipy'):
+ if full_filename.endswith('.ipy') or
full_filename.endswith('.ipynb'):
self.shell.safe_execfile_ipy(full_filename,
shell_futures=shell_futures)
else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/tests/test_completer.py
new/ipython-7.3.0/IPython/core/tests/test_completer.py
--- old/ipython-7.2.0/IPython/core/tests/test_completer.py 2018-11-04
18:33:17.000000000 +0100
+++ new/ipython-7.3.0/IPython/core/tests/test_completer.py 2019-01-06
21:28:19.000000000 +0100
@@ -16,7 +16,7 @@
from traitlets.config.loader import Config
from IPython import get_ipython
from IPython.core import completer
-from IPython.external.decorators import knownfailureif
+from IPython.external import decorators
from IPython.utils.tempdir import TemporaryDirectory, TemporaryWorkingDirectory
from IPython.utils.generics import complete_object
from IPython.testing import decorators as dec
@@ -183,7 +183,7 @@
nt.assert_equal(matches[0], 'Ⅴ')
@nt.nottest # now we have a completion for \jmath
[email protected](sys.platform == 'win32', 'Fails if there is a C:\\j...
path')
[email protected](sys.platform == 'win32', 'Fails if there is a
C:\\j... path')
def test_no_ascii_back_completion():
ip = get_ipython()
with TemporaryWorkingDirectory(): # Avoid any filename completions
@@ -234,7 +234,7 @@
nt.assert_false(completer.has_open_quotes(s))
-@knownfailureif(sys.platform == 'win32', "abspath completions fail on Windows")
[email protected](sys.platform == 'win32', "abspath completions
fail on Windows")
def test_abspath_file_completions():
ip = get_ipython()
with TemporaryDirectory() as tmpdir:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ipython-7.2.0/IPython/core/tests/test_interactiveshell.py
new/ipython-7.3.0/IPython/core/tests/test_interactiveshell.py
--- old/ipython-7.2.0/IPython/core/tests/test_interactiveshell.py
2018-11-04 18:33:17.000000000 +0100
+++ new/ipython-7.3.0/IPython/core/tests/test_interactiveshell.py
2019-02-18 22:35:17.000000000 +0100
@@ -495,6 +495,16 @@
self.assertFalse(ip.last_execution_result.success)
self.assertIsInstance(ip.last_execution_result.error_in_exec,
NameError)
+ def test_reset_aliasing(self):
+ """ Check that standard posix aliases work after %reset. """
+ if os.name != 'posix':
+ return
+
+ ip.reset()
+ for cmd in ('clear', 'more', 'less', 'man'):
+ res = ip.run_cell('%' + cmd)
+ self.assertEqual(res.success, True)
+
class TestSafeExecfileNonAsciiPath(unittest.TestCase):
@@ -599,10 +609,18 @@
class Negator(ast.NodeTransformer):
"""Negates all number literals in an AST."""
+
+ # for python 3.7 and earlier
def visit_Num(self, node):
node.n = -node.n
return node
+ # for python 3.8+
+ def visit_Constant(self, node):
+ if isinstance(node.value, int):
+ return self.visit_Num(node)
+ return node
+
class TestAstTransform(unittest.TestCase):
def setUp(self):
self.negator = Negator()
@@ -664,12 +682,23 @@
class IntegerWrapper(ast.NodeTransformer):
"""Wraps all integers in a call to Integer()"""
+
+ # for Python 3.7 and earlier
+
+ # for Python 3.7 and earlier
def visit_Num(self, node):
if isinstance(node.n, int):
return ast.Call(func=ast.Name(id='Integer', ctx=ast.Load()),
args=[node], keywords=[])
return node
+ # For Python 3.8+
+ def visit_Constant(self, node):
+ if isinstance(node.value, int):
+ return self.visit_Num(node)
+ return node
+
+
class TestAstTransform2(unittest.TestCase):
def setUp(self):
self.intwrapper = IntegerWrapper()
@@ -710,9 +739,18 @@
class ErrorTransformer(ast.NodeTransformer):
"""Throws an error when it sees a number."""
+
+ # for Python 3.7 and earlier
def visit_Num(self, node):
raise ValueError("test")
+ # for Python 3.8+
+ def visit_Constant(self, node):
+ if isinstance(node.value, int):
+ return self.visit_Num(node)
+ return node
+
+
class TestAstTransformError(unittest.TestCase):
def test_unregistering(self):
err_transformer = ErrorTransformer()
@@ -731,10 +769,17 @@
Used to verify that NodeTransformers can signal that a piece of code should
not be executed by throwing an InputRejected.
"""
-
+
+ #for python 3.7 and earlier
def visit_Str(self, node):
raise InputRejected("test")
+ # 3.8 only
+ def visit_Constant(self, node):
+ if isinstance(node.value, str):
+ raise InputRejected("test")
+ return node
+
class TestAstTransformInputRejection(unittest.TestCase):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/tests/test_magic.py
new/ipython-7.3.0/IPython/core/tests/test_magic.py
--- old/ipython-7.2.0/IPython/core/tests/test_magic.py 2018-11-29
03:45:49.000000000 +0100
+++ new/ipython-7.3.0/IPython/core/tests/test_magic.py 2019-02-18
22:35:17.000000000 +0100
@@ -769,6 +769,36 @@
nt.assert_in('line1\n', s)
nt.assert_in('line2', s)
[email protected]_win32
+def test_file_single_quote():
+ """Basic %%writefile with embedded single quotes"""
+ ip = get_ipython()
+ with TemporaryDirectory() as td:
+ fname = os.path.join(td, '\'file1\'')
+ ip.run_cell_magic("writefile", fname, u'\n'.join([
+ 'line1',
+ 'line2',
+ ]))
+ with open(fname) as f:
+ s = f.read()
+ nt.assert_in('line1\n', s)
+ nt.assert_in('line2', s)
+
[email protected]_win32
+def test_file_double_quote():
+ """Basic %%writefile with embedded double quotes"""
+ ip = get_ipython()
+ with TemporaryDirectory() as td:
+ fname = os.path.join(td, '"file1"')
+ ip.run_cell_magic("writefile", fname, u'\n'.join([
+ 'line1',
+ 'line2',
+ ]))
+ with open(fname) as f:
+ s = f.read()
+ nt.assert_in('line1\n', s)
+ nt.assert_in('line2', s)
+
def test_file_var_expand():
"""%%writefile $filename"""
ip = get_ipython()
@@ -1087,7 +1117,8 @@
lm.logstart(os.path.join(td, "quiet_from_config.log"))
finally:
_ip.logger.logstop()
-
+
+
def test_logging_magic_not_quiet():
_ip.config.LoggingMagics.quiet = False
lm = logging.LoggingMagics(shell=_ip)
@@ -1098,9 +1129,15 @@
finally:
_ip.logger.logstop()
-##
+
+def test_time_no_var_expand():
+ _ip.user_ns['a'] = 5
+ _ip.user_ns['b'] = []
+ _ip.magic('time b.append("{a}")')
+ assert _ip.user_ns['b'] == ['{a}']
+
+
# this is slow, put at the end for local testing.
-##
def test_timeit_arguments():
"Test valid timeit arguments, should not cause SyntaxError (GH #1269)"
if sys.version_info < (3,7):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/tests/test_oinspect.py
new/ipython-7.3.0/IPython/core/tests/test_oinspect.py
--- old/ipython-7.2.0/IPython/core/tests/test_oinspect.py 2018-11-04
18:33:17.000000000 +0100
+++ new/ipython-7.3.0/IPython/core/tests/test_oinspect.py 2019-01-06
21:28:19.000000000 +0100
@@ -5,7 +5,7 @@
# Distributed under the terms of the Modified BSD License.
-from inspect import Signature, Parameter
+from inspect import signature, Signature, Parameter
import os
import re
import sys
@@ -432,3 +432,43 @@
init_def = info['init_definition']
nt.assert_is_not_none(init_def)
+
+def test_render_signature_short():
+ def short_fun(a=1): pass
+ sig = oinspect._render_signature(
+ signature(short_fun),
+ short_fun.__name__,
+ )
+ nt.assert_equal(sig, 'short_fun(a=1)')
+
+
+def test_render_signature_long():
+ from typing import Optional
+
+ def long_function(
+ a_really_long_parameter: int,
+ and_another_long_one: bool = False,
+ let_us_make_sure_this_is_looong: Optional[str] = None,
+ ) -> bool: pass
+
+ sig = oinspect._render_signature(
+ signature(long_function),
+ long_function.__name__,
+ )
+ nt.assert_in(sig, [
+ # Python >=3.7
+ '''\
+long_function(
+ a_really_long_parameter: int,
+ and_another_long_one: bool = False,
+ let_us_make_sure_this_is_looong: Union[str, NoneType] = None,
+) -> bool\
+''', # Python <=3.6
+ '''\
+long_function(
+ a_really_long_parameter:int,
+ and_another_long_one:bool=False,
+ let_us_make_sure_this_is_looong:Union[str, NoneType]=None,
+) -> bool\
+''',
+ ])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/tests/test_run.py
new/ipython-7.3.0/IPython/core/tests/test_run.py
--- old/ipython-7.2.0/IPython/core/tests/test_run.py 2018-11-04
18:33:17.000000000 +0100
+++ new/ipython-7.3.0/IPython/core/tests/test_run.py 2019-01-06
21:28:19.000000000 +0100
@@ -538,7 +538,7 @@
nt.assert_in("RuntimeError", out)
nt.assert_equal(out.count("---->"), 3)
[email protected](sys.platform == 'win32', "writes to io.stdout aren't
captured on Windows")
[email protected](sys.platform == 'win32', "writes to io.stdout aren't
captured on Windows")
def test_script_tb():
"""Test traceback offset in `ipython script.py`"""
with TemporaryDirectory() as td:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/core/tests/test_ultratb.py
new/ipython-7.3.0/IPython/core/tests/test_ultratb.py
--- old/ipython-7.2.0/IPython/core/tests/test_ultratb.py 2018-11-29
03:45:49.000000000 +0100
+++ new/ipython-7.3.0/IPython/core/tests/test_ultratb.py 2019-02-18
22:35:17.000000000 +0100
@@ -379,10 +379,16 @@
handler(*sys.exc_info())
buff.write('')
+from IPython.testing.decorators import skipif
class TokenizeFailureTest(unittest.TestCase):
"""Tests related to https://github.com/ipython/ipython/issues/6864."""
+ # that appear to test that we are handling an exception that can be thrown
+ # by the tokenizer due to a bug that seem to have been fixed in 3.8, though
+ # I'm unsure if other sequences can make it raise this error. Let's just
+ # skip in 3.8 for now
+ @skipif(sys.version_info > (3,8))
def testLogging(self):
message = "An unexpected error occurred while tokenizing input"
cell = 'raise ValueError("""a\nb""")'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/extensions/autoreload.py
new/ipython-7.3.0/IPython/extensions/autoreload.py
--- old/ipython-7.2.0/IPython/extensions/autoreload.py 2018-11-04
18:33:17.000000000 +0100
+++ new/ipython-7.3.0/IPython/extensions/autoreload.py 2019-02-18
22:35:17.000000000 +0100
@@ -274,7 +274,9 @@
old_obj = getattr(old, key)
try:
new_obj = getattr(new, key)
- if old_obj == new_obj:
+ # explicitly checking that comparison returns True to handle
+ # cases where `==` doesn't return a boolean.
+ if (old_obj == new_obj) is True:
continue
except AttributeError:
# obsolete attribute: remove it
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/extensions/storemagic.py
new/ipython-7.3.0/IPython/extensions/storemagic.py
--- old/ipython-7.2.0/IPython/extensions/storemagic.py 2018-11-03
22:32:57.000000000 +0100
+++ new/ipython-7.3.0/IPython/extensions/storemagic.py 2019-01-06
21:28:33.000000000 +0100
@@ -172,20 +172,19 @@
fil = open(fnam, 'a')
else:
fil = open(fnam, 'w')
- obj = ip.ev(args[0])
- print("Writing '%s' (%s) to file '%s'." % (args[0],
- obj.__class__.__name__, fnam))
+ with fil:
+ obj = ip.ev(args[0])
+ print("Writing '%s' (%s) to file '%s'." % (args[0],
+ obj.__class__.__name__, fnam))
+ if not isinstance (obj, str):
+ from pprint import pprint
+ pprint(obj, fil)
+ else:
+ fil.write(obj)
+ if not obj.endswith('\n'):
+ fil.write('\n')
- if not isinstance (obj, str):
- from pprint import pprint
- pprint(obj, fil)
- else:
- fil.write(obj)
- if not obj.endswith('\n'):
- fil.write('\n')
-
- fil.close()
return
# %store foo
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ipython-7.2.0/IPython/extensions/tests/test_autoreload.py
new/ipython-7.3.0/IPython/extensions/tests/test_autoreload.py
--- old/ipython-7.2.0/IPython/extensions/tests/test_autoreload.py
2018-11-04 18:33:17.000000000 +0100
+++ new/ipython-7.3.0/IPython/extensions/tests/test_autoreload.py
2019-01-06 21:28:33.000000000 +0100
@@ -109,19 +109,13 @@
time.sleep(1.05)
# Write
- f = open(filename, 'w')
- try:
+ with open(filename, 'w') as f:
f.write(content)
- finally:
- f.close()
def new_module(self, code):
mod_name, mod_fn = self.get_module()
- f = open(mod_fn, 'w')
- try:
+ with open(mod_fn, 'w') as f:
f.write(code)
- finally:
- f.close()
return mod_name, mod_fn
#-----------------------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ipython-7.2.0/IPython/external/decorators/__init__.py
new/ipython-7.3.0/IPython/external/decorators/__init__.py
--- old/ipython-7.2.0/IPython/external/decorators/__init__.py 2018-10-27
01:55:12.000000000 +0200
+++ new/ipython-7.3.0/IPython/external/decorators/__init__.py 2019-01-06
21:28:19.000000000 +0100
@@ -1,5 +1,6 @@
try:
- from numpy.testing.decorators import *
+ from numpy.testing import *
+ from numpy.testing import dec
from numpy.testing.noseclasses import KnownFailure
except ImportError:
from ._decorators import *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/lib/display.py
new/ipython-7.3.0/IPython/lib/display.py
--- old/ipython-7.2.0/IPython/lib/display.py 2018-11-03 22:32:57.000000000
+0100
+++ new/ipython-7.3.0/IPython/lib/display.py 2019-01-06 21:28:19.000000000
+0100
@@ -33,9 +33,9 @@
* Bytestring containing raw PCM data or
* URL pointing to a file on the web.
- If the array option is used the waveform will be normalized.
+ If the array option is used, the waveform will be normalized.
- If a filename or url is used the format support will be browser
+ If a filename or url is used, the format support will be browser
dependent.
url : unicode
A URL to download the data from.
@@ -63,7 +63,7 @@
import numpy as np
framerate = 44100
t = np.linspace(0,5,framerate*5)
- data = np.sin(2*np.pi*220*t) + np.sin(2*np.pi*224*t))
+ data = np.sin(2*np.pi*220*t) + np.sin(2*np.pi*224*t)
Audio(data,rate=framerate)
# Can also do stereo or more channels
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/sphinxext/ipython_directive.py
new/ipython-7.3.0/IPython/sphinxext/ipython_directive.py
--- old/ipython-7.2.0/IPython/sphinxext/ipython_directive.py 2018-11-04
18:33:17.000000000 +0100
+++ new/ipython-7.3.0/IPython/sphinxext/ipython_directive.py 2019-01-06
21:28:33.000000000 +0100
@@ -82,7 +82,7 @@
Sphinx source directory. The default is `html_static_path`.
ipython_rgxin:
The compiled regular expression to denote the start of IPython input
- lines. The default is ``re.compile('In \[(\d+)\]:\s?(.*)\s*')``. You
+ lines. The default is ``re.compile('In \\[(\\d+)\\]:\\s?(.*)\\s*')``. You
shouldn't need to change this.
ipython_warning_is_error: [default to True]
Fail the build if something unexpected happen, for example if a block raise
@@ -90,7 +90,7 @@
what is considered strict, may change between the sphinx directive version.
ipython_rgxout:
The compiled regular expression to denote the start of IPython output
- lines. The default is ``re.compile('Out\[(\d+)\]:\s?(.*)\s*')``. You
+ lines. The default is ``re.compile('Out\\[(\\d+)\\]:\\s?(.*)\\s*')``. You
shouldn't need to change this.
ipython_promptin:
The string to represent the IPython input prompt in the generated ReST.
@@ -1047,9 +1047,9 @@
app.add_config_value('ipython_savefig_dir', 'savefig', 'env')
app.add_config_value('ipython_warning_is_error', True, 'env')
app.add_config_value('ipython_rgxin',
- re.compile('In \[(\d+)\]:\s?(.*)\s*'), 'env')
+ re.compile(r'In \[(\d+)\]:\s?(.*)\s*'), 'env')
app.add_config_value('ipython_rgxout',
- re.compile('Out\[(\d+)\]:\s?(.*)\s*'), 'env')
+ re.compile(r'Out\[(\d+)\]:\s?(.*)\s*'), 'env')
app.add_config_value('ipython_promptin', 'In [%d]:', 'env')
app.add_config_value('ipython_promptout', 'Out[%d]:', 'env')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/terminal/debugger.py
new/ipython-7.3.0/IPython/terminal/debugger.py
--- old/ipython-7.2.0/IPython/terminal/debugger.py 2018-11-04
18:33:17.000000000 +0100
+++ new/ipython-7.3.0/IPython/terminal/debugger.py 2019-02-18
22:35:17.000000000 +0100
@@ -58,6 +58,7 @@
complete_style=self.shell.pt_complete_style,
style=self.shell.style,
inputhook=self.shell.inputhook,
+ color_depth=self.shell.color_depth,
)
def cmdloop(self, intro=None):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/terminal/interactiveshell.py
new/ipython-7.3.0/IPython/terminal/interactiveshell.py
--- old/ipython-7.2.0/IPython/terminal/interactiveshell.py 2018-11-20
19:37:09.000000000 +0100
+++ new/ipython-7.3.0/IPython/terminal/interactiveshell.py 2019-02-18
22:35:17.000000000 +0100
@@ -288,7 +288,7 @@
include_default_pygments_style=False,
mouse_support=self.mouse_support,
enable_open_in_editor=self.extra_open_editor_shortcuts,
- color_depth=(ColorDepth.TRUE_COLOR if
self.true_color else None),
+ color_depth=self.color_depth,
**self._extra_prompt_options())
def _make_style_from_name_or_cls(self, name_or_cls):
@@ -365,6 +365,10 @@
'readlinelike': CompleteStyle.READLINE_LIKE,
}[self.display_completions]
+ @property
+ def color_depth(self):
+ return (ColorDepth.TRUE_COLOR if self.true_color else None)
+
def _extra_prompt_options(self):
"""
Return the current layout option for the current Terminal
InteractiveShell
@@ -447,7 +451,7 @@
# need direct access to the console in a way that we can't emulate in
# GUI or web frontend
if os.name == 'posix':
- for cmd in ['clear', 'more', 'less', 'man']:
+ for cmd in ('clear', 'more', 'less', 'man'):
self.alias_manager.soft_define_alias(cmd, cmd)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/terminal/ptutils.py
new/ipython-7.3.0/IPython/terminal/ptutils.py
--- old/ipython-7.2.0/IPython/terminal/ptutils.py 2018-11-29
03:45:49.000000000 +0100
+++ new/ipython-7.3.0/IPython/terminal/ptutils.py 2019-02-18
22:35:17.000000000 +0100
@@ -53,7 +53,7 @@
def _adjust_completion_text_based_on_context(text, body, offset):
- if text.endswith('=') and len(body) > offset and body[offset] is '=':
+ if text.endswith('=') and len(body) > offset and body[offset] == '=':
return text[:-1]
else:
return text
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ipython-7.2.0/IPython/terminal/tests/test_debug_magic.py
new/ipython-7.3.0/IPython/terminal/tests/test_debug_magic.py
--- old/ipython-7.2.0/IPython/terminal/tests/test_debug_magic.py
2018-11-04 18:33:17.000000000 +0100
+++ new/ipython-7.3.0/IPython/terminal/tests/test_debug_magic.py
2019-01-06 21:28:33.000000000 +0100
@@ -26,7 +26,7 @@
"""
import pexpect
import re
- in_prompt = re.compile(b'In ?\[\\d+\]:')
+ in_prompt = re.compile(br'In ?\[\d+\]:')
ipdb_prompt = 'ipdb>'
env = os.environ.copy()
child = pexpect.spawn(sys.executable, ['-m', 'IPython',
'--colors=nocolor', '--simple-prompt'],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/testing/decorators.py
new/ipython-7.3.0/IPython/testing/decorators.py
--- old/ipython-7.2.0/IPython/testing/decorators.py 2018-11-03
22:32:57.000000000 +0100
+++ new/ipython-7.3.0/IPython/testing/decorators.py 2019-01-06
21:28:19.000000000 +0100
@@ -333,7 +333,7 @@
skipif_not_sympy = skip_without('sympy')
-skip_known_failure = knownfailureif(True,'This test is known to fail')
+skip_known_failure = dec.knownfailureif(True,'This test is known to fail')
# A null 'decorator', useful to make more readable code that needs to pick
# between different decorators based on OS or other conditions
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/testing/iptest.py
new/ipython-7.3.0/IPython/testing/iptest.py
--- old/ipython-7.2.0/IPython/testing/iptest.py 2018-11-04 18:33:17.000000000
+0100
+++ new/ipython-7.3.0/IPython/testing/iptest.py 2019-01-06 21:28:19.000000000
+0100
@@ -37,7 +37,7 @@
from IPython.utils.py3compat import decode
from IPython.utils.importstring import import_item
from IPython.testing.plugin.ipdoctest import IPythonDoctest
-from IPython.external.decorators import KnownFailure, knownfailureif
+from IPython.external.decorators import KnownFailure, dec
pjoin = path.join
@@ -83,7 +83,7 @@
#
------------------------------------------------------------------------------
def monkeypatch_xunit():
try:
- knownfailureif(True)(lambda: None)()
+ dec.knownfailureif(True)(lambda: None)()
except Exception as e:
KnownFailureTest = type(e)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/testing/plugin/ipdoctest.py
new/ipython-7.3.0/IPython/testing/plugin/ipdoctest.py
--- old/ipython-7.2.0/IPython/testing/plugin/ipdoctest.py 2018-11-03
22:32:57.000000000 +0100
+++ new/ipython-7.3.0/IPython/testing/plugin/ipdoctest.py 2019-01-06
21:28:33.000000000 +0100
@@ -688,11 +688,8 @@
else:
if self.extension and anyp(filename.endswith, self.extension):
name = os.path.basename(filename)
- dh = open(filename)
- try:
+ with open(filename) as dh:
doc = dh.read()
- finally:
- dh.close()
test = self.parser.get_doctest(
doc, globs={'__file__': filename}, name=name,
filename=filename, lineno=0)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/testing/tools.py
new/ipython-7.3.0/IPython/testing/tools.py
--- old/ipython-7.2.0/IPython/testing/tools.py 2018-11-04 18:33:17.000000000
+0100
+++ new/ipython-7.3.0/IPython/testing/tools.py 2019-01-06 21:28:33.000000000
+0100
@@ -422,8 +422,7 @@
def make_tempfile(name):
""" Create an empty, named, temporary file for the duration of the context.
"""
- f = open(name, 'w')
- f.close()
+ open(name, 'w').close()
try:
yield
finally:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/utils/_sysinfo.py
new/ipython-7.3.0/IPython/utils/_sysinfo.py
--- old/ipython-7.2.0/IPython/utils/_sysinfo.py 2018-11-30 02:17:58.000000000
+0100
+++ new/ipython-7.3.0/IPython/utils/_sysinfo.py 2019-02-18 22:59:11.000000000
+0100
@@ -1,2 +1,2 @@
# GENERATED BY setup.py
-commit = u"523ed2fe5"
+commit = u"2e1cca5bc"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ipython-7.2.0/IPython/utils/tests/test_module_paths.py
new/ipython-7.3.0/IPython/utils/tests/test_module_paths.py
--- old/ipython-7.2.0/IPython/utils/tests/test_module_paths.py 2018-11-20
19:37:09.000000000 +0100
+++ new/ipython-7.3.0/IPython/utils/tests/test_module_paths.py 2019-01-06
21:28:33.000000000 +0100
@@ -37,8 +37,7 @@
old_syspath = sys.path
def make_empty_file(fname):
- f = open(fname, 'w')
- f.close()
+ open(fname, 'w').close()
def setup():
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/IPython/utils/tests/test_openpy.py
new/ipython-7.3.0/IPython/utils/tests/test_openpy.py
--- old/ipython-7.2.0/IPython/utils/tests/test_openpy.py 2018-11-04
18:33:17.000000000 +0100
+++ new/ipython-7.3.0/IPython/utils/tests/test_openpy.py 2019-01-06
21:28:33.000000000 +0100
@@ -8,8 +8,8 @@
nonascii_path = os.path.join(mydir, '../../core/tests/nonascii.py')
def test_detect_encoding():
- f = open(nonascii_path, 'rb')
- enc, lines = openpy.detect_encoding(f.readline)
+ with open(nonascii_path, 'rb') as f:
+ enc, lines = openpy.detect_encoding(f.readline)
nt.assert_equal(enc, 'iso-8859-5')
def test_read_file():
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/PKG-INFO new/ipython-7.3.0/PKG-INFO
--- old/ipython-7.2.0/PKG-INFO 2018-11-30 02:17:58.000000000 +0100
+++ new/ipython-7.3.0/PKG-INFO 2019-02-18 22:59:11.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: ipython
-Version: 7.2.0
+Version: 7.3.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.2.0/README.rst new/ipython-7.3.0/README.rst
--- old/ipython-7.2.0/README.rst 2018-11-19 20:37:00.000000000 +0100
+++ new/ipython-7.3.0/README.rst 2019-01-06 21:28:19.000000000 +0100
@@ -87,7 +87,7 @@
For more information see one of our blog posts:
- https://blog.jupyter.org/2016/07/08/ipython-5-0-released/
+ https://blog.jupyter.org/release-of-ipython-5-0-8ce60b8d2e8e
As well as the following Pull-Request for discussion:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/docs/source/coredev/index.rst
new/ipython-7.3.0/docs/source/coredev/index.rst
--- old/ipython-7.2.0/docs/source/coredev/index.rst 2018-11-30
02:17:33.000000000 +0100
+++ new/ipython-7.3.0/docs/source/coredev/index.rst 2019-02-18
22:58:52.000000000 +0100
@@ -215,20 +215,26 @@
Commit the changes to release.py::
- git commit -am "release $VERSION"
+ git commit -am "release $VERSION" -S
git push origin $BRANCH
+(omit the ``-S`` if you are no signing the package)
+
Create and push the tag::
- git tag -am "release $VERSION" "$VERSION"
+ git tag -am "release $VERSION" "$VERSION" -S
git push origin $VERSION
+(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::
- git commit -am "back to development"
+ git commit -am "back to development" -S
git push origin $BRANCH
+(omit the ``-S`` if you are no signing the package)
+
Now checkout the tag we just made::
git checkout $VERSION
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/docs/source/interactive/shell.rst
new/ipython-7.3.0/docs/source/interactive/shell.rst
--- old/ipython-7.2.0/docs/source/interactive/shell.rst 2018-10-27
01:55:12.000000000 +0200
+++ new/ipython-7.3.0/docs/source/interactive/shell.rst 2019-02-18
22:35:17.000000000 +0100
@@ -186,13 +186,13 @@
Now we can just remove these files by doing 'rm $junk.s'.
-The .s, .n, .p properties
+The .n, .s, .p properties
-------------------------
-The ``.s`` property returns one string where lines are separated by
-single space (for convenient passing to system commands). The ``.n``
-property return one string where the lines are separated by a newline
-(i.e. the original output of the function). If the items in string
-list are file names, ``.p`` can be used to get a list of "path" objects
-for convenient file manipulation.
+Properties of `SList
<https://ipython.readthedocs.io/en/stable/api/generated/IPython.utils.text.html?highlight=SList#IPython.utils.text.SList>`_
wrapper
+provide a convenient ways to use contained text in different formats:
+* ``.n`` returns (original) string with lines separated by a newline
+* ``.s`` returns string with lines separated by single space (for
+ convenient passing to system commands)
+* ``.p`` returns list of "path" objects from detected file names
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/docs/source/overview.rst
new/ipython-7.3.0/docs/source/overview.rst
--- old/ipython-7.2.0/docs/source/overview.rst 2018-11-04 18:33:17.000000000
+0100
+++ new/ipython-7.3.0/docs/source/overview.rst 2019-01-06 21:28:19.000000000
+0100
@@ -208,7 +208,7 @@
qtconsole``, and ``jupyter notebook``.
As an example, this means that when you start ``jupyter qtconsole``, you're
-really starting two processes, a kernel and a Qt-based client can send
+really starting two processes, a kernel and a Qt-based client which can send
commands to and receive results from that kernel. If there is already a kernel
running that you want to connect to, you can pass the ``--existing`` flag
which will skip initiating a new kernel and connect to the most recent kernel,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/docs/source/sphinxext.rst
new/ipython-7.3.0/docs/source/sphinxext.rst
--- old/ipython-7.2.0/docs/source/sphinxext.rst 2018-11-04 18:33:17.000000000
+0100
+++ new/ipython-7.3.0/docs/source/sphinxext.rst 2019-02-18 22:35:17.000000000
+0100
@@ -127,10 +127,10 @@
1. Run the *input* lines in your IPython directive block against the current
Python kernel (remember that the session
persists across IPython directive blocks);
-2. Compare the *output* of this with the output text that you've put in the
IPython directive block 9what comes
+2. Compare the *output* of this with the output text that you've put in the
IPython directive block (what comes
after `Out[NN]`);
-3. If there is a difference, the directive will raise an error and your
documentation build will fial.
+3. If there is a difference, the directive will raise an error and your
documentation build will fail.
You can do doctesting on multi-line output as well. Just be careful
when using non-deterministic inputs like random numbers in the ipython
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ipython-7.2.0/docs/source/whatsnew/github-stats-7.rst
new/ipython-7.3.0/docs/source/whatsnew/github-stats-7.rst
--- old/ipython-7.2.0/docs/source/whatsnew/github-stats-7.rst 2018-11-30
02:11:33.000000000 +0100
+++ new/ipython-7.3.0/docs/source/whatsnew/github-stats-7.rst 2019-02-18
22:50:03.000000000 +0100
@@ -1,8 +1,39 @@
Issues closed in the 7.x development cycle
==========================================
+Issues closed in 7.3
+--------------------
+
+GitHub stats for 2018/11/30 - 2019/02/18 (tag: 7.2.0)
+
+These lists are automatically generated, and may be incomplete or contain
duplicates.
+
+We closed 4 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 17 authors contributed 99 commits.
+
+* anatoly techtonik
+* Benjamin Ragan-Kelley
+* Gabriel Potter
+* Ian Bell
+* Jake VanderPlas
+* Jan S. (Milania1)
+* Jesse Widner
+* Kyungdahm Yun
+* Laurent Gautier
+* Matthias Bussonnier
+* memeplex
+* Mickaël Schoentgen
+* Partha P. Mukherjee
+* Philipp A
+* Sanyam Agarwal
+* Steve Nicholson
+* Tony Fast
+
Issues closed in 7.2
--------------------
+
GitHub stats for 2018/10/28 - 2018/11/29 (tag: 7.1.1)
These lists are automatically generated, and may be incomplete or contain
duplicates.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/docs/source/whatsnew/version7.rst
new/ipython-7.3.0/docs/source/whatsnew/version7.rst
--- old/ipython-7.2.0/docs/source/whatsnew/version7.rst 2018-11-30
02:03:56.000000000 +0100
+++ new/ipython-7.3.0/docs/source/whatsnew/version7.rst 2019-02-18
22:38:24.000000000 +0100
@@ -2,8 +2,36 @@
7.x Series
============
+.. _whatsnew730:
+
+IPython 7.3.0
+=============
+
.. _whatsnew720:
+IPython 7.3.0 bring several bug fixes and small improvements that you will
+described bellow.
+
+The biggest change to this release is the implementation of the ``%conda`` and
+``%pip`` magics, that will attempt to install packages in the **current
+environment**. You may still need to restart your interpreter or kernel for the
+change to be taken into account, but it should simplify installation of
packages
+into remote environment. Installing using pip/conda from the command line is
+still the prefer method.
+
+The ``%pip`` magic was already present, but was only printing a warning; now it
+will actually forward commands to pip.
+
+Misc bug fixes and improvements:
+
+ - Compatibility with Python 3.8.
+ - Do not expand shell variable in execution magics, and added the
+ ``no_var_expand`` decorator for magic requiring a similar functionality
+ :ghpull:`11516`
+ - Add ``%pip`` and ``%conda`` magic :ghpull:`11524`
+ - Re-initialize posix aliases after a ``%reset`` :ghpull:`11528`
+ - Allow the IPython command line to run ``*.ipynb`` files :ghpull:`11529`
+
IPython 7.2.0
=============
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/docs/sphinxext/apigen.py
new/ipython-7.3.0/docs/sphinxext/apigen.py
--- old/ipython-7.2.0/docs/sphinxext/apigen.py 2018-11-03 22:32:57.000000000
+0100
+++ new/ipython-7.3.0/docs/sphinxext/apigen.py 2019-01-06 21:28:33.000000000
+0100
@@ -105,7 +105,7 @@
if *package_name* is ``sphinx``, then ``sphinx.util`` will
result in ``.util`` being passed for earching by these
regexps. If is None, gives default. Default is:
- ['\.tests$']
+ ['\\.tests$']
module_skip_patterns : None or sequence
Sequence of strings giving URIs of modules to be excluded
Operates on the module name including preceding URI path,
@@ -113,7 +113,7 @@
``sphinx.util.console`` results in the string to search of
``.util.console``
If is None, gives default. Default is:
- ['\.setup$', '\._']
+ ['\\.setup$', '\\._']
names_from__all__ : set, optional
Modules listed in here will be scanned by doing ``from mod import
*``,
rather than finding function and class definitions by scanning the
@@ -355,7 +355,7 @@
>>> mods = dw.discover_modules()
>>> 'sphinx.util' in mods
True
- >>> dw.package_skip_patterns.append('\.util$')
+ >>> dw.package_skip_patterns.append('\\.util$')
>>> 'sphinx.util' in dw.discover_modules()
False
>>>
@@ -392,9 +392,8 @@
# write out to file
outfile = os.path.join(outdir,
m + self.rst_extension)
- fileobj = open(outfile, 'wt')
- fileobj.write(api_str)
- fileobj.close()
+ with open(outfile, 'wt') as fileobj:
+ fileobj.write(api_str)
written_modules.append(m)
self.written_modules = written_modules
@@ -445,11 +444,10 @@
relpath = outdir.replace(relative_to + os.path.sep, '')
else:
relpath = outdir
- idx = open(path,'wt')
- w = idx.write
- w('.. AUTO-GENERATED FILE -- DO NOT EDIT!\n\n')
- w('.. autosummary::\n'
- ' :toctree: %s\n\n' % relpath)
- for mod in self.written_modules:
- w(' %s\n' % mod)
- idx.close()
+ with open(path,'wt') as idx:
+ w = idx.write
+ w('.. AUTO-GENERATED FILE -- DO NOT EDIT!\n\n')
+ w('.. autosummary::\n'
+ ' :toctree: %s\n\n' % relpath)
+ for mod in self.written_modules:
+ w(' %s\n' % mod)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' "old/ipython-7.2.0/examples/IPython Kernel/Rich
Output.ipynb" "new/ipython-7.3.0/examples/IPython Kernel/Rich Output.ipynb"
--- "old/ipython-7.2.0/examples/IPython Kernel/Rich Output.ipynb"
2018-11-04 18:33:17.000000000 +0100
+++ "new/ipython-7.3.0/examples/IPython Kernel/Rich Output.ipynb"
2019-01-06 21:28:33.000000000 +0100
@@ -3023,7 +3023,8 @@
"source": [
"from IPython.display import HTML\n",
"from base64 import b64encode\n",
- "video = open(\"../images/animation.m4v\", \"rb\").read()\n",
+ "with open(\"../images/animation.m4v\", \"rb\") as f:\n",
+ " video = f.read()\n",
"video_encoded = b64encode(video).decode('ascii')\n",
"video_tag = '<video controls alt=\"test\"
src=\"data:video/x-m4v;base64,{0}\">'.format(video_encoded)\n",
"HTML(data=video_tag)"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' "old/ipython-7.2.0/examples/IPython
Kernel/ipython-get-history.py" "new/ipython-7.3.0/examples/IPython
Kernel/ipython-get-history.py"
--- "old/ipython-7.2.0/examples/IPython Kernel/ipython-get-history.py"
2018-10-27 01:55:12.000000000 +0200
+++ "new/ipython-7.3.0/examples/IPython Kernel/ipython-get-history.py"
2019-01-06 21:28:33.000000000 +0100
@@ -27,11 +27,13 @@
else:
dest = sys.stdout
raw = True
-dest.write("# coding: utf-8\n")
-# Profiles other than 'default' can be specified here with a profile= argument:
-hist = HistoryAccessor()
+with dest:
+ dest.write("# coding: utf-8\n")
-for session, lineno, cell in hist.get_range(session=session_number, raw=raw):
- cell = cell.encode('utf-8') # This line is only needed on Python 2.
- dest.write(cell + '\n')
+ # Profiles other than 'default' can be specified here with a profile=
argument:
+ hist = HistoryAccessor()
+
+ for session, lineno, cell in hist.get_range(session=session_number,
raw=raw):
+ cell = cell.encode('utf-8') # This line is only needed on Python 2.
+ dest.write(cell + '\n')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipython-7.2.0/setupbase.py
new/ipython-7.3.0/setupbase.py
--- old/ipython-7.2.0/setupbase.py 2018-11-04 18:33:17.000000000 +0100
+++ new/ipython-7.3.0/setupbase.py 2019-01-06 21:28:33.000000000 +0100
@@ -270,7 +270,7 @@
# Write .cmd wrappers for Windows so 'ipython' etc. work at the
# command line
cmd_file = os.path.join(self.build_dir, name + '.cmd')
- cmd = '@"{python}" "%~dp0\{script}" %*\r\n'.format(
+ cmd = r'@"{python}" "%~dp0\{script}" %*\r\n'.format(
python=sys.executable, script=name)
log.info("Writing %s wrapper script" % cmd_file)
with open(cmd_file, 'w') as f:
@@ -358,7 +358,7 @@
def run(self):
# loose as `.dev` is suppose to be invalid
print("check version number")
- loose_pep440re =
re.compile('^(\d+)\.(\d+)\.(\d+((a|b|rc)\d+)?)(\.post\d+)?(\.dev\d*)?$')
+ loose_pep440re =
re.compile(r'^(\d+)\.(\d+)\.(\d+((a|b|rc)\d+)?)(\.post\d+)?(\.dev\d*)?$')
if not loose_pep440re.match(version):
raise ValueError("Version number '%s' is not valid (should
match [N!]N(.N)*[{a|b|rc}N][.postN][.devN])" % version)
++++++ ipython.pdf ++++++
(binary differes)
++++++ ipython.zip ++++++
Binary files /var/tmp/diff_new_pack.OQ4G8y/_old and
/var/tmp/diff_new_pack.OQ4G8y/_new differ