extension.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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
  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_version
  29. )
  30. from ._version import __version__
  31. web_app = nbapp.web_app
  32. logger = nbapp.log
  33. config = LabConfig()
  34. app_dir = getattr(nbapp, 'app_dir', get_app_dir())
  35. # Print messages.
  36. logger.info('JupyterLab alpha preview extension loaded from %s' % HERE)
  37. logger.info('JupyterLab application directory is %s' % app_dir)
  38. config.name = 'JupyterLab'
  39. config.page_title = 'JupyterLab Alpha Preview'
  40. config.page_url = '/lab'
  41. # Check for core mode.
  42. core_mode = False
  43. if getattr(nbapp, 'core_mode', False) or app_dir.startswith(HERE):
  44. core_mode = True
  45. logger.info('Running JupyterLab in core mode')
  46. # Check for dev mode.
  47. dev_mode = False
  48. if getattr(nbapp, 'dev_mode', False) or app_dir.startswith(DEV_DIR):
  49. dev_mode = True
  50. logger.info('Running JupyterLab in dev mode')
  51. # Check for watch.
  52. watch_mode = getattr(nbapp, 'watch', False)
  53. if watch_mode and core_mode:
  54. logger.warn('Cannot watch in core mode, did you mean --dev-mode?')
  55. watch_mode = False
  56. if core_mode and dev_mode:
  57. logger.warn('Conflicting modes, choosing dev_mode over core_mode')
  58. core_mode = False
  59. page_config = web_app.settings.setdefault('page_config_data', dict())
  60. page_config['buildAvailable'] = not core_mode and not dev_mode
  61. page_config['buildCheck'] = not core_mode and not dev_mode
  62. page_config['token'] = nbapp.token
  63. if core_mode:
  64. config.assets_dir = pjoin(HERE, 'static')
  65. config.schemas_dir = pjoin(HERE, 'schemas')
  66. config.settings_dir = ''
  67. config.themes_dir = pjoin(HERE, 'themes')
  68. config.version = get_app_version()
  69. logger.info(CORE_NOTE.strip())
  70. if not os.path.exists(config.assets_dir):
  71. msg = 'Static assets not built, please see CONTRIBUTING.md'
  72. logger.error(msg)
  73. elif dev_mode:
  74. config.assets_dir = pjoin(DEV_DIR, 'build')
  75. config.schemas_dir = pjoin(DEV_DIR, 'schemas')
  76. config.settings_dir = ''
  77. config.themes_dir = pjoin(DEV_DIR, 'themes')
  78. config.version = __version__
  79. ensure_dev(logger)
  80. if not watch_mode:
  81. logger.info(DEV_NOTE)
  82. else:
  83. config.assets_dir = pjoin(app_dir, 'static')
  84. config.schemas_dir = pjoin(app_dir, 'schemas')
  85. config.settings_dir = pjoin(app_dir, 'settings')
  86. config.themes_dir = pjoin(app_dir, 'themes')
  87. config.version = get_app_version()
  88. config.dev_mode = dev_mode
  89. config.user_settings_dir = get_user_settings_dir()
  90. if watch_mode:
  91. logger.info('Starting JupyterLab watch mode...')
  92. # Set the ioloop in case the watch fails.
  93. nbapp.ioloop = IOLoop.current()
  94. if config.dev_mode:
  95. watch_dev(logger)
  96. else:
  97. watch(app_dir, logger)
  98. page_config['buildAvailable'] = False
  99. add_handlers(web_app, config)
  100. base_url = web_app.settings['base_url']
  101. build_url = ujoin(base_url, build_path)
  102. builder = Builder(logger, core_mode, app_dir)
  103. build_handler = (build_url, BuildHandler, {'builder': builder})
  104. web_app.add_handlers(".*$", [build_handler])