apps.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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, BinaryOverrides
  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 SystemNpmBinProvider(NpmProvider, BaseBinProvider):
  25. name: BinProviderName = "sys_npm"
  26. npm_prefix: Optional[Path] = None
  27. class LibNpmBinProvider(NpmProvider, BaseBinProvider):
  28. name: BinProviderName = "lib_npm"
  29. PATH: PATHStr = f'{NEW_NODE_BIN_PATH}:{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 = SystemNpmBinProvider()
  36. LIB_NPM_BINPROVIDER = LibNpmBinProvider()
  37. npm = LIB_NPM_BINPROVIDER
  38. class NodeBinary(BaseBinary):
  39. name: BinName = 'node'
  40. binproviders_supported: List[InstanceOf[BinProvider]] = [apt, brew, env]
  41. overrides: BinaryOverrides = {
  42. apt.name: {'packages': ['nodejs']},
  43. }
  44. NODE_BINARY = NodeBinary()
  45. class NpmBinary(BaseBinary):
  46. name: BinName = 'npm'
  47. binproviders_supported: List[InstanceOf[BinProvider]] = [apt, brew, env]
  48. overrides: BinaryOverrides = {
  49. apt.name: {'packages': ['npm']}, # already installed when nodejs is installed
  50. brew.name: {'install': lambda: None}, # already installed when nodejs is installed
  51. }
  52. NPM_BINARY = NpmBinary()
  53. class NpxBinary(BaseBinary):
  54. name: BinName = 'npx'
  55. binproviders_supported: List[InstanceOf[BinProvider]] = [apt, brew, env]
  56. overrides: BinaryOverrides = {
  57. apt.name: {'install': lambda: None}, # already installed when nodejs is installed
  58. brew.name: {'install': lambda: None}, # already installed when nodejs is installed
  59. }
  60. NPX_BINARY = NpxBinary()
  61. class NpmPlugin(BasePlugin):
  62. app_label: str = 'npm'
  63. verbose_name: str = 'NPM'
  64. hooks: List[InstanceOf[BaseHook]] = [
  65. NPM_CONFIG,
  66. SYS_NPM_BINPROVIDER,
  67. LIB_NPM_BINPROVIDER,
  68. NODE_BINARY,
  69. NPM_BINARY,
  70. NPX_BINARY,
  71. ]
  72. PLUGIN = NpmPlugin()
  73. # PLUGIN.register(settings)
  74. DJANGO_APP = PLUGIN.AppConfig