readonly.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. """Extension manager without installation capabilities."""
  2. # Copyright (c) Jupyter Development Team.
  3. # Distributed under the terms of the Modified BSD License.
  4. import sys
  5. from typing import Optional
  6. from jupyterlab_server.translation_utils import translator
  7. from .manager import ActionResult, ExtensionManager, ExtensionManagerMetadata, ExtensionPackage
  8. class ReadOnlyExtensionManager(ExtensionManager):
  9. """Extension manager without installation capabilities."""
  10. @property
  11. def metadata(self) -> ExtensionManagerMetadata:
  12. """Extension manager metadata."""
  13. return ExtensionManagerMetadata("read-only", install_path=sys.prefix)
  14. async def get_latest_version(self, pkg: str) -> Optional[str]:
  15. """Return the latest available version for a given extension.
  16. Args:
  17. pkg: The extension to search for
  18. Returns:
  19. The latest available version
  20. """
  21. return None
  22. async def list_packages(
  23. self, query: str, page: int, per_page: int
  24. ) -> tuple[dict[str, ExtensionPackage], Optional[int]]:
  25. """List the available extensions.
  26. Args:
  27. query: The search extension query
  28. page: The result page
  29. per_page: The number of results per page
  30. Returns:
  31. The available extensions in a mapping {name: metadata}
  32. The results last page; None if the manager does not support pagination
  33. """
  34. return {}, None
  35. async def install(self, extension: str, version: Optional[str] = None) -> ActionResult:
  36. """Install the required extension.
  37. Note:
  38. If the user must be notified with a message (like asking to restart the
  39. server), the result should be
  40. {"status": "warning", "message": "<explanation for the user>"}
  41. Args:
  42. extension: The extension name
  43. version: The version to install; default None (i.e. the latest possible)
  44. Returns:
  45. The action result
  46. """
  47. trans = translator.load("jupyterlab")
  48. return ActionResult(
  49. status="error", message=trans.gettext("Extension installation not supported.")
  50. )
  51. async def uninstall(self, extension: str) -> ActionResult:
  52. """Uninstall the required extension.
  53. Note:
  54. If the user must be notified with a message (like asking to restart the
  55. server), the result should be
  56. {"status": "warning", "message": "<explanation for the user>"}
  57. Args:
  58. extension: The extension name
  59. Returns:
  60. The action result
  61. """
  62. trans = translator.load("jupyterlab")
  63. return ActionResult(
  64. status="error", message=trans.gettext("Extension removal not supported.")
  65. )