# content of pyproject.toml [build-system] requires = ["setuptools>=64.0.0", "wheel"] build-backend = "setuptools.build_meta" [project] name = "anta" version = "v0.13.0" readme = "docs/README.md" authors = [{ name = "Khelil Sator", email = "ksator@arista.com" }] maintainers = [ { name = "Khelil Sator", email = "ksator@arista.com" }, { name = "Matthieu Tâche", email = "mtache@arista.com" }, { name = "Thomas Grimonet", email = "tgrimonet@arista.com" }, { name = "Guillaume Mulocher", email = "gmulocher@arista.com" }, ] description = "Arista Network Test Automation (ANTA) Framework" license = { file = "LICENSE" } dependencies = [ "aiocache~=0.12.2", "aio-eapi==0.6.3", "click~=8.1.6", "click-help-colors~=0.9", "cvprac~=1.3.1", "pydantic>=2.1.1,<2.7.0", "pydantic-extra-types>=2.1.0", "PyYAML~=6.0", "requests~=2.31.0", "rich>=13.5.2,<13.8.0", "rich>=13.5.2,<13.8.0", "asyncssh>=2.13.2,<2.15.0", "Jinja2~=3.1.2", ] keywords = ["test", "anta", "Arista", "network", "automation", "networking", "devops", "netdevops"] classifiers = [ "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "Intended Audience :: Information Technology", "Programming Language :: Python", "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.12", "Programming Language :: Python :: 3 :: Only", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Software Development :: Testing", "Topic :: System :: Networking", ] requires-python = ">=3.8" [project.optional-dependencies] dev = [ "bumpver==2023.1129", "black==24.2.0", "flake8==7.0.0", "isort==5.13.2", "mypy~=1.7", "mypy-extensions~=1.0", "pre-commit>=3.3.3", "pylint>=2.17.5", "ruff>=0.0.280", "pytest>=7.4.0", "pytest-asyncio>=0.21.1", "pytest-cov>=4.1.0", "pytest-dependency", "pytest-html>=3.2.0", "pytest-metadata>=3.0.0", "pylint-pydantic>=0.2.4", "tox>=4.10.0,<5.0.0", "types-PyYAML", "types-paramiko", "types-requests", "typing-extensions", "yamllint>=1.32.0", ] doc = [ "mkdocs>=1.3.1", "mkdocs-autorefs>=0.4.1", "mkdocs-bootswatch>=1.1", "mkdocs-git-revision-date-localized-plugin>=1.1.0", "mkdocs-git-revision-date-plugin>=0.3.2", "mkdocs-material>=8.3.9", "mkdocs-material-extensions>=1.0.3", "mkdocstrings[python]>=0.20.0", "fontawesome_markdown", "mike==2.0.0", "griffe==0.41.1" ] [project.urls] Homepage = "https://www.anta.ninja" "Bug Tracker" = "https://github.com/arista-netdevops-community/anta/issues" Contributing = "https://www.anta.ninja/main/contribution/" [project.scripts] anta = "anta.cli:cli" ################################ # Tools ################################ [tool.setuptools.packages.find] include = ["anta*"] namespaces = false ################################ # Version ################################ [tool.bumpver] current_version = "0.13.0" version_pattern = "MAJOR.MINOR.PATCH" commit_message = "bump: Version {old_version} -> {new_version}" commit = true # No tag tag = false push = false [tool.bumpver.file_patterns] "pyproject.toml" = ['current_version = "{version}"', 'version = "v{version}"'] "docs/contribution.md" = ["anta {version}"] "docs/requirements-and-installation.md " = ["anta, version v{version}"] ################################ # Linting ################################ [tool.isort] profile = "black" line_length = 165 [tool.black] line-length = 165 force-exclude = """ ( .*data.py| ) """ ################################ # Typing # mypy as per https://pydantic-docs.helpmanual.io/mypy_plugin/#enabling-the-plugin ################################ [tool.mypy] plugins = [ "pydantic.mypy", ] # Comment below for better type checking #follow_imports = "skip" ignore_missing_imports = true warn_redundant_casts = true # Note: tox find some unused type ignore which are required for pre-commit # To investigate warn_unused_ignores = true disallow_any_generics = true check_untyped_defs = true no_implicit_reexport = true strict_optional = true # for strict mypy: (this is the tricky one :-)) disallow_untyped_defs = true [tool.pydantic-mypy] init_forbid_extra = true init_typed = true warn_required_dynamic_aliases = true warn_untyped_fields = true ################################ # Testing ################################ [tool.pytest.ini_options] # TODO - may need cov-append for Tox # When run from anta directory this will read cov-config from pyproject.toml addopts = "-ra -q -s -vv --capture=tee-sys --cov --cov-report term:skip-covered --color yes" log_level = "WARNING" log_cli = true render_collapsed = true filterwarnings = [ "ignore::urllib3.exceptions.InsecureRequestWarning" ] testpaths = ["tests"] [tool.coverage.run] branch = true source = ["anta"] parallel = true omit = [ # omit aioeapi patch "anta/aioeapi.py", ] [tool.coverage.report] # Regexes for lines to exclude from consideration exclude_lines = [ # Have to re-enable the standard pragma "pragma: no cover", # Don't complain about missing debug-only code: "def __repr__", "if self\\.debug", # Don't complain if tests don't hit defensive assertion code: "raise AssertionError", "raise NotImplementedError", # Don't complain if non-runnable code isn't run: "if 0:", "if __name__ == .__main__.:", # Don't complain about abstract methods, they aren't run: "@(abc\\.)?abstractmethod", # Don't complain about TYPE_CHECKING blocks "if TYPE_CHECKING:", ] ignore_errors = true [tool.coverage.html] directory = "coverage_html_report" [tool.coverage.xml] output = ".coverage.xml" ################################ # Tox ################################ [tool.tox] legacy_tox_ini = """ [tox] min_version = 4.0 envlist = clean, lint, type, py{38,39,310,311,312}, report [gh-actions] python = 3.8: py38 3.9: py39 3.10: py310 3.11: erase, py311, report 3.12: py312 [testenv] description = Run pytest with {basepython} extras = dev # posargs allows to run only a specific test using # tox -e -- path/to/my/test::test commands = pytest {posargs} [testenv:lint] description = Check the code style commands = black --check --diff --color . isort --check --diff --color . flake8 --max-line-length=165 --config=/dev/null anta tests pylint anta pylint tests [testenv:type] description = Check typing commands = mypy --config-file=pyproject.toml anta mypy --config-file=pyproject.toml tests [testenv:clean] description = Erase previous coverage reports deps = coverage[toml] skip_install = true commands = coverage erase [testenv:report] description = Generate coverage report deps = coverage[toml] commands = coverage --version coverage html --rcfile=pyproject.toml coverage xml --rcfile=pyproject.toml # add the following to make the report fail under some percentage # commands = coverage report --fail-under=80 depends = py311 """ # TRYING RUFF - NOT ENABLED IN CI NOR PRE-COMMIT [tool.ruff] # Enable pycodestyle (`E`) and Pyflakes (`F`) codes by default. # select = ["E", "F"] # select all cause we like being suffering select = ["A", "B", "C", "D", "E", "F", "G", "I", "N", "Q", "S", "T", "W", "ANN", "ARG", "BLE", "COM", "DJ", "DTZ", "EM", "ERA", "EXE", "FBT", "ICN", "INP", "ISC", "NPY", "PD", "PGH", "PIE", "PL", "PT", "PTH", "PYI", "RET", "RSE", "RUF", "SIM", "SLF", "TCH", "TID", "TRY", "UP", "YTT"] ignore = [] # Allow autofix for all enabled rules (when `--fix`) is provided. fixable = ["A", "B", "C", "D", "E", "F", "G", "I", "N", "Q", "S", "T", "W", "ANN", "ARG", "BLE", "COM", "DJ", "DTZ", "EM", "ERA", "EXE", "FBT", "ICN", "INP", "ISC", "NPY", "PD", "PGH", "PIE", "PL", "PT", "PTH", "PYI", "RET", "RSE", "RUF", "SIM", "SLF", "TCH", "TID", "TRY", "UP", "YTT"] unfixable = [] # Exclude a variety of commonly ignored directories. exclude = [ ".bzr", ".direnv", ".eggs", ".git", ".git-rewrite", ".hg", ".mypy_cache", ".nox", ".pants.d", ".pytype", ".ruff_cache", ".svn", ".tox", ".venv", "__pypackages__", "_build", "buck-out", "build", "dist", "node_modules", "venv", ] # Same as Black. line-length = 165 # Allow unused variables when underscore-prefixed. dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" # Assume Python 3.8 as this is the lowest supported version for ANTA target-version = "py38" [tool.ruff.mccabe] # Unlike Flake8, default to a complexity level of 10. max-complexity = 10