summaryrefslogtreecommitdiff
path: root/searx/search/processors/__init__.py
diff options
context:
space:
mode:
authorMarkus Heiser <markus.heiser@darmarit.de>2025-09-11 19:10:27 +0200
committerMarkus Heiser <markus.heiser@darmarIT.de>2025-09-18 19:40:03 +0200
commit8f8343dc0d78bb57215afc3e99fd9000fce6e0cf (patch)
tree7c0aa8587ed4bc47e403b4148a308191e2d21c55 /searx/search/processors/__init__.py
parent23257bddce864cfc44d64324dee36b32b1cf5248 (diff)
[mod] addition of various type hints / engine processors
Continuation of #5147 .. typification of the engine processors. BTW: - removed obsolete engine property https_support - fixed & improved currency_convert - engine instances can now implement a engine.setup method [#5147] https://github.com/searxng/searxng/pull/5147 Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
Diffstat (limited to 'searx/search/processors/__init__.py')
-rw-r--r--searx/search/processors/__init__.py146
1 files changed, 79 insertions, 67 deletions
diff --git a/searx/search/processors/__init__.py b/searx/search/processors/__init__.py
index 760513253..5e896c711 100644
--- a/searx/search/processors/__init__.py
+++ b/searx/search/processors/__init__.py
@@ -2,83 +2,95 @@
"""Implement request processors used by engine-types."""
__all__ = [
- 'EngineProcessor',
- 'OfflineProcessor',
- 'OnlineProcessor',
- 'OnlineDictionaryProcessor',
- 'OnlineCurrencyProcessor',
- 'OnlineUrlSearchProcessor',
- 'PROCESSORS',
+ "OfflineParamTypes",
+ "OnlineCurrenciesParams",
+ "OnlineDictParams",
+ "OnlineParamTypes",
+ "OnlineParams",
+ "OnlineUrlSearchParams",
+ "PROCESSORS",
+ "ParamTypes",
+ "RequestParams",
]
import typing as t
-import threading
-
from searx import logger
from searx import engines
-from .online import OnlineProcessor
+from .abstract import EngineProcessor, RequestParams
from .offline import OfflineProcessor
-from .online_dictionary import OnlineDictionaryProcessor
-from .online_currency import OnlineCurrencyProcessor
-from .online_url_search import OnlineUrlSearchProcessor
-from .abstract import EngineProcessor
+from .online import OnlineProcessor, OnlineParams
+from .online_dictionary import OnlineDictionaryProcessor, OnlineDictParams
+from .online_currency import OnlineCurrencyProcessor, OnlineCurrenciesParams
+from .online_url_search import OnlineUrlSearchProcessor, OnlineUrlSearchParams
-if t.TYPE_CHECKING:
- from searx.enginelib import Engine
+logger = logger.getChild("search.processors")
-logger = logger.getChild('search.processors')
-PROCESSORS: dict[str, EngineProcessor] = {}
-"""Cache request processors, stored by *engine-name* (:py:func:`initialize`)
+OnlineParamTypes: t.TypeAlias = OnlineParams | OnlineDictParams | OnlineCurrenciesParams | OnlineUrlSearchParams
+OfflineParamTypes: t.TypeAlias = RequestParams
+ParamTypes: t.TypeAlias = OfflineParamTypes | OnlineParamTypes
-:meta hide-value:
-"""
+class ProcessorMap(dict[str, EngineProcessor]):
+ """Class to manage :py:obj:`EngineProcessor` instances in a key/value map
+ (instances stored by *engine-name*)."""
+
+ processor_types: dict[str, type[EngineProcessor]] = {
+ OnlineProcessor.engine_type: OnlineProcessor,
+ OfflineProcessor.engine_type: OfflineProcessor,
+ OnlineDictionaryProcessor.engine_type: OnlineDictionaryProcessor,
+ OnlineCurrencyProcessor.engine_type: OnlineCurrencyProcessor,
+ OnlineUrlSearchProcessor.engine_type: OnlineUrlSearchProcessor,
+ }
+
+ def init(self, engine_list: list[dict[str, t.Any]]):
+ """Initialize all engines and registers a processor for each engine."""
+
+ for eng_settings in engine_list:
+ eng_name: str = eng_settings["name"]
+
+ if eng_settings.get("inactive", False) is True:
+ logger.info("Engine of name '%s' is inactive.", eng_name)
+ continue
+
+ eng_obj = engines.engines.get(eng_name)
+ if eng_obj is None:
+ logger.warning("Engine of name '%s' does not exists.", eng_name)
+ continue
+
+ eng_type = getattr(eng_obj, "engine_type", "online")
+ proc_cls = self.processor_types.get(eng_type)
+ if proc_cls is None:
+ logger.error("Engine '%s' is of unknown engine_type: %s", eng_type)
+ continue
+
+ # initialize (and register) the engine
+ eng_proc = proc_cls(eng_obj)
+ eng_proc.initialize(self.register_processor)
-def get_processor_class(engine_type: str) -> type[EngineProcessor] | None:
- """Return processor class according to the ``engine_type``"""
- for c in [
- OnlineProcessor,
- OfflineProcessor,
- OnlineDictionaryProcessor,
- OnlineCurrencyProcessor,
- OnlineUrlSearchProcessor,
- ]:
- if c.engine_type == engine_type:
- return c
- return None
-
-
-def get_processor(engine: "Engine | ModuleType", engine_name: str) -> EngineProcessor | None:
- """Return processor instance that fits to ``engine.engine.type``"""
- engine_type = getattr(engine, 'engine_type', 'online')
- processor_class = get_processor_class(engine_type)
- if processor_class is not None:
- return processor_class(engine, engine_name)
- return None
-
-
-def initialize_processor(processor: EngineProcessor):
- """Initialize one processor
-
- Call the init function of the engine
- """
- if processor.has_initialize_function:
- _t = threading.Thread(target=processor.initialize, daemon=True)
- _t.start()
-
-
-def initialize(engine_list: list[dict[str, t.Any]]):
- """Initialize all engines and store a processor for each engine in
- :py:obj:`PROCESSORS`."""
- for engine_data in engine_list:
- engine_name: str = engine_data['name']
- engine = engines.engines.get(engine_name)
- if engine:
- processor = get_processor(engine, engine_name)
- if processor is None:
- engine.logger.error('Error get processor for engine %s', engine_name)
- else:
- initialize_processor(processor)
- PROCESSORS[engine_name] = processor
+ def register_processor(self, eng_proc: EngineProcessor, eng_proc_ok: bool) -> bool:
+ """Register the :py:obj:`EngineProcessor`.
+
+ This method is usually passed as a callback to the initialization of the
+ :py:obj:`EngineProcessor`.
+
+ The value (true/false) passed in ``eng_proc_ok`` indicates whether the
+ initialization of the :py:obj:`EngineProcessor` was successful; if this
+ is not the case, the processor is not registered.
+ """
+
+ if eng_proc_ok:
+ self[eng_proc.engine.name] = eng_proc
+ # logger.debug("registered engine processor: %s", eng_proc.engine.name)
+ else:
+ logger.error("init method of engine %s failed (%s).", eng_proc.engine.name)
+
+ return eng_proc_ok
+
+
+PROCESSORS = ProcessorMap()
+"""Global :py:obj:`ProcessorMap`.
+
+:meta hide-value:
+"""