diff --git a/.ansible-lint b/.ansible-lint index c684fbb8fe..eca18d6692 100644 --- a/.ansible-lint +++ b/.ansible-lint @@ -8,8 +8,9 @@ exclude_paths: # Mock modules or roles in order to pass ansible-playbook --syntax-check mock_modules: - zuul_return - - fake_namespace.fake_collection.fake_module # note the foo.bar is invalid as being neither a module or a collection + - fake_namespace.fake_collection.fake_module + - fake_namespace.fake_collection.fake_module.fake_submodule mock_roles: - mocked_role - author.role_name # old standalone galaxy role diff --git a/src/ansiblelint/_prerun.py b/src/ansiblelint/_prerun.py index bfde0b77e4..4d31d2e177 100644 --- a/src/ansiblelint/_prerun.py +++ b/src/ansiblelint/_prerun.py @@ -226,25 +226,28 @@ def _prepare_ansible_paths() -> None: def _make_module_stub(module_name: str) -> None: # a.b.c is treated a collection - if re.match(r"\w+\.\w+\.\w+", module_name): - namespace, collection, module_file = module_name.split(".") - path = f"{ options.project_dir }/.cache/collections/ansible_collections/{ namespace }/{ collection }/plugins/modules" + if re.match(r"^(\w+|\w+\.\w+\.[\.\w]+)$", module_name): + parts = module_name.split(".") + if len(parts) < 3: + path = f"{options.project_dir}/.cache/modules" + module_file = f"{options.project_dir}/.cache/modules/{module_name}.py" + namespace = None + collection = None + else: + namespace = parts[0] + collection = parts[1] + path = f"{ options.project_dir }/.cache/collections/ansible_collections/{ namespace }/{ collection }/plugins/modules/{ '/'.join(parts[2:-1]) }" + module_file = f"{path}/{parts[-1]}.py" os.makedirs(path, exist_ok=True) _write_module_stub( - filename=f"{path}/{module_file}.py", + filename=module_file, name=module_file, namespace=namespace, collection=collection, ) - elif "." in module_name: + else: _logger.error("Config error: %s is not a valid module name.", module_name) sys.exit(INVALID_CONFIG_RC) - else: - os.makedirs(f"{options.project_dir}/.cache/modules", exist_ok=True) - _write_module_stub( - filename=f"{options.project_dir}/.cache/modules/{module_name}.py", - name=module_name, - ) def _write_module_stub( @@ -274,7 +277,7 @@ def _update_env(varname: str, value: List[str], default: str = "") -> None: def _perform_mockings() -> None: """Mock modules and roles.""" for role_name in options.mock_roles: - if re.match(r"\w+\.\w+\.\w+", role_name): + if re.match(r"\w+\.\w+\.\w+$", role_name): namespace, collection, role_dir = role_name.split(".") path = f".cache/collections/ansible_collections/{ namespace }/{ collection }/roles/{ role_dir }/" else: