]> git.openstreetmap.org Git - nominatim.git/blobdiff - src/nominatim_db/version.py
check-database: check for another required db index
[nominatim.git] / src / nominatim_db / version.py
index 34e3b432e37e4623c52ab1fece54078f62ccd1ab..fceee5d04f6d961daa07ada58629cc928c643679 100644 (file)
@@ -7,13 +7,56 @@
 """
 Version information for Nominatim.
 """
 """
 Version information for Nominatim.
 """
-from typing import Optional
+from typing import NamedTuple, Optional
 
 # See also https://github.com/PyCQA/pylint/issues/6006
 # pylint: disable=useless-import-alias,unused-import
 
 
 # See also https://github.com/PyCQA/pylint/issues/6006
 # pylint: disable=useless-import-alias,unused-import
 
-from nominatim_core.version import (NominatimVersion as NominatimVersion,
-                                    parse_version as parse_version)
+class NominatimVersion(NamedTuple):
+    """ Version information for Nominatim. We follow semantic versioning.
+
+        Major, minor and patch_level refer to the last released version.
+        The database patch level tracks important changes between releases
+        and must always be increased when there is a change to the database or code
+        that requires a migration.
+
+        When adding a migration on the development branch, raise the patch level
+        to 99 to make sure that the migration is applied when updating from a
+        patch release to the next minor version. Patch releases usually shouldn't
+        have migrations in them. When they are needed, then make sure that the
+        migration can be reapplied and set the migration version to the appropriate
+        patch level when cherry-picking the commit with the migration.
+    """
+
+    major: int
+    minor: int
+    patch_level: int
+    db_patch_level: int
+
+    def __str__(self) -> str:
+        if self.db_patch_level is None:
+            return f"{self.major}.{self.minor}.{self.patch_level}"
+
+        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}"
+
+
+
+def parse_version(version: str) -> NominatimVersion:
+    """ Parse a version string into a version consisting of a tuple of
+        four ints: major, minor, patch level, database patch level
+
+        This is the reverse operation of `version_str()`.
+    """
+    parts = version.split('.')
+    return NominatimVersion(*[int(x) for x in parts[:2] + parts[2].split('-')])
+
 
 NOMINATIM_VERSION = parse_version('4.4.99-1')
 
 
 NOMINATIM_VERSION = parse_version('4.4.99-1')