1
0
mirror of https://github.com/pirate/ArchiveBox.git synced 2025-08-11 17:14:38 +02:00

fix abx handling of obj, module, and class based plugins, fix archivebox version cmd

This commit is contained in:
Nick Sweeting
2024-11-18 18:30:28 -08:00
parent 0acd388c02
commit e50f8cb3b6
3 changed files with 44 additions and 58 deletions

View File

@@ -1,33 +0,0 @@
__package__ = 'abx.archivebox'
from benedict import benedict
def get_scope_config(defaults: benedict | None = None, persona=None, seed=None, crawl=None, snapshot=None, archiveresult=None, extra_config=None):
"""Get all the relevant config for the given scope, in correct precedence order"""
from django.conf import settings
default_config: benedict = defaults or settings.CONFIG
snapshot = snapshot or (archiveresult and archiveresult.snapshot)
crawl = crawl or (snapshot and snapshot.crawl)
seed = seed or (crawl and crawl.seed)
persona = persona or (crawl and crawl.persona)
persona_config = persona.config if persona else {}
seed_config = seed.config if seed else {}
crawl_config = crawl.config if crawl else {}
snapshot_config = snapshot.config if snapshot else {}
archiveresult_config = archiveresult.config if archiveresult else {}
extra_config = extra_config or {}
return benedict({
**default_config, # defaults / config file / environment variables
**persona_config, # lowest precedence
**seed_config,
**crawl_config,
**snapshot_config,
**archiveresult_config,
**extra_config, # highest precedence
})

View File

@@ -62,32 +62,35 @@ class ConfigPluginSpec:
@staticmethod @staticmethod
@abx.hookspec(firstresult=True) @abx.hookspec(firstresult=True)
@abx.hookimpl @abx.hookimpl
def get_SCOPE_CONFIG(extra=None, archiveresult=None, snapshot=None, crawl=None, user=None, collection=..., environment=..., machine=..., default=...) -> dict[ConfigKeyStr, Any]: def get_SCOPE_CONFIG(extra=None, archiveresult=None, snapshot=None, crawl=None, user=None, request=None, collection=..., environment=..., machine=..., default=...) -> dict[ConfigKeyStr, Any]:
"""Get the config as it applies to you right now, based on the current context""" """Get the config as it applies to you right now, based on the current context"""
return benedict({ return benedict({
**pm.hook.get_default_config(default=default), **pm.hook.get_default_config(default=default),
# **pm.hook.get_machine_config(machine), **pm.hook.get_machine_config(machine=machine),
**pm.hook.get_environment_config(environment=environment), **pm.hook.get_environment_config(environment=environment),
**pm.hook.get_collection_config(collection=collection), **pm.hook.get_collection_config(collection=collection),
**pm.hook.get_user_config(user=user), **pm.hook.get_user_config(user=user),
**pm.hook.get_crawl_config(crawl=crawl), **pm.hook.get_crawl_config(crawl=crawl),
**pm.hook.get_snapshot_config(snapshot=snapshot), **pm.hook.get_snapshot_config(snapshot=snapshot),
**pm.hook.get_archiveresult_config(archiveresult=archiveresult), **pm.hook.get_archiveresult_config(archiveresult=archiveresult),
# **pm.hook.get_request_config(request=request), **pm.hook.get_request_config(request=request),
**(extra or {}), **(extra or {}),
}) })
@staticmethod @staticmethod
# @abx.hookspec(firstresult=True) @abx.hookspec(firstresult=True)
# @abx.hookimpl @abx.hookimpl
# def get_request_config(request) -> dict: def get_request_config(request=None) -> dict:
# session = getattr(request, 'session', None) if not request:
# return getattr(session, 'config', None) or {} return {}
return request.session.get('config', None) or {}
@staticmethod @staticmethod
@abx.hookspec(firstresult=True) @abx.hookspec(firstresult=True)
@abx.hookimpl @abx.hookimpl
def get_archiveresult_config(archiveresult) -> dict[ConfigKeyStr, Any]: def get_archiveresult_config(archiveresult=None) -> dict[ConfigKeyStr, Any]:
if not archiveresult:
return {}
return getattr(archiveresult, 'config', None) or {} return getattr(archiveresult, 'config', None) or {}
@staticmethod @staticmethod
@@ -99,7 +102,9 @@ class ConfigPluginSpec:
@staticmethod @staticmethod
@abx.hookspec(firstresult=True) @abx.hookspec(firstresult=True)
@abx.hookimpl @abx.hookimpl
def get_crawl_config(crawl) -> dict[ConfigKeyStr, Any]: def get_crawl_config(crawl=None) -> dict[ConfigKeyStr, Any]:
if not crawl:
return {}
return getattr(crawl, 'config', None) or {} return getattr(crawl, 'config', None) or {}
@staticmethod @staticmethod
@@ -133,14 +138,14 @@ class ConfigPluginSpec:
}) if environment == ... else environment }) if environment == ... else environment
@staticmethod @staticmethod
# @abx.hookspec(firstresult=True) @abx.hookspec(firstresult=True)
# @abx.hookimpl @abx.hookimpl
# def get_machine_config(machine=...) -> dict: def get_machine_config(machine=...) -> dict:
# # ... = ellipsis, means automatically get the machine config from the currently executing machine # ... = ellipsis, means automatically get the machine config from the currently executing machine
# # {} = empty dict, override to ignore the machine config # {} = empty dict, override to ignore the machine config
# if machine == ...: # if machine == ...:
# machine = Machine.objects.get_current() # machine = Machine.objects.get_current()
# return getattr(machine, 'config', None) or {} return getattr(machine, 'config', None) or {}
@staticmethod @staticmethod
@abx.hookspec(firstresult=True) @abx.hookspec(firstresult=True)

View File

@@ -284,7 +284,7 @@ def get_plugin(plugin: PluginId | ModuleType | Type) -> PluginInfo:
# raise ValueError(f'Invalid plugin, must be a module, class, or plugin ID (package name): {plugin}') # raise ValueError(f'Invalid plugin, must be a module, class, or plugin ID (package name): {plugin}')
assert module assert module and hasattr(module, '__package__')
plugin_file = Path(inspect.getfile(module)) plugin_file = Path(inspect.getfile(module))
plugin_package = module.__package__ or module.__name__ plugin_package = module.__package__ or module.__name__
@@ -356,10 +356,22 @@ def get_all_hook_specs() -> Dict[str, Dict[str, Any]]:
for hook_name in get_all_hook_names(): for hook_name in get_all_hook_names():
for plugin_module in pm.get_plugins(): for plugin_module in pm.get_plugins():
if hasattr(plugin_module, hook_name): if inspect.ismodule(plugin_module):
hookspecopts = pm.parse_hookspec_opts(plugin_module, hook_name) plugin = plugin_module
plugin_module = plugin_module
elif inspect.isclass(plugin_module):
plugin = plugin_module
plugin_module = inspect.getmodule(plugin)
else:
plugin = type(plugin_module)
plugin_module = inspect.getmodule(plugin)
assert plugin and plugin_module and hasattr(plugin_module, '__package__')
if hasattr(plugin, hook_name):
hookspecopts = pm.parse_hookspec_opts(plugin, hook_name)
if hookspecopts: if hookspecopts:
method = getattr(plugin_module, hook_name) method = getattr(plugin, hook_name)
signature = inspect.signature(method) signature = inspect.signature(method)
return_type = signature.return_annotation if signature.return_annotation != inspect._empty else None return_type = signature.return_annotation if signature.return_annotation != inspect._empty else None
@@ -381,9 +393,10 @@ def get_all_hook_specs() -> Dict[str, Dict[str, Any]]:
'signature': call_signature, 'signature': call_signature,
'hookspec_opts': hookspecopts, 'hookspec_opts': hookspecopts,
'hookspec_signature': signature, 'hookspec_signature': signature,
'hookspec_plugin': plugin_module.__package__, 'hookspec_plugin': method.__package__,
} }
return hook_specs
return benedict(hook_specs)
@@ -466,7 +479,8 @@ def get_plugin_hooks(plugin: PluginId | ModuleType | Type | None) -> Dict[AttrNa
elif inspect.ismodule(plugin) or inspect.isclass(plugin): elif inspect.ismodule(plugin) or inspect.isclass(plugin):
plugin_module = plugin plugin_module = plugin
else: else:
raise ValueError(f'Invalid plugin, cannot get hooks: {plugin}') plugin_module = type(plugin)
# raise ValueError(f'Invalid plugin, cannot get hooks: {plugin}')
for attr_name in dir(plugin_module): for attr_name in dir(plugin_module):
if attr_name.startswith('_'): if attr_name.startswith('_'):