diff --git a/changelogs/fragments/10137-pipx-cg11.yml b/changelogs/fragments/10137-pipx-cg11.yml new file mode 100644 index 0000000000..2dc641d216 --- /dev/null +++ b/changelogs/fragments/10137-pipx-cg11.yml @@ -0,0 +1,3 @@ +removed_features: + - pipx - module no longer supports ``pipx`` older than 1.7.0 (https://github.com/ansible-collections/community.general/pull/10137). + - pipx_info - module no longer supports ``pipx`` older than 1.7.0 (https://github.com/ansible-collections/community.general/pull/10137). diff --git a/plugins/doc_fragments/pipx.py b/plugins/doc_fragments/pipx.py index b94495d4a1..aff8e90c75 100644 --- a/plugins/doc_fragments/pipx.py +++ b/plugins/doc_fragments/pipx.py @@ -14,9 +14,6 @@ options: global: description: - The module will pass the C(--global) argument to C(pipx), to execute actions in global scope. - - The C(--global) is only available in C(pipx>=1.6.0), so make sure to have a compatible version when using this option. - Moreover, a nasty bug with C(--global) was fixed in C(pipx==1.7.0), so it is strongly recommended you used that version - or newer. type: bool default: false executable: @@ -25,10 +22,9 @@ options: - If not specified, the module will use C(python -m pipx) to run the tool, using the same Python interpreter as ansible itself. type: path +requirements: + - This module requires C(pipx) version 1.7.0 or above. Please note that C(pipx) 1.7.0 requires Python 3.8 or above. notes: - - This module requires C(pipx) version 0.16.2.1 or above. From community.general 11.0.0 onwards, the module will require - C(pipx>=1.7.0). - - Please note that C(pipx) requires Python 3.6 or above. - This module does not install the C(pipx) python package, however that can be easily done with the module M(ansible.builtin.pip). - This module does not require C(pipx) to be in the shell C(PATH), but it must be loadable by Python as a module. - This module will honor C(pipx) environment variables such as but not limited to E(PIPX_HOME) and E(PIPX_BIN_DIR) passed diff --git a/plugins/modules/pipx.py b/plugins/modules/pipx.py index e3646fd859..540c05543a 100644 --- a/plugins/modules/pipx.py +++ b/plugins/modules/pipx.py @@ -211,6 +211,7 @@ version: from ansible_collections.community.general.plugins.module_utils.module_helper import StateModuleHelper from ansible_collections.community.general.plugins.module_utils.pipx import pipx_runner, pipx_common_argspec, make_process_dict from ansible_collections.community.general.plugins.module_utils.pkg_req import PackageRequirement +from ansible_collections.community.general.plugins.module_utils.version import LooseVersion from ansible.module_utils.facts.compat import ansible_facts @@ -293,6 +294,9 @@ class PipX(StateModuleHelper): rc, out, err = ctx.run() self.vars.version = out.strip() + if LooseVersion(self.vars.version) < LooseVersion("1.7.0"): + self.do_raise("The pipx tool must be at least at version 1.7.0") + def __quit_module__(self): self.vars.application = self._retrieve_installed() diff --git a/plugins/modules/pipx_info.py b/plugins/modules/pipx_info.py index 8590538772..a381421aba 100644 --- a/plugins/modules/pipx_info.py +++ b/plugins/modules/pipx_info.py @@ -127,6 +127,7 @@ version: from ansible_collections.community.general.plugins.module_utils.module_helper import ModuleHelper from ansible_collections.community.general.plugins.module_utils.pipx import pipx_runner, pipx_common_argspec, make_process_dict +from ansible_collections.community.general.plugins.module_utils.version import LooseVersion from ansible.module_utils.facts.compat import ansible_facts @@ -156,6 +157,9 @@ class PipXInfo(ModuleHelper): rc, out, err = ctx.run() self.vars.version = out.strip() + if LooseVersion(self.vars.version) < LooseVersion("1.7.0"): + self.do_raise("The pipx tool must be at least at version 1.7.0") + def __run__(self): output_process = make_process_dict(self.vars.include_injected, self.vars.include_deps) with self.runner('_list global', output_process=output_process) as ctx: diff --git a/tests/integration/targets/pipx/tasks/main.yml b/tests/integration/targets/pipx/tasks/main.yml index 174ec9793a..599086a636 100644 --- a/tests/integration/targets/pipx/tasks/main.yml +++ b/tests/integration/targets/pipx/tasks/main.yml @@ -3,21 +3,13 @@ # 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: Determine pipx level - block: - - name: Install pipx>=1.7.0 - ansible.builtin.pip: - name: pipx>=1.7.0 - - name: Set has_pipx170 fact true - ansible.builtin.set_fact: - has_pipx170: true - rescue: - - name: Set has_pipx170 fact false - ansible.builtin.set_fact: - has_pipx170: false - - name: Install pipx (no version spec) - ansible.builtin.pip: - name: pipx +- name: Bail out if Python < 3.8 + when: ansible_python_version is version('3.8', '<') + ansible.builtin.meta: end_play +- name: Install pipx>=1.7.0 + ansible.builtin.pip: + name: pipx>=1.7.0 + extra_args: --user - name: Determine packaging level block: @@ -266,27 +258,23 @@ - name: Include testcase for issue 8656 ansible.builtin.include_tasks: testcase-8656.yml -- name: Recent features - when: - - has_pipx170 - block: - - name: Include testcase for PR 8793 --global - ansible.builtin.include_tasks: testcase-8793-global.yml +- name: Include testcase for PR 8793 --global + ansible.builtin.include_tasks: testcase-8793-global.yml - - name: Include testcase for PR 8809 install-all - ansible.builtin.include_tasks: testcase-8809-installall.yml +- name: Include testcase for PR 8809 install-all + ansible.builtin.include_tasks: testcase-8809-installall.yml - - name: Include testcase for PR 8809 pin - ansible.builtin.include_tasks: testcase-8809-pin.yml +- name: Include testcase for PR 8809 pin + ansible.builtin.include_tasks: testcase-8809-pin.yml - - name: Include testcase for PR 8809 injectpkg - ansible.builtin.include_tasks: testcase-8809-uninjectpkg.yml +- name: Include testcase for PR 8809 injectpkg + ansible.builtin.include_tasks: testcase-8809-uninjectpkg.yml - - name: Include testcase for PR 9009 injectpkg --global - ansible.builtin.include_tasks: testcase-9009-fixglobal.yml +- name: Include testcase for PR 9009 injectpkg --global + ansible.builtin.include_tasks: testcase-9009-fixglobal.yml - - name: Include testcase for PR 9103 upgrade --global - ansible.builtin.include_tasks: testcase-9103-upgrade-global.yml +- name: Include testcase for PR 9103 upgrade --global + ansible.builtin.include_tasks: testcase-9103-upgrade-global.yml - - name: Include testcase for issue 9619 latest --global - ansible.builtin.include_tasks: testcase-9619-latest-global.yml +- name: Include testcase for issue 9619 latest --global + ansible.builtin.include_tasks: testcase-9619-latest-global.yml diff --git a/tests/integration/targets/pipx_info/tasks/main.yml b/tests/integration/targets/pipx_info/tasks/main.yml index a401e5a798..d51ce1b33e 100644 --- a/tests/integration/targets/pipx_info/tasks/main.yml +++ b/tests/integration/targets/pipx_info/tasks/main.yml @@ -3,13 +3,16 @@ # 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 pipx - pip: - name: pipx +- name: Bail out if Python < 3.8 + when: ansible_python_version is version('3.8', '<') + ansible.builtin.meta: end_play +- name: Install pipx>=1.7.0 + ansible.builtin.pip: + name: pipx>=1.7.0 extra_args: --user ############################################################################## -- name: ensure applications are uninstalled +- name: Ensure applications are uninstalled community.general.pipx: name: "{{ item }}" state: absent @@ -17,36 +20,36 @@ - tox - pylint -- name: retrieve applications (empty) +- name: Retrieve applications (empty) community.general.pipx_info: {} register: info_empty -- name: install application tox +- name: Install application tox community.general.pipx: name: tox -- name: retrieve applications +- name: Retrieve applications community.general.pipx_info: {} register: info_all -- name: retrieve applications (include_deps=true) +- name: Retrieve applications (include_deps=true) community.general.pipx_info: include_deps: true register: info_all_deps -- name: retrieve application tox +- name: Retrieve application tox community.general.pipx_info: name: tox include_deps: true register: info_tox -- name: uninstall application tox +- name: Uninstall application tox community.general.pipx: state: absent name: tox -- name: check assertions tox - assert: +- name: Check assertions tox + ansible.builtin.assert: that: - info_empty.application|length == 0 @@ -66,8 +69,8 @@ - info_tox.application == info_all_deps.application ############################################################################## -- name: set test applications - set_fact: +- name: Set test applications + ansible.builtin.set_fact: apps: - name: tox source: tox==3.24.0 @@ -75,19 +78,19 @@ inject_packages: - licenses -- name: ensure applications are uninstalled +- name: Ensure applications are uninstalled community.general.pipx: name: "{{ item.name }}" state: absent loop: "{{ apps }}" -- name: install applications +- name: Install applications community.general.pipx: name: "{{ item.name }}" source: "{{ item.source | default(omit) }}" loop: "{{ apps }}" -- name: inject packages +- name: Inject packages community.general.pipx: state: inject name: "{{ item.name }}" @@ -95,31 +98,31 @@ when: "'inject_packages' in item" loop: "{{ apps }}" -- name: retrieve applications +- name: Retrieve applications community.general.pipx_info: {} register: info2_all -- name: retrieve applications (include_deps=true) +- name: Retrieve applications (include_deps=true) community.general.pipx_info: include_deps: true include_injected: true register: info2_all_deps -- name: retrieve application pylint +- name: Retrieve application pylint community.general.pipx_info: name: pylint include_deps: true include_injected: true register: info2_lint -- name: ensure applications are uninstalled +- name: Ensure applications are uninstalled community.general.pipx: name: "{{ item.name }}" state: absent loop: "{{ apps }}" -- name: check assertions multiple apps - assert: +- name: Check assertions multiple apps + ansible.builtin.assert: that: - all_apps|length == 2 - all_apps[1].name == "tox" @@ -138,6 +141,6 @@ - all_apps_deps|length == 2 - lint[0] == all_apps_deps[0] vars: - all_apps: "{{ info2_all.application|sort(attribute='name') }}" + all_apps: "{{ info2_all.application | sort(attribute='name') }}" all_apps_deps: "{{ info2_all_deps.application | sort(attribute='name') }}" lint: "{{ info2_lint.application | sort(attribute='name') }}"