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
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
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 <host>:<port>')
- 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 <host>:<port>')
+ 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:
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