{"id":242,"name":null,"description":"Validation library with type-safe schemas and rules","url":"https://github.com/dry-rb/dry-validation","last_synced_at":"2026-06-15T16:30:18.245Z","repository":{"id":35271985,"uuid":"39532631","full_name":"dry-rb/dry-validation","owner":"dry-rb","description":"Validation library with type-safe schemas and rules","archived":false,"fork":false,"pushed_at":"2026-05-10T05:19:56.000Z","size":2390,"stargazers_count":1422,"open_issues_count":27,"forks_count":193,"subscribers_count":29,"default_branch":"main","last_synced_at":"2026-06-12T15:03:51.982Z","etag":null,"topics":["coercion","data-validation","dry-rb","gem","ruby","rubygem","type-safety","validation"],"latest_commit_sha":null,"homepage":"https://dry-rb.org/gems/dry-validation","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/dry-rb.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":".github/SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"hanami"}},"created_at":"2015-07-22T22:05:39.000Z","updated_at":"2026-06-10T05:10:28.000Z","dependencies_parsed_at":"2026-03-18T21:01:38.334Z","dependency_job_id":null,"html_url":"https://github.com/dry-rb/dry-validation","commit_stats":{"total_commits":1720,"total_committers":84,"mean_commits":"20.476190476190474","dds":"0.42906976744186043","last_synced_commit":"7c10d83206bde67dc147e2232eb0c4d0956e6d00"},"previous_names":[],"tags_count":72,"template":false,"template_full_name":null,"purl":"pkg:github/dry-rb/dry-validation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-rb","download_url":"https://codeload.github.com/dry-rb/dry-validation/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/sbom","scorecard":{"id":357240,"data":{"date":"2025-08-11","repo":{"name":"github.com/dry-rb/dry-validation","commit":"1939ad09fa5b8c91952f3909239ca4d7d8c4deca"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"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":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Warn: no topLevel permission defined: .github/workflows/docsite.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/rubocop.yml:10","Warn: no topLevel permission defined: .github/workflows/sync_configs.yml:1","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":"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":"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":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:60: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docsite.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/docsite.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docsite.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/docsite.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rubocop.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/rubocop.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rubocop.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/rubocop.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/sync_configs.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/sync_configs.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/sync_configs.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/sync_configs.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/sync_configs.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/sync_configs.yml/main?enable=pin","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 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":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"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"}}]},"last_synced_at":"2025-08-18T09:54:30.079Z","repository_id":35271985,"created_at":"2025-08-18T09:54:30.079Z","updated_at":"2025-08-18T09:54:30.079Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34290393,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-13T02:00:06.617Z","response_time":62,"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":{"login":"dry-rb","name":"dry-rb","uuid":"11280820","kind":"organization","description":"dry-rb is a collection of next-generation Ruby libraries, each intended to encapsulate a common task","email":null,"website":"https://dry-rb.org","location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/11280820?v=4","repositories_count":40,"last_synced_at":"2024-03-25T21:11:49.208Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/dry-rb","funding_links":[],"total_stars":8147,"followers":272,"following":0,"created_at":"2022-11-02T16:40:56.529Z","updated_at":"2024-03-25T21:11:50.787Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-rb","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-rb/repositories"},"packages":[{"id":10377779,"name":"github.com/dry-rb/dry-validation","ecosystem":"go","description":null,"homepage":null,"licenses":"mit","normalized_licenses":["MIT"],"repository_url":"https://github.com/dry-rb/dry-validation","keywords_array":[],"namespace":null,"versions_count":65,"first_release_published_at":"2015-11-25T18:25:23.000Z","latest_release_published_at":"2025-01-21T11:41:49.000Z","latest_release_number":"v1.11.1","last_synced_at":"2026-06-12T15:17:00.114Z","created_at":"2024-06-16T05:21:13.461Z","updated_at":"2026-06-12T15:17:00.115Z","registry_url":"https://pkg.go.dev/github.com/dry-rb/dry-validation","install_command":"go get github.com/dry-rb/dry-validation","documentation_url":"https://pkg.go.dev/github.com/dry-rb/dry-validation#section-documentation","metadata":{},"repo_metadata":{"id":35271985,"uuid":"39532631","full_name":"dry-rb/dry-validation","owner":"dry-rb","description":"Validation library with type-safe schemas and rules","archived":false,"fork":false,"pushed_at":"2025-03-19T17:21:40.000Z","size":2418,"stargazers_count":1382,"open_issues_count":25,"forks_count":190,"subscribers_count":32,"default_branch":"main","last_synced_at":"2025-09-22T06:06:22.285Z","etag":null,"topics":["coercion","data-validation","dry-rb","gem","ruby","rubygem","type-safety","validation"],"latest_commit_sha":null,"homepage":"https://dry-rb.org/gems/dry-validation","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/dry-rb.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":".github/SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"hanami"}},"created_at":"2015-07-22T22:05:39.000Z","updated_at":"2025-09-16T12:43:52.000Z","dependencies_parsed_at":"2024-01-08T07:55:14.224Z","dependency_job_id":"3294391a-f8c4-4bc5-aa36-faeda806f771","html_url":"https://github.com/dry-rb/dry-validation","commit_stats":{"total_commits":1720,"total_committers":84,"mean_commits":"20.476190476190474","dds":"0.42906976744186043","last_synced_commit":"7c10d83206bde67dc147e2232eb0c4d0956e6d00"},"previous_names":[],"tags_count":72,"template":false,"template_full_name":null,"purl":"pkg:github/dry-rb/dry-validation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-rb","download_url":"https://codeload.github.com/dry-rb/dry-validation/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/sbom","scorecard":{"id":357240,"data":{"date":"2025-08-11","repo":{"name":"github.com/dry-rb/dry-validation","commit":"1939ad09fa5b8c91952f3909239ca4d7d8c4deca"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"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":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Warn: no topLevel permission defined: .github/workflows/docsite.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/rubocop.yml:10","Warn: no topLevel permission defined: .github/workflows/sync_configs.yml:1","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":"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":"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":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:60: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docsite.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/docsite.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docsite.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/docsite.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rubocop.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/rubocop.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rubocop.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/rubocop.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/sync_configs.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/sync_configs.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/sync_configs.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/sync_configs.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/sync_configs.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/sync_configs.yml/main?enable=pin","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 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":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"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"}}]},"last_synced_at":"2025-08-18T09:54:30.079Z","repository_id":35271985,"created_at":"2025-08-18T09:54:30.079Z","updated_at":"2025-08-18T09:54:30.079Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276707592,"owners_count":25690054,"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-09-24T02:00:09.776Z","response_time":97,"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":"dry-rb","name":"dry-rb","uuid":"11280820","kind":"organization","description":"dry-rb is a collection of next-generation Ruby libraries, each intended to encapsulate a common task","email":null,"website":"https://dry-rb.org","location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/11280820?v=4","repositories_count":40,"last_synced_at":"2024-03-25T21:11:49.208Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/dry-rb","funding_links":[],"total_stars":8147,"followers":272,"following":0,"created_at":"2022-11-02T16:40:56.529Z","updated_at":"2024-03-25T21:11:50.787Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-rb","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-rb/repositories"},"tags":[]},"repo_metadata_updated_at":"2025-11-04T03:08:53.986Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":6.9445469250160885,"dependent_packages_count":6.5076054129418095,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":6.726076168978949},"purl":"pkg:golang/github.com/dry-rb/dry-validation","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/go/github.com/dry-rb/dry-validation","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/go/github.com/dry-rb/dry-validation","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/go/github.com/dry-rb/dry-validation/dependencies","status":null,"funding_links":["https://github.com/sponsors/hanami"],"critical":null,"issue_metadata":{"last_synced_at":"2025-08-31T19:38:46.858Z","issues_count":66,"pull_requests_count":46,"avg_time_to_close_issue":6996499.431818182,"avg_time_to_close_pull_request":1304375.2391304348,"issues_closed_count":44,"pull_requests_closed_count":46,"pull_request_authors_count":32,"issue_authors_count":59,"avg_comments_per_issue":3.5454545454545454,"avg_comments_per_pull_request":1.934782608695652,"merged_pull_requests_count":38,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":4,"past_year_pull_requests_count":1,"past_year_avg_time_to_close_issue":66587.66666666667,"past_year_avg_time_to_close_pull_request":495860.0,"past_year_issues_closed_count":3,"past_year_pull_requests_closed_count":1,"past_year_pull_request_authors_count":1,"past_year_issue_authors_count":3,"past_year_avg_comments_per_issue":2.0,"past_year_avg_comments_per_pull_request":2.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/issues","maintainers":[{"login":"solnic","count":9,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/solnic"},{"login":"timriley","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/timriley"},{"login":"flash-gordon","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/flash-gordon"},{"login":"mereghost","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/mereghost"},{"login":"jodosha","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/jodosha"},{"login":"ianwhite","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/ianwhite"}],"active_maintainers":[]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fdry-rb%2Fdry-validation/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fdry-rb%2Fdry-validation/version_numbers","latest_version_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fdry-rb%2Fdry-validation/latest_version","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fdry-rb%2Fdry-validation/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fdry-rb%2Fdry-validation/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fdry-rb%2Fdry-validation/codemeta","maintainers":[],"registry":{"name":"proxy.golang.org","url":"https://proxy.golang.org","ecosystem":"go","default":true,"packages_count":2169848,"maintainers_count":0,"namespaces_count":792747,"keywords_count":113213,"github":"golang","metadata":{"funded_packages_count":53976},"icon_url":"https://github.com/golang.png","created_at":"2022-04-04T15:19:22.939Z","updated_at":"2026-06-10T05:03:23.672Z","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"}},{"id":12217473,"name":"dry-validation","ecosystem":"rubygems","description":"Validation library","homepage":"https://dry-rb.org/gems/dry-validation","licenses":"MIT","normalized_licenses":["MIT"],"repository_url":"https://github.com/dry-rb/dry-validation","keywords_array":[],"namespace":null,"versions_count":70,"first_release_published_at":"2015-11-25T18:27:22.082Z","latest_release_published_at":"2025-01-21T11:43:42.972Z","latest_release_number":"1.11.1","last_synced_at":"2026-06-13T16:01:38.623Z","created_at":"2025-10-07T02:34:28.917Z","updated_at":"2026-06-13T16:05:59.387Z","registry_url":"https://gem.coop/gems/dry-validation","install_command":"gem install dry-validation -s https://gem.coop","documentation_url":"http://www.rubydoc.info/gems/dry-validation/","metadata":{"funding":null},"repo_metadata":{"id":35271985,"uuid":"39532631","full_name":"dry-rb/dry-validation","owner":"dry-rb","description":"Validation library with type-safe schemas and rules","archived":false,"fork":false,"pushed_at":"2026-05-10T05:19:56.000Z","size":2390,"stargazers_count":1422,"open_issues_count":27,"forks_count":193,"subscribers_count":29,"default_branch":"main","last_synced_at":"2026-06-12T15:03:51.982Z","etag":null,"topics":["coercion","data-validation","dry-rb","gem","ruby","rubygem","type-safety","validation"],"latest_commit_sha":null,"homepage":"https://dry-rb.org/gems/dry-validation","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/dry-rb.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":".github/SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"hanami"}},"created_at":"2015-07-22T22:05:39.000Z","updated_at":"2026-06-10T05:10:28.000Z","dependencies_parsed_at":"2026-03-18T21:01:38.334Z","dependency_job_id":null,"html_url":"https://github.com/dry-rb/dry-validation","commit_stats":{"total_commits":1720,"total_committers":84,"mean_commits":"20.476190476190474","dds":"0.42906976744186043","last_synced_commit":"7c10d83206bde67dc147e2232eb0c4d0956e6d00"},"previous_names":[],"tags_count":72,"template":false,"template_full_name":null,"purl":"pkg:github/dry-rb/dry-validation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-rb","download_url":"https://codeload.github.com/dry-rb/dry-validation/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/sbom","scorecard":{"id":357240,"data":{"date":"2025-08-11","repo":{"name":"github.com/dry-rb/dry-validation","commit":"1939ad09fa5b8c91952f3909239ca4d7d8c4deca"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"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":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Warn: no topLevel permission defined: .github/workflows/docsite.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/rubocop.yml:10","Warn: no topLevel permission defined: .github/workflows/sync_configs.yml:1","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":"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":"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":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:60: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docsite.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/docsite.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docsite.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/docsite.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rubocop.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/rubocop.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rubocop.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/rubocop.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/sync_configs.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/sync_configs.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/sync_configs.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/sync_configs.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/sync_configs.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/sync_configs.yml/main?enable=pin","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 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":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"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"}}]},"last_synced_at":"2025-08-18T09:54:30.079Z","repository_id":35271985,"created_at":"2025-08-18T09:54:30.079Z","updated_at":"2025-08-18T09:54:30.079Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34290393,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-13T02:00:06.617Z","response_time":62,"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":"dry-rb","name":"dry-rb","uuid":"11280820","kind":"organization","description":"dry-rb is a collection of next-generation Ruby libraries, each intended to encapsulate a common task","email":null,"website":"https://dry-rb.org","location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/11280820?v=4","repositories_count":40,"last_synced_at":"2024-03-25T21:11:49.208Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/dry-rb","funding_links":[],"total_stars":8147,"followers":272,"following":0,"created_at":"2022-11-02T16:40:56.529Z","updated_at":"2024-03-25T21:11:50.787Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-rb","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-rb/repositories"},"tags":[]},"repo_metadata_updated_at":"2026-06-13T16:05:59.387Z","dependent_packages_count":0,"downloads":113444814,"downloads_period":"total","dependent_repos_count":0,"rankings":{"downloads":0.26385081615329303,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":1.145155796337448,"average":0.35225165312268525},"purl":"pkg:gem/dry-validation?repository_url=https://gem.coop","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/rubygems/dry-validation","docker_dependents_count":38,"docker_downloads_count":6570393,"usage_url":"https://repos.ecosyste.ms/usage/rubygems/dry-validation","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/rubygems/dry-validation/dependencies","status":null,"funding_links":["https://github.com/sponsors/hanami"],"critical":null,"issue_metadata":{"last_synced_at":"2026-05-21T04:00:39.920Z","issues_count":71,"pull_requests_count":49,"avg_time_to_close_issue":7729788.872340426,"avg_time_to_close_pull_request":1234651.1020408163,"issues_closed_count":47,"pull_requests_closed_count":49,"pull_request_authors_count":32,"issue_authors_count":64,"avg_comments_per_issue":3.3943661971830985,"avg_comments_per_pull_request":1.8571428571428572,"merged_pull_requests_count":40,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":6,"past_year_pull_requests_count":2,"past_year_avg_time_to_close_issue":3121239.5,"past_year_avg_time_to_close_pull_request":391.5,"past_year_issues_closed_count":2,"past_year_pull_requests_closed_count":2,"past_year_pull_request_authors_count":1,"past_year_issue_authors_count":6,"past_year_avg_comments_per_issue":1.5,"past_year_avg_comments_per_pull_request":0.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":2,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/issues","maintainers":[{"login":"solnic","count":9,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/solnic"},{"login":"timriley","count":5,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/timriley"},{"login":"flash-gordon","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/flash-gordon"},{"login":"mereghost","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/mereghost"},{"login":"jodosha","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/jodosha"},{"login":"ianwhite","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/ianwhite"}],"active_maintainers":[{"login":"timriley","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/timriley"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/dry-validation/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/dry-validation/version_numbers","latest_version_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/dry-validation/latest_version","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/dry-validation/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/dry-validation/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/dry-validation/codemeta","maintainers":[{"uuid":"648","login":"timriley","name":null,"email":null,"url":null,"packages_count":61,"html_url":"https://gem.coop/profiles/timriley","role":null,"created_at":"2025-10-07T16:21:59.984Z","updated_at":"2025-10-07T16:21:59.984Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/maintainers/timriley/packages"},{"uuid":"143772","login":"dry-bot","name":null,"email":null,"url":null,"packages_count":25,"html_url":"https://gem.coop/profiles/dry-bot","role":null,"created_at":"2025-10-07T16:22:02.293Z","updated_at":"2025-10-07T16:22:02.293Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/maintainers/dry-bot/packages"},{"uuid":"101145","login":"flash-gordon","name":null,"email":null,"url":null,"packages_count":40,"html_url":"https://gem.coop/profiles/flash-gordon","role":null,"created_at":"2025-10-07T16:22:01.685Z","updated_at":"2025-10-07T16:22:01.685Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/maintainers/flash-gordon/packages"}],"registry":{"name":"gem.coop","url":"https://gem.coop","ecosystem":"rubygems","default":false,"packages_count":192659,"maintainers_count":67954,"namespaces_count":0,"keywords_count":18400,"github":"gem-coop","metadata":{"funded_packages_count":6885},"icon_url":"https://github.com/gem-coop.png","created_at":"2025-10-06T17:24:20.932Z","updated_at":"2026-06-10T05:17:24.062Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/namespaces"}},{"id":194444,"name":"dry-validation","ecosystem":"rubygems","description":"Validation library","homepage":"https://dry-rb.org/gems/dry-validation","licenses":"MIT","normalized_licenses":["MIT"],"repository_url":"https://github.com/dry-rb/dry-validation","keywords_array":[],"namespace":null,"versions_count":70,"first_release_published_at":"2015-11-25T18:27:22.082Z","latest_release_published_at":"2025-01-21T11:43:42.972Z","latest_release_number":"1.11.1","last_synced_at":"2026-06-13T17:30:58.943Z","created_at":"2022-04-05T21:15:45.202Z","updated_at":"2026-06-13T17:31:01.906Z","registry_url":"https://rubygems.org/gems/dry-validation","install_command":"gem install dry-validation -s https://rubygems.org","documentation_url":"http://www.rubydoc.info/gems/dry-validation/","metadata":{"funding":null},"repo_metadata":{"id":35271985,"uuid":"39532631","full_name":"dry-rb/dry-validation","owner":"dry-rb","description":"Validation library with type-safe schemas and rules","archived":false,"fork":false,"pushed_at":"2026-05-10T05:19:56.000Z","size":2390,"stargazers_count":1422,"open_issues_count":27,"forks_count":193,"subscribers_count":29,"default_branch":"main","last_synced_at":"2026-06-12T15:03:51.982Z","etag":null,"topics":["coercion","data-validation","dry-rb","gem","ruby","rubygem","type-safety","validation"],"latest_commit_sha":null,"homepage":"https://dry-rb.org/gems/dry-validation","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/dry-rb.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":".github/SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"hanami"}},"created_at":"2015-07-22T22:05:39.000Z","updated_at":"2026-06-10T05:10:28.000Z","dependencies_parsed_at":"2026-03-18T21:01:38.334Z","dependency_job_id":null,"html_url":"https://github.com/dry-rb/dry-validation","commit_stats":{"total_commits":1720,"total_committers":84,"mean_commits":"20.476190476190474","dds":"0.42906976744186043","last_synced_commit":"7c10d83206bde67dc147e2232eb0c4d0956e6d00"},"previous_names":[],"tags_count":72,"template":false,"template_full_name":null,"purl":"pkg:github/dry-rb/dry-validation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-rb","download_url":"https://codeload.github.com/dry-rb/dry-validation/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/sbom","scorecard":{"id":357240,"data":{"date":"2025-08-11","repo":{"name":"github.com/dry-rb/dry-validation","commit":"1939ad09fa5b8c91952f3909239ca4d7d8c4deca"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"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":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Warn: no topLevel permission defined: .github/workflows/docsite.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/rubocop.yml:10","Warn: no topLevel permission defined: .github/workflows/sync_configs.yml:1","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":"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":"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":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:60: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docsite.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/docsite.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docsite.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/docsite.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rubocop.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/rubocop.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rubocop.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/rubocop.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/sync_configs.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/sync_configs.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/sync_configs.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/sync_configs.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/sync_configs.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-rb/dry-validation/sync_configs.yml/main?enable=pin","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 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":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"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"}}]},"last_synced_at":"2025-08-18T09:54:30.079Z","repository_id":35271985,"created_at":"2025-08-18T09:54:30.079Z","updated_at":"2025-08-18T09:54:30.079Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34290393,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-13T02:00:06.617Z","response_time":62,"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":"dry-rb","name":"dry-rb","uuid":"11280820","kind":"organization","description":"dry-rb is a collection of next-generation Ruby libraries, each intended to encapsulate a common task","email":null,"website":"https://dry-rb.org","location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/11280820?v=4","repositories_count":40,"last_synced_at":"2024-03-25T21:11:49.208Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/dry-rb","funding_links":[],"total_stars":8147,"followers":272,"following":0,"created_at":"2022-11-02T16:40:56.529Z","updated_at":"2024-03-25T21:11:50.787Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-rb","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-rb/repositories"},"tags":[]},"repo_metadata_updated_at":"2026-06-13T17:31:01.905Z","dependent_packages_count":171,"downloads":113445803,"downloads_period":"total","dependent_repos_count":2905,"rankings":{"downloads":0.3618380704943076,"dependent_repos_count":0.5831781536780366,"dependent_packages_count":0.2191099564010214,"stargazers_count":1.6352404634203455,"forks_count":1.957493783521593,"docker_downloads_count":1.8838995996922423,"average":1.1067933378679244},"purl":"pkg:gem/dry-validation","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/rubygems/dry-validation","docker_dependents_count":38,"docker_downloads_count":6570393,"usage_url":"https://repos.ecosyste.ms/usage/rubygems/dry-validation","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/rubygems/dry-validation/dependencies","status":null,"funding_links":["https://github.com/sponsors/hanami"],"critical":true,"issue_metadata":{"last_synced_at":"2026-05-21T04:00:39.920Z","issues_count":71,"pull_requests_count":49,"avg_time_to_close_issue":7729788.872340426,"avg_time_to_close_pull_request":1234651.1020408163,"issues_closed_count":47,"pull_requests_closed_count":49,"pull_request_authors_count":32,"issue_authors_count":64,"avg_comments_per_issue":3.3943661971830985,"avg_comments_per_pull_request":1.8571428571428572,"merged_pull_requests_count":40,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":6,"past_year_pull_requests_count":2,"past_year_avg_time_to_close_issue":3121239.5,"past_year_avg_time_to_close_pull_request":391.5,"past_year_issues_closed_count":2,"past_year_pull_requests_closed_count":2,"past_year_pull_request_authors_count":1,"past_year_issue_authors_count":6,"past_year_avg_comments_per_issue":1.5,"past_year_avg_comments_per_pull_request":0.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":2,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/issues","maintainers":[{"login":"solnic","count":9,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/solnic"},{"login":"timriley","count":5,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/timriley"},{"login":"flash-gordon","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/flash-gordon"},{"login":"mereghost","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/mereghost"},{"login":"jodosha","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/jodosha"},{"login":"ianwhite","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/ianwhite"}],"active_maintainers":[{"login":"timriley","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/timriley"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/dry-validation/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/dry-validation/version_numbers","latest_version_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/dry-validation/latest_version","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/dry-validation/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/dry-validation/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/dry-validation/codemeta","maintainers":[{"uuid":"648","login":"timriley","name":null,"email":null,"url":null,"packages_count":61,"html_url":"https://rubygems.org/profiles/timriley","role":null,"created_at":"2022-11-08T09:40:31.570Z","updated_at":"2022-11-08T09:40:31.570Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/maintainers/timriley/packages"},{"uuid":"143772","login":"dry-bot","name":null,"email":null,"url":null,"packages_count":25,"html_url":"https://rubygems.org/profiles/dry-bot","role":null,"created_at":"2022-11-08T09:40:31.642Z","updated_at":"2022-11-08T09:40:31.642Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/maintainers/dry-bot/packages"},{"uuid":"101145","login":"flash-gordon","name":null,"email":null,"url":null,"packages_count":39,"html_url":"https://rubygems.org/profiles/flash-gordon","role":null,"created_at":"2022-11-08T09:40:31.627Z","updated_at":"2022-11-08T09:40:31.627Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/maintainers/flash-gordon/packages"}],"registry":{"name":"rubygems.org","url":"https://rubygems.org","ecosystem":"rubygems","default":true,"packages_count":207824,"maintainers_count":68941,"namespaces_count":0,"keywords_count":18771,"github":"rubygems","metadata":{"funded_packages_count":7455},"icon_url":"https://github.com/rubygems.png","created_at":"2022-04-04T15:19:23.446Z","updated_at":"2026-06-10T05:04:00.514Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/namespaces"}}],"commits":{"id":3157,"full_name":"dry-rb/dry-validation","default_branch":"main","total_commits":1789,"total_committers":85,"total_bot_commits":35,"total_bot_committers":1,"mean_commits":21.04705882352941,"dds":0.4510899944102851,"past_year_total_commits":45,"past_year_total_committers":3,"past_year_total_bot_commits":35,"past_year_total_bot_committers":1,"past_year_mean_commits":15.0,"past_year_dds":0.2222222222222222,"last_synced_at":"2026-06-13T16:13:24.698Z","last_synced_commit":"e7dff1eddfa98a2bab3acd895535c29b1e0b294c","created_at":"2023-03-07T09:16:44.397Z","updated_at":"2026-06-13T16:08:15.975Z","committers":[{"name":"Piotr Solnica","email":"piotr.solnica@gmail.com","login":"solnic","count":982},{"name":"dry-bot","email":"dry-bot@dry-rb.org","login":"dry-bot","count":206},{"name":"Nikita Shilnikov","email":"fg@flashgordon.ru","login":"flash-gordon","count":130},{"name":"File Sync","email":"file-sync@action-hero.dev","login":null,"count":90},{"name":"Piotr Solnica","email":"piotr.solnica+oss@gmail.com","login":null,"count":64},{"name":"github-actions[bot]","email":"41898282+github-actions[bot]","login":"github-actions[bot]","count":35},{"name":"Andy Holland","email":"andyholland1991@aol.com","login":"AMHOL","count":28},{"name":"Fran Worley","email":"frances@safetytoolbox.co.uk","login":"fran-worley","count":20},{"name":"Tim Riley","email":"tim@openmonkey.com","login":"timriley","count":18},{"name":"File Sync","email":"github@repobot.app","login":null,"count":18},{"name":"Action Hero","email":"bot@action-hero.app","login":null,"count":15},{"name":"Piotr Solnica","email":"piotr_solnica@apple.com","login":null,"count":14},{"name":"Tim Cooper","email":"coop@latrobest.com","login":"coop","count":13},{"name":"Marc Busqué","email":"marc@lamarciana.com","login":"waiting-for-dev","count":12},{"name":"Igor Alexandrov","email":"igor.alexandrov@gmail.com","login":"igor-alexandrov","count":10},{"name":"GitHub Action","email":"action@github.com","login":"actions-user","count":9},{"name":"Olle Jonsson","email":"olle.jonsson@gmail.com","login":"olleolleolle","count":6},{"name":"Luca Guidi","email":"me@lucaguidi.com","login":"jodosha","count":5},{"name":"Adam Lassek","email":"adam@doubleprime.net","login":"alassek","count":5},{"name":"Peter Suschlik","email":"ps@neopoly.de","login":null,"count":4},{"name":"fkostovski","email":"fkostovski@ebay.com","login":null,"count":4},{"name":"Espartaco Palma","email":"esparta@gmail.com","login":"esparta","count":4},{"name":"Arkadiy Zabazhanov","email":"kinwizard@gmail.com","login":"pyromaniac","count":3},{"name":"Brandon Autrey","email":"brandon.autrey@glia.com","login":"bautrey37","count":3},{"name":"Ian White","email":"ian.w.white@gmail.com","login":"ianwhite","count":3},{"name":"Jan Dudulski","email":"jan@dudulski.pl","login":"jandudulski","count":3},{"name":"Joe","email":"191664+the-undefined","login":"the-undefined","count":3},{"name":"Mathieu Le Tiec","email":"mathieu.letiec+github@gmail.com","login":null,"count":3},{"name":"Rob Hanlon","email":"robhanlon@gmail.com","login":"robhanlon22","count":3},{"name":"Tanner Donovan","email":"ttdonovan@gmail.com","login":"ttdonovan","count":3},{"name":"Agustin Cavilliotti","email":"cavi21@gmail.com","login":"cavi21","count":2},{"name":"Alexander Katulskiy","email":"alexxty7@gmail.com","login":"alexxty7","count":2},{"name":"Dmitriy Ivliev","email":"rootkit89@gmail.com","login":"moofkit","count":2},{"name":"Eugene Kruglov","email":"sickjahfar@gmail.com","login":"mustardnoise","count":2},{"name":"Rob Hanlon","email":"rob.hanlon@highspot.com","login":null,"count":2},{"name":"Ralf Schmitz Bongiolo","email":"ralfsb2008@gmail.com","login":null,"count":2},{"name":"Ralf Schmitz Bongiolo","email":"mrbongiolo@gmail.com","login":null,"count":2},{"name":"Juan Vasquez","email":"juan@logicalbricks.com","login":null,"count":2},{"name":"Grant Shangreaux","email":"shshoshin@protonmail.com","login":null,"count":2},{"name":"File Sync","email":"file-sync@repobot-app.dev","login":null,"count":2},{"name":"Koichi ITO","email":"koic.ito@gmail.com","login":"koic","count":2},{"name":"Long Nguyen","email":"long.polyglot@gmail.com","login":"sirius248","count":2},{"name":"Mathieu Le Tiec","email":"mathieu.letiec+git@gmail.com","login":"MatElGran","count":2},{"name":"RKushnir","email":"RKushnir","login":"RKushnir","count":2},{"name":"Semyon Pupkov","email":"mail@semyonpupkov.com","login":"artofhuman","count":2},{"name":"Svyatoslav Kryukov","email":"s.g.kryukov@yandex.ru","login":"skryukov","count":2},{"name":"Tobias Pfeiffer","email":"pragtob@gmail.com","login":"PragTob","count":2},{"name":"jozzi","email":"dominik.malantowicz@gmail.com","login":"jozzi05","count":2},{"name":"Pablo Herrero","email":"pablodherrero@gmail.com","login":"pabloh","count":1},{"name":"Patrick Clery","email":"patrick.clery@gmail.com","login":"patrickclery","count":1},{"name":"Pavel Rodionov","email":"pasha.rod@mail.ru","login":"krim","count":1},{"name":"Radan Skoric","email":"radan.skoric@gmail.com","login":"radanskoric","count":1},{"name":"Salim Semaoune","email":"salim.semaoune@gmail.com","login":"sailor","count":1},{"name":"Alexey Zhaboyedov","email":"Alexey.Zhaboyedov@dataart.com","login":null,"count":1},{"name":"Tadeusz Niemiec","email":"tadeusz@applover.pl","login":null,"count":1},{"name":"Kristopher Bredemeier","email":"kb@i22.de","login":null,"count":1},{"name":"Vitaly Pecherin","email":"readfuzza@gmail.com","login":null,"count":1},{"name":"gary","email":"ggrumbley@ucsd.edu","login":null,"count":1},{"name":"Néstor Salceda","email":"nestor.salceda@gmail.com","login":"nestorsalceda","count":1},{"name":"Nathaniel Bibler","email":"git@nathanielbibler.com","login":"nbibler","count":1},{"name":"Kirill Zaitsev","email":"kirik910@gmail.com","login":"kzaitsev","count":1},{"name":"Viktar Basharymau","email":"viktar.basharymau@gmail.com","login":"DNNX","count":1},{"name":"enomotodev","email":"enomoto.dev@gmail.com","login":"enomotodev","count":1},{"name":"fig","email":"fig","login":"fig","count":1},{"name":"isikyus","email":"isikyus","login":"isikyus","count":1},{"name":"mereghost","email":"marcello.rocha@gmail.com","login":"mereghost","count":1},{"name":"Dawid Janczak","email":"dawid.janczak@gmail.com","login":"DawidJanczak","count":1},{"name":"Daniel Gollahon","email":"daniel@blockscore.com","login":"dgollahon","count":1},{"name":"Brychu","email":"pbrych@gmail.com","login":"bryszard","count":1},{"name":"Bogdan Malakhovich","email":"q3ry.dev@gmail.com","login":"stind","count":1},{"name":"Ben Hicks","email":"benkhicks@gmail.com","login":"bhicks","count":1},{"name":"Armin","email":"armin@wurzweb.com","login":"wuarmin","count":1},{"name":"Andrei Galușca","email":"agalusca@gmail.com","login":"dreig","count":1},{"name":"Akira Matsuda","email":"ronnie@dio.jp","login":"amatsuda","count":1},{"name":"Aaron Tinio","email":"aptinio@gmail.com","login":"aptinio","count":1},{"name":"Frank Lam","email":"ryzingsun11@yahoo.com","login":"FTLam11","count":1},{"name":"George Millo","email":"georgejulianmillo@gmail.com","login":"george-carlin","count":1},{"name":"Grzegorz Jakubiak","email":"grzegorz.jakubiak@infopark.de","login":"grzegorz-jakubiak","count":1},{"name":"GustavoCaso","email":"gustavocaso@gmail.com","login":"GustavoCaso","count":1},{"name":"Igor Sidorov","email":"igor.sidorov@onapp.com","login":"binarycode","count":1},{"name":"Jeremy Friesen","email":"jeremy.n.friesen@gmail.com","login":"jeremyf","count":1},{"name":"Joe Van Dyk","email":"joe@tanga.com","login":"joevandyk","count":1},{"name":"John Backus","email":"johncbackus@gmail.com","login":"backus","count":1},{"name":"wintersolutions","email":"mw@wintersolutions.de","login":null,"count":1},{"name":"schokomarie","email":"jana@dotless.de","login":"schokomarie","count":1}],"past_year_committers":[{"name":"github-actions[bot]","email":"41898282+github-actions[bot]","login":"github-actions[bot]","count":35},{"name":"Tim Riley","email":"tim@riley.id.au","login":"timriley","count":7},{"name":"Adam Lassek","email":"adam@doubleprime.net","login":"alassek","count":3}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-06-14T00:00:10.507Z","repositories_count":6259209,"commits_count":882484150,"contributors_count":35084136,"owners_count":1166428,"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":"dry-rb/dry-validation","html_url":"https://github.com/dry-rb/dry-validation","last_synced_at":"2026-05-21T04:00:39.920Z","status":"error","issues_count":71,"pull_requests_count":49,"avg_time_to_close_issue":7729788.872340426,"avg_time_to_close_pull_request":1234651.1020408163,"issues_closed_count":47,"pull_requests_closed_count":49,"pull_request_authors_count":32,"issue_authors_count":64,"avg_comments_per_issue":3.3943661971830985,"avg_comments_per_pull_request":1.8571428571428572,"merged_pull_requests_count":40,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":6,"past_year_pull_requests_count":2,"past_year_avg_time_to_close_issue":3121239.5,"past_year_avg_time_to_close_pull_request":391.5,"past_year_issues_closed_count":2,"past_year_pull_requests_closed_count":2,"past_year_pull_request_authors_count":1,"past_year_issue_authors_count":6,"past_year_avg_comments_per_issue":1.5,"past_year_avg_comments_per_pull_request":0.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":2,"created_at":"2023-05-12T10:03:44.783Z","updated_at":"2026-05-21T04:00:39.920Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-rb%2Fdry-validation/issues","issue_labels_count":{"bug":51,"help wanted":47,"feature":12,"invalid":2,"wip":1,"⚠️ experimental ⚠️":1,"hints":1},"pull_request_labels_count":{"bug":1,"feature":1},"issue_author_associations_count":{"NONE":58,"CONTRIBUTOR":7,"MEMBER":5,"COLLABORATOR":1},"pull_request_author_associations_count":{"CONTRIBUTOR":30,"MEMBER":11,"NONE":7,"COLLABORATOR":1},"issue_authors":{"solnic":4,"tanyongkee":2,"DawidJanczak":2,"PericlesTheo":2,"postmodern":2,"jacobtani":1,"ilnurnasyrov2":1,"xiaoxipang":1,"RajatPawar":1,"sirneb":1,"yuuan":1,"erikbelusic":1,"PragTob":1,"peco8":1,"rrcosta":1,"musaffa":1,"Sphaerus":1,"Somestuffman":1,"sbezugliy":1,"adamransom":1,"jaredbeck":1,"ssoulless":1,"rwojnarowski":1,"mfly":1,"aleksandra-stolyar":1,"graudeejs":1,"luccasmaso":1,"Sbastien":1,"stind":1,"stevenhan2":1,"sdalu":1,"fnordfish":1,"MatElGran":1,"morgoth":1,"emaglio":1,"flash-gordon":1,"colszowka":1,"mateusz-useo":1,"mensfeld":1,"vatnajokull":1,"EricToshio":1,"yournumberone":1,"elct9620":1,"guilherme-andrade":1,"bautrey37":1,"elohanlon":1,"pandwoter":1,"regedarek":1,"barmic12":1,"kadru":1,"TimoMoss":1,"sekrett":1,"bestwebua":1,"viraptor":1,"pyromaniac":1,"BroiSatse":1,"contentfree":1,"MiralDesai":1,"mediafinger":1,"midnight-wonderer":1,"dawidof":1,"kmasuda-aiming":1,"ianwhite":1,"dwilkie":1},"pull_request_authors":{"timriley":5,"JuanVqz":5,"solnic":5,"pyromaniac":2,"bryszard":2,"bautrey37":2,"sirfilip":2,"andrew":2,"alexxty7":1,"enomotodev":1,"PragTob":1,"FTLam11":1,"bhicks":1,"dreig":1,"alassek":1,"wuarmin":1,"binarycode":1,"DawidJanczak":1,"keymastervn":1,"mereghost":1,"pedryvo":1,"stind":1,"isikyus":1,"sailor":1,"moofkit":1,"artofhuman":1,"tadeusz-niemiec":1,"MatElGran":1,"mrbongiolo":1,"esparta":1,"jodosha":1,"fig":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-06-06T00:00:10.330Z","repositories_count":14766336,"issues_count":33447278,"pull_requests_count":110155033,"authors_count":11294136,"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":{"bug":4,"help wanted":4,"invalid":1},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{"NONE":5},"past_year_pull_request_author_associations_count":{"MEMBER":2},"past_year_issue_authors":{"mensfeld":1,"musaffa":1,"rrcosta":1,"viraptor":1,"xiaoxipang":1},"past_year_pull_request_authors":{"timriley":2},"maintainers":[{"login":"solnic","count":9,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/solnic"},{"login":"timriley","count":5,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/timriley"},{"login":"flash-gordon","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/flash-gordon"},{"login":"mereghost","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/mereghost"},{"login":"jodosha","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/jodosha"},{"login":"ianwhite","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/ianwhite"}],"active_maintainers":[{"login":"timriley","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/timriley"}]},"events":{"total":{"ReleaseEvent":1,"DeleteEvent":38,"PullRequestEvent":1,"ForkEvent":4,"IssuesEvent":10,"WatchEvent":49,"IssueCommentEvent":8,"PushEvent":31,"CreateEvent":37},"last_year":{"DeleteEvent":38,"ForkEvent":2,"IssuesEvent":4,"WatchEvent":15,"IssueCommentEvent":2,"PushEvent":19,"CreateEvent":35}},"keywords":["coercion","data-validation","dry-rb","gem","ruby","rubygem","type-safety","validation"],"dependencies":[{"ecosystem":"rubygems","filepath":"Gemfile","sha":null,"kind":"manifest","created_at":"2022-08-08T07:01:10.090Z","updated_at":"2022-08-08T07:01:10.090Z","repository_link":"https://github.com/dry-rb/dry-validation/blob/main/Gemfile","dependencies":[{"id":631213229,"package_name":"dry-configurable","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"runtime","optional":false},{"id":631213234,"package_name":"dry-schema","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"runtime","optional":false},{"id":631213236,"package_name":"dry-types","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"runtime","optional":false},{"id":631213239,"package_name":"dry-monads","ecosystem":"rubygems","requirements":"~\u003e 1.0","direct":true,"kind":"development","optional":false},{"id":631213241,"package_name":"i18n","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":631213242,"package_name":"pry","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":631213243,"package_name":"pry-byebug","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":631213244,"package_name":"actionpack","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":631213245,"package_name":"activemodel","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":631213247,"package_name":"activerecord","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":631213249,"package_name":"benchmark-ips","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":631213251,"package_name":"hotch","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":631213252,"package_name":"sqlite3","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":631213254,"package_name":"virtus","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false}]},{"ecosystem":"rubygems","filepath":"dry-validation.gemspec","sha":null,"kind":"manifest","created_at":"2022-08-08T07:01:10.357Z","updated_at":"2022-08-08T07:01:10.357Z","repository_link":"https://github.com/dry-rb/dry-validation/blob/main/dry-validation.gemspec","dependencies":[{"id":631218829,"package_name":"concurrent-ruby","ecosystem":"rubygems","requirements":"~\u003e 1.0","direct":true,"kind":"runtime","optional":false},{"id":631218830,"package_name":"dry-container","ecosystem":"rubygems","requirements":"~\u003e 0.7, \u003e= 0.7.1","direct":true,"kind":"runtime","optional":false},{"id":631218831,"package_name":"dry-core","ecosystem":"rubygems","requirements":"~\u003e 0.5, \u003e= 0.5","direct":true,"kind":"runtime","optional":false},{"id":631218832,"package_name":"dry-initializer","ecosystem":"rubygems","requirements":"~\u003e 3.0","direct":true,"kind":"runtime","optional":false},{"id":631218833,"package_name":"dry-schema","ecosystem":"rubygems","requirements":"~\u003e 1.8, \u003e= 1.8.0","direct":true,"kind":"runtime","optional":false},{"id":631218834,"package_name":"bundler","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":631218835,"package_name":"rake","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":631218836,"package_name":"rspec","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/ci.yml","sha":null,"kind":"manifest","created_at":"2023-01-15T17:24:20.986Z","updated_at":"2023-01-15T17:24:20.986Z","repository_link":"https://github.com/dry-rb/dry-validation/blob/main/.github/workflows/ci.yml","dependencies":[{"id":6929704796,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":6929704797,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"v1","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/rubocop.yml","sha":null,"kind":"manifest","created_at":"2023-01-15T17:24:21.094Z","updated_at":"2023-01-15T17:24:21.094Z","repository_link":"https://github.com/dry-rb/dry-validation/blob/main/.github/workflows/rubocop.yml","dependencies":[{"id":6929704800,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":6929704801,"package_name":"technote-space/get-diff-action","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":6929704802,"package_name":"repobot-app/actions/rubocop","ecosystem":"actions","requirements":"main","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/ci-lint.yml","sha":null,"kind":"manifest","created_at":"2026-03-18T21:01:34.577Z","updated_at":"2026-03-18T21:01:34.577Z","repository_link":"https://github.com/dry-rb/dry-validation/blob/main/.github/workflows/ci-lint.yml","dependencies":[{"id":25842208748,"package_name":"actions/checkout","ecosystem":"actions","requirements":"de0fac2e4500dabe0009e67214ff5f5447ce83dd","direct":true,"kind":"composite","optional":false},{"id":25842208749,"package_name":"zizmorcore/zizmor-action","ecosystem":"actions","requirements":"0dce2577a4760a2749d8cfb7a84b7d5585ebcb7d","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/pr-comments.yml","sha":null,"kind":"manifest","created_at":"2026-03-18T21:01:35.176Z","updated_at":"2026-03-18T21:01:35.176Z","repository_link":"https://github.com/dry-rb/dry-validation/blob/main/.github/workflows/pr-comments.yml","dependencies":[{"id":25842208799,"package_name":"hanakai-rb/repo-sync/pr-comments-from-artifacts","ecosystem":"actions","requirements":"main","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/repo-sync-preview.yml","sha":null,"kind":"manifest","created_at":"2026-03-18T21:01:36.379Z","updated_at":"2026-03-18T21:01:36.379Z","repository_link":"https://github.com/dry-rb/dry-validation/blob/main/.github/workflows/repo-sync-preview.yml","dependencies":[{"id":25842208806,"package_name":"actions/github-script","ecosystem":"actions","requirements":"450193c5abd4cdb17ba9f3ffcfe8f635c4bb6c2a","direct":true,"kind":"composite","optional":false}]}],"score":31.017573661418126,"created_at":"2024-12-15T21:38:07.390Z","updated_at":"2026-06-15T16:30:18.252Z","avatar_url":"https://github.com/dry-rb.png","language":"Ruby","monthly_downloads":0,"readme":"\u003c!--- This file is synced from hanakai-rb/repo-sync --\u003e\n\n[actions]: https://github.com/dry-rb/dry-validation/actions\n[chat]: https://discord.gg/naQApPAsZB\n[forum]: https://discourse.hanamirb.org\n[rubygem]: https://rubygems.org/gems/dry-validation\n\n# dry-validation [![Gem Version](https://badge.fury.io/rb/dry-validation.svg)][rubygem] [![CI Status](https://github.com/dry-rb/dry-validation/workflows/CI/badge.svg)][actions]\n\n[![Forum](https://img.shields.io/badge/Forum-dc360f?logo=discourse\u0026logoColor=white)][forum]\n[![Chat](https://img.shields.io/badge/Chat-717cf8?logo=discord\u0026logoColor=white)][chat]\n\n## Links\n\n- [User documentation](https://dry-rb.org/gems/dry-validation)\n- [API documentation](http://rubydoc.info/gems/dry-validation)\n- [Forum](https://discourse.dry-rb.org)\n\n## License\n\nSee `LICENSE` file.\n\n","funding_links":["https://github.com/sponsors/hanami"],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["constraints","activerecord","mvc","activejob","predicate-logic","predicates","rule-engine","ruby-gem","data-validator","schema-validation"],"project_url":"https://ruby.ecosyste.ms/api/v1/projects/242","html_url":"https://ruby.ecosyste.ms/projects/242"}