move almost all config into new archivebox.CONSTANTS

This commit is contained in:
Nick Sweeting
2024-09-25 05:10:09 -07:00
parent f5e8d99fdf
commit bb65b2dbec
32 changed files with 982 additions and 840 deletions

View File

@@ -17,6 +17,8 @@ from pydantic_pkgr import (
from django.conf import settings
import archivebox
from .base_hook import BaseHook, HookType
@@ -64,7 +66,9 @@ class BaseBinary(BaseHook, Binary):
super().register(settings, parent_plugin=parent_plugin)
@staticmethod
def symlink_to_lib(binary, bin_dir=settings.CONFIG.BIN_DIR) -> None:
def symlink_to_lib(binary, bin_dir=None) -> None:
bin_dir = bin_dir or archivebox.CONSTANTS.LIB_BIN_DIR
if not (binary.abspath and binary.abspath.exists()):
return
@@ -77,19 +81,19 @@ class BaseBinary(BaseHook, Binary):
@validate_call
def load(self, **kwargs) -> Self:
binary = super().load(**kwargs)
self.symlink_to_lib(binary=binary, bin_dir=settings.CONFIG.BIN_DIR)
self.symlink_to_lib(binary=binary, bin_dir=archivebox.CONSTANTS.LIB_BIN_DIR)
return binary
@validate_call
def install(self, **kwargs) -> Self:
binary = super().install(**kwargs)
self.symlink_to_lib(binary=binary, bin_dir=settings.CONFIG.BIN_DIR)
self.symlink_to_lib(binary=binary, bin_dir=archivebox.CONSTANTS.LIB_BIN_DIR)
return binary
@validate_call
def load_or_install(self, **kwargs) -> Self:
binary = super().load_or_install(**kwargs)
self.symlink_to_lib(binary=binary, bin_dir=settings.CONFIG.BIN_DIR)
self.symlink_to_lib(binary=binary, bin_dir=archivebox.CONSTANTS.LIB_BIN_DIR)
return binary
@property

View File

@@ -123,6 +123,10 @@ class ArchiveBoxBaseConfig(BaseSettings):
validate_return=True,
revalidate_instances="always",
)
load_from_defaults: ClassVar[bool] = True
load_from_configfile: ClassVar[bool] = True
load_from_environment: ClassVar[bool] = True
@classmethod
def settings_customise_sources(
@@ -140,20 +144,22 @@ class ArchiveBoxBaseConfig(BaseSettings):
# import ipdb; ipdb.set_trace()
precedence_order = {}
# if ArchiveBox.conf does not exist yet, return defaults -> env order
if not ARCHIVEBOX_CONFIG_FILE.is_file():
return (
init_settings,
env_settings,
)
precedence_order = {
'defaults': init_settings,
'environment': env_settings,
}
# if ArchiveBox.conf exists and is in TOML format, return default -> TOML -> env order
try:
return (
init_settings,
FlatTomlConfigSettingsSource(settings_cls, toml_file=ARCHIVEBOX_CONFIG_FILE),
env_settings,
)
precedence_order = precedence_order or {
'defaults': init_settings,
'configfile': FlatTomlConfigSettingsSource(settings_cls, toml_file=ARCHIVEBOX_CONFIG_FILE),
'environment': env_settings,
}
except Exception as err:
if err.__class__.__name__ != "TOMLDecodeError":
raise
@@ -165,11 +171,20 @@ class ArchiveBoxBaseConfig(BaseSettings):
new_toml = ini_to_toml.convert(original_ini)
ARCHIVEBOX_CONFIG_FILE.write_text(new_toml)
return (
init_settings,
FlatTomlConfigSettingsSource(settings_cls, toml_file=ARCHIVEBOX_CONFIG_FILE),
env_settings,
)
precedence_order = {
'defaults': init_settings,
'configfile': FlatTomlConfigSettingsSource(settings_cls, toml_file=ARCHIVEBOX_CONFIG_FILE),
'environment': env_settings,
}
if not cls.load_from_environment:
precedence_order.pop('environment')
if not cls.load_from_configfile:
precedence_order.pop('configfile')
if not cls.load_from_defaults:
precedence_order.pop('defaults')
return tuple(precedence_order.values())
@model_validator(mode="after")
def fill_defaults(self):

View File

@@ -1,72 +1,72 @@
__package__ = 'archivebox.plugantic.management.commands'
# __package__ = 'archivebox.plugantic.management.commands'
from django.core.management.base import BaseCommand
from django.conf import settings
# from django.core.management.base import BaseCommand
# from django.conf import settings
from pydantic_pkgr import Binary, BinProvider, BrewProvider, EnvProvider, SemVer
from pydantic_pkgr.binprovider import bin_abspath
# from pydantic_pkgr import Binary, BinProvider, BrewProvider, EnvProvider, SemVer
# from pydantic_pkgr.binprovider import bin_abspath
from ....config import NODE_BIN_PATH, bin_path
from ...base_binary import env
# from ....config import bin_path
# from ...base_binary import env
class Command(BaseCommand):
def handle(self, *args, method, **options):
method(*args, **options)
# class Command(BaseCommand):
# def handle(self, *args, method, **options):
# method(*args, **options)
def add_arguments(self, parser):
subparsers = parser.add_subparsers(title="sub-commands", required=True)
# def add_arguments(self, parser):
# subparsers = parser.add_subparsers(title="sub-commands", required=True)
list_parser = subparsers.add_parser("list", help="List archivebox runtime dependencies.")
list_parser.set_defaults(method=self.list)
# list_parser = subparsers.add_parser("list", help="List archivebox runtime dependencies.")
# list_parser.set_defaults(method=self.list)
install_parser = subparsers.add_parser("install", help="Install archivebox runtime dependencies.")
install_parser.add_argument("--update", action="store_true", help="Update dependencies to latest versions.")
install_parser.add_argument("package_names", nargs="+", type=str)
install_parser.set_defaults(method=self.install)
# install_parser = subparsers.add_parser("install", help="Install archivebox runtime dependencies.")
# install_parser.add_argument("--update", action="store_true", help="Update dependencies to latest versions.")
# install_parser.add_argument("package_names", nargs="+", type=str)
# install_parser.set_defaults(method=self.install)
def list(self, *args, **options):
self.stdout.write('################# PLUGINS ####################')
for plugin in settings.PLUGINS.values():
self.stdout.write(f'{plugin.name}:')
for binary in plugin.binaries:
try:
binary = binary.load()
except Exception as e:
# import ipdb; ipdb.set_trace()
raise
self.stdout.write(f' {binary.name.ljust(14)} {str(binary.version).ljust(11)} {binary.binprovider.INSTALLER_BIN.ljust(5)} {binary.abspath}')
# def list(self, *args, **options):
# self.stdout.write('################# PLUGINS ####################')
# for plugin in settings.PLUGINS.values():
# self.stdout.write(f'{plugin.name}:')
# for binary in plugin.binaries:
# try:
# binary = binary.load()
# except Exception as e:
# # import ipdb; ipdb.set_trace()
# raise
# self.stdout.write(f' {binary.name.ljust(14)} {str(binary.version).ljust(11)} {binary.binprovider.INSTALLER_BIN.ljust(5)} {binary.abspath}')
self.stdout.write('\n################# LEGACY ####################')
for bin_key, dependency in settings.CONFIG.DEPENDENCIES.items():
bin_name = settings.CONFIG[bin_key]
# self.stdout.write('\n################# LEGACY ####################')
# for bin_key, dependency in settings.CONFIG.DEPENDENCIES.items():
# bin_name = settings.CONFIG[bin_key]
self.stdout.write(f'{bin_key}: {bin_name}')
# self.stdout.write(f'{bin_key}: {bin_name}')
# binary = Binary(name=package_name, providers=[env])
# print(binary)
# # binary = Binary(name=package_name, providers=[env])
# # print(binary)
# try:
# loaded_bin = binary.load()
# self.stdout.write(
# self.style.SUCCESS(f'Successfully loaded {package_name}:') + str(loaded_bin)
# )
# except Exception as e:
# self.stderr.write(
# self.style.ERROR(f"Error loading {package_name}: {e}")
# )
# # try:
# # loaded_bin = binary.load()
# # self.stdout.write(
# # self.style.SUCCESS(f'Successfully loaded {package_name}:') + str(loaded_bin)
# # )
# # except Exception as e:
# # self.stderr.write(
# # self.style.ERROR(f"Error loading {package_name}: {e}")
# # )
def install(self, *args, bright, **options):
for package_name in options["package_names"]:
binary = Binary(name=package_name, providers=[env])
print(binary)
# def install(self, *args, bright, **options):
# for package_name in options["package_names"]:
# binary = Binary(name=package_name, providers=[env])
# print(binary)
try:
loaded_bin = binary.load()
self.stdout.write(
self.style.SUCCESS(f'Successfully loaded {package_name}:') + str(loaded_bin)
)
except Exception as e:
self.stderr.write(
self.style.ERROR(f"Error loading {package_name}: {e}")
)
# try:
# loaded_bin = binary.load()
# self.stdout.write(
# self.style.SUCCESS(f'Successfully loaded {package_name}:') + str(loaded_bin)
# )
# except Exception as e:
# self.stderr.write(
# self.style.ERROR(f"Error loading {package_name}: {e}")
# )