extension.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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. # ----------------------------------------------------------------------------
  6. # Module globals
  7. # ----------------------------------------------------------------------------
  8. import os
  9. DEV_NOTE = """You're running JupyterLab from source.
  10. If you're working on the TypeScript sources of JupyterLab, try running
  11. jupyter lab --dev-mode --watch
  12. to have the system incrementally watch and build JupyterLab for you, as you
  13. make changes.
  14. """
  15. CORE_NOTE = """
  16. Running the core application with no additional extensions or settings
  17. """
  18. def load_jupyter_server_extension(nbapp):
  19. """Load the JupyterLab server extension.
  20. """
  21. # Delay imports to speed up jlpmapp
  22. from jupyterlab_launcher import add_handlers, LabConfig
  23. from notebook.utils import url_path_join as ujoin, url_escape
  24. from tornado.ioloop import IOLoop
  25. from .build_handler import build_path, Builder, BuildHandler
  26. from .commands import (
  27. get_app_dir, get_user_settings_dir, watch, ensure_dev, watch_dev,
  28. pjoin, DEV_DIR, HERE, get_app_info, ensure_core, get_workspaces_dir
  29. )
  30. web_app = nbapp.web_app
  31. logger = nbapp.log
  32. config = LabConfig()
  33. app_dir = getattr(nbapp, 'app_dir', get_app_dir())
  34. user_settings_dir = getattr(
  35. nbapp, 'user_settings_dir', get_user_settings_dir()
  36. )
  37. workspaces_dir = getattr(
  38. nbapp, 'workspaces_dir', get_workspaces_dir()
  39. )
  40. # Print messages.
  41. logger.info('JupyterLab beta preview extension loaded from %s' % HERE)
  42. logger.info('JupyterLab application directory is %s' % app_dir)
  43. config.app_name = 'JupyterLab Beta'
  44. config.app_namespace = 'jupyterlab'
  45. config.page_url = '/lab'
  46. config.cache_files = True
  47. # Check for core mode.
  48. core_mode = False
  49. if getattr(nbapp, 'core_mode', False) or app_dir.startswith(HERE):
  50. core_mode = True
  51. logger.info('Running JupyterLab in core mode')
  52. # Check for dev mode.
  53. dev_mode = False
  54. if getattr(nbapp, 'dev_mode', False) or app_dir.startswith(DEV_DIR):
  55. dev_mode = True
  56. logger.info('Running JupyterLab in dev mode')
  57. # Check for watch.
  58. watch_mode = getattr(nbapp, 'watch', False)
  59. if watch_mode and core_mode:
  60. logger.warn('Cannot watch in core mode, did you mean --dev-mode?')
  61. watch_mode = False
  62. if core_mode and dev_mode:
  63. logger.warn('Conflicting modes, choosing dev_mode over core_mode')
  64. core_mode = False
  65. page_config = web_app.settings.setdefault('page_config_data', dict())
  66. page_config['buildAvailable'] = not core_mode and not dev_mode
  67. page_config['buildCheck'] = not core_mode and not dev_mode
  68. page_config['token'] = nbapp.token
  69. page_config['devMode'] = dev_mode
  70. if nbapp.file_to_run:
  71. relpath = os.path.relpath(nbapp.file_to_run, nbapp.notebook_dir)
  72. uri = url_escape(ujoin('/lab/tree', *relpath.split(os.sep)))
  73. nbapp.default_url = uri
  74. nbapp.file_to_run = ''
  75. if core_mode:
  76. app_dir = HERE
  77. logger.info(CORE_NOTE.strip())
  78. ensure_core(logger)
  79. elif dev_mode:
  80. app_dir = DEV_DIR
  81. ensure_dev(logger)
  82. if not watch_mode:
  83. logger.info(DEV_NOTE)
  84. config.app_settings_dir = pjoin(app_dir, 'settings')
  85. config.schemas_dir = pjoin(app_dir, 'schemas')
  86. config.themes_dir = pjoin(app_dir, 'themes')
  87. config.workspaces_dir = workspaces_dir
  88. info = get_app_info(app_dir)
  89. config.app_version = info['version']
  90. public_url = info['publicUrl']
  91. if public_url:
  92. config.public_url = public_url
  93. else:
  94. config.static_dir = pjoin(app_dir, 'static')
  95. config.user_settings_dir = user_settings_dir
  96. # The templates end up in the built static directory.
  97. config.templates_dir = pjoin(app_dir, 'static')
  98. if watch_mode:
  99. logger.info('Starting JupyterLab watch mode...')
  100. # Set the ioloop in case the watch fails.
  101. nbapp.ioloop = IOLoop.current()
  102. if dev_mode:
  103. watch_dev(logger)
  104. else:
  105. watch(app_dir, logger)
  106. page_config['buildAvailable'] = False
  107. config.cache_files = False
  108. base_url = web_app.settings['base_url']
  109. build_url = ujoin(base_url, build_path)
  110. builder = Builder(logger, core_mode, app_dir)
  111. build_handler = (build_url, BuildHandler, {'builder': builder})
  112. # Must add before the launcher handlers to avoid shadowing.
  113. web_app.add_handlers('.*$', [build_handler])
  114. add_handlers(web_app, config)