settings.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. __package__ = 'archivebox.pkg'
  2. import os
  3. import sys
  4. import shutil
  5. import inspect
  6. from pathlib import Path
  7. import django
  8. from django.conf import settings
  9. from django.db.backends.sqlite3.base import Database as sqlite3
  10. from pydantic_pkgr import Binary, BinProvider, BrewProvider, EnvProvider, SemVer
  11. from pydantic_pkgr.binprovider import bin_abspath
  12. from ..config import NODE_BIN_PATH, bin_path
  13. env = EnvProvider(PATH=NODE_BIN_PATH + ':' + os.environ.get('PATH', '/bin'))
  14. LOADED_DEPENDENCIES = {}
  15. for bin_key, dependency in settings.CONFIG.DEPENDENCIES.items():
  16. # 'PYTHON_BINARY': {
  17. # 'path': bin_path(config['PYTHON_BINARY']),
  18. # 'version': config['PYTHON_VERSION'],
  19. # 'hash': bin_hash(config['PYTHON_BINARY']),
  20. # 'enabled': True,
  21. # 'is_valid': bool(config['PYTHON_VERSION']),
  22. # },
  23. bin_name = settings.CONFIG[bin_key]
  24. if bin_name.endswith('django/__init__.py'):
  25. binary_spec = Binary(name='django', providers=[env], provider_overrides={
  26. 'env': {
  27. 'abspath': lambda: Path(inspect.getfile(django)),
  28. 'version': lambda: SemVer('{}.{}.{} {} ({})'.format(*django.VERSION)),
  29. }
  30. })
  31. elif bin_name.endswith('sqlite3/dbapi2.py'):
  32. binary_spec = Binary(name='sqlite3', providers=[env], provider_overrides={
  33. 'env': {
  34. 'abspath': lambda: Path(inspect.getfile(sqlite3)),
  35. 'version': lambda: SemVer(sqlite3.version),
  36. }
  37. })
  38. elif bin_name.endswith('archivebox'):
  39. binary_spec = Binary(name='archivebox', providers=[env], provider_overrides={
  40. 'env': {
  41. 'abspath': lambda: shutil.which(str(Path('archivebox').expanduser())),
  42. 'version': lambda: settings.CONFIG.VERSION,
  43. }
  44. })
  45. elif bin_name.endswith('postlight/parser/cli.js'):
  46. binary_spec = Binary(name='postlight-parser', providers=[env], provider_overrides={
  47. 'env': {
  48. 'abspath': lambda: bin_path('postlight-parser'),
  49. 'version': lambda: SemVer('1.0.0'),
  50. }
  51. })
  52. else:
  53. binary_spec = Binary(name=bin_name, providers=[env])
  54. try:
  55. binary = binary_spec.load()
  56. except Exception as e:
  57. # print(f"- ❌ Binary {bin_name} failed to load with error: {e}")
  58. continue
  59. assert isinstance(binary.loaded_version, SemVer)
  60. try:
  61. assert str(binary.loaded_version) == dependency['version'], f"Expected {bin_name} version {dependency['version']}, got {binary.loaded_version}"
  62. assert str(binary.loaded_respath) == str(bin_abspath(dependency['path']).resolve()), f"Expected {bin_name} abspath {bin_abspath(dependency['path']).resolve()}, got {binary.loaded_respath}"
  63. assert binary.is_valid == dependency['is_valid'], f"Expected {bin_name} is_valid={dependency['is_valid']}, got {binary.is_valid}"
  64. except Exception as e:
  65. pass
  66. # print(f"WARNING: Error loading {bin_name}: {e}")
  67. # import ipdb; ipdb.set_trace()
  68. # print(f"- ✅ Binary {bin_name} loaded successfully")
  69. LOADED_DEPENDENCIES[bin_key] = binary