base_binary.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. __package__ = "archivebox.plugantic"
  2. from typing import Dict, List
  3. from typing_extensions import Self
  4. from benedict import benedict
  5. from pydantic import Field, InstanceOf, validate_call
  6. from pydantic_pkgr import (
  7. Binary,
  8. BinProvider,
  9. BinProviderName,
  10. ProviderLookupDict,
  11. AptProvider,
  12. BrewProvider,
  13. EnvProvider,
  14. )
  15. from django.conf import settings
  16. import archivebox
  17. from .base_hook import BaseHook, HookType
  18. class BaseBinProvider(BaseHook, BinProvider):
  19. hook_type: HookType = "BINPROVIDER"
  20. # def on_get_abspath(self, bin_name: BinName, **context) -> Optional[HostBinPath]:
  21. # Class = super()
  22. # get_abspath_func = lambda: Class.on_get_abspath(bin_name, **context)
  23. # # return cache.get_or_set(f'bin:abspath:{bin_name}', get_abspath_func)
  24. # return get_abspath_func()
  25. # def on_get_version(self, bin_name: BinName, abspath: Optional[HostBinPath]=None, **context) -> SemVer | None:
  26. # Class = super()
  27. # get_version_func = lambda: Class.on_get_version(bin_name, abspath, **context)
  28. # # return cache.get_or_set(f'bin:version:{bin_name}:{abspath}', get_version_func)
  29. # return get_version_func()
  30. def register(self, settings, parent_plugin=None):
  31. # self._plugin = parent_plugin # for debugging only, never rely on this!
  32. settings.BINPROVIDERS = getattr(settings, "BINPROVIDERS", None) or benedict({})
  33. settings.BINPROVIDERS[self.id] = self
  34. super().register(settings, parent_plugin=parent_plugin)
  35. @property
  36. def admin_url(self) -> str:
  37. # e.g. /admin/environment/binproviders/NpmBinProvider/ TODO
  38. return "/admin/environment/binaries/"
  39. class BaseBinary(BaseHook, Binary):
  40. hook_type: HookType = "BINARY"
  41. binproviders_supported: List[InstanceOf[BinProvider]] = Field(default_factory=list, alias="binproviders")
  42. provider_overrides: Dict[BinProviderName, ProviderLookupDict] = Field(default_factory=dict, alias="overrides")
  43. def register(self, settings, parent_plugin=None):
  44. # self._plugin = parent_plugin # for debugging only, never rely on this!
  45. settings.BINARIES = getattr(settings, "BINARIES", None) or benedict({})
  46. settings.BINARIES[self.id] = self
  47. super().register(settings, parent_plugin=parent_plugin)
  48. @staticmethod
  49. def symlink_to_lib(binary, bin_dir=None) -> None:
  50. bin_dir = bin_dir or archivebox.CONSTANTS.LIB_BIN_DIR
  51. if not (binary.abspath and binary.abspath.exists()):
  52. return
  53. bin_dir.mkdir(parents=True, exist_ok=True)
  54. symlink = bin_dir / binary.name
  55. symlink.unlink(missing_ok=True)
  56. symlink.symlink_to(binary.abspath)
  57. @validate_call
  58. def load(self, **kwargs) -> Self:
  59. binary = super().load(**kwargs)
  60. self.symlink_to_lib(binary=binary, bin_dir=archivebox.CONSTANTS.LIB_BIN_DIR)
  61. return binary
  62. @validate_call
  63. def install(self, **kwargs) -> Self:
  64. binary = super().install(**kwargs)
  65. self.symlink_to_lib(binary=binary, bin_dir=archivebox.CONSTANTS.LIB_BIN_DIR)
  66. return binary
  67. @validate_call
  68. def load_or_install(self, **kwargs) -> Self:
  69. binary = super().load_or_install(**kwargs)
  70. self.symlink_to_lib(binary=binary, bin_dir=archivebox.CONSTANTS.LIB_BIN_DIR)
  71. return binary
  72. @property
  73. def admin_url(self) -> str:
  74. # e.g. /admin/environment/config/LdapConfig/
  75. return f"/admin/environment/binaries/{self.name}/"
  76. apt = AptProvider()
  77. brew = BrewProvider()
  78. env = EnvProvider()