ansible-test validate-modules - fix ps util checks (#84610)

* ansible-test validate-modules - fix ps util checks

Fix the module util import checks done by `ansible-test sanity --test
validate-modules` to support the newer `#AnsibleRequires` import
statement and `-Optional` flag.

* Fix sanity issues
pull/84730/head
Jordan Borean 11 months ago committed by GitHub
parent d21788a9b4
commit a742e20fca
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,3 @@
bugfixes:
- ansible-test - Fix support for detecting PowerShell modules importing module utils with the newer ``#AnsibleRequires`` format.
- ansible-test - Fix support for PowerShell module_util imports with the ``-Optional`` flag.

@ -0,0 +1,6 @@
#!powershell
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
#AnsibleRequires -PowerShell Ansible.ModuleUtils.Legacy
'{"changed": false, "msg": "Hello, World!"}'

@ -0,0 +1,17 @@
# Copyright (c) 2025 Ansible Project
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
DOCUMENTATION:
module: util_ansible_requires
short_description: Short description for util_ansible_requires module
description:
- Description for util_ansible_requires module
options: {}
author:
- Ansible Core Team
EXAMPLES: |
- name: example for sidecar
ns.col.util_ansible_requires:
RETURN: {}

@ -0,0 +1,14 @@
#!powershell
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
#AnsibleRequires -CSharpUtil Ansible.Basic
#AnsibleRequires -PowerShell .foo -Optional
$module = [Ansible.Basic.AnsibleModule]::Create(
$args,
@{
options = @{}
}
)
$module.ExitJson()

@ -0,0 +1,17 @@
# Copyright (c) 2025 Ansible Project
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
DOCUMENTATION:
module: util_optional
short_description: Short description for util_optional module
description:
- Description for util_optional module
options: {}
author:
- Ansible Core Team
EXAMPLES: |
- name: example for sidecar
ns.col.util_optional:
RETURN: {}

@ -687,30 +687,57 @@ class ModuleValidator(Validator):
# get module list for each
# check "shape" of each module name
module_requires = r'(?im)^#\s*requires\s+\-module(?:s?)\s*(Ansible\.ModuleUtils\..+)'
csharp_requires = r'(?im)^#\s*ansiblerequires\s+\-csharputil\s*(Ansible\..+)'
legacy_ps_requires = r'(?im)^#\s*Requires\s+\-Module(?:s?)\s+(Ansible\.ModuleUtils\..+)'
ps_requires = r'''(?imx)
^\#\s*AnsibleRequires\s+-PowerShell\s+
(
# Builtin PowerShell module
(Ansible\.ModuleUtils\.[\w\.]+)
|
# Fully qualified collection PowerShell module
(ansible_collections\.\w+\.\w+\.plugins\.module_utils\.[\w\.]+)
|
# Relative collection PowerShell module
(\.[\w\.]+)
)
(\s+-Optional)?'''
csharp_requires = r'''(?imx)
^\#\s*AnsibleRequires\s+-CSharpUtil\s+
(
# Builtin C# util
(Ansible\.[\w\.]+)
|
# Fully qualified collection C# util
(ansible_collections\.\w+\.\w+\.plugins\.module_utils\.[\w\.]+)
|
# Relative collection C# util
(\.[\w\.]+)
)
(\s+-Optional)?'''
found_requires = False
for req_stmt in re.finditer(module_requires, self.text):
found_requires = True
# this will bomb on dictionary format - "don't do that"
module_list = [x.strip() for x in req_stmt.group(1).split(',')]
if len(module_list) > 1:
self.reporter.error(
path=self.object_path,
code='multiple-utils-per-requires',
msg='Ansible.ModuleUtils requirements do not support multiple modules per statement: "%s"' % req_stmt.group(0)
)
continue
for pattern, required_type in [(legacy_ps_requires, "Requires"), (ps_requires, "AnsibleRequires")]:
for req_stmt in re.finditer(pattern, self.text):
found_requires = True
# this will bomb on dictionary format - "don't do that"
module_list = [x.strip() for x in req_stmt.group(1).split(',')]
if len(module_list) > 1:
self.reporter.error(
path=self.object_path,
code='multiple-utils-per-requires',
msg='Ansible.ModuleUtils requirements do not support multiple modules per statement: "%s"' % req_stmt.group(0)
)
continue
module_name = module_list[0]
module_name = module_list[0]
if module_name.lower().endswith('.psm1'):
self.reporter.error(
path=self.object_path,
code='invalid-requires-extension',
msg='Module #Requires should not end in .psm1: "%s"' % module_name
)
if module_name.lower().endswith('.psm1'):
self.reporter.error(
path=self.object_path,
code='invalid-requires-extension',
msg='Module #%s should not end in .psm1: "%s"' % (required_type, module_name)
)
for req_stmt in re.finditer(csharp_requires, self.text):
found_requires = True

Loading…
Cancel
Save