A class that can be used to compare version strings.
| 1075 | |
| 1076 | |
| 1077 | class Version(tuple[int, ...]): |
| 1078 | """A class that can be used to compare version strings.""" |
| 1079 | |
| 1080 | def __new__(cls, *version: int) -> Version: |
| 1081 | padded_version = cls._padded(version, 4) |
| 1082 | return super().__new__(cls, tuple(padded_version)) |
| 1083 | |
| 1084 | @classmethod |
| 1085 | def _padded(cls, iter: Any, length: int, padding: int = 0) -> list[int]: |
| 1086 | as_list = list(iter) |
| 1087 | if len(as_list) < length: |
| 1088 | for _ in range(length - len(as_list)): |
| 1089 | as_list.append(padding) |
| 1090 | return as_list |
| 1091 | |
| 1092 | @classmethod |
| 1093 | def from_string(cls, version_string: str) -> Version: |
| 1094 | mod = 0 |
| 1095 | bump_patch_level = False |
| 1096 | if version_string.endswith("+"): |
| 1097 | version_string = version_string[0:-1] |
| 1098 | mod = 1 |
| 1099 | elif version_string.endswith("-pre-"): |
| 1100 | version_string = version_string[0:-5] |
| 1101 | mod = -1 |
| 1102 | elif version_string.endswith("-"): |
| 1103 | version_string = version_string[0:-1] |
| 1104 | mod = -1 |
| 1105 | # Deal with .devX substrings |
| 1106 | if ".dev" in version_string: |
| 1107 | version_string = version_string[0 : version_string.find(".dev")] |
| 1108 | mod = -1 |
| 1109 | # Deal with '-rcX' substrings |
| 1110 | if "-rc" in version_string: |
| 1111 | version_string = version_string[0 : version_string.find("-rc")] |
| 1112 | mod = -1 |
| 1113 | # Deal with git describe generated substrings |
| 1114 | elif "-" in version_string: |
| 1115 | version_string = version_string[0 : version_string.find("-")] |
| 1116 | mod = -1 |
| 1117 | bump_patch_level = True |
| 1118 | |
| 1119 | version = [int(part) for part in version_string.split(".")] |
| 1120 | version = cls._padded(version, 3) |
| 1121 | # Make from_string and from_version_array agree. For example: |
| 1122 | # MongoDB Enterprise > db.runCommand('buildInfo').versionArray |
| 1123 | # [ 3, 2, 1, -100 ] |
| 1124 | # MongoDB Enterprise > db.runCommand('buildInfo').version |
| 1125 | # 3.2.0-97-g1ef94fe |
| 1126 | if bump_patch_level: |
| 1127 | version[-1] += 1 |
| 1128 | version.append(mod) |
| 1129 | |
| 1130 | return Version(*version) |
| 1131 | |
| 1132 | @classmethod |
| 1133 | def from_version_array(cls, version_array: Any) -> Version: |
| 1134 | version = list(version_array) |
no outgoing calls
no test coverage detected