{"adoption": {"forks": 359, "observed_at": "2026-08-28T04:06:55.071967+00:00", "stars": 2477}, "canonical_url": "https://ross.abutalabs.com/products/pytest-testinfra", "card": {"archived": false, "artifact_type": "library", "description": "Testinfra test your infrastructures", "domain": ["testing", "infrastructure-as-code"], "enriched": true, "function": ["testing", "infrastructure-as-code", "configuration-management"], "health_score": 88, "homepage": "https://testinfra.readthedocs.io", "language": "Python", "license": "Apache-2.0", "license_family": "permissive", "maturity": "maintenance", "member_repos": ["pytest-dev/pytest-testinfra"], "name": "pytest-dev/pytest-testinfra", "platform": ["python", "cli"], "pushed_at": "2026-07-20T20:32:30+00:00", "repo": "pytest-dev/pytest-testinfra", "stars": 2477, "tags": ["pytest-plugin", "serverspec-equivalent", "infrastructure-testing", "ansible", "saltstack", "chef", "puppet", "tdd", "devops", "automation", "linux", "docker", "kubernetes"], "topics": ["python", "testing", "infrastructure-as-code", "devops", "tdd", "nagios", "docker", "tdd-utilities", "testing-tools", "devops-tools", "infrastructure-testing", "saltstack", "chef", "puppet", "ansible", "kubernetes", "pytest-plugin"], "urls": [], "use_cases": ["verify server configuration with pytest tests", "test ansible playbooks actually applied the right state", "check that nginx is installed and running on my servers", "assert file permissions and contents on remote hosts", "run infrastructure tests against docker containers", "replace serverspec with a python-based tool", "use infrastructure tests in ci/cd pipelines"], "what_it_is": "Testinfra is a pytest plugin for writing unit tests in Python that verify the actual state of servers managed by tools like Ansible, Salt, Puppet, and Chef. It is the Python equivalent of Serverspec, letting you assert on files, packages, and services across your infrastructure.", "when_to_avoid": ["you need a project with active maintenance and fast issue responses", "you prefer behavior testing over state testing", "you need a non-Python test stack"], "when_to_choose": ["you use pytest and want infrastructure verification in Python", "you manage servers with Ansible, Salt, Puppet, or Chef and need state assertions", "you want a Serverspec-like tool in the Python ecosystem"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/pytest-testinfra", "repo": "pytest-dev/pytest-testinfra", "role": "main", "score": 76}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:06:55.071967+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:28:20.223139+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2229ba0be432c549b5a06ab3a5da476b3c2c892c8233eb3af232445e5ae47a19", "fetched_at": "2026-08-28T04:06:55.071967+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pytest-dev/pytest-testinfra"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:06:55.071967+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:28:20.223139+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2229ba0be432c549b5a06ab3a5da476b3c2c892c8233eb3af232445e5ae47a19", "fetched_at": "2026-08-28T04:06:55.071967+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pytest-dev/pytest-testinfra"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:28:20.223139+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2229ba0be432c549b5a06ab3a5da476b3c2c892c8233eb3af232445e5ae47a19", "fetched_at": "2026-08-28T04:06:55.071967+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pytest-dev/pytest-testinfra"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:06:55.071967+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:06:55.071967+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:06:55.071967+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:28:20.223139+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2229ba0be432c549b5a06ab3a5da476b3c2c892c8233eb3af232445e5ae47a19", "fetched_at": "2026-08-28T04:06:55.071967+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pytest-dev/pytest-testinfra"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:06:55.071967+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:06:55.071967+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:28:20.223139+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2229ba0be432c549b5a06ab3a5da476b3c2c892c8233eb3af232445e5ae47a19", "fetched_at": "2026-08-28T04:06:55.071967+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pytest-dev/pytest-testinfra"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:06:55.071967+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:06:55.071967+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:06:55.071967+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:28:20.223139+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2229ba0be432c549b5a06ab3a5da476b3c2c892c8233eb3af232445e5ae47a19", "fetched_at": "2026-08-28T04:06:55.071967+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pytest-dev/pytest-testinfra"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:06:55.071967+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:06:55.071967+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:28:20.223139+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2229ba0be432c549b5a06ab3a5da476b3c2c892c8233eb3af232445e5ae47a19", "fetched_at": "2026-08-28T04:06:55.071967+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pytest-dev/pytest-testinfra"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:28:20.223139+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2229ba0be432c549b5a06ab3a5da476b3c2c892c8233eb3af232445e5ae47a19", "fetched_at": "2026-08-28T04:06:55.071967+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pytest-dev/pytest-testinfra"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:28:20.223139+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2229ba0be432c549b5a06ab3a5da476b3c2c892c8233eb3af232445e5ae47a19", "fetched_at": "2026-08-28T04:06:55.071967+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pytest-dev/pytest-testinfra"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:28:20.223139+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2229ba0be432c549b5a06ab3a5da476b3c2c892c8233eb3af232445e5ae47a19", "fetched_at": "2026-08-28T04:06:55.071967+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pytest-dev/pytest-testinfra"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 93, "longevity": 100, "rhythm": 40}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 4189, "days_push": 44, "days_rel": 521, "gap_med": 0.0, "n_releases_24m": 3}, "score": 76, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}