Hello community,
here is the log from the commit of package python-jupyter_ipykernel for
openSUSE:Factory checked in at 2018-02-15 13:27:09
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-jupyter_ipykernel (Old)
and /work/SRC/openSUSE:Factory/.python-jupyter_ipykernel.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-jupyter_ipykernel"
Thu Feb 15 13:27:09 2018 rev:7 rq:576765 version:4.8.0
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-jupyter_ipykernel/python-jupyter_ipykernel-doc.changes
2018-01-19 11:51:53.483376261 +0100
+++
/work/SRC/openSUSE:Factory/.python-jupyter_ipykernel.new/python-jupyter_ipykernel-doc.changes
2018-02-15 13:27:20.107990204 +0100
@@ -1,0 +2,11 @@
+Thu Jan 18 06:50:10 UTC 2018 - [email protected]
+
+- update to version 4.8.9
+ * Cleanly shutdown integrated event loops when shutting down the
+ kernel. (:ghpull:`290`)
+ * %gui qt now uses Qt 5 by default rather than Qt 4, following a
+ similar change in terminal IPython. (:ghpull:`293`)
+ * Fix event loop integration for :mod:`asyncio` when run with
+ Tornado 5, which uses asyncio where available. (:ghpull:`296`)
+
+-------------------------------------------------------------------
python-jupyter_ipykernel.changes: same change
Old:
----
ipykernel-4.7.0.tar.gz
New:
----
ipykernel-4.8.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-jupyter_ipykernel-doc.spec ++++++
--- /var/tmp/diff_new_pack.8xvG4C/_old 2018-02-15 13:27:25.167806421 +0100
+++ /var/tmp/diff_new_pack.8xvG4C/_new 2018-02-15 13:27:25.171806276 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-jupyter_ipykernel-doc
#
-# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2018 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
@@ -22,14 +22,14 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-jupyter_ipykernel-doc
-Version: 4.7.0
+Version: 4.8.0
Release: 0
Summary: Documentation for python-jupyter_ipykernel
License: BSD-3-Clause
Group: Development/Languages/Python
-Url: http://ipython.org
+Url: https://github.com/ipython/ipykernel
Source:
https://files.pythonhosted.org/packages/source/i/ipykernel/ipykernel-%{version}.tar.gz
-BuildRequires: %{python_module jupyter_ipykernel}
+BuildRequires: %{python_module jupyter_ipykernel = %{version}}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
%if %{with tests}
@@ -42,6 +42,7 @@
# Documentation requirements
%if %{with pdf} || %{with html}
BuildRequires: python3-Sphinx
+BuildRequires: python3-sphinxcontrib-github-alt
%endif
%if %{with pdf}
BuildRequires: python3-Sphinx-latex
@@ -66,6 +67,7 @@
%if %{with html}
make html
rm -rf _build/html/.buildinfo
+sed -i 's/\r$//' _build/html/objects.inv
%endif
%if %{with pdf}
make latexpdf
++++++ python-jupyter_ipykernel.spec ++++++
--- /var/tmp/diff_new_pack.8xvG4C/_old 2018-02-15 13:27:25.199805258 +0100
+++ /var/tmp/diff_new_pack.8xvG4C/_new 2018-02-15 13:27:25.199805258 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-jupyter_ipykernel
#
-# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2018 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,12 +18,12 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-jupyter_ipykernel
-Version: 4.7.0
+Version: 4.8.0
Release: 0
Summary: IPython Kernel for Jupyter
License: BSD-3-Clause
Group: Development/Languages/Python
-Url: http://ipython.org
+Url: https://github.com/ipython/ipykernel
Source:
https://files.pythonhosted.org/packages/source/i/ipykernel/ipykernel-%{version}.tar.gz
BuildRequires: %{python_module devel}
BuildRequires: %{python_module jupyter_client}
++++++ ipykernel-4.7.0.tar.gz -> ipykernel-4.8.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipykernel-4.7.0/MANIFEST.in
new/ipykernel-4.8.0/MANIFEST.in
--- old/ipykernel-4.7.0/MANIFEST.in 1970-01-01 01:00:00.000000000 +0100
+++ new/ipykernel-4.8.0/MANIFEST.in 2018-01-17 18:37:33.000000000 +0100
@@ -0,0 +1,24 @@
+include COPYING.md
+include CONTRIBUTING.md
+include README.md
+
+# Documentation
+graft docs
+exclude docs/\#*
+
+# Examples
+graft examples
+
+# docs subdirs we want to skip
+prune docs/_build
+prune docs/gh-pages
+prune docs/dist
+
+# Patterns to exclude from any directory
+global-exclude *~
+global-exclude *.pyc
+global-exclude *.pyo
+global-exclude .git
+global-exclude .ipynb_checkpoints
+
+prune data_kernelspec
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipykernel-4.7.0/PKG-INFO new/ipykernel-4.8.0/PKG-INFO
--- old/ipykernel-4.7.0/PKG-INFO 2017-12-06 13:28:02.000000000 +0100
+++ new/ipykernel-4.8.0/PKG-INFO 2018-01-17 18:37:38.000000000 +0100
@@ -1,11 +1,12 @@
Metadata-Version: 1.1
Name: ipykernel
-Version: 4.7.0
+Version: 4.8.0
Summary: IPython Kernel for Jupyter
Home-page: http://ipython.org
Author: IPython Development Team
Author-email: [email protected]
License: BSD
+Description-Content-Type: UNKNOWN
Description: UNKNOWN
Keywords: Interactive,Interpreter,Shell,Web
Platform: Linux
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipykernel-4.7.0/docs/changelog.rst
new/ipykernel-4.8.0/docs/changelog.rst
--- old/ipykernel-4.7.0/docs/changelog.rst 2017-12-06 13:27:21.000000000
+0100
+++ new/ipykernel-4.8.0/docs/changelog.rst 2018-01-17 18:27:19.000000000
+0100
@@ -1,6 +1,21 @@
Changes in IPython kernel
=========================
+4.8
+---
+
+4.8.0
+*****
+
+`4.8.0 on GitHub <https://github.com/ipython/ipykernel/milestones/4.8>`__
+
+- Cleanly shutdown integrated event loops when shutting down the kernel.
+ (:ghpull:`290`)
+- ``%gui qt`` now uses Qt 5 by default rather than Qt 4, following a similar
+ change in terminal IPython. (:ghpull:`293`)
+- Fix event loop integration for :mod:`asyncio` when run with Tornado 5,
+ which uses asyncio where available. (:ghpull:`296`)
+
4.7
---
@@ -38,8 +53,10 @@
- Add to API `DisplayPublisher.publish` two new fully backward-compatible
keyword-args:
+
- `update: bool`
- `transient: dict`
+
- Support new `transient` key in `display_data` messages spec for `publish`.
For a display data message, `transient` contains data that shouldn't be
persisted to files or documents. Add a `display_id` to this `transient`
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipykernel-4.7.0/docs/conf.py
new/ipykernel-4.8.0/docs/conf.py
--- old/ipykernel-4.7.0/docs/conf.py 2017-12-05 13:12:24.000000000 +0100
+++ new/ipykernel-4.8.0/docs/conf.py 2018-01-17 18:27:19.000000000 +0100
@@ -33,8 +33,11 @@
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.intersphinx',
+ 'sphinxcontrib_github_alt',
]
+github_project_url = "https://github.com/ipython/ipykernel"
+
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipykernel-4.7.0/docs/requirements.txt
new/ipykernel-4.8.0/docs/requirements.txt
--- old/ipykernel-4.7.0/docs/requirements.txt 1970-01-01 01:00:00.000000000
+0100
+++ new/ipykernel-4.8.0/docs/requirements.txt 2018-01-17 18:27:19.000000000
+0100
@@ -0,0 +1 @@
+sphinxcontrib_github_alt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipykernel-4.7.0/ipykernel/_eventloop_macos.py
new/ipykernel-4.8.0/ipykernel/_eventloop_macos.py
--- old/ipykernel-4.7.0/ipykernel/_eventloop_macos.py 1970-01-01
01:00:00.000000000 +0100
+++ new/ipykernel-4.8.0/ipykernel/_eventloop_macos.py 2018-01-10
12:43:25.000000000 +0100
@@ -0,0 +1,153 @@
+"""Eventloop hook for OS X
+
+Calls NSApp / CoreFoundation APIs via ctypes.
+"""
+
+# cribbed heavily from IPython.terminal.pt_inputhooks.osx
+# obj-c boilerplate from appnope, used under BSD 2-clause
+
+import ctypes
+import ctypes.util
+from threading import Event
+
+objc = ctypes.cdll.LoadLibrary(ctypes.util.find_library('objc'))
+
+void_p = ctypes.c_void_p
+
+objc.objc_getClass.restype = void_p
+objc.sel_registerName.restype = void_p
+objc.objc_msgSend.restype = void_p
+objc.objc_msgSend.argtypes = [void_p, void_p]
+
+msg = objc.objc_msgSend
+
+
+def _utf8(s):
+ """ensure utf8 bytes"""
+ if not isinstance(s, bytes):
+ s = s.encode('utf8')
+ return s
+
+
+def n(name):
+ """create a selector name (for ObjC methods)"""
+ return objc.sel_registerName(_utf8(name))
+
+
+def C(classname):
+ """get an ObjC Class by name"""
+ return objc.objc_getClass(_utf8(classname))
+
+
+# end obj-c boilerplate from appnope
+
+# CoreFoundation C-API calls we will use:
+CoreFoundation =
ctypes.cdll.LoadLibrary(ctypes.util.find_library('CoreFoundation'))
+
+CFAbsoluteTimeGetCurrent = CoreFoundation.CFAbsoluteTimeGetCurrent
+CFAbsoluteTimeGetCurrent.restype = ctypes.c_double
+
+CFRunLoopGetCurrent = CoreFoundation.CFRunLoopGetCurrent
+CFRunLoopGetCurrent.restype = void_p
+
+CFRunLoopGetMain = CoreFoundation.CFRunLoopGetMain
+CFRunLoopGetMain.restype = void_p
+
+CFRunLoopStop = CoreFoundation.CFRunLoopStop
+CFRunLoopStop.restype = None
+CFRunLoopStop.argtypes = [void_p]
+
+CFRunLoopTimerCreate = CoreFoundation.CFRunLoopTimerCreate
+CFRunLoopTimerCreate.restype = void_p
+CFRunLoopTimerCreate.argtypes = [
+ void_p, # allocator (NULL)
+ ctypes.c_double, # fireDate
+ ctypes.c_double, # interval
+ ctypes.c_int, # flags (0)
+ ctypes.c_int, # order (0)
+ void_p, # callout
+ void_p, # context
+]
+
+CFRunLoopAddTimer = CoreFoundation.CFRunLoopAddTimer
+CFRunLoopAddTimer.restype = None
+CFRunLoopAddTimer.argtypes = [ void_p, void_p, void_p ]
+
+kCFRunLoopCommonModes = void_p.in_dll(CoreFoundation, 'kCFRunLoopCommonModes')
+
+
+def _NSApp():
+ """Return the global NSApplication instance (NSApp)"""
+ return msg(C('NSApplication'), n('sharedApplication'))
+
+
+def _wake(NSApp):
+ """Wake the Application"""
+ event = msg(C('NSEvent'),
+ n('otherEventWithType:location:modifierFlags:'
+ 'timestamp:windowNumber:context:subtype:data1:data2:'),
+ 15, # Type
+ 0, # location
+ 0, # flags
+ 0, # timestamp
+ 0, # window
+ None, # context
+ 0, # subtype
+ 0, # data1
+ 0, # data2
+ )
+ msg(NSApp, n('postEvent:atStart:'), void_p(event), True)
+
+
+_triggered = Event()
+
+
+def stop(timer=None, loop=None):
+ """Callback to fire when there's input to be read"""
+ _triggered.set()
+ NSApp = _NSApp()
+ # if NSApp is not running, stop CFRunLoop directly,
+ # otherwise stop and wake NSApp
+ if msg(NSApp, n('isRunning')):
+ msg(NSApp, n('stop:'), NSApp)
+ _wake(NSApp)
+ else:
+ CFRunLoopStop(CFRunLoopGetCurrent())
+
+
+_c_callback_func_type = ctypes.CFUNCTYPE(None, void_p, void_p)
+_c_stop_callback = _c_callback_func_type(stop)
+
+
+def _stop_after(delay):
+ """Register callback to stop eventloop after a delay"""
+ timer = CFRunLoopTimerCreate(
+ None, # allocator
+ CFAbsoluteTimeGetCurrent() + delay, # fireDate
+ 0, # interval
+ 0, # flags
+ 0, # order
+ _c_stop_callback,
+ None,
+ )
+ CFRunLoopAddTimer(
+ CFRunLoopGetMain(),
+ timer,
+ kCFRunLoopCommonModes,
+ )
+
+
+def mainloop(duration=1):
+ """run the Cocoa eventloop for the specified duration (seconds)"""
+
+ _triggered.clear()
+ NSApp = _NSApp()
+ _stop_after(duration)
+ msg(NSApp, n('run'))
+ if not _triggered.is_set():
+ # app closed without firing callback,
+ # probably due to last window being closed.
+ # Run the loop manually in this case,
+ # since there may be events still to process (ipython/ipython#9734)
+ CoreFoundation.CFRunLoopRun()
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipykernel-4.7.0/ipykernel/_version.py
new/ipykernel-4.8.0/ipykernel/_version.py
--- old/ipykernel-4.7.0/ipykernel/_version.py 2017-12-06 13:27:56.000000000
+0100
+++ new/ipykernel-4.8.0/ipykernel/_version.py 2018-01-17 18:30:25.000000000
+0100
@@ -1,4 +1,4 @@
-version_info = (4, 7, 0)
+version_info = (4, 8, 0)
__version__ = '.'.join(map(str, version_info))
kernel_protocol_version_info = (5, 1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipykernel-4.7.0/ipykernel/eventloops.py
new/ipykernel-4.8.0/ipykernel/eventloops.py
--- old/ipykernel-4.7.0/ipykernel/eventloops.py 2017-12-06 13:27:21.000000000
+0100
+++ new/ipykernel-4.8.0/ipykernel/eventloops.py 2018-01-10 12:43:25.000000000
+0100
@@ -49,7 +49,7 @@
'notebook': None,
'ipympl': None,
'widget': None,
- None : None,
+ None: None,
}
def register_integration(*toolkitnames):
@@ -68,6 +68,17 @@
def decorator(func):
for name in toolkitnames:
loop_map[name] = func
+
+ func.exit_hook = lambda kernel: None
+
+ def exit_decorator(exit_func):
+ """@func.exit is now a decorator
+
+ to register a function to be called on exit
+ """
+ func.exit_hook = exit_func
+
+ func.exit = exit_decorator
return func
return decorator
@@ -85,7 +96,7 @@
app._in_event_loop = False
-@register_integration('qt', 'qt4')
+@register_integration('qt4')
def loop_qt4(kernel):
"""Start a kernel with PyQt4 event loop integration."""
@@ -100,13 +111,23 @@
_loop_qt(kernel.app)
-@register_integration('qt5')
+@loop_qt4.exit
+def loop_qt4_exit(kernel):
+ kernel.app.exit()
+
+
+@register_integration('qt', 'qt5')
def loop_qt5(kernel):
"""Start a kernel with PyQt5 event loop integration."""
os.environ['QT_API'] = 'pyqt5'
return loop_qt4(kernel)
+@loop_qt5.exit
+def loop_qt5_exit(kernel):
+ kernel.app.exit()
+
+
def _loop_wx(app):
"""Inner-loop for running the Wx eventloop
@@ -171,6 +192,12 @@
_loop_wx(kernel.app)
+@loop_wx.exit
+def loop_wx_exit(kernel):
+ import wx
+ wx.Exit()
+
+
@register_integration('tk')
def loop_tk(kernel):
"""Start a kernel with the Tk event loop."""
@@ -201,6 +228,11 @@
kernel.timer.start()
+@loop_tk.exit
+def loop_tk_exit(kernel):
+ kernel.timer.app.destroy()
+
+
@register_integration('gtk')
def loop_gtk(kernel):
"""Start the kernel, coordinating with the GTK event loop"""
@@ -208,6 +240,12 @@
gtk_kernel = GTKEmbed(kernel)
gtk_kernel.start()
+ kernel._gtk = gtk_kernel
+
+
+@loop_gtk.exit
+def loop_gtk_exit(kernel):
+ kernel._gtk.stop()
@register_integration('gtk3')
@@ -217,6 +255,12 @@
gtk_kernel = GTKEmbed(kernel)
gtk_kernel.start()
+ kernel._gtk = gtk_kernel
+
+
+@loop_gtk3.exit
+def loop_gtk3_exit(kernel):
+ kernel._gtk.stop()
@register_integration('osx')
@@ -224,62 +268,27 @@
"""Start the kernel, coordinating with the Cocoa CFRunLoop event loop
via the matplotlib MacOSX backend.
"""
- import matplotlib
- if matplotlib.__version__ < '1.1.0':
- kernel.log.warn(
- "MacOSX backend in matplotlib %s doesn't have a Timer, "
- "falling back on Tk for CFRunLoop integration. Note that "
- "even this won't work if Tk is linked against X11 instead of "
- "Cocoa (e.g. EPD). To use the MacOSX backend in the kernel, "
- "you must use matplotlib >= 1.1.0, or a native libtk."
- )
- return loop_tk(kernel)
-
- from matplotlib.backends.backend_macosx import TimerMac, show
-
- # scale interval for sec->ms
- poll_interval = int(1000*kernel._poll_interval)
+ from ._eventloop_macos import mainloop, stop
real_excepthook = sys.excepthook
def handle_int(etype, value, tb):
"""don't let KeyboardInterrupts look like crashes"""
+ # wake the eventloop when we get a signal
+ stop()
if etype is KeyboardInterrupt:
io.raw_print("KeyboardInterrupt caught in CFRunLoop")
else:
real_excepthook(etype, value, tb)
- # add doi() as a Timer to the CFRunLoop
- def doi():
- # restore excepthook during IPython code
- sys.excepthook = real_excepthook
- kernel.do_one_iteration()
- # and back:
- sys.excepthook = handle_int
-
- t = TimerMac(poll_interval)
- t.add_callback(doi)
- t.start()
-
- # but still need a Poller for when there are no active windows,
- # during which time mainloop() returns immediately
- poller = zmq.Poller()
- if kernel.control_stream:
- poller.register(kernel.control_stream.socket, zmq.POLLIN)
- for stream in kernel.shell_streams:
- poller.register(stream.socket, zmq.POLLIN)
-
- while True:
+ while not kernel.shell.exit_now:
try:
# double nested try/except, to properly catch KeyboardInterrupt
# due to pyzmq Issue #130
try:
# don't let interrupts during mainloop invoke crash_handler:
sys.excepthook = handle_int
- show.mainloop()
+ mainloop(kernel._poll_interval)
sys.excepthook = real_excepthook
- # use poller if mainloop returned (no windows)
- # scale by extra factor of 10, since it's a real poll
- poller.poll(10*poll_interval)
kernel.do_one_iteration()
except:
raise
@@ -291,20 +300,26 @@
sys.excepthook = real_excepthook
+@loop_cocoa.exit
+def loop_cocoa_exit(kernel):
+ from ._eventloop_macos import stop
+ stop()
+
+
@register_integration('asyncio')
def loop_asyncio(kernel):
'''Start a kernel with asyncio event loop support.'''
import asyncio
loop = asyncio.get_event_loop()
+ # loop is already running (e.g. tornado 5), nothing left to do
+ if loop.is_running():
+ return
def kernel_handler():
loop.call_soon(kernel.do_one_iteration)
loop.call_later(kernel._poll_interval, kernel_handler)
loop.call_soon(kernel_handler)
- # loop is already running (e.g. tornado 5), nothing left to do
- if loop.is_running():
- return
while True:
error = None
try:
@@ -320,6 +335,16 @@
raise error
break
+
+@loop_asyncio.exit
+def loop_asyncio_exit(kernel):
+ """Exit hook for asyncio"""
+ import asyncio
+ loop = asyncio.get_event_loop()
+ if loop.is_running():
+ loop.call_soon(loop.stop)
+
+
def enable_gui(gui, kernel=None):
"""Enable integration with a given GUI"""
if gui not in loop_map:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipykernel-4.7.0/ipykernel/kernelbase.py
new/ipykernel-4.8.0/ipykernel/kernelbase.py
--- old/ipykernel-4.7.0/ipykernel/kernelbase.py 2017-12-06 13:27:21.000000000
+0100
+++ new/ipykernel-4.8.0/ipykernel/kernelbase.py 2018-01-17 18:27:19.000000000
+0100
@@ -50,7 +50,8 @@
def _update_eventloop(self, change):
"""schedule call to eventloop from IOLoop"""
loop = ioloop.IOLoop.current()
- loop.add_callback(self.enter_eventloop)
+ if change.new is not None:
+ loop.add_callback(self.enter_eventloop)
session = Instance(Session, allow_none=True)
profile_dir = Instance('IPython.core.profiledir.ProfileDir',
allow_none=True)
@@ -256,7 +257,7 @@
# which may be skipped by entering the eventloop
stream.flush(zmq.POLLOUT)
# restore default_int_handler
- signal(SIGINT, default_int_handler)
+ self.pre_handler_hook()
while self.eventloop is not None:
try:
self.eventloop(self)
@@ -268,6 +269,7 @@
# eventloop exited cleanly, this means we should stop (right?)
self.eventloop = None
break
+ self.post_handler_hook()
self.log.info("exiting eventloop")
def start(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipykernel-4.7.0/ipykernel/zmqshell.py
new/ipykernel-4.8.0/ipykernel/zmqshell.py
--- old/ipykernel-4.7.0/ipykernel/zmqshell.py 2017-12-06 13:27:21.000000000
+0100
+++ new/ipykernel-4.8.0/ipykernel/zmqshell.py 2018-01-10 12:43:25.000000000
+0100
@@ -471,6 +471,10 @@
if change['new']:
loop = self.kernel.io_loop
loop.call_later(0.1, loop.stop)
+ if self.kernel.eventloop:
+ exit_hook = getattr(self.kernel.eventloop, 'exit_hook', None)
+ if exit_hook:
+ exit_hook(self.kernel)
keepkernel_on_exit = None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipykernel-4.7.0/ipykernel.egg-info/PKG-INFO
new/ipykernel-4.8.0/ipykernel.egg-info/PKG-INFO
--- old/ipykernel-4.7.0/ipykernel.egg-info/PKG-INFO 1970-01-01
01:00:00.000000000 +0100
+++ new/ipykernel-4.8.0/ipykernel.egg-info/PKG-INFO 2018-01-17
18:37:38.000000000 +0100
@@ -0,0 +1,21 @@
+Metadata-Version: 1.1
+Name: ipykernel
+Version: 4.8.0
+Summary: IPython Kernel for Jupyter
+Home-page: http://ipython.org
+Author: IPython Development Team
+Author-email: [email protected]
+License: BSD
+Description-Content-Type: UNKNOWN
+Description: UNKNOWN
+Keywords: Interactive,Interpreter,Shell,Web
+Platform: Linux
+Platform: Mac OS X
+Platform: Windows
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: System Administrators
+Classifier: Intended Audience :: Science/Research
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipykernel-4.7.0/ipykernel.egg-info/SOURCES.txt
new/ipykernel-4.8.0/ipykernel.egg-info/SOURCES.txt
--- old/ipykernel-4.7.0/ipykernel.egg-info/SOURCES.txt 1970-01-01
01:00:00.000000000 +0100
+++ new/ipykernel-4.8.0/ipykernel.egg-info/SOURCES.txt 2018-01-17
18:37:38.000000000 +0100
@@ -0,0 +1,85 @@
+CONTRIBUTING.md
+COPYING.md
+MANIFEST.in
+README.md
+ipykernel_launcher.py
+setup.cfg
+setup.py
+/home/takluyver/Code/ipykernel/data_kernelspec/kernel.json
+/home/takluyver/Code/ipykernel/data_kernelspec/logo-32x32.png
+/home/takluyver/Code/ipykernel/data_kernelspec/logo-64x64.png
+docs/Makefile
+docs/changelog.rst
+docs/conf.py
+docs/index.rst
+docs/make.bat
+docs/requirements.txt
+examples/embedding/inprocess_qtconsole.py
+examples/embedding/inprocess_terminal.py
+examples/embedding/internal_ipkernel.py
+examples/embedding/ipkernel_qtapp.py
+examples/embedding/ipkernel_wxapp.py
+ipykernel/__init__.py
+ipykernel/__main__.py
+ipykernel/_eventloop_macos.py
+ipykernel/_version.py
+ipykernel/codeutil.py
+ipykernel/connect.py
+ipykernel/datapub.py
+ipykernel/displayhook.py
+ipykernel/embed.py
+ipykernel/eventloops.py
+ipykernel/heartbeat.py
+ipykernel/iostream.py
+ipykernel/ipkernel.py
+ipykernel/jsonutil.py
+ipykernel/kernelapp.py
+ipykernel/kernelbase.py
+ipykernel/kernelspec.py
+ipykernel/log.py
+ipykernel/parentpoller.py
+ipykernel/pickleutil.py
+ipykernel/serialize.py
+ipykernel/zmqshell.py
+ipykernel.egg-info/PKG-INFO
+ipykernel.egg-info/SOURCES.txt
+ipykernel.egg-info/dependency_links.txt
+ipykernel.egg-info/requires.txt
+ipykernel.egg-info/top_level.txt
+ipykernel/comm/__init__.py
+ipykernel/comm/comm.py
+ipykernel/comm/manager.py
+ipykernel/gui/__init__.py
+ipykernel/gui/gtk3embed.py
+ipykernel/gui/gtkembed.py
+ipykernel/inprocess/__init__.py
+ipykernel/inprocess/blocking.py
+ipykernel/inprocess/channels.py
+ipykernel/inprocess/client.py
+ipykernel/inprocess/constants.py
+ipykernel/inprocess/ipkernel.py
+ipykernel/inprocess/manager.py
+ipykernel/inprocess/socket.py
+ipykernel/inprocess/tests/__init__.py
+ipykernel/inprocess/tests/test_kernel.py
+ipykernel/inprocess/tests/test_kernelmanager.py
+ipykernel/pylab/__init__.py
+ipykernel/pylab/backend_inline.py
+ipykernel/pylab/config.py
+ipykernel/resources/logo-32x32.png
+ipykernel/resources/logo-64x64.png
+ipykernel/tests/__init__.py
+ipykernel/tests/_asyncio.py
+ipykernel/tests/test_connect.py
+ipykernel/tests/test_embed_kernel.py
+ipykernel/tests/test_eventloop.py
+ipykernel/tests/test_io.py
+ipykernel/tests/test_jsonutil.py
+ipykernel/tests/test_kernel.py
+ipykernel/tests/test_kernelspec.py
+ipykernel/tests/test_message_spec.py
+ipykernel/tests/test_pickleutil.py
+ipykernel/tests/test_serialize.py
+ipykernel/tests/test_start_kernel.py
+ipykernel/tests/test_zmq_shell.py
+ipykernel/tests/utils.py
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ipykernel-4.7.0/ipykernel.egg-info/dependency_links.txt
new/ipykernel-4.8.0/ipykernel.egg-info/dependency_links.txt
--- old/ipykernel-4.7.0/ipykernel.egg-info/dependency_links.txt 1970-01-01
01:00:00.000000000 +0100
+++ new/ipykernel-4.8.0/ipykernel.egg-info/dependency_links.txt 2018-01-17
18:37:38.000000000 +0100
@@ -0,0 +1 @@
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipykernel-4.7.0/ipykernel.egg-info/requires.txt
new/ipykernel-4.8.0/ipykernel.egg-info/requires.txt
--- old/ipykernel-4.7.0/ipykernel.egg-info/requires.txt 1970-01-01
01:00:00.000000000 +0100
+++ new/ipykernel-4.8.0/ipykernel.egg-info/requires.txt 2018-01-17
18:37:38.000000000 +0100
@@ -0,0 +1,17 @@
+ipython>=4.0.0
+traitlets>=4.1.0
+jupyter_client
+tornado>=4.0
+
+[test]
+pytest-cov
+nose
+
+[test:python_version!="3.3"]
+pytest>=3.2
+
+[test:python_version=="2.7"]
+mock
+
+[test:python_version=="3.3"]
+pytest==3.2.*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipykernel-4.7.0/ipykernel.egg-info/top_level.txt
new/ipykernel-4.8.0/ipykernel.egg-info/top_level.txt
--- old/ipykernel-4.7.0/ipykernel.egg-info/top_level.txt 1970-01-01
01:00:00.000000000 +0100
+++ new/ipykernel-4.8.0/ipykernel.egg-info/top_level.txt 2018-01-17
18:37:38.000000000 +0100
@@ -0,0 +1,2 @@
+ipykernel
+ipykernel_launcher
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ipykernel-4.7.0/setup.cfg
new/ipykernel-4.8.0/setup.cfg
--- old/ipykernel-4.7.0/setup.cfg 2017-12-05 13:12:24.000000000 +0100
+++ new/ipykernel-4.8.0/setup.cfg 2018-01-17 18:37:38.000000000 +0100
@@ -1,8 +1,11 @@
[bdist_wheel]
-universal=0
+universal = 0
[nosetests]
-warningfilters= default |.* |DeprecationWarning |ipykernel.*
- error |.*invalid.* |DeprecationWarning |matplotlib.*
-
-
+warningfilters = default |.* |DeprecationWarning |ipykernel.*
+ error |.*invalid.* |DeprecationWarning |matplotlib.*
+
+[egg_info]
+tag_build =
+tag_date = 0
+