X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/2bab0ca060ff224091b20a0ac808a3febaba04b1..adce7261ace1b4a21ea49805fb40ba5d50caef89:/src/nominatim_db/cli.py diff --git a/src/nominatim_db/cli.py b/src/nominatim_db/cli.py index 746fbe32..9fd439f8 100644 --- a/src/nominatim_db/cli.py +++ b/src/nominatim_db/cli.py @@ -14,10 +14,11 @@ import logging import os import sys import argparse +import asyncio from pathlib import Path -from nominatim_core.config import Configuration -from nominatim_core.errors import UsageError +from .config import Configuration +from .errors import UsageError from .tools.exec_utils import run_php_server from . import clicmd from . import version @@ -118,7 +119,13 @@ class CommandlineParser: log.warning('Using project directory: %s', str(args.project_dir)) try: - return args.command.run(args) + ret = args.command.run(args) + + if args.config.TOKENIZER == 'legacy': + log.warning('WARNING: the "legacy" tokenizer is deprecated ' + 'and will be removed in Nominatim 5.0.') + + return ret except UsageError as exception: if log.isEnabledFor(logging.DEBUG): raise # use Python's exception printing @@ -168,24 +175,34 @@ class AdminServe: if args.engine == 'php': if args.config.lib_dir.php is None: raise UsageError("PHP frontend not configured.") + LOG.warning('\n\nWARNING: the PHP frontend is deprecated ' + 'and will be removed in Nominatim 5.0.\n\n') run_php_server(args.server, args.project_dir / 'website') else: - import uvicorn # pylint: disable=import-outside-toplevel - server_info = args.server.split(':', 1) - host = server_info[0] - if len(server_info) > 1: - if not server_info[1].isdigit(): - raise UsageError('Invalid format for --server parameter. Use :') - port = int(server_info[1]) - else: - port = 8088 + asyncio.run(self.run_uvicorn(args)) - server_module = importlib.import_module(f'nominatim_api.server.{args.engine}.server') + return 0 - app = server_module.get_application(args.project_dir) - uvicorn.run(app, host=host, port=port) - return 0 + async def run_uvicorn(self, args: NominatimArgs) -> None: + import uvicorn # pylint: disable=import-outside-toplevel + + server_info = args.server.split(':', 1) + host = server_info[0] + if len(server_info) > 1: + if not server_info[1].isdigit(): + raise UsageError('Invalid format for --server parameter. Use :') + port = int(server_info[1]) + else: + port = 8088 + + server_module = importlib.import_module(f'nominatim_api.server.{args.engine}.server') + + app = server_module.get_application(args.project_dir) + + config = uvicorn.Config(app, host=host, port=port) + server = uvicorn.Server(config) + await server.serve() def get_set_parser() -> CommandlineParser: @@ -207,15 +224,30 @@ def get_set_parser() -> CommandlineParser: parser.add_subcommand('admin', clicmd.AdminFuncs()) - parser.add_subcommand('export', clicmd.QueryExport()) - parser.add_subcommand('convert', clicmd.ConvertDB()) - parser.add_subcommand('serve', AdminServe()) + try: + exportcmd = importlib.import_module('nominatim_db.clicmd.export') + apicmd = importlib.import_module('nominatim_db.clicmd.api') + convertcmd = importlib.import_module('nominatim_db.clicmd.convert') + + parser.add_subcommand('export', exportcmd.QueryExport()) + parser.add_subcommand('convert', convertcmd.ConvertDB()) + parser.add_subcommand('serve', AdminServe()) + + parser.add_subcommand('search', apicmd.APISearch()) + parser.add_subcommand('reverse', apicmd.APIReverse()) + parser.add_subcommand('lookup', apicmd.APILookup()) + parser.add_subcommand('details', apicmd.APIDetails()) + parser.add_subcommand('status', apicmd.APIStatus()) + except ModuleNotFoundError as ex: + if not ex.name or 'nominatim_api' not in ex.name: # pylint: disable=E1135 + raise ex + + parser.parser.epilog = \ + f'\n\nNominatim API package not found (was looking for module: {ex.name}).'\ + '\nThe following commands are not available:'\ + '\n export, convert, serve, search, reverse, lookup, details, status'\ + "\n\nRun 'pip install nominatim-api' to install the package." - parser.add_subcommand('search', clicmd.APISearch()) - parser.add_subcommand('reverse', clicmd.APIReverse()) - parser.add_subcommand('lookup', clicmd.APILookup()) - parser.add_subcommand('details', clicmd.APIDetails()) - parser.add_subcommand('status', clicmd.APIStatus()) return parser