From a9b902f5797d9ad8b449394416f1082c241887ce Mon Sep 17 00:00:00 2001 From: Jordan Borean Date: Thu, 13 Jun 2024 06:16:15 +1000 Subject: [PATCH] ansible-test action-plugin-docs sidecar (#83325) Fix to have ansible-test sanity --test action-plugin-docs to check for action plugin documentation inside a sidecar file rather than a Python module. --- .../fragments/action-plugin-docs-sidecar.yml | 2 ++ .../aliases | 4 ++++ .../ns/col/plugins/action/other.yml | 1 + .../ns/col/plugins/action/with_py.py | 11 +++++++++++ .../ns/col/plugins/action/with_yaml.py | 11 +++++++++++ .../ns/col/plugins/action/with_yml.py | 11 +++++++++++ .../ns/col/plugins/modules/with_py.py | 19 +++++++++++++++++++ .../ns/col/plugins/modules/with_yaml.yaml | 16 ++++++++++++++++ .../ns/col/plugins/modules/with_yml.yml | 16 ++++++++++++++++ .../runme.sh | 9 +++++++++ .../sanity/code-smell/action-plugin-docs.json | 4 +++- .../sanity/code-smell/action-plugin-docs.py | 9 ++++++--- 12 files changed, 109 insertions(+), 4 deletions(-) create mode 100644 changelogs/fragments/action-plugin-docs-sidecar.yml create mode 100644 test/integration/targets/ansible-test-sanity-action-plugin-docs/aliases create mode 100644 test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/action/other.yml create mode 100644 test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/action/with_py.py create mode 100644 test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/action/with_yaml.py create mode 100644 test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/action/with_yml.py create mode 100644 test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/modules/with_py.py create mode 100644 test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/modules/with_yaml.yaml create mode 100644 test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/modules/with_yml.yml create mode 100755 test/integration/targets/ansible-test-sanity-action-plugin-docs/runme.sh diff --git a/changelogs/fragments/action-plugin-docs-sidecar.yml b/changelogs/fragments/action-plugin-docs-sidecar.yml new file mode 100644 index 00000000000..c9faa07140a --- /dev/null +++ b/changelogs/fragments/action-plugin-docs-sidecar.yml @@ -0,0 +1,2 @@ +bugfixes: +- ansible-test action-plugin-docs - Fix to check for sidecar documentation for action plugins diff --git a/test/integration/targets/ansible-test-sanity-action-plugin-docs/aliases b/test/integration/targets/ansible-test-sanity-action-plugin-docs/aliases new file mode 100644 index 00000000000..7741d444515 --- /dev/null +++ b/test/integration/targets/ansible-test-sanity-action-plugin-docs/aliases @@ -0,0 +1,4 @@ +shippable/posix/group3 # runs in the distro test containers +shippable/generic/group1 # runs in the default test container +context/controller +needs/target/collection diff --git a/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/action/other.yml b/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/action/other.yml new file mode 100644 index 00000000000..436e7be8a94 --- /dev/null +++ b/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/action/other.yml @@ -0,0 +1 @@ +random: data \ No newline at end of file diff --git a/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/action/with_py.py b/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/action/with_py.py new file mode 100644 index 00000000000..a1934b34199 --- /dev/null +++ b/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/action/with_py.py @@ -0,0 +1,11 @@ +# Copyright (c) 2024 Ansible Project +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import annotations + +from ansible.plugins.action import ActionBase + + +class ActionModule(ActionBase): + def run(self, tmp, task_vars): + return {"changed": False} diff --git a/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/action/with_yaml.py b/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/action/with_yaml.py new file mode 100644 index 00000000000..a1934b34199 --- /dev/null +++ b/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/action/with_yaml.py @@ -0,0 +1,11 @@ +# Copyright (c) 2024 Ansible Project +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import annotations + +from ansible.plugins.action import ActionBase + + +class ActionModule(ActionBase): + def run(self, tmp, task_vars): + return {"changed": False} diff --git a/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/action/with_yml.py b/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/action/with_yml.py new file mode 100644 index 00000000000..a1934b34199 --- /dev/null +++ b/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/action/with_yml.py @@ -0,0 +1,11 @@ +# Copyright (c) 2024 Ansible Project +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import annotations + +from ansible.plugins.action import ActionBase + + +class ActionModule(ActionBase): + def run(self, tmp, task_vars): + return {"changed": False} diff --git a/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/modules/with_py.py b/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/modules/with_py.py new file mode 100644 index 00000000000..51c540e9f00 --- /dev/null +++ b/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/modules/with_py.py @@ -0,0 +1,19 @@ +# Copyright (c) 2024 Ansible Project +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +DOCUMENTATION = r""" +--- +module: with_py +short_description: Short description +description: Long description +options: {} +author: + - Ansible Core Team (@ansible) +""" + +EXAMPLES = r""" +- name: Some example + ns.col.with_py: +""" + +RETURNS = "" diff --git a/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/modules/with_yaml.yaml b/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/modules/with_yaml.yaml new file mode 100644 index 00000000000..394c36230e3 --- /dev/null +++ b/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/modules/with_yaml.yaml @@ -0,0 +1,16 @@ +# Copyright (c) 2024 Ansible Project +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +DOCUMENTATION: + module: with_yaml + short_description: Short description + description: Long description + options: {} + author: + - Ansible Core Team (@ansible) + +EXAMPLES: | + - name: Some example + ns.col.with_yaml: + +RETURNS: {} diff --git a/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/modules/with_yml.yml b/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/modules/with_yml.yml new file mode 100644 index 00000000000..18f84589f58 --- /dev/null +++ b/test/integration/targets/ansible-test-sanity-action-plugin-docs/ansible_collections/ns/col/plugins/modules/with_yml.yml @@ -0,0 +1,16 @@ +# Copyright (c) 2024 Ansible Project +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +DOCUMENTATION: + module: with_yml + short_description: Short description + description: Long description + options: {} + author: + - Ansible Core Team (@ansible) + +EXAMPLES: | + - name: Some example + ns.col.with_yml: + +RETURNS: {} diff --git a/test/integration/targets/ansible-test-sanity-action-plugin-docs/runme.sh b/test/integration/targets/ansible-test-sanity-action-plugin-docs/runme.sh new file mode 100755 index 00000000000..85f7f6a084d --- /dev/null +++ b/test/integration/targets/ansible-test-sanity-action-plugin-docs/runme.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -eu + +source ../collection/setup.sh + +set -x + +ansible-test sanity --test action-plugin-docs --color "${@}" diff --git a/test/lib/ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.json b/test/lib/ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.json index 12bbe0d11ea..11920de2ff9 100644 --- a/test/lib/ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.json +++ b/test/lib/ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.json @@ -7,7 +7,9 @@ "plugins/action/" ], "extensions": [ - ".py" + ".py", + ".yml", + ".yaml" ], "output": "path-message" } diff --git a/test/lib/ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py b/test/lib/ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py index a319d1a12e4..9504a806ad4 100644 --- a/test/lib/ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +++ b/test/lib/ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py @@ -28,13 +28,13 @@ def main(): module_names.add(full_name) for path in paths: - full_name = get_full_name(path, action_prefixes) + full_name = get_full_name(path, action_prefixes, extensions=('.py',)) if full_name and full_name not in module_names: print('%s: action plugin has no matching module to provide documentation' % path) -def get_full_name(path, prefixes): +def get_full_name(path: str, prefixes: dict[str, bool], extensions: tuple[str] | None = None) -> str | None: """Return the full name of the plugin at the given path by matching against the given path prefixes, or None if no match is found.""" for prefix, flat in prefixes.items(): if path.startswith(prefix): @@ -45,13 +45,16 @@ def get_full_name(path, prefixes): else: full_name = relative_path - full_name = os.path.splitext(full_name)[0] + full_name, file_ext = os.path.splitext(full_name) name = os.path.basename(full_name) if name == '__init__': return None + if extensions and file_ext not in extensions: + return None + if name.startswith('_'): name = name[1:]