Hello community, here is the log from the commit of package python-jupyter_client for openSUSE:Factory checked in at 2019-07-30 14:01:55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-jupyter_client (Old) and /work/SRC/openSUSE:Factory/.python-jupyter_client.new.4126 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "python-jupyter_client" Tue Jul 30 14:01:55 2019 rev:10 rq:719302 version:5.3.1 Changes: -------- --- /work/SRC/openSUSE:Factory/python-jupyter_client/python-jupyter_client-doc.changes 2019-05-22 11:05:14.598574957 +0200 +++ /work/SRC/openSUSE:Factory/.python-jupyter_client.new.4126/python-jupyter_client-doc.changes 2019-07-30 14:01:56.468975287 +0200 @@ -1,0 +2,16 @@ +Sat Jul 27 23:06:22 UTC 2019 - Todd R <toddrme2178@gmail.com> + +- Update to 5.3.1 + * Fix bug with control channel socket introduced in 5.3.0 +- Update to 5.3.0 + + New Features: + * Multiprocessing and Threading support + * Setup package long_description + + Changes: + * Control channel now in the public API + * Closing Jupyter Client is now faster + * Pip support improvements + + Breaking changes: + * Dropped support for Python 3.3 and 3.4 (upstream packages dropped support already) + +------------------------------------------------------------------- python-jupyter_client.changes: same change Old: ---- jupyter_client-5.2.4.tar.gz New: ---- jupyter_client-5.3.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-jupyter_client-doc.spec ++++++ --- /var/tmp/diff_new_pack.UZLBXb/_old 2019-07-30 14:01:57.336974693 +0200 +++ /var/tmp/diff_new_pack.UZLBXb/_new 2019-07-30 14:01:57.348974685 +0200 @@ -23,7 +23,7 @@ %bcond_without html %bcond_without tests Name: python-jupyter_client-doc -Version: 5.2.4 +Version: 5.3.1 Release: 0 Summary: Documentation for the Jupyter client libraries License: BSD-3-Clause ++++++ python-jupyter_client.spec ++++++ --- /var/tmp/diff_new_pack.UZLBXb/_old 2019-07-30 14:01:57.424974633 +0200 +++ /var/tmp/diff_new_pack.UZLBXb/_new 2019-07-30 14:01:57.432974628 +0200 @@ -18,7 +18,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-jupyter_client -Version: 5.2.4 +Version: 5.3.1 Release: 0 Summary: Jupyter protocol implementation and client libraries License: BSD-3-Clause ++++++ jupyter_client-5.2.4.tar.gz -> jupyter_client-5.3.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jupyter_client-5.2.4/PKG-INFO new/jupyter_client-5.3.1/PKG-INFO --- old/jupyter_client-5.2.4/PKG-INFO 2018-12-10 15:25:49.000000000 +0100 +++ new/jupyter_client-5.3.1/PKG-INFO 2019-07-09 23:25:14.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: jupyter_client -Version: 5.2.4 +Version: 5.3.1 Summary: Jupyter protocol implementation and client libraries Home-page: https://jupyter.org Author: Jupyter Development Team @@ -9,7 +9,53 @@ Project-URL: Documentation, https://jupyter-client.readthedocs.io Project-URL: Source, https://github.com/jupyter/jupyter_client/ Project-URL: Tracker, https://github.com/jupyter/jupyter_client/issues -Description: UNKNOWN +Description: # Jupyter Client + + [![Code Health](https://landscape.io/github/jupyter/jupyter_client/master/landscape.svg?style=flat)](https://landscape.io/github/jupyter/jupyter_client/master) + + + `jupyter_client` contains the reference implementation of the [Jupyter protocol][]. + It also provides client and kernel management APIs for working with kernels. + + It also provides the `jupyter kernelspec` entrypoint + for installing kernelspecs for use with Jupyter frontends. + + [Jupyter protocol]: https://jupyter-client.readthedocs.io/en/latest/messaging.html + + + # Development Setup + + The [Jupyter Contributor Guides](http://jupyter.readthedocs.io/en/latest/contributor/content-contributor.html) provide extensive information on contributing code or documentation to Jupyter projects. The limited instructions below for setting up a development environment are for your convenience. + + ## Coding + + You'll need Python and `pip` on the search path. Clone the Jupyter Client git repository to your computer, for example in `/my/project/jupyter_client`. + Now create an [editable install](https://pip.pypa.io/en/stable/reference/pip_install/#editable-installs) + and download the dependencies of code and test suite by executing: + + cd /my/projects/jupyter_client/ + pip install -e .[test] + py.test + + The last command runs the test suite to verify the setup. During development, you can pass filenames to `py.test`, and it will execute only those tests. + + ## Documentation + + The documentation of Jupyter Client is generated from the files in `docs/` using Sphinx. Instructions for setting up Sphinx with a selection of optional modules are in the [Documentation Guide](http://jupyter.readthedocs.io/en/latest/contrib_docs/index.html). You'll also need the `make` command. + For a minimal Sphinx installation to process the Jupyter Client docs, execute: + + pip install ipykernel sphinx sphinx_rtd_theme + + The following commands build the documentation in HTML format and check for broken links: + + cd /my/projects/jupyter_client/docs/ + make html linkcheck + + Point your browser to the following URL to access the generated documentation: + + _file:///my/projects/jupyter\_client/docs/\_build/html/index.html_ + + Keywords: Interactive,Interpreter,Shell,Web Platform: Linux Platform: Mac OS X @@ -24,5 +70,6 @@ Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 3 -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.* +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* +Description-Content-Type: text/markdown Provides-Extra: test diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jupyter_client-5.2.4/docs/changelog.rst new/jupyter_client-5.3.1/docs/changelog.rst --- old/jupyter_client-5.2.4/docs/changelog.rst 2018-12-10 15:22:46.000000000 +0100 +++ new/jupyter_client-5.3.1/docs/changelog.rst 2019-07-09 23:23:30.000000000 +0200 @@ -4,6 +4,30 @@ Changes in Jupyter Client ========================= +5.3.1 +===== + +- Fix bug with control channel socket introduced in 5.3.0 (:ghpull:`456`). + +5.3.0 +===== +`5.3.0 on GitHub <https://github.com/jupyter/jupyter_client/milestones/5.3.0>`__ + +New Features: + +- Multiprocessing and Threading support (:ghpull:`437`) and (:ghpull:`450`) +- Setup package long_description (:ghpull:`411`) + +Changes: + +- Control channel now in the public API (:ghpull:`447`) +- Closing Jupyter Client is now faster (:ghpull:`420`) +- Pip support improvements (:ghpull:`421`) + +Breaking changes: + +- Dropped support for Python 3.3 and 3.4 (upstream packages dropped support already) + 5.2.4 ===== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jupyter_client-5.2.4/docs/messaging.rst new/jupyter_client-5.3.1/docs/messaging.rst --- old/jupyter_client-5.2.4/docs/messaging.rst 2017-11-22 12:54:35.000000000 +0100 +++ new/jupyter_client-5.3.1/docs/messaging.rst 2019-07-09 22:04:55.000000000 +0200 @@ -351,9 +351,9 @@ # should not send these messages. 'allow_stdin' : True, - # A boolean flag, which, if True, does not abort the execution queue, if an exception is encountered. - # This allows the queued execution of multiple execute_requests, even if they generate exceptions. - 'stop_on_error' : False, + # A boolean flag, which, if True, aborts the execution queue if an exception is encountered. + # If False, queued execute_requests will execute even if this request generates an exception. + 'stop_on_error' : True, } .. versionchanged:: 5.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jupyter_client-5.2.4/jupyter_client/_version.py new/jupyter_client-5.3.1/jupyter_client/_version.py --- old/jupyter_client-5.2.4/jupyter_client/_version.py 2018-12-10 15:20:11.000000000 +0100 +++ new/jupyter_client-5.3.1/jupyter_client/_version.py 2019-07-09 23:24:11.000000000 +0200 @@ -1,4 +1,4 @@ -version_info = (5, 2, 4) +version_info = (5, 3, 1) __version__ = '.'.join(map(str, version_info)) protocol_version_info = (5, 3) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jupyter_client-5.2.4/jupyter_client/channels.py new/jupyter_client-5.3.1/jupyter_client/channels.py --- old/jupyter_client-5.2.4/jupyter_client/channels.py 2018-12-10 15:19:44.000000000 +0100 +++ new/jupyter_client-5.3.1/jupyter_client/channels.py 2019-07-09 22:04:55.000000000 +0200 @@ -7,7 +7,7 @@ import atexit import errno -from threading import Thread +from threading import Thread, Event import time import zmq @@ -73,6 +73,7 @@ # running is False until `.start()` is called self._running = False + self._exit = Event() # don't start paused self._pause = False self.poller = zmq.Poller() @@ -138,7 +139,7 @@ while self._running: if self._pause: # just sleep, and skip the rest of the loop - time.sleep(self.time_to_dead) + self._exit.wait(self.time_to_dead) continue since_last_heartbeat = 0.0 @@ -155,7 +156,7 @@ # sleep the remainder of the cycle remainder = self.time_to_dead - (time.time() - request_time) if remainder > 0: - time.sleep(remainder) + self._exit.wait(remainder) continue else: # nothing was received within the time limit, signal heart failure @@ -184,6 +185,7 @@ def stop(self): """Stop the channel's event loop and join its thread.""" self._running = False + self._exit.set() self.join() self.close() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jupyter_client-5.2.4/jupyter_client/client.py new/jupyter_client-5.3.1/jupyter_client/client.py --- old/jupyter_client-5.2.4/jupyter_client/client.py 2018-07-30 11:52:36.000000000 +0200 +++ new/jupyter_client-5.3.1/jupyter_client/client.py 2019-07-08 22:06:08.000000000 +0200 @@ -51,7 +51,7 @@ # The PyZMQ Context to use for communication with the kernel. context = Instance(zmq.Context) def _context_default(self): - return zmq.Context.instance() + return zmq.Context() # The classes to use for the various channels shell_channel_class = Type(ChannelABC) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jupyter_client-5.2.4/jupyter_client/ioloop/manager.py new/jupyter_client-5.3.1/jupyter_client/ioloop/manager.py --- old/jupyter_client-5.2.4/jupyter_client/ioloop/manager.py 2018-12-10 15:19:44.000000000 +0100 +++ new/jupyter_client-5.3.1/jupyter_client/ioloop/manager.py 2019-07-09 22:04:55.000000000 +0200 @@ -56,6 +56,7 @@ self._restarter.stop() connect_shell = as_zmqstream(KernelManager.connect_shell) + connect_control = as_zmqstream(KernelManager.connect_control) connect_iopub = as_zmqstream(KernelManager.connect_iopub) connect_stdin = as_zmqstream(KernelManager.connect_stdin) connect_hb = as_zmqstream(KernelManager.connect_hb) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jupyter_client-5.2.4/jupyter_client/manager.py new/jupyter_client-5.3.1/jupyter_client/manager.py --- old/jupyter_client-5.2.4/jupyter_client/manager.py 2018-12-10 15:19:44.000000000 +0100 +++ new/jupyter_client-5.3.1/jupyter_client/manager.py 2019-07-09 22:42:35.000000000 +0200 @@ -39,7 +39,7 @@ # The PyZMQ Context to use for communication with the kernel. context = Instance(zmq.Context) def _context_default(self): - return zmq.Context.instance() + return zmq.Context() # the class to create with our `client` method client_class = DottedObjectName('jupyter_client.blocking.BlockingKernelClient') @@ -207,7 +207,7 @@ def _connect_control_socket(self): if self._control_socket is None: - self._control_socket = self.connect_control() + self._control_socket = self._create_connected_socket('control') self._control_socket.linger = 100 def _close_control_socket(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jupyter_client-5.2.4/jupyter_client/multikernelmanager.py new/jupyter_client-5.3.1/jupyter_client/multikernelmanager.py --- old/jupyter_client-5.2.4/jupyter_client/multikernelmanager.py 2018-12-10 15:19:44.000000000 +0100 +++ new/jupyter_client-5.3.1/jupyter_client/multikernelmanager.py 2019-07-09 22:04:55.000000000 +0200 @@ -47,7 +47,7 @@ ) kernel_spec_manager = Instance(KernelSpecManager, allow_none=True) - + kernel_manager_class = DottedObjectName( "jupyter_client.ioloop.IOLoopKernelManager", config=True, help="""The kernel manager class. This is configurable to allow @@ -63,7 +63,7 @@ context = Instance('zmq.Context') def _context_default(self): - return zmq.Context.instance() + return zmq.Context() connection_dir = Unicode('') @@ -274,6 +274,22 @@ Parameters ========== + kernel_id : uuid + The id of the kernel + identity : bytes (optional) + The zmq identity of the socket + + Returns + ======= + stream : zmq Socket or ZMQStream + """ + + @kernel_method + def connect_control(self, kernel_id, identity=None): + """Return a zmq Socket connected to the control channel. + + Parameters + ========== kernel_id : uuid The id of the kernel identity : bytes (optional) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jupyter_client-5.2.4/jupyter_client/session.py new/jupyter_client-5.3.1/jupyter_client/session.py --- old/jupyter_client-5.2.4/jupyter_client/session.py 2018-12-10 15:19:44.000000000 +0100 +++ new/jupyter_client-5.3.1/jupyter_client/session.py 2019-07-09 22:04:55.000000000 +0200 @@ -186,7 +186,7 @@ # not configurable: context = Instance('zmq.Context') def _context_default(self): - return zmq.Context.instance() + return zmq.Context() session = Instance('jupyter_client.session.Session', allow_none=True) @@ -300,10 +300,10 @@ """ debug = Bool(False, config=True, help="""Debug output in the Session""") - + check_pid = Bool(True, config=True, help="""Whether to check PID to protect against calls after fork. - + This check can be disabled if fork-safety is handled elsewhere. """) @@ -387,9 +387,9 @@ digest_mod = Any() def _digest_mod_default(self): return hashlib.sha256 - + auth = Instance(hmac.HMAC, allow_none=True) - + def _new_auth(self): if self.key: self.auth = hmac.HMAC(self.key, digestmod=self.digest_mod) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jupyter_client-5.2.4/jupyter_client/tests/test_kernelmanager.py new/jupyter_client-5.3.1/jupyter_client/tests/test_kernelmanager.py --- old/jupyter_client-5.2.4/jupyter_client/tests/test_kernelmanager.py 2017-08-08 17:56:46.000000000 +0200 +++ new/jupyter_client-5.3.1/jupyter_client/tests/test_kernelmanager.py 2019-07-08 22:06:08.000000000 +0200 @@ -11,6 +11,9 @@ from subprocess import PIPE import sys import time +import threading +import multiprocessing as mp +import pytest from unittest import TestCase from traitlets.config.loader import Config @@ -28,7 +31,7 @@ def tearDown(self): self.env_patch.stop() - + def _install_test_kernel(self): kernel_dir = pjoin(paths.jupyter_data_dir(), 'kernels', 'signaltest') os.makedirs(kernel_dir) @@ -127,3 +130,118 @@ self.assertTrue(km.is_alive()) self.assertTrue(kc.is_alive()) + +@pytest.mark.parallel +class TestParallel: + + @pytest.fixture(autouse=True) + def env(self): + env_patch = test_env() + env_patch.start() + yield + env_patch.stop() + + @pytest.fixture(params=['tcp', 'ipc']) + def transport(self, request): + return request.param + + @pytest.fixture + def config(self, transport): + c = Config() + c.transport = transport + if transport == 'ipc': + c.ip = 'test' + return c + + def _install_test_kernel(self): + kernel_dir = pjoin(paths.jupyter_data_dir(), 'kernels', 'signaltest') + os.makedirs(kernel_dir) + with open(pjoin(kernel_dir, 'kernel.json'), 'w') as f: + f.write(json.dumps({ + 'argv': [sys.executable, + '-m', 'jupyter_client.tests.signalkernel', + '-f', '{connection_file}'], + 'display_name': "Signal Test Kernel", + })) + + def test_start_sequence_kernels(self, config): + """Ensure that a sequence of kernel startups doesn't break anything.""" + + self._install_test_kernel() + self._run_signaltest_lifecycle(config) + self._run_signaltest_lifecycle(config) + self._run_signaltest_lifecycle(config) + + def test_start_parallel_thread_kernels(self, config): + self._install_test_kernel() + self._run_signaltest_lifecycle(config) + + thread = threading.Thread(target=self._run_signaltest_lifecycle, args=(config,)) + thread2 = threading.Thread(target=self._run_signaltest_lifecycle, args=(config,)) + try: + thread.start() + thread2.start() + finally: + thread.join() + thread2.join() + + def test_start_parallel_process_kernels(self, config): + self._install_test_kernel() + + self._run_signaltest_lifecycle(config) + thread = threading.Thread(target=self._run_signaltest_lifecycle, args=(config,)) + proc = mp.Process(target=self._run_signaltest_lifecycle, args=(config,)) + try: + thread.start() + proc.start() + finally: + thread.join() + proc.join() + + assert proc.exitcode == 0 + + def test_start_sequence_process_kernels(self, config): + self._install_test_kernel() + self._run_signaltest_lifecycle(config) + proc = mp.Process(target=self._run_signaltest_lifecycle, args=(config,)) + try: + proc.start() + finally: + proc.join() + + assert proc.exitcode == 0 + + def _prepare_kernel(self, km, startup_timeout=TIMEOUT, **kwargs): + km.start_kernel(**kwargs) + kc = km.client() + kc.start_channels() + try: + kc.wait_for_ready(timeout=startup_timeout) + except RuntimeError: + kc.stop_channels() + km.shutdown_kernel() + raise + + return kc + + def _run_signaltest_lifecycle(self, config=None): + km = KernelManager(config=config, kernel_name='signaltest') + kc = self._prepare_kernel(km, stdout=PIPE, stderr=PIPE) + + def execute(cmd): + kc.execute(cmd) + reply = kc.get_shell_msg(TIMEOUT) + content = reply['content'] + assert content['status'] == 'ok' + return content + + execute("start") + assert km.is_alive() + execute('check') + assert km.is_alive() + + km.restart_kernel(now=True) + assert km.is_alive() + execute('check') + + km.shutdown_kernel() \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jupyter_client-5.2.4/jupyter_client/tests/test_multikernelmanager.py new/jupyter_client-5.3.1/jupyter_client/tests/test_multikernelmanager.py --- old/jupyter_client-5.2.4/jupyter_client/tests/test_multikernelmanager.py 2017-08-08 17:56:46.000000000 +0200 +++ new/jupyter_client-5.3.1/jupyter_client/tests/test_multikernelmanager.py 2019-07-08 22:07:24.000000000 +0200 @@ -1,14 +1,21 @@ """Tests for the notebook kernel and session manager.""" -from subprocess import PIPE +import os import time -from unittest import TestCase +import threading +import multiprocessing as mp +from subprocess import PIPE +from unittest import TestCase from traitlets.config.loader import Config -from ..localinterfaces import localhost from jupyter_client import KernelManager from jupyter_client.multikernelmanager import MultiKernelManager + from .utils import skip_win32 +from ..localinterfaces import localhost + +TIMEOUT = 30 + class TestKernelManager(TestCase): @@ -83,3 +90,43 @@ def test_ipc_cinfo(self): km = self._get_ipc_km() self._run_cinfo(km, 'ipc', 'test') + + def test_start_sequence_tcp_kernels(self): + """Ensure that a sequence of kernel startups doesn't break anything.""" + self._run_lifecycle(self._get_tcp_km()) + self._run_lifecycle(self._get_tcp_km()) + self._run_lifecycle(self._get_tcp_km()) + + + def test_start_sequence_tcp_kernels(self): + """Ensure that a sequence of kernel startups doesn't break anything.""" + self._run_lifecycle(self._get_ipc_km()) + self._run_lifecycle(self._get_ipc_km()) + self._run_lifecycle(self._get_ipc_km()) + + def test_start_parallel_thread_kernels(self): + self.test_tcp_lifecycle() + + thread = threading.Thread(target=self.test_tcp_lifecycle) + thread2 = threading.Thread(target=self.test_tcp_lifecycle) + try: + thread.start() + thread2.start() + finally: + thread.join() + thread2.join() + + def test_start_parallel_process_kernels(self): + self.test_tcp_lifecycle() + + thread = threading.Thread(target=self.test_tcp_lifecycle) + proc = mp.Process(target=self.test_tcp_lifecycle) + + try: + thread.start() + proc.start() + finally: + thread.join() + proc.join() + + assert proc.exitcode == 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jupyter_client-5.2.4/jupyter_client/tests/test_session.py new/jupyter_client-5.3.1/jupyter_client/tests/test_session.py --- old/jupyter_client-5.2.4/jupyter_client/tests/test_session.py 2018-12-10 15:19:44.000000000 +0100 +++ new/jupyter_client-5.3.1/jupyter_client/tests/test_session.py 2019-07-09 22:04:55.000000000 +0200 @@ -83,7 +83,7 @@ self.assertIsInstance(self.session.auth, hmac.HMAC) def test_send(self): - ctx = zmq.Context.instance() + ctx = zmq.Context() A = ctx.socket(zmq.PAIR) B = ctx.socket(zmq.PAIR) A.bind("inproc://test") @@ -316,7 +316,7 @@ self._datetime_test(session) def test_send_raw(self): - ctx = zmq.Context.instance() + ctx = zmq.Context() A = ctx.socket(zmq.PAIR) B = ctx.socket(zmq.PAIR) A.bind("inproc://test") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jupyter_client-5.2.4/jupyter_client.egg-info/PKG-INFO new/jupyter_client-5.3.1/jupyter_client.egg-info/PKG-INFO --- old/jupyter_client-5.2.4/jupyter_client.egg-info/PKG-INFO 2018-12-10 15:25:48.000000000 +0100 +++ new/jupyter_client-5.3.1/jupyter_client.egg-info/PKG-INFO 2019-07-09 23:25:14.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: jupyter-client -Version: 5.2.4 +Version: 5.3.1 Summary: Jupyter protocol implementation and client libraries Home-page: https://jupyter.org Author: Jupyter Development Team @@ -9,7 +9,53 @@ Project-URL: Documentation, https://jupyter-client.readthedocs.io Project-URL: Source, https://github.com/jupyter/jupyter_client/ Project-URL: Tracker, https://github.com/jupyter/jupyter_client/issues -Description: UNKNOWN +Description: # Jupyter Client + + [![Code Health](https://landscape.io/github/jupyter/jupyter_client/master/landscape.svg?style=flat)](https://landscape.io/github/jupyter/jupyter_client/master) + + + `jupyter_client` contains the reference implementation of the [Jupyter protocol][]. + It also provides client and kernel management APIs for working with kernels. + + It also provides the `jupyter kernelspec` entrypoint + for installing kernelspecs for use with Jupyter frontends. + + [Jupyter protocol]: https://jupyter-client.readthedocs.io/en/latest/messaging.html + + + # Development Setup + + The [Jupyter Contributor Guides](http://jupyter.readthedocs.io/en/latest/contributor/content-contributor.html) provide extensive information on contributing code or documentation to Jupyter projects. The limited instructions below for setting up a development environment are for your convenience. + + ## Coding + + You'll need Python and `pip` on the search path. Clone the Jupyter Client git repository to your computer, for example in `/my/project/jupyter_client`. + Now create an [editable install](https://pip.pypa.io/en/stable/reference/pip_install/#editable-installs) + and download the dependencies of code and test suite by executing: + + cd /my/projects/jupyter_client/ + pip install -e .[test] + py.test + + The last command runs the test suite to verify the setup. During development, you can pass filenames to `py.test`, and it will execute only those tests. + + ## Documentation + + The documentation of Jupyter Client is generated from the files in `docs/` using Sphinx. Instructions for setting up Sphinx with a selection of optional modules are in the [Documentation Guide](http://jupyter.readthedocs.io/en/latest/contrib_docs/index.html). You'll also need the `make` command. + For a minimal Sphinx installation to process the Jupyter Client docs, execute: + + pip install ipykernel sphinx sphinx_rtd_theme + + The following commands build the documentation in HTML format and check for broken links: + + cd /my/projects/jupyter_client/docs/ + make html linkcheck + + Point your browser to the following URL to access the generated documentation: + + _file:///my/projects/jupyter\_client/docs/\_build/html/index.html_ + + Keywords: Interactive,Interpreter,Shell,Web Platform: Linux Platform: Mac OS X @@ -24,5 +70,6 @@ Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 3 -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.* +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* +Description-Content-Type: text/markdown Provides-Extra: test diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jupyter_client-5.2.4/jupyter_client.egg-info/requires.txt new/jupyter_client-5.3.1/jupyter_client.egg-info/requires.txt --- old/jupyter_client-5.2.4/jupyter_client.egg-info/requires.txt 2018-12-10 15:25:48.000000000 +0100 +++ new/jupyter_client-5.3.1/jupyter_client.egg-info/requires.txt 2019-07-09 23:25:14.000000000 +0200 @@ -8,9 +8,4 @@ ipykernel ipython mock - -[test:(python_version >= "3.4" or python_version == "2.7")] pytest - -[test:python_version == "3.3"] -pytest<3.3.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jupyter_client-5.2.4/setup.py new/jupyter_client-5.3.1/setup.py --- old/jupyter_client-5.2.4/setup.py 2018-12-10 15:19:44.000000000 +0100 +++ new/jupyter_client-5.3.1/setup.py 2019-07-09 22:04:55.000000000 +0200 @@ -16,8 +16,8 @@ import sys v = sys.version_info -if v[:2] < (2,7) or (v[0] >= 3 and v[:2] < (3,3)): - error = "ERROR: %s requires Python version 2.7 or 3.3 or above." % name +if v[:2] < (2, 7) or (v[0] >= 3 and v[:2] < (3, 5)): + error = "ERROR: %s requires Python version 2.7 or 3.5 or above." % name print(error, file=sys.stderr) sys.exit(1) @@ -61,6 +61,8 @@ version = version_ns['__version__'], packages = packages, description = 'Jupyter protocol implementation and client libraries', + long_description=open('README.md').read(), + long_description_content_type='text/markdown', author = 'Jupyter Development Team', author_email = 'jupyter@googlegroups.com', url = 'https://jupyter.org', @@ -91,11 +93,9 @@ 'python-dateutil>=2.1', 'tornado>=4.1', ], - python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*', + python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*', extras_require = { - 'test': ['ipykernel', 'ipython', 'mock'], - 'test:python_version == "3.3"': ['pytest<3.3.0'], - 'test:(python_version >= "3.4" or python_version == "2.7")': ['pytest'], + 'test': ['ipykernel', 'ipython', 'mock', 'pytest'], }, cmdclass = { 'bdist_egg': bdist_egg if 'bdist_egg' in sys.argv else bdist_egg_disabled,