Skip to content

Commit

Permalink
use our own maybe_future
Browse files Browse the repository at this point in the history
instead of the monkeypatch we did to keep the backport patch small

requiring tornado 5 simplifies things a ton because tornado.concurrent.Future is asyncio.Future
  • Loading branch information
minrk authored and kevin-bates committed Sep 27, 2019
1 parent a46c37f commit a0c96cf
Show file tree
Hide file tree
Showing 11 changed files with 85 additions and 97 deletions.
10 changes: 5 additions & 5 deletions jupyter_server/base/zmqhandlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,8 @@
# Copyright (c) Jupyter Development Team.
# Distributed under the terms of the Modified BSD License.

import os
import json
import struct
import warnings
import sys
import tornado

Expand All @@ -20,6 +18,8 @@
from ipython_genutils.py3compat import cast_unicode

from .handlers import JupyterHandler
from jupyter_server.utils import maybe_future


def serialize_binary_message(msg):
"""serialize a message as a binary blob
Expand Down Expand Up @@ -276,10 +276,10 @@ def get(self, *args, **kwargs):
# pre_get can be a coroutine in subclasses
# assign and yield in two step to avoid tornado 3 issues
res = self.pre_get()
yield gen.maybe_future(res)
yield maybe_future(res)
res = super(AuthenticatedZMQStreamHandler, self).get(*args, **kwargs)
yield gen.maybe_future(res)
yield maybe_future(res)

def initialize(self):
self.log.debug("Initializing websocket connection %s", self.request.path)
self.session = Session(config=self.config)
Expand Down
5 changes: 4 additions & 1 deletion jupyter_server/files/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,15 @@

import mimetypes
import json
from base64 import decodebytes

from base64 import decodebytes

from tornado import gen, web

from jupyter_server.base.handlers import JupyterHandler
from jupyter_server.utils import maybe_future



class FilesHandler(JupyterHandler):
Expand Down Expand Up @@ -48,7 +51,7 @@ def get(self, path, include_body=True):
else:
name = path

model = yield gen.maybe_future(cm.get(path, type='file', content=include_body))
model = yield maybe_future(cm.get(path, type='file', content=include_body))

if self.get_argument("download", False):
self.set_attachment_header(name)
Expand Down
8 changes: 4 additions & 4 deletions jupyter_server/services/api/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,14 @@
# Copyright (c) Jupyter Development Team.
# Distributed under the terms of the Modified BSD License.

from itertools import chain
import json
import os

from tornado import gen, web

from ...base.handlers import JupyterHandler, APIHandler
from jupyter_server._tz import utcfromtimestamp, isoformat

import os
from jupyter_server.utils import maybe_future


class APISpecHandler(web.StaticFileHandler, JupyterHandler):
Expand Down Expand Up @@ -39,7 +38,7 @@ def get(self):
started = self.settings.get('started', utcfromtimestamp(0))
started = isoformat(started)

kernels = yield gen.maybe_future(self.kernel_manager.list_kernels())
kernels = yield maybe_future(self.kernel_manager.list_kernels())
total_connections = sum(k['connections'] for k in kernels)
last_activity = isoformat(self.application.last_activity())
model = {
Expand All @@ -50,6 +49,7 @@ def get(self):
}
self.finish(json.dumps(model, sort_keys=True))


default_handlers = [
(r"/api/spec.yaml", APISpecHandler),
(r"/api/status", APIStatusHandler),
Expand Down
42 changes: 21 additions & 21 deletions jupyter_server/services/contents/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

from tornado import gen, web

from jupyter_server.utils import url_path_join, url_escape
from jupyter_server.utils import url_path_join, url_escape, maybe_future
from jupyter_client.jsonutil import date_default

from jupyter_server.base.handlers import (
Expand Down Expand Up @@ -107,8 +107,8 @@ def get(self, path=''):
if content not in {'0', '1'}:
raise web.HTTPError(400, u'Content %r is invalid' % content)
content = int(content)

model = yield gen.maybe_future(self.contents_manager.get(
model = yield maybe_future(self.contents_manager.get(
path=path, type=type, format=format, content=content,
))
validate_model(model, expect_content=content)
Expand All @@ -122,7 +122,7 @@ def patch(self, path=''):
model = self.get_json_body()
if model is None:
raise web.HTTPError(400, u'JSON body missing')
model = yield gen.maybe_future(cm.update(model, path))
model = yield maybe_future(cm.update(model, path))
validate_model(model, expect_content=False)
self._finish_model(model)

Expand All @@ -133,7 +133,7 @@ def _copy(self, copy_from, copy_to=None):
copy_from=copy_from,
copy_to=copy_to or '',
))
model = yield gen.maybe_future(self.contents_manager.copy(copy_from, copy_to))
model = yield maybe_future(self.contents_manager.copy(copy_from, copy_to))
self.set_status(201)
validate_model(model, expect_content=False)
self._finish_model(model)
Expand All @@ -142,7 +142,7 @@ def _copy(self, copy_from, copy_to=None):
def _upload(self, model, path):
"""Handle upload of a new file to path"""
self.log.info(u"Uploading file to %s", path)
model = yield gen.maybe_future(self.contents_manager.new(model, path))
model = yield maybe_future(self.contents_manager.new(model, path))
self.set_status(201)
validate_model(model, expect_content=False)
self._finish_model(model)
Expand All @@ -151,7 +151,7 @@ def _upload(self, model, path):
def _new_untitled(self, path, type='', ext=''):
"""Create a new, empty untitled entity"""
self.log.info(u"Creating new %s in %s", type or 'file', path)
model = yield gen.maybe_future(self.contents_manager.new_untitled(path=path, type=type, ext=ext))
model = yield maybe_future(self.contents_manager.new_untitled(path=path, type=type, ext=ext))
self.set_status(201)
validate_model(model, expect_content=False)
self._finish_model(model)
Expand All @@ -161,8 +161,8 @@ def _save(self, model, path):
"""Save an existing file."""
chunk = model.get("chunk", None)
if not chunk or chunk == -1: # Avoid tedious log information
self.log.info(u"Saving file at %s", path)
model = yield gen.maybe_future(self.contents_manager.save(model, path))
self.log.info(u"Saving file at %s", path)
model = yield maybe_future(self.contents_manager.save(model, path))
validate_model(model, expect_content=False)
self._finish_model(model)

Expand All @@ -182,11 +182,11 @@ def post(self, path=''):

cm = self.contents_manager

file_exists = yield gen.maybe_future(cm.file_exists(path))
file_exists = yield maybe_future(cm.file_exists(path))
if file_exists:
raise web.HTTPError(400, "Cannot POST to files, use PUT instead.")

dir_exists = yield gen.maybe_future(cm.dir_exists(path))
dir_exists = yield maybe_future(cm.dir_exists(path))
if not dir_exists:
raise web.HTTPError(404, "No such directory: %s" % path)

Expand Down Expand Up @@ -220,21 +220,21 @@ def put(self, path=''):
if model:
if model.get('copy_from'):
raise web.HTTPError(400, "Cannot copy with PUT, only POST")
exists = yield gen.maybe_future(self.contents_manager.file_exists(path))
exists = yield maybe_future(self.contents_manager.file_exists(path))
if exists:
yield gen.maybe_future(self._save(model, path))
yield maybe_future(self._save(model, path))
else:
yield gen.maybe_future(self._upload(model, path))
yield maybe_future(self._upload(model, path))
else:
yield gen.maybe_future(self._new_untitled(path))
yield maybe_future(self._new_untitled(path))

@web.authenticated
@gen.coroutine
def delete(self, path=''):
"""delete a file in the given path"""
cm = self.contents_manager
self.log.warning('delete %s', path)
yield gen.maybe_future(cm.delete(path))
yield maybe_future(cm.delete(path))
self.set_status(204)
self.finish()

Expand All @@ -246,7 +246,7 @@ class CheckpointsHandler(APIHandler):
def get(self, path=''):
"""get lists checkpoints for a file"""
cm = self.contents_manager
checkpoints = yield gen.maybe_future(cm.list_checkpoints(path))
checkpoints = yield maybe_future(cm.list_checkpoints(path))
data = json.dumps(checkpoints, default=date_default)
self.finish(data)

Expand All @@ -255,7 +255,7 @@ def get(self, path=''):
def post(self, path=''):
"""post creates a new checkpoint"""
cm = self.contents_manager
checkpoint = yield gen.maybe_future(cm.create_checkpoint(path))
checkpoint = yield maybe_future(cm.create_checkpoint(path))
data = json.dumps(checkpoint, default=date_default)
location = url_path_join(self.base_url, 'api/contents',
url_escape(path), 'checkpoints', url_escape(checkpoint['id']))
Expand All @@ -271,7 +271,7 @@ class ModifyCheckpointsHandler(APIHandler):
def post(self, path, checkpoint_id):
"""post restores a file from a checkpoint"""
cm = self.contents_manager
yield gen.maybe_future(cm.restore_checkpoint(checkpoint_id, path))
yield maybe_future(cm.restore_checkpoint(checkpoint_id, path))
self.set_status(204)
self.finish()

Expand All @@ -280,7 +280,7 @@ def post(self, path, checkpoint_id):
def delete(self, path, checkpoint_id):
"""delete clears a checkpoint for a given file"""
cm = self.contents_manager
yield gen.maybe_future(cm.delete_checkpoint(checkpoint_id, path))
yield maybe_future(cm.delete_checkpoint(checkpoint_id, path))
self.set_status(204)
self.finish()

Expand All @@ -307,7 +307,7 @@ class TrustNotebooksHandler(JupyterHandler):
@gen.coroutine
def post(self,path=''):
cm = self.contents_manager
yield gen.maybe_future(cm.trust_notebook(path))
yield maybe_future(cm.trust_notebook(path))
self.set_status(201)
self.finish()
#-----------------------------------------------------------------------------
Expand Down
18 changes: 11 additions & 7 deletions jupyter_server/services/kernels/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@
from tornado.concurrent import Future
from tornado.ioloop import IOLoop

from jupyter_client import protocol_version as client_protocol_version
from jupyter_client.jsonutil import date_default
from ipython_genutils.py3compat import cast_unicode
from jupyter_server.utils import url_path_join, url_escape
from jupyter_server.utils import url_path_join, url_escape, maybe_future

from ...base.handlers import APIHandler
from ...base.zmqhandlers import AuthenticatedZMQStreamHandler, deserialize_binary_message

from jupyter_client import protocol_version as client_protocol_version


class MainKernelHandler(APIHandler):
Expand All @@ -30,7 +30,7 @@ class MainKernelHandler(APIHandler):
@gen.coroutine
def get(self):
km = self.kernel_manager
kernels = yield gen.maybe_future(km.list_kernels())
kernels = yield maybe_future(km.list_kernels())
self.finish(json.dumps(kernels, default=date_default))

@web.authenticated
Expand All @@ -45,8 +45,8 @@ def post(self):
else:
model.setdefault('name', km.default_kernel_name)

kernel_id = yield gen.maybe_future(km.start_kernel(kernel_name=model['name']))
model = yield gen.maybe_future(km.kernel_model(kernel_id))
kernel_id = yield maybe_future(km.start_kernel(kernel_name=model['name']))
model = yield maybe_future(km.kernel_model(kernel_id))
location = url_path_join(self.base_url, 'api', 'kernels', url_escape(kernel_id))
self.set_header('Location', location)
self.set_status(201)
Expand All @@ -65,7 +65,7 @@ def get(self, kernel_id):
@gen.coroutine
def delete(self, kernel_id):
km = self.kernel_manager
yield gen.maybe_future(km.shutdown_kernel(kernel_id))
yield maybe_future(km.shutdown_kernel(kernel_id))
self.set_status(204)
self.finish()

Expand All @@ -82,12 +82,16 @@ def post(self, kernel_id, action):
if action == 'restart':

try:
yield gen.maybe_future(km.restart_kernel(kernel_id))
yield maybe_future(km.restart_kernel(kernel_id))
except Exception as e:
self.log.error("Exception restarting kernel", exc_info=True)
self.set_status(500)
else:
<<<<<<< HEAD
model = yield gen.maybe_future(km.kernel_model(kernel_id))
=======
model = yield maybe_future(km.kernel_model(kernel_id))
>>>>>>> use our own maybe_future
self.write(json.dumps(model, default=date_default))
self.finish()

Expand Down
6 changes: 3 additions & 3 deletions jupyter_server/services/kernels/kernelmanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
Float, Instance, default, validate
)

from jupyter_server.utils import to_os_path, exists
from jupyter_server.utils import maybe_future, to_os_path, exists
from jupyter_server._tz import utcnow, isoformat
from ipython_genutils.py3compat import getcwd

Expand Down Expand Up @@ -168,7 +168,7 @@ def start_kernel(self, kernel_id=None, path=None, **kwargs):
if kernel_id is None:
if path is not None:
kwargs['cwd'] = self.cwd_for_path(path)
kernel_id = yield gen.maybe_future(
kernel_id = yield maybe_future(
super(MappingKernelManager, self).start_kernel(**kwargs)
)
self._kernel_connections[kernel_id] = 0
Expand Down Expand Up @@ -309,7 +309,7 @@ def shutdown_kernel(self, kernel_id, now=False):
def restart_kernel(self, kernel_id):
"""Restart a kernel by kernel_id"""
self._check_kernel_id(kernel_id)
yield gen.maybe_future(super(MappingKernelManager, self).restart_kernel(kernel_id))
yield maybe_future(super(MappingKernelManager, self).restart_kernel(kernel_id))
kernel = self.get_kernel(kernel_id)
# return a Future that will resolve when the kernel has successfully restarted
channel = kernel.connect_shell()
Expand Down
7 changes: 4 additions & 3 deletions jupyter_server/services/kernelspecs/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
from tornado import web, gen

from ...base.handlers import APIHandler
from ...utils import url_path_join, url_unescape
from ...utils import maybe_future, url_path_join, url_unescape



def kernelspec_model(handler, name, spec_dict, resource_dir):
Expand Down Expand Up @@ -62,7 +63,7 @@ def get(self):
model = {}
model['default'] = km.default_kernel_name
model['kernelspecs'] = specs = {}
kspecs = yield gen.maybe_future(ksm.get_all_specs())
kspecs = yield maybe_future(ksm.get_all_specs())
for kernel_name, kernel_info in kspecs.items():
try:
if is_kernelspec_model(kernel_info):
Expand All @@ -85,7 +86,7 @@ def get(self, kernel_name):
ksm = self.kernel_spec_manager
kernel_name = url_unescape(kernel_name)
try:
spec = yield gen.maybe_future(ksm.get_kernel_spec(kernel_name))
spec = yield maybe_future(ksm.get_kernel_spec(kernel_name))
except KeyError:
raise web.HTTPError(404, u'Kernel spec %s not found' % kernel_name)
if is_kernelspec_model(spec):
Expand Down
Loading

0 comments on commit a0c96cf

Please sign in to comment.