diff --git a/nominatim/cli.py b/nominatim/cli.py index 5626deb4..7fae205b 100644 --- a/nominatim/cli.py +++ b/nominatim/cli.py @@ -114,63 +114,6 @@ class CommandlineParser: # # No need to document the functions each time. # pylint: disable=C0111 -# Using non-top-level imports to make pyosmium optional for replication only. -# pylint: disable=E0012,C0415 -class UpdateAddData: - """\ - Add additional data from a file or an online source. - - Data is only imported, not indexed. You need to call `nominatim index` - to complete the process. - """ - - @staticmethod - def add_args(parser): - group_name = parser.add_argument_group('Source') - group = group_name.add_mutually_exclusive_group(required=True) - group.add_argument('--file', metavar='FILE', - help='Import data from an OSM file') - group.add_argument('--diff', metavar='FILE', - help='Import data from an OSM diff file') - group.add_argument('--node', metavar='ID', type=int, - help='Import a single node from the API') - group.add_argument('--way', metavar='ID', type=int, - help='Import a single way from the API') - group.add_argument('--relation', metavar='ID', type=int, - help='Import a single relation from the API') - group.add_argument('--tiger-data', metavar='DIR', - help='Add housenumbers from the US TIGER census database.') - group = parser.add_argument_group('Extra arguments') - group.add_argument('--use-main-api', action='store_true', - help='Use OSM API instead of Overpass to download objects') - - @staticmethod - def run(args): - from nominatim.tokenizer import factory as tokenizer_factory - from nominatim.tools import tiger_data - - if args.tiger_data: - tokenizer = tokenizer_factory.get_tokenizer_for_db(args.config) - return tiger_data.add_tiger_data(args.tiger_data, - args.config, args.threads or 1, - tokenizer) - - params = ['update.php'] - if args.file: - params.extend(('--import-file', args.file)) - elif args.diff: - params.extend(('--import-diff', args.diff)) - elif args.node: - params.extend(('--import-node', args.node)) - elif args.way: - params.extend(('--import-way', args.way)) - elif args.relation: - params.extend(('--import-relation', args.relation)) - if args.use_main_api: - params.append('--use-main-api') - return run_legacy_script(*params, nominatim_env=args) - - class QueryExport: """\ Export addresses as CSV file from the database. @@ -261,7 +204,7 @@ def get_set_parser(**kwargs): parser.add_subcommand('special-phrases', clicmd.ImportSpecialPhrases) - parser.add_subcommand('add-data', UpdateAddData) + parser.add_subcommand('add-data', clicmd.UpdateAddData) parser.add_subcommand('index', clicmd.UpdateIndex) parser.add_subcommand('refresh', clicmd.UpdateRefresh()) diff --git a/nominatim/clicmd/__init__.py b/nominatim/clicmd/__init__.py index f905fed1..ac2cae5b 100644 --- a/nominatim/clicmd/__init__.py +++ b/nominatim/clicmd/__init__.py @@ -7,6 +7,7 @@ from nominatim.clicmd.replication import UpdateReplication from nominatim.clicmd.api import APISearch, APIReverse, APILookup, APIDetails, APIStatus from nominatim.clicmd.index import UpdateIndex from nominatim.clicmd.refresh import UpdateRefresh +from nominatim.clicmd.add_data import UpdateAddData from nominatim.clicmd.admin import AdminFuncs from nominatim.clicmd.freeze import SetupFreeze from nominatim.clicmd.special_phrases import ImportSpecialPhrases diff --git a/nominatim/clicmd/add_data.py b/nominatim/clicmd/add_data.py new file mode 100644 index 00000000..18d67ce0 --- /dev/null +++ b/nominatim/clicmd/add_data.py @@ -0,0 +1,67 @@ +""" +Implementation of the 'add-data' subcommand. +""" +import logging + +from nominatim.tools.exec_utils import run_legacy_script + +# Do not repeat documentation of subcommand classes. +# pylint: disable=C0111 +# Using non-top-level imports to avoid eventually unused imports. +# pylint: disable=E0012,C0415 + +LOG = logging.getLogger() + +class UpdateAddData: + """\ + Add additional data from a file or an online source. + + Data is only imported, not indexed. You need to call `nominatim index` + to complete the process. + """ + + @staticmethod + def add_args(parser): + group_name = parser.add_argument_group('Source') + group = group_name.add_mutually_exclusive_group(required=True) + group.add_argument('--file', metavar='FILE', + help='Import data from an OSM file') + group.add_argument('--diff', metavar='FILE', + help='Import data from an OSM diff file') + group.add_argument('--node', metavar='ID', type=int, + help='Import a single node from the API') + group.add_argument('--way', metavar='ID', type=int, + help='Import a single way from the API') + group.add_argument('--relation', metavar='ID', type=int, + help='Import a single relation from the API') + group.add_argument('--tiger-data', metavar='DIR', + help='Add housenumbers from the US TIGER census database.') + group = parser.add_argument_group('Extra arguments') + group.add_argument('--use-main-api', action='store_true', + help='Use OSM API instead of Overpass to download objects') + + @staticmethod + def run(args): + from nominatim.tokenizer import factory as tokenizer_factory + from nominatim.tools import tiger_data + + if args.tiger_data: + tokenizer = tokenizer_factory.get_tokenizer_for_db(args.config) + return tiger_data.add_tiger_data(args.tiger_data, + args.config, args.threads or 1, + tokenizer) + + params = ['update.php'] + if args.file: + params.extend(('--import-file', args.file)) + elif args.diff: + params.extend(('--import-diff', args.diff)) + elif args.node: + params.extend(('--import-node', args.node)) + elif args.way: + params.extend(('--import-way', args.way)) + elif args.relation: + params.extend(('--import-relation', args.relation)) + if args.use_main_api: + params.append('--use-main-api') + return run_legacy_script(*params, nominatim_env=args) diff --git a/test/python/test_cli.py b/test/python/test_cli.py index d9e01040..6ba89a0a 100644 --- a/test/python/test_cli.py +++ b/test/python/test_cli.py @@ -60,7 +60,6 @@ class TestCli: @pytest.mark.parametrize("command,script", [ - (('add-data', '--file', 'foo.osm'), 'update'), (('export',), 'export') ]) def test_legacy_commands_simple(self, mock_run_legacy, command, script): @@ -90,7 +89,8 @@ class TestCli: @pytest.mark.parametrize("name,oid", [('file', 'foo.osm'), ('diff', 'foo.osc'), ('node', 12), ('way', 8), ('relation', 32)]) - def test_add_data_command(self, mock_run_legacy, name, oid): + def test_add_data_command(self, mock_func_factory, name, oid): + mock_run_legacy = mock_func_factory(nominatim.clicmd.add_data, 'run_legacy_script') assert self.call_nominatim('add-data', '--' + name, str(oid)) == 0 assert mock_run_legacy.called == 1