summaryrefslogtreecommitdiffstats
path: root/src/ansiblelint/app.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/ansiblelint/app.py')
-rw-r--r--src/ansiblelint/app.py48
1 files changed, 42 insertions, 6 deletions
diff --git a/src/ansiblelint/app.py b/src/ansiblelint/app.py
index 52581b3..3568f53 100644
--- a/src/ansiblelint/app.py
+++ b/src/ansiblelint/app.py
@@ -1,10 +1,12 @@
"""Application."""
+
from __future__ import annotations
import copy
import itertools
import logging
import os
+import sys
from functools import lru_cache
from pathlib import Path
from typing import TYPE_CHECKING, Any
@@ -20,6 +22,7 @@ from ansiblelint.config import PROFILES, Options, get_version_warning
from ansiblelint.config import options as default_options
from ansiblelint.constants import RC, RULE_DOC_URL
from ansiblelint.loaders import IGNORE_FILE
+from ansiblelint.requirements import Reqs
from ansiblelint.stats import SummarizedResults, TagStats
if TYPE_CHECKING:
@@ -30,6 +33,7 @@ if TYPE_CHECKING:
_logger = logging.getLogger(__package__)
+_CACHED_APP = None
class App:
@@ -46,7 +50,25 @@ class App:
self.formatter = formatter_factory(options.cwd, options.display_relative_path)
# Without require_module, our _set_collections_basedir may fail
- self.runtime = Runtime(isolated=True, require_module=True)
+ self.runtime = Runtime(
+ isolated=True,
+ require_module=True,
+ verbosity=options.verbosity,
+ )
+ self.reqs = Reqs("ansible-lint")
+ package = "ansible-core"
+ if not self.reqs.matches(
+ package,
+ str(self.runtime.version),
+ ): # pragma: no cover
+ msg = f"ansible-lint requires {package}{','.join(str(x) for x in self.reqs[package])} and current version is {self.runtime.version}"
+ logging.error(msg)
+ sys.exit(RC.INVALID_CONFIG)
+
+ # pylint: disable=import-outside-toplevel
+ from ansiblelint.yaml_utils import load_yamllint_config
+
+ self.yamllint_config = load_yamllint_config()
def render_matches(self, matches: list[MatchError]) -> None:
"""Display given matches (if they are not fixed)."""
@@ -54,7 +76,7 @@ class App:
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
@@ -205,7 +227,7 @@ class App:
ignore_file.writelines(sorted(lines))
elif matched_rules and not self.options.quiet:
console_stderr.print(
- "Read [link=https://ansible-lint.readthedocs.io/configuring/#ignoring-rules-for-entire-files]documentation[/link] for instructions on how to ignore specific rule violations.",
+ "Read [link=https://ansible.readthedocs.io/projects/lint/configuring/#ignoring-rules-for-entire-files]documentation[/link] for instructions on how to ignore specific rule violations.",
)
# Do not deprecate the old tags just yet. Why? Because it is not currently feasible
@@ -223,7 +245,7 @@ class App:
if self.options.write_list and "yaml" in self.options.skip_list:
_logger.warning(
- "You specified '--write', but no files can be modified "
+ "You specified '--fix', but no files can be modified "
"because 'yaml' is in 'skip_list'.",
)
@@ -332,7 +354,10 @@ class App:
if self.options.profile:
msg += f" Profile '{self.options.profile}' was required"
if summary.passed_profile:
- msg += f", but only '{summary.passed_profile}' profile passed."
+ if summary.passed_profile == self.options.profile:
+ msg += ", and it passed."
+ else:
+ msg += f", but '{summary.passed_profile}' profile passed."
else:
msg += "."
elif summary.passed_profile:
@@ -378,8 +403,19 @@ def _sanitize_list_options(tag_list: list[str]) -> list[str]:
@lru_cache
-def get_app(*, offline: bool | None = None) -> App:
+def get_app(*, offline: bool | None = None, cached: bool = False) -> App:
"""Return the application instance, caching the return value."""
+ # Avoids ever running the app initialization twice if cached argument
+ # is mentioned.
+ if cached:
+ if offline is not None:
+ msg = (
+ "get_app should never be called with other arguments when cached=True."
+ )
+ raise RuntimeError(msg)
+ if cached and _CACHED_APP is not None:
+ return _CACHED_APP
+
if offline is None:
offline = default_options.offline