diff --git a/swh/search/__init__.py b/swh/search/__init__.py --- a/swh/search/__init__.py +++ b/swh/search/__init__.py @@ -6,9 +6,12 @@ import importlib import warnings -from typing import Any, Dict +from typing import Any, Dict, TYPE_CHECKING -from swh.search.interface import SearchInterface + +if TYPE_CHECKING: + # importing swh.storage.interface triggers the load of 300+ modules, so... + from swh.search.interface import SearchInterface SEARCH_IMPLEMENTATIONS = { @@ -18,7 +21,7 @@ } -def get_search(cls: str, **kwargs: Dict[str, Any]) -> SearchInterface: +def get_search(cls: str, **kwargs: Dict[str, Any]) -> "SearchInterface": """Get an search object of class `cls` with arguments `args`. Args: diff --git a/swh/search/cli.py b/swh/search/cli.py --- a/swh/search/cli.py +++ b/swh/search/cli.py @@ -3,17 +3,11 @@ # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information -import functools - +# WARNING: do not import unnecessary things here to keep cli startup time under +# control import click -from swh.core import config from swh.core.cli import CONTEXT_SETTINGS -from swh.journal.client import get_journal_client - -from . import get_search -from .journal_client import process_journal_objects -from .api.server import load_and_check_config, app @click.group(name="search", context_settings=CONTEXT_SETTINGS) @@ -27,8 +21,9 @@ @click.pass_context def cli(ctx, config_file): """Software Heritage Search tools.""" - ctx.ensure_object(dict) + from swh.core import config + ctx.ensure_object(dict) conf = config.read(config_file) ctx.obj["config"] = conf @@ -37,6 +32,8 @@ @click.pass_context def initialize(ctx): """Creates Elasticsearch indices.""" + from . import get_search + search = get_search(**ctx.obj["config"]["search"]) search.initialize() print("Done.") @@ -62,6 +59,11 @@ """Listens for new objects from the SWH Journal, and schedules tasks to run relevant indexers (currently, only origin) on these new objects.""" + import functools + from swh.journal.client import get_journal_client + from . import get_search + from .journal_client import process_journal_objects + config = ctx.obj["config"] journal_cfg = config["journal"] @@ -97,6 +99,8 @@ ) def rpc_server(config_path, host, port, debug): """Starts a Software Heritage Indexer RPC HTTP server.""" + from .api.server import load_and_check_config, app + api_cfg = load_and_check_config(config_path, type="any") app.config.update(api_cfg) app.run(host, port=int(port), debug=bool(debug))