1 # SPDX-License-Identifier: GPL-2.0-only
3 # This file is part of Nominatim. (https://nominatim.org)
5 # Copyright (C) 2022 by the Nominatim developer community.
6 # For a full list of authors see the git log.
8 Provides custom functions over command-line arguments.
10 from typing import Optional, List, Dict, Any, Sequence, Tuple
13 from pathlib import Path
15 from nominatim.errors import UsageError
16 from nominatim.config import Configuration
17 from nominatim.typing import Protocol
19 LOG = logging.getLogger()
21 class Subcommand(Protocol):
23 Interface to be implemented by classes implementing a CLI subcommand.
26 def add_args(self, parser: argparse.ArgumentParser) -> None:
28 Fill the given parser for the subcommand with the appropriate
32 def run(self, args: 'NominatimArgs') -> int:
34 Run the subcommand with the given parsed arguments.
39 """ Customized namespace class for the nominatim command line tool
40 to receive the command-line arguments.
42 # Basic environment set by root program.
55 subcommand: Optional[str]
59 osm2pgsql_cache: Optional[int]
62 # Arguments added to all subcommands.
64 threads: Optional[int]
66 # Arguments to 'add-data'
71 relation: Optional[int]
72 tiger_data: Optional[str]
75 # Arguments to 'admin'
80 analyse_indexing: bool
83 place_id: Optional[int]
85 # Arguments to 'import'
87 continue_at: Optional[str]
95 # Arguments to 'index'
101 # Arguments to 'export'
104 output_all_postcodes: bool
105 language: Optional[str]
106 restrict_to_country: Optional[str]
107 restrict_to_osm_node: Optional[int]
108 restrict_to_osm_way: Optional[int]
109 restrict_to_osm_relation: Optional[int]
111 # Arguments to 'refresh'
118 secondary_importance: bool
122 enable_debug_statements: bool
123 data_object: Sequence[Tuple[str, int]]
124 data_area: Sequence[Tuple[str, int]]
126 # Arguments to 'replication'
128 update_functions: bool
129 check_for_updates: bool
134 # Arguments to 'serve'
137 # Arguments to 'special-phrases
138 import_from_wiki: bool
139 import_from_csv: Optional[str]
142 # Arguments to all query functions
148 polygon_output: Optional[str]
149 polygon_threshold: Optional[float]
151 # Arguments to 'search'
153 street: Optional[str]
155 county: Optional[str]
157 country: Optional[str]
158 postalcode: Optional[str]
159 countrycodes: Optional[str]
160 exclude_place_ids: Optional[str]
162 viewbox: Optional[str]
166 # Arguments to 'reverse'
171 # Arguments to 'lookup'
174 # Arguments to 'details'
175 object_class: Optional[str]
178 def osm2pgsql_options(self, default_cache: int,
179 default_threads: int) -> Dict[str, Any]:
180 """ Return the standard osm2pgsql options that can be derived
181 from the command line arguments. The resulting dict can be
182 further customized and then used in `run_osm2pgsql()`.
184 return dict(osm2pgsql=self.config.OSM2PGSQL_BINARY or self.osm2pgsql_path,
185 osm2pgsql_cache=self.osm2pgsql_cache or default_cache,
186 osm2pgsql_style=self.config.get_import_style_file(),
187 threads=self.threads or default_threads,
188 dsn=self.config.get_libpq_dsn(),
189 flatnode_file=str(self.config.get_path('FLATNODE_FILE') or ''),
190 tablespaces=dict(slim_data=self.config.TABLESPACE_OSM_DATA,
191 slim_index=self.config.TABLESPACE_OSM_INDEX,
192 main_data=self.config.TABLESPACE_PLACE_DATA,
193 main_index=self.config.TABLESPACE_PLACE_INDEX
198 def get_osm_file_list(self) -> Optional[List[Path]]:
199 """ Return the --osm-file argument as a list of Paths or None
200 if no argument was given. The function also checks if the files
201 exist and raises a UsageError if one cannot be found.
203 if not self.osm_file:
206 files = [Path(f) for f in self.osm_file]
208 if not fname.is_file():
209 LOG.fatal("OSM file '%s' does not exist.", fname)
210 raise UsageError('Cannot access file.')