[build-system] requires = [ "setuptools >= 65.3.0", # required by pyproject+setuptools_scm integration and editable installs "setuptools_scm[toml] >= 7.0.5", # required for "no-local-version" scheme ] build-backend = "setuptools.build_meta" [project] # https://peps.python.org/pep-0621/#readme requires-python = ">=3.9" dynamic = ["version", "dependencies", "optional-dependencies"] name = "ansible-lint" description = "Checks playbooks for practices and behavior that could potentially be improved" readme = "README.md" authors = [{ "name" = "Will Thames", "email" = "will@thames.id.au" }] maintainers = [{ "name" = "Ansible by Red Hat", "email" = "info@ansible.com" }] license = { text = "GPLv3+" } classifiers = [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: Information Technology", "Intended Audience :: System Administrators", "License :: OSI Approved :: MIT License", "Operating System :: MacOS", "Operating System :: POSIX", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python", "Topic :: System :: Systems Administration", "Topic :: Software Development :: Quality Assurance", "Topic :: Software Development :: Testing", "Topic :: Utilities", ] keywords = ["ansible", "lint"] [project.urls] homepage = "https://github.com/ansible/ansible-lint" documentation = "https://ansible-lint.readthedocs.io/" repository = "https://github.com/ansible/ansible-lint" changelog = "https://github.com/ansible/ansible-lint/releases" [project.scripts] ansible-lint = "ansiblelint.__main__:_run_cli_entrypoint" [tool.black] target-version = ["py39"] [tool.codespell] skip = ".tox,.mypy_cache,build,.git,.eggs,pip-wheel-metadata" # indention is a typo in ruamel.yaml's API ignore-words-list = "indention" [tool.coverage.run] source = ["src"] # Do not use branch until bug is fixes: # https://github.com/nedbat/coveragepy/issues/605 # branch = true parallel = true concurrency = ["multiprocessing", "thread"] # Keep this default because xml/report do not know to use load it from config file: # data_file = ".coverage" [tool.coverage.paths] source = ["src", ".tox/*/site-packages"] [tool.coverage.report] exclude_lines = ["pragma: no cover", "if TYPE_CHECKING:"] omit = ["test/*"] # Increase it just so it would pass on any single-python run fail_under = 93 skip_covered = true skip_empty = true # During development we might remove code (files) with coverage data, and we dont want to fail: ignore_errors = true show_missing = true [tool.isort] profile = "black" # add_imports = "from __future__ import annotations" known_first_party = "ansiblelint" known_third_party = "ansible,pytest,ruamel,setuptools,yaml" # https://black.readthedocs.io/en/stable/the_black_code_style.html#line-length multi_line_output = 3 include_trailing_comma = true force_grid_wrap = 0 use_parentheses = true ensure_newline_before_comments = true line_length = 88 [tool.mypy] python_version = 3.9 strict = true color_output = true error_summary = true disallow_untyped_calls = true disallow_untyped_defs = true disallow_any_generics = true # disallow_any_unimported = True # warn_redundant_casts = True # warn_return_any = True # warn_unused_configs = True # site-packages is here to help vscode mypy integration getting confused exclude = "(build|dist|test/local-content|site-packages|~/.pyenv|examples/playbooks/collections|plugins/modules)" # https://github.com/python/mypy/issues/12664 no_incremental = true [[tool.mypy.overrides]] module = [ "ansible.*", "yamllint.*", "ansiblelint._version", # generated "ruamel.yaml", "spdx.*", ] ignore_missing_imports = true ignore_errors = true [tool.pylint.MAIN] extension-pkg-allow-list = ["black.parsing"] [tool.pylint.IMPORTS] preferred-modules = ["py:pathlib", "unittest:pytest"] [tool.pylint.MASTER] bad-names = [ # spell-checker:ignore linenumber "linenumber", # use lineno instead "line_number", # use lineno instead ] # pylint defaults + f,fh,v,id good-names = ["i", "j", "k", "Run", "_", "f", "fh", "v", "id", "T"] # Ignore as being generated: ignore-paths = "^src/ansiblelint/_version.*$" [tool.pylint."MESSAGES CONTROL"] # increase from default is 50 which is too aggressive max-statements = 60 disable = [ # Disabled on purpose: "line-too-long", # covered by black "too-many-branches", # covered by ruff C901 # TODO(ssbarnea): remove temporary skips adding during initial adoption: "duplicate-code", # unable to disable it inside tests # https://github.com/PyCQA/pylint/issues/850 "cyclic-import", # https://github.com/PyCQA/pylint/issues/8453 "preferred-module", ] [tool.pylint.TYPECHECK] # pylint is unable to detect Namespace attributes and will throw a E1101 generated-members = "options.*" [tool.pylint.SUMMARY] # We don't need the score spamming console, as we either pass or fail score = "n" [tool.pyright] # https://github.com/microsoft/pyright/blob/main/docs/configuration.md#sample-pyprojecttoml-file pythonVersion = "3.9" include = ["src"] # https://github.com/microsoft/pyright/issues/777 "stubPath" = "" # spell-checker:ignore filterwarnings norecursedirs optionflags [tool.pytest.ini_options] # do not add options here as this will likely break either console runs or IDE # integration like vscode or pycharm addopts = "-p no:pytest_cov" # https://code.visualstudio.com/docs/python/testing # coverage is re-enabled in `tox.ini`. That approach is safer than # `--no-cov` which prevents activation from tox.ini and which also fails # when plugin is effectively missing. doctest_optionflags = ["ALLOW_UNICODE", "ELLIPSIS"] filterwarnings = [ "error", # https://sourceforge.net/p/ruamel-yaml/tickets/452/ "ignore:Deprecated call to `pkg_resources.declare_namespace:DeprecationWarning", # https://github.com/spdx/tools-python/issues/507 "ignore:pkg_resources is deprecated as an API:DeprecationWarning", # We raise one non critical warning from our own conftest.py: "always::pytest.PytestWarning", ] junit_duration_report = "call" # Our github annotation parser from .github/workflows/tox.yml requires xunit1 format. Ref: # https://github.com/shyim/junit-report-annotations-action/issues/3#issuecomment-663241378 junit_family = "xunit1" junit_suite_name = "ansible_lint_test_suite" minversion = "4.6.6" norecursedirs = [ "build", "collections", "dist", "docs", "src/ansible_lint.egg-info", ".cache", ".eggs", ".git", ".github", ".tox", "*.egg", ".projects", ] python_files = [ "test_*.py", # Ref: https://docs.pytest.org/en/latest/reference.html#confval-python_files # Needed to discover legacy nose test modules: "Test*.py", # Needed to discover embedded Rule tests "rules/*.py", ] # Using --pyargs instead of testpath as we embed some tests # See: https://github.com/pytest-dev/pytest/issues/6451#issuecomment-687043537 # testpaths = xfail_strict = true [tool.ruff] required-version = "0.0.274" ignore = [ "E501", # we use black "ERA001", # auto-removal of commented out code affects development and vscode integration "INP001", # "is part of an implicit namespace package", all false positives "PLW2901", # PLW2901: Redefined loop variable "RET504", # Unnecessary variable assignment before `return` statement # temporary disabled until we fix them: "ANN", "ARG002", # Unused method argument (currently in too many places) "D102", # Missing docstring in public method (currently in too many places) "FBT001", "FBT003", "PLR", "RUF012", # Mutable class attributes should be annotated with `typing.ClassVar` "TRY", ] select = ["ALL"] target-version = "py39" # Same as Black. line-length = 88 [tool.ruff.mccabe] # Implicit 10 is too low for our codebase, even black uses 18 as default. max-complexity = 20 [tool.ruff.flake8-builtins] builtins-ignorelist = ["id"] [tool.ruff.flake8-pytest-style] parametrize-values-type = "tuple" [tool.ruff.isort] known-first-party = ["ansiblelint"] [tool.ruff.per-file-ignores] "test/**/*.py" = ["S"] "src/ansiblelint/rules/*.py" = ["S"] "src/ansiblelint/testing/*.py" = ["S"] # Temporary disabled until we fix them: "src/ansiblelint/{utils,file_utils,runner,loaders,constants,config,cli,_mockings}.py" = [ "PTH", ] [tool.setuptools.dynamic] optional-dependencies.docs = { file = [".config/requirements-docs.txt"] } optional-dependencies.test = { file = [".config/requirements-test.txt"] } optional-dependencies.lock = { file = [".config/requirements-lock.txt"] } dependencies = { file = [".config/requirements.in"] } [tool.setuptools_scm] local_scheme = "no-local-version" write_to = "src/ansiblelint/_version.py"