summaryrefslogtreecommitdiff
path: root/test/lib/ansible_test/_internal/commands/sanity/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/lib/ansible_test/_internal/commands/sanity/__init__.py')
-rw-r--r--test/lib/ansible_test/_internal/commands/sanity/__init__.py31
1 files changed, 24 insertions, 7 deletions
diff --git a/test/lib/ansible_test/_internal/commands/sanity/__init__.py b/test/lib/ansible_test/_internal/commands/sanity/__init__.py
index 0bc68a21..9b675e4a 100644
--- a/test/lib/ansible_test/_internal/commands/sanity/__init__.py
+++ b/test/lib/ansible_test/_internal/commands/sanity/__init__.py
@@ -127,9 +127,13 @@ TARGET_SANITY_ROOT = os.path.join(ANSIBLE_TEST_TARGET_ROOT, 'sanity')
# NOTE: must match ansible.constants.DOCUMENTABLE_PLUGINS, but with 'module' replaced by 'modules'!
DOCUMENTABLE_PLUGINS = (
- 'become', 'cache', 'callback', 'cliconf', 'connection', 'httpapi', 'inventory', 'lookup', 'netconf', 'modules', 'shell', 'strategy', 'vars'
+ 'become', 'cache', 'callback', 'cliconf', 'connection', 'filter', 'httpapi', 'inventory',
+ 'lookup', 'netconf', 'modules', 'shell', 'strategy', 'test', 'vars',
)
+# Plugin types that can have multiple plugins per file, and where filenames not always correspond to plugin names
+MULTI_FILE_PLUGINS = ('filter', 'test', )
+
created_venvs: list[str] = []
@@ -260,7 +264,7 @@ def command_sanity(args: SanityConfig) -> None:
virtualenv_python = create_sanity_virtualenv(args, test_profile.python, test.name)
if virtualenv_python:
- virtualenv_yaml = check_sanity_virtualenv_yaml(virtualenv_python)
+ virtualenv_yaml = args.explain or check_sanity_virtualenv_yaml(virtualenv_python)
if test.require_libyaml and not virtualenv_yaml:
result = SanitySkipped(test.name)
@@ -875,6 +879,7 @@ class SanityCodeSmellTest(SanitySingleVersion):
self.__include_directories: bool = self.config.get('include_directories')
self.__include_symlinks: bool = self.config.get('include_symlinks')
self.__py2_compat: bool = self.config.get('py2_compat', False)
+ self.__error_code: str | None = self.config.get('error_code', None)
else:
self.output = None
self.extensions = []
@@ -890,6 +895,7 @@ class SanityCodeSmellTest(SanitySingleVersion):
self.__include_directories = False
self.__include_symlinks = False
self.__py2_compat = False
+ self.__error_code = None
if self.no_targets:
mutually_exclusive = (
@@ -909,6 +915,11 @@ class SanityCodeSmellTest(SanitySingleVersion):
raise ApplicationError('Sanity test "%s" option "no_targets" is mutually exclusive with options: %s' % (self.name, ', '.join(problems)))
@property
+ def error_code(self) -> t.Optional[str]:
+ """Error code for ansible-test matching the format used by the underlying test program, or None if the program does not use error codes."""
+ return self.__error_code
+
+ @property
def all_targets(self) -> bool:
"""True if test targets will not be filtered using includes, excludes, requires or changes. Mutually exclusive with no_targets."""
return self.__all_targets
@@ -992,6 +1003,8 @@ class SanityCodeSmellTest(SanitySingleVersion):
pattern = '^(?P<path>[^:]*):(?P<line>[0-9]+):(?P<column>[0-9]+): (?P<message>.*)$'
elif self.output == 'path-message':
pattern = '^(?P<path>[^:]*): (?P<message>.*)$'
+ elif self.output == 'path-line-column-code-message':
+ pattern = '^(?P<path>[^:]*):(?P<line>[0-9]+):(?P<column>[0-9]+): (?P<code>[^:]*): (?P<message>.*)$'
else:
raise ApplicationError('Unsupported output type: %s' % self.output)
@@ -1021,6 +1034,7 @@ class SanityCodeSmellTest(SanitySingleVersion):
path=m['path'],
line=int(m.get('line', 0)),
column=int(m.get('column', 0)),
+ code=m.get('code'),
) for m in matches]
messages = settings.process_errors(messages, paths)
@@ -1166,20 +1180,23 @@ def create_sanity_virtualenv(
run_pip(args, virtualenv_python, commands, None) # create_sanity_virtualenv()
- write_text_file(meta_install, virtualenv_install)
+ if not args.explain:
+ write_text_file(meta_install, virtualenv_install)
# false positive: pylint: disable=no-member
if any(isinstance(command, PipInstall) and command.has_package('pyyaml') for command in commands):
- virtualenv_yaml = yamlcheck(virtualenv_python)
+ virtualenv_yaml = yamlcheck(virtualenv_python, args.explain)
else:
virtualenv_yaml = None
- write_json_file(meta_yaml, virtualenv_yaml)
+ if not args.explain:
+ write_json_file(meta_yaml, virtualenv_yaml)
created_venvs.append(f'{label}-{python.version}')
- # touch the marker to keep track of when the virtualenv was last used
- pathlib.Path(virtualenv_marker).touch()
+ if not args.explain:
+ # touch the marker to keep track of when the virtualenv was last used
+ pathlib.Path(virtualenv_marker).touch()
return virtualenv_python