From 6e89310a9285f1ad15d8002bf68f578eada367a0 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Thu, 16 May 2024 11:55:17 +0200 Subject: [PATCH] split code into submodules --- nominatim/__main__.py | 4 - nominatim/clicmd/__init__.py | 28 ----- nominatim/paths.py | 15 --- .../api => src/nominatim_api}/__init__.py | 2 +- .../api => src/nominatim_api}/connection.py | 12 +- {nominatim/api => src/nominatim_api}/core.py | 30 ++--- .../api => src/nominatim_api}/localization.py | 2 +- .../api => src/nominatim_api}/logging.py | 2 +- .../api => src/nominatim_api}/lookup.py | 13 +- .../__init__.py => src/nominatim_api/py.typed | 0 .../nominatim_api}/result_formatting.py | 4 +- .../api => src/nominatim_api}/results.py | 14 +-- .../api => src/nominatim_api}/reverse.py | 16 +-- .../nominatim_api}/search/__init__.py | 2 +- .../search/db_search_builder.py | 14 +-- .../nominatim_api}/search/db_search_fields.py | 10 +- .../search/db_search_lookups.py | 6 +- .../nominatim_api}/search/db_searches.py | 16 +-- .../nominatim_api}/search/geocoder.py | 20 ++-- .../nominatim_api}/search/icu_tokenizer.py | 14 +-- .../nominatim_api}/search/legacy_tokenizer.py | 12 +- .../api => src/nominatim_api}/search/query.py | 2 +- .../search/query_analyzer_factory.py | 8 +- .../nominatim_api}/search/token_assignment.py | 6 +- .../nominatim_api/server}/__init__.py | 0 .../nominatim_api/server/falcon}/__init__.py | 0 .../nominatim_api}/server/falcon/server.py | 12 +- .../server/starlette}/__init__.py | 0 .../nominatim_api}/server/starlette/server.py | 12 +- .../sql}/sqlalchemy_functions.py | 4 +- .../nominatim_api/sql}/sqlite_functions.py | 2 +- .../api => src/nominatim_api}/status.py | 15 ++- {nominatim/api => src/nominatim_api}/types.py | 6 +- .../api => src/nominatim_api}/v1/__init__.py | 12 +- .../nominatim_api}/v1/classtypes.py | 9 +- .../api => src/nominatim_api}/v1/format.py | 83 ++++++------- .../nominatim_api}/v1/format_json.py | 18 +-- .../nominatim_api}/v1/format_xml.py | 13 +- .../api => src/nominatim_api}/v1/helpers.py | 6 +- .../nominatim_api}/v1/server_glue.py | 112 +++++++++--------- src/nominatim_api/version.py | 11 ++ .../server => src/nominatim_core}/__init__.py | 0 {nominatim => src/nominatim_core}/config.py | 16 +-- .../nominatim_core/db}/__init__.py | 0 .../nominatim_core}/db/async_connection.py | 6 +- .../nominatim_core}/db/async_core_library.py | 2 +- .../nominatim_core}/db/connection.py | 8 +- .../nominatim_core}/db/properties.py | 6 +- .../nominatim_core}/db/sql_preprocessor.py | 10 +- .../nominatim_core}/db/sqlalchemy_schema.py | 5 +- .../db/sqlalchemy_types/__init__.py | 2 +- .../db/sqlalchemy_types/geometry.py | 4 +- .../db/sqlalchemy_types/int_array.py | 4 +- .../db/sqlalchemy_types/json.py | 4 +- .../db/sqlalchemy_types/key_value.py | 4 +- .../nominatim_core}/db/status.py | 12 +- {nominatim => src/nominatim_core}/db/utils.py | 8 +- {nominatim => src/nominatim_core}/errors.py | 4 +- src/nominatim_core/paths.py | 15 +++ .../nominatim_core/py.typed | 0 {nominatim => src/nominatim_core}/typing.py | 4 +- .../nominatim_core/utils}/__init__.py | 0 .../nominatim_core}/utils/centroid.py | 4 +- .../nominatim_core}/utils/json_writer.py | 2 +- src/nominatim_core/utils/url_utils.py | 31 +++++ src/nominatim_core/version.py | 11 ++ .../nominatim_db}/__init__.py | 0 {nominatim => src/nominatim_db}/cli.py | 16 +-- src/nominatim_db/clicmd/__init__.py | 28 +++++ .../nominatim_db}/clicmd/add_data.py | 10 +- .../nominatim_db}/clicmd/admin.py | 10 +- {nominatim => src/nominatim_db}/clicmd/api.py | 16 +-- .../nominatim_db}/clicmd/args.py | 12 +- .../nominatim_db}/clicmd/convert.py | 6 +- .../nominatim_db}/clicmd/export.py | 12 +- .../nominatim_db}/clicmd/freeze.py | 8 +- .../nominatim_db}/clicmd/index.py | 10 +- .../nominatim_db}/clicmd/refresh.py | 12 +- .../nominatim_db}/clicmd/replication.py | 12 +- .../nominatim_db}/clicmd/setup.py | 18 +-- .../nominatim_db}/clicmd/special_phrases.py | 16 +-- .../nominatim_db/data}/__init__.py | 0 .../nominatim_db}/data/country_info.py | 14 +-- .../nominatim_db}/data/place_info.py | 4 +- .../nominatim_db}/data/place_name.py | 4 +- .../nominatim_db}/data/postcode_format.py | 8 +- .../nominatim_db/indexer}/__init__.py | 0 .../nominatim_db}/indexer/indexer.py | 16 +-- .../nominatim_db}/indexer/progress.py | 4 +- .../nominatim_db}/indexer/runners.py | 12 +- .../nominatim_db/tokenizer}/__init__.py | 0 .../nominatim_db}/tokenizer/base.py | 12 +- .../nominatim_db}/tokenizer/factory.py | 14 +-- .../tokenizer/icu_rule_loader.py | 22 ++-- .../tokenizer/icu_token_analysis.py | 8 +- .../nominatim_db}/tokenizer/icu_tokenizer.py | 24 ++-- .../tokenizer/legacy_tokenizer.py | 20 ++-- .../tokenizer/place_sanitizer.py | 16 +-- .../tokenizer/sanitizers/__init__.py | 0 .../tokenizer/sanitizers/base.py | 12 +- .../sanitizers/clean_housenumbers.py | 10 +- .../tokenizer/sanitizers/clean_postcodes.py | 10 +- .../tokenizer/sanitizers/clean_tiger_tags.py | 8 +- .../tokenizer/sanitizers/config.py | 6 +- .../tokenizer/sanitizers/delete_tags.py | 10 +- .../tokenizer/sanitizers/split_name_list.py | 8 +- .../tokenizer/sanitizers/strip_brace_terms.py | 8 +- .../sanitizers/tag_analyzer_by_language.py | 10 +- .../tokenizer/sanitizers/tag_japanese.py | 8 +- .../tokenizer/token_analysis/__init__.py | 0 .../tokenizer/token_analysis/base.py | 8 +- .../token_analysis/config_variants.py | 8 +- .../tokenizer/token_analysis/generic.py | 12 +- .../token_analysis/generic_mutation.py | 6 +- .../tokenizer/token_analysis/housenumbers.py | 8 +- .../tokenizer/token_analysis/postcodes.py | 6 +- .../nominatim_db}/tools/__init__.py | 4 +- .../nominatim_db}/tools/add_osm_data.py | 9 +- .../nominatim_db}/tools/admin.py | 16 +-- .../nominatim_db}/tools/check_database.py | 18 +-- .../nominatim_db}/tools/collect_os_info.py | 10 +- .../nominatim_db}/tools/convert_sqlite.py | 10 +- .../nominatim_db}/tools/database_import.py | 19 ++- .../nominatim_db}/tools/exec_utils.py | 26 +--- .../nominatim_db}/tools/freeze.py | 6 +- .../nominatim_db}/tools/migration.py | 18 +-- .../nominatim_db}/tools/postcodes.py | 12 +- .../nominatim_db}/tools/refresh.py | 14 +-- .../nominatim_db}/tools/replication.py | 13 +- .../tools/special_phrases/__init__.py | 0 .../special_phrases/importer_statistics.py | 4 +- .../tools/special_phrases/sp_csv_loader.py | 9 +- .../tools/special_phrases/sp_importer.py | 16 +-- .../tools/special_phrases/sp_wiki_loader.py | 10 +- .../tools/special_phrases/special_phrase.py | 4 +- .../nominatim_db}/tools/tiger_data.py | 20 ++-- {nominatim => src/nominatim_db}/version.py | 4 +- 137 files changed, 757 insertions(+), 716 deletions(-) delete mode 100644 nominatim/__main__.py delete mode 100644 nominatim/clicmd/__init__.py delete mode 100644 nominatim/paths.py rename {nominatim/api => src/nominatim_api}/__init__.py (96%) rename {nominatim/api => src/nominatim_api}/connection.py (94%) rename {nominatim/api => src/nominatim_api}/core.py (98%) rename {nominatim/api => src/nominatim_api}/localization.py (98%) rename {nominatim/api => src/nominatim_api}/logging.py (99%) rename {nominatim/api => src/nominatim_api}/lookup.py (97%) rename nominatim/__init__.py => src/nominatim_api/py.typed (100%) rename {nominatim/api => src/nominatim_api}/result_formatting.py (94%) rename {nominatim/api => src/nominatim_api}/results.py (98%) rename {nominatim/api => src/nominatim_api}/reverse.py (98%) rename {nominatim/api => src/nominatim_api}/search/__init__.py (88%) rename {nominatim/api => src/nominatim_api}/search/db_search_builder.py (97%) rename {nominatim/api => src/nominatim_api}/search/db_search_fields.py (96%) rename {nominatim/api => src/nominatim_api}/search/db_search_lookups.py (96%) rename {nominatim/api => src/nominatim_api}/search/db_searches.py (98%) rename {nominatim/api => src/nominatim_api}/search/geocoder.py (94%) rename {nominatim/api => src/nominatim_api}/search/icu_tokenizer.py (97%) rename {nominatim/api => src/nominatim_api}/search/legacy_tokenizer.py (97%) rename {nominatim/api => src/nominatim_api}/search/query.py (99%) rename {nominatim/api => src/nominatim_api}/search/query_analyzer_factory.py (88%) rename {nominatim/api => src/nominatim_api}/search/token_assignment.py (99%) rename {nominatim/data => src/nominatim_api/server}/__init__.py (100%) rename {nominatim/db => src/nominatim_api/server/falcon}/__init__.py (100%) rename {nominatim => src/nominatim_api}/server/falcon/server.py (96%) rename {nominatim/indexer => src/nominatim_api/server/starlette}/__init__.py (100%) rename {nominatim => src/nominatim_api}/server/starlette/server.py (95%) rename {nominatim/db => src/nominatim_api/sql}/sqlalchemy_functions.py (98%) rename {nominatim/db => src/nominatim_api/sql}/sqlite_functions.py (98%) rename {nominatim/api => src/nominatim_api}/status.py (71%) rename {nominatim/api => src/nominatim_api}/types.py (99%) rename {nominatim/api => src/nominatim_api}/v1/__init__.py (51%) rename {nominatim/api => src/nominatim_api}/v1/classtypes.py (96%) rename {nominatim/api => src/nominatim_api}/v1/format.py (76%) rename {nominatim/api => src/nominatim_api}/v1/format_json.py (94%) rename {nominatim/api => src/nominatim_api}/v1/format_xml.py (91%) rename {nominatim/api => src/nominatim_api}/v1/helpers.py (97%) rename {nominatim/api => src/nominatim_api}/v1/server_glue.py (85%) create mode 100644 src/nominatim_api/version.py rename {nominatim/server => src/nominatim_core}/__init__.py (100%) rename {nominatim => src/nominatim_core}/config.py (97%) rename {nominatim/server/falcon => src/nominatim_core/db}/__init__.py (100%) rename {nominatim => src/nominatim_core}/db/async_connection.py (98%) rename {nominatim => src/nominatim_core}/db/async_core_library.py (89%) rename {nominatim => src/nominatim_core}/db/connection.py (97%) rename {nominatim => src/nominatim_core}/db/properties.py (90%) rename {nominatim => src/nominatim_core}/db/sql_preprocessor.py (95%) rename {nominatim => src/nominatim_core}/db/sqlalchemy_schema.py (96%) rename {nominatim => src/nominatim_core}/db/sqlalchemy_types/__init__.py (88%) rename {nominatim => src/nominatim_core}/db/sqlalchemy_types/geometry.py (99%) rename {nominatim => src/nominatim_core}/db/sqlalchemy_types/int_array.py (97%) rename {nominatim => src/nominatim_core}/db/sqlalchemy_types/json.py (88%) rename {nominatim => src/nominatim_core}/db/sqlalchemy_types/key_value.py (95%) rename {nominatim => src/nominatim_core}/db/status.py (94%) rename {nominatim => src/nominatim_core}/db/utils.py (95%) rename {nominatim => src/nominatim_core}/errors.py (77%) create mode 100644 src/nominatim_core/paths.py rename nominatim/server/starlette/__init__.py => src/nominatim_core/py.typed (100%) rename {nominatim => src/nominatim_core}/typing.py (95%) rename {nominatim/tokenizer => src/nominatim_core/utils}/__init__.py (100%) rename {nominatim => src/nominatim_core}/utils/centroid.py (93%) rename {nominatim => src/nominatim_core}/utils/json_writer.py (98%) create mode 100644 src/nominatim_core/utils/url_utils.py create mode 100644 src/nominatim_core/version.py rename {nominatim/tokenizer/sanitizers => src/nominatim_db}/__init__.py (100%) rename {nominatim => src/nominatim_db}/cli.py (95%) create mode 100644 src/nominatim_db/clicmd/__init__.py rename {nominatim => src/nominatim_db}/clicmd/add_data.py (94%) rename {nominatim => src/nominatim_db}/clicmd/admin.py (95%) rename {nominatim => src/nominatim_db}/clicmd/api.py (97%) rename {nominatim => src/nominatim_db}/clicmd/args.py (96%) rename {nominatim => src/nominatim_db}/clicmd/convert.py (96%) rename {nominatim => src/nominatim_db}/clicmd/export.py (96%) rename {nominatim => src/nominatim_db}/clicmd/freeze.py (85%) rename {nominatim => src/nominatim_db}/clicmd/index.py (91%) rename {nominatim => src/nominatim_db}/clicmd/refresh.py (96%) rename {nominatim => src/nominatim_db}/clicmd/replication.py (96%) rename {nominatim => src/nominatim_db}/clicmd/setup.py (96%) rename {nominatim => src/nominatim_db}/clicmd/special_phrases.py (88%) rename {nominatim/tokenizer/token_analysis => src/nominatim_db/data}/__init__.py (100%) rename {nominatim => src/nominatim_db}/data/country_info.py (94%) rename {nominatim => src/nominatim_db}/data/place_info.py (96%) rename {nominatim => src/nominatim_db}/data/place_name.py (96%) rename {nominatim => src/nominatim_db}/data/postcode_format.py (95%) rename {nominatim/tools/special_phrases => src/nominatim_db/indexer}/__init__.py (100%) rename {nominatim => src/nominatim_db}/indexer/indexer.py (95%) rename {nominatim => src/nominatim_db}/indexer/progress.py (95%) rename {nominatim => src/nominatim_db}/indexer/runners.py (95%) rename {nominatim/utils => src/nominatim_db/tokenizer}/__init__.py (100%) rename {nominatim => src/nominatim_db}/tokenizer/base.py (96%) rename {nominatim => src/nominatim_db}/tokenizer/factory.py (90%) rename {nominatim => src/nominatim_db}/tokenizer/icu_rule_loader.py (91%) rename {nominatim => src/nominatim_db}/tokenizer/icu_token_analysis.py (85%) rename {nominatim => src/nominatim_db}/tokenizer/icu_tokenizer.py (98%) rename {nominatim => src/nominatim_db}/tokenizer/legacy_tokenizer.py (98%) rename {nominatim => src/nominatim_db}/tokenizer/place_sanitizer.py (79%) create mode 100644 src/nominatim_db/tokenizer/sanitizers/__init__.py rename {nominatim => src/nominatim_db}/tokenizer/sanitizers/base.py (86%) rename {nominatim => src/nominatim_db}/tokenizer/sanitizers/clean_housenumbers.py (91%) rename {nominatim => src/nominatim_db}/tokenizer/sanitizers/clean_postcodes.py (90%) rename {nominatim => src/nominatim_db}/tokenizer/sanitizers/clean_tiger_tags.py (83%) rename {nominatim => src/nominatim_db}/tokenizer/sanitizers/config.py (97%) rename {nominatim => src/nominatim_db}/tokenizer/sanitizers/delete_tags.py (92%) rename {nominatim => src/nominatim_db}/tokenizer/sanitizers/split_name_list.py (81%) rename {nominatim => src/nominatim_db}/tokenizer/sanitizers/strip_brace_terms.py (81%) rename {nominatim => src/nominatim_db}/tokenizer/sanitizers/tag_analyzer_by_language.py (93%) rename {nominatim => src/nominatim_db}/tokenizer/sanitizers/tag_japanese.py (93%) create mode 100644 src/nominatim_db/tokenizer/token_analysis/__init__.py rename {nominatim => src/nominatim_db}/tokenizer/token_analysis/base.py (95%) rename {nominatim => src/nominatim_db}/tokenizer/token_analysis/config_variants.py (95%) rename {nominatim => src/nominatim_db}/tokenizer/token_analysis/generic.py (93%) rename {nominatim => src/nominatim_db}/tokenizer/token_analysis/generic_mutation.py (92%) rename {nominatim => src/nominatim_db}/tokenizer/token_analysis/housenumbers.py (90%) rename {nominatim => src/nominatim_db}/tokenizer/token_analysis/postcodes.py (92%) rename {nominatim => src/nominatim_db}/tools/__init__.py (68%) rename {nominatim => src/nominatim_db}/tools/add_osm_data.py (89%) rename {nominatim => src/nominatim_db}/tools/admin.py (90%) rename {nominatim => src/nominatim_db}/tools/check_database.py (96%) rename {nominatim => src/nominatim_db}/tools/collect_os_info.py (95%) rename {nominatim => src/nominatim_db}/tools/convert_sqlite.py (97%) rename {nominatim => src/nominatim_db}/tools/database_import.py (94%) rename {nominatim => src/nominatim_db}/tools/exec_utils.py (78%) rename {nominatim => src/nominatim_db}/tools/freeze.py (89%) rename {nominatim => src/nominatim_db}/tools/migration.py (97%) rename {nominatim => src/nominatim_db}/tools/postcodes.py (96%) rename {nominatim => src/nominatim_db}/tools/refresh.py (97%) rename {nominatim => src/nominatim_db}/tools/replication.py (96%) create mode 100644 src/nominatim_db/tools/special_phrases/__init__.py rename {nominatim => src/nominatim_db}/tools/special_phrases/importer_statistics.py (95%) rename {nominatim => src/nominatim_db}/tools/special_phrases/sp_csv_loader.py (84%) rename {nominatim => src/nominatim_db}/tools/special_phrases/sp_importer.py (96%) rename {nominatim => src/nominatim_db}/tools/special_phrases/sp_wiki_loader.py (89%) rename {nominatim => src/nominatim_db}/tools/special_phrases/special_phrase.py (92%) rename {nominatim => src/nominatim_db}/tools/tiger_data.py (90%) rename {nominatim => src/nominatim_db}/version.py (95%) diff --git a/nominatim/__main__.py b/nominatim/__main__.py deleted file mode 100644 index b211afaf..00000000 --- a/nominatim/__main__.py +++ /dev/null @@ -1,4 +0,0 @@ -if __name__ == '__main__': - from nominatim import cli - - exit(cli.nominatim(module_dir=None, osm2pgsql_path=None)) diff --git a/nominatim/clicmd/__init__.py b/nominatim/clicmd/__init__.py deleted file mode 100644 index c8de68c1..00000000 --- a/nominatim/clicmd/__init__.py +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -# -# This file is part of Nominatim. (https://nominatim.org) -# -# Copyright (C) 2023 by the Nominatim developer community. -# For a full list of authors see the git log. -""" -Subcommand definitions for the command-line tool. -""" -# mypy and pylint disagree about the style of explicit exports, -# see https://github.com/PyCQA/pylint/issues/6006. -# pylint: disable=useless-import-alias - -from nominatim.clicmd.setup import SetupAll as SetupAll -from nominatim.clicmd.replication import UpdateReplication as UpdateReplication -from nominatim.clicmd.api import (APISearch as APISearch, - APIReverse as APIReverse, - APILookup as APILookup, - APIDetails as APIDetails, - APIStatus as APIStatus) -from nominatim.clicmd.index import UpdateIndex as UpdateIndex -from nominatim.clicmd.refresh import UpdateRefresh as UpdateRefresh -from nominatim.clicmd.add_data import UpdateAddData as UpdateAddData -from nominatim.clicmd.admin import AdminFuncs as AdminFuncs -from nominatim.clicmd.freeze import SetupFreeze as SetupFreeze -from nominatim.clicmd.special_phrases import ImportSpecialPhrases as ImportSpecialPhrases -from nominatim.clicmd.export import QueryExport as QueryExport -from nominatim.clicmd.convert import ConvertDB as ConvertDB diff --git a/nominatim/paths.py b/nominatim/paths.py deleted file mode 100644 index a34628df..00000000 --- a/nominatim/paths.py +++ /dev/null @@ -1,15 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -# -# This file is part of Nominatim. (https://nominatim.org) -# -# Copyright (C) 2022 by the Nominatim developer community. -# For a full list of authors see the git log. -""" -Path settings for extra data used by Nominatim. -""" -from pathlib import Path - -PHPLIB_DIR = (Path(__file__) / '..' / '..' / 'lib-php').resolve() -SQLLIB_DIR = (Path(__file__) / '..' / '..' / 'lib-sql').resolve() -DATA_DIR = (Path(__file__) / '..' / '..' / 'data').resolve() -CONFIG_DIR = (Path(__file__) / '..' / '..' / 'settings').resolve() diff --git a/nominatim/api/__init__.py b/src/nominatim_api/__init__.py similarity index 96% rename from nominatim/api/__init__.py rename to src/nominatim_api/__init__.py index 9e3d6a1d..02cde0b2 100644 --- a/nominatim/api/__init__.py +++ b/src/nominatim_api/__init__.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ The public interface of the Nominatim library. diff --git a/nominatim/api/connection.py b/src/nominatim_api/connection.py similarity index 94% rename from nominatim/api/connection.py rename to src/nominatim_api/connection.py index 405213e9..66b00ac8 100644 --- a/nominatim/api/connection.py +++ b/src/nominatim_api/connection.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Extended SQLAlchemy connection class that also includes access to the schema. @@ -14,16 +14,16 @@ import asyncio import sqlalchemy as sa from sqlalchemy.ext.asyncio import AsyncConnection -from nominatim.typing import SaFromClause -from nominatim.db.sqlalchemy_schema import SearchTables -from nominatim.db.sqlalchemy_types import Geometry -from nominatim.api.logging import log +from nominatim_core.typing import SaFromClause +from nominatim_core.db.sqlalchemy_schema import SearchTables +from nominatim_core.db.sqlalchemy_types import Geometry +from .logging import log T = TypeVar('T') class SearchConnection: """ An extended SQLAlchemy connection class, that also contains - then table definitions. The underlying asynchronous SQLAlchemy + the table definitions. The underlying asynchronous SQLAlchemy connection can be accessed with the 'connection' property. The 't' property is the collection of Nominatim tables. """ diff --git a/nominatim/api/core.py b/src/nominatim_api/core.py similarity index 98% rename from nominatim/api/core.py rename to src/nominatim_api/core.py index 333833b0..6f91e7a8 100644 --- a/nominatim/api/core.py +++ b/src/nominatim_api/core.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Implementation of classes for API access via libraries. @@ -16,18 +16,18 @@ from pathlib import Path import sqlalchemy as sa import sqlalchemy.ext.asyncio as sa_asyncio -from nominatim.errors import UsageError -from nominatim.db.sqlalchemy_schema import SearchTables -from nominatim.db.async_core_library import PGCORE_LIB, PGCORE_ERROR -import nominatim.db.sqlite_functions -from nominatim.config import Configuration -from nominatim.api.connection import SearchConnection -from nominatim.api.status import get_status, StatusResult -from nominatim.api.lookup import get_detailed_place, get_simple_place -from nominatim.api.reverse import ReverseGeocoder -from nominatim.api.search import ForwardGeocoder, Phrase, PhraseType, make_query_analyzer -import nominatim.api.types as ntyp -from nominatim.api.results import DetailedResult, ReverseResult, SearchResults +from nominatim_core.errors import UsageError +from nominatim_core.db.sqlalchemy_schema import SearchTables +from nominatim_core.db.async_core_library import PGCORE_LIB, PGCORE_ERROR +from nominatim_core.config import Configuration +from .sql import sqlite_functions, sqlalchemy_functions #pylint: disable=unused-import +from .connection import SearchConnection +from .status import get_status, StatusResult +from .lookup import get_detailed_place, get_simple_place +from .reverse import ReverseGeocoder +from .search import ForwardGeocoder, Phrase, PhraseType, make_query_analyzer +from . import types as ntyp +from .results import DetailedResult, ReverseResult, SearchResults class NominatimAPIAsync: #pylint: disable=too-many-instance-attributes @@ -127,7 +127,7 @@ class NominatimAPIAsync: #pylint: disable=too-many-instance-attributes @sa.event.listens_for(engine.sync_engine, "connect") def _on_sqlite_connect(dbapi_con: Any, _: Any) -> None: dbapi_con.run_async(lambda conn: conn.enable_load_extension(True)) - nominatim.db.sqlite_functions.install_custom_functions(dbapi_con) + sqlite_functions.install_custom_functions(dbapi_con) cursor = dbapi_con.cursor() cursor.execute("SELECT load_extension('mod_spatialite')") cursor.execute('SELECT SetDecimalPrecision(7)') diff --git a/nominatim/api/localization.py b/src/nominatim_api/localization.py similarity index 98% rename from nominatim/api/localization.py rename to src/nominatim_api/localization.py index 09fe27c5..5964bbee 100644 --- a/nominatim/api/localization.py +++ b/src/nominatim_api/localization.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Helper functions for localizing names of results. diff --git a/nominatim/api/logging.py b/src/nominatim_api/logging.py similarity index 99% rename from nominatim/api/logging.py rename to src/nominatim_api/logging.py index 30999a3f..7df36ec1 100644 --- a/nominatim/api/logging.py +++ b/src/nominatim_api/logging.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Functions for specialised logging with HTML output. diff --git a/nominatim/api/lookup.py b/src/nominatim_api/lookup.py similarity index 97% rename from nominatim/api/lookup.py rename to src/nominatim_api/lookup.py index 402b8531..e451edbe 100644 --- a/nominatim/api/lookup.py +++ b/src/nominatim_api/lookup.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Implementation of place lookup by ID. @@ -12,18 +12,17 @@ import datetime as dt import sqlalchemy as sa -from nominatim.typing import SaColumn, SaRow, SaSelect -from nominatim.api.connection import SearchConnection -import nominatim.api.types as ntyp -import nominatim.api.results as nres -from nominatim.api.logging import log +from nominatim_core.typing import SaColumn, SaRow, SaSelect +from .connection import SearchConnection +from .logging import log +from . import types as ntyp +from . import results as nres RowFunc = Callable[[Optional[SaRow], Type[nres.BaseResultT]], Optional[nres.BaseResultT]] GeomFunc = Callable[[SaSelect, SaColumn], SaSelect] - async def find_in_placex(conn: SearchConnection, place: ntyp.PlaceRef, add_geometries: GeomFunc) -> Optional[SaRow]: """ Search for the given place in the placex table and return the diff --git a/nominatim/__init__.py b/src/nominatim_api/py.typed similarity index 100% rename from nominatim/__init__.py rename to src/nominatim_api/py.typed diff --git a/nominatim/api/result_formatting.py b/src/nominatim_api/result_formatting.py similarity index 94% rename from nominatim/api/result_formatting.py rename to src/nominatim_api/result_formatting.py index 4670a1d6..fc22fc0f 100644 --- a/nominatim/api/result_formatting.py +++ b/src/nominatim_api/result_formatting.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Helper classes and functions for formatting results into API responses. diff --git a/nominatim/api/results.py b/src/nominatim_api/results.py similarity index 98% rename from nominatim/api/results.py rename to src/nominatim_api/results.py index 47fb8511..4256e0b7 100644 --- a/nominatim/api/results.py +++ b/src/nominatim_api/results.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Dataclasses for search results and helper functions to fill them. @@ -18,12 +18,12 @@ import datetime as dt import sqlalchemy as sa -from nominatim.typing import SaSelect, SaRow -from nominatim.db.sqlalchemy_types import Geometry -from nominatim.api.types import Point, Bbox, LookupDetails -from nominatim.api.connection import SearchConnection -from nominatim.api.logging import log -from nominatim.api.localization import Locales +from nominatim_core.typing import SaSelect, SaRow +from nominatim_core.db.sqlalchemy_types import Geometry +from .types import Point, Bbox, LookupDetails +from .connection import SearchConnection +from .logging import log +from .localization import Locales # This file defines complex result data classes. # pylint: disable=too-many-instance-attributes diff --git a/nominatim/api/reverse.py b/src/nominatim_api/reverse.py similarity index 98% rename from nominatim/api/reverse.py rename to src/nominatim_api/reverse.py index 54714559..83b0983a 100644 --- a/nominatim/api/reverse.py +++ b/src/nominatim_api/reverse.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Implementation of reverse geocoding. @@ -12,13 +12,13 @@ import functools import sqlalchemy as sa -from nominatim.typing import SaColumn, SaSelect, SaFromClause, SaLabel, SaRow,\ - SaBind, SaLambdaSelect -from nominatim.api.connection import SearchConnection -import nominatim.api.results as nres -from nominatim.api.logging import log -from nominatim.api.types import AnyPoint, DataLayer, ReverseDetails, GeometryFormat, Bbox -from nominatim.db.sqlalchemy_types import Geometry +from nominatim_core.typing import SaColumn, SaSelect, SaFromClause, SaLabel, SaRow,\ + SaBind, SaLambdaSelect +from nominatim_core.db.sqlalchemy_types import Geometry +from .connection import SearchConnection +from . import results as nres +from .logging import log +from .types import AnyPoint, DataLayer, ReverseDetails, GeometryFormat, Bbox # In SQLAlchemy expression which compare with NULL need to be expressed with # the equal sign. diff --git a/nominatim/api/search/__init__.py b/src/nominatim_api/search/__init__.py similarity index 88% rename from nominatim/api/search/__init__.py rename to src/nominatim_api/search/__init__.py index f60cbe1e..91be4253 100644 --- a/nominatim/api/search/__init__.py +++ b/src/nominatim_api/search/__init__.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Module for forward search. diff --git a/nominatim/api/search/db_search_builder.py b/src/nominatim_api/search/db_search_builder.py similarity index 97% rename from nominatim/api/search/db_search_builder.py rename to src/nominatim_api/search/db_search_builder.py index c2f98c47..29a853a0 100644 --- a/nominatim/api/search/db_search_builder.py +++ b/src/nominatim_api/search/db_search_builder.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Conversion from token assignment to an abstract DB search. @@ -10,12 +10,12 @@ Conversion from token assignment to an abstract DB search. from typing import Optional, List, Tuple, Iterator, Dict import heapq -from nominatim.api.types import SearchDetails, DataLayer -from nominatim.api.search.query import QueryStruct, Token, TokenType, TokenRange, BreakType -from nominatim.api.search.token_assignment import TokenAssignment -import nominatim.api.search.db_search_fields as dbf -import nominatim.api.search.db_searches as dbs -import nominatim.api.search.db_search_lookups as lookups +from ..types import SearchDetails, DataLayer +from .query import QueryStruct, Token, TokenType, TokenRange, BreakType +from .token_assignment import TokenAssignment +from . import db_search_fields as dbf +from . import db_searches as dbs +from . import db_search_lookups as lookups def wrap_near_search(categories: List[Tuple[str, str]], diff --git a/nominatim/api/search/db_search_fields.py b/src/nominatim_api/search/db_search_fields.py similarity index 96% rename from nominatim/api/search/db_search_fields.py rename to src/nominatim_api/search/db_search_fields.py index 7f775277..df2b32a7 100644 --- a/nominatim/api/search/db_search_fields.py +++ b/src/nominatim_api/search/db_search_fields.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Data structures for more complex fields in abstract search descriptions. @@ -12,10 +12,10 @@ import dataclasses import sqlalchemy as sa -from nominatim.typing import SaFromClause, SaColumn, SaExpression -from nominatim.api.search.query import Token -import nominatim.api.search.db_search_lookups as lookups -from nominatim.utils.json_writer import JsonWriter +from nominatim_core.typing import SaFromClause, SaColumn, SaExpression +from .query import Token +from . import db_search_lookups as lookups +from nominatim_core.utils.json_writer import JsonWriter @dataclasses.dataclass diff --git a/nominatim/api/search/db_search_lookups.py b/src/nominatim_api/search/db_search_lookups.py similarity index 96% rename from nominatim/api/search/db_search_lookups.py rename to src/nominatim_api/search/db_search_lookups.py index aa5cef5f..faabd827 100644 --- a/nominatim/api/search/db_search_lookups.py +++ b/src/nominatim_api/search/db_search_lookups.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Implementation of lookup functions for the search_name table. @@ -12,8 +12,8 @@ from typing import List, Any import sqlalchemy as sa from sqlalchemy.ext.compiler import compiles -from nominatim.typing import SaFromClause -from nominatim.db.sqlalchemy_types import IntArray +from nominatim_core.typing import SaFromClause +from nominatim_core.db.sqlalchemy_types import IntArray # pylint: disable=consider-using-f-string diff --git a/nominatim/api/search/db_searches.py b/src/nominatim_api/search/db_searches.py similarity index 98% rename from nominatim/api/search/db_searches.py rename to src/nominatim_api/search/db_searches.py index d74812e6..f5c43146 100644 --- a/nominatim/api/search/db_searches.py +++ b/src/nominatim_api/search/db_searches.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Implementation of the actual database accesses for forward search. @@ -12,13 +12,13 @@ import abc import sqlalchemy as sa -from nominatim.typing import SaFromClause, SaScalarSelect, SaColumn, \ - SaExpression, SaSelect, SaLambdaSelect, SaRow, SaBind -from nominatim.api.connection import SearchConnection -from nominatim.api.types import SearchDetails, DataLayer, GeometryFormat, Bbox -import nominatim.api.results as nres -from nominatim.api.search.db_search_fields import SearchData, WeightedCategories -from nominatim.db.sqlalchemy_types import Geometry, IntArray +from nominatim_core.typing import SaFromClause, SaScalarSelect, SaColumn, \ + SaExpression, SaSelect, SaLambdaSelect, SaRow, SaBind +from nominatim_core.db.sqlalchemy_types import Geometry, IntArray +from ..connection import SearchConnection +from ..types import SearchDetails, DataLayer, GeometryFormat, Bbox +from .. import results as nres +from .db_search_fields import SearchData, WeightedCategories #pylint: disable=singleton-comparison,not-callable #pylint: disable=too-many-branches,too-many-arguments,too-many-locals,too-many-statements diff --git a/nominatim/api/search/geocoder.py b/src/nominatim_api/search/geocoder.py similarity index 94% rename from nominatim/api/search/geocoder.py rename to src/nominatim_api/search/geocoder.py index 775606aa..b5fd1f00 100644 --- a/nominatim/api/search/geocoder.py +++ b/src/nominatim_api/search/geocoder.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Public interface to the search code. @@ -13,15 +13,15 @@ import re import datetime as dt import difflib -from nominatim.api.connection import SearchConnection -from nominatim.api.types import SearchDetails -from nominatim.api.results import SearchResult, SearchResults, add_result_details -from nominatim.api.search.token_assignment import yield_token_assignments -from nominatim.api.search.db_search_builder import SearchBuilder, build_poi_search, wrap_near_search -from nominatim.api.search.db_searches import AbstractSearch -from nominatim.api.search.query_analyzer_factory import make_query_analyzer, AbstractQueryAnalyzer -from nominatim.api.search.query import Phrase, QueryStruct -from nominatim.api.logging import log +from ..connection import SearchConnection +from ..types import SearchDetails +from ..results import SearchResult, SearchResults, add_result_details +from ..logging import log +from .token_assignment import yield_token_assignments +from .db_search_builder import SearchBuilder, build_poi_search, wrap_near_search +from .db_searches import AbstractSearch +from .query_analyzer_factory import make_query_analyzer, AbstractQueryAnalyzer +from .query import Phrase, QueryStruct class ForwardGeocoder: """ Main class responsible for place search. diff --git a/nominatim/api/search/icu_tokenizer.py b/src/nominatim_api/search/icu_tokenizer.py similarity index 97% rename from nominatim/api/search/icu_tokenizer.py rename to src/nominatim_api/search/icu_tokenizer.py index eb90c122..42665679 100644 --- a/nominatim/api/search/icu_tokenizer.py +++ b/src/nominatim_api/search/icu_tokenizer.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Implementation of query analysis for the ICU tokenizer. @@ -16,12 +16,12 @@ from icu import Transliterator import sqlalchemy as sa -from nominatim.typing import SaRow -from nominatim.api.connection import SearchConnection -from nominatim.api.logging import log -from nominatim.api.search import query as qmod -from nominatim.api.search.query_analyzer_factory import AbstractQueryAnalyzer -from nominatim.db.sqlalchemy_types import Json +from nominatim_core.typing import SaRow +from nominatim_core.db.sqlalchemy_types import Json +from ..connection import SearchConnection +from ..logging import log +from ..search import query as qmod +from ..search.query_analyzer_factory import AbstractQueryAnalyzer DB_TO_TOKEN_TYPE = { diff --git a/nominatim/api/search/legacy_tokenizer.py b/src/nominatim_api/search/legacy_tokenizer.py similarity index 97% rename from nominatim/api/search/legacy_tokenizer.py rename to src/nominatim_api/search/legacy_tokenizer.py index 031f2456..b49d3ae6 100644 --- a/nominatim/api/search/legacy_tokenizer.py +++ b/src/nominatim_api/search/legacy_tokenizer.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Implementation of query analysis for the legacy tokenizer. @@ -14,11 +14,11 @@ import dataclasses import sqlalchemy as sa -from nominatim.typing import SaRow -from nominatim.api.connection import SearchConnection -from nominatim.api.logging import log -from nominatim.api.search import query as qmod -from nominatim.api.search.query_analyzer_factory import AbstractQueryAnalyzer +from nominatim_core.typing import SaRow +from ..connection import SearchConnection +from ..logging import log +from . import query as qmod +from .query_analyzer_factory import AbstractQueryAnalyzer def yield_words(terms: List[str], start: int) -> Iterator[Tuple[str, qmod.TokenRange]]: """ Return all combinations of words in the terms list after the diff --git a/nominatim/api/search/query.py b/src/nominatim_api/search/query.py similarity index 99% rename from nominatim/api/search/query.py rename to src/nominatim_api/search/query.py index a0d7add1..04b7f1b8 100644 --- a/nominatim/api/search/query.py +++ b/src/nominatim_api/search/query.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Datastructures for a tokenized query. diff --git a/nominatim/api/search/query_analyzer_factory.py b/src/nominatim_api/search/query_analyzer_factory.py similarity index 88% rename from nominatim/api/search/query_analyzer_factory.py rename to src/nominatim_api/search/query_analyzer_factory.py index 3666b7fc..ec8154ef 100644 --- a/nominatim/api/search/query_analyzer_factory.py +++ b/src/nominatim_api/search/query_analyzer_factory.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Factory for creating a query analyzer for the configured tokenizer. @@ -12,11 +12,11 @@ from abc import ABC, abstractmethod from pathlib import Path import importlib -from nominatim.api.logging import log -from nominatim.api.connection import SearchConnection +from ..logging import log +from ..connection import SearchConnection if TYPE_CHECKING: - from nominatim.api.search.query import Phrase, QueryStruct + from .query import Phrase, QueryStruct class AbstractQueryAnalyzer(ABC): """ Class for analysing incoming queries. diff --git a/nominatim/api/search/token_assignment.py b/src/nominatim_api/search/token_assignment.py similarity index 99% rename from nominatim/api/search/token_assignment.py rename to src/nominatim_api/search/token_assignment.py index 95eb7f70..5ac63d6f 100644 --- a/nominatim/api/search/token_assignment.py +++ b/src/nominatim_api/search/token_assignment.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Create query interpretations where each vertice in the query is assigned @@ -11,8 +11,8 @@ a specific function (expressed as a token type). from typing import Optional, List, Iterator import dataclasses -import nominatim.api.search.query as qmod -from nominatim.api.logging import log +from ..logging import log +from . import query as qmod # pylint: disable=too-many-return-statements,too-many-branches diff --git a/nominatim/data/__init__.py b/src/nominatim_api/server/__init__.py similarity index 100% rename from nominatim/data/__init__.py rename to src/nominatim_api/server/__init__.py diff --git a/nominatim/db/__init__.py b/src/nominatim_api/server/falcon/__init__.py similarity index 100% rename from nominatim/db/__init__.py rename to src/nominatim_api/server/falcon/__init__.py diff --git a/nominatim/server/falcon/server.py b/src/nominatim_api/server/falcon/server.py similarity index 96% rename from nominatim/server/falcon/server.py rename to src/nominatim_api/server/falcon/server.py index bdae3507..851b0964 100644 --- a/nominatim/server/falcon/server.py +++ b/src/nominatim_api/server/falcon/server.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Server implementation using the falcon webserver framework. @@ -14,10 +14,10 @@ import asyncio from falcon.asgi import App, Request, Response -from nominatim.api import NominatimAPIAsync -import nominatim.api.v1 as api_impl -import nominatim.api.logging as loglib -from nominatim.config import Configuration +from nominatim_core.config import Configuration +from ...core import NominatimAPIAsync +from ... import v1 as api_impl +from ... import logging as loglib class HTTPNominatimError(Exception): """ A special exception class for errors raised during processing. diff --git a/nominatim/indexer/__init__.py b/src/nominatim_api/server/starlette/__init__.py similarity index 100% rename from nominatim/indexer/__init__.py rename to src/nominatim_api/server/starlette/__init__.py diff --git a/nominatim/server/starlette/server.py b/src/nominatim_api/server/starlette/server.py similarity index 95% rename from nominatim/server/starlette/server.py rename to src/nominatim_api/server/starlette/server.py index c9828991..dd35cd6e 100644 --- a/nominatim/server/starlette/server.py +++ b/src/nominatim_api/server/starlette/server.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Server implementation using the starlette webserver framework. @@ -21,10 +21,10 @@ from starlette.middleware import Middleware from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint from starlette.middleware.cors import CORSMiddleware -from nominatim.api import NominatimAPIAsync -import nominatim.api.v1 as api_impl -import nominatim.api.logging as loglib -from nominatim.config import Configuration +from nominatim_core.config import Configuration +from ...core import NominatimAPIAsync +from ... import v1 as api_impl +from ... import logging as loglib class ParamWrapper(api_impl.ASGIAdaptor): """ Adaptor class for server glue to Starlette framework. diff --git a/nominatim/db/sqlalchemy_functions.py b/src/nominatim_api/sql/sqlalchemy_functions.py similarity index 98% rename from nominatim/db/sqlalchemy_functions.py rename to src/nominatim_api/sql/sqlalchemy_functions.py index f576d32f..40202749 100644 --- a/nominatim/db/sqlalchemy_functions.py +++ b/src/nominatim_api/sql/sqlalchemy_functions.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Custom functions and expressions for SQLAlchemy. @@ -13,7 +13,7 @@ from typing import Any import sqlalchemy as sa from sqlalchemy.ext.compiler import compiles -from nominatim.typing import SaColumn +from nominatim_core.typing import SaColumn # pylint: disable=all diff --git a/nominatim/db/sqlite_functions.py b/src/nominatim_api/sql/sqlite_functions.py similarity index 98% rename from nominatim/db/sqlite_functions.py rename to src/nominatim_api/sql/sqlite_functions.py index a56c04ed..43865e95 100644 --- a/nominatim/db/sqlite_functions.py +++ b/src/nominatim_api/sql/sqlite_functions.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Custom functions for SQLite. diff --git a/nominatim/api/status.py b/src/nominatim_api/status.py similarity index 71% rename from nominatim/api/status.py rename to src/nominatim_api/status.py index 1069184c..ea88a467 100644 --- a/nominatim/api/status.py +++ b/src/nominatim_api/status.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Classes and function related to status call. @@ -13,8 +13,8 @@ import dataclasses import sqlalchemy as sa -from nominatim.api.connection import SearchConnection -from nominatim import version +from .connection import SearchConnection +from .version import NOMINATIM_API_VERSION @dataclasses.dataclass class StatusResult: @@ -22,9 +22,9 @@ class StatusResult: """ status: int message: str - software_version = version.NOMINATIM_VERSION + software_version = NOMINATIM_API_VERSION data_updated: Optional[dt.datetime] = None - database_version: Optional[version.NominatimVersion] = None + database_version: Optional[str] = None async def get_status(conn: SearchConnection) -> StatusResult: @@ -44,8 +44,7 @@ async def get_status(conn: SearchConnection) -> StatusResult: # Database version try: - verstr = await conn.get_property('database_version') - status.database_version = version.parse_version(verstr) + status.database_version = await conn.get_property('database_version') except ValueError: pass diff --git a/nominatim/api/types.py b/src/nominatim_api/types.py similarity index 99% rename from nominatim/api/types.py rename to src/nominatim_api/types.py index e93015fc..f2ad4f35 100644 --- a/nominatim/api/types.py +++ b/src/nominatim_api/types.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Complex datatypes used by the Nominatim API. @@ -16,8 +16,8 @@ import math from struct import unpack from binascii import unhexlify -from nominatim.errors import UsageError -from nominatim.api.localization import Locales +from nominatim_core.errors import UsageError +from .localization import Locales # pylint: disable=no-member,too-many-boolean-expressions,too-many-instance-attributes diff --git a/nominatim/api/v1/__init__.py b/src/nominatim_api/v1/__init__.py similarity index 51% rename from nominatim/api/v1/__init__.py rename to src/nominatim_api/v1/__init__.py index 8c00af2d..87e8e1c5 100644 --- a/nominatim/api/v1/__init__.py +++ b/src/nominatim_api/v1/__init__.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Implementation of API version v1 (aka the legacy version). @@ -10,11 +10,11 @@ Implementation of API version v1 (aka the legacy version). #pylint: disable=useless-import-alias -from nominatim.api.v1.server_glue import (ASGIAdaptor as ASGIAdaptor, - EndpointFunc as EndpointFunc, - ROUTES as ROUTES) +from .server_glue import (ASGIAdaptor as ASGIAdaptor, + EndpointFunc as EndpointFunc, + ROUTES as ROUTES) -import nominatim.api.v1.format as _format +from . import format as _format list_formats = _format.dispatch.list_formats supports_format = _format.dispatch.supports_format diff --git a/nominatim/api/v1/classtypes.py b/src/nominatim_api/v1/classtypes.py similarity index 96% rename from nominatim/api/v1/classtypes.py rename to src/nominatim_api/v1/classtypes.py index b85d5401..66708593 100644 --- a/nominatim/api/v1/classtypes.py +++ b/src/nominatim_api/v1/classtypes.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Hard-coded information about tag categories. @@ -12,7 +12,8 @@ version a more flexible formatting is required. """ from typing import Tuple, Optional, Mapping, Union -import nominatim.api as napi +from ..results import ReverseResult, SearchResult +from ..types import Bbox def get_label_tag(category: Tuple[str, str], extratags: Optional[Mapping[str, str]], rank: int, country: Optional[str]) -> str: @@ -41,7 +42,7 @@ def get_label_tag(category: Tuple[str, str], extratags: Optional[Mapping[str, st return label.lower().replace(' ', '_') -def bbox_from_result(result: Union[napi.ReverseResult, napi.SearchResult]) -> napi.Bbox: +def bbox_from_result(result: Union[ReverseResult, SearchResult]) -> Bbox: """ Compute a bounding box for the result. For ways and relations a given boundingbox is used. For all other object, a box is computed around the centroid according to dimensions derived from the @@ -49,7 +50,7 @@ def bbox_from_result(result: Union[napi.ReverseResult, napi.SearchResult]) -> na """ if (result.osm_object and result.osm_object[0] == 'N') or result.bbox is None: extent = NODE_EXTENT.get(result.category, 0.00005) - return napi.Bbox.from_point(result.centroid, extent) + return Bbox.from_point(result.centroid, extent) return result.bbox diff --git a/nominatim/api/v1/format.py b/src/nominatim_api/v1/format.py similarity index 76% rename from nominatim/api/v1/format.py rename to src/nominatim_api/v1/format.py index 53156fdd..d8faa482 100644 --- a/nominatim/api/v1/format.py +++ b/src/nominatim_api/v1/format.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Output formatters for API version v1. @@ -11,11 +11,14 @@ from typing import List, Dict, Mapping, Any import collections import datetime as dt -import nominatim.api as napi -from nominatim.api.result_formatting import FormatDispatcher -from nominatim.api.v1.classtypes import ICONS -from nominatim.api.v1 import format_json, format_xml -from nominatim.utils.json_writer import JsonWriter +from nominatim_core.utils.json_writer import JsonWriter +from ..status import StatusResult +from ..results import DetailedResult, ReverseResults, SearchResults, \ + AddressLines, AddressLine +from ..localization import Locales +from ..result_formatting import FormatDispatcher +from .classtypes import ICONS +from . import format_json, format_xml class RawDataList(List[Dict[str, Any]]): """ Data type for formatting raw data lists 'as is' in json. @@ -23,16 +26,16 @@ class RawDataList(List[Dict[str, Any]]): dispatch = FormatDispatcher() -@dispatch.format_func(napi.StatusResult, 'text') -def _format_status_text(result: napi.StatusResult, _: Mapping[str, Any]) -> str: +@dispatch.format_func(StatusResult, 'text') +def _format_status_text(result: StatusResult, _: Mapping[str, Any]) -> str: if result.status: return f"ERROR: {result.message}" return 'OK' -@dispatch.format_func(napi.StatusResult, 'json') -def _format_status_json(result: napi.StatusResult, _: Mapping[str, Any]) -> str: +@dispatch.format_func(StatusResult, 'json') +def _format_status_json(result: StatusResult, _: Mapping[str, Any]) -> str: out = JsonWriter() out.start_object()\ @@ -47,8 +50,8 @@ def _format_status_json(result: napi.StatusResult, _: Mapping[str, Any]) -> str: return out() -def _add_address_row(writer: JsonWriter, row: napi.AddressLine, - locales: napi.Locales) -> None: +def _add_address_row(writer: JsonWriter, row: AddressLine, + locales: Locales) -> None: writer.start_object()\ .keyval('localname', locales.display_name(row.names))\ .keyval_not_none('place_id', row.place_id) @@ -69,8 +72,8 @@ def _add_address_row(writer: JsonWriter, row: napi.AddressLine, .end_object() -def _add_address_rows(writer: JsonWriter, section: str, rows: napi.AddressLines, - locales: napi.Locales) -> None: +def _add_address_rows(writer: JsonWriter, section: str, rows: AddressLines, + locales: Locales) -> None: writer.key(section).start_array() for row in rows: _add_address_row(writer, row, locales) @@ -78,8 +81,8 @@ def _add_address_rows(writer: JsonWriter, section: str, rows: napi.AddressLines, writer.end_array().next() -def _add_parent_rows_grouped(writer: JsonWriter, rows: napi.AddressLines, - locales: napi.Locales) -> None: +def _add_parent_rows_grouped(writer: JsonWriter, rows: AddressLines, + locales: Locales) -> None: # group by category type data = collections.defaultdict(list) for row in rows: @@ -98,9 +101,9 @@ def _add_parent_rows_grouped(writer: JsonWriter, rows: napi.AddressLines, writer.end_object().next() -@dispatch.format_func(napi.DetailedResult, 'json') -def _format_details_json(result: napi.DetailedResult, options: Mapping[str, Any]) -> str: - locales = options.get('locales', napi.Locales()) +@dispatch.format_func(DetailedResult, 'json') +def _format_details_json(result: DetailedResult, options: Mapping[str, Any]) -> str: + locales = options.get('locales', Locales()) geom = result.geometry.get('geojson') centroid = result.centroid.to_geojson() @@ -169,41 +172,41 @@ def _format_details_json(result: napi.DetailedResult, options: Mapping[str, Any] return out() -@dispatch.format_func(napi.ReverseResults, 'xml') -def _format_reverse_xml(results: napi.ReverseResults, options: Mapping[str, Any]) -> str: +@dispatch.format_func(ReverseResults, 'xml') +def _format_reverse_xml(results: ReverseResults, options: Mapping[str, Any]) -> str: return format_xml.format_base_xml(results, options, True, 'reversegeocode', {'querystring': options.get('query', '')}) -@dispatch.format_func(napi.ReverseResults, 'geojson') -def _format_reverse_geojson(results: napi.ReverseResults, +@dispatch.format_func(ReverseResults, 'geojson') +def _format_reverse_geojson(results: ReverseResults, options: Mapping[str, Any]) -> str: return format_json.format_base_geojson(results, options, True) -@dispatch.format_func(napi.ReverseResults, 'geocodejson') -def _format_reverse_geocodejson(results: napi.ReverseResults, +@dispatch.format_func(ReverseResults, 'geocodejson') +def _format_reverse_geocodejson(results: ReverseResults, options: Mapping[str, Any]) -> str: return format_json.format_base_geocodejson(results, options, True) -@dispatch.format_func(napi.ReverseResults, 'json') -def _format_reverse_json(results: napi.ReverseResults, +@dispatch.format_func(ReverseResults, 'json') +def _format_reverse_json(results: ReverseResults, options: Mapping[str, Any]) -> str: return format_json.format_base_json(results, options, True, class_label='class') -@dispatch.format_func(napi.ReverseResults, 'jsonv2') -def _format_reverse_jsonv2(results: napi.ReverseResults, +@dispatch.format_func(ReverseResults, 'jsonv2') +def _format_reverse_jsonv2(results: ReverseResults, options: Mapping[str, Any]) -> str: return format_json.format_base_json(results, options, True, class_label='category') -@dispatch.format_func(napi.SearchResults, 'xml') -def _format_search_xml(results: napi.SearchResults, options: Mapping[str, Any]) -> str: +@dispatch.format_func(SearchResults, 'xml') +def _format_search_xml(results: SearchResults, options: Mapping[str, Any]) -> str: extra = {'querystring': options.get('query', '')} for attr in ('more_url', 'exclude_place_ids', 'viewbox'): if options.get(attr): @@ -213,27 +216,27 @@ def _format_search_xml(results: napi.SearchResults, options: Mapping[str, Any]) -@dispatch.format_func(napi.SearchResults, 'geojson') -def _format_search_geojson(results: napi.SearchResults, +@dispatch.format_func(SearchResults, 'geojson') +def _format_search_geojson(results: SearchResults, options: Mapping[str, Any]) -> str: return format_json.format_base_geojson(results, options, False) -@dispatch.format_func(napi.SearchResults, 'geocodejson') -def _format_search_geocodejson(results: napi.SearchResults, +@dispatch.format_func(SearchResults, 'geocodejson') +def _format_search_geocodejson(results: SearchResults, options: Mapping[str, Any]) -> str: return format_json.format_base_geocodejson(results, options, False) -@dispatch.format_func(napi.SearchResults, 'json') -def _format_search_json(results: napi.SearchResults, +@dispatch.format_func(SearchResults, 'json') +def _format_search_json(results: SearchResults, options: Mapping[str, Any]) -> str: return format_json.format_base_json(results, options, False, class_label='class') -@dispatch.format_func(napi.SearchResults, 'jsonv2') -def _format_search_jsonv2(results: napi.SearchResults, +@dispatch.format_func(SearchResults, 'jsonv2') +def _format_search_jsonv2(results: SearchResults, options: Mapping[str, Any]) -> str: return format_json.format_base_json(results, options, False, class_label='category') diff --git a/nominatim/api/v1/format_json.py b/src/nominatim_api/v1/format_json.py similarity index 94% rename from nominatim/api/v1/format_json.py rename to src/nominatim_api/v1/format_json.py index 1c17a032..2c50dec4 100644 --- a/nominatim/api/v1/format_json.py +++ b/src/nominatim_api/v1/format_json.py @@ -2,16 +2,16 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Helper functions for output of results in json formats. """ from typing import Mapping, Any, Optional, Tuple, Union -import nominatim.api as napi -import nominatim.api.v1.classtypes as cl -from nominatim.utils.json_writer import JsonWriter +from nominatim_core.utils.json_writer import JsonWriter +from ..results import AddressLines, ReverseResults, SearchResults +from . import classtypes as cl #pylint: disable=too-many-branches @@ -21,7 +21,7 @@ def _write_osm_id(out: JsonWriter, osm_object: Optional[Tuple[str, int]]) -> Non .keyval('osm_id', osm_object[1]) -def _write_typed_address(out: JsonWriter, address: Optional[napi.AddressLines], +def _write_typed_address(out: JsonWriter, address: Optional[AddressLines], country_code: Optional[str]) -> None: parts = {} for line in (address or []): @@ -42,7 +42,7 @@ def _write_typed_address(out: JsonWriter, address: Optional[napi.AddressLines], def _write_geocodejson_address(out: JsonWriter, - address: Optional[napi.AddressLines], + address: Optional[AddressLines], obj_place_id: Optional[int], country_code: Optional[str]) -> None: extra = {} @@ -66,7 +66,7 @@ def _write_geocodejson_address(out: JsonWriter, out.keyval('country_code', country_code) -def format_base_json(results: Union[napi.ReverseResults, napi.SearchResults], +def format_base_json(results: Union[ReverseResults, SearchResults], options: Mapping[str, Any], simple: bool, class_label: str) -> str: """ Return the result list as a simple json string in custom Nominatim format. @@ -142,7 +142,7 @@ def format_base_json(results: Union[napi.ReverseResults, napi.SearchResults], return out() -def format_base_geojson(results: Union[napi.ReverseResults, napi.SearchResults], +def format_base_geojson(results: Union[ReverseResults, SearchResults], options: Mapping[str, Any], simple: bool) -> str: """ Return the result list as a geojson string. @@ -204,7 +204,7 @@ def format_base_geojson(results: Union[napi.ReverseResults, napi.SearchResults], return out() -def format_base_geocodejson(results: Union[napi.ReverseResults, napi.SearchResults], +def format_base_geocodejson(results: Union[ReverseResults, SearchResults], options: Mapping[str, Any], simple: bool) -> str: """ Return the result list as a geocodejson string. """ diff --git a/nominatim/api/v1/format_xml.py b/src/nominatim_api/v1/format_xml.py similarity index 91% rename from nominatim/api/v1/format_xml.py rename to src/nominatim_api/v1/format_xml.py index c6ea17c0..aafaec35 100644 --- a/nominatim/api/v1/format_xml.py +++ b/src/nominatim_api/v1/format_xml.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Helper functions for output of results in XML format. @@ -11,12 +11,13 @@ from typing import Mapping, Any, Optional, Union import datetime as dt import xml.etree.ElementTree as ET -import nominatim.api as napi -import nominatim.api.v1.classtypes as cl +from ..results import AddressLines, ReverseResult, ReverseResults, \ + SearchResult, SearchResults +from . import classtypes as cl #pylint: disable=too-many-branches -def _write_xml_address(root: ET.Element, address: napi.AddressLines, +def _write_xml_address(root: ET.Element, address: AddressLines, country_code: Optional[str]) -> None: parts = {} for line in address: @@ -36,7 +37,7 @@ def _write_xml_address(root: ET.Element, address: napi.AddressLines, ET.SubElement(root, 'country_code').text = country_code -def _create_base_entry(result: Union[napi.ReverseResult, napi.SearchResult], +def _create_base_entry(result: Union[ReverseResult, SearchResult], root: ET.Element, simple: bool) -> ET.Element: place = ET.SubElement(root, 'result' if simple else 'place') if result.place_id is not None: @@ -82,7 +83,7 @@ def _create_base_entry(result: Union[napi.ReverseResult, napi.SearchResult], return place -def format_base_xml(results: Union[napi.ReverseResults, napi.SearchResults], +def format_base_xml(results: Union[ReverseResults, SearchResults], options: Mapping[str, Any], simple: bool, xml_root_tag: str, xml_extra_info: Mapping[str, str]) -> str: diff --git a/nominatim/api/v1/helpers.py b/src/nominatim_api/v1/helpers.py similarity index 97% rename from nominatim/api/v1/helpers.py rename to src/nominatim_api/v1/helpers.py index ffd06a6a..9c220834 100644 --- a/nominatim/api/v1/helpers.py +++ b/src/nominatim_api/v1/helpers.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Helper function for parsing parameters and and outputting data @@ -12,8 +12,8 @@ from typing import Tuple, Optional, Any, Dict, Iterable from itertools import chain import re -from nominatim.api.results import SearchResult, SearchResults, SourceTable -from nominatim.api.types import SearchDetails, GeometryFormat +from ..results import SearchResult, SearchResults, SourceTable +from ..types import SearchDetails, GeometryFormat REVERSE_MAX_RANKS = [2, 2, 2, # 0-2 Continent/Sea 4, 4, # 3-4 Country diff --git a/nominatim/api/v1/server_glue.py b/src/nominatim_api/v1/server_glue.py similarity index 85% rename from nominatim/api/v1/server_glue.py rename to src/nominatim_api/v1/server_glue.py index f08e8042..67def74e 100644 --- a/nominatim/api/v1/server_glue.py +++ b/src/nominatim_api/v1/server_glue.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Generic part of the server implementation of the v1 API. @@ -17,13 +17,17 @@ from urllib.parse import urlencode import sqlalchemy as sa -from nominatim.errors import UsageError -from nominatim.config import Configuration -import nominatim.api as napi -import nominatim.api.logging as loglib -from nominatim.api.v1.format import dispatch as formatting -from nominatim.api.v1.format import RawDataList -from nominatim.api.v1 import helpers +from nominatim_core.errors import UsageError +from nominatim_core.config import Configuration +from .. import logging as loglib +from ..core import NominatimAPIAsync +from .format import dispatch as formatting +from .format import RawDataList +from ..types import DataLayer, GeometryFormat, PlaceRef, PlaceID, OsmID, Point +from ..status import StatusResult +from ..results import DetailedResult, ReverseResults, SearchResult, SearchResults +from ..localization import Locales +from . import helpers CONTENT_TEXT = 'text/plain; charset=utf-8' CONTENT_XML = 'text/xml; charset=utf-8' @@ -211,16 +215,16 @@ class ASGIAdaptor(abc.ABC): return False - def get_layers(self) -> Optional[napi.DataLayer]: + def get_layers(self) -> Optional[DataLayer]: """ Return a parsed version of the layer parameter. """ param = self.get('layer', None) if param is None: return None - return cast(napi.DataLayer, - reduce(napi.DataLayer.__or__, - (getattr(napi.DataLayer, s.upper()) for s in param.split(',')))) + return cast(DataLayer, + reduce(DataLayer.__or__, + (getattr(DataLayer, s.upper()) for s in param.split(',')))) def parse_format(self, result_type: Type[Any], default: str) -> str: @@ -243,19 +247,19 @@ class ASGIAdaptor(abc.ABC): """ Create details structure from the supplied geometry parameters. """ numgeoms = 0 - output = napi.GeometryFormat.NONE + output = GeometryFormat.NONE if self.get_bool('polygon_geojson', False): - output |= napi.GeometryFormat.GEOJSON + output |= GeometryFormat.GEOJSON numgeoms += 1 if fmt not in ('geojson', 'geocodejson'): if self.get_bool('polygon_text', False): - output |= napi.GeometryFormat.TEXT + output |= GeometryFormat.TEXT numgeoms += 1 if self.get_bool('polygon_kml', False): - output |= napi.GeometryFormat.KML + output |= GeometryFormat.KML numgeoms += 1 if self.get_bool('polygon_svg', False): - output |= napi.GeometryFormat.SVG + output |= GeometryFormat.SVG numgeoms += 1 if numgeoms > self.config().get_int('POLYGON_OUTPUT_MAX_TYPES'): @@ -267,12 +271,12 @@ class ASGIAdaptor(abc.ABC): } -async def status_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> Any: +async def status_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any: """ Server glue for /status endpoint. See API docs for details. """ result = await api.status() - fmt = params.parse_format(napi.StatusResult, 'text') + fmt = params.parse_format(StatusResult, 'text') if fmt == 'text' and result.status: status_code = 500 @@ -283,32 +287,32 @@ async def status_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> A status=status_code) -async def details_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> Any: +async def details_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any: """ Server glue for /details endpoint. See API docs for details. """ - fmt = params.parse_format(napi.DetailedResult, 'json') + fmt = params.parse_format(DetailedResult, 'json') place_id = params.get_int('place_id', 0) - place: napi.PlaceRef + place: PlaceRef if place_id: - place = napi.PlaceID(place_id) + place = PlaceID(place_id) else: osmtype = params.get('osmtype') if osmtype is None: params.raise_error("Missing ID parameter 'place_id' or 'osmtype'.") - place = napi.OsmID(osmtype, params.get_int('osmid'), params.get('class')) + place = OsmID(osmtype, params.get_int('osmid'), params.get('class')) debug = params.setup_debugging() - locales = napi.Locales.from_accept_languages(params.get_accepted_languages()) + locales = Locales.from_accept_languages(params.get_accepted_languages()) result = await api.details(place, address_details=params.get_bool('addressdetails', False), linked_places=params.get_bool('linkedplaces', True), parented_places=params.get_bool('hierarchy', False), keywords=params.get_bool('keywords', False), - geometry_output = napi.GeometryFormat.GEOJSON + geometry_output = GeometryFormat.GEOJSON if params.get_bool('polygon_geojson', False) - else napi.GeometryFormat.NONE, + else GeometryFormat.NONE, locales=locales ) @@ -326,17 +330,17 @@ async def details_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> return params.build_response(output, num_results=1) -async def reverse_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> Any: +async def reverse_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any: """ Server glue for /reverse endpoint. See API docs for details. """ - fmt = params.parse_format(napi.ReverseResults, 'xml') + fmt = params.parse_format(ReverseResults, 'xml') debug = params.setup_debugging() - coord = napi.Point(params.get_float('lon'), params.get_float('lat')) + coord = Point(params.get_float('lon'), params.get_float('lat')) details = params.parse_geometry_details(fmt) details['max_rank'] = helpers.zoom_to_rank(params.get_int('zoom', 18)) details['layers'] = params.get_layers() - details['locales'] = napi.Locales.from_accept_languages(params.get_accepted_languages()) + details['locales'] = Locales.from_accept_languages(params.get_accepted_languages()) result = await api.reverse(coord, **details) @@ -357,25 +361,25 @@ async def reverse_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> 'namedetails': params.get_bool('namedetails', False), 'addressdetails': params.get_bool('addressdetails', True)} - output = formatting.format_result(napi.ReverseResults([result] if result else []), + output = formatting.format_result(ReverseResults([result] if result else []), fmt, fmt_options) return params.build_response(output, num_results=1 if result else 0) -async def lookup_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> Any: +async def lookup_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any: """ Server glue for /lookup endpoint. See API docs for details. """ - fmt = params.parse_format(napi.SearchResults, 'xml') + fmt = params.parse_format(SearchResults, 'xml') debug = params.setup_debugging() details = params.parse_geometry_details(fmt) - details['locales'] = napi.Locales.from_accept_languages(params.get_accepted_languages()) + details['locales'] = Locales.from_accept_languages(params.get_accepted_languages()) places = [] for oid in (params.get('osm_ids') or '').split(','): oid = oid.strip() if len(oid) > 1 and oid[0] in 'RNWrnw' and oid[1:].isdigit(): - places.append(napi.OsmID(oid[0].upper(), int(oid[1:]))) + places.append(OsmID(oid[0].upper(), int(oid[1:]))) if len(places) > params.config().get_int('LOOKUP_MAX_COUNT'): params.raise_error('Too many object IDs.') @@ -383,7 +387,7 @@ async def lookup_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> A if places: results = await api.lookup(places, **details) else: - results = napi.SearchResults() + results = SearchResults() if debug: return params.build_response(loglib.get_and_disable(), num_results=len(results)) @@ -397,28 +401,28 @@ async def lookup_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> A return params.build_response(output, num_results=len(results)) -async def _unstructured_search(query: str, api: napi.NominatimAPIAsync, - details: Dict[str, Any]) -> napi.SearchResults: +async def _unstructured_search(query: str, api: NominatimAPIAsync, + details: Dict[str, Any]) -> SearchResults: if not query: - return napi.SearchResults() + return SearchResults() # Extract special format for coordinates from query. query, x, y = helpers.extract_coords_from_query(query) if x is not None: assert y is not None - details['near'] = napi.Point(x, y) + details['near'] = Point(x, y) details['near_radius'] = 0.1 # If no query is left, revert to reverse search. if x is not None and not query: result = await api.reverse(details['near'], **details) if not result: - return napi.SearchResults() + return SearchResults() - return napi.SearchResults( - [napi.SearchResult(**{f.name: getattr(result, f.name) - for f in dataclasses.fields(napi.SearchResult) - if hasattr(result, f.name)})]) + return SearchResults( + [SearchResult(**{f.name: getattr(result, f.name) + for f in dataclasses.fields(SearchResult) + if hasattr(result, f.name)})]) query, cls, typ = helpers.extract_category_from_query(query) if cls is not None: @@ -428,10 +432,10 @@ async def _unstructured_search(query: str, api: napi.NominatimAPIAsync, return await api.search(query, **details) -async def search_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> Any: +async def search_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any: """ Server glue for /search endpoint. See API docs for details. """ - fmt = params.parse_format(napi.SearchResults, 'jsonv2') + fmt = params.parse_format(SearchResults, 'jsonv2') debug = params.setup_debugging() details = params.parse_geometry_details(fmt) @@ -448,11 +452,11 @@ async def search_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> A details['min_rank'], details['max_rank'] = \ helpers.feature_type_to_rank(params.get('featureType', '')) if params.get('featureType', None) is not None: - details['layers'] = napi.DataLayer.ADDRESS + details['layers'] = DataLayer.ADDRESS else: details['layers'] = params.get_layers() - details['locales'] = napi.Locales.from_accept_languages(params.get_accepted_languages()) + details['locales'] = Locales.from_accept_languages(params.get_accepted_languages()) # unstructured query parameters query = params.get('q', None) @@ -508,7 +512,7 @@ async def search_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> A return params.build_response(output, num_results=len(results)) -async def deletable_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> Any: +async def deletable_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any: """ Server glue for /deletable endpoint. This is a special endpoint that shows polygons that have been deleted or are broken in the OSM data but are kept in the @@ -528,7 +532,7 @@ async def deletable_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) - return params.build_response(formatting.format_result(results, fmt, {})) -async def polygons_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> Any: +async def polygons_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any: """ Server glue for /polygons endpoint. This is a special endpoint that shows polygons that have changed their size but are kept in the Nominatim database with their @@ -560,7 +564,7 @@ async def polygons_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> return params.build_response(formatting.format_result(results, fmt, {})) -EndpointFunc = Callable[[napi.NominatimAPIAsync, ASGIAdaptor], Any] +EndpointFunc = Callable[[NominatimAPIAsync, ASGIAdaptor], Any] ROUTES = [ ('status', status_endpoint), diff --git a/src/nominatim_api/version.py b/src/nominatim_api/version.py new file mode 100644 index 00000000..d275f4fc --- /dev/null +++ b/src/nominatim_api/version.py @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +# +# This file is part of Nominatim. (https://nominatim.org) +# +# Copyright (C) 2024 by the Nominatim developer community. +# For a full list of authors see the git log. +""" +Version information for the Nominatim API. +""" + +NOMINATIM_API_VERSION = '4.4.99' diff --git a/nominatim/server/__init__.py b/src/nominatim_core/__init__.py similarity index 100% rename from nominatim/server/__init__.py rename to src/nominatim_core/__init__.py diff --git a/nominatim/config.py b/src/nominatim_core/config.py similarity index 97% rename from nominatim/config.py rename to src/nominatim_core/config.py index 6bfc6076..5393b543 100644 --- a/nominatim/config.py +++ b/src/nominatim_core/config.py @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # @@ -19,9 +19,9 @@ import yaml from dotenv import dotenv_values from psycopg2.extensions import parse_dsn -from nominatim.typing import StrPath -from nominatim.errors import UsageError -import nominatim.paths +from .typing import StrPath +from .errors import UsageError +from . import paths LOG = logging.getLogger() CONFIG_CACHE : Dict[str, Any] = {} @@ -62,7 +62,7 @@ class Configuration: environ: Optional[Mapping[str, str]] = None) -> None: self.environ = environ or os.environ self.project_dir = project_dir - self.config_dir = nominatim.paths.CONFIG_DIR + self.config_dir = paths.CONFIG_DIR self._config = dotenv_values(str(self.config_dir / 'env.defaults')) if self.project_dir is not None and (self.project_dir / '.env').is_file(): self.project_dir = self.project_dir.resolve() @@ -71,9 +71,9 @@ class Configuration: class _LibDirs: module: Path osm2pgsql: Path - php = nominatim.paths.PHPLIB_DIR - sql = nominatim.paths.SQLLIB_DIR - data = nominatim.paths.DATA_DIR + php = paths.PHPLIB_DIR + sql = paths.SQLLIB_DIR + data = paths.DATA_DIR self.lib_dir = _LibDirs() self._private_plugins: Dict[str, object] = {} diff --git a/nominatim/server/falcon/__init__.py b/src/nominatim_core/db/__init__.py similarity index 100% rename from nominatim/server/falcon/__init__.py rename to src/nominatim_core/db/__init__.py diff --git a/nominatim/db/async_connection.py b/src/nominatim_core/db/async_connection.py similarity index 98% rename from nominatim/db/async_connection.py rename to src/nominatim_core/db/async_connection.py index 07767e48..83e4c865 100644 --- a/nominatim/db/async_connection.py +++ b/src/nominatim_core/db/async_connection.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Non-blocking database connections. """ @@ -22,7 +22,7 @@ try: except ImportError: __has_psycopg2_errors__ = False -from nominatim.typing import T_cursor, Query +from ..typing import T_cursor, Query LOG = logging.getLogger() diff --git a/nominatim/db/async_core_library.py b/src/nominatim_core/db/async_core_library.py similarity index 89% rename from nominatim/db/async_core_library.py rename to src/nominatim_core/db/async_core_library.py index 4a4b9f29..c26846fb 100644 --- a/nominatim/db/async_core_library.py +++ b/src/nominatim_core/db/async_core_library.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Import the base library to use with asynchronous SQLAlchemy. diff --git a/nominatim/db/connection.py b/src/nominatim_core/db/connection.py similarity index 97% rename from nominatim/db/connection.py rename to src/nominatim_core/db/connection.py index d6860836..19fcddd4 100644 --- a/nominatim/db/connection.py +++ b/src/nominatim_core/db/connection.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Specialised connection and cursor functions. @@ -17,8 +17,8 @@ import psycopg2.extensions import psycopg2.extras from psycopg2 import sql as pysql -from nominatim.typing import SysEnv, Query, T_cursor -from nominatim.errors import UsageError +from ..typing import SysEnv, Query, T_cursor +from ..errors import UsageError LOG = logging.getLogger() diff --git a/nominatim/db/properties.py b/src/nominatim_core/db/properties.py similarity index 90% rename from nominatim/db/properties.py rename to src/nominatim_core/db/properties.py index e8d5e0ca..3549382f 100644 --- a/nominatim/db/properties.py +++ b/src/nominatim_core/db/properties.py @@ -1,15 +1,15 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Query and access functions for the in-database property table. """ from typing import Optional, cast -from nominatim.db.connection import Connection +from .connection import Connection def set_property(conn: Connection, name: str, value: str) -> None: """ Add or replace the property with the given name. diff --git a/nominatim/db/sql_preprocessor.py b/src/nominatim_core/db/sql_preprocessor.py similarity index 95% rename from nominatim/db/sql_preprocessor.py rename to src/nominatim_core/db/sql_preprocessor.py index af5bc335..468f3510 100644 --- a/nominatim/db/sql_preprocessor.py +++ b/src/nominatim_core/db/sql_preprocessor.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Preprocessing of SQL files. @@ -10,9 +10,9 @@ Preprocessing of SQL files. from typing import Set, Dict, Any, cast import jinja2 -from nominatim.db.connection import Connection -from nominatim.db.async_connection import WorkerPool -from nominatim.config import Configuration +from .connection import Connection +from .async_connection import WorkerPool +from ..config import Configuration def _get_partitions(conn: Connection) -> Set[int]: """ Get the set of partitions currently in use. diff --git a/nominatim/db/sqlalchemy_schema.py b/src/nominatim_core/db/sqlalchemy_schema.py similarity index 96% rename from nominatim/db/sqlalchemy_schema.py rename to src/nominatim_core/db/sqlalchemy_schema.py index 0ec22b7e..0dfb63e7 100644 --- a/nominatim/db/sqlalchemy_schema.py +++ b/src/nominatim_core/db/sqlalchemy_schema.py @@ -2,15 +2,14 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ SQLAlchemy definitions for all tables used by the frontend. """ import sqlalchemy as sa -import nominatim.db.sqlalchemy_functions #pylint: disable=unused-import -from nominatim.db.sqlalchemy_types import Geometry, KeyValueStore, IntArray +from .sqlalchemy_types import Geometry, KeyValueStore, IntArray #pylint: disable=too-many-instance-attributes class SearchTables: diff --git a/nominatim/db/sqlalchemy_types/__init__.py b/src/nominatim_core/db/sqlalchemy_types/__init__.py similarity index 88% rename from nominatim/db/sqlalchemy_types/__init__.py rename to src/nominatim_core/db/sqlalchemy_types/__init__.py index dc417995..1383b5ee 100644 --- a/nominatim/db/sqlalchemy_types/__init__.py +++ b/src/nominatim_core/db/sqlalchemy_types/__init__.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Module with custom types for SQLAlchemy diff --git a/nominatim/db/sqlalchemy_types/geometry.py b/src/nominatim_core/db/sqlalchemy_types/geometry.py similarity index 99% rename from nominatim/db/sqlalchemy_types/geometry.py rename to src/nominatim_core/db/sqlalchemy_types/geometry.py index 0731b0b7..48c82ee0 100644 --- a/nominatim/db/sqlalchemy_types/geometry.py +++ b/src/nominatim_core/db/sqlalchemy_types/geometry.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Custom types for SQLAlchemy. @@ -15,7 +15,7 @@ import sqlalchemy as sa from sqlalchemy.ext.compiler import compiles from sqlalchemy import types -from nominatim.typing import SaColumn, SaBind +from ...typing import SaColumn, SaBind #pylint: disable=all diff --git a/nominatim/db/sqlalchemy_types/int_array.py b/src/nominatim_core/db/sqlalchemy_types/int_array.py similarity index 97% rename from nominatim/db/sqlalchemy_types/int_array.py rename to src/nominatim_core/db/sqlalchemy_types/int_array.py index a31793f3..c76bc9fa 100644 --- a/nominatim/db/sqlalchemy_types/int_array.py +++ b/src/nominatim_core/db/sqlalchemy_types/int_array.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Custom type for an array of integers. @@ -13,7 +13,7 @@ import sqlalchemy as sa from sqlalchemy.ext.compiler import compiles from sqlalchemy.dialects.postgresql import ARRAY -from nominatim.typing import SaDialect, SaColumn +from ...typing import SaDialect, SaColumn # pylint: disable=all diff --git a/nominatim/db/sqlalchemy_types/json.py b/src/nominatim_core/db/sqlalchemy_types/json.py similarity index 88% rename from nominatim/db/sqlalchemy_types/json.py rename to src/nominatim_core/db/sqlalchemy_types/json.py index 31635fd5..825fd1f2 100644 --- a/nominatim/db/sqlalchemy_types/json.py +++ b/src/nominatim_core/db/sqlalchemy_types/json.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Common json type for different dialects. @@ -13,7 +13,7 @@ import sqlalchemy as sa from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.dialects.sqlite import JSON as sqlite_json -from nominatim.typing import SaDialect +from ...typing import SaDialect # pylint: disable=all diff --git a/nominatim/db/sqlalchemy_types/key_value.py b/src/nominatim_core/db/sqlalchemy_types/key_value.py similarity index 95% rename from nominatim/db/sqlalchemy_types/key_value.py rename to src/nominatim_core/db/sqlalchemy_types/key_value.py index 937caa02..15e1f6c5 100644 --- a/nominatim/db/sqlalchemy_types/key_value.py +++ b/src/nominatim_core/db/sqlalchemy_types/key_value.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ A custom type that implements a simple key-value store of strings. @@ -14,7 +14,7 @@ from sqlalchemy.ext.compiler import compiles from sqlalchemy.dialects.postgresql import HSTORE from sqlalchemy.dialects.sqlite import JSON as sqlite_json -from nominatim.typing import SaDialect, SaColumn +from ...typing import SaDialect, SaColumn # pylint: disable=all diff --git a/nominatim/db/status.py b/src/nominatim_core/db/status.py similarity index 94% rename from nominatim/db/status.py rename to src/nominatim_core/db/status.py index 5f92d959..1278359c 100644 --- a/nominatim/db/status.py +++ b/src/nominatim_core/db/status.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Access and helper functions for the status and status log table. @@ -12,10 +12,10 @@ import datetime as dt import logging import re -from nominatim.db.connection import Connection -from nominatim.tools.exec_utils import get_url -from nominatim.errors import UsageError -from nominatim.typing import TypedDict +from .connection import Connection +from ..utils.url_utils import get_url +from ..errors import UsageError +from ..typing import TypedDict LOG = logging.getLogger() ISODATE_FORMAT = '%Y-%m-%dT%H:%M:%S' diff --git a/nominatim/db/utils.py b/src/nominatim_core/db/utils.py similarity index 95% rename from nominatim/db/utils.py rename to src/nominatim_core/db/utils.py index 57048da3..32bf79ac 100644 --- a/nominatim/db/utils.py +++ b/src/nominatim_core/db/utils.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Helper functions for handling DB accesses. @@ -14,8 +14,8 @@ import gzip import io from pathlib import Path -from nominatim.db.connection import get_pg_env, Cursor -from nominatim.errors import UsageError +from .connection import get_pg_env, Cursor +from ..errors import UsageError LOG = logging.getLogger() diff --git a/nominatim/errors.py b/src/nominatim_core/errors.py similarity index 77% rename from nominatim/errors.py rename to src/nominatim_core/errors.py index 26752aa2..c7331a89 100644 --- a/nominatim/errors.py +++ b/src/nominatim_core/errors.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Custom exception and error classes for Nominatim. diff --git a/src/nominatim_core/paths.py b/src/nominatim_core/paths.py new file mode 100644 index 00000000..aa289708 --- /dev/null +++ b/src/nominatim_core/paths.py @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +# +# This file is part of Nominatim. (https://nominatim.org) +# +# Copyright (C) 2024 by the Nominatim developer community. +# For a full list of authors see the git log. +""" +Path settings for extra data used by Nominatim. +""" +from pathlib import Path + +PHPLIB_DIR = (Path(__file__) / '..' / '..' / '..' / 'lib-php').resolve() +SQLLIB_DIR = (Path(__file__) / '..' / '..' / '..' / 'lib-sql').resolve() +DATA_DIR = (Path(__file__) / '..' / '..' / '..' / 'data').resolve() +CONFIG_DIR = (Path(__file__) / '..' / '..' / '..' / 'settings').resolve() diff --git a/nominatim/server/starlette/__init__.py b/src/nominatim_core/py.typed similarity index 100% rename from nominatim/server/starlette/__init__.py rename to src/nominatim_core/py.typed diff --git a/nominatim/typing.py b/src/nominatim_core/typing.py similarity index 95% rename from nominatim/typing.py rename to src/nominatim_core/typing.py index 62ecd8c3..1f4f1fd7 100644 --- a/nominatim/typing.py +++ b/src/nominatim_core/typing.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Type definitions for typing annotations. diff --git a/nominatim/tokenizer/__init__.py b/src/nominatim_core/utils/__init__.py similarity index 100% rename from nominatim/tokenizer/__init__.py rename to src/nominatim_core/utils/__init__.py diff --git a/nominatim/utils/centroid.py b/src/nominatim_core/utils/centroid.py similarity index 93% rename from nominatim/utils/centroid.py rename to src/nominatim_core/utils/centroid.py index 21823176..21a7c779 100644 --- a/nominatim/utils/centroid.py +++ b/src/nominatim_core/utils/centroid.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Functions for computation of centroids. diff --git a/nominatim/utils/json_writer.py b/src/nominatim_core/utils/json_writer.py similarity index 98% rename from nominatim/utils/json_writer.py rename to src/nominatim_core/utils/json_writer.py index fcc355d5..c3d17a84 100644 --- a/nominatim/utils/json_writer.py +++ b/src/nominatim_core/utils/json_writer.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Streaming JSON encoder. diff --git a/src/nominatim_core/utils/url_utils.py b/src/nominatim_core/utils/url_utils.py new file mode 100644 index 00000000..d7689187 --- /dev/null +++ b/src/nominatim_core/utils/url_utils.py @@ -0,0 +1,31 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +# +# This file is part of Nominatim. (https://nominatim.org) +# +# Copyright (C) 2024 by the Nominatim developer community. +# For a full list of authors see the git log. +""" +Helper functions for accessing URL. +""" +from typing import IO +import logging +import urllib.request as urlrequest + +from ..version import NOMINATIM_CORE_VERSION + +LOG = logging.getLogger() + +def get_url(url: str) -> str: + """ Get the contents from the given URL and return it as a UTF-8 string. + + This version makes sure that an appropriate user agent is sent. + """ + headers = {"User-Agent": f"Nominatim/{NOMINATIM_CORE_VERSION!s}"} + + try: + request = urlrequest.Request(url, headers=headers) + with urlrequest.urlopen(request) as response: # type: IO[bytes] + return response.read().decode('utf-8') + except Exception: + LOG.fatal('Failed to load URL: %s', url) + raise diff --git a/src/nominatim_core/version.py b/src/nominatim_core/version.py new file mode 100644 index 00000000..bf35aeb2 --- /dev/null +++ b/src/nominatim_core/version.py @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +# +# This file is part of Nominatim. (https://nominatim.org) +# +# Copyright (C) 2024 by the Nominatim developer community. +# For a full list of authors see the git log. +""" +Version information for the Nominatim core package. +""" + +NOMINATIM_CORE_VERSION = '4.4.99' diff --git a/nominatim/tokenizer/sanitizers/__init__.py b/src/nominatim_db/__init__.py similarity index 100% rename from nominatim/tokenizer/sanitizers/__init__.py rename to src/nominatim_db/__init__.py diff --git a/nominatim/cli.py b/src/nominatim_db/cli.py similarity index 95% rename from nominatim/cli.py rename to src/nominatim_db/cli.py index 720a8ece..548f1165 100644 --- a/nominatim/cli.py +++ b/src/nominatim_db/cli.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Command-line interface to the Nominatim functions for import, update, @@ -16,12 +16,12 @@ import sys import argparse from pathlib import Path -from nominatim.config import Configuration -from nominatim.tools.exec_utils import run_php_server -from nominatim.errors import UsageError -from nominatim import clicmd -from nominatim import version -from nominatim.clicmd.args import NominatimArgs, Subcommand +from nominatim_core.config import Configuration +from nominatim_core.errors import UsageError +from .tools.exec_utils import run_php_server +from . import clicmd +from . import version +from .clicmd.args import NominatimArgs, Subcommand LOG = logging.getLogger() diff --git a/src/nominatim_db/clicmd/__init__.py b/src/nominatim_db/clicmd/__init__.py new file mode 100644 index 00000000..0481a45e --- /dev/null +++ b/src/nominatim_db/clicmd/__init__.py @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# This file is part of Nominatim. (https://nominatim.org) +# +# Copyright (C) 2023 by the Nominatim developer community. +# For a full list of authors see the git log. +""" +Subcommand definitions for the command-line tool. +""" +# mypy and pylint disagree about the style of explicit exports, +# see https://github.com/PyCQA/pylint/issues/6006. +# pylint: disable=useless-import-alias + +from .setup import SetupAll as SetupAll +from .replication import UpdateReplication as UpdateReplication +from .api import (APISearch as APISearch, + APIReverse as APIReverse, + APILookup as APILookup, + APIDetails as APIDetails, + APIStatus as APIStatus) +from .index import UpdateIndex as UpdateIndex +from .refresh import UpdateRefresh as UpdateRefresh +from .add_data import UpdateAddData as UpdateAddData +from .admin import AdminFuncs as AdminFuncs +from .freeze import SetupFreeze as SetupFreeze +from .special_phrases import ImportSpecialPhrases as ImportSpecialPhrases +from .export import QueryExport as QueryExport +from .convert import ConvertDB as ConvertDB diff --git a/nominatim/clicmd/add_data.py b/src/nominatim_db/clicmd/add_data.py similarity index 94% rename from nominatim/clicmd/add_data.py rename to src/nominatim_db/clicmd/add_data.py index 3f31d216..eced9907 100644 --- a/nominatim/clicmd/add_data.py +++ b/src/nominatim_db/clicmd/add_data.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Implementation of the 'add-data' subcommand. @@ -13,7 +13,7 @@ import logging import psutil -from nominatim.clicmd.args import NominatimArgs +from .args import NominatimArgs # Do not repeat documentation of subcommand classes. # pylint: disable=C0111 @@ -64,8 +64,8 @@ class UpdateAddData: def run(self, args: NominatimArgs) -> int: - from nominatim.tokenizer import factory as tokenizer_factory - from nominatim.tools import tiger_data, add_osm_data + from ..tokenizer import factory as tokenizer_factory + from ..tools import tiger_data, add_osm_data if args.tiger_data: tokenizer = tokenizer_factory.get_tokenizer_for_db(args.config) diff --git a/nominatim/clicmd/admin.py b/src/nominatim_db/clicmd/admin.py similarity index 95% rename from nominatim/clicmd/admin.py rename to src/nominatim_db/clicmd/admin.py index 9557dc98..66dbbe99 100644 --- a/nominatim/clicmd/admin.py +++ b/src/nominatim_db/clicmd/admin.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Implementation of the 'admin' subcommand. @@ -11,9 +11,9 @@ import logging import argparse import random -from nominatim.db.connection import connect -from nominatim.clicmd.args import NominatimArgs -import nominatim.api as napi +import nominatim_api as napi +from nominatim_core.db.connection import connect +from .args import NominatimArgs # Do not repeat documentation of subcommand classes. # pylint: disable=C0111 diff --git a/nominatim/clicmd/api.py b/src/nominatim_db/clicmd/api.py similarity index 97% rename from nominatim/clicmd/api.py rename to src/nominatim_db/clicmd/api.py index 3c5416fe..20553b40 100644 --- a/nominatim/clicmd/api.py +++ b/src/nominatim_db/clicmd/api.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Subcommand definitions for API calls from the command line. @@ -13,12 +13,12 @@ import logging import json import sys -from nominatim.clicmd.args import NominatimArgs -import nominatim.api as napi -import nominatim.api.v1 as api_output -from nominatim.api.v1.helpers import zoom_to_rank, deduplicate_results -from nominatim.api.v1.format import dispatch as formatting -import nominatim.api.logging as loglib +import nominatim_api as napi +import nominatim_api.v1 as api_output +from nominatim_api.v1.helpers import zoom_to_rank, deduplicate_results +from nominatim_api.v1.format import dispatch as formatting +import nominatim_api.logging as loglib +from .args import NominatimArgs # Do not repeat documentation of subcommand classes. # pylint: disable=C0111 diff --git a/nominatim/clicmd/args.py b/src/nominatim_db/clicmd/args.py similarity index 96% rename from nominatim/clicmd/args.py rename to src/nominatim_db/clicmd/args.py index 433435bc..ab93863d 100644 --- a/nominatim/clicmd/args.py +++ b/src/nominatim_db/clicmd/args.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Provides custom functions over command-line arguments. @@ -13,10 +13,10 @@ import logging from functools import reduce from pathlib import Path -from nominatim.errors import UsageError -from nominatim.config import Configuration -from nominatim.typing import Protocol -import nominatim.api as napi +from nominatim_core.errors import UsageError +from nominatim_core.config import Configuration +from nominatim_core.typing import Protocol +import nominatim_api as napi LOG = logging.getLogger() diff --git a/nominatim/clicmd/convert.py b/src/nominatim_db/clicmd/convert.py similarity index 96% rename from nominatim/clicmd/convert.py rename to src/nominatim_db/clicmd/convert.py index 7ba77172..51db848c 100644 --- a/nominatim/clicmd/convert.py +++ b/src/nominatim_db/clicmd/convert.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Implementation of the 'convert' subcommand. @@ -12,8 +12,8 @@ import argparse import asyncio from pathlib import Path -from nominatim.clicmd.args import NominatimArgs -from nominatim.errors import UsageError +from nominatim_core.errors import UsageError +from .args import NominatimArgs # Do not repeat documentation of subcommand classes. # pylint: disable=C0111 diff --git a/nominatim/clicmd/export.py b/src/nominatim_db/clicmd/export.py similarity index 96% rename from nominatim/clicmd/export.py rename to src/nominatim_db/clicmd/export.py index f935a557..460d27d6 100644 --- a/nominatim/clicmd/export.py +++ b/src/nominatim_db/clicmd/export.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Implementation of the 'export' subcommand. @@ -16,11 +16,11 @@ import sys import sqlalchemy as sa -from nominatim.clicmd.args import NominatimArgs -import nominatim.api as napi -from nominatim.api.results import create_from_placex_row, ReverseResult, add_result_details -from nominatim.api.types import LookupDetails -from nominatim.errors import UsageError +import nominatim_api as napi +from nominatim_api.results import create_from_placex_row, ReverseResult, add_result_details +from nominatim_api.types import LookupDetails +from nominatim_core.errors import UsageError +from .args import NominatimArgs # Do not repeat documentation of subcommand classes. # pylint: disable=C0111 diff --git a/nominatim/clicmd/freeze.py b/src/nominatim_db/clicmd/freeze.py similarity index 85% rename from nominatim/clicmd/freeze.py rename to src/nominatim_db/clicmd/freeze.py index 5dfdd255..83b84b17 100644 --- a/nominatim/clicmd/freeze.py +++ b/src/nominatim_db/clicmd/freeze.py @@ -1,16 +1,16 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Implementation of the 'freeze' subcommand. """ import argparse -from nominatim.db.connection import connect -from nominatim.clicmd.args import NominatimArgs +from nominatim_core.db.connection import connect +from .args import NominatimArgs # Do not repeat documentation of subcommand classes. # pylint: disable=C0111 diff --git a/nominatim/clicmd/index.py b/src/nominatim_db/clicmd/index.py similarity index 91% rename from nominatim/clicmd/index.py rename to src/nominatim_db/clicmd/index.py index 86a504e7..7766a1d1 100644 --- a/nominatim/clicmd/index.py +++ b/src/nominatim_db/clicmd/index.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Implementation of the 'index' subcommand. @@ -11,9 +11,9 @@ import argparse import psutil -from nominatim.db import status -from nominatim.db.connection import connect -from nominatim.clicmd.args import NominatimArgs +from nominatim_core.db import status +from nominatim_core.db.connection import connect +from .args import NominatimArgs # Do not repeat documentation of subcommand classes. # pylint: disable=C0111 diff --git a/nominatim/clicmd/refresh.py b/src/nominatim_db/clicmd/refresh.py similarity index 96% rename from nominatim/clicmd/refresh.py rename to src/nominatim_db/clicmd/refresh.py index 5eac53da..ceead258 100644 --- a/nominatim/clicmd/refresh.py +++ b/src/nominatim_db/clicmd/refresh.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Implementation of 'refresh' subcommand. @@ -12,10 +12,10 @@ import argparse import logging from pathlib import Path -from nominatim.config import Configuration -from nominatim.db.connection import connect -from nominatim.tokenizer.base import AbstractTokenizer -from nominatim.clicmd.args import NominatimArgs +from nominatim_core.config import Configuration +from nominatim_core.db.connection import connect +from ..tokenizer.base import AbstractTokenizer +from .args import NominatimArgs # Do not repeat documentation of subcommand classes. # pylint: disable=C0111 diff --git a/nominatim/clicmd/replication.py b/src/nominatim_db/clicmd/replication.py similarity index 96% rename from nominatim/clicmd/replication.py rename to src/nominatim_db/clicmd/replication.py index 192a9314..6fc4dc30 100644 --- a/nominatim/clicmd/replication.py +++ b/src/nominatim_db/clicmd/replication.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Implementation of the 'replication' sub-command. @@ -14,10 +14,10 @@ import logging import socket import time -from nominatim.db import status -from nominatim.db.connection import connect -from nominatim.errors import UsageError -from nominatim.clicmd.args import NominatimArgs +from nominatim_core.db import status +from nominatim_core.db.connection import connect +from nominatim_core.errors import UsageError +from .args import NominatimArgs LOG = logging.getLogger() diff --git a/nominatim/clicmd/setup.py b/src/nominatim_db/clicmd/setup.py similarity index 96% rename from nominatim/clicmd/setup.py rename to src/nominatim_db/clicmd/setup.py index ccd6bd78..af586d49 100644 --- a/nominatim/clicmd/setup.py +++ b/src/nominatim_db/clicmd/setup.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Implementation of the 'import' subcommand. @@ -14,13 +14,13 @@ from pathlib import Path import psutil -from nominatim.config import Configuration -from nominatim.db.connection import connect -from nominatim.db import status, properties -from nominatim.tokenizer.base import AbstractTokenizer -from nominatim.version import NOMINATIM_VERSION -from nominatim.clicmd.args import NominatimArgs -from nominatim.errors import UsageError +from nominatim_core.errors import UsageError +from nominatim_core.config import Configuration +from nominatim_core.db.connection import connect +from nominatim_core.db import status, properties +from ..tokenizer.base import AbstractTokenizer +from ..version import NOMINATIM_VERSION +from .args import NominatimArgs # Do not repeat documentation of subcommand classes. # pylint: disable=C0111 diff --git a/nominatim/clicmd/special_phrases.py b/src/nominatim_db/clicmd/special_phrases.py similarity index 88% rename from nominatim/clicmd/special_phrases.py rename to src/nominatim_db/clicmd/special_phrases.py index beac0c84..1e0f2d76 100644 --- a/nominatim/clicmd/special_phrases.py +++ b/src/nominatim_db/clicmd/special_phrases.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Implementation of the 'special-phrases' command. @@ -11,12 +11,12 @@ import argparse import logging from pathlib import Path -from nominatim.errors import UsageError -from nominatim.db.connection import connect -from nominatim.tools.special_phrases.sp_importer import SPImporter, SpecialPhraseLoader -from nominatim.tools.special_phrases.sp_wiki_loader import SPWikiLoader -from nominatim.tools.special_phrases.sp_csv_loader import SPCsvLoader -from nominatim.clicmd.args import NominatimArgs +from nominatim_core.errors import UsageError +from nominatim_core.db.connection import connect +from ..tools.special_phrases.sp_importer import SPImporter, SpecialPhraseLoader +from ..tools.special_phrases.sp_wiki_loader import SPWikiLoader +from ..tools.special_phrases.sp_csv_loader import SPCsvLoader +from .args import NominatimArgs LOG = logging.getLogger() diff --git a/nominatim/tokenizer/token_analysis/__init__.py b/src/nominatim_db/data/__init__.py similarity index 100% rename from nominatim/tokenizer/token_analysis/__init__.py rename to src/nominatim_db/data/__init__.py diff --git a/nominatim/data/country_info.py b/src/nominatim_db/data/country_info.py similarity index 94% rename from nominatim/data/country_info.py rename to src/nominatim_db/data/country_info.py index eb0190b5..35943a50 100644 --- a/nominatim/data/country_info.py +++ b/src/nominatim_db/data/country_info.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Functions for importing and managing static country information. @@ -11,11 +11,11 @@ from typing import Dict, Any, Iterable, Tuple, Optional, Container, overload from pathlib import Path import psycopg2.extras -from nominatim.db import utils as db_utils -from nominatim.db.connection import connect, Connection -from nominatim.errors import UsageError -from nominatim.config import Configuration -from nominatim.tokenizer.base import AbstractTokenizer +from nominatim_core.db import utils as db_utils +from nominatim_core.db.connection import connect, Connection +from nominatim_core.errors import UsageError +from nominatim_core.config import Configuration +from ..tokenizer.base import AbstractTokenizer def _flatten_name_list(names: Any) -> Dict[str, str]: if names is None: diff --git a/nominatim/data/place_info.py b/src/nominatim_db/data/place_info.py similarity index 96% rename from nominatim/data/place_info.py rename to src/nominatim_db/data/place_info.py index 91e77a58..5b5ef57f 100644 --- a/nominatim/data/place_info.py +++ b/src/nominatim_db/data/place_info.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Wrapper around place information the indexer gets from the database and hands to diff --git a/nominatim/data/place_name.py b/src/nominatim_db/data/place_name.py similarity index 96% rename from nominatim/data/place_name.py rename to src/nominatim_db/data/place_name.py index abba3544..cb1705e9 100644 --- a/nominatim/data/place_name.py +++ b/src/nominatim_db/data/place_name.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Data class for a single name of a place. diff --git a/nominatim/data/postcode_format.py b/src/nominatim_db/data/postcode_format.py similarity index 95% rename from nominatim/data/postcode_format.py rename to src/nominatim_db/data/postcode_format.py index 132dd41f..670827ee 100644 --- a/nominatim/data/postcode_format.py +++ b/src/nominatim_db/data/postcode_format.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Functions for formatting postcodes according to their country-specific @@ -11,8 +11,8 @@ format. from typing import Any, Mapping, Optional, Set, Match import re -from nominatim.errors import UsageError -from nominatim.data import country_info +from nominatim_core.errors import UsageError +from . import country_info class CountryPostcodeMatcher: """ Matches and formats a postcode according to a format definition diff --git a/nominatim/tools/special_phrases/__init__.py b/src/nominatim_db/indexer/__init__.py similarity index 100% rename from nominatim/tools/special_phrases/__init__.py rename to src/nominatim_db/indexer/__init__.py diff --git a/nominatim/indexer/indexer.py b/src/nominatim_db/indexer/indexer.py similarity index 95% rename from nominatim/indexer/indexer.py rename to src/nominatim_db/indexer/indexer.py index 233423f0..4f9c0575 100644 --- a/nominatim/indexer/indexer.py +++ b/src/nominatim_db/indexer/indexer.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Main work horse for indexing (computing addresses) the database. @@ -13,12 +13,12 @@ import time import psycopg2.extras -from nominatim.tokenizer.base import AbstractTokenizer -from nominatim.indexer.progress import ProgressLogger -from nominatim.indexer import runners -from nominatim.db.async_connection import DBConnection, WorkerPool -from nominatim.db.connection import connect, Connection, Cursor -from nominatim.typing import DictCursorResults +from nominatim_core.typing import DictCursorResults +from nominatim_core.db.async_connection import DBConnection, WorkerPool +from nominatim_core.db.connection import connect, Connection, Cursor +from ..tokenizer.base import AbstractTokenizer +from .progress import ProgressLogger +from . import runners LOG = logging.getLogger() diff --git a/nominatim/indexer/progress.py b/src/nominatim_db/indexer/progress.py similarity index 95% rename from nominatim/indexer/progress.py rename to src/nominatim_db/indexer/progress.py index 33df37fb..668dbd59 100644 --- a/nominatim/indexer/progress.py +++ b/src/nominatim_db/indexer/progress.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Helpers for progress logging. diff --git a/nominatim/indexer/runners.py b/src/nominatim_db/indexer/runners.py similarity index 95% rename from nominatim/indexer/runners.py rename to src/nominatim_db/indexer/runners.py index bbadd282..4d6a28e4 100644 --- a/nominatim/indexer/runners.py +++ b/src/nominatim_db/indexer/runners.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Mix-ins that provide the actual commands for the indexer for various indexing @@ -14,10 +14,10 @@ import functools from psycopg2 import sql as pysql import psycopg2.extras -from nominatim.data.place_info import PlaceInfo -from nominatim.tokenizer.base import AbstractAnalyzer -from nominatim.db.async_connection import DBConnection -from nominatim.typing import Query, DictCursorResult, DictCursorResults, Protocol +from nominatim_core.typing import Query, DictCursorResult, DictCursorResults, Protocol +from nominatim_core.db.async_connection import DBConnection +from ..data.place_info import PlaceInfo +from ..tokenizer.base import AbstractAnalyzer # pylint: disable=C0111 diff --git a/nominatim/utils/__init__.py b/src/nominatim_db/tokenizer/__init__.py similarity index 100% rename from nominatim/utils/__init__.py rename to src/nominatim_db/tokenizer/__init__.py diff --git a/nominatim/tokenizer/base.py b/src/nominatim_db/tokenizer/base.py similarity index 96% rename from nominatim/tokenizer/base.py rename to src/nominatim_db/tokenizer/base.py index 12c826eb..0ca7e1d1 100644 --- a/nominatim/tokenizer/base.py +++ b/src/nominatim_db/tokenizer/base.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Abstract class definitions for tokenizers. These base classes are here @@ -12,10 +12,10 @@ from abc import ABC, abstractmethod from typing import List, Tuple, Dict, Any, Optional, Iterable from pathlib import Path -from nominatim.config import Configuration -from nominatim.db.connection import Connection -from nominatim.data.place_info import PlaceInfo -from nominatim.typing import Protocol +from nominatim_core.typing import Protocol +from nominatim_core.config import Configuration +from nominatim_core.db.connection import Connection +from ..data.place_info import PlaceInfo class AbstractAnalyzer(ABC): """ The analyzer provides the functions for analysing names and building diff --git a/nominatim/tokenizer/factory.py b/src/nominatim_db/tokenizer/factory.py similarity index 90% rename from nominatim/tokenizer/factory.py rename to src/nominatim_db/tokenizer/factory.py index d6bc5163..d43929f0 100644 --- a/nominatim/tokenizer/factory.py +++ b/src/nominatim_db/tokenizer/factory.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Functions for creating a tokenizer or initialising the right one for an @@ -24,11 +24,11 @@ import logging import importlib from pathlib import Path -from nominatim.errors import UsageError -from nominatim.db import properties -from nominatim.db.connection import connect -from nominatim.config import Configuration -from nominatim.tokenizer.base import AbstractTokenizer, TokenizerModule +from nominatim_core.errors import UsageError +from nominatim_core.db import properties +from nominatim_core.db.connection import connect +from nominatim_core.config import Configuration +from ..tokenizer.base import AbstractTokenizer, TokenizerModule LOG = logging.getLogger() diff --git a/nominatim/tokenizer/icu_rule_loader.py b/src/nominatim_db/tokenizer/icu_rule_loader.py similarity index 91% rename from nominatim/tokenizer/icu_rule_loader.py rename to src/nominatim_db/tokenizer/icu_rule_loader.py index 4c36282c..9e7f00b4 100644 --- a/nominatim/tokenizer/icu_rule_loader.py +++ b/src/nominatim_db/tokenizer/icu_rule_loader.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Helper class to create ICU rules from a configuration file. @@ -14,14 +14,14 @@ import logging from icu import Transliterator -from nominatim.config import flatten_config_list, Configuration -from nominatim.db.properties import set_property, get_property -from nominatim.db.connection import Connection -from nominatim.errors import UsageError -from nominatim.tokenizer.place_sanitizer import PlaceSanitizer -from nominatim.tokenizer.icu_token_analysis import ICUTokenAnalysis -from nominatim.tokenizer.token_analysis.base import AnalysisModule, Analyzer -import nominatim.data.country_info +from nominatim_core.config import flatten_config_list, Configuration +from nominatim_core.db.properties import set_property, get_property +from nominatim_core.db.connection import Connection +from nominatim_core.errors import UsageError +from .place_sanitizer import PlaceSanitizer +from .icu_token_analysis import ICUTokenAnalysis +from .token_analysis.base import AnalysisModule, Analyzer +from ..data import country_info LOG = logging.getLogger() @@ -51,7 +51,7 @@ class ICURuleLoader: config='TOKENIZER_CONFIG') # Make sure country information is available to analyzers and sanitizers. - nominatim.data.country_info.setup_country_config(config) + country_info.setup_country_config(config) self.normalization_rules = self._cfg_to_icu_rules(rules, 'normalization') self.transliteration_rules = self._cfg_to_icu_rules(rules, 'transliteration') diff --git a/nominatim/tokenizer/icu_token_analysis.py b/src/nominatim_db/tokenizer/icu_token_analysis.py similarity index 85% rename from nominatim/tokenizer/icu_token_analysis.py rename to src/nominatim_db/tokenizer/icu_token_analysis.py index 7ea31e8e..fe6704d4 100644 --- a/nominatim/tokenizer/icu_token_analysis.py +++ b/src/nominatim_db/tokenizer/icu_token_analysis.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Container class collecting all components required to transform an OSM name @@ -11,11 +11,11 @@ into a Nominatim token. from typing import Mapping, Optional, TYPE_CHECKING from icu import Transliterator -from nominatim.tokenizer.token_analysis.base import Analyzer +from .token_analysis.base import Analyzer if TYPE_CHECKING: from typing import Any - from nominatim.tokenizer.icu_rule_loader import TokenAnalyzerRule # pylint: disable=cyclic-import + from .icu_rule_loader import TokenAnalyzerRule # pylint: disable=cyclic-import class ICUTokenAnalysis: """ Container class collecting the transliterators and token analysis diff --git a/nominatim/tokenizer/icu_tokenizer.py b/src/nominatim_db/tokenizer/icu_tokenizer.py similarity index 98% rename from nominatim/tokenizer/icu_tokenizer.py rename to src/nominatim_db/tokenizer/icu_tokenizer.py index 4b9dac69..af03bd39 100644 --- a/nominatim/tokenizer/icu_tokenizer.py +++ b/src/nominatim_db/tokenizer/icu_tokenizer.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Tokenizer implementing normalisation as used before Nominatim 4 but using @@ -16,16 +16,16 @@ import logging from pathlib import Path from textwrap import dedent -from nominatim.db.connection import connect, Connection, Cursor -from nominatim.config import Configuration -from nominatim.db.utils import CopyBuffer -from nominatim.db.sql_preprocessor import SQLPreprocessor -from nominatim.data.place_info import PlaceInfo -from nominatim.tokenizer.icu_rule_loader import ICURuleLoader -from nominatim.tokenizer.place_sanitizer import PlaceSanitizer -from nominatim.data.place_name import PlaceName -from nominatim.tokenizer.icu_token_analysis import ICUTokenAnalysis -from nominatim.tokenizer.base import AbstractAnalyzer, AbstractTokenizer +from nominatim_core.db.connection import connect, Connection, Cursor +from nominatim_core.config import Configuration +from nominatim_core.db.utils import CopyBuffer +from nominatim_core.db.sql_preprocessor import SQLPreprocessor +from ..data.place_info import PlaceInfo +from ..data.place_name import PlaceName +from .icu_rule_loader import ICURuleLoader +from .place_sanitizer import PlaceSanitizer +from .icu_token_analysis import ICUTokenAnalysis +from .base import AbstractAnalyzer, AbstractTokenizer DBCFG_TERM_NORMALIZATION = "tokenizer_term_normalization" diff --git a/nominatim/tokenizer/legacy_tokenizer.py b/src/nominatim_db/tokenizer/legacy_tokenizer.py similarity index 98% rename from nominatim/tokenizer/legacy_tokenizer.py rename to src/nominatim_db/tokenizer/legacy_tokenizer.py index 93808cc3..5c6ba743 100644 --- a/nominatim/tokenizer/legacy_tokenizer.py +++ b/src/nominatim_db/tokenizer/legacy_tokenizer.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Tokenizer implementing normalisation as used before Nominatim 4. @@ -20,14 +20,14 @@ from icu import Transliterator import psycopg2 import psycopg2.extras -from nominatim.db.connection import connect, Connection -from nominatim.config import Configuration -from nominatim.db import properties -from nominatim.db import utils as db_utils -from nominatim.db.sql_preprocessor import SQLPreprocessor -from nominatim.data.place_info import PlaceInfo -from nominatim.errors import UsageError -from nominatim.tokenizer.base import AbstractAnalyzer, AbstractTokenizer +from nominatim_core.errors import UsageError +from nominatim_core.db.connection import connect, Connection +from nominatim_core.config import Configuration +from nominatim_core.db import properties +from nominatim_core.db import utils as db_utils +from nominatim_core.db.sql_preprocessor import SQLPreprocessor +from ..data.place_info import PlaceInfo +from .base import AbstractAnalyzer, AbstractTokenizer DBCFG_NORMALIZATION = "tokenizer_normalization" DBCFG_MAXWORDFREQ = "tokenizer_maxwordfreq" diff --git a/nominatim/tokenizer/place_sanitizer.py b/src/nominatim_db/tokenizer/place_sanitizer.py similarity index 79% rename from nominatim/tokenizer/place_sanitizer.py rename to src/nominatim_db/tokenizer/place_sanitizer.py index 2f76fe34..da41692b 100644 --- a/nominatim/tokenizer/place_sanitizer.py +++ b/src/nominatim_db/tokenizer/place_sanitizer.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Handler for cleaning name and address tags in place information before it @@ -10,12 +10,12 @@ is handed to the token analysis. """ from typing import Optional, List, Mapping, Sequence, Callable, Any, Tuple -from nominatim.errors import UsageError -from nominatim.config import Configuration -from nominatim.tokenizer.sanitizers.config import SanitizerConfig -from nominatim.tokenizer.sanitizers.base import SanitizerHandler, ProcessInfo -from nominatim.data.place_name import PlaceName -from nominatim.data.place_info import PlaceInfo +from nominatim_core.errors import UsageError +from nominatim_core.config import Configuration +from .sanitizers.config import SanitizerConfig +from .sanitizers.base import SanitizerHandler, ProcessInfo +from ..data.place_name import PlaceName +from ..data.place_info import PlaceInfo class PlaceSanitizer: diff --git a/src/nominatim_db/tokenizer/sanitizers/__init__.py b/src/nominatim_db/tokenizer/sanitizers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/nominatim/tokenizer/sanitizers/base.py b/src/nominatim_db/tokenizer/sanitizers/base.py similarity index 86% rename from nominatim/tokenizer/sanitizers/base.py rename to src/nominatim_db/tokenizer/sanitizers/base.py index ac8d90e4..a28f86b5 100644 --- a/nominatim/tokenizer/sanitizers/base.py +++ b/src/nominatim_db/tokenizer/sanitizers/base.py @@ -1,18 +1,18 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Common data types and protocols for sanitizers. """ from typing import Optional, List, Mapping, Callable -from nominatim.tokenizer.sanitizers.config import SanitizerConfig -from nominatim.data.place_info import PlaceInfo -from nominatim.data.place_name import PlaceName -from nominatim.typing import Protocol, Final +from nominatim_core.typing import Protocol, Final +from ...data.place_info import PlaceInfo +from ...data.place_name import PlaceName +from .config import SanitizerConfig class ProcessInfo: diff --git a/nominatim/tokenizer/sanitizers/clean_housenumbers.py b/src/nominatim_db/tokenizer/sanitizers/clean_housenumbers.py similarity index 91% rename from nominatim/tokenizer/sanitizers/clean_housenumbers.py rename to src/nominatim_db/tokenizer/sanitizers/clean_housenumbers.py index ae6349a9..20443616 100644 --- a/nominatim/tokenizer/sanitizers/clean_housenumbers.py +++ b/src/nominatim_db/tokenizer/sanitizers/clean_housenumbers.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Sanitizer that preprocesses address tags for house numbers. The sanitizer @@ -26,9 +26,9 @@ Arguments: """ from typing import Callable, Iterator, List -from nominatim.tokenizer.sanitizers.base import ProcessInfo -from nominatim.data.place_name import PlaceName -from nominatim.tokenizer.sanitizers.config import SanitizerConfig +from ...data.place_name import PlaceName +from .base import ProcessInfo +from .config import SanitizerConfig class _HousenumberSanitizer: diff --git a/nominatim/tokenizer/sanitizers/clean_postcodes.py b/src/nominatim_db/tokenizer/sanitizers/clean_postcodes.py similarity index 90% rename from nominatim/tokenizer/sanitizers/clean_postcodes.py rename to src/nominatim_db/tokenizer/sanitizers/clean_postcodes.py index 5eaea391..5340dc8c 100644 --- a/nominatim/tokenizer/sanitizers/clean_postcodes.py +++ b/src/nominatim_db/tokenizer/sanitizers/clean_postcodes.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Sanitizer that filters postcodes by their officially allowed pattern. @@ -22,9 +22,9 @@ Arguments: """ from typing import Callable, Optional, Tuple -from nominatim.data.postcode_format import PostcodeFormatter -from nominatim.tokenizer.sanitizers.base import ProcessInfo -from nominatim.tokenizer.sanitizers.config import SanitizerConfig +from ...data.postcode_format import PostcodeFormatter +from .base import ProcessInfo +from .config import SanitizerConfig class _PostcodeSanitizer: diff --git a/nominatim/tokenizer/sanitizers/clean_tiger_tags.py b/src/nominatim_db/tokenizer/sanitizers/clean_tiger_tags.py similarity index 83% rename from nominatim/tokenizer/sanitizers/clean_tiger_tags.py rename to src/nominatim_db/tokenizer/sanitizers/clean_tiger_tags.py index 8b4d337d..714a9256 100644 --- a/nominatim/tokenizer/sanitizers/clean_tiger_tags.py +++ b/src/nominatim_db/tokenizer/sanitizers/clean_tiger_tags.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Sanitizer that preprocesses tags from the TIGER import. @@ -14,8 +14,8 @@ It makes the following changes: from typing import Callable import re -from nominatim.tokenizer.sanitizers.base import ProcessInfo -from nominatim.tokenizer.sanitizers.config import SanitizerConfig +from .base import ProcessInfo +from .config import SanitizerConfig COUNTY_MATCH = re.compile('(.*), [A-Z][A-Z]') diff --git a/nominatim/tokenizer/sanitizers/config.py b/src/nominatim_db/tokenizer/sanitizers/config.py similarity index 97% rename from nominatim/tokenizer/sanitizers/config.py rename to src/nominatim_db/tokenizer/sanitizers/config.py index 79396a75..1ce1a1b7 100644 --- a/nominatim/tokenizer/sanitizers/config.py +++ b/src/nominatim_db/tokenizer/sanitizers/config.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Configuration for Sanitizers. @@ -11,7 +11,7 @@ from typing import Sequence, Union, Optional, Pattern, Callable, Any, TYPE_CHECK from collections import UserDict import re -from nominatim.errors import UsageError +from nominatim_core.errors import UsageError # working around missing generics in Python < 3.8 # See https://github.com/python/typing/issues/60#issuecomment-869757075 diff --git a/nominatim/tokenizer/sanitizers/delete_tags.py b/src/nominatim_db/tokenizer/sanitizers/delete_tags.py similarity index 92% rename from nominatim/tokenizer/sanitizers/delete_tags.py rename to src/nominatim_db/tokenizer/sanitizers/delete_tags.py index f18a894b..7856862c 100644 --- a/nominatim/tokenizer/sanitizers/delete_tags.py +++ b/src/nominatim_db/tokenizer/sanitizers/delete_tags.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Sanitizer which prevents certain tags from getting into the search index. @@ -56,9 +56,9 @@ Arguments: """ from typing import Callable, List, Tuple, Sequence -from nominatim.tokenizer.sanitizers.base import ProcessInfo -from nominatim.data.place_name import PlaceName -from nominatim.tokenizer.sanitizers.config import SanitizerConfig +from ...data.place_name import PlaceName +from .base import ProcessInfo +from .config import SanitizerConfig class _TagSanitizer: diff --git a/nominatim/tokenizer/sanitizers/split_name_list.py b/src/nominatim_db/tokenizer/sanitizers/split_name_list.py similarity index 81% rename from nominatim/tokenizer/sanitizers/split_name_list.py rename to src/nominatim_db/tokenizer/sanitizers/split_name_list.py index 7d0667b4..bb261359 100644 --- a/nominatim/tokenizer/sanitizers/split_name_list.py +++ b/src/nominatim_db/tokenizer/sanitizers/split_name_list.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Sanitizer that splits lists of names into their components. @@ -13,8 +13,8 @@ Arguments: """ from typing import Callable -from nominatim.tokenizer.sanitizers.base import ProcessInfo -from nominatim.tokenizer.sanitizers.config import SanitizerConfig +from .base import ProcessInfo +from .config import SanitizerConfig def create(config: SanitizerConfig) -> Callable[[ProcessInfo], None]: """ Create a name processing function that splits name values with diff --git a/nominatim/tokenizer/sanitizers/strip_brace_terms.py b/src/nominatim_db/tokenizer/sanitizers/strip_brace_terms.py similarity index 81% rename from nominatim/tokenizer/sanitizers/strip_brace_terms.py rename to src/nominatim_db/tokenizer/sanitizers/strip_brace_terms.py index 119d5693..166ba865 100644 --- a/nominatim/tokenizer/sanitizers/strip_brace_terms.py +++ b/src/nominatim_db/tokenizer/sanitizers/strip_brace_terms.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ This sanitizer creates additional name variants for names that have @@ -11,8 +11,8 @@ only the main name part with the bracket part removed. """ from typing import Callable -from nominatim.tokenizer.sanitizers.base import ProcessInfo -from nominatim.tokenizer.sanitizers.config import SanitizerConfig +from .base import ProcessInfo +from .config import SanitizerConfig def create(_: SanitizerConfig) -> Callable[[ProcessInfo], None]: diff --git a/nominatim/tokenizer/sanitizers/tag_analyzer_by_language.py b/src/nominatim_db/tokenizer/sanitizers/tag_analyzer_by_language.py similarity index 93% rename from nominatim/tokenizer/sanitizers/tag_analyzer_by_language.py rename to src/nominatim_db/tokenizer/sanitizers/tag_analyzer_by_language.py index f3bc2624..db585a50 100644 --- a/nominatim/tokenizer/sanitizers/tag_analyzer_by_language.py +++ b/src/nominatim_db/tokenizer/sanitizers/tag_analyzer_by_language.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ This sanitizer sets the `analyzer` property depending on the @@ -32,9 +32,9 @@ Arguments: """ from typing import Callable, Dict, Optional, List -from nominatim.data import country_info -from nominatim.tokenizer.sanitizers.base import ProcessInfo -from nominatim.tokenizer.sanitizers.config import SanitizerConfig +from ...data import country_info +from .base import ProcessInfo +from .config import SanitizerConfig class _AnalyzerByLanguage: """ Processor for tagging the language of names in a place. diff --git a/nominatim/tokenizer/sanitizers/tag_japanese.py b/src/nominatim_db/tokenizer/sanitizers/tag_japanese.py similarity index 93% rename from nominatim/tokenizer/sanitizers/tag_japanese.py rename to src/nominatim_db/tokenizer/sanitizers/tag_japanese.py index 3663860a..c4dc1c1b 100644 --- a/nominatim/tokenizer/sanitizers/tag_japanese.py +++ b/src/nominatim_db/tokenizer/sanitizers/tag_japanese.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ This sanitizer maps OSM data to Japanese block addresses. @@ -14,9 +14,9 @@ and quarter and neighbourhood with place. from typing import Callable from typing import List, Optional -from nominatim.tokenizer.sanitizers.base import ProcessInfo -from nominatim.tokenizer.sanitizers.config import SanitizerConfig -from nominatim.data.place_name import PlaceName +from .base import ProcessInfo +from .config import SanitizerConfig +from ...data.place_name import PlaceName def create(_: SanitizerConfig) -> Callable[[ProcessInfo], None]: """Set up the sanitizer diff --git a/src/nominatim_db/tokenizer/token_analysis/__init__.py b/src/nominatim_db/tokenizer/token_analysis/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/nominatim/tokenizer/token_analysis/base.py b/src/nominatim_db/tokenizer/token_analysis/base.py similarity index 95% rename from nominatim/tokenizer/token_analysis/base.py rename to src/nominatim_db/tokenizer/token_analysis/base.py index c7ec61c9..fc673491 100644 --- a/nominatim/tokenizer/token_analysis/base.py +++ b/src/nominatim_db/tokenizer/token_analysis/base.py @@ -1,16 +1,16 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Common data types and protocols for analysers. """ from typing import Mapping, List, Any -from nominatim.typing import Protocol -from nominatim.data.place_name import PlaceName +from nominatim_core.typing import Protocol +from ...data.place_name import PlaceName class Analyzer(Protocol): """ The `create()` function of an analysis module needs to return an diff --git a/nominatim/tokenizer/token_analysis/config_variants.py b/src/nominatim_db/tokenizer/token_analysis/config_variants.py similarity index 95% rename from nominatim/tokenizer/token_analysis/config_variants.py rename to src/nominatim_db/tokenizer/token_analysis/config_variants.py index 1258373e..b455a8a5 100644 --- a/nominatim/tokenizer/token_analysis/config_variants.py +++ b/src/nominatim_db/tokenizer/token_analysis/config_variants.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Parser for configuration for variants. @@ -12,8 +12,8 @@ from collections import defaultdict import itertools import re -from nominatim.config import flatten_config_list -from nominatim.errors import UsageError +from nominatim_core.config import flatten_config_list +from nominatim_core.errors import UsageError class ICUVariant(NamedTuple): """ A single replacement rule for variant creation. diff --git a/nominatim/tokenizer/token_analysis/generic.py b/src/nominatim_db/tokenizer/token_analysis/generic.py similarity index 93% rename from nominatim/tokenizer/token_analysis/generic.py rename to src/nominatim_db/tokenizer/token_analysis/generic.py index 1ed9bf4d..cd649e62 100644 --- a/nominatim/tokenizer/token_analysis/generic.py +++ b/src/nominatim_db/tokenizer/token_analysis/generic.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Generic processor for names that creates abbreviation variants. @@ -12,10 +12,10 @@ import itertools import datrie -from nominatim.errors import UsageError -from nominatim.data.place_name import PlaceName -from nominatim.tokenizer.token_analysis.config_variants import get_variant_config -from nominatim.tokenizer.token_analysis.generic_mutation import MutationVariantGenerator +from nominatim_core.errors import UsageError +from ...data.place_name import PlaceName +from .config_variants import get_variant_config +from .generic_mutation import MutationVariantGenerator ### Configuration section diff --git a/nominatim/tokenizer/token_analysis/generic_mutation.py b/src/nominatim_db/tokenizer/token_analysis/generic_mutation.py similarity index 92% rename from nominatim/tokenizer/token_analysis/generic_mutation.py rename to src/nominatim_db/tokenizer/token_analysis/generic_mutation.py index 612f558a..03cc63db 100644 --- a/nominatim/tokenizer/token_analysis/generic_mutation.py +++ b/src/nominatim_db/tokenizer/token_analysis/generic_mutation.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Creator for mutation variants for the generic token analysis. @@ -12,7 +12,7 @@ import itertools import logging import re -from nominatim.errors import UsageError +from nominatim_core.errors import UsageError LOG = logging.getLogger() diff --git a/nominatim/tokenizer/token_analysis/housenumbers.py b/src/nominatim_db/tokenizer/token_analysis/housenumbers.py similarity index 90% rename from nominatim/tokenizer/token_analysis/housenumbers.py rename to src/nominatim_db/tokenizer/token_analysis/housenumbers.py index a8ad3ecb..5b1236f7 100644 --- a/nominatim/tokenizer/token_analysis/housenumbers.py +++ b/src/nominatim_db/tokenizer/token_analysis/housenumbers.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Specialized processor for housenumbers. Analyses common housenumber patterns @@ -11,8 +11,8 @@ and creates variants for them. from typing import Any, List, cast import re -from nominatim.data.place_name import PlaceName -from nominatim.tokenizer.token_analysis.generic_mutation import MutationVariantGenerator +from ...data.place_name import PlaceName +from .generic_mutation import MutationVariantGenerator RE_NON_DIGIT = re.compile('[^0-9]') RE_DIGIT_ALPHA = re.compile(r'(\d)\s*([^\d\s␣])') diff --git a/nominatim/tokenizer/token_analysis/postcodes.py b/src/nominatim_db/tokenizer/token_analysis/postcodes.py similarity index 92% rename from nominatim/tokenizer/token_analysis/postcodes.py rename to src/nominatim_db/tokenizer/token_analysis/postcodes.py index 94e93645..17c4e2a6 100644 --- a/nominatim/tokenizer/token_analysis/postcodes.py +++ b/src/nominatim_db/tokenizer/token_analysis/postcodes.py @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # @@ -10,8 +10,8 @@ token, which produces variants with optional spaces. """ from typing import Any, List -from nominatim.tokenizer.token_analysis.generic_mutation import MutationVariantGenerator -from nominatim.data.place_name import PlaceName +from ...data.place_name import PlaceName +from .generic_mutation import MutationVariantGenerator ### Configuration section diff --git a/nominatim/tools/__init__.py b/src/nominatim_db/tools/__init__.py similarity index 68% rename from nominatim/tools/__init__.py rename to src/nominatim_db/tools/__init__.py index acf0a969..8f9dce6d 100644 --- a/nominatim/tools/__init__.py +++ b/src/nominatim_db/tools/__init__.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Module with functions for importing, updating Nominatim databases diff --git a/nominatim/tools/add_osm_data.py b/src/nominatim_db/tools/add_osm_data.py similarity index 89% rename from nominatim/tools/add_osm_data.py rename to src/nominatim_db/tools/add_osm_data.py index 1814b921..44ff2197 100644 --- a/nominatim/tools/add_osm_data.py +++ b/src/nominatim_db/tools/add_osm_data.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Function to add additional OSM data from a file or the API into the database. @@ -12,8 +12,9 @@ from pathlib import Path import logging import urllib -from nominatim.db.connection import connect -from nominatim.tools.exec_utils import run_osm2pgsql, get_url +from nominatim_core.db.connection import connect +from nominatim_core.utils.url_utils import get_url +from .exec_utils import run_osm2pgsql LOG = logging.getLogger() diff --git a/nominatim/tools/admin.py b/src/nominatim_db/tools/admin.py similarity index 90% rename from nominatim/tools/admin.py rename to src/nominatim_db/tools/admin.py index c37d0811..7cc0f047 100644 --- a/nominatim/tools/admin.py +++ b/src/nominatim_db/tools/admin.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Functions for database analysis and maintenance. @@ -13,12 +13,12 @@ import logging from psycopg2.extras import Json, register_hstore from psycopg2 import DataError -from nominatim.config import Configuration -from nominatim.db.connection import connect, Cursor -from nominatim.tokenizer import factory as tokenizer_factory -from nominatim.errors import UsageError -from nominatim.data.place_info import PlaceInfo -from nominatim.typing import DictCursorResult +from nominatim_core.typing import DictCursorResult +from nominatim_core.config import Configuration +from nominatim_core.db.connection import connect, Cursor +from nominatim_core.errors import UsageError +from ..tokenizer import factory as tokenizer_factory +from ..data.place_info import PlaceInfo LOG = logging.getLogger() diff --git a/nominatim/tools/check_database.py b/src/nominatim_db/tools/check_database.py similarity index 96% rename from nominatim/tools/check_database.py rename to src/nominatim_db/tools/check_database.py index 288eb916..d2659877 100644 --- a/nominatim/tools/check_database.py +++ b/src/nominatim_db/tools/check_database.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Collection of functions that check if the database is complete and functional. @@ -11,13 +11,13 @@ from typing import Callable, Optional, Any, Union, Tuple, Mapping, List from enum import Enum from textwrap import dedent -from nominatim.config import Configuration -from nominatim.db.connection import connect, Connection -from nominatim.db import properties -from nominatim.errors import UsageError -from nominatim.tokenizer import factory as tokenizer_factory -from nominatim.tools import freeze -from nominatim.version import NOMINATIM_VERSION, parse_version +from nominatim_core.config import Configuration +from nominatim_core.db.connection import connect, Connection +from nominatim_core.db import properties +from nominatim_core.errors import UsageError +from ..tokenizer import factory as tokenizer_factory +from . import freeze +from ..version import NOMINATIM_VERSION, parse_version CHECKLIST = [] diff --git a/nominatim/tools/collect_os_info.py b/src/nominatim_db/tools/collect_os_info.py similarity index 95% rename from nominatim/tools/collect_os_info.py rename to src/nominatim_db/tools/collect_os_info.py index 779c55c7..5096ce69 100644 --- a/nominatim/tools/collect_os_info.py +++ b/src/nominatim_db/tools/collect_os_info.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Collection of host system information including software versions, memory, @@ -17,9 +17,9 @@ from typing import List, Optional, Tuple, Union import psutil from psycopg2.extensions import make_dsn, parse_dsn -from nominatim.config import Configuration -from nominatim.db.connection import connect -from nominatim.version import NOMINATIM_VERSION +from nominatim_core.config import Configuration +from nominatim_core.db.connection import connect +from ..version import NOMINATIM_VERSION def convert_version(ver_tup: Tuple[int, int]) -> str: diff --git a/nominatim/tools/convert_sqlite.py b/src/nominatim_db/tools/convert_sqlite.py similarity index 97% rename from nominatim/tools/convert_sqlite.py rename to src/nominatim_db/tools/convert_sqlite.py index 1e7beae5..47ab63b7 100644 --- a/nominatim/tools/convert_sqlite.py +++ b/src/nominatim_db/tools/convert_sqlite.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Exporting a Nominatim database to SQlite. @@ -14,10 +14,10 @@ from pathlib import Path import sqlalchemy as sa -from nominatim.typing import SaSelect, SaRow -from nominatim.db.sqlalchemy_types import Geometry, IntArray -from nominatim.api.search.query_analyzer_factory import make_query_analyzer -import nominatim.api as napi +import nominatim_api as napi +from nominatim_api.search.query_analyzer_factory import make_query_analyzer +from nominatim_core.typing import SaSelect, SaRow +from nominatim_core.db.sqlalchemy_types import Geometry, IntArray LOG = logging.getLogger() diff --git a/nominatim/tools/database_import.py b/src/nominatim_db/tools/database_import.py similarity index 94% rename from nominatim/tools/database_import.py rename to src/nominatim_db/tools/database_import.py index de7e6a4a..84f2f325 100644 --- a/nominatim/tools/database_import.py +++ b/src/nominatim_db/tools/database_import.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Functions for setting up and importing a new Nominatim database. @@ -17,14 +17,13 @@ from pathlib import Path import psutil from psycopg2 import sql as pysql -from nominatim.config import Configuration -from nominatim.db.connection import connect, get_pg_env, Connection -from nominatim.db.async_connection import DBConnection -from nominatim.db.sql_preprocessor import SQLPreprocessor -from nominatim.tools.exec_utils import run_osm2pgsql -from nominatim.errors import UsageError -from nominatim.version import POSTGRESQL_REQUIRED_VERSION, \ - POSTGIS_REQUIRED_VERSION +from nominatim_core.errors import UsageError +from nominatim_core.config import Configuration +from nominatim_core.db.connection import connect, get_pg_env, Connection +from nominatim_core.db.async_connection import DBConnection +from nominatim_core.db.sql_preprocessor import SQLPreprocessor +from .exec_utils import run_osm2pgsql +from ..version import POSTGRESQL_REQUIRED_VERSION, POSTGIS_REQUIRED_VERSION LOG = logging.getLogger() diff --git a/nominatim/tools/exec_utils.py b/src/nominatim_db/tools/exec_utils.py similarity index 78% rename from nominatim/tools/exec_utils.py rename to src/nominatim_db/tools/exec_utils.py index 9bf28a03..5450c43b 100644 --- a/nominatim/tools/exec_utils.py +++ b/src/nominatim_db/tools/exec_utils.py @@ -1,22 +1,20 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Helper functions for executing external programs. """ -from typing import Any, Mapping, IO +from typing import Any, Mapping import logging import os import subprocess import shutil -import urllib.request as urlrequest -from nominatim.typing import StrPath -from nominatim.version import NOMINATIM_VERSION -from nominatim.db.connection import get_pg_env +from nominatim_core.typing import StrPath +from nominatim_core.db.connection import get_pg_env LOG = logging.getLogger() @@ -84,17 +82,3 @@ def run_osm2pgsql(options: Mapping[str, Any]) -> None: subprocess.run(cmd, cwd=options.get('cwd', '.'), input=options.get('import_data'), env=env, check=True) - - -def get_url(url: str) -> str: - """ Get the contents from the given URL and return it as a UTF-8 string. - """ - headers = {"User-Agent": f"Nominatim/{NOMINATIM_VERSION!s}"} - - try: - request = urlrequest.Request(url, headers=headers) - with urlrequest.urlopen(request) as response: # type: IO[bytes] - return response.read().decode('utf-8') - except Exception: - LOG.fatal('Failed to load URL: %s', url) - raise diff --git a/nominatim/tools/freeze.py b/src/nominatim_db/tools/freeze.py similarity index 89% rename from nominatim/tools/freeze.py rename to src/nominatim_db/tools/freeze.py index 602def55..2023bb8a 100644 --- a/nominatim/tools/freeze.py +++ b/src/nominatim_db/tools/freeze.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Functions for removing unnecessary data from the database. @@ -12,7 +12,7 @@ from pathlib import Path from psycopg2 import sql as pysql -from nominatim.db.connection import Connection +from nominatim_core.db.connection import Connection UPDATE_TABLES = [ 'address_levels', diff --git a/nominatim/tools/migration.py b/src/nominatim_db/tools/migration.py similarity index 97% rename from nominatim/tools/migration.py rename to src/nominatim_db/tools/migration.py index 02b7d19a..0712f187 100644 --- a/nominatim/tools/migration.py +++ b/src/nominatim_db/tools/migration.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Functions for database migration to newer software versions. @@ -12,13 +12,13 @@ import logging from psycopg2 import sql as pysql -from nominatim.config import Configuration -from nominatim.db import properties -from nominatim.db.connection import connect, Connection -from nominatim.version import NominatimVersion, NOMINATIM_VERSION, parse_version -from nominatim.tools import refresh -from nominatim.tokenizer import factory as tokenizer_factory -from nominatim.errors import UsageError +from nominatim_core.errors import UsageError +from nominatim_core.config import Configuration +from nominatim_core.db import properties +from nominatim_core.db.connection import connect, Connection +from ..version import NominatimVersion, NOMINATIM_VERSION, parse_version +from ..tokenizer import factory as tokenizer_factory +from . import refresh LOG = logging.getLogger() diff --git a/nominatim/tools/postcodes.py b/src/nominatim_db/tools/postcodes.py similarity index 96% rename from nominatim/tools/postcodes.py rename to src/nominatim_db/tools/postcodes.py index 7171e25d..772651b3 100644 --- a/nominatim/tools/postcodes.py +++ b/src/nominatim_db/tools/postcodes.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Functions for importing, updating and otherwise maintaining the table @@ -18,10 +18,10 @@ from math import isfinite from psycopg2 import sql as pysql -from nominatim.db.connection import connect, Connection -from nominatim.utils.centroid import PointsCentroid -from nominatim.data.postcode_format import PostcodeFormatter, CountryPostcodeMatcher -from nominatim.tokenizer.base import AbstractAnalyzer, AbstractTokenizer +from nominatim_core.db.connection import connect, Connection +from nominatim_core.utils.centroid import PointsCentroid +from ..data.postcode_format import PostcodeFormatter, CountryPostcodeMatcher +from ..tokenizer.base import AbstractAnalyzer, AbstractTokenizer LOG = logging.getLogger() diff --git a/nominatim/tools/refresh.py b/src/nominatim_db/tools/refresh.py similarity index 97% rename from nominatim/tools/refresh.py rename to src/nominatim_db/tools/refresh.py index a200ee13..96608097 100644 --- a/nominatim/tools/refresh.py +++ b/src/nominatim_db/tools/refresh.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Functions for bringing auxiliary data in the database up-to-date. @@ -16,11 +16,11 @@ from pathlib import Path from psycopg2 import sql as pysql -from nominatim.config import Configuration -from nominatim.db.connection import Connection, connect -from nominatim.db.utils import execute_file, CopyBuffer -from nominatim.db.sql_preprocessor import SQLPreprocessor -from nominatim.version import NOMINATIM_VERSION +from nominatim_core.config import Configuration +from nominatim_core.db.connection import Connection, connect +from nominatim_core.db.utils import execute_file, CopyBuffer +from nominatim_core.db.sql_preprocessor import SQLPreprocessor +from ..version import NOMINATIM_VERSION LOG = logging.getLogger() diff --git a/nominatim/tools/replication.py b/src/nominatim_db/tools/replication.py similarity index 96% rename from nominatim/tools/replication.py rename to src/nominatim_db/tools/replication.py index edd63e49..f9421bb8 100644 --- a/nominatim/tools/replication.py +++ b/src/nominatim_db/tools/replication.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Functions for updating a database from a replication source. @@ -17,10 +17,11 @@ import types import urllib.request as urlrequest import requests -from nominatim.db import status -from nominatim.db.connection import Connection, connect -from nominatim.tools.exec_utils import run_osm2pgsql -from nominatim.errors import UsageError + +from nominatim_core.errors import UsageError +from nominatim_core.db import status +from nominatim_core.db.connection import Connection, connect +from .exec_utils import run_osm2pgsql try: from osmium.replication.server import ReplicationServer diff --git a/src/nominatim_db/tools/special_phrases/__init__.py b/src/nominatim_db/tools/special_phrases/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/nominatim/tools/special_phrases/importer_statistics.py b/src/nominatim_db/tools/special_phrases/importer_statistics.py similarity index 95% rename from nominatim/tools/special_phrases/importer_statistics.py rename to src/nominatim_db/tools/special_phrases/importer_statistics.py index 0bb118c8..b197b835 100644 --- a/nominatim/tools/special_phrases/importer_statistics.py +++ b/src/nominatim_db/tools/special_phrases/importer_statistics.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Contains the class which handles statistics for the diff --git a/nominatim/tools/special_phrases/sp_csv_loader.py b/src/nominatim_db/tools/special_phrases/sp_csv_loader.py similarity index 84% rename from nominatim/tools/special_phrases/sp_csv_loader.py rename to src/nominatim_db/tools/special_phrases/sp_csv_loader.py index 400f9fa9..9f472e68 100644 --- a/nominatim/tools/special_phrases/sp_csv_loader.py +++ b/src/nominatim_db/tools/special_phrases/sp_csv_loader.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Module containing the SPCsvLoader class. @@ -12,8 +12,9 @@ from typing import Iterable import csv import os -from nominatim.tools.special_phrases.special_phrase import SpecialPhrase -from nominatim.errors import UsageError + +from nominatim_core.errors import UsageError +from .special_phrase import SpecialPhrase class SPCsvLoader: """ diff --git a/nominatim/tools/special_phrases/sp_importer.py b/src/nominatim_db/tools/special_phrases/sp_importer.py similarity index 96% rename from nominatim/tools/special_phrases/sp_importer.py rename to src/nominatim_db/tools/special_phrases/sp_importer.py index 06b59fd0..9749db3e 100644 --- a/nominatim/tools/special_phrases/sp_importer.py +++ b/src/nominatim_db/tools/special_phrases/sp_importer.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Module containing the class handling the import @@ -19,12 +19,12 @@ import re from psycopg2.sql import Identifier, SQL -from nominatim.config import Configuration -from nominatim.db.connection import Connection -from nominatim.tools.special_phrases.importer_statistics import SpecialPhrasesImporterStatistics -from nominatim.tools.special_phrases.special_phrase import SpecialPhrase -from nominatim.tokenizer.base import AbstractTokenizer -from nominatim.typing import Protocol +from nominatim_core.typing import Protocol +from nominatim_core.config import Configuration +from nominatim_core.db.connection import Connection +from .importer_statistics import SpecialPhrasesImporterStatistics +from .special_phrase import SpecialPhrase +from ...tokenizer.base import AbstractTokenizer LOG = logging.getLogger() diff --git a/nominatim/tools/special_phrases/sp_wiki_loader.py b/src/nominatim_db/tools/special_phrases/sp_wiki_loader.py similarity index 89% rename from nominatim/tools/special_phrases/sp_wiki_loader.py rename to src/nominatim_db/tools/special_phrases/sp_wiki_loader.py index cbeaeabf..c7e38336 100644 --- a/nominatim/tools/special_phrases/sp_wiki_loader.py +++ b/src/nominatim_db/tools/special_phrases/sp_wiki_loader.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Module containing the SPWikiLoader class. @@ -11,9 +11,9 @@ from typing import Iterable import re import logging -from nominatim.config import Configuration -from nominatim.tools.special_phrases.special_phrase import SpecialPhrase -from nominatim.tools.exec_utils import get_url +from nominatim_core.config import Configuration +from nominatim_core.utils.url_utils import get_url +from .special_phrase import SpecialPhrase LOG = logging.getLogger() diff --git a/nominatim/tools/special_phrases/special_phrase.py b/src/nominatim_db/tools/special_phrases/special_phrase.py similarity index 92% rename from nominatim/tools/special_phrases/special_phrase.py rename to src/nominatim_db/tools/special_phrases/special_phrase.py index 40f6a9e4..cf5c5048 100644 --- a/nominatim/tools/special_phrases/special_phrase.py +++ b/src/nominatim_db/tools/special_phrases/special_phrase.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Module containing the class SpecialPhrase. diff --git a/nominatim/tools/tiger_data.py b/src/nominatim_db/tools/tiger_data.py similarity index 90% rename from nominatim/tools/tiger_data.py rename to src/nominatim_db/tools/tiger_data.py index 70cecae5..6030a38a 100644 --- a/nominatim/tools/tiger_data.py +++ b/src/nominatim_db/tools/tiger_data.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Functions for importing tiger data and handling tarbar and directory files @@ -16,14 +16,14 @@ import tarfile from psycopg2.extras import Json -from nominatim.config import Configuration -from nominatim.db.connection import connect -from nominatim.db.async_connection import WorkerPool -from nominatim.db.sql_preprocessor import SQLPreprocessor -from nominatim.errors import UsageError -from nominatim.data.place_info import PlaceInfo -from nominatim.tokenizer.base import AbstractAnalyzer, AbstractTokenizer -from nominatim.tools import freeze +from nominatim_core.config import Configuration +from nominatim_core.db.connection import connect +from nominatim_core.db.async_connection import WorkerPool +from nominatim_core.db.sql_preprocessor import SQLPreprocessor +from nominatim_core.errors import UsageError +from ..data.place_info import PlaceInfo +from ..tokenizer.base import AbstractAnalyzer, AbstractTokenizer +from . import freeze LOG = logging.getLogger() diff --git a/nominatim/version.py b/src/nominatim_db/version.py similarity index 95% rename from nominatim/version.py rename to src/nominatim_db/version.py index 2ece2d79..ca383c85 100644 --- a/nominatim/version.py +++ b/src/nominatim_db/version.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2023 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Version information for Nominatim. -- 2.39.5