1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2026-06-06 16:27:14 +00:00
community.general/tests/integration/targets/uv_python/tasks/main.yaml
Mariam Ahhttouche c1c389e684
Add module to manage Python versions using uv (#11537)
* Add minimal uv_python module

uv_python module: add integration tests

* uv_python module: handle absent state

uv_python module: add integration tests

* uv_python module: restrict accepted version formats to X.Y and  X.Y.Z

uv_python module: add integration tests for version format

* uv_python module: add _list_python and _get_latest_patch_release methods

* uv_python module: add support for latest state

uv_python module: add integration tests for latest state

* uv_python module: add integration tests for check mode

* uv_python module: improve latest state check mode to show version that will be installed

* uv_python module: make latest state more deterministic by using install with explicite version

* uv_python module: improve absent state check mode and add corresponding integration test

* uv_python module: update latest state handling to sort versions without relying on uv behavior

uv_python module: improve integration tests

uv_python module: improve module return values

* uv_python module: add integration test for when uv executable does not exist

uv_python module: improve exception handling

* uv_python module: add integration test for case when specified version does not exist

* uv_python module: handle case when provided python version does not exist in latest state

uv_python module: improve methods' return values and add docstrings

uv_python module: improve integration tests

* uv_python module: improve check mode for present state to fail when no patch version is available

* uv_python module: return commands' stderr and return code as a variable of stdout

* uv_python module: add python version to module return values for present state

* uv_python module: add python version to module return values for absent state

* uv_python module: add python version to module return values for latest state

uv_python module: fix integration tests

* uv_python module: add installation paths to return values for present state

* uv_python module: add installation paths to return values for absent state

* uv_python module: add installation paths to return values for latest state

* uv_python module: update present, absent and latest state to only include versions managed by uv in return values

uv_python module: improve integration tests

uv_python module: update module documentation

* uv_python module: use LooseVersion  instead of StrictVersion to allow specifying threaded and major python versions

* uv_python module: fail module if used uv version is less than the minimal supported version

uv_python module: update documentation

* uv_python module: add uv command options to executed commands to disable unneeded features

* uv_python module: use packaging.version to only accept canonical python versions

uv_python module: update integration tests

uv_python module: improve error messages

* uv_python module: pin uv version used in tests

Improve module documentation

Co-authored-by: Felix Fontein <felix@fontein.de>

Add integration tests' aliases file for uv_python module

* Use StrictVersion instead of packaging Version

* make integration tests more deterministic

Update attributes field in documentation

Save uv bin path in an attribute

Add another example in documentation

Apply PR feedback and refactor code

Fix typing to be compatible with python versions <= 3.8

Update example to use quotes for major.minor example and update documentation

Update test aliases

Use documentation fragment for uv_python attributes

* Add aliases to skip running tests on freebsd and rhel

Make uv_python tests more deterministic

Clean uv_python documentation

* Handle case when version given is an empty string in uv_python module

* Apply linguistic guidelines for plugins/modules/uv_python.py

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

Add Python version requirement in uv_python documentation

* Update tests to install uv using pip and fix some tests

Add typing to plugins/modules/uv_python.py

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

Update plugins/modules/uv_python.py documentation

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

* Add task to uv_python tests to add uv installation directory to PATH

* Update uv_python to log unparsed versions in debug mode

Refactor uv_python code

Remove uv python label in .github/BOTMETA.yml

Co-authored-by: Felix Fontein <felix@fontein.de>

Add typing to plugins/modules/uv_python.py

Co-authored-by: Felix Fontein <felix@fontein.de>

Fix uv python documentation

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

* Allow testing using Python versions lower or equal to 3.8

skip running ci tests in macos

Co-authored-by: Felix Fontein <felix@fontein.de>

* Make uv version check more resilient to cli output format change in uv_python module

Improve tests/integration/targets/uv_python/tasks/main.yaml

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

fix mypy union attr error

* update uv_python tests to run on rhel and freebsd

Update uv_python tests to use generic packge manager to install uv

Install uv with curl for freebsd in uv python tests

Install rust needed by uv in freebsd for uv python tests

Update up_python tests to fix uv installation path in RHEL

skip testing uv_python on freebsd as it only has tier 3 support by uv

Fix fragment name in uv_python.py

Co-authored-by: Felix Fontein <felix@fontein.de>

Update version_added in plugins/modules/uv_python.py

Co-authored-by: Felix Fontein <felix@fontein.de>

Update tests/integration/targets/uv_python/tasks/main.yaml

Co-authored-by: Felix Fontein <felix@fontein.de>

Make version shown on debug message more precise in uv_python module

* Handle case when uv python returns relative paths instead of absolute in uv_python module

Add more typing to uv_python module

* uv_python module: update debug message fo unsupported versions to be more clear

---------

Co-authored-by: Mariam Ahhttouche <mariam.ahhttouche@etu.univ-grenoble-alpes.fr>
Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
Co-authored-by: Felix Fontein <felix@fontein.de>
2026-05-17 09:46:59 +02:00

302 lines
No EOL
8 KiB
YAML

---
####################################################################
# WARNING: These are designed specifically for Ansible tests #
# and should not be used as examples of how to write Ansible roles #
####################################################################
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
- name: Install uv python package
ansible.builtin.pip:
name: uv
- name: Install uv in RHEL
when: ansible_facts['os_family'] == "RedHat"
shell: |
curl -LsSf https://astral.sh/uv/install.sh | sh
environment:
UV_INSTALL_DIR: "{{ ansible_env.HOME }}/ansible/bin"
args:
creates: "{{ ansible_env.HOME }}/ansible/bin/uv"
- name: Check if Python 3.14 exists already
command: uv python find 3.14
ignore_errors: true
register: check_python_314_exists
changed_when: false
- name: Install Python 3.14 in check mode
uv_python:
version: "3.14"
state: present
check_mode: true
register: install_check_mode
- name: Verify Python 3.14 installation in check mode
assert:
that:
- (install_check_mode is changed) == (check_python_314_exists is failed)
- install_check_mode is not failed
- install_check_mode.python_versions | length >= 1
- name: Install Python 3.14
uv_python:
version: "3.14"
state: present
register: install_python
- name: Verify Python 3.14 installation
assert:
that:
- install_python.changed == check_python_314_exists.failed
- install_python.failed is false
- install_python.python_versions | length >= 1
- install_python.python_paths | length >= 1
- name: Get Python install path stats
ansible.builtin.stat:
path: "{{ install_python.python_paths[0] }}"
follow: true
register: python_path_stats
- name: Verify that Python 3.14 install path exists on host
ansible.builtin.fail:
msg: "Python install path {{ install_python.python_paths[0] }} is not correct"
when: not python_path_stats.stat.exists
- name: Re-install Python 3.14
uv_python:
version: "3.14"
state: present
register: reinstall_python
- name: Verify Python 3.14 re-installation
assert:
that:
- reinstall_python is not changed
- reinstall_python is not failed
- reinstall_python.python_versions | length >= 1
- reinstall_python.python_paths | length >= 1
- name: Check if Python 3.13.5 exists already
command: uv python find 3.13.5
ignore_errors: true
register: check_python_3135_exists
changed_when: false
- name: Install Python 3.13.5
uv_python:
version: 3.13.5
register: install_python_3135
- name: Verify Python 3.13.5 installation
assert:
that:
- install_python_3135.changed == check_python_3135_exists.failed
- install_python_3135.failed is false
- '"3.13.5" in install_python_3135.python_versions'
- install_python_3135.python_paths | length >= 1
- name: Re-install Python 3.13.5
uv_python:
version: 3.13.5
state: present
register: reinstall_python
- name: Verify Python 3.13.5 installation
assert:
that:
- reinstall_python.changed is false
- reinstall_python.failed is false
- '"3.13.5" in reinstall_python.python_versions'
- name: Remove uninstalled Python 3.10 # removes latest patch version for 3.10 if exists
uv_python:
version: "3.10"
state: absent
register: remove_python
- name: Verify Python 3.10 deletion
assert:
that:
- remove_python.changed is false
- remove_python.failed is false
- remove_python.python_versions | length == 0
- name: Remove Python 3.13.5 in check mode
uv_python:
version: 3.13.5
state: absent
check_mode: true
register: remove_python_in_check_mode
- name: Verify Python 3.13.5 deletion in check mode
assert:
that:
- remove_python_in_check_mode.changed == install_python_3135.changed
- remove_python_in_check_mode.failed is false
- name: Additional check for Python 3.13.5 deletion in check mode
when: install_python_3135.changed is true
assert:
that:
- '"3.13.5" in remove_python_in_check_mode.python_versions'
- remove_python_in_check_mode.python_paths | length >= 1
- name: Remove Python 3.13.5
uv_python:
version: 3.13.5
state: absent
register: remove_python
- name: Verify Python 3.13.5 deletion
assert:
that:
- remove_python.changed == install_python_3135.changed
- remove_python.failed is false
- name: Additional check for Python 3.13.5 deletion
when: install_python_3135.changed is true
assert:
that:
- remove_python.python_paths | length >= 1
- '"3.13.5" in remove_python.python_versions'
- name: Remove Python 3.13.5 again
uv_python:
version: 3.13.5
state: absent
register: remove_python
- name: Verify Python 3.13.5 deletion again
assert:
that:
- remove_python.changed is false
- remove_python.failed is false
- remove_python.python_versions | length == 0
- remove_python.python_paths | length == 0
- name: Upgrade Python 3.13
uv_python:
version: 3.13
state: latest
register: upgrade_python
- name: Verify Python 3.13 upgrade
assert:
that:
- upgrade_python.changed is true
- upgrade_python.failed is false
- upgrade_python.python_versions | length >= 1
- upgrade_python.python_paths | length >= 1
- name: Upgrade Python 3.13 in check mode
uv_python:
version: 3.13
state: latest
check_mode: true
register: upgrade_python
- name: Verify Python 3.13 upgrade in check mode
assert:
that:
- upgrade_python.changed is false
- upgrade_python.failed is false
- upgrade_python.python_versions | length >= 1
- name: Upgrade Python 3.13 again
uv_python:
version: 3.13
state: latest
check_mode: true
register: upgrade_python
- name: Verify Python 3.13 upgrade again
assert:
that:
- upgrade_python.changed is false
- upgrade_python.failed is false
- upgrade_python.python_versions | length >= 1
- name: Install unsupported Python version in check mode
uv_python:
version: 2.0
state: present
register: unsupported_python_check_mode
ignore_errors: true
check_mode: true
- name: Verify unsupported Python 2.0 install in check mode
assert:
that:
- unsupported_python_check_mode.changed is false
- unsupported_python_check_mode.failed is true
- '"Version 2.0 is not available." in unsupported_python_check_mode.msg'
- name: Install unsupported Python version
uv_python:
state: present
version: 2.0
register: unsupported_python
ignore_errors: true
- name: Verify unsupported Python 2.0 install
assert:
that:
- unsupported_python.changed is false
- unsupported_python.failed is true
- name: Install unsupported Python version with latest state
uv_python:
version: "2.0"
state: latest
register: unsupported_python
ignore_errors: true
- name: Verify Python 2.0 install with latest state
assert:
that:
- unsupported_python.changed is false
- unsupported_python.failed is true
- name: Delete Python 3.13 version
uv_python:
version: "3.13"
state: absent
register: uninstall_result
- name: Verify Python 3.13 deletion
assert:
that:
- uninstall_result.changed is true
- uninstall_result.failed is false
- uninstall_result.python_versions | length >= 1
- '"3.13" in uninstall_result.python_versions[0]'
- name: No specified version
uv_python:
state: latest
version: ""
ignore_errors: true
register: no_version
- name: Verify failure when no version is specified
assert:
that:
- no_version.failed is true
- '"Unsupported version format" in no_version.msg'
- name: Unsupported version format given
uv_python:
state: latest
version: "3.8.post2"
ignore_errors: true
register: wrong_version
- name: Verify failure when unsupported version format is specified
assert:
that:
- wrong_version.failed is true
- '"Unsupported version format" in wrong_version.msg'