{"adoption": {"forks": 674, "observed_at": "2026-08-28T04:08:36.093370+00:00", "stars": 4132}, "canonical_url": "https://ross.abutalabs.com/products/molecule", "card": {"archived": false, "artifact_type": "cli-tool", "description": "An ansible-native testing framework for collections, playbooks, and roles with configurable workflows for testing any system or service", "domain": ["testing", "developer-tools"], "enriched": true, "function": ["testing", "e2e-testing", "cli"], "health_score": 100, "homepage": "https://ansible.readthedocs.io/projects/molecule/", "language": "Python", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["ansible/molecule"], "name": "ansible/molecule", "platform": ["python", "cli", "windows"], "pushed_at": "2026-08-26T18:38:16+00:00", "repo": "ansible/molecule", "stars": 4132, "tags": ["ansible", "testinfra", "infrastructure-as-code-testing", "molecule-drivers", "podman", "automation", "devops", "linux", "macos", "docker"], "topics": ["python", "ansible", "testing", "testing-framework", "testinfra", "molecule-driver", "podman", "cookiecutter-ansible", "hacktoberfest", "supports-dot-config", "pep-621", "ansible-dev-tools"], "urls": [], "use_cases": ["test ansible roles before publishing them", "run integration tests for ansible collections", "verify playbooks against containerized instances", "validate ansible roles across multiple platforms", "test infrastructure automation code in CI", "check dynamic inventory configurations"], "what_it_is": "Molecule is an Ansible-native testing framework for developing and testing Ansible collections, playbooks, and roles. It uses standard Ansible features like inventory and playbooks to build configurable test scenarios against containers, VMs, cloud services, and network devices.", "when_to_avoid": ["you are not using Ansible for automation", "you need unit testing for general Python code", "you want simple linting only without scenario execution"], "when_to_choose": ["you develop Ansible roles, collections, or playbooks and need repeatable tests", "you want scenario-based testing with configurable drivers like Docker or Podman", "you need to test Ansible content against real systems, clouds, or network devices", "you want consistent, maintainable Ansible content development workflows"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/molecule", "repo": "ansible/molecule", "role": "main", "score": 94}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.093370+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T18:23:02.640169+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c9db8e825ed8fde64deffb6892e483e6f6c5ed109efc4b08e14e83a044984aa8", "fetched_at": "2026-08-28T04:08:36.093370+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ansible/molecule"}, {"content_hash": "ef0e299307a16bfeba0c024e4809285ae5fab29767ab26527931040e1c88df2c", "fetched_at": "2026-08-29T09:14:44.862206+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/molecule/json"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.093370+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T18:23:02.640169+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c9db8e825ed8fde64deffb6892e483e6f6c5ed109efc4b08e14e83a044984aa8", "fetched_at": "2026-08-28T04:08:36.093370+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ansible/molecule"}, {"content_hash": "ef0e299307a16bfeba0c024e4809285ae5fab29767ab26527931040e1c88df2c", "fetched_at": "2026-08-29T09:14:44.862206+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/molecule/json"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T18:23:02.640169+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c9db8e825ed8fde64deffb6892e483e6f6c5ed109efc4b08e14e83a044984aa8", "fetched_at": "2026-08-28T04:08:36.093370+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ansible/molecule"}, {"content_hash": "ef0e299307a16bfeba0c024e4809285ae5fab29767ab26527931040e1c88df2c", "fetched_at": "2026-08-29T09:14:44.862206+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/molecule/json"}], "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:08:36.093370+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.093370+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.093370+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T18:23:02.640169+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c9db8e825ed8fde64deffb6892e483e6f6c5ed109efc4b08e14e83a044984aa8", "fetched_at": "2026-08-28T04:08:36.093370+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ansible/molecule"}, {"content_hash": "ef0e299307a16bfeba0c024e4809285ae5fab29767ab26527931040e1c88df2c", "fetched_at": "2026-08-29T09:14:44.862206+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/molecule/json"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.093370+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.093370+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T18:23:02.640169+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c9db8e825ed8fde64deffb6892e483e6f6c5ed109efc4b08e14e83a044984aa8", "fetched_at": "2026-08-28T04:08:36.093370+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ansible/molecule"}, {"content_hash": "ef0e299307a16bfeba0c024e4809285ae5fab29767ab26527931040e1c88df2c", "fetched_at": "2026-08-29T09:14:44.862206+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/molecule/json"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.093370+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.093370+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.093370+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T18:23:02.640169+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c9db8e825ed8fde64deffb6892e483e6f6c5ed109efc4b08e14e83a044984aa8", "fetched_at": "2026-08-28T04:08:36.093370+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ansible/molecule"}, {"content_hash": "ef0e299307a16bfeba0c024e4809285ae5fab29767ab26527931040e1c88df2c", "fetched_at": "2026-08-29T09:14:44.862206+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/molecule/json"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.093370+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:08:36.093370+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T18:23:02.640169+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c9db8e825ed8fde64deffb6892e483e6f6c5ed109efc4b08e14e83a044984aa8", "fetched_at": "2026-08-28T04:08:36.093370+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ansible/molecule"}, {"content_hash": "ef0e299307a16bfeba0c024e4809285ae5fab29767ab26527931040e1c88df2c", "fetched_at": "2026-08-29T09:14:44.862206+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/molecule/json"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T18:23:02.640169+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c9db8e825ed8fde64deffb6892e483e6f6c5ed109efc4b08e14e83a044984aa8", "fetched_at": "2026-08-28T04:08:36.093370+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ansible/molecule"}, {"content_hash": "ef0e299307a16bfeba0c024e4809285ae5fab29767ab26527931040e1c88df2c", "fetched_at": "2026-08-29T09:14:44.862206+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/molecule/json"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T18:23:02.640169+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c9db8e825ed8fde64deffb6892e483e6f6c5ed109efc4b08e14e83a044984aa8", "fetched_at": "2026-08-28T04:08:36.093370+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ansible/molecule"}, {"content_hash": "ef0e299307a16bfeba0c024e4809285ae5fab29767ab26527931040e1c88df2c", "fetched_at": "2026-08-29T09:14:44.862206+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/molecule/json"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T18:23:02.640169+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c9db8e825ed8fde64deffb6892e483e6f6c5ed109efc4b08e14e83a044984aa8", "fetched_at": "2026-08-28T04:08:36.093370+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ansible/molecule"}, {"content_hash": "ef0e299307a16bfeba0c024e4809285ae5fab29767ab26527931040e1c88df2c", "fetched_at": "2026-08-29T09:14:44.862206+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/molecule/json"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 100, "rhythm": 85}, "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": 3942, "days_push": 7, "days_rel": 21, "gap_med": 41.0, "n_releases_24m": 19}, "score": 94, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}