A Python port of the Invisible Internet Project (I2P)
1"""Version comparison for I2P router updates.
2
3Handles semver-like version strings (e.g. "0.9.62", "2.4.0").
4
5Ported from net.i2p.CoreVersion.
6"""
7
8from __future__ import annotations
9
10from dataclasses import dataclass
11
12
13@dataclass
14class Version:
15 """Parsed version number."""
16 major: int
17 minor: int
18 patch: int
19
20 def __init__(self, version_str: str) -> None:
21 parts = version_str.strip().split(".")
22 self.major = int(parts[0]) if len(parts) > 0 else 0
23 self.minor = int(parts[1]) if len(parts) > 1 else 0
24 self.patch = int(parts[2]) if len(parts) > 2 else 0
25
26 def __str__(self) -> str:
27 return f"{self.major}.{self.minor}.{self.patch}"
28
29 def as_tuple(self) -> tuple[int, int, int]:
30 return (self.major, self.minor, self.patch)
31
32
33def compare_versions(a: str, b: str) -> int:
34 """Compare two version strings.
35
36 Returns:
37 > 0 if a is newer than b
38 0 if equal
39 < 0 if a is older than b
40 """
41 va = Version(a).as_tuple()
42 vb = Version(b).as_tuple()
43 if va > vb:
44 return 1
45 elif va < vb:
46 return -1
47 return 0