{"id":65712,"name":"classes","description":"Smart, pythonic, ad-hoc, typed polymorphism for Python","url":"https://github.com/dry-python/classes","last_synced_at":"2025-09-08T13:27:57.519Z","repository":{"id":36583919,"uuid":"217621930","full_name":"dry-python/classes","owner":"dry-python","description":"Smart, pythonic, ad-hoc, typed polymorphism for Python","archived":false,"fork":false,"pushed_at":"2024-12-17T05:48:30.000Z","size":902,"stargazers_count":716,"open_issues_count":37,"forks_count":29,"subscribers_count":14,"default_branch":"master","last_synced_at":"2025-08-29T19:12:35.166Z","etag":null,"topics":["fp","mypy","mypy-plugins","mypy-stubs","pep561","python","python3","typeclasses","typesafety"],"latest_commit_sha":null,"homepage":"https://classes.rtfd.io","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dry-python.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"dry-python","open_collective":"dry-python","custom":"https://boosty.to/sobolevn"}},"created_at":"2019-10-25T22:14:08.000Z","updated_at":"2025-08-06T10:41:18.000Z","dependencies_parsed_at":"2023-02-16T07:45:22.142Z","dependency_job_id":"e3cfa417-bff0-4e52-87b7-f69cc02931bb","html_url":"https://github.com/dry-python/classes","commit_stats":{"total_commits":360,"total_committers":16,"mean_commits":22.5,"dds":0.6638888888888889,"last_synced_commit":"0b958c838ee8ee683c9855cdc770a27bde29dd67"},"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/dry-python/classes","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-python","download_url":"https://codeload.github.com/dry-python/classes/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/sbom","scorecard":{"id":357223,"data":{"date":"2025-08-11","repo":{"name":"github.com/dry-python/classes","commit":"35fa4a807252f0dd7a2c09f3ebb939bcd97ebac7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Code-Review","score":5,"reason":"Found 5/9 approved changesets -- score normalized to 5","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":"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/test.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":"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":"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":"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":"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/test.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-python/classes/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-python/classes/test.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-python/classes/test.yml/master?enable=pin","Warn: downloadThenRun not pinned by hash: .github/workflows/test.yml:26","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   1 downloadThenRun 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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 2-Clause \"Simplified\" 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":"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":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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":"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":"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"}},{"name":"Vulnerabilities","score":0,"reason":"24 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2023-117 / GHSA-mrwq-x4v8-fh7p","Warn: Project is vulnerable to: PYSEC-2024-230 / GHSA-248v-346w-9cwc","Warn: Project is vulnerable to: PYSEC-2023-135 / GHSA-xqr8-7jwr-rhp7","Warn: Project is vulnerable to: PYSEC-2024-4 / GHSA-2mqj-m65w-jghx","Warn: Project is vulnerable to: PYSEC-2023-165 / GHSA-cwvm-v4w8-q58c","Warn: Project is vulnerable to: PYSEC-2022-42992 / GHSA-hcpj-qp55-gfph","Warn: Project is vulnerable to: PYSEC-2023-137 / GHSA-pr76-5cm5-w9cj","Warn: Project is vulnerable to: PYSEC-2023-161 / GHSA-wfm5-v35h-vwf4","Warn: Project is vulnerable to: PYSEC-2024-60 / GHSA-jjg7-2v4v-x38h","Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7","Warn: Project is vulnerable to: GHSA-gmj6-6f8f-6699","Warn: Project is vulnerable to: GHSA-h5c8-rqwp-cp95","Warn: Project is vulnerable to: GHSA-h75v-3vvj-5mfj","Warn: Project is vulnerable to: GHSA-q2x7-8rv6-6q7h","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2023-74 / GHSA-j8r2-6x86-q33q","Warn: Project is vulnerable to: PYSEC-2025-49 / GHSA-5rjg-fvgr-3xxf","Warn: Project is vulnerable to: GHSA-cx63-2mw6-8hw5","Warn: Project is vulnerable to: GHSA-34jh-p97f-mpxf","Warn: Project is vulnerable to: PYSEC-2023-212 / GHSA-g4mx-q9vg-27p4","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: PYSEC-2023-192 / GHSA-v845-jxx5-vc9f","Warn: Project is vulnerable to: GHSA-jfmj-5v4g-7637"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T09:54:22.776Z","repository_id":36583919,"created_at":"2025-08-18T09:54:22.776Z","updated_at":"2025-08-18T09:54:22.776Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274192286,"owners_count":25238549,"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-08T02:00:09.813Z","response_time":121,"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-python","name":"dry-python","uuid":"37993755","kind":"organization","description":"A set of libraries for pluggable business logic components.","email":"mail@sobolevn.me","website":"https://dry-labs.github.io","location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/37993755?v=4","repositories_count":10,"last_synced_at":"2025-09-06T06:29:29.359Z","metadata":{"has_sponsors_listing":true,"funding":{"github":"dry-python","open_collective":"dry-python","custom":"https://boosty.to/sobolevn"}},"html_url":"https://github.com/dry-python","funding_links":["https://github.com/sponsors/dry-python","https://opencollective.com/dry-python","https://boosty.to/sobolevn"],"total_stars":5253,"followers":343,"following":0,"created_at":"2022-11-13T16:20:47.472Z","updated_at":"2025-09-06T06:29:29.359Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-python","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-python/repositories"},"packages":[{"id":2671289,"name":"classes","ecosystem":"pypi","description":"Smart, pythonic, ad-hoc, typed polymorphism for Python","homepage":"https://classes.readthedocs.io","licenses":"BSD-2-Clause","normalized_licenses":["BSD-2-Clause"],"repository_url":"https://github.com/dry-python/classes","keywords_array":["functional programming","fp","type class","typeclass","typeclasses","ad-hoc","composition","type-safety","mypy","stubs"],"namespace":null,"versions_count":6,"first_release_published_at":"2019-10-25T19:44:25.000Z","latest_release_published_at":"2022-04-11T15:21:53.000Z","latest_release_number":"0.4.1","last_synced_at":"2025-08-29T18:23:28.039Z","created_at":"2022-04-10T10:21:37.772Z","updated_at":"2025-08-29T19:14:14.983Z","registry_url":"https://pypi.org/project/classes/","install_command":"pip install classes --index-url https://pypi.org/simple","documentation_url":"https://classes.readthedocs.io/","metadata":{"funding":null,"documentation":null,"classifiers":["Development Status :: 4 - Beta","Intended Audience :: Developers","License :: OSI Approved :: BSD License","Operating System :: OS Independent","Programming Language :: Python :: 3","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.7","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Topic :: Software Development :: Libraries :: Python Modules","Topic :: Utilities"],"normalized_name":"classes","project_status":null},"repo_metadata":{"id":36583919,"uuid":"217621930","full_name":"dry-python/classes","owner":"dry-python","description":"Smart, pythonic, ad-hoc, typed polymorphism for Python","archived":false,"fork":false,"pushed_at":"2024-12-17T05:48:30.000Z","size":902,"stargazers_count":716,"open_issues_count":37,"forks_count":29,"subscribers_count":14,"default_branch":"master","last_synced_at":"2025-08-09T23:36:50.257Z","etag":null,"topics":["fp","mypy","mypy-plugins","mypy-stubs","pep561","python","python3","typeclasses","typesafety"],"latest_commit_sha":null,"homepage":"https://classes.rtfd.io","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dry-python.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"dry-python","open_collective":"dry-python","custom":"https://boosty.to/sobolevn"}},"created_at":"2019-10-25T22:14:08.000Z","updated_at":"2025-08-06T10:41:18.000Z","dependencies_parsed_at":"2023-02-16T07:45:22.142Z","dependency_job_id":"e3cfa417-bff0-4e52-87b7-f69cc02931bb","html_url":"https://github.com/dry-python/classes","commit_stats":{"total_commits":360,"total_committers":16,"mean_commits":22.5,"dds":0.6638888888888889,"last_synced_commit":"0b958c838ee8ee683c9855cdc770a27bde29dd67"},"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/dry-python/classes","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-python","download_url":"https://codeload.github.com/dry-python/classes/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/sbom","scorecard":{"id":357223,"data":{"date":"2025-08-11","repo":{"name":"github.com/dry-python/classes","commit":"35fa4a807252f0dd7a2c09f3ebb939bcd97ebac7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Code-Review","score":5,"reason":"Found 5/9 approved changesets -- score normalized to 5","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":"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/test.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":"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":"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":"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":"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/test.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-python/classes/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-python/classes/test.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-python/classes/test.yml/master?enable=pin","Warn: downloadThenRun not pinned by hash: .github/workflows/test.yml:26","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   1 downloadThenRun 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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 2-Clause \"Simplified\" 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":"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":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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":"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":"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"}},{"name":"Vulnerabilities","score":0,"reason":"24 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2023-117 / GHSA-mrwq-x4v8-fh7p","Warn: Project is vulnerable to: PYSEC-2024-230 / GHSA-248v-346w-9cwc","Warn: Project is vulnerable to: PYSEC-2023-135 / GHSA-xqr8-7jwr-rhp7","Warn: Project is vulnerable to: PYSEC-2024-4 / GHSA-2mqj-m65w-jghx","Warn: Project is vulnerable to: PYSEC-2023-165 / GHSA-cwvm-v4w8-q58c","Warn: Project is vulnerable to: PYSEC-2022-42992 / GHSA-hcpj-qp55-gfph","Warn: Project is vulnerable to: PYSEC-2023-137 / GHSA-pr76-5cm5-w9cj","Warn: Project is vulnerable to: PYSEC-2023-161 / GHSA-wfm5-v35h-vwf4","Warn: Project is vulnerable to: PYSEC-2024-60 / GHSA-jjg7-2v4v-x38h","Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7","Warn: Project is vulnerable to: GHSA-gmj6-6f8f-6699","Warn: Project is vulnerable to: GHSA-h5c8-rqwp-cp95","Warn: Project is vulnerable to: GHSA-h75v-3vvj-5mfj","Warn: Project is vulnerable to: GHSA-q2x7-8rv6-6q7h","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2023-74 / GHSA-j8r2-6x86-q33q","Warn: Project is vulnerable to: PYSEC-2025-49 / GHSA-5rjg-fvgr-3xxf","Warn: Project is vulnerable to: GHSA-cx63-2mw6-8hw5","Warn: Project is vulnerable to: GHSA-34jh-p97f-mpxf","Warn: Project is vulnerable to: PYSEC-2023-212 / GHSA-g4mx-q9vg-27p4","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: PYSEC-2023-192 / GHSA-v845-jxx5-vc9f","Warn: Project is vulnerable to: GHSA-jfmj-5v4g-7637"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T09:54:22.776Z","repository_id":36583919,"created_at":"2025-08-18T09:54:22.776Z","updated_at":"2025-08-18T09:54:22.776Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272735902,"owners_count":24984349,"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-08-29T02:00:10.610Z","response_time":87,"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-python","name":"dry-python","uuid":"37993755","kind":"organization","description":"A set of libraries for pluggable business logic components.","email":"mail@sobolevn.me","website":"https://dry-labs.github.io","location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/37993755?v=4","repositories_count":10,"last_synced_at":"2025-08-22T19:13:45.260Z","metadata":{"has_sponsors_listing":true,"funding":{"github":"dry-python","open_collective":"dry-python","custom":"https://boosty.to/sobolevn"}},"html_url":"https://github.com/dry-python","funding_links":["https://github.com/sponsors/dry-python","https://opencollective.com/dry-python","https://boosty.to/sobolevn"],"total_stars":5237,"followers":338,"following":0,"created_at":"2022-11-13T16:20:47.472Z","updated_at":"2025-08-22T19:13:45.260Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-python","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-python/repositories"},"tags":[{"name":"0.4.1","sha":"58aea46f107583caeea7d706e0853744214b90a4","kind":"tag","published_at":"2022-04-11T15:22:10.000Z","download_url":"https://codeload.github.com/dry-python/classes/tar.gz/0.4.1","html_url":"https://github.com/dry-python/classes/releases/tag/0.4.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/dry-python/classes@0.4.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.4.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.4.1/manifests"},{"name":"0.4.0","sha":"defe7bf0a70415898d245d9d02b703585780f951","kind":"tag","published_at":"2021-08-17T11:23:12.000Z","download_url":"https://codeload.github.com/dry-python/classes/tar.gz/0.4.0","html_url":"https://github.com/dry-python/classes/releases/tag/0.4.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/dry-python/classes@0.4.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.4.0/manifests"},{"name":"0.3.0","sha":"4f79d9db2ff71127a109344f09d608adbd108638","kind":"tag","published_at":"2021-06-20T08:10:53.000Z","download_url":"https://codeload.github.com/dry-python/classes/tar.gz/0.3.0","html_url":"https://github.com/dry-python/classes/releases/tag/0.3.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/dry-python/classes@0.3.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.3.0/manifests"},{"name":"0.2.0","sha":"ef8302631ea2034f5badc8e3ad2e7070d9e600fa","kind":"tag","published_at":"2021-02-16T21:25:02.000Z","download_url":"https://codeload.github.com/dry-python/classes/tar.gz/0.2.0","html_url":"https://github.com/dry-python/classes/releases/tag/0.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/dry-python/classes@0.2.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.2.0/manifests"},{"name":"0.1.0","sha":"588b19de91d43d6b08b3adc2c3a4618632414310","kind":"tag","published_at":"2019-10-31T09:50:21.000Z","download_url":"https://codeload.github.com/dry-python/classes/tar.gz/0.1.0","html_url":"https://github.com/dry-python/classes/releases/tag/0.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/dry-python/classes@0.1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.1.0/manifests"}]},"repo_metadata_updated_at":"2025-08-29T19:14:14.982Z","dependent_packages_count":5,"downloads":21886,"downloads_period":"last-month","dependent_repos_count":34,"rankings":{"downloads":2.932249012084073,"dependent_repos_count":2.5059966693658042,"dependent_packages_count":1.579259943895215,"stargazers_count":2.477375997556226,"forks_count":7.997517899761336,"docker_downloads_count":null,"average":3.498479904532531},"purl":"pkg:pypi/classes","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/pypi/classes","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/pypi/classes","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/pypi/classes/dependencies","status":null,"funding_links":["https://github.com/sponsors/dry-python","https://opencollective.com/dry-python","https://boosty.to/sobolevn"],"critical":null,"issue_metadata":{"last_synced_at":"2025-08-29T19:14:14.847Z","issues_count":6,"pull_requests_count":107,"avg_time_to_close_issue":8222082.0,"avg_time_to_close_pull_request":1134047.206521739,"issues_closed_count":1,"pull_requests_closed_count":92,"pull_request_authors_count":10,"issue_authors_count":3,"avg_comments_per_issue":1.5,"avg_comments_per_pull_request":0.7570093457943925,"merged_pull_requests_count":57,"bot_issues_count":0,"bot_pull_requests_count":95,"past_year_issues_count":4,"past_year_pull_requests_count":6,"past_year_avg_time_to_close_issue":8222082.0,"past_year_avg_time_to_close_pull_request":15978.0,"past_year_issues_closed_count":1,"past_year_pull_requests_closed_count":3,"past_year_pull_request_authors_count":2,"past_year_issue_authors_count":1,"past_year_avg_comments_per_issue":1.0,"past_year_avg_comments_per_pull_request":1.3333333333333333,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":3,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/issues","maintainers":[{"login":"sobolevn","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/sobolevn"},{"login":"thepabloaguilar","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/thepabloaguilar"}],"active_maintainers":[]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/classes/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/classes/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/classes/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/classes/related_packages","maintainers":[{"uuid":"sobolevn","login":"sobolevn","name":null,"email":null,"url":null,"packages_count":43,"html_url":"https://pypi.org/user/sobolevn/","role":null,"created_at":"2023-02-22T23:15:05.659Z","updated_at":"2023-02-22T23:15:05.659Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers/sobolevn/packages"},{"uuid":"thepabloaguilar","login":"thepabloaguilar","name":null,"email":null,"url":null,"packages_count":4,"html_url":"https://pypi.org/user/thepabloaguilar/","role":null,"created_at":"2023-09-18T08:19:37.242Z","updated_at":"2023-09-18T08:19:37.242Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers/thepabloaguilar/packages"}],"registry":{"name":"pypi.org","url":"https://pypi.org","ecosystem":"pypi","default":true,"packages_count":726145,"maintainers_count":308800,"namespaces_count":0,"keywords_count":238245,"github":"pypi","metadata":{"funded_packages_count":50579},"icon_url":"https://github.com/pypi.png","created_at":"2022-04-04T15:19:23.364Z","updated_at":"2025-09-08T05:32:36.857Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/namespaces"}},{"id":2721188,"name":"effects","ecosystem":"pypi","description":"Smart, pythonic, ad-hoc, typed polymorphism for Python","homepage":"https://classes.readthedocs.io","licenses":"BSD-2-Clause","normalized_licenses":["BSD-2-Clause"],"repository_url":"https://github.com/dry-python/classes","keywords_array":["functional programming","fp","type class","typeclass","typeclasses","ad-hoc","composition","type-safety","mypy","stubs"],"namespace":null,"versions_count":1,"first_release_published_at":"2020-01-28T08:58:42.000Z","latest_release_published_at":"2020-01-28T08:58:42.000Z","latest_release_number":"0.0.1","last_synced_at":"2025-08-29T18:23:26.261Z","created_at":"2022-04-10T10:52:08.678Z","updated_at":"2025-08-29T19:14:15.013Z","registry_url":"https://pypi.org/project/effects/","install_command":"pip install effects --index-url https://pypi.org/simple","documentation_url":"https://effects.readthedocs.io/","metadata":{"funding":null,"documentation":null,"classifiers":["Development Status :: 4 - Beta","Intended Audience :: Developers","License :: OSI Approved :: BSD License","Operating System :: OS Independent","Programming Language :: Python :: 3","Programming Language :: Python :: 3.6","Programming Language :: Python :: 3.7","Programming Language :: Python :: 3.8","Topic :: Software Development :: Libraries :: Python Modules","Topic :: Utilities"],"normalized_name":"effects","project_status":null},"repo_metadata":{"id":36583919,"uuid":"217621930","full_name":"dry-python/classes","owner":"dry-python","description":"Smart, pythonic, ad-hoc, typed polymorphism for Python","archived":false,"fork":false,"pushed_at":"2024-12-17T05:48:30.000Z","size":902,"stargazers_count":716,"open_issues_count":37,"forks_count":29,"subscribers_count":14,"default_branch":"master","last_synced_at":"2025-08-09T23:36:50.257Z","etag":null,"topics":["fp","mypy","mypy-plugins","mypy-stubs","pep561","python","python3","typeclasses","typesafety"],"latest_commit_sha":null,"homepage":"https://classes.rtfd.io","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dry-python.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"dry-python","open_collective":"dry-python","custom":"https://boosty.to/sobolevn"}},"created_at":"2019-10-25T22:14:08.000Z","updated_at":"2025-08-06T10:41:18.000Z","dependencies_parsed_at":"2023-02-16T07:45:22.142Z","dependency_job_id":"e3cfa417-bff0-4e52-87b7-f69cc02931bb","html_url":"https://github.com/dry-python/classes","commit_stats":{"total_commits":360,"total_committers":16,"mean_commits":22.5,"dds":0.6638888888888889,"last_synced_commit":"0b958c838ee8ee683c9855cdc770a27bde29dd67"},"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/dry-python/classes","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-python","download_url":"https://codeload.github.com/dry-python/classes/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/sbom","scorecard":{"id":357223,"data":{"date":"2025-08-11","repo":{"name":"github.com/dry-python/classes","commit":"35fa4a807252f0dd7a2c09f3ebb939bcd97ebac7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Code-Review","score":5,"reason":"Found 5/9 approved changesets -- score normalized to 5","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":"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/test.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":"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":"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":"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":"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/test.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-python/classes/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-python/classes/test.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/dry-python/classes/test.yml/master?enable=pin","Warn: downloadThenRun not pinned by hash: .github/workflows/test.yml:26","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   1 downloadThenRun 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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 2-Clause \"Simplified\" 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":"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":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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":"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":"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"}},{"name":"Vulnerabilities","score":0,"reason":"24 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2023-117 / GHSA-mrwq-x4v8-fh7p","Warn: Project is vulnerable to: PYSEC-2024-230 / GHSA-248v-346w-9cwc","Warn: Project is vulnerable to: PYSEC-2023-135 / GHSA-xqr8-7jwr-rhp7","Warn: Project is vulnerable to: PYSEC-2024-4 / GHSA-2mqj-m65w-jghx","Warn: Project is vulnerable to: PYSEC-2023-165 / GHSA-cwvm-v4w8-q58c","Warn: Project is vulnerable to: PYSEC-2022-42992 / GHSA-hcpj-qp55-gfph","Warn: Project is vulnerable to: PYSEC-2023-137 / GHSA-pr76-5cm5-w9cj","Warn: Project is vulnerable to: PYSEC-2023-161 / GHSA-wfm5-v35h-vwf4","Warn: Project is vulnerable to: PYSEC-2024-60 / GHSA-jjg7-2v4v-x38h","Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7","Warn: Project is vulnerable to: GHSA-gmj6-6f8f-6699","Warn: Project is vulnerable to: GHSA-h5c8-rqwp-cp95","Warn: Project is vulnerable to: GHSA-h75v-3vvj-5mfj","Warn: Project is vulnerable to: GHSA-q2x7-8rv6-6q7h","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2023-74 / GHSA-j8r2-6x86-q33q","Warn: Project is vulnerable to: PYSEC-2025-49 / GHSA-5rjg-fvgr-3xxf","Warn: Project is vulnerable to: GHSA-cx63-2mw6-8hw5","Warn: Project is vulnerable to: GHSA-34jh-p97f-mpxf","Warn: Project is vulnerable to: PYSEC-2023-212 / GHSA-g4mx-q9vg-27p4","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: PYSEC-2023-192 / GHSA-v845-jxx5-vc9f","Warn: Project is vulnerable to: GHSA-jfmj-5v4g-7637"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T09:54:22.776Z","repository_id":36583919,"created_at":"2025-08-18T09:54:22.776Z","updated_at":"2025-08-18T09:54:22.776Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272735902,"owners_count":24984349,"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-08-29T02:00:10.610Z","response_time":87,"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-python","name":"dry-python","uuid":"37993755","kind":"organization","description":"A set of libraries for pluggable business logic components.","email":"mail@sobolevn.me","website":"https://dry-labs.github.io","location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/37993755?v=4","repositories_count":10,"last_synced_at":"2025-08-22T19:13:45.260Z","metadata":{"has_sponsors_listing":true,"funding":{"github":"dry-python","open_collective":"dry-python","custom":"https://boosty.to/sobolevn"}},"html_url":"https://github.com/dry-python","funding_links":["https://github.com/sponsors/dry-python","https://opencollective.com/dry-python","https://boosty.to/sobolevn"],"total_stars":5237,"followers":338,"following":0,"created_at":"2022-11-13T16:20:47.472Z","updated_at":"2025-08-22T19:13:45.260Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-python","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dry-python/repositories"},"tags":[{"name":"0.4.1","sha":"58aea46f107583caeea7d706e0853744214b90a4","kind":"tag","published_at":"2022-04-11T15:22:10.000Z","download_url":"https://codeload.github.com/dry-python/classes/tar.gz/0.4.1","html_url":"https://github.com/dry-python/classes/releases/tag/0.4.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/dry-python/classes@0.4.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.4.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.4.1/manifests"},{"name":"0.4.0","sha":"defe7bf0a70415898d245d9d02b703585780f951","kind":"tag","published_at":"2021-08-17T11:23:12.000Z","download_url":"https://codeload.github.com/dry-python/classes/tar.gz/0.4.0","html_url":"https://github.com/dry-python/classes/releases/tag/0.4.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/dry-python/classes@0.4.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.4.0/manifests"},{"name":"0.3.0","sha":"4f79d9db2ff71127a109344f09d608adbd108638","kind":"tag","published_at":"2021-06-20T08:10:53.000Z","download_url":"https://codeload.github.com/dry-python/classes/tar.gz/0.3.0","html_url":"https://github.com/dry-python/classes/releases/tag/0.3.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/dry-python/classes@0.3.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.3.0/manifests"},{"name":"0.2.0","sha":"ef8302631ea2034f5badc8e3ad2e7070d9e600fa","kind":"tag","published_at":"2021-02-16T21:25:02.000Z","download_url":"https://codeload.github.com/dry-python/classes/tar.gz/0.2.0","html_url":"https://github.com/dry-python/classes/releases/tag/0.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/dry-python/classes@0.2.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.2.0/manifests"},{"name":"0.1.0","sha":"588b19de91d43d6b08b3adc2c3a4618632414310","kind":"tag","published_at":"2019-10-31T09:50:21.000Z","download_url":"https://codeload.github.com/dry-python/classes/tar.gz/0.1.0","html_url":"https://github.com/dry-python/classes/releases/tag/0.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/dry-python/classes@0.1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/tags/0.1.0/manifests"}]},"repo_metadata_updated_at":"2025-08-29T19:14:15.012Z","dependent_packages_count":0,"downloads":80,"downloads_period":"last-month","dependent_repos_count":6,"rankings":{"downloads":27.50818144673181,"dependent_repos_count":6.014601104917513,"dependent_packages_count":10.082087700208083,"stargazers_count":2.4786744247775783,"forks_count":7.997517899761336,"docker_downloads_count":null,"average":10.816212515279265},"purl":"pkg:pypi/effects","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/pypi/effects","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/pypi/effects","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/pypi/effects/dependencies","status":null,"funding_links":["https://github.com/sponsors/dry-python","https://opencollective.com/dry-python","https://boosty.to/sobolevn"],"critical":null,"issue_metadata":{"last_synced_at":"2025-08-29T19:14:14.847Z","issues_count":6,"pull_requests_count":107,"avg_time_to_close_issue":8222082.0,"avg_time_to_close_pull_request":1134047.206521739,"issues_closed_count":1,"pull_requests_closed_count":92,"pull_request_authors_count":10,"issue_authors_count":3,"avg_comments_per_issue":1.5,"avg_comments_per_pull_request":0.7570093457943925,"merged_pull_requests_count":57,"bot_issues_count":0,"bot_pull_requests_count":95,"past_year_issues_count":4,"past_year_pull_requests_count":6,"past_year_avg_time_to_close_issue":8222082.0,"past_year_avg_time_to_close_pull_request":15978.0,"past_year_issues_closed_count":1,"past_year_pull_requests_closed_count":3,"past_year_pull_request_authors_count":2,"past_year_issue_authors_count":1,"past_year_avg_comments_per_issue":1.0,"past_year_avg_comments_per_pull_request":1.3333333333333333,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":3,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/issues","maintainers":[{"login":"sobolevn","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/sobolevn"},{"login":"thepabloaguilar","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/thepabloaguilar"}],"active_maintainers":[]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/effects/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/effects/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/effects/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/effects/related_packages","maintainers":[{"uuid":"sobolevn","login":"sobolevn","name":null,"email":null,"url":null,"packages_count":43,"html_url":"https://pypi.org/user/sobolevn/","role":null,"created_at":"2023-02-22T23:15:05.803Z","updated_at":"2023-02-22T23:15:05.803Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers/sobolevn/packages"}],"registry":{"name":"pypi.org","url":"https://pypi.org","ecosystem":"pypi","default":true,"packages_count":726145,"maintainers_count":308800,"namespaces_count":0,"keywords_count":238245,"github":"pypi","metadata":{"funded_packages_count":50579},"icon_url":"https://github.com/pypi.png","created_at":"2022-04-04T15:19:23.364Z","updated_at":"2025-09-08T05:32:36.857Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/namespaces"}}],"commits":{"id":549183,"full_name":"dry-python/classes","default_branch":"master","committers":[{"name":"sobolevn","email":"mail@sobolevn.me","login":"sobolevn","count":122},{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":112},{"name":"dependabot-preview[bot]","email":"27856297+dependabot-preview[bot]","login":"dependabot-preview[bot]","count":106},{"name":"Pablo Aguilar","email":"pablo.aguilar@outlook.com.br","login":"thepabloaguilar","count":8},{"name":"mikhail-akimov","email":"daggerito@gmail.com","login":"mikhail-akimov","count":3},{"name":"Maxim Ivanov","email":"41443370+ivanovmg","login":"ivanovmg","count":2},{"name":"Anton Agestam","email":"git@antonagestam.se","login":"antonagestam","count":1},{"name":"David Brochart","email":"david.brochart@gmail.com","login":"davidbrochart","count":1},{"name":"Farhad Taebi","email":"farhad.taebi@uni-dortmund.de","login":"ftaebi","count":1},{"name":"Nicholas Mobbs","email":"narakhan","login":"narakhan","count":1},{"name":"Sergey","email":"56842028+sergeycrisp","login":"sergeycrisp","count":1},{"name":"ShalokShalom","email":"shalokshalom@protonmail.ch","login":"ShalokShalom","count":1},{"name":"Vincent Poulailleau","email":"vpoulailleau@gmail.com","login":"vpoulailleau","count":1},{"name":"github-actions[bot]","email":"41898282+github-actions[bot]","login":"github-actions[bot]","count":1},{"name":"q0w","email":"43147888+q0w","login":"q0w","count":1},{"name":"Dmytro Litvinov","email":"litvinov.dmytro.it@gmail.com","login":null,"count":1}],"total_commits":363,"total_committers":16,"total_bot_commits":219,"total_bot_committers":3,"mean_commits":22.6875,"dds":0.6639118457300275,"past_year_committers":[{"name":"Maxim Ivanov","email":"41443370+ivanovmg","login":"ivanovmg","count":2},{"name":"sobolevn","email":"mail@sobolevn.me","login":"sobolevn","count":1},{"name":"David Brochart","email":"david.brochart@gmail.com","login":"davidbrochart","count":1}],"past_year_total_commits":4,"past_year_total_committers":3,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":1.3333333333333333,"past_year_dds":0.5,"last_synced_at":"2025-07-05T13:30:19.230Z","last_synced_commit":"35fa4a807252f0dd7a2c09f3ebb939bcd97ebac7","created_at":"2023-03-09T04:34:08.596Z","updated_at":"2025-07-05T13:30:19.230Z","commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2025-09-08T00:00:16.827Z","repositories_count":5483322,"commits_count":854270774,"contributors_count":31138750,"owners_count":908526,"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-python/classes","html_url":"https://github.com/dry-python/classes","last_synced_at":"2025-08-29T19:14:14.847Z","status":"error","issues_count":6,"pull_requests_count":107,"avg_time_to_close_issue":8222082.0,"avg_time_to_close_pull_request":1134047.206521739,"issues_closed_count":1,"pull_requests_closed_count":92,"pull_request_authors_count":10,"issue_authors_count":3,"avg_comments_per_issue":1.5,"avg_comments_per_pull_request":0.7570093457943925,"merged_pull_requests_count":57,"bot_issues_count":0,"bot_pull_requests_count":95,"past_year_issues_count":4,"past_year_pull_requests_count":6,"past_year_avg_time_to_close_issue":8222082.0,"past_year_avg_time_to_close_pull_request":15978.0,"past_year_issues_closed_count":1,"past_year_pull_requests_closed_count":3,"past_year_pull_request_authors_count":2,"past_year_issue_authors_count":1,"past_year_avg_comments_per_issue":1.0,"past_year_avg_comments_per_pull_request":1.3333333333333333,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":3,"created_at":"2023-05-14T10:38:00.525Z","updated_at":"2025-09-03T04:39:28.574Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/dry-python%2Fclasses/issues","issue_labels_count":{"bug":5,"documentation":1},"pull_request_labels_count":{"dependencies":94,"python":92,"github_actions":1},"issue_author_associations_count":{"CONTRIBUTOR":3,"NONE":2,"MEMBER":1},"pull_request_author_associations_count":{"CONTRIBUTOR":103,"NONE":3,"MEMBER":2},"issue_authors":{"ivanovmg":4,"zhukovgreen":1,"sobolevn":1},"pull_request_authors":{"dependabot[bot]":92,"ivanovmg":6,"davidbrochart":2,"dependabot-preview[bot]":2,"antonagestam":1,"sobolevn":1,"q0w":1,"thepabloaguilar":1,"ShalokShalom":1,"zhukovgreen":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2025-09-08T00:00:17.013Z","repositories_count":10166699,"issues_count":32013288,"pull_requests_count":100268859,"authors_count":10729412,"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":2},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{"CONTRIBUTOR":3},"past_year_pull_request_author_associations_count":{"CONTRIBUTOR":6,"NONE":2},"past_year_issue_authors":{"ivanovmg":3},"past_year_pull_request_authors":{"ivanovmg":6,"davidbrochart":2},"maintainers":[{"login":"sobolevn","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/sobolevn"},{"login":"thepabloaguilar","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/thepabloaguilar"}],"active_maintainers":[]},"events":{"total":{"IssuesEvent":4,"WatchEvent":54,"IssueCommentEvent":13,"PushEvent":2,"PullRequestReviewEvent":7,"PullRequestReviewCommentEvent":2,"PullRequestEvent":7,"ForkEvent":3},"last_year":{"IssuesEvent":4,"WatchEvent":54,"IssueCommentEvent":13,"PushEvent":2,"PullRequestReviewEvent":7,"PullRequestReviewCommentEvent":2,"PullRequestEvent":7,"ForkEvent":3}},"keywords":["fp","mypy","mypy-plugins","mypy-stubs","pep561","python","python3","typeclasses","typesafety"],"dependencies":[{"ecosystem":"actions","filepath":".github/workflows/test.yml","sha":null,"kind":"manifest","created_at":"2023-01-17T02:50:31.470Z","updated_at":"2023-01-17T02:50:31.470Z","repository_link":"https://github.com/dry-python/classes/blob/master/.github/workflows/test.yml","dependencies":[{"id":6965663678,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":6965663679,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":6965663680,"package_name":"codecov/codecov-action","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"pypi","filepath":"poetry.lock","sha":null,"kind":"lockfile","created_at":"2023-01-17T02:50:31.486Z","updated_at":"2023-01-17T02:50:31.486Z","repository_link":"https://github.com/dry-python/classes/blob/master/poetry.lock","dependencies":[{"id":6965663681,"package_name":"alabaster","ecosystem":"pypi","requirements":"0.7.12","direct":false,"kind":"develop","optional":false},{"id":6965663682,"package_name":"appdirs","ecosystem":"pypi","requirements":"1.4.4","direct":false,"kind":"develop","optional":false},{"id":6965663683,"package_name":"astor","ecosystem":"pypi","requirements":"0.8.1","direct":false,"kind":"develop","optional":false},{"id":6965663684,"package_name":"attrs","ecosystem":"pypi","requirements":"21.4.0","direct":false,"kind":"develop","optional":false},{"id":6965663685,"package_name":"autorepr","ecosystem":"pypi","requirements":"0.3.0","direct":false,"kind":"develop","optional":false},{"id":6965663686,"package_name":"babel","ecosystem":"pypi","requirements":"2.9.1","direct":false,"kind":"develop","optional":false},{"id":6965663687,"package_name":"bandit","ecosystem":"pypi","requirements":"1.7.4","direct":false,"kind":"develop","optional":false},{"id":6965663688,"package_name":"beartype","ecosystem":"pypi","requirements":"0.10.4","direct":false,"kind":"develop","optional":false},{"id":6965663689,"package_name":"cattrs","ecosystem":"pypi","requirements":"1.10.0","direct":false,"kind":"develop","optional":false},{"id":6965663690,"package_name":"certifi","ecosystem":"pypi","requirements":"2022.12.7","direct":false,"kind":"develop","optional":false},{"id":6965663691,"package_name":"charset-normalizer","ecosystem":"pypi","requirements":"2.0.12","direct":false,"kind":"develop","optional":false},{"id":6965663692,"package_name":"chevron","ecosystem":"pypi","requirements":"0.14.0","direct":false,"kind":"develop","optional":false},{"id":6965663693,"package_name":"click","ecosystem":"pypi","requirements":"8.1.2","direct":false,"kind":"develop","optional":false},{"id":6965663694,"package_name":"codespell","ecosystem":"pypi","requirements":"2.2.1","direct":false,"kind":"develop","optional":false},{"id":6965663695,"package_name":"colorama","ecosystem":"pypi","requirements":"0.4.5","direct":false,"kind":"develop","optional":false},{"id":6965663696,"package_name":"configupdater","ecosystem":"pypi","requirements":"3.1","direct":false,"kind":"develop","optional":false},{"id":6965663697,"package_name":"coverage","ecosystem":"pypi","requirements":"6.4.4","direct":false,"kind":"develop","optional":false},{"id":6965663698,"package_name":"darglint","ecosystem":"pypi","requirements":"1.8.1","direct":false,"kind":"develop","optional":false},{"id":6965663699,"package_name":"decorator","ecosystem":"pypi","requirements":"5.1.1","direct":false,"kind":"develop","optional":false},{"id":6965663700,"package_name":"dictdiffer","ecosystem":"pypi","requirements":"0.9.0","direct":false,"kind":"develop","optional":false},{"id":6965663701,"package_name":"doc8","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"develop","optional":false},{"id":6965663702,"package_name":"docutils","ecosystem":"pypi","requirements":"0.19","direct":false,"kind":"develop","optional":false},{"id":6965663703,"package_name":"dparse","ecosystem":"pypi","requirements":"0.6.2","direct":false,"kind":"develop","optional":false},{"id":6965663704,"package_name":"dpath","ecosystem":"pypi","requirements":"2.0.6","direct":false,"kind":"develop","optional":false},{"id":6965663705,"package_name":"eradicate","ecosystem":"pypi","requirements":"2.1.0","direct":false,"kind":"develop","optional":false},{"id":6965663706,"package_name":"exceptiongroup","ecosystem":"pypi","requirements":"1.1.0","direct":false,"kind":"develop","optional":false},{"id":6965663707,"package_name":"flake8","ecosystem":"pypi","requirements":"3.9.2","direct":false,"kind":"develop","optional":false},{"id":6965663708,"package_name":"flake8-bandit","ecosystem":"pypi","requirements":"3.0.0","direct":false,"kind":"develop","optional":false},{"id":6965663709,"package_name":"flake8-broken-line","ecosystem":"pypi","requirements":"0.5.0","direct":false,"kind":"develop","optional":false},{"id":6965663710,"package_name":"flake8-bugbear","ecosystem":"pypi","requirements":"22.9.23","direct":false,"kind":"develop","optional":false},{"id":6965663711,"package_name":"flake8-commas","ecosystem":"pypi","requirements":"2.1.0","direct":false,"kind":"develop","optional":false},{"id":6965663712,"package_name":"flake8-comprehensions","ecosystem":"pypi","requirements":"3.8.0","direct":false,"kind":"develop","optional":false},{"id":6965663713,"package_name":"flake8-debugger","ecosystem":"pypi","requirements":"4.0.0","direct":false,"kind":"develop","optional":false},{"id":6965663714,"package_name":"flake8-docstrings","ecosystem":"pypi","requirements":"1.6.0","direct":false,"kind":"develop","optional":false},{"id":6965663715,"package_name":"flake8-eradicate","ecosystem":"pypi","requirements":"1.2.0","direct":false,"kind":"develop","optional":false},{"id":6965663716,"package_name":"flake8-isort","ecosystem":"pypi","requirements":"4.1.1","direct":false,"kind":"develop","optional":false},{"id":6965663717,"package_name":"flake8-plugin-utils","ecosystem":"pypi","requirements":"1.3.2","direct":false,"kind":"develop","optional":false},{"id":6965663718,"package_name":"flake8-polyfill","ecosystem":"pypi","requirements":"1.0.2","direct":false,"kind":"develop","optional":false},{"id":6965663719,"package_name":"flake8-pytest-style","ecosystem":"pypi","requirements":"1.6.0","direct":false,"kind":"develop","optional":false},{"id":6965663720,"package_name":"flake8-quotes","ecosystem":"pypi","requirements":"3.3.1","direct":false,"kind":"develop","optional":false},{"id":6965663721,"package_name":"flake8-rst-docstrings","ecosystem":"pypi","requirements":"0.2.5","direct":false,"kind":"develop","optional":false},{"id":6965663722,"package_name":"flake8-string-format","ecosystem":"pypi","requirements":"0.3.0","direct":false,"kind":"develop","optional":false},{"id":6965663723,"package_name":"flatten-dict","ecosystem":"pypi","requirements":"0.4.2","direct":false,"kind":"develop","optional":false},{"id":6965663724,"package_name":"furl","ecosystem":"pypi","requirements":"2.1.3","direct":false,"kind":"develop","optional":false},{"id":6965663725,"package_name":"gitdb","ecosystem":"pypi","requirements":"4.0.9","direct":false,"kind":"develop","optional":false},{"id":6965663726,"package_name":"gitpython","ecosystem":"pypi","requirements":"3.1.27","direct":false,"kind":"develop","optional":false},{"id":6965663727,"package_name":"identify","ecosystem":"pypi","requirements":"2.4.12","direct":false,"kind":"develop","optional":false},{"id":6965663728,"package_name":"idna","ecosystem":"pypi","requirements":"3.3","direct":false,"kind":"develop","optional":false},{"id":6965663729,"package_name":"imagesize","ecosystem":"pypi","requirements":"1.3.0","direct":false,"kind":"develop","optional":false},{"id":6965663730,"package_name":"importlib-metadata","ecosystem":"pypi","requirements":"4.11.3","direct":false,"kind":"develop","optional":false},{"id":6965663731,"package_name":"importlib-resources","ecosystem":"pypi","requirements":"5.6.0","direct":false,"kind":"develop","optional":false},{"id":6965663732,"package_name":"iniconfig","ecosystem":"pypi","requirements":"1.1.1","direct":false,"kind":"develop","optional":false},{"id":6965663733,"package_name":"isort","ecosystem":"pypi","requirements":"5.10.1","direct":false,"kind":"develop","optional":false},{"id":6965663734,"package_name":"jinja2","ecosystem":"pypi","requirements":"3.1.1","direct":false,"kind":"develop","optional":false},{"id":6965663735,"package_name":"jmespath","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"develop","optional":false},{"id":6965663736,"package_name":"loguru","ecosystem":"pypi","requirements":"0.6.0","direct":false,"kind":"develop","optional":false},{"id":6965663737,"package_name":"m2r2","ecosystem":"pypi","requirements":"0.3.3","direct":false,"kind":"develop","optional":false},{"id":6965663738,"package_name":"markupsafe","ecosystem":"pypi","requirements":"2.1.1","direct":false,"kind":"develop","optional":false},{"id":6965663739,"package_name":"marshmallow","ecosystem":"pypi","requirements":"3.15.0","direct":false,"kind":"develop","optional":false},{"id":6965663740,"package_name":"marshmallow-polyfield","ecosystem":"pypi","requirements":"5.10","direct":false,"kind":"develop","optional":false},{"id":6965663741,"package_name":"mccabe","ecosystem":"pypi","requirements":"0.6.1","direct":false,"kind":"develop","optional":false},{"id":6965663742,"package_name":"mistune","ecosystem":"pypi","requirements":"0.8.4","direct":false,"kind":"develop","optional":false},{"id":6965663743,"package_name":"more-itertools","ecosystem":"pypi","requirements":"8.12.0","direct":false,"kind":"develop","optional":false},{"id":6965663744,"package_name":"mypy","ecosystem":"pypi","requirements":"0.942","direct":false,"kind":"develop","optional":false},{"id":6965663745,"package_name":"mypy-extensions","ecosystem":"pypi","requirements":"0.4.3","direct":false,"kind":"develop","optional":false},{"id":6965663746,"package_name":"nitpick","ecosystem":"pypi","requirements":"0.32.0","direct":false,"kind":"develop","optional":false},{"id":6965663747,"package_name":"numerary","ecosystem":"pypi","requirements":"0.3.0","direct":false,"kind":"develop","optional":false},{"id":6965663748,"package_name":"numerary","ecosystem":"pypi","requirements":"0.4.2","direct":false,"kind":"develop","optional":false},{"id":6965663749,"package_name":"orderedmultidict","ecosystem":"pypi","requirements":"1.0.1","direct":false,"kind":"develop","optional":false},{"id":6965663750,"package_name":"packaging","ecosystem":"pypi","requirements":"21.3","direct":false,"kind":"develop","optional":false},{"id":6965663751,"package_name":"pbr","ecosystem":"pypi","requirements":"5.8.1","direct":false,"kind":"develop","optional":false},{"id":6965663752,"package_name":"pep8-naming","ecosystem":"pypi","requirements":"0.13.2","direct":false,"kind":"develop","optional":false},{"id":6965663753,"package_name":"phantom-types","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"develop","optional":false},{"id":6965663754,"package_name":"pluggy","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"develop","optional":false},{"id":6965663755,"package_name":"pycodestyle","ecosystem":"pypi","requirements":"2.7.0","direct":false,"kind":"develop","optional":false},{"id":6965663756,"package_name":"pydocstyle","ecosystem":"pypi","requirements":"6.1.1","direct":false,"kind":"develop","optional":false},{"id":6965663757,"package_name":"pyflakes","ecosystem":"pypi","requirements":"2.3.1","direct":false,"kind":"develop","optional":false},{"id":6965663758,"package_name":"Pygments","ecosystem":"pypi","requirements":"2.13.0","direct":false,"kind":"develop","optional":false},{"id":6965663759,"package_name":"pyparsing","ecosystem":"pypi","requirements":"3.0.8","direct":false,"kind":"develop","optional":false},{"id":6965663760,"package_name":"pytest","ecosystem":"pypi","requirements":"7.2.0","direct":false,"kind":"develop","optional":false},{"id":6965663761,"package_name":"pytest-cov","ecosystem":"pypi","requirements":"4.0.0","direct":false,"kind":"develop","optional":false},{"id":6965663762,"package_name":"pytest-mypy-plugins","ecosystem":"pypi","requirements":"1.9.3","direct":false,"kind":"develop","optional":false},{"id":6965663763,"package_name":"pytest-randomly","ecosystem":"pypi","requirements":"3.12.0","direct":false,"kind":"develop","optional":false},{"id":6965663764,"package_name":"python-slugify","ecosystem":"pypi","requirements":"6.1.1","direct":false,"kind":"develop","optional":false},{"id":6965663765,"package_name":"pytz","ecosystem":"pypi","requirements":"2022.1","direct":false,"kind":"develop","optional":false},{"id":6965663766,"package_name":"pyyaml","ecosystem":"pypi","requirements":"6.0","direct":false,"kind":"develop","optional":false},{"id":6965663767,"package_name":"regex","ecosystem":"pypi","requirements":"2022.3.15","direct":false,"kind":"develop","optional":false},{"id":6965663768,"package_name":"requests","ecosystem":"pypi","requirements":"2.27.1","direct":false,"kind":"develop","optional":false},{"id":6965663769,"package_name":"requests-cache","ecosystem":"pypi","requirements":"0.9.3","direct":false,"kind":"develop","optional":false},{"id":6965663770,"package_name":"restructuredtext-lint","ecosystem":"pypi","requirements":"1.4.0","direct":false,"kind":"develop","optional":false},{"id":6965663771,"package_name":"ruamel.yaml","ecosystem":"pypi","requirements":"0.17.21","direct":false,"kind":"develop","optional":false},{"id":6965663772,"package_name":"ruamel.yaml.clib","ecosystem":"pypi","requirements":"0.2.6","direct":false,"kind":"develop","optional":false},{"id":6965663773,"package_name":"safety","ecosystem":"pypi","requirements":"2.3.5","direct":false,"kind":"develop","optional":false},{"id":6965663774,"package_name":"setuptools","ecosystem":"pypi","requirements":"65.5.1","direct":false,"kind":"develop","optional":false},{"id":6965663775,"package_name":"six","ecosystem":"pypi","requirements":"1.16.0","direct":false,"kind":"develop","optional":false},{"id":6965663776,"package_name":"smmap","ecosystem":"pypi","requirements":"5.0.0","direct":false,"kind":"develop","optional":false},{"id":6965663777,"package_name":"snowballstemmer","ecosystem":"pypi","requirements":"2.2.0","direct":false,"kind":"develop","optional":false},{"id":6965663778,"package_name":"sortedcontainers","ecosystem":"pypi","requirements":"2.4.0","direct":false,"kind":"develop","optional":false},{"id":6965663779,"package_name":"sphinx","ecosystem":"pypi","requirements":"5.3.0","direct":false,"kind":"develop","optional":false},{"id":6965663780,"package_name":"sphinx-autodoc-typehints","ecosystem":"pypi","requirements":"1.20.0","direct":false,"kind":"develop","optional":false},{"id":6965663781,"package_name":"sphinx-typlog-theme","ecosystem":"pypi","requirements":"0.8.0","direct":false,"kind":"develop","optional":false},{"id":6965663782,"package_name":"sphinxcontrib-applehelp","ecosystem":"pypi","requirements":"1.0.2","direct":false,"kind":"develop","optional":false},{"id":6965663783,"package_name":"sphinxcontrib-devhelp","ecosystem":"pypi","requirements":"1.0.2","direct":false,"kind":"develop","optional":false},{"id":6965663784,"package_name":"sphinxcontrib-htmlhelp","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"develop","optional":false},{"id":6965663785,"package_name":"sphinxcontrib-jsmath","ecosystem":"pypi","requirements":"1.0.1","direct":false,"kind":"develop","optional":false},{"id":6965663786,"package_name":"sphinxcontrib-mermaid","ecosystem":"pypi","requirements":"0.7.1","direct":false,"kind":"develop","optional":false},{"id":6965663787,"package_name":"sphinxcontrib-qthelp","ecosystem":"pypi","requirements":"1.0.3","direct":false,"kind":"develop","optional":false},{"id":6965663788,"package_name":"sphinxcontrib-serializinghtml","ecosystem":"pypi","requirements":"1.1.5","direct":false,"kind":"develop","optional":false},{"id":6965663789,"package_name":"stevedore","ecosystem":"pypi","requirements":"3.5.0","direct":false,"kind":"develop","optional":false},{"id":6965663790,"package_name":"strenum","ecosystem":"pypi","requirements":"0.4.7","direct":false,"kind":"develop","optional":false},{"id":6965663791,"package_name":"testfixtures","ecosystem":"pypi","requirements":"6.18.5","direct":false,"kind":"develop","optional":false},{"id":6965663792,"package_name":"text-unidecode","ecosystem":"pypi","requirements":"1.3","direct":false,"kind":"develop","optional":false},{"id":6965663793,"package_name":"toml","ecosystem":"pypi","requirements":"0.10.2","direct":false,"kind":"develop","optional":false},{"id":6965663794,"package_name":"tomli","ecosystem":"pypi","requirements":"2.0.1","direct":false,"kind":"develop","optional":false},{"id":6965663795,"package_name":"tomlkit","ecosystem":"pypi","requirements":"0.11.6","direct":false,"kind":"develop","optional":false},{"id":6965663796,"package_name":"typed-ast","ecosystem":"pypi","requirements":"1.5.2","direct":false,"kind":"develop","optional":false},{"id":6965663797,"package_name":"typeguard","ecosystem":"pypi","requirements":"2.13.3","direct":false,"kind":"develop","optional":false},{"id":6965663798,"package_name":"typing-extensions","ecosystem":"pypi","requirements":"4.3.0","direct":false,"kind":"runtime","optional":false},{"id":6965663799,"package_name":"url-normalize","ecosystem":"pypi","requirements":"1.4.3","direct":false,"kind":"develop","optional":false},{"id":6965663800,"package_name":"urllib3","ecosystem":"pypi","requirements":"1.26.9","direct":false,"kind":"develop","optional":false},{"id":6965663801,"package_name":"wemake-python-styleguide","ecosystem":"pypi","requirements":"0.17.0","direct":false,"kind":"develop","optional":false},{"id":6965663802,"package_name":"win32-setctime","ecosystem":"pypi","requirements":"1.1.0","direct":false,"kind":"develop","optional":false},{"id":6965663803,"package_name":"zipp","ecosystem":"pypi","requirements":"3.8.0","direct":false,"kind":"develop","optional":false}]},{"ecosystem":"pypi","filepath":"pyproject.toml","sha":null,"kind":"manifest","created_at":"2023-01-17T02:50:31.545Z","updated_at":"2023-01-17T02:50:31.545Z","repository_link":"https://github.com/dry-python/classes/blob/master/pyproject.toml","dependencies":[{"id":6965663804,"package_name":"python","ecosystem":"pypi","requirements":"^3.7","direct":true,"kind":"runtime","optional":false},{"id":6965663805,"package_name":"typing_extensions","ecosystem":"pypi","requirements":"\u003e=3.10,\u003c5.0","direct":true,"kind":"runtime","optional":false},{"id":6965663806,"package_name":"mypy","ecosystem":"pypi","requirements":"^0.942","direct":true,"kind":"develop","optional":false},{"id":6965663807,"package_name":"wemake-python-styleguide","ecosystem":"pypi","requirements":"^0.17","direct":true,"kind":"develop","optional":false},{"id":6965663808,"package_name":"flake8-pytest-style","ecosystem":"pypi","requirements":"^1.6","direct":true,"kind":"develop","optional":false},{"id":6965663809,"package_name":"nitpick","ecosystem":"pypi","requirements":"^0.32","direct":true,"kind":"develop","optional":false},{"id":6965663810,"package_name":"safety","ecosystem":"pypi","requirements":"^2.3","direct":true,"kind":"develop","optional":false},{"id":6965663811,"package_name":"pytest","ecosystem":"pypi","requirements":"^7.2","direct":true,"kind":"develop","optional":false},{"id":6965663812,"package_name":"pytest-cov","ecosystem":"pypi","requirements":"^4.0","direct":true,"kind":"develop","optional":false},{"id":6965663813,"package_name":"pytest-randomly","ecosystem":"pypi","requirements":"^3.12","direct":true,"kind":"develop","optional":false},{"id":6965663814,"package_name":"pytest-mypy-plugins","ecosystem":"pypi","requirements":"^1.9","direct":true,"kind":"develop","optional":false},{"id":6965663815,"package_name":"sphinx","ecosystem":"pypi","requirements":"^5.2","direct":true,"kind":"develop","optional":false},{"id":6965663816,"package_name":"sphinx-autodoc-typehints","ecosystem":"pypi","requirements":"^1.20","direct":true,"kind":"develop","optional":false},{"id":6965663817,"package_name":"sphinxcontrib-mermaid","ecosystem":"pypi","requirements":"^0.7","direct":true,"kind":"develop","optional":false},{"id":6965663818,"package_name":"sphinx-typlog-theme","ecosystem":"pypi","requirements":"^0.8","direct":true,"kind":"develop","optional":false},{"id":6965663819,"package_name":"doc8","ecosystem":"pypi","requirements":"^1.0","direct":true,"kind":"develop","optional":false},{"id":6965663820,"package_name":"m2r2","ecosystem":"pypi","requirements":"^0.3","direct":true,"kind":"develop","optional":false},{"id":6965663821,"package_name":"tomlkit","ecosystem":"pypi","requirements":"^0.11","direct":true,"kind":"develop","optional":false},{"id":6965663822,"package_name":"codespell","ecosystem":"pypi","requirements":"^2.2","direct":true,"kind":"develop","optional":false},{"id":6965663823,"package_name":"phantom-types","ecosystem":"pypi","requirements":"^1.0","direct":true,"kind":"develop","optional":false}]}],"score":19.396042416953005,"created_at":"2025-09-08T11:18:39.198Z","updated_at":"2025-10-07T08:25:00.863Z","avatar_url":"https://github.com/dry-python.png","language":"Python","category":null,"sub_category":null,"monthly_downloads":21966,"funding_links":["https://github.com/sponsors/dry-python","https://opencollective.com/dry-python","https://boosty.to/sobolevn"],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["python39","python313","python312","python311","python310","pydantic","parsing","json-schema","standards","hints"],"project_url":"https://science.ecosyste.ms/api/v1/projects/65712","html_url":"https://science.ecosyste.ms/projects/65712"}