diff --git a/changelogs/fragments/3611-pipx-fix-inject.yml b/changelogs/fragments/3611-pipx-fix-inject.yml new file mode 100644 index 0000000000..19433b2cb8 --- /dev/null +++ b/changelogs/fragments/3611-pipx-fix-inject.yml @@ -0,0 +1,3 @@ +bugfixes: + - pipx - ``state=inject`` was failing to parse the list of injected packages (https://github.com/ansible-collections/community.general/pull/3611). + - pipx - set environment variable ``USE_EMOJI=0`` to prevent errors in platforms that do not support ``UTF-8`` (https://github.com/ansible-collections/community.general/pull/3611). diff --git a/plugins/modules/packaging/language/pipx.py b/plugins/modules/packaging/language/pipx.py index 5dd7ffacb1..53c085ed61 100644 --- a/plugins/modules/packaging/language/pipx.py +++ b/plugins/modules/packaging/language/pipx.py @@ -176,6 +176,9 @@ class PipX(CmdStateModuleHelper): _list=dict(fmt=('list', '--include-injected', '--json'), style=ArgFormat.BOOLEAN), ) check_rc = True + run_command_fixed_options = dict( + environ_update={'USE_EMOJI': '0'} + ) def _retrieve_installed(self): def process_list(rc, out, err): @@ -188,7 +191,7 @@ class PipX(CmdStateModuleHelper): results[venv_name] = { 'version': venv['metadata']['main_package']['package_version'], 'injected': dict( - (k, v['package_version']) for k, v in venv['metadata']['injected_packages'] + (k, v['package_version']) for k, v in venv['metadata']['injected_packages'].items() ), } return results diff --git a/tests/integration/targets/pipx/tasks/main.yml b/tests/integration/targets/pipx/tasks/main.yml index b48b83fc71..67f65b9a48 100644 --- a/tests/integration/targets/pipx/tasks/main.yml +++ b/tests/integration/targets/pipx/tasks/main.yml @@ -90,3 +90,37 @@ - downgrade_tox_324.application.tox.version == '3.24.0' - uninstall_tox_324 is changed - "'tox' not in uninstall_tox_324.application" + +############################################################################## +- name: ensure application ansible-lint is uninstalled + community.general.pipx: + name: ansible-lint + state: absent + +- name: install application ansible-lint + community.general.pipx: + name: ansible-lint + register: install_ansible_lint + +- name: inject packages + community.general.pipx: + state: inject + name: ansible-lint + inject_packages: + - licenses + register: inject_pkgs_ansible_lint + +- name: cleanup ansible-lint + community.general.pipx: + state: absent + name: ansible-lint + register: uninstall_ansible_lint + +- name: check assertions inject_packages + assert: + that: + - install_ansible_lint is changed + - inject_pkgs_ansible_lint is changed + - '"ansible-lint" in inject_pkgs_ansible_lint.application' + - '"licenses" in inject_pkgs_ansible_lint.application["ansible-lint"]["injected"]' + - uninstall_ansible_lint is changed