settings.py 2.7 KB

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