1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2026-03-22 05:09:12 +00:00

Use StrictVersion instead of packaging Version

This commit is contained in:
Mariam Ahhttouche 2026-02-27 17:18:48 +01:00
parent ed0eb833f7
commit 5033a4f922
2 changed files with 17 additions and 69 deletions

View file

@ -12,15 +12,16 @@ description:
- Install, uninstall or upgrade Python versions managed by C(uv).
version_added: "12.5.0"
requirements:
- uv >= 0.8.0 must be installed and available in PATH
- packaging
- uv must be installed and available in PATH and uv version must be >= 0.8.0.
options:
version:
description:
- Python version to manage.
- Only L(canonical Python versions, https://peps.python.org/pep-0440/) are supported in this release such as C(3), C(3.12), C(3.12.3), C(3.15.0a5).
- |
Not all canonical Python versions are supported in this release. Valid version numbers consist of two or three dot-separated numeric components,
with an optional 'pre-release' tag on the end such as C(3.12), C(3.12.3), C(3.15.0a5).
- Advanced uv selectors such as C(>=3.12,<3.13) or C(cpython@3.12) are not supported in this release.
- When you specify only a major or major.minor version, behavior depends on the O(state) parameter.
- When you specify only a major.minor version, behavior depends on the O(state) parameter.
type: str
required: true
state:
@ -76,11 +77,6 @@ EXAMPLES = r"""
community.general.uv_python:
version: 3.13.5
state: absent
- name: Upgrade Python 3
community.general.uv_python:
version: 3
state: latest
"""
RETURN = r"""
@ -107,19 +103,8 @@ rc:
"""
import json
import traceback
LIB_IMP_ERR = None
HAS_LIB = False
try:
from packaging.version import Version, InvalidVersion
HAS_LIB = True
except ImportError:
LIB_IMP_ERR = traceback.format_exc()
from ansible.module_utils.basic import AnsibleModule, missing_required_lib
from ansible.module_utils.compat.version import LooseVersion
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.compat.version import LooseVersion, StrictVersion
MINIMUM_UV_VERSION = "0.8.0"
@ -135,11 +120,12 @@ class UV:
self._ensure_min_uv_version()
python_version = module.params["version"]
try:
self.python_version = Version(python_version)
self.python_version = StrictVersion(python_version)
self.python_version_str = self.python_version.__str__()
except InvalidVersion:
except ValueError:
self.module.fail_json(
msg="Unsupported version format. Only canonical Python versions (e.g. 3, 3.12, 3.12.3, 3.15.0a5) are supported in this release."
msg="Unsupported version format. Valid version numbers consist of two or three dot-separated numeric components, \
with an optional 'pre-release' tag on the end (e.g. 3.12, 3.12.3, 3.15.0a5) are supported in this release."
)
def _ensure_min_uv_version(self):
@ -229,7 +215,7 @@ class UV:
latest_version_str, ignored_path = self._get_latest_patch_release("--managed-python")
if not latest_version_str:
self.module.fail_json(msg=f"Version {self.python_version_str} is not available.")
if rc == 0 and installed_version >= Version(latest_version_str):
if rc == 0 and installed_version >= StrictVersion(latest_version_str):
ignored_rc, install_path, ignored_err = self._find_python()
return False, "", "", rc, [installed_version_str], [install_path]
if self.module.check_mode:
@ -341,18 +327,18 @@ class UV:
valid_results = []
for result in results:
try:
result["parsed_version"] = Version(result.get("version", ""))
result["parsed_version"] = StrictVersion(result.get("version", ""))
valid_results.append(result)
except InvalidVersion:
except ValueError:
continue
return valid_results
@staticmethod
def _parse_version(version_str):
try:
return Version(version_str)
except InvalidVersion:
return Version("0")
return StrictVersion(version_str)
except ValueError:
return StrictVersion("0")
def main():
@ -364,9 +350,6 @@ def main():
supports_check_mode=True,
)
if not HAS_LIB:
module.fail_json(msg=missing_required_lib("packaging"), exception=LIB_IMP_ERR)
result = dict(changed=False, stdout="", stderr="", rc=0, python_versions=[], python_paths=[], failed=False)
state = module.params["state"]

View file

@ -27,41 +27,6 @@
environment:
UV_INSTALL_DIR: /usr/local/bin
- name: Install python 3
uv_python:
version: 3
state: present
register: python_install
- name: Assert python 3 is installed
ansible.builtin.assert:
that:
- python_install.failed is false
- python_install.python_versions | length >= 1
- name: Upgrade python 3
uv_python:
version: 3
state: latest
register: python_install
- name: Assert python 3 upgraded
ansible.builtin.assert:
that:
- python_install.failed is false
- python_install.python_versions | length >= 1
- name: Remove python 3
uv_python:
version: 3
state: absent
register: python_delete
- name: Assert python 3 deleted
ansible.builtin.assert:
that:
- python_delete.failed is false
- name: Install python 3.14 in check mode
uv_python:
version: 3.14