apps.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. __package__ = 'archivebox.plugins_pkg.npm'
  2. import archivebox
  3. from pathlib import Path
  4. from typing import List, Optional
  5. from django.conf import settings
  6. from pydantic import InstanceOf, model_validator
  7. from pydantic_pkgr import BinProvider, NpmProvider, BinName, PATHStr, BinProviderName
  8. from plugantic.base_plugin import BasePlugin
  9. from plugantic.base_configset import BaseConfigSet
  10. from plugantic.base_binary import BaseBinary, BaseBinProvider, env, apt, brew
  11. from plugantic.base_hook import BaseHook
  12. ###################### Config ##########################
  13. class NpmDependencyConfigs(BaseConfigSet):
  14. # section: ConfigSectionName = 'DEPENDENCY_CONFIG'
  15. # USE_NPM: bool = True
  16. # NPM_BINARY: str = Field(default='npm')
  17. # NPM_ARGS: Optional[List[str]] = Field(default=None)
  18. # NPM_EXTRA_ARGS: List[str] = []
  19. # NPM_DEFAULT_ARGS: List[str] = []
  20. pass
  21. DEFAULT_GLOBAL_CONFIG = {
  22. }
  23. NPM_CONFIG = NpmDependencyConfigs(**DEFAULT_GLOBAL_CONFIG)
  24. OLD_NODE_BIN_PATH = archivebox.DATA_DIR / 'node_modules' / '.bin'
  25. NEW_NODE_BIN_PATH = archivebox.CONSTANTS.LIB_NPM_DIR / 'node_modules' / '.bin'
  26. class SystemNpmProvider(NpmProvider, BaseBinProvider):
  27. name: BinProviderName = "sys_npm"
  28. npm_prefix: Optional[Path] = None
  29. class LibNpmProvider(NpmProvider, BaseBinProvider):
  30. name: BinProviderName = "lib_npm"
  31. PATH: PATHStr = str(OLD_NODE_BIN_PATH)
  32. npm_prefix: Optional[Path] = archivebox.CONSTANTS.LIB_NPM_DIR
  33. @model_validator(mode='after')
  34. def validate_path(self):
  35. assert self.npm_prefix == NEW_NODE_BIN_PATH.parent.parent
  36. return self
  37. SYS_NPM_BINPROVIDER = SystemNpmProvider()
  38. LIB_NPM_BINPROVIDER = LibNpmProvider()
  39. npm = LIB_NPM_BINPROVIDER
  40. class NpmBinary(BaseBinary):
  41. name: BinName = 'npm'
  42. binproviders_supported: List[InstanceOf[BinProvider]] = [apt, brew, env]
  43. NPM_BINARY = NpmBinary()
  44. class NodeBinary(BaseBinary):
  45. name: BinName = 'node'
  46. binproviders_supported: List[InstanceOf[BinProvider]] = [apt, brew, env]
  47. NODE_BINARY = NodeBinary()
  48. class NpmPlugin(BasePlugin):
  49. app_label: str = 'npm'
  50. verbose_name: str = 'NPM'
  51. hooks: List[InstanceOf[BaseHook]] = [
  52. NPM_CONFIG,
  53. SYS_NPM_BINPROVIDER,
  54. LIB_NPM_BINPROVIDER,
  55. NODE_BINARY,
  56. NPM_BINARY,
  57. ]
  58. PLUGIN = NpmPlugin()
  59. # PLUGIN.register(settings)
  60. DJANGO_APP = PLUGIN.AppConfig