[build-system] requires = [ "setuptools >= 63.0.0", # required by pyproject+setuptools_scm integration "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.8" 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.8", "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 = ["py38"] [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 = ["*/src/*/_vendor/*", "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 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)" [[tool.mypy.overrides]] module = ["ansible.*", "yamllint.*", "ansiblelint._version"] 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] # pylint defaults + f,fh,v,id good-names = ["i", "j", "k", "ex", "Run", "_", "f", "fh", "v", "id", "T"] # Ignore as being generated: ignore-paths = "^src/ansiblelint/(_version|_vendor).*$" [tool.pylint."MESSAGES CONTROL"] # increase from default is 50 which is too aggressive max-statements = 60 disable = [ # On purpose disabled as we rely on black "line-too-long", # 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", ] [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"] 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/ansiblelint/_vendor", "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 markers = ["eco: Tests effects on a set of 3rd party ansible repositories"] [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"