extension.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. # coding: utf-8
  2. """A tornado based Jupyter lab server."""
  3. # Copyright (c) Jupyter Development Team.
  4. # Distributed under the terms of the Modified BSD License.
  5. import os
  6. from jupyterlab_launcher import add_handlers, LabConfig
  7. from notebook.utils import url_path_join as ujoin
  8. from .commands import (
  9. get_app_dir, list_extensions, should_build, get_user_settings_dir
  10. )
  11. from .settings_handler import settings_path, SettingsHandler
  12. from .build_handler import build_path, Builder, BuildHandler
  13. from ._version import __version__
  14. #-----------------------------------------------------------------------------
  15. # Module globals
  16. #-----------------------------------------------------------------------------
  17. DEV_NOTE_NPM = """You're running JupyterLab from source.
  18. If you're working on the TypeScript sources of JupyterLab, try running
  19. npm run watch
  20. from the JupyterLab repo directory in another terminal window to have the
  21. system incrementally watch and build JupyterLab's TypeScript for you, as you
  22. make changes.
  23. """
  24. CORE_NOTE = """
  25. Running the core application with no additional extensions or settings
  26. """
  27. def load_jupyter_server_extension(nbapp):
  28. """Load the JupyterLab server extension.
  29. """
  30. # Print messages.
  31. here = os.path.dirname(__file__)
  32. nbapp.log.info('JupyterLab alpha preview extension loaded from %s' % here)
  33. app_dir = get_app_dir()
  34. if hasattr(nbapp, 'app_dir'):
  35. app_dir = get_app_dir(nbapp.app_dir)
  36. web_app = nbapp.web_app
  37. config = LabConfig()
  38. config.assets_dir = os.path.join(app_dir, 'static')
  39. config.settings_dir = os.path.join(app_dir, 'settings')
  40. config.page_title = 'JupyterLab Alpha Preview'
  41. config.page_url = '/lab'
  42. config.dev_mode = False
  43. # Check for core mode.
  44. core_mode = ''
  45. if hasattr(nbapp, 'core_mode'):
  46. core_mode = nbapp.core_mode
  47. # Check for an app dir that is local.
  48. if app_dir == here or app_dir == os.path.join(here, 'build'):
  49. core_mode = True
  50. config.settings_dir = ''
  51. # Run core mode if explicit or there is no static dir and no
  52. # installed extensions.
  53. installed = list_extensions(app_dir)
  54. fallback = not installed and not os.path.exists(config.assets_dir)
  55. web_app.settings.setdefault('page_config_data', dict())
  56. web_app.settings['page_config_data']['token'] = nbapp.token
  57. if core_mode or fallback:
  58. config.assets_dir = os.path.join(here, 'build')
  59. if not os.path.exists(config.assets_dir):
  60. msg = 'Static assets not built, please see CONTRIBUTING.md'
  61. nbapp.log.error(msg)
  62. else:
  63. sentinel = os.path.join(here, 'build', 'release_data.json')
  64. config.dev_mode = not os.path.exists(sentinel)
  65. if config.dev_mode:
  66. nbapp.log.info(DEV_NOTE_NPM)
  67. elif core_mode or fallback:
  68. nbapp.log.info(CORE_NOTE.strip())
  69. add_handlers(web_app, config)
  70. user_settings_dir = get_user_settings_dir()
  71. if core_mode or fallback:
  72. schemas_dir = os.path.join(here, 'schemas')
  73. else:
  74. schemas_dir = os.path.join(app_dir, 'schemas')
  75. base_url = web_app.settings['base_url']
  76. settings_url = ujoin(base_url, settings_path)
  77. settings_handler = (settings_url, SettingsHandler, {
  78. 'schemas_dir': schemas_dir,
  79. 'settings_dir': user_settings_dir
  80. })
  81. build_url = ujoin(base_url, build_path)
  82. builder = Builder(nbapp.log, core_mode, app_dir)
  83. build_handler = (build_url, BuildHandler, {'builder': builder})
  84. web_app.add_handlers(".*$", [settings_handler, build_handler])