{"id":78,"name":null,"description":"RSpec's 'test double' framework, with support for stubbing and mocking","url":"https://github.com/rspec/rspec-mocks","last_synced_at":"2026-04-29T19:02:36.913Z","repository":{"id":602761,"uuid":"238983","full_name":"rspec/rspec-mocks","owner":"rspec","description":"RSpec's 'test double' framework, with support for stubbing and mocking","archived":true,"fork":false,"pushed_at":"2024-11-30T10:37:10.000Z","size":7511,"stargazers_count":1150,"open_issues_count":0,"forks_count":352,"subscribers_count":32,"default_branch":"main","last_synced_at":"2026-04-19T14:03:51.431Z","etag":null,"topics":["rspec","ruby"],"latest_commit_sha":null,"homepage":"https://rspec.info","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rspec.png","metadata":{"files":{"readme":"README.md","changelog":"Changelog.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["JonRowe","benoittgt"],"open_collective":"rspec"}},"created_at":"2009-06-29T15:56:06.000Z","updated_at":"2026-04-11T09:15:56.000Z","dependencies_parsed_at":"2024-02-04T11:41:00.200Z","dependency_job_id":"71dd080e-ce3b-405b-a254-dacb775d73cc","html_url":"https://github.com/rspec/rspec-mocks","commit_stats":{"total_commits":2218,"total_committers":190,"mean_commits":"11.673684210526316","dds":0.7042380522993688,"last_synced_commit":"3caa9ac841e146d618421f870077c0ad684e6cad"},"previous_names":[],"tags_count":145,"template":false,"template_full_name":null,"purl":"pkg:github/rspec/rspec-mocks","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rspec","download_url":"https://codeload.github.com/rspec/rspec-mocks/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks/sbom","scorecard":{"id":787569,"data":{"date":"2025-08-11","repo":{"name":"github.com/rspec/rspec-mocks","commit":"3caa9ac841e146d618421f870077c0ad684e6cad"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.5,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"project is archived","details":["Warn: Repository is archived."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Token-Permissions","score":10,"reason":"GitHub workflow tokens follow principle of least privilege","details":["Info: topLevel 'contents' permission set to 'read': .github/workflows/ci.yml:15","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 0/14 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Info: Possibly incomplete results: error parsing job operating system: .github/workflows/ci.yml:81","Info: Possibly incomplete results: error parsing job operating system: .github/workflows/ci.yml:82","Info: Possibly incomplete results: error parsing job operating system: .github/workflows/ci.yml:83","Info: Possibly incomplete results: error parsing job operating system: .github/workflows/ci.yml:84","Info: Possibly incomplete results: error parsing job operating system: .github/workflows/ci.yml:85","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:76: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:77: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:87: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:136: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:157: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:158: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Info:   0 out of   5 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: MIT License: LICENSE.md:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 26 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-23T06:29:25.565Z","repository_id":602761,"created_at":"2025-08-23T06:29:25.565Z","updated_at":"2025-08-23T06:29:25.565Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32269463,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T09:15:33.318Z","status":"ssl_error","status_checked_at":"2026-04-25T09:15:31.997Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"owner":{"login":"rspec","name":"RSpec","uuid":"22388","kind":"organization","description":"","email":null,"website":"http://rspec.info","location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/22388?v=4","repositories_count":18,"last_synced_at":"2024-03-25T19:34:00.441Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/rspec","funding_links":[],"total_stars":12597,"followers":89,"following":0,"created_at":"2022-11-02T16:17:28.010Z","updated_at":"2024-03-25T19:34:05.806Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rspec","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rspec/repositories"},"packages":[{"id":13950677,"name":"ruby-rspec-mocks","ecosystem":"guix","description":"RSpec stubbing and mocking library","homepage":"https://github.com/rspec/rspec-mocks","licenses":"expat","normalized_licenses":["Other"],"repository_url":"https://github.com/rspec/rspec-mocks","keywords_array":[],"namespace":null,"versions_count":2,"first_release_published_at":"2026-03-02T19:00:08.774Z","latest_release_published_at":"2026-03-02T19:00:08.774Z","latest_release_number":"3.13.2","last_synced_at":"2026-04-27T16:21:30.678Z","created_at":"2026-03-02T19:00:08.602Z","updated_at":"2026-04-27T16:21:30.678Z","registry_url":"https://packages.guix.gnu.org/packages/ruby-rspec-mocks/3.13.2/","install_command":"guix install ruby-rspec-mocks","documentation_url":"https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/packages/ruby-check.scm#n1051","metadata":{"location":"gnu/packages/ruby-check.scm:1051","variable_name":"ruby-rspec-mocks"},"repo_metadata":{"id":602761,"uuid":"238983","full_name":"rspec/rspec-mocks","owner":"rspec","description":"RSpec's 'test double' framework, with support for stubbing and mocking","archived":true,"fork":false,"pushed_at":"2024-11-30T10:37:10.000Z","size":7511,"stargazers_count":1150,"open_issues_count":0,"forks_count":354,"subscribers_count":32,"default_branch":"main","last_synced_at":"2026-02-23T17:08:05.147Z","etag":null,"topics":["rspec","ruby"],"latest_commit_sha":null,"homepage":"https://rspec.info","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rspec.png","metadata":{"files":{"readme":"README.md","changelog":"Changelog.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["JonRowe","benoittgt"],"open_collective":"rspec"}},"created_at":"2009-06-29T15:56:06.000Z","updated_at":"2026-02-23T09:38:05.000Z","dependencies_parsed_at":"2024-02-04T11:41:00.200Z","dependency_job_id":"71dd080e-ce3b-405b-a254-dacb775d73cc","html_url":"https://github.com/rspec/rspec-mocks","commit_stats":{"total_commits":2218,"total_committers":190,"mean_commits":"11.673684210526316","dds":0.7042380522993688,"last_synced_commit":"3caa9ac841e146d618421f870077c0ad684e6cad"},"previous_names":[],"tags_count":145,"template":false,"template_full_name":null,"purl":"pkg:github/rspec/rspec-mocks","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rspec","download_url":"https://codeload.github.com/rspec/rspec-mocks/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks/sbom","scorecard":{"id":787569,"data":{"date":"2025-08-11","repo":{"name":"github.com/rspec/rspec-mocks","commit":"3caa9ac841e146d618421f870077c0ad684e6cad"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.5,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"project is archived","details":["Warn: Repository is archived."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Token-Permissions","score":10,"reason":"GitHub workflow tokens follow principle of least privilege","details":["Info: topLevel 'contents' permission set to 'read': .github/workflows/ci.yml:15","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 0/14 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Info: Possibly incomplete results: error parsing job operating system: .github/workflows/ci.yml:81","Info: Possibly incomplete results: error parsing job operating system: .github/workflows/ci.yml:82","Info: Possibly incomplete results: error parsing job operating system: .github/workflows/ci.yml:83","Info: Possibly incomplete results: error parsing job operating system: .github/workflows/ci.yml:84","Info: Possibly incomplete results: error parsing job operating system: .github/workflows/ci.yml:85","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:76: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:77: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:87: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:136: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:157: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:158: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Info:   0 out of   5 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: MIT License: LICENSE.md:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 26 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-23T06:29:25.565Z","repository_id":602761,"created_at":"2025-08-23T06:29:25.565Z","updated_at":"2025-08-23T06:29:25.565Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29819933,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-25T11:54:16.236Z","status":"ssl_error","status_checked_at":"2026-02-25T11:54:15.198Z","response_time":61,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"repo_metadata_updated_at":"2026-04-03T00:24:18.133Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:guix/ruby-rspec-mocks","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/guix/ruby-rspec-mocks","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/guix/ruby-rspec-mocks","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/guix/ruby-rspec-mocks/dependencies","status":null,"funding_links":["https://github.com/sponsors/JonRowe","https://github.com/sponsors/benoittgt","https://opencollective.com/rspec"],"critical":null,"issue_metadata":{"last_synced_at":"2025-12-30T08:04:29.540Z","issues_count":89,"pull_requests_count":111,"avg_time_to_close_issue":77939141.11392406,"avg_time_to_close_pull_request":20407943.81081081,"issues_closed_count":79,"pull_requests_closed_count":111,"pull_request_authors_count":42,"issue_authors_count":86,"avg_comments_per_issue":6.348314606741573,"avg_comments_per_pull_request":2.6216216216216215,"merged_pull_requests_count":76,"bot_issues_count":0,"bot_pull_requests_count":1,"past_year_issues_count":6,"past_year_pull_requests_count":11,"past_year_avg_time_to_close_issue":1395643.6666666667,"past_year_avg_time_to_close_pull_request":1200050.5454545454,"past_year_issues_closed_count":6,"past_year_pull_requests_closed_count":11,"past_year_pull_request_authors_count":4,"past_year_issue_authors_count":6,"past_year_avg_comments_per_issue":2.8333333333333335,"past_year_avg_comments_per_pull_request":0.36363636363636365,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":9,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks/issues","maintainers":[{"login":"JonRowe","count":73,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/JonRowe"},{"login":"pirj","count":18,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/pirj"},{"login":"myronmarston","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/myronmarston"},{"login":"fables-tales","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/fables-tales"},{"login":"xaviershay","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/xaviershay"},{"login":"soulcutter","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/soulcutter"},{"login":"benoittgt","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/benoittgt"}],"active_maintainers":[]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/guix/packages/ruby-rspec-mocks/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/guix/packages/ruby-rspec-mocks/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/guix/packages/ruby-rspec-mocks/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/guix/packages/ruby-rspec-mocks/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/guix/packages/ruby-rspec-mocks/codemeta","maintainers":[],"registry":{"name":"guix","url":"https://guix.gnu.org","ecosystem":"guix","default":true,"packages_count":31189,"maintainers_count":0,"namespaces_count":0,"keywords_count":0,"github":"guix-mirror","metadata":{"funded_packages_count":286},"icon_url":"https://github.com/guix-mirror.png","created_at":"2026-03-02T16:23:46.981Z","updated_at":"2026-04-03T06:23:21.396Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/guix/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/guix/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/guix/namespaces"}},{"id":8614751,"name":"github.com/rspec/rspec-mocks","ecosystem":"go","description":null,"homepage":null,"licenses":"mit","normalized_licenses":["MIT"],"repository_url":"https://github.com/rspec/rspec-mocks","keywords_array":[],"namespace":null,"versions_count":86,"first_release_published_at":"2009-06-29T16:11:40.000Z","latest_release_published_at":"2024-10-02T13:19:21.000Z","latest_release_number":"v3.13.2+incompatible","last_synced_at":"2026-04-27T18:02:49.416Z","created_at":"2023-12-02T02:14:57.121Z","updated_at":"2026-04-27T18:02:49.417Z","registry_url":"https://pkg.go.dev/github.com/rspec/rspec-mocks","install_command":"go get github.com/rspec/rspec-mocks","documentation_url":"https://pkg.go.dev/github.com/rspec/rspec-mocks#section-documentation","metadata":{},"repo_metadata":{"id":602761,"uuid":"238983","full_name":"rspec/rspec-mocks","owner":"rspec","description":"RSpec's 'test double' framework, with support for stubbing and mocking","archived":true,"fork":false,"pushed_at":"2024-11-30T10:37:10.000Z","size":7511,"stargazers_count":1152,"open_issues_count":0,"forks_count":354,"subscribers_count":33,"default_branch":"main","last_synced_at":"2025-10-23T15:51:37.544Z","etag":null,"topics":["rspec","ruby"],"latest_commit_sha":null,"homepage":"https://rspec.info","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rspec.png","metadata":{"files":{"readme":"README.md","changelog":"Changelog.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["JonRowe","benoittgt"],"open_collective":"rspec"}},"created_at":"2009-06-29T15:56:06.000Z","updated_at":"2025-10-05T06:55:10.000Z","dependencies_parsed_at":"2024-02-04T11:41:00.200Z","dependency_job_id":"71dd080e-ce3b-405b-a254-dacb775d73cc","html_url":"https://github.com/rspec/rspec-mocks","commit_stats":{"total_commits":2218,"total_committers":190,"mean_commits":"11.673684210526316","dds":0.7042380522993688,"last_synced_commit":"3caa9ac841e146d618421f870077c0ad684e6cad"},"previous_names":[],"tags_count":145,"template":false,"template_full_name":null,"purl":"pkg:github/rspec/rspec-mocks","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rspec","download_url":"https://codeload.github.com/rspec/rspec-mocks/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks/sbom","scorecard":{"id":787569,"data":{"date":"2025-08-11","repo":{"name":"github.com/rspec/rspec-mocks","commit":"3caa9ac841e146d618421f870077c0ad684e6cad"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.5,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"project is archived","details":["Warn: Repository is archived."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Token-Permissions","score":10,"reason":"GitHub workflow tokens follow principle of least privilege","details":["Info: topLevel 'contents' permission set to 'read': .github/workflows/ci.yml:15","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 0/14 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Info: Possibly incomplete results: error parsing job operating system: .github/workflows/ci.yml:81","Info: Possibly incomplete results: error parsing job operating system: .github/workflows/ci.yml:82","Info: Possibly incomplete results: error parsing job operating system: .github/workflows/ci.yml:83","Info: Possibly incomplete results: error parsing job operating system: .github/workflows/ci.yml:84","Info: Possibly incomplete results: error parsing job operating system: .github/workflows/ci.yml:85","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:76: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:77: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:87: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:136: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:157: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:158: update your workflow using https://app.stepsecurity.io/secureworkflow/rspec/rspec-mocks/ci.yml/main?enable=pin","Info:   0 out of   5 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: MIT License: LICENSE.md:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 26 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-23T06:29:25.565Z","repository_id":602761,"created_at":"2025-08-23T06:29:25.565Z","updated_at":"2025-08-23T06:29:25.565Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281155551,"owners_count":26452905,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-26T02:00:06.575Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"},"owner_record":{"login":"rspec","name":"RSpec","uuid":"22388","kind":"organization","description":"","email":null,"website":"http://rspec.info","location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/22388?v=4","repositories_count":18,"last_synced_at":"2024-03-25T19:34:00.441Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/rspec","funding_links":[],"total_stars":12597,"followers":89,"following":0,"created_at":"2022-11-02T16:17:28.010Z","updated_at":"2024-03-25T19:34:05.806Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rspec","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rspec/repositories"},"tags":[]},"repo_metadata_updated_at":"2025-10-30T21:10:05.202Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":10.801592556016239,"dependent_packages_count":9.575730298247606,"stargazers_count":1.971776222038277,"forks_count":1.5451726757271902,"docker_downloads_count":null,"average":5.973567938007328},"purl":"pkg:golang/github.com/rspec/rspec-mocks","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/go/github.com/rspec/rspec-mocks","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/go/github.com/rspec/rspec-mocks","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/go/github.com/rspec/rspec-mocks/dependencies","status":null,"funding_links":["https://github.com/sponsors/JonRowe","https://github.com/sponsors/benoittgt","https://opencollective.com/rspec"],"critical":null,"issue_metadata":{"last_synced_at":"2025-08-31T21:06:09.340Z","issues_count":89,"pull_requests_count":111,"avg_time_to_close_issue":77939141.11392406,"avg_time_to_close_pull_request":20407943.81081081,"issues_closed_count":79,"pull_requests_closed_count":111,"pull_request_authors_count":42,"issue_authors_count":86,"avg_comments_per_issue":6.348314606741573,"avg_comments_per_pull_request":2.6216216216216215,"merged_pull_requests_count":76,"bot_issues_count":0,"bot_pull_requests_count":1,"past_year_issues_count":6,"past_year_pull_requests_count":11,"past_year_avg_time_to_close_issue":1395643.6666666667,"past_year_avg_time_to_close_pull_request":1200050.5454545454,"past_year_issues_closed_count":6,"past_year_pull_requests_closed_count":11,"past_year_pull_request_authors_count":4,"past_year_issue_authors_count":6,"past_year_avg_comments_per_issue":2.8333333333333335,"past_year_avg_comments_per_pull_request":0.36363636363636365,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":9,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks/issues","maintainers":[{"login":"JonRowe","count":73,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/JonRowe"},{"login":"pirj","count":18,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/pirj"},{"login":"myronmarston","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/myronmarston"},{"login":"fables-tales","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/fables-tales"},{"login":"xaviershay","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/xaviershay"},{"login":"soulcutter","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/soulcutter"},{"login":"benoittgt","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/benoittgt"}],"active_maintainers":[]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Frspec%2Frspec-mocks/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Frspec%2Frspec-mocks/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Frspec%2Frspec-mocks/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Frspec%2Frspec-mocks/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Frspec%2Frspec-mocks/codemeta","maintainers":[],"registry":{"name":"proxy.golang.org","url":"https://proxy.golang.org","ecosystem":"go","default":true,"packages_count":2118892,"maintainers_count":0,"namespaces_count":782439,"keywords_count":112823,"github":"golang","metadata":{"funded_packages_count":53495},"icon_url":"https://github.com/golang.png","created_at":"2022-04-04T15:19:22.939Z","updated_at":"2026-04-19T05:14:45.920Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/namespaces"}}],"commits":{"id":3373,"full_name":"rspec/rspec-mocks","default_branch":"main","total_commits":2218,"total_committers":190,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":11.673684210526316,"dds":0.7042380522993688,"past_year_total_commits":0,"past_year_total_committers":0,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":0.0,"past_year_dds":0.0,"last_synced_at":"2026-04-27T18:13:04.237Z","last_synced_commit":"3caa9ac841e146d618421f870077c0ad684e6cad","created_at":"2023-03-07T09:17:27.459Z","updated_at":"2026-04-27T18:04:36.283Z","committers":[{"name":"Myron Marston","email":"myron.marston@gmail.com","login":"myronmarston","count":656},{"name":"Jon Rowe","email":"hello@jonrowe.co.uk","login":"JonRowe","count":468},{"name":"David Chelimsky","email":"dchelimsky@gmail.com","login":"dchelimsky","count":407},{"name":"Sam Phippen","email":"samphippen@googlemail.com","login":null,"count":114},{"name":"Xavier Shay","email":"xavier@rhnh.net","login":"xaviershay","count":60},{"name":"Andy Lindeman","email":"alindeman@gmail.com","login":"alindeman","count":57},{"name":"Justin Ko","email":"jko170@gmail.com","login":"justinko","count":27},{"name":"Benoit Tigeot","email":"benoit@hopsandfork.com","login":"benoittgt","count":19},{"name":"Phil Pirozhkov","email":"hello@fili.pp.ru","login":"pirj","count":18},{"name":"Chad Humphries","email":"chad@spicycode.com","login":"spicycode","count":18},{"name":"Sidu Ponnappa","email":"ckponnappa@gmail.com","login":"kaiwren","count":17},{"name":"Joe Ferris","email":"jferris@thoughtbot.com","login":"jferris","count":15},{"name":"Aaron Kromer","email":"aaron.kromer@gmail.com","login":"cupakromer","count":11},{"name":"Guilherme Carvalho","email":"guilherme@guava.com.br","login":null,"count":10},{"name":"Yuji Nakayama","email":"nkymyj@gmail.com","login":"yujinakayama","count":10},{"name":"Michi Huber","email":"michi.huber@gmail.com","login":null,"count":10},{"name":"Yusuke Endoh","email":"mame@ruby-lang.org","login":"mame","count":9},{"name":"Bradley Schaefer","email":"bradley.schaefer@gmail.com","login":"soulcutter","count":6},{"name":"Mauricio Linhares","email":"mauricio.linhares@gmail.com","login":"mauricio","count":6},{"name":"Tjalling van der Wal","email":"tjalling@booqable.com","login":"tjallingvanderwal","count":6},{"name":"Kyle Smith","email":"kyle.smith@salsify.com","login":"askreet","count":6},{"name":"Olle Jonsson","email":"olle.jonsson@gmail.com","login":"olleolleolle","count":5},{"name":"Bryan Powell","email":"bryan@metabahn.com","login":"bryanp","count":5},{"name":"Alex Dowad","email":"alexinbeijing@gmail.com","login":"alexdowad","count":5},{"name":"Paul Annesley","email":"paul@annesley.cc","login":"pda","count":5},{"name":"Tim Wade","email":"tim@majority.co","login":null,"count":5},{"name":"preethiramdev","email":"preethiramdev@yahoo.com","login":"preethiramdev","count":5},{"name":"Josep M. Bach","email":"josep.m.bach@gmail.com","login":null,"count":5},{"name":"Siva Gollapalli","email":"siva@joshsoftware.com","login":null,"count":4},{"name":"Zhdanov","email":"evdev34@gmail.com","login":"zhisme","count":4},{"name":"Tim Cowlishaw","email":"tim@timcowlishaw.co.uk","login":"timcowlishaw","count":4},{"name":"Pete Higgins","email":"pete@peterhiggins.org","login":"phiggins","count":4},{"name":"Benoit Daloze","email":"eregontp@gmail.com","login":"eregon","count":4},{"name":"Eric Mueller","email":"nevinera@gmail.com","login":"nevinera","count":4},{"name":"Matijs van Zuijlen","email":"matijs@matijs.net","login":"mvz","count":4},{"name":"Adarsh Pandit","email":"adarsh@thoughtbot.com","login":null,"count":3},{"name":"Alex Egan","email":"alexander.egan@customink.com","login":null,"count":3},{"name":"Fabien Schurter","email":"fabien.schurter@gmail.com","login":null,"count":3},{"name":"Attila Domokos","email":"adomokos@gmail.com","login":"adomokos","count":3},{"name":"Cezary Baginski","email":"cezary@chronomantic.net","login":"e2","count":3},{"name":"Jess Hottenstein","email":"jess@splitwise.com","login":"jhottenstein","count":3},{"name":"John Ceh","email":"jceh@revspringinc.com","login":"johnceh","count":3},{"name":"Keegan Roth","email":"keegan.roth@lookout.com","login":"keegangroth","count":3},{"name":"Marc-Andre Lafortune","email":"github@marc-andre.ca","login":"marcandre","count":3},{"name":"Pat Allan","email":"pat@freelancing-gods.com","login":"pat","count":3},{"name":"Peter Goldstein","email":"peter.m.goldstein@gmail.com","login":"petergoldstein","count":3},{"name":"Oren Dobzinski","email":"oren@dobzinski.com","login":"orend","count":3},{"name":"Jean Boussier","email":"jean.boussier@gmail.com","login":"byroot","count":2},{"name":"Joe Rafaniello","email":"jrafanie@redhat.com","login":"jrafanie","count":2},{"name":"Maxim Krizhanovsky","email":"darhazer@gmail.com","login":"Darhazer","count":2},{"name":"Patrick Linnane","email":"patrick@linnane.io","login":"p-linnane","count":2},{"name":"Stuart Hicks","email":"stuarthicks","login":"stuarthicks","count":2},{"name":"Vinicius Horewicz","email":"vinicius@horewi.cz","login":"wicz","count":2},{"name":"aakash","email":"aakashd@gmail.com","login":"aakashd","count":2},{"name":"coreyhaines","email":"coreyhaines@gmail.com","login":"coreyhaines","count":2},{"name":"sanemat","email":"o.gata.ken@gmail.com","login":"sanemat","count":2},{"name":"Federico Ravasio","email":"ravasio.federico@gmail.com","login":"razielgn","count":2},{"name":"Carlos Palhares","email":"chjunior@gmail.com","login":"xjunior","count":2},{"name":"Bryce McDonnell","email":"bryce@bridgetownint.com","login":"brycemcd","count":2},{"name":"Ben Moss","email":"ben@mossity.com","login":"benmoss","count":2},{"name":"Ben Langfeld","email":"ben@langfeld.me","login":"benlangfeld","count":2},{"name":"Andrii Malyshko","email":"pleasesendmeaspam@gmail.com","login":"nashbridges","count":2},{"name":"Mik_Die","email":"MikDiet@gmail.com","login":"mikdiet","count":2},{"name":"Alex DeLaPena","email":"ajdlp12@gmail.com","login":"ajdlp","count":2},{"name":"Alessandro Berardi","email":"berardialessandro@gmail.com","login":"alxberardi","count":2},{"name":"Thomas Holmes","email":"thomas@devminded.com","login":null,"count":2},{"name":"Neha Kumari","email":"neha@c42.in","login":null,"count":2},{"name":"Liz Rush","email":"lizmrush@squareup.com","login":null,"count":2},{"name":"Jonathan del Strother","email":"jon.delStrother@audioboo.fm","login":null,"count":2},{"name":"Adam Steel","email":"adam.steel@stitchfix.com","login":null,"count":2},{"name":"ydah","email":"13041216+ydah","login":"ydah","count":2},{"name":"Jim Deville","email":"james.deville@gmail.com","login":"jredville","count":2},{"name":"Isaac Cambron","email":"icambron@alum.mit.edu","login":"icambron","count":2},{"name":"Arthur Nogueira Neves","email":"arthurnn@gmail.com","login":"arthurnn","count":1},{"name":"Cory Foy","email":"github@cornetdesign.com","login":"CoryFoy","count":1},{"name":"Alireza Bashiri","email":"azbshiri@gmail.com","login":null,"count":1},{"name":"Corey Ehmke and Michael Niessner","email":"pair+Bantik+niessner@niessner.us","login":null,"count":1},{"name":"Cezar Halmagean","email":"cezar@halmagean.ro","login":null,"count":1},{"name":"Daniel Orner","email":"daniel.orner@wishabi.com","login":null,"count":1},{"name":"David Chelimsky","email":"dchelimsky@drw.com","login":null,"count":1},{"name":"David Chelimsky, Chad Humphries and Corey Haines","email":"dchelimsky+pair@gmail.com","login":null,"count":1},{"name":"David Genord II","email":"david@xspond.com","login":null,"count":1},{"name":"David Rodríguez","email":"deivid.rodriguez@gmail.com","login":null,"count":1},{"name":"David S. Kang","email":"kangster@localhost","login":null,"count":1},{"name":"Igor Kapkov","email":"igasgeek@me.com","login":null,"count":1},{"name":"4r2r","email":"arthrrr@gmail.com","login":null,"count":1},{"name":"Jeff Weiss","email":"jeff.weiss@puppetlabs.com","login":null,"count":1},{"name":"Joe Ferris and Joël Quenneville","email":"support+jferris+jquenneville@thoughtbot.com","login":null,"count":1},{"name":"Melanie Gilman","email":"melanie@thoughtbot.com","login":null,"count":1},{"name":"Nathan Long","email":"nathan.long@tma1.com","login":null,"count":1},{"name":"Ryan Jones","email":"ryan@system88.com","login":null,"count":1},{"name":"Tom Schady","email":"tom.schady@raise.com","login":null,"count":1},{"name":"Tony Novak","email":"tony@amitree.com","login":null,"count":1},{"name":"Yorick Peterse","email":"yorickpeterse@gmail.com","login":null,"count":1},{"name":"maeve","email":"maeve.revels@g5platform.com","login":null,"count":1},{"name":"takiy33","email":"takiy33@gmail.com","login":null,"count":1},{"name":"Scott Taylor","email":"scott@railsnewbie.com","login":"smtlaissezfaire","count":1},{"name":"Saverio Miroddi","email":"saverio.pub2@gmail.com","login":"64kramsystem","count":1},{"name":"Samuel Giddins","email":"segiddins@segiddins.me","login":"segiddins","count":1},{"name":"Samnang Chhun","email":"samnang.chhun@gmail.com","login":"samnang","count":1},{"name":"Ryan Fitzgerald","email":"ryan.fitzgerald@brigade.com","login":"rf-","count":1},{"name":"Ryan Beckman","email":"beckman.ryan@gmail.com","login":"zaldabus","count":1},{"name":"Robert Goliasz","email":"r.goliasz@digital-science.com","login":"goblin","count":1},{"name":"René Föhring","email":"rf@bamaru.de","login":"rrrene","count":1},{"name":"Piotr Jakubowski","email":"piotrj@gmail.com","login":"piotrj","count":1},{"name":"Pavel Shpak","email":"shpakvel@gmail.com","login":"ShPakvel","count":1},{"name":"Pavel Pravosud","email":"pavel@pravosud.com","login":"rwz","count":1},{"name":"Patrik Wenger","email":"paddor@gmail.com","login":"paddor","count":1},{"name":"Patrick Ellis","email":"patrick@soundcloud.com","login":"pje","count":1},{"name":"Patrick Boatner","email":"patrickboatner@gmail.com","login":"locofocos","count":1},{"name":"Orien Madgwick","email":"_@orien.io","login":"orien","count":1},{"name":"Oliver Martell Núñez","email":"oliver.martell@gmail.com","login":"omartell","count":1},{"name":"Nobuyoshi Nakada","email":"nobu@ruby-lang.org","login":"nobu","count":1},{"name":"Nicolas Braem","email":"nicolas.braem@gmail.com","login":"nbraem","count":1},{"name":"Nicholas Rutherford","email":"nick.rutherford@gmail.com","login":"nruth","count":1},{"name":"Nicholas Henry","email":"nicholas.henry@gmail.com","login":"nicholasjhenry","count":1},{"name":"Michael Gee","email":"michaelpgee@gmail.com","login":"mikegee","count":1},{"name":"Martin Emde","email":"martin.emde@gmail.com","login":"martinemde","count":1},{"name":"Martijn Versluis","email":"martijnversluis","login":"martijnversluis","count":1},{"name":"Thomas Holmes","email":"thomas@holmes.io","login":"thomas-holmes","count":1},{"name":"vfrride","email":"jeff@jpcutler.net","login":"vfrride","count":1},{"name":"proby","email":"proby","login":"proby","count":1},{"name":"pjambet","email":"pierre.jambet@gmail.com","login":"pjambet","count":1},{"name":"mrageh","email":"adam@mrageh.com","login":"mrageh","count":1},{"name":"maxlinc","email":"mlincoln@thoughtworks.com","login":"maxlinc","count":1},{"name":"georgeu2000","email":"george@boost-media.com","login":"georgeu2000","count":1},{"name":"expeehaa","email":"expeehaa@outlook.com","login":"expeehaa","count":1},{"name":"daneget","email":"daniel.eguzkiza@gmail.com","login":"daneget","count":1},{"name":"dB","email":"dblock@dblock.org","login":"dblock","count":1},{"name":"Zhong Zheng","email":"Zhong-z","login":"Zhong-z","count":1},{"name":"Zane Wolfgang Pickett","email":"sirwolfgang","login":"sirwolfgang","count":1},{"name":"Uģis Ozols","email":"ugis.ozolss@gmail.com","login":"ugisozols","count":1},{"name":"Tom Ward","email":"tom@popdog.net","login":"tomafro","count":1},{"name":"Tom Stuart","email":"tom@experthuman.com","login":"tomstuart","count":1},{"name":"Tobias Bühlmann","email":"tobias.buehlmann@gmx.de","login":"tbuehlmann","count":1},{"name":"Tim Wade","email":"hello@timjwade.com","login":"imtayadeway","count":1},{"name":"Tibor Claassen","email":"tc@codebeige.net","login":"codebeige","count":1},{"name":"James Crisp","email":"james@crispdesign.net","login":"jcrisp","count":1},{"name":"Thomas Brand","email":"tom025@me.com","login":"tom025","count":1},{"name":"Steve Ognibene","email":"steve.ognibene@namely.com","login":"nycdotnet","count":1},{"name":"Stephen Best","email":"bestie@gmail.com","login":"bestie","count":1},{"name":"Sergiy Yarinovskiy","email":"serezha.km@gmail.com","login":"syarynovskyi","count":1},{"name":"Marc Ignacio","email":"marcrendlignacio@gmail.com","login":"padi","count":1},{"name":"Damian Nurzynski","email":"dnurzynski@gmail.com","login":"dnurzynski","count":1},{"name":"Craig Little","email":"craiglttl@gmail.com","login":"craiglittle","count":1},{"name":"Craig Buchek","email":"craig@boochtek.com","login":"booch","count":1},{"name":"Nick DeLuca","email":"nick@wescrimmage.com","login":"nddeluca","count":1},{"name":"Ashish Dixit","email":"tundal45@gmail.com","login":"tundal45","count":1},{"name":"Aubrey Rhodes","email":"aubrey.c.rhodes@gmail.com","login":"aubreyrhodes","count":1},{"name":"Bas Vodde","email":"basv@odd-e.com","login":"basvodde","count":1},{"name":"Benjamin Quorning","email":"bquorning","login":"bquorning","count":1},{"name":"Brad Trick","email":"76491823+brtrick","login":"brtrick","count":1},{"name":"Brandon Fish","email":"brandon.j.fish@oracle.com","login":"bjfish","count":1},{"name":"Brian John","email":"brian@brianjohn.com","login":"f1sherman","count":1},{"name":"Bruno Bonamin","email":"bruno@bonamin.org","login":"bbonamin","count":1},{"name":"Bryan Helmkamp","email":"bryan@brynary.com","login":"brynary","count":1},{"name":"Chris Griego","email":"cgriego@gmail.com","login":"cgriego","count":1},{"name":"Aaron Rosenberg","email":"agrberg","login":"agrberg","count":1},{"name":"Alex Tkachev","email":"tkachev.alex@gmail.com","login":"alextk","count":1},{"name":"Alexander Panasyuk","email":"panasmeister@gmail.com","login":"panasyuk","count":1},{"name":"Alyssa Ross","email":"hi@alyssa.is","login":"alyssais","count":1},{"name":"Anderson Dias","email":"andersondaraujo@gmail.com","login":"andersondias","count":1},{"name":"Andrew","email":"andrew@xtrasimplicity.com","login":"xtrasimplicity","count":1},{"name":"Andrew Kozin (aka nepalez)","email":"andrew.kozin@gmail.com","login":"nepalez","count":1},{"name":"Andrew Marshall","email":"andrew@johnandrewmarshall.com","login":"amarshall","count":1},{"name":"Andy Waite","email":"github.aw@andywaite.com","login":"andyw8","count":1},{"name":"Luís Costa","email":"luispcosta","login":"luispcosta","count":1},{"name":"Lachlan Sylvester","email":"lachlan.sylvester@hypothetical.com.au","login":"lsylvester","count":1},{"name":"Kivanio Barbosa","email":"kivanio@gmail.com","login":"kivanio","count":1},{"name":"Kilian Cirera Sant","email":"kilian@paradem.co","login":"kiliancs","count":1},{"name":"Kevin","email":"kcboschert","login":"kcboschert","count":1},{"name":"Kenichi Kamiya","email":"kachick1@gmail.com","login":"kachick","count":1},{"name":"Karthik T","email":"karthikt.holmes+github@gmail.com","login":"ktaragorn","count":1},{"name":"Justin Coyne","email":"justin@curationexperts.com","login":"jcoyne","count":1},{"name":"Juanito Fatas","email":"katehuang0320@gmail.com","login":"JuanitoFatas","count":1},{"name":"Jon Moss","email":"maclover7","login":"maclover7","count":1},{"name":"Jimmy Cuadra","email":"jimmy@jimmycuadra.com","login":"jimmycuadra","count":1},{"name":"Isaac Betesh","email":"iybetesh@gmail.com","login":"betesh","count":1},{"name":"Igor Drozdov","email":"ihardrozdov@gmail.com","login":"igor-drozdov","count":1},{"name":"Hans de Graaff","email":"hans@degraaff.org","login":"graaff","count":1},{"name":"Grant Hollingworth","email":"grant@antiflux.org","login":"granth","count":1},{"name":"Glauco Custódio","email":"glauco.custodio@gmail.com","login":"glaucocustodio","count":1},{"name":"Gioele Barabucci","email":"gioele@svario.it","login":"gioele","count":1},{"name":"Eugene Kenny","email":"eugene@intercom.io","login":"eugeneius","count":1},{"name":"Erik Behrends","email":"erik.behrends@gmail.com","login":"behrends","count":1},{"name":"Dillon Welch","email":"daw0328@gmail.com","login":"dillonwelch","count":1},{"name":"Diego Elio Pettenò","email":"flameeyes@gmail.com","login":"Flameeyes","count":1},{"name":"Dennis Taylor","email":"dennis.taylor@goclio.com","login":"fimmtiu","count":1},{"name":"Daniel Finnie","email":"dan@danfinnie.com","login":"danfinnie","count":1},{"name":"vanstee","email":"vanstee@highgroove.com","login":null,"count":1}],"past_year_committers":[],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-29T00:00:10.453Z","repositories_count":6222960,"commits_count":899897058,"contributors_count":34898218,"owners_count":1147501,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"rspec/rspec-mocks","html_url":"https://github.com/rspec/rspec-mocks","last_synced_at":"2025-12-30T08:04:29.540Z","status":"error","issues_count":89,"pull_requests_count":111,"avg_time_to_close_issue":77939141.11392406,"avg_time_to_close_pull_request":20407943.81081081,"issues_closed_count":79,"pull_requests_closed_count":111,"pull_request_authors_count":42,"issue_authors_count":86,"avg_comments_per_issue":6.348314606741573,"avg_comments_per_pull_request":2.6216216216216215,"merged_pull_requests_count":76,"bot_issues_count":0,"bot_pull_requests_count":1,"past_year_issues_count":6,"past_year_pull_requests_count":11,"past_year_avg_time_to_close_issue":1395643.6666666667,"past_year_avg_time_to_close_pull_request":1200050.5454545454,"past_year_issues_closed_count":6,"past_year_pull_requests_closed_count":11,"past_year_pull_request_authors_count":4,"past_year_issue_authors_count":6,"past_year_avg_comments_per_issue":2.8333333333333335,"past_year_avg_comments_per_pull_request":0.36363636363636365,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":9,"created_at":"2023-05-12T16:29:58.734Z","updated_at":"2025-12-30T08:04:29.540Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/rspec%2Frspec-mocks/issues","issue_labels_count":{"needs-reproduction":2,"Not a release blocker":1,"Release Blocker":1,"hacktoberfest":1,"small":1,"good-first-issue":1},"pull_request_labels_count":{"small":1},"issue_author_associations_count":{"NONE":77,"CONTRIBUTOR":8,"MEMBER":5},"pull_request_author_associations_count":{"MEMBER":93,"CONTRIBUTOR":27,"NONE":21},"issue_authors":{"marcotc":2,"jasonkarns":2,"myronmarston":2,"TonyCTHsu":1,"JonRowe":1,"graywolf-at-work":1,"64kramsystem":1,"tubaxenor":1,"suzukimilanpaak":1,"sergio-bobillier":1,"Loschcode":1,"andrykonchin":1,"dblock":1,"Resonious":1,"boardfish":1,"fidalgo":1,"chrisface":1,"voxik":1,"alextwoods":1,"brtrick":1,"keidax":1,"afn":1,"eaden-hnry":1,"jhottenstein":1,"palkan":1,"felipero":1,"AntoineBecquet":1,"ingobecker":1,"knewter":1,"skatenerd":1,"evankellogg":1,"dreyks":1,"illegalnumbers":1,"Geesu":1,"amandapouget":1,"drcapulet":1,"scotthain":1,"onlynone":1,"tomczak-mateusz":1,"exoego":1,"raoehtesham03":1,"sirwolfgang":1,"joshuap":1,"AlbertoTejada":1,"mvidner":1,"philnash":1,"VitaliiLazebnyi":1,"p-mongo":1,"raldred":1,"xaviershay":1,"cpetschnig":1,"imtayadeway":1,"postmodern":1,"alexevanczuk":1,"vibro":1,"manueljacob":1,"npearson72":1,"jcoyne":1,"gabehollombe":1,"krainboltgreene":1,"tatzsuzuki":1,"jvenezia":1,"istolpov":1,"nepalez":1,"vemv":1,"envygeeks":1,"aried3r":1,"ioquatix":1,"pedrocarmona":1,"jrochkind":1,"github0013":1,"GCorbel":1,"baweaver":1,"williamhakim10":1,"swrobel":1,"Bastes":1,"wuarmin":1,"dmytro-savochkin":1,"ric2b":1,"agrimm":1,"s101d1":1,"kinkou":1,"honigc":1,"leandro":1,"soulcutter":1,"schinery":1,"eLod":1},"pull_request_authors":{"JonRowe":72,"pirj":18,"p-linnane":2,"kaiwren":2,"onlynone":2,"nevinera":2,"Geesu":2,"ydah":2,"jamesdabbs-procore":2,"xjunior":2,"eregon":2,"nobu":2,"GCorbel":2,"tjallingvanderwal":2,"bjfish":1,"keegangroth":1,"godfat":1,"igor-drozdov":1,"benoittgt":1,"myronmarston":1,"adsteel":1,"ikaronen-relex":1,"honigc":1,"ro31337":1,"Takahashi-Riki":1,"fables-tales":1,"nashbridges":1,"martijnversluis":1,"kivanio":1,"C-Miles":1,"nycdotnet":1,"eLod":1,"petergoldstein":1,"lsylvester":1,"mame":1,"casperisfine":1,"olleolleolle":1,"ojab":1,"sirwolfgang":1,"jcoleman":1,"brtrick":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-27T00:00:06.950Z","repositories_count":14433560,"issues_count":34427983,"pull_requests_count":112679515,"authors_count":11247128,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{},"past_year_pull_request_author_associations_count":{},"past_year_issue_authors":{},"past_year_pull_request_authors":{},"maintainers":[{"login":"JonRowe","count":73,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/JonRowe"},{"login":"pirj","count":18,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/pirj"},{"login":"myronmarston","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/myronmarston"},{"login":"fables-tales","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/fables-tales"},{"login":"xaviershay","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/xaviershay"},{"login":"soulcutter","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/soulcutter"},{"login":"benoittgt","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/benoittgt"}],"active_maintainers":[]},"events":{"total":{"DeleteEvent":6,"PullRequestEvent":12,"ForkEvent":13,"IssuesEvent":28,"WatchEvent":9,"IssueCommentEvent":27,"PushEvent":10,"CreateEvent":1},"last_year":{"ForkEvent":2,"WatchEvent":2}},"keywords":["rspec","ruby"],"dependencies":[{"ecosystem":"rubygems","filepath":"Gemfile","sha":null,"kind":"manifest","created_at":"2022-07-20T06:47:15.983Z","updated_at":"2022-07-20T06:47:15.983Z","repository_link":"https://github.com/rspec/rspec-mocks/blob/main/Gemfile","dependencies":[{"id":297856347,"package_name":"rake","ecosystem":"rubygems","requirements":"\u003c 11.0.0","direct":true,"kind":"runtime","optional":false},{"id":297856348,"package_name":"rake","ecosystem":"rubygems","requirements":"\u003c 12.0.0","direct":true,"kind":"runtime","optional":false},{"id":297856349,"package_name":"rake","ecosystem":"rubygems","requirements":"\u003e 12.3.2","direct":true,"kind":"runtime","optional":false},{"id":297856350,"package_name":"diff-lcs","ecosystem":"rubygems","requirements":"~\u003e 1.4, \u003e= 1.4.3","direct":true,"kind":"runtime","optional":false},{"id":297856351,"package_name":"yard","ecosystem":"rubygems","requirements":"~\u003e 0.9.24","direct":true,"kind":"runtime","optional":false},{"id":297856352,"package_name":"rubocop","ecosystem":"rubygems","requirements":"~\u003e 1.0, \u003c 1.12","direct":true,"kind":"runtime","optional":false},{"id":297856353,"package_name":"ffi","ecosystem":"rubygems","requirements":"\u003c 1.10","direct":true,"kind":"runtime","optional":false},{"id":297856354,"package_name":"ffi","ecosystem":"rubygems","requirements":"\u003c 1.15","direct":true,"kind":"runtime","optional":false},{"id":297856355,"package_name":"ffi","ecosystem":"rubygems","requirements":"\u003c 1.9.19","direct":true,"kind":"runtime","optional":false},{"id":297856356,"package_name":"ffi","ecosystem":"rubygems","requirements":"\u003c 1.11.0","direct":true,"kind":"runtime","optional":false},{"id":297856357,"package_name":"ffi","ecosystem":"rubygems","requirements":"\u003e 1.9.24","direct":true,"kind":"runtime","optional":false},{"id":297856358,"package_name":"childprocess","ecosystem":"rubygems","requirements":"\u003c 1.0.0","direct":true,"kind":"runtime","optional":false},{"id":297856359,"package_name":"contracts","ecosystem":"rubygems","requirements":"~\u003e 0.15.0","direct":true,"kind":"runtime","optional":false},{"id":297856360,"package_name":"minitest","ecosystem":"rubygems","requirements":"\u003c 5.12.0","direct":true,"kind":"runtime","optional":false},{"id":297856361,"package_name":"thor","ecosystem":"rubygems","requirements":"\u003c 1.0.0","direct":true,"kind":"runtime","optional":false},{"id":297856362,"package_name":"thor","ecosystem":"rubygems","requirements":"\u003e 1.0.0","direct":true,"kind":"runtime","optional":false},{"id":297856363,"package_name":"redcarpet","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":297856364,"package_name":"github-markup","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":297856365,"package_name":"simplecov","ecosystem":"rubygems","requirements":"~\u003e 0.8","direct":true,"kind":"development","optional":false},{"id":297856366,"package_name":"json","ecosystem":"rubygems","requirements":"\u003c 2.0.0","direct":true,"kind":"runtime","optional":false},{"id":297856367,"package_name":"json","ecosystem":"rubygems","requirements":"\u003e 2.3.0","direct":true,"kind":"runtime","optional":false},{"id":297856368,"package_name":"cucumber","ecosystem":"rubygems","requirements":"\u003c= 1.3.22","direct":true,"kind":"runtime","optional":false},{"id":297856369,"package_name":"jruby-openssl","ecosystem":"rubygems","requirements":"\u003c 0.10.0","direct":true,"kind":"runtime","optional":false},{"id":297856370,"package_name":"jruby-openssl","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"rubygems","filepath":"rspec-mocks.gemspec","sha":null,"kind":"manifest","created_at":"2022-07-20T06:47:16.077Z","updated_at":"2022-07-20T06:47:16.077Z","repository_link":"https://github.com/rspec/rspec-mocks/blob/main/rspec-mocks.gemspec","dependencies":[{"id":297856417,"package_name":"diff-lcs","ecosystem":"rubygems","requirements":"\u003e= 1.2.0, \u003c 2.0","direct":true,"kind":"runtime","optional":false},{"id":297856418,"package_name":"rake","ecosystem":"rubygems","requirements":"\u003e 10.0.0","direct":true,"kind":"development","optional":false},{"id":297856419,"package_name":"cucumber","ecosystem":"rubygems","requirements":"\u003e= 1.3","direct":true,"kind":"development","optional":false},{"id":297856420,"package_name":"aruba","ecosystem":"rubygems","requirements":"~\u003e 0.14.10","direct":true,"kind":"development","optional":false},{"id":297856421,"package_name":"minitest","ecosystem":"rubygems","requirements":"~\u003e 5.2","direct":true,"kind":"development","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/ci.yml","sha":null,"kind":"manifest","created_at":"2023-01-13T10:31:13.368Z","updated_at":"2023-01-13T10:31:13.368Z","repository_link":"https://github.com/rspec/rspec-mocks/blob/main/.github/workflows/ci.yml","dependencies":[{"id":6875550283,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":6875550284,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"v1","direct":true,"kind":"composite","optional":false}]}],"score":null,"created_at":"2024-12-15T21:38:06.933Z","updated_at":"2026-04-29T19:02:36.915Z","avatar_url":"https://github.com/rspec.png","language":"Ruby","monthly_downloads":0,"readme":"# RSpec Mocks [![Build Status](https://github.com/rspec/rspec-mocks/workflows/RSpec%20CI/badge.svg)](https://github.com/rspec/rspec-mocks/actions) [![Code Climate](https://codeclimate.com/github/rspec/rspec-mocks.svg)](https://codeclimate.com/github/rspec/rspec-mocks)\nrspec-mocks is a test-double framework for rspec with support for method stubs,\nfakes, and message expectations on generated test-doubles and real objects\nalike.\n\n**This is the old rspec mocks repository, please see the monorepo rspec/rspec for new issues and releases.**\n\n## Install\n\n    gem install rspec       # for rspec-core, rspec-expectations, rspec-mocks\n    gem install rspec-mocks # for rspec-mocks only\n\nWant to run against the `main` branch? You'll need to include the dependent\nRSpec repos as well. Add the following to your `Gemfile`:\n\n```ruby\n%w[rspec-core rspec-expectations rspec-mocks rspec-support].each do |lib|\n  gem lib, :git =\u003e \"https://github.com/rspec/#{lib}.git\", :branch =\u003e 'main'\nend\n```\n## Contributing\n\nOnce you've set up the environment, you'll need to cd into the working\ndirectory of whichever repo you want to work in. From there you can run the\nspecs and cucumber features, and make patches.\n\nNOTE: You do not need to use rspec-dev to work on a specific RSpec repo. You\ncan treat each RSpec repo as an independent project.\n\nFor information about contributing to RSpec, please refer to the following markdown files:\n* [Build details](BUILD_DETAIL.md)\n* [Code of Conduct](CODE_OF_CONDUCT.md)\n* [Detailed contributing guide](CONTRIBUTING.md)\n* [Development setup guide](DEVELOPMENT.md)\n\n## Test Doubles\n\nA test double is an object that stands in for another object in your system\nduring a code example. Use the `double` method, passing in an optional identifier, to create one:\n\n```ruby\nbook = double(\"book\")\n```\n\nMost of the time you will want some confidence that your doubles resemble an\nexisting object in your system. Verifying doubles are provided for this\npurpose. If the existing object is available, they will prevent you from adding\nstubs and expectations for methods that do not exist or that have an invalid\nnumber of parameters.\n\n```ruby\nbook = instance_double(\"Book\", :pages =\u003e 250)\n```\n\nVerifying doubles have some clever tricks to enable you to both test in\nisolation without your dependencies loaded while still being able to validate\nthem against real objects. More detail is available in [their\ndocumentation](https://github.com/rspec/rspec-mocks/blob/main/features/verifying_doubles).\n\nVerifying doubles can also accept custom identifiers, just like double(), e.g.:\n\n```ruby\nbooks = []\nbooks \u003c\u003c instance_double(\"Book\", :rspec_book, :pages =\u003e 250)\nbooks \u003c\u003c instance_double(\"Book\", \"(Untitled)\", :pages =\u003e 5000)\n\nputs books.inspect # with names, it's clearer which were actually added\n```\n\n## Method Stubs\n\nA method stub is an implementation that returns a pre-determined value.  Method\nstubs can be declared on test doubles or real objects using the same syntax.\nrspec-mocks supports 3 forms for declaring method stubs:\n\n```ruby\nallow(book).to receive(:title) { \"The RSpec Book\" }\nallow(book).to receive(:title).and_return(\"The RSpec Book\")\nallow(book).to receive_messages(\n    :title =\u003e \"The RSpec Book\",\n    :subtitle =\u003e \"Behaviour-Driven Development with RSpec, Cucumber, and Friends\")\n```\n\nYou can also use this shortcut, which creates a test double and declares a\nmethod stub in one statement:\n\n```ruby\nbook = double(\"book\", :title =\u003e \"The RSpec Book\")\n```\n\nThe first argument is a name, which is used for documentation and appears in\nfailure messages. If you don't care about the name, you can leave it out,\nmaking the combined instantiation/stub declaration very terse:\n\n```ruby\ndouble(:foo =\u003e 'bar')\n```\n\nThis is particularly nice when providing a list of test doubles to a method\nthat iterates through them:\n\n```ruby\norder.calculate_total_price(double(:price =\u003e 1.99), double(:price =\u003e 2.99))\n```\n\n### Stubbing a chain of methods\n\nYou can use `receive_message_chain` in place of `receive` to stub a chain of messages:\n\n```ruby\nallow(double).to receive_message_chain(\"foo.bar\") { :baz }\nallow(double).to receive_message_chain(:foo, :bar =\u003e :baz)\nallow(double).to receive_message_chain(:foo, :bar) { :baz }\n\n# Given any of the above forms:\ndouble.foo.bar # =\u003e :baz\n```\n\nChains can be arbitrarily long, which makes it quite painless to violate the Law of Demeter in violent ways, so you should consider any use of `receive_message_chain` a code smell. Even though not all code smells indicate real problems (think fluent interfaces), `receive_message_chain` still results in brittle examples. For example, if you write `allow(foo).to receive_message_chain(:bar, :baz =\u003e 37)` in a spec and then the implementation calls `foo.baz.bar`, the stub will not work.\n\n## Consecutive return values\n\nWhen a stub might be invoked more than once, you can provide additional\narguments to `and_return`.  The invocations cycle through the list. The last\nvalue is returned for any subsequent invocations:\n\n```ruby\nallow(die).to receive(:roll).and_return(1, 2, 3)\ndie.roll # =\u003e 1\ndie.roll # =\u003e 2\ndie.roll # =\u003e 3\ndie.roll # =\u003e 3\ndie.roll # =\u003e 3\n```\n\nTo return an array in a single invocation, declare an array:\n\n```ruby\nallow(team).to receive(:players).and_return([double(:name =\u003e \"David\")])\n```\n\n## Message Expectations\n\nA message expectation is an expectation that the test double will receive a\nmessage some time before the example ends. If the message is received, the\nexpectation is satisfied. If not, the example fails.\n\n```ruby\nvalidator = double(\"validator\")\nexpect(validator).to receive(:validate) { \"02134\" }\nzipcode = Zipcode.new(\"02134\", validator)\nzipcode.valid?\n```\n\n## Test Spies\n\nVerifies the given object received the expected message during the course of\nthe test. For a message to be verified, the given object must be setup to spy\non it, either by having it explicitly stubbed or by being a null object double\n(e.g. `double(...).as_null_object`). Convenience methods are provided to easily\ncreate null object doubles for this purpose:\n\n```ruby\nspy(\"invitation\") # =\u003e same as `double(\"invitation\").as_null_object`\ninstance_spy(\"Invitation\") # =\u003e same as `instance_double(\"Invitation\").as_null_object`\nclass_spy(\"Invitation\") # =\u003e same as `class_double(\"Invitation\").as_null_object`\nobject_spy(\"Invitation\") # =\u003e same as `object_double(\"Invitation\").as_null_object`\n```\n\nVerifying messages received in this way implements the Test Spy pattern.\n\n```ruby\ninvitation = spy('invitation')\n\nuser.accept_invitation(invitation)\n\nexpect(invitation).to have_received(:accept)\n\n# You can also use other common message expectations. For example:\nexpect(invitation).to have_received(:accept).with(mailer)\nexpect(invitation).to have_received(:accept).twice\nexpect(invitation).to_not have_received(:accept).with(mailer)\n\n# One can specify a return value on the spy the same way one would a double.\ninvitation = spy('invitation', :accept =\u003e true)\nexpect(invitation).to have_received(:accept).with(mailer)\nexpect(invitation.accept).to eq(true)\n```\n\nNote that `have_received(...).with(...)` is unable to work properly when\npassed arguments are mutated after the spy records the received message.\nFor example, this does not work properly:\n\n```ruby\ngreeter = spy(\"greeter\")\n\nmessage = \"Hello\"\ngreeter.greet_with(message)\nmessage \u003c\u003c \", World\"\n\nexpect(greeter).to have_received(:greet_with).with(\"Hello\")\n```\n\n## Nomenclature\n\n### Mock Objects and Test Stubs\n\nThe names Mock Object and Test Stub suggest specialized Test Doubles.  i.e.\na Test Stub is a Test Double that only supports method stubs, and a Mock\nObject is a Test Double that supports message expectations and method\nstubs.\n\nThere is a lot of overlapping nomenclature here, and there are many\nvariations of these patterns (fakes, spies, etc). Keep in mind that most of\nthe time we're talking about method-level concepts that are variations of\nmethod stubs and message expectations, and we're applying to them to _one_\ngeneric kind of object: a Test Double.\n\n### Test-Specific Extension\n\na.k.a. Partial Double, a Test-Specific Extension is an extension of a\nreal object in a system that is instrumented with test-double like\nbehaviour in the context of a test. This technique is very common in Ruby\nbecause we often see class objects acting as global namespaces for methods.\nFor example, in Rails:\n\n```ruby\nperson = double(\"person\")\nallow(Person).to receive(:find) { person }\n```\n\nIn this case we're instrumenting Person to return the person object we've\ndefined whenever it receives the `find` message. We can also set a message\nexpectation so that the example fails if `find` is not called:\n\n```ruby\nperson = double(\"person\")\nexpect(Person).to receive(:find) { person }\n```\n\nRSpec replaces the method we're stubbing or mocking with its own\ntest-double-like method. At the end of the example, RSpec verifies any message\nexpectations, and then restores the original methods.\n\n## Expecting Arguments\n\n```ruby\nexpect(double).to receive(:msg).with(*args)\nexpect(double).to_not receive(:msg).with(*args)\n```\n\nYou can set multiple expectations for the same message if you need to:\n\n```ruby\nexpect(double).to receive(:msg).with(\"A\", 1, 3)\nexpect(double).to receive(:msg).with(\"B\", 2, 4)\n```\n\n## Argument Matchers\n\nArguments that are passed to `with` are compared with actual arguments\nreceived using ===. In cases in which you want to specify things about the\narguments rather than the arguments themselves, you can use any of the\nmatchers that ship with rspec-expectations. They don't all make syntactic\nsense (they were primarily designed for use with RSpec::Expectations), but\nyou are free to create your own custom RSpec::Matchers.\n\nrspec-mocks also adds some keyword Symbols that you can use to\nspecify certain kinds of arguments:\n\n```ruby\nexpect(double).to receive(:msg).with(no_args)\nexpect(double).to receive(:msg).with(any_args)\nexpect(double).to receive(:msg).with(1, any_args) # any args acts like an arg splat and can go anywhere\nexpect(double).to receive(:msg).with(1, kind_of(Numeric), \"b\") #2nd argument can be any kind of Numeric\nexpect(double).to receive(:msg).with(1, boolean(), \"b\") #2nd argument can be true or false\nexpect(double).to receive(:msg).with(1, /abc/, \"b\") #2nd argument can be any String matching the submitted Regexp\nexpect(double).to receive(:msg).with(1, anything(), \"b\") #2nd argument can be anything at all\nexpect(double).to receive(:msg).with(1, duck_type(:abs, :div), \"b\") #2nd argument can be object that responds to #abs and #div\nexpect(double).to receive(:msg).with(hash_including(:a =\u003e 5)) # first arg is a hash with a: 5 as one of the key-values\nexpect(double).to receive(:msg).with(array_including(5)) # first arg is an array with 5 as one of the key-values\nexpect(double).to receive(:msg).with(hash_excluding(:a =\u003e 5)) # first arg is a hash without a: 5 as one of the key-values\nexpect(double).to receive(:msg).with(start_with('a')) # any matcher, custom or from rspec-expectations\nexpect(double).to receive(:msg).with(satisfy { |data| data.dig(:a, :b, :c) == 5 }) # assert anything you want\n```\n\n## Receive Counts\n\n```ruby\nexpect(double).to receive(:msg).once\nexpect(double).to receive(:msg).twice\nexpect(double).to receive(:msg).exactly(n).time\nexpect(double).to receive(:msg).exactly(n).times\nexpect(double).to receive(:msg).at_least(:once)\nexpect(double).to receive(:msg).at_least(:twice)\nexpect(double).to receive(:msg).at_least(n).time\nexpect(double).to receive(:msg).at_least(n).times\nexpect(double).to receive(:msg).at_most(:once)\nexpect(double).to receive(:msg).at_most(:twice)\nexpect(double).to receive(:msg).at_most(n).time\nexpect(double).to receive(:msg).at_most(n).times\n```\n\n## Ordering\n\n```ruby\nexpect(double).to receive(:msg).ordered\nexpect(double).to receive(:other_msg).ordered\n  # This will fail if the messages are received out of order\n```\n\nThis can include the same message with different arguments:\n\n```ruby\nexpect(double).to receive(:msg).with(\"A\", 1, 3).ordered\nexpect(double).to receive(:msg).with(\"B\", 2, 4).ordered\n```\n\n## Setting Responses\n\nWhether you are setting a message expectation or a method stub, you can\ntell the object precisely how to respond. The most generic way is to pass\na block to `receive`:\n\n```ruby\nexpect(double).to receive(:msg) { value }\n```\n\nWhen the double receives the `msg` message, it evaluates the block and returns\nthe result.\n\n```ruby\nexpect(double).to receive(:msg).and_return(value)\nexpect(double).to receive(:msg).exactly(3).times.and_return(value1, value2, value3)\n  # returns value1 the first time, value2 the second, etc\nexpect(double).to receive(:msg).and_raise(error)\n  # `error` can be an instantiated object (e.g. `StandardError.new(some_arg)`) or a class (e.g. `StandardError`)\n  # if it is a class, it must be instantiable with no args\nexpect(double).to receive(:msg).and_throw(:msg)\nexpect(double).to receive(:msg).and_yield(values, to, yield)\nexpect(double).to receive(:msg).and_yield(values, to, yield).and_yield(some, other, values, this, time)\n  # for methods that yield to a block multiple times\n```\n\nAny of these responses can be applied to a stub as well\n\n```ruby\nallow(double).to receive(:msg).and_return(value)\nallow(double).to receive(:msg).and_return(value1, value2, value3)\nallow(double).to receive(:msg).and_raise(error)\nallow(double).to receive(:msg).and_throw(:msg)\nallow(double).to receive(:msg).and_yield(values, to, yield)\nallow(double).to receive(:msg).and_yield(values, to, yield).and_yield(some, other, values, this, time)\n```\n\n## Arbitrary Handling\n\nOnce in a while you'll find that the available expectations don't solve the\nparticular problem you are trying to solve. Imagine that you expect the message\nto come with an Array argument that has a specific length, but you don't care\nwhat is in it. You could do this:\n\n```ruby\nexpect(double).to receive(:msg) do |arg|\n  expect(arg.size).to eq 7\nend\n```\n\nIf the method being stubbed itself takes a block, and you need to yield to it\nin some special way, you can use this:\n\n```ruby\nexpect(double).to receive(:msg) do |\u0026arg|\n  begin\n    arg.call\n  ensure\n    # cleanup\n  end\nend\n```\n\n## Delegating to the Original Implementation\n\nWhen working with a partial mock object, you may occasionally\nwant to set a message expectation without interfering with how\nthe object responds to the message. You can use `and_call_original`\nto achieve this:\n\n```ruby\nexpect(Person).to receive(:find).and_call_original\nPerson.find # =\u003e executes the original find method and returns the result\n```\n\n## Combining Expectation Details\n\nCombining the message name with specific arguments, receive counts and responses\nyou can get quite a bit of detail in your expectations:\n\n```ruby\nexpect(double).to receive(:\u003c\u003c).with(\"illegal value\").once.and_raise(ArgumentError)\n```\n\nWhile this is a good thing when you really need it, you probably don't really\nneed it! Take care to specify only the things that matter to the behavior of\nyour code.\n\n## Stubbing and Hiding Constants\n\nSee the [mutating constants\nREADME](https://github.com/rspec/rspec-mocks/blob/main/features/mutating_constants/README.md)\nfor info on this feature.\n\n## Use `before(:example)`, not `before(:context)`\n\nStubs in `before(:context)` are not supported. The reason is that all stubs and mocks get cleared out after each example, so any stub that is set in `before(:context)` would work in the first example that happens to run in that group, but not for any others.\n\nInstead of `before(:context)`, use `before(:example)`.\n\n## Settings mocks or stubs on any instance of a class\n\nrspec-mocks provides two methods, `allow_any_instance_of` and\n`expect_any_instance_of`, that will allow you to stub or mock any instance\nof a class. They are used in place of `allow` or `expect`:\n\n```ruby\nallow_any_instance_of(Widget).to receive(:name).and_return(\"Wibble\")\nexpect_any_instance_of(Widget).to receive(:name).and_return(\"Wobble\")\n```\n\nThese methods add the appropriate stub or expectation to all instances of\n`Widget`.\n\nThis feature is sometimes useful when working with legacy code, though in\ngeneral we discourage its use for a number of reasons:\n\n* The `rspec-mocks` API is designed for individual object instances, but this\n  feature operates on entire classes of objects. As a result there are some\n  semantically confusing edge cases. For example in\n  `expect_any_instance_of(Widget).to receive(:name).twice` it isn't clear\n  whether each specific instance is expected to receive `name` twice, or if two\n  receives total are expected. (It's the former.)\n* Using this feature is often a design smell. It may be\n  that your test is trying to do too much or that the object under test is too\n  complex.\n* It is the most complicated feature of `rspec-mocks`, and has historically\n  received the most bug reports. (None of the core team actively use it,\n  which doesn't help.)\n\n\n## Further Reading\n\nThere are many different viewpoints about the meaning of mocks and stubs. If\nyou are interested in learning more, here is some recommended reading:\n\n* Mock Objects: http://www.mockobjects.com/\n* Endo-Testing: http://www.ccs.neu.edu/research/demeter/related-work/extreme-programming/MockObjectsFinal.PDF\n* Mock Roles, Not Objects: http://www.jmock.org/oopsla2004.pdf\n* Test Double: http://www.martinfowler.com/bliki/TestDouble.html\n* Test Double Patterns: http://xunitpatterns.com/Test%20Double%20Patterns.html\n* Mocks aren't stubs: http://www.martinfowler.com/articles/mocksArentStubs.html\n\n## Also see\n\n* [https://github.com/rspec/rspec](https://github.com/rspec/rspec)\n* [https://github.com/rspec/rspec-core](https://github.com/rspec/rspec-core)\n* [https://github.com/rspec/rspec-expectations](https://github.com/rspec/rspec-expectations)\n* [https://github.com/rspec/rspec-rails](https://github.com/rspec/rspec-rails)\n","funding_links":["https://github.com/sponsors/JonRowe","https://github.com/sponsors/benoittgt","https://opencollective.com/rspec"],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["activerecord","activejob","mvc","rubygems","rack","rubocop","code-formatter","static-code-analysis","sinatra","grape"],"project_url":"https://ruby.ecosyste.ms/api/v1/projects/78","html_url":"https://ruby.ecosyste.ms/projects/78"}