diff --git a/.gitignore b/.gitignore index b7e77f54..0b0d2c45 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ docs/develop/*.png build +dist +.coverage .vagrant data/country_osm_grid.sql.gz diff --git a/nominatim/__main__.py b/nominatim/__main__.py new file mode 100644 index 00000000..b211afaf --- /dev/null +++ b/nominatim/__main__.py @@ -0,0 +1,4 @@ +if __name__ == '__main__': + from nominatim import cli + + exit(cli.nominatim(module_dir=None, osm2pgsql_path=None)) diff --git a/nominatim/config.py b/nominatim/config.py index 3344a425..6bfc6076 100644 --- a/nominatim/config.py +++ b/nominatim/config.py @@ -83,7 +83,7 @@ class Configuration: """ Set paths to library functions and data. """ for key, value in kwargs.items(): - setattr(self.lib_dir, key, Path(value)) + setattr(self.lib_dir, key, None if value is None else Path(value)) def __getattr__(self, name: str) -> str: diff --git a/nominatim/tools/exec_utils.py b/nominatim/tools/exec_utils.py index db89c389..9bf28a03 100644 --- a/nominatim/tools/exec_utils.py +++ b/nominatim/tools/exec_utils.py @@ -11,6 +11,7 @@ from typing import Any, Mapping, IO import logging import os import subprocess +import shutil import urllib.request as urlrequest from nominatim.typing import StrPath @@ -30,7 +31,14 @@ def run_osm2pgsql(options: Mapping[str, Any]) -> None: """ Run osm2pgsql with the given options. """ env = get_pg_env(options['dsn']) - cmd = [str(options['osm2pgsql']), + + osm2pgsql_cmd = options['osm2pgsql'] + if osm2pgsql_cmd is None: + osm2pgsql_cmd = shutil.which('osm2pgsql') + if osm2pgsql_cmd is None: + raise RuntimeError('osm2pgsql executable not found. Please install osm2pgsql first.') + + cmd = [str(osm2pgsql_cmd), '--slim', '--log-progress', 'true', '--number-processes', '1' if options['append'] else str(options['threads']), diff --git a/nominatim/version.py b/nominatim/version.py index 9ef22a87..2ece2d79 100644 --- a/nominatim/version.py +++ b/nominatim/version.py @@ -33,6 +33,12 @@ class NominatimVersion(NamedTuple): def __str__(self) -> str: return f"{self.major}.{self.minor}.{self.patch_level}-{self.db_patch_level}" + def release_version(self) -> str: + """ Return the release version in semantic versioning format. + + The release version does not include the database patch version. + """ + return f"{self.major}.{self.minor}.{self.patch_level}" NOMINATIM_VERSION = NominatimVersion(4, 4, 99, 1) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..3433f693 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,61 @@ +[project] +name = "nominatim" +description = "A tool for building a database of OpenStreetMap for geocoding and for searching the database." +readme = "README.md" +requires-python = ">=3.7" +license = 'GPL-3.0-or-later' +maintainers = [ + { name = "Sarah Hoffmann", email = "lonvia@denofr.de" } +] +keywords = [ "geocoding", "OpenStreetMap", "search" ] +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: GNU General Public License (GPL)", + "Operating System :: OS Independent", +] +dependencies = [ + "psycopg2", + "python-dotenv", + "psutil", + "jinja2", + "SQLAlchemy>=1.4.31", + "asyncpg>=0.8", + "PyICU", + "pyYAML>=5.1", + "datrie" +] +dynamic = ["version"] + +[project.urls] +Homepage = "https://nominatim.org" +Issues = "https://github.com/osm-search/Nominatim/issues" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.version] +source = "code" +path = "nominatim/version.py" +expression = "NOMINATIM_VERSION.release_version()" + +[tool.hatch.build.targets.sdist] +only-include = ["nominatim", "lib-sql", "settings", + "docs", "man", "data", "munin", + "test/python", "test/bdd", "test/testdata", "test/testdb"] +artifacts = ["data/country_osm_grid.sql.gz"] + +[tool.hatch.build.targets.wheel] +only-include = ["nominatim", "lib-sql", "settings", + "data/words.sql", "data/country_osm_grid.sql.gz", + "wheel_build/nominatim"] +exclude = ["nominatim/paths.py"] + +[tool.hatch.build.targets.wheel.shared-scripts] +"wheel_build/shared/scripts" = "/" + +[tool.hatch.build.targets.wheel.sources] +"wheel_build/nominatim" = "nominatim" +"lib-sql" = "nominatim/resources/lib-sql" +"settings" = "nominatim/resources/settings" +"data" = "nominatim/resources" diff --git a/wheel_build/nominatim/paths.py b/wheel_build/nominatim/paths.py new file mode 100644 index 00000000..2294834f --- /dev/null +++ b/wheel_build/nominatim/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 = None +DATA_DIR = (Path(__file__) / '..' / 'resources').resolve() +SQLLIB_DIR = (DATA_DIR / 'lib-sql') +CONFIG_DIR = (DATA_DIR / 'settings') diff --git a/wheel_build/shared/scripts/nominatim b/wheel_build/shared/scripts/nominatim new file mode 100755 index 00000000..e12f77d1 --- /dev/null +++ b/wheel_build/shared/scripts/nominatim @@ -0,0 +1,5 @@ +#!python3 + +from nominatim import cli + +exit(cli.nominatim(module_dir=None, osm2pgsql_path=None))