summaryrefslogtreecommitdiffstats
path: root/src/ansiblelint/constants.py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/ansiblelint/constants.py189
1 files changed, 189 insertions, 0 deletions
diff --git a/src/ansiblelint/constants.py b/src/ansiblelint/constants.py
new file mode 100644
index 0000000..6b8bd12
--- /dev/null
+++ b/src/ansiblelint/constants.py
@@ -0,0 +1,189 @@
+"""Constants used by AnsibleLint."""
+from enum import Enum
+from pathlib import Path
+from typing import Literal
+
+DEFAULT_RULESDIR = Path(__file__).parent / "rules"
+CUSTOM_RULESDIR_ENVVAR = "ANSIBLE_LINT_CUSTOM_RULESDIR"
+RULE_DOC_URL = "https://ansible-lint.readthedocs.io/rules/"
+
+
+# Not using an IntEnum because only starting with py3.11 it will evaluate it
+# as int.
+class RC: # pylint: disable=too-few-public-methods
+ """All exit codes used by ansible-lint."""
+
+ SUCCESS = 0
+ VIOLATIONS_FOUND = 2
+ INVALID_CONFIG = 3
+ LOCK_TIMEOUT = 4
+ NO_FILES_MATCHED = 5
+ EXIT_CONTROL_C = 130
+
+
+# Minimal version of Ansible we support for runtime
+ANSIBLE_MIN_VERSION = "2.12"
+
+ANSIBLE_MOCKED_MODULE = """\
+# This is a mocked Ansible module generated by ansible-lint
+from ansible.module_utils.basic import AnsibleModule
+
+DOCUMENTATION = '''
+module: {name}
+
+short_description: Mocked
+version_added: "1.0.0"
+description: Mocked
+
+author:
+ - ansible-lint (@nobody)
+'''
+EXAMPLES = '''mocked'''
+RETURN = '''mocked'''
+
+
+def main():
+ result = dict(
+ changed=False,
+ original_message='',
+ message='')
+
+ module = AnsibleModule(
+ argument_spec=dict(),
+ supports_check_mode=True,
+ )
+ module.exit_json(**result)
+
+
+if __name__ == "__main__":
+ main()
+"""
+
+FileType = Literal[
+ "playbook",
+ "rulebook",
+ "meta", # role meta
+ "meta-runtime",
+ "tasks", # includes pre_tasks, post_tasks
+ "handlers", # very similar to tasks but with some specifics
+ # https://docs.ansible.com/ansible/latest/galaxy/user_guide.html#installing-roles-and-collections-from-the-same-requirements-yml-file
+ "requirements",
+ "role", # that is a folder!
+ "yaml", # generic yaml file, previously reported as unknown file type
+ "ansible-lint-config",
+ "sanity-ignore-file", # tests/sanity/ignore file
+ "plugin",
+ "", # unknown file type
+]
+
+
+# Aliases for deprecated tags/ids and their newer names
+RENAMED_TAGS = {
+ "102": "no-jinja-when",
+ "104": "deprecated-bare-vars",
+ "105": "deprecated-module",
+ "106": "role-name",
+ "202": "risky-octal",
+ "203": "no-tabs",
+ "205": "playbook-extension",
+ "206": "jinja[spacing]",
+ "207": "jinja[invalid]",
+ "208": "risky-file-permissions",
+ "301": "no-changed-when",
+ "302": "deprecated-command-syntax",
+ "303": "command-instead-of-module",
+ "304": "inline-env-var",
+ "305": "command-instead-of-shell",
+ "306": "risky-shell-pipe",
+ "401": "latest[git]",
+ "402": "latest[hg]",
+ "403": "package-latest",
+ "404": "no-relative-paths",
+ "501": "partial-become",
+ "502": "name[missing]",
+ "503": "no-handler",
+ "504": "deprecated-local-action",
+ "505": "missing-import",
+ "601": "literal-compare",
+ "602": "empty-string-compare",
+ "702": "meta-no-tags",
+ "703": "meta-incorrect",
+ "704": "meta-video-links",
+ "911": "syntax-check",
+ "deprecated-command-syntax": "no-free-form",
+ "fqcn-builtins": "fqcn[action-core]",
+ "git-latest": "latest[git]",
+ "hg-latest": "latest[hg]",
+ "no-jinja-nesting": "jinja[invalid]",
+ "no-loop-var-prefix": "loop-var-prefix",
+ "unnamed-task": "name[missing]",
+ "var-spacing": "jinja[spacing]",
+}
+
+PLAYBOOK_TASK_KEYWORDS = [
+ "tasks",
+ "handlers",
+ "pre_tasks",
+ "post_tasks",
+]
+NESTED_TASK_KEYS = [
+ "block",
+ "always",
+ "rescue",
+]
+
+# Keys that are used internally when parsing YAML/JSON files
+SKIPPED_RULES_KEY = "__skipped_rules__"
+LINE_NUMBER_KEY = "__line__"
+FILENAME_KEY = "__file__"
+ANNOTATION_KEYS = [
+ FILENAME_KEY,
+ LINE_NUMBER_KEY,
+ SKIPPED_RULES_KEY,
+ "__ansible_module__",
+ "__ansible_module_original__",
+]
+INCLUSION_ACTION_NAMES = {
+ "include",
+ "include_tasks",
+ "import_playbook",
+ "import_tasks",
+ "ansible.builtin.include",
+ "ansible.builtin.include_tasks",
+ "ansible.builtin.import_playbook",
+ "ansible.builtin.import_tasks",
+}
+
+ROLE_IMPORT_ACTION_NAMES = {
+ "ansible.builtin.import_role",
+ "ansible.builtin.include_role",
+ "ansible.legacy.import_role",
+ "ansible.legacy.include_role",
+ "import_role",
+ "include_role",
+}
+
+# Newer versions of git might fail to run when different file ownership is
+# found of repo. One example is on GHA runners executing containerized
+# reusable actions, where the mounted volume might have different owner.
+#
+# https://github.com/ansible/ansible-lint-action/issues/138
+GIT_CMD = ["git", "-c", f"safe.directory={Path.cwd()}"]
+
+CONFIG_FILENAMES = [
+ ".ansible-lint",
+ ".config/ansible-lint.yml",
+ ".config/ansible-lint.yaml",
+]
+
+
+class States(Enum):
+ """States used are used as sentinel values in various places."""
+
+ NOT_LOADED = "File not loaded"
+ LOAD_FAILED = "File failed to load"
+ UNKNOWN_DATA = "Unknown data"
+
+ def __bool__(self) -> bool:
+ """Ensure all states evaluate as False as booleans."""
+ return False