diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ef590a..2c7610f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning]. ## [Unreleased] +## [0.0.25] - 2025-06-21 + +### Removed in 0.0.25 + +- Use of packaging module + ## [0.0.24] - 2025-06-20 ### Added in 0.0.24 diff --git a/setup.cfg b/setup.cfg index c3e44b5..b55ad69 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = python-tools -version = 0.0.24 +version = 0.0.25 author = senzing author_email = support@senzing.com description = Python Tools diff --git a/sz_tools/_project_helpers.py b/sz_tools/_project_helpers.py index 9296d5b..e1a9581 100644 --- a/sz_tools/_project_helpers.py +++ b/sz_tools/_project_helpers.py @@ -1,13 +1,12 @@ """Helpers for creating and updating projects""" import json +import operator import shutil from dataclasses import dataclass, field from pathlib import Path from typing import Any -from packaging import version as p_version - V3_BACKUP_PATH = "v3_to_v4_upgrade_backups" V4_BUILD = "szBuildVersion.json" SZ_SYS_PATH = Path("/opt/senzing") @@ -63,7 +62,10 @@ @dataclass() class SzBuildDetails: - """Build information for a project or Senzing SDK system install""" + """ + Build information for a project or Senzing SDK system install + SzBuildDetails(platform='Linux', version='4.0.0', build_version='4.0.0.25164', build_number='2025_06_13__13_07', major=4, minor=0, micro=0) + """ platform: str version: str @@ -72,13 +74,48 @@ class SzBuildDetails: major: int = field(init=False) minor: int = field(init=False) micro: int = field(init=False) + build_v: int = field(init=False) def __post_init__(self) -> None: - self.version_parsed = p_version.parse(self.version) - self.build_version_parsed = p_version.parse(self.build_version) - self.major = self.version_parsed.major - self.minor = self.version_parsed.minor - self.micro = self.version_parsed.micro + self.major, self.minor, self.micro, self.build_v = [int(n) for n in self.build_version.split(".")] + + def _operators(self, other: "SzBuildDetails", operator_: Any) -> tuple[bool, ...]: + """Check instances of version details are with different operators""" + to_compare = ( + (self.major, other.major), + (self.minor, other.minor), + (self.micro, other.micro), + (self.build_v, other.build_v), + ) + return tuple(operator_(t[0], t[1]) for t in to_compare) + + def __lt__(self, other: "SzBuildDetails") -> bool: + if not isinstance(other, SzBuildDetails): + return NotImplemented + + major_equal, minor_equal, micro_equal, _ = self._operators(other, operator.eq) + major_lt, minor_lt, micro_lt, build_v_lt = self._operators(other, operator.lt) + + if major_lt or ( + major_equal and any((minor_lt, all((minor_equal, micro_lt)), all((minor_equal, micro_equal, build_v_lt)))) + ): + return True + + return False + + def __gt__(self, other: "SzBuildDetails") -> bool: + if not isinstance(other, SzBuildDetails): + return NotImplemented + + major_equal, minor_equal, micro_equal, _ = self._operators(other, operator.eq) + major_gt, minor_gt, micro_gt, build_v_gt = self._operators(other, operator.gt) + + if major_gt or ( + major_equal and any((minor_gt, all((minor_equal, micro_gt)), all((minor_equal, micro_equal, build_v_gt)))) + ): + return True + + return False def get_build_details(path: Path) -> SzBuildDetails: diff --git a/sz_tools/sz_update_project b/sz_tools/sz_update_project index 1aaa47b..72d74d0 100755 --- a/sz_tools/sz_update_project +++ b/sz_tools/sz_update_project @@ -170,29 +170,29 @@ def pre_check(project_path: Path) -> tuple[SzBuildDetails, SzBuildDetails]: try: proj_build_file = v3_project_build_file if v3_project_build_file in proj_listing else v4_project_build_file - proj_build_details = get_build_details(proj_build_file) - sys_build_details = get_build_details(V4_SYS_BUILD) + proj_build = get_build_details(proj_build_file) + sys_build = get_build_details(V4_SYS_BUILD) except (OSError, TypeError) as err: print(f"\nERROR: Trying to read {proj_build_file} or {V4_SYS_BUILD} to collect version information: {err}") sys.exit(1) - if proj_build_details.major not in (3, 4) or sys_build_details.major != 4: + if proj_build.major not in (3, 4) or sys_build.major != 4: print(f"\nERROR: {MODULE_NAME} updates a V3 project to V4, or V4.n.n to a newer release") - print(f"\tProject version: {proj_build_details.version}") - print(f"\tSystem install version: {sys_build_details.version}") + print(f"\tProject version: {proj_build.build_version}") + print(f"\tSystem install version: {sys_build.build_version}") sys.exit(1) - if sys_build_details.version_parsed < proj_build_details.version_parsed: + if sys_build < proj_build: print("\nNo update required, project is newer than the system install") - print(f"\tProject version: {proj_build_details.version}") - print(f"\tSystem install version: {sys_build_details.version}") + print(f"\tProject version: {proj_build.build_version}") + print(f"\tSystem install version: {sys_build.build_version}") sys.exit(0) - if sys_build_details.version_parsed == proj_build_details.version_parsed: - print(f"\nNo update required, project and system install are the same version - {proj_build_details.version}") + if sys_build.build_version == proj_build.build_version: + print(f"\nNo update required, project & system install are the same version: {proj_build.build_version}") sys.exit(0) - return (proj_build_details, sys_build_details) + return (proj_build, sys_build) def remove_dir(dir_: Path, excludes: list[Path]) -> None: