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 - toddrme2...@gmail.com
+
+- 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: ipython-...@scipy.org
 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: ipython-...@scipy.org
+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
+


Reply via email to