|
30 | 30 | ] |
31 | 31 |
|
32 | 32 |
|
| 33 | +def resolve_python_version_specifier(python_version): |
| 34 | + """Resolves the user-provided Python version string to a version specifier. |
| 35 | +
|
| 36 | + Examples: |
| 37 | +
|
| 38 | + User provides: 3.12 |
| 39 | + Resolved version specifier: ~=3.12.0 |
| 40 | + Compatible versions: 3.12.0, 3.12.1, 3.12.2, etc. |
| 41 | +
|
| 42 | + User provides: 3.12.2 |
| 43 | + Resolved version specifier: ==3.12.2 |
| 44 | + Compatible versions: 3.12.2 |
| 45 | +
|
| 46 | + See https://packaging.python.org/en/latest/specifications/version-specifiers/#compatible-release |
| 47 | + """ |
| 48 | + version_parts = python_version.split(".") |
| 49 | + if len(version_parts) == 2: |
| 50 | + major, minor = version_parts |
| 51 | + patch = "0" |
| 52 | + operator = "~=" |
| 53 | + elif len(version_parts) == 3: |
| 54 | + major, minor, patch = version_parts |
| 55 | + operator = "==" |
| 56 | + else: |
| 57 | + raise ValueError( |
| 58 | + f"Invalid Python version specifier {python_version}. " |
| 59 | + "Please specify version as <major>.<minor> or <major>.<minor>.<patch>, " |
| 60 | + "e.g., 3.10, 3.10.1, etc." |
| 61 | + ) |
| 62 | + |
| 63 | + resolved_python_version = ".".join((major, minor, patch)) |
| 64 | + return f"{operator}{resolved_python_version}" |
| 65 | + |
| 66 | + |
| 67 | +def write_python_version(python_version): |
| 68 | + with open("pyproject.toml", "r") as f: |
| 69 | + doc = tomlkit.parse(f.read()) |
| 70 | + |
| 71 | + doc["project"]["requires-python"] = resolve_python_version_specifier(python_version) |
| 72 | + with open("pyproject.toml", "w") as f: |
| 73 | + f.write(tomlkit.dumps(doc)) |
| 74 | + |
| 75 | + |
33 | 76 | def write_dependencies( |
34 | 77 | dependencies, packages, pip_only_packages, repo_name, module_name, python_version |
35 | 78 | ): |
|
0 commit comments