|
25 | 25 | from configparser import NoOptionError, NoSectionError, RawConfigParser |
26 | 26 |
|
27 | 27 | from packaging.utils import canonicalize_name |
| 28 | +from packaging.version import Version |
28 | 29 |
|
29 | 30 | from .source_checkout_ast import SetupFindingVisitor, UNKNOWN |
30 | 31 |
|
@@ -139,22 +140,41 @@ def _translate_caret(specifier: str) -> str: |
139 | 140 | Given a string like "^0.2.3" returns ">=0.2.3,<0.3.0". |
140 | 141 | """ |
141 | 142 | assert "," not in specifier |
142 | | - parts = specifier[1:].split(".") |
143 | | - while len(parts) < 3: |
144 | | - parts.append("0") |
145 | | - |
146 | | - for i in range(len(parts)): |
147 | | - if parts[i] != "0": |
148 | | - # The docs are not super clear about how this behaves, but let's |
149 | | - # assume integer-valued parts and just let the exception raise |
150 | | - # otherwise. |
151 | | - incremented = parts[:] |
152 | | - incremented[i] = str(int(parts[i]) + 1) |
153 | | - del incremented[i + 1 :] |
154 | | - incremented_version = ".".join(incremented) |
155 | | - break |
| 143 | + |
| 144 | + version = Version(specifier[1:]) |
| 145 | + |
| 146 | + # version.release takes out the pre- and post- parts and leaves only numbers |
| 147 | + version_parts = list(version.release) |
| 148 | + |
| 149 | + if version.is_prerelease or version.is_postrelease: |
| 150 | + # Return next version, incrementing the least significant number |
| 151 | + version_parts[-1] += 1 |
| 152 | + |
156 | 153 | else: |
157 | | - raise ValueError("All components were zero?") |
| 154 | + if version.major == version.minor == version.micro == 0: |
| 155 | + raise ValueError("All components were zero?") |
| 156 | + |
| 157 | + if version.major > 0 or version.minor == 0: |
| 158 | + # Next major version |
| 159 | + version_parts[0] += 1 |
| 160 | + |
| 161 | + # Set the rest of the values to 0 |
| 162 | + for i in range(1, len(version_parts)): |
| 163 | + version_parts[i] = 0 |
| 164 | + |
| 165 | + elif version.minor > 0 or version.micro == 0: |
| 166 | + # Next minor version. |
| 167 | + version_parts[1] += 1 |
| 168 | + |
| 169 | + # Set the rest of the values to 0 |
| 170 | + for i in range(2, len(version_parts)): |
| 171 | + version_parts[i] = 0 |
| 172 | + |
| 173 | + else: |
| 174 | + # Next patch version |
| 175 | + version_parts[2] += 1 |
| 176 | + |
| 177 | + incremented_version = ".".join([str(i) for i in version_parts]) |
158 | 178 | return f">={specifier[1:]},<{incremented_version}" |
159 | 179 |
|
160 | 180 |
|
|
0 commit comments