
This role ensures that a specific pip-installable command is available. Example usage: - role: ensure-python-command vars: ensure_python_command_name: poetry ensure_python_command_version: ==1.8.5 # omit to install latest In this case, if the `poetry` command is not already available, pip will install it in a new venv. Either way, after running this role, the `ensure_python_command_executable` variable will hold the full path to the command. We already have similar roles for specific commands: - ensure-nox - ensure-poetry - ensure-pyproject-build - ensure-tox - ensure-twine - ensure-uv These roles are essentially copies of each other with different command names. This new role consolidates that code. The existing roles now act as wrappers that just set variables and call the new role. > Note: The `ensure-tox` role has not been refactored due to exclusive > legacy code related to Python 2, which must be removed first. The new role introduces three variables to replace the overloaded `ensure_<command>_executable` variable from the other roles: - `ensure_python_command_name` (input, command name) - `ensure_python_command_existing` (input, existing path for the command) - `ensure_python_command_executable` (output, detected/installed path) This separation avoids using the same variable as both input and output, which can cause issues due to Ansible's variable precedence rules: https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_variables.html Understanding variable precedence ... 19. set_facts / registered vars 20. role (and include_role) params ... Since we use `set_fact` inside the role, it is ineffective when the same variable is also passed as a role parameter :/ I'm not adding tests for the new role because its functionality is already covered by the existing tests for all the refactored roles: - test-playbooks/ensure-nox.yaml - test-playbooks/ensure-poetry.yaml - test-playbooks/ensure-pyproject-build.yaml - test-playbooks/ensure-twine.yaml - test-playbooks/ensure-uv.yaml Change-Id: Idd970cb31bd928576bca3602ce96fbc491ecdb60
Ensure a pip-installed command is available
This role checks for the specified command, and if not found,
installs it via pip
into a virtual environment for the
current user.
The minimal required input is the command name. Additionally, you can specify a version or a path to a local venv, among other things.
Example:
- role: ensure-python-command
vars:
ensure_python_command_name: poetry
ensure_python_command_version: ==1.8.5 # omit to install latest
In this case, if the poetry
command is not already
available, pip will install it in a new venv. Either way, after running
this role, the ensure_python_command_executable
variable
will hold the full path to the command.
Role Variables
Required. The name of the command to ensure is available.
Output Variables
The full path to the command executable, whether it was detected or installed by the role.