serverextension.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. """ add language server support to the running jupyter notebook application
  2. """
  3. import json
  4. from pathlib import Path
  5. import traitlets
  6. from tornado import ioloop
  7. from .handlers import add_handlers
  8. from .manager import LanguageServerManager
  9. from .paths import normalized_uri
  10. async def initialize(nbapp, virtual_documents_uri): # pragma: no cover
  11. """Perform lazy initialization."""
  12. import concurrent.futures
  13. from .virtual_documents_shadow import setup_shadow_filesystem
  14. manager: LanguageServerManager = nbapp.language_server_manager
  15. with concurrent.futures.ThreadPoolExecutor() as pool:
  16. await nbapp.io_loop.run_in_executor(pool, manager.initialize)
  17. servers_requiring_disk_access = [
  18. server_id
  19. for server_id, server in manager.language_servers.items()
  20. if server.get("requires_documents_on_disk", True)
  21. ]
  22. if any(servers_requiring_disk_access):
  23. nbapp.log.debug(
  24. "[lsp] Servers that requested virtual documents on disk: %s",
  25. servers_requiring_disk_access,
  26. )
  27. setup_shadow_filesystem(virtual_documents_uri=virtual_documents_uri)
  28. else:
  29. nbapp.log.debug(
  30. "[lsp] None of the installed servers require virtual documents"
  31. " disabling shadow filesystem."
  32. )
  33. nbapp.log.debug(
  34. "[lsp] The following Language Servers will be available: {}".format(
  35. json.dumps(manager.language_servers, indent=2, sort_keys=True)
  36. )
  37. )
  38. def load_jupyter_server_extension(nbapp):
  39. """create a LanguageServerManager and add handlers"""
  40. nbapp.add_traits(language_server_manager=traitlets.Instance(LanguageServerManager))
  41. manager = nbapp.language_server_manager = LanguageServerManager(parent=nbapp)
  42. contents = nbapp.contents_manager
  43. page_config = nbapp.web_app.settings.setdefault("page_config_data", {})
  44. root_uri = ""
  45. virtual_documents_uri = ""
  46. # try to set the rootUri from the contents manager path
  47. if hasattr(contents, "root_dir"):
  48. root_uri = normalized_uri(contents.root_dir)
  49. nbapp.log.debug("[lsp] rootUri will be %s", root_uri)
  50. root_path = Path(contents.root_dir)
  51. virtual_documents_path = root_path / manager.virtual_documents_dir
  52. if virtual_documents_path == root_path:
  53. nbapp.log.warn("virtual documents path must differ from the root path")
  54. manager.virtual_documents_dir = ".virtual_documents"
  55. virtual_documents_path = root_path / manager.virtual_documents_dir
  56. virtual_documents_uri = normalized_uri(virtual_documents_path)
  57. nbapp.log.debug("[lsp] virtualDocumentsUri will be %s", virtual_documents_uri)
  58. else: # pragma: no cover
  59. nbapp.log.warn(
  60. "[lsp] %s did not appear to have a root_dir, could not set rootUri",
  61. contents,
  62. )
  63. virtual_documents_uri = normalized_uri(".virtual_documents")
  64. page_config.update(rootUri=root_uri, virtualDocumentsUri=virtual_documents_uri)
  65. add_handlers(nbapp)
  66. if hasattr(nbapp, "io_loop"):
  67. io_loop = nbapp.io_loop
  68. else:
  69. # handle jupyter_server 1.x
  70. io_loop = ioloop.IOLoop.current()
  71. io_loop.call_later(0, initialize, nbapp, virtual_documents_uri)