apps.py 2.3 KB

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