diff --git a/.travis.yml b/.travis.yml index 788bfa4f..3980dd87 100644 --- a/.travis.yml +++ b/.travis.yml @@ -61,6 +61,13 @@ script: make html popd fi + - | + if [[ "$TEST" == "jupyter_server" ]]; then + pip uninstall notebook + pip install jupyter_server + export USE_JUPYTER_SERVER=True + pytest -v --maxfail=2 --cov=jupyterhub jupyterhub/tests + fi after_success: - codecov after_failure: diff --git a/jupyterhub/singleuser.py b/jupyterhub/singleuser.py index 6fa4f350..0ab557a5 100755 --- a/jupyterhub/singleuser.py +++ b/jupyterhub/singleuser.py @@ -6,6 +6,7 @@ import asyncio import json import os import random +import importlib from datetime import datetime from datetime import timezone from textwrap import dedent @@ -20,10 +21,13 @@ from tornado.httpclient import HTTPRequest from tornado.web import HTTPError from tornado.web import RequestHandler +use_serverapp = os.environ.get('USE_JUPYTER_SERVER', 'False') == 'True' + +required_package = 'jupyter_server' if use_serverapp else 'notebook' try: - import notebook + parent_module = importlib.import_module(required_package) except ImportError: - raise ImportError("JupyterHub single-user server requires notebook >= 4.0") + raise ImportError("JupyterHub single-user server requires {}".format(required_package)) from traitlets import ( Any, @@ -38,14 +42,19 @@ from traitlets import ( TraitError, ) -from notebook.notebookapp import ( - NotebookApp, - aliases as notebook_aliases, - flags as notebook_flags, +app_name = 'jupyter_server.serverapp' if use_serverapp else 'notebook.notebookapp' +app_module = importlib.import_module(app_name) + +NotebookApp = getattr(app_module, 'ServerApp' if use_serverapp else 'NotebookApp') +notebook_aliases = app_module.aliases +notebook_flags = app_module.flags + +LoginHandler = getattr(importlib.import_module(required_package + '.auth.login'), 'LoginHandler') +LogoutHandler = getattr(importlib.import_module(required_package + '.auth.logout'), 'LogoutHandler') +IPythonHandler = getattr( + importlib.import_module(required_package + '.base.handlers'), + 'JupyterHandler' if use_serverapp else 'IPythonHandler' ) -from notebook.auth.login import LoginHandler -from notebook.auth.logout import LogoutHandler -from notebook.base.handlers import IPythonHandler from ._version import __version__, _check_version from .log import log_request diff --git a/jupyterhub/spawner.py b/jupyterhub/spawner.py index af84c122..348eb8d5 100644 --- a/jupyterhub/spawner.py +++ b/jupyterhub/spawner.py @@ -931,7 +931,7 @@ class Spawner(LoggingConfigurable): args.append('--notebook-dir=%s' % _quote_safe(notebook_dir)) if self.default_url: default_url = self.format_string(self.default_url) - args.append('--NotebookApp.default_url=%s' % _quote_safe(default_url)) + args.append('--SingleUserNotebookApp.default_url=%s' % _quote_safe(default_url)) if self.debug: args.append('--debug')