summaryrefslogtreecommitdiffstats
path: root/pyproject.toml
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--pyproject.toml278
1 files changed, 278 insertions, 0 deletions
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..e182c5b
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,278 @@
+[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"