]> git.openstreetmap.org Git - nominatim.git/blobdiff - src/nominatim_db/cli.py
translate UsageError in CLI API commands
[nominatim.git] / src / nominatim_db / cli.py
index 746fbe3297c4ad91f0152ec1836d6ef1dab1b54a..9fd439f8d0f33684e5429f31c7386f57f7625ae3 100644 (file)
@@ -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 <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:
@@ -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