{"id":34045537,"url":"https://github.com/open-nudge/cogeol","last_synced_at":"2026-04-02T01:01:21.707Z","repository":{"id":300379300,"uuid":"1006025740","full_name":"open-nudge/cogeol","owner":"open-nudge","description":"Align projects with supported Python versions - automated with endoflife.date","archived":false,"fork":false,"pushed_at":"2025-07-13T13:40:38.000Z","size":10170,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-05T22:54:46.601Z","etag":null,"topics":["automation","endoflife-date","eol","github-actions","pyproject","python","tooling"],"latest_commit_sha":null,"homepage":"https://open-nudge.github.io/cogeol","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/open-nudge.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":"CODEOWNERS","security":"SECURITY-DEPENDENCY.md","support":"SUPPORT.md","governance":"GOVERNANCE.md","roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":"DCO.md","cla":null}},"created_at":"2025-06-21T10:20:08.000Z","updated_at":"2025-09-14T09:39:47.000Z","dependencies_parsed_at":"2025-09-05T10:19:33.525Z","dependency_job_id":"5a11fd57-8735-43c1-ad23-fb4f8425b663","html_url":"https://github.com/open-nudge/cogeol","commit_stats":null,"previous_names":["open-nudge/cogeol"],"tags_count":6,"template":false,"template_full_name":"open-nudge/opentemplate","purl":"pkg:github/open-nudge/cogeol","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-nudge%2Fcogeol","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-nudge%2Fcogeol/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-nudge%2Fcogeol/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-nudge%2Fcogeol/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/open-nudge","download_url":"https://codeload.github.com/open-nudge/cogeol/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-nudge%2Fcogeol/sbom","scorecard":{"id":1237050,"data":{"date":"2025-08-30T03:14:31Z","repo":{"name":"github.com/open-nudge/cogeol","commit":"43897bac2de3837c77495e4f21d647c358099329"},"scorecard":{"version":"v5.2.1","commit":"ab2f6e92482462fe66246d9e32f642855a691dc1"},"score":6.5,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/9 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/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#code-review"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#security-policy"}},{"name":"Maintained","score":0,"reason":"project was created within the last 90 days. Please review its contents carefully","details":["Warn: Repository was created within the last 90 days."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#maintained"}},{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: RenovateBot: .github/renovate.json:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#dependency-update-tool"}},{"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/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#binary-artifacts"}},{"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/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":7,"reason":"dependency not pinned by hash detected -- score normalized to 7","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/cache-item-reusable.yml:94: update your workflow using https://app.stepsecurity.io/secureworkflow/open-nudge/cogeol/cache-item-reusable.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pre-commit-reusable.yml:63: update your workflow using https://app.stepsecurity.io/secureworkflow/open-nudge/cogeol/pre-commit-reusable.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pre-commit-reusable.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/open-nudge/cogeol/pre-commit-reusable.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pre-commit-reusable.yml:100: update your workflow using https://app.stepsecurity.io/secureworkflow/open-nudge/cogeol/pre-commit-reusable.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-sbom-run-reusable.yml:187: update your workflow using https://app.stepsecurity.io/secureworkflow/open-nudge/cogeol/release-sbom-run-reusable.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-sbom-run-reusable.yml:191: update your workflow using https://app.stepsecurity.io/secureworkflow/open-nudge/cogeol/release-sbom-run-reusable.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-sbom-run-reusable.yml:200: update your workflow using https://app.stepsecurity.io/secureworkflow/open-nudge/cogeol/release-sbom-run-reusable.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-sbom-run-reusable.yml:205: update your workflow using https://app.stepsecurity.io/secureworkflow/open-nudge/cogeol/release-sbom-run-reusable.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-sboms-reusable.yml:204: update your workflow using https://app.stepsecurity.io/secureworkflow/open-nudge/cogeol/release-sboms-reusable.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/run-reusable.yml:188: update your workflow using https://app.stepsecurity.io/secureworkflow/open-nudge/cogeol/run-reusable.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/run-reusable.yml:192: update your workflow using https://app.stepsecurity.io/secureworkflow/open-nudge/cogeol/run-reusable.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/run-reusable.yml:200: update your workflow using https://app.stepsecurity.io/secureworkflow/open-nudge/cogeol/run-reusable.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/security-osv-scanner-reusable.yml:80: update your workflow using https://app.stepsecurity.io/secureworkflow/open-nudge/cogeol/security-osv-scanner-reusable.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/security-semgrep-reusable.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/open-nudge/cogeol/security-semgrep-reusable.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/security-semgrep-reusable.yml:78: update your workflow using https://app.stepsecurity.io/secureworkflow/open-nudge/cogeol/security-semgrep-reusable.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/security-semgrep-reusable.yml:88: update your workflow using https://app.stepsecurity.io/secureworkflow/open-nudge/cogeol/security-semgrep-reusable.yml/main?enable=pin","Info:  34 out of  34 GitHub-owned GitHubAction dependencies pinned","Info:  29 out of  45 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/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":10,"reason":"GitHub workflow tokens follow principle of least privilege","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/cache-item-reusable.yml:59","Info: jobLevel 'contents' permission set to 'read': .github/workflows/cache-reusable.yml:62","Info: jobLevel 'contents' permission set to 'read': .github/workflows/cache-reusable.yml:77","Info: jobLevel 'contents' permission set to 'read': .github/workflows/cache-test.yml:28","Info: jobLevel 'contents' permission set to 'read': .github/workflows/cache.yml:29","Info: jobLevel 'contents' permission set to 'read': .github/workflows/citation-renovate.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/citation-reusable.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/citation.yml:33","Info: jobLevel 'contents' permission set to 'read': .github/workflows/code-renovate.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/code-reusable.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/code.yml:34","Info: jobLevel 'contents' permission set to 'read': .github/workflows/commit-renovate.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/commit-reusable.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/commit.yml:28","Info: jobLevel 'contents' permission set to 'read': .github/workflows/docs-renovate.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/docs-reusable.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/docs.yml:36","Info: jobLevel 'contents' permission set to 'read': .github/workflows/github-actionlint.yml:32","Info: jobLevel 'contents' permission set to 'read': .github/workflows/github-actions-reusable.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/github-actions.yml:27","Info: jobLevel 'contents' permission set to 'read': .github/workflows/github-all-renovate.yml:30","Info: jobLevel 'contents' permission set to 'read': .github/workflows/github-all-renovate.yml:41","Info: jobLevel 'contents' permission set to 'read': .github/workflows/github-all-renovate.yml:52","Info: jobLevel 'contents' permission set to 'read': .github/workflows/github-all-renovate.yml:63","Info: jobLevel 'contents' permission set to 'read': .github/workflows/github-renovate-reusable.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/github-renovate.yml:28","Info: jobLevel 'contents' permission set to 'read': .github/workflows/github-reusable.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/github-workflows-reusable.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/github-workflows.yml:25","Info: jobLevel 'contents' permission set to 'read': .github/workflows/github.yml:26","Info: jobLevel 'contents' permission set to 'read': .github/workflows/harden.yml:38","Info: jobLevel 'actions' permission set to 'read': .github/workflows/harden.yml:323","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/harden.yml:325","Info: jobLevel 'contents' permission set to 'read': .github/workflows/harden.yml:327","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ini-renovate.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ini-reusable.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ini.yml:34","Info: jobLevel 'contents' permission set to 'read': .github/workflows/legal-renovate.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/legal-reusable.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/legal.yml:28","Info: jobLevel 'contents' permission set to 'read': .github/workflows/markdown-renovate.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/markdown-reusable.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/markdown.yml:36","Info: jobLevel 'contents' permission set to 'read': .github/workflows/policy.yml:32","Info: jobLevel 'contents' permission set to 'read': .github/workflows/pre-commit-config.yml:32","Info: jobLevel 'contents' permission set to 'read': .github/workflows/pre-commit-hooks.yml:32","Info: jobLevel 'contents' permission set to 'read': .github/workflows/pre-commit-reusable.yml:24","Info: jobLevel 'contents' permission set to 'read': .github/workflows/pre-commit-update.yml:25","Info: jobLevel 'contents' permission set to 'read': .github/workflows/pre-commit.yml:29","Info: jobLevel 'contents' permission set to 'read': .github/workflows/prose.yml:36","Info: jobLevel 'pull-requests' permission set to 'read': .github/workflows/pull-request.yml:34","Info: jobLevel 'contents' permission set to 'read': .github/workflows/pyproject-renovate.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/pyproject-reusable.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/pyproject.yml:33","Info: jobLevel 'contents' permission set to 'read': .github/workflows/python-renovate.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/python-reusable.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/python.yml:33","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release-check-renovate.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release-check-reusable.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release-check.yml:28","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/release-sarifs-reusable.yml:26","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release-sarifs-reusable.yml:28","Info: jobLevel 'actions' permission set to 'read': .github/workflows/release-sarifs-reusable.yml:24","Info: jobLevel 'actions' permission set to 'read': .github/workflows/release-sarifs-reusable.yml:41","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/release-sarifs-reusable.yml:43","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release-sarifs-reusable.yml:45","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release-sbom-run-reusable.yml:94","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release-sboms-reusable.yml:180","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release-sboms-reusable.yml:19","Info: found token with 'none' permissions: .github/workflows/release-sboms-reusable.yml:1","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release-sboms-reusable.yml:114","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release-sboms-test.yml:29","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release-slsa-provenance-reusable.yml:32","Info: jobLevel 'actions' permission set to 'read': .github/workflows/release-slsa-provenance-reusable.yml:79","Info: jobLevel 'actions' permission set to 'read': .github/workflows/release-slsa-provenance-test.yml:30","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/release-slsa-provenance-test.yml:31","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/release-upload.yml:23","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/release.yml:64","Info: jobLevel 'actions' permission set to 'read': .github/workflows/release.yml:239","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/release.yml:240","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release.yml:32","Info: jobLevel 'actions' permission set to 'read': .github/workflows/release.yml:42","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/release.yml:44","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release.yml:46","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release.yml:94","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release.yml:114","Info: jobLevel 'pull-requests' permission set to 'read': .github/workflows/release.yml:115","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/release.yml:253","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release.yml:54","Info: jobLevel 'contents' permission set to 'read': .github/workflows/renovate.yml:26","Info: jobLevel 'contents' permission set to 'read': .github/workflows/run-check-reusable.yml:68","Info: jobLevel 'contents' permission set to 'read': .github/workflows/run-reusable.yml:114","Info: jobLevel 'contents' permission set to 'read': .github/workflows/security-osv-scanner-reusable.yml:43","Info: jobLevel 'actions' permission set to 'read': .github/workflows/security-osv-scanner-reusable.yml:39","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/security-osv-scanner-reusable.yml:41","Info: jobLevel 'actions' permission set to 'read': .github/workflows/security-osv-scanner-update.yml:21","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/security-osv-scanner-update.yml:23","Info: jobLevel 'contents' permission set to 'read': .github/workflows/security-osv-scanner-update.yml:25","Info: jobLevel 'actions' permission set to 'read': .github/workflows/security-osv-scanner.yml:29","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/security-osv-scanner.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/security-osv-scanner.yml:33","Info: jobLevel 'actions' permission set to 'read': .github/workflows/security-scorecard-reusable.yml:35","Info: jobLevel 'contents' permission set to 'read': .github/workflows/security-scorecard-reusable.yml:39","Info: jobLevel 'contents' permission set to 'read': .github/workflows/security-scorecard-test.yml:33","Info: jobLevel 'actions' permission set to 'read': .github/workflows/security-scorecard-test.yml:29","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/security-scorecard-test.yml:31","Info: jobLevel 'actions' permission set to 'read': .github/workflows/security-scorecard-update.yml:21","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/security-scorecard-update.yml:23","Info: jobLevel 'contents' permission set to 'read': .github/workflows/security-scorecard-update.yml:25","Info: jobLevel 'contents' permission set to 'read': .github/workflows/security-secrets.yml:24","Info: jobLevel 'actions' permission set to 'read': .github/workflows/security-semgrep-renovate.yml:29","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/security-semgrep-renovate.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/security-semgrep-renovate.yml:33","Info: jobLevel 'actions' permission set to 'read': .github/workflows/security-semgrep-reusable.yml:39","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/security-semgrep-reusable.yml:41","Info: jobLevel 'contents' permission set to 'read': .github/workflows/security-semgrep-reusable.yml:43","Info: jobLevel 'contents' permission set to 'read': .github/workflows/security-semgrep-update.yml:25","Info: jobLevel 'actions' permission set to 'read': .github/workflows/security-semgrep-update.yml:21","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/security-semgrep-update.yml:23","Info: jobLevel 'actions' permission set to 'read': .github/workflows/security-semgrep.yml:29","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/security-semgrep.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/security-semgrep.yml:33","Info: jobLevel 'contents' permission set to 'read': .github/workflows/shell-renovate.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/shell-reusable.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/shell.yml:33","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/template-update-reusable.yml:18","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/template-update.yml:25","Info: jobLevel 'contents' permission set to 'read': .github/workflows/tests-renovate.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/tests-reusable.yml:50","Info: jobLevel 'contents' permission set to 'read': .github/workflows/tests-reusable.yml:80","Info: jobLevel 'contents' permission set to 'read': .github/workflows/tests.yml:37","Info: jobLevel 'contents' permission set to 'read': .github/workflows/typing-renovate.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/typing-reusable.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/typing.yml:33","Info: jobLevel 'contents' permission set to 'read': .github/workflows/yaml-renovate.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/yaml-reusable.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/yaml.yml:34","Info: found token with 'none' permissions: .github/workflows/cache-item-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/cache-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/cache-test.yml:1","Info: found token with 'none' permissions: .github/workflows/cache.yml:1","Info: found token with 'none' permissions: .github/workflows/citation-renovate.yml:1","Info: found token with 'none' permissions: .github/workflows/citation-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/citation.yml:1","Info: found token with 'none' permissions: .github/workflows/code-renovate.yml:1","Info: found token with 'none' permissions: .github/workflows/code-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/code.yml:1","Info: found token with 'none' permissions: .github/workflows/commit-renovate.yml:1","Info: found token with 'none' permissions: .github/workflows/commit-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/commit.yml:1","Info: found token with 'none' permissions: .github/workflows/docs-renovate.yml:1","Info: found token with 'none' permissions: .github/workflows/docs-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/docs.yml:1","Info: found token with 'none' permissions: .github/workflows/github-actionlint.yml:1","Info: found token with 'none' permissions: .github/workflows/github-actions-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/github-actions.yml:1","Info: found token with 'none' permissions: .github/workflows/github-all-renovate.yml:1","Info: found token with 'none' permissions: .github/workflows/github-renovate-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/github-renovate.yml:1","Info: found token with 'none' permissions: .github/workflows/github-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/github-workflows-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/github-workflows.yml:1","Info: found token with 'none' permissions: .github/workflows/github.yml:1","Info: found token with 'none' permissions: .github/workflows/harden.yml:1","Info: found token with 'none' permissions: .github/workflows/ini-renovate.yml:1","Info: found token with 'none' permissions: .github/workflows/ini-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/ini.yml:1","Info: found token with 'none' permissions: .github/workflows/labeler.yml:1","Info: found token with 'none' permissions: .github/workflows/legal-renovate.yml:1","Info: found token with 'none' permissions: .github/workflows/legal-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/legal.yml:1","Info: found token with 'none' permissions: .github/workflows/markdown-renovate.yml:1","Info: found token with 'none' permissions: .github/workflows/markdown-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/markdown.yml:1","Info: found token with 'none' permissions: .github/workflows/policy.yml:1","Info: found token with 'none' permissions: .github/workflows/pre-commit-config.yml:1","Info: found token with 'none' permissions: .github/workflows/pre-commit-hooks.yml:1","Info: found token with 'none' permissions: .github/workflows/pre-commit-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/pre-commit-update.yml:1","Info: found token with 'none' permissions: .github/workflows/pre-commit.yml:1","Info: found token with 'none' permissions: .github/workflows/prose.yml:1","Info: found token with 'none' permissions: .github/workflows/pull-request.yml:1","Info: found token with 'none' permissions: .github/workflows/pyproject-renovate.yml:1","Info: found token with 'none' permissions: .github/workflows/pyproject-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/pyproject.yml:1","Info: found token with 'none' permissions: .github/workflows/python-renovate.yml:1","Info: found token with 'none' permissions: .github/workflows/python-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/python.yml:1","Info: found token with 'none' permissions: .github/workflows/release-check-renovate.yml:1","Info: found token with 'none' permissions: .github/workflows/release-check-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/release-check.yml:1","Info: found token with 'none' permissions: .github/workflows/release-sarifs-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/release-sbom-attest-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/release-sbom-run-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/release-sboms-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/release-sboms-test.yml:1","Info: found token with 'none' permissions: .github/workflows/release-slsa-provenance-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/release-slsa-provenance-test.yml:1","Info: found token with 'none' permissions: .github/workflows/release-upload.yml:1","Info: found token with 'none' permissions: .github/workflows/release.yml:1","Info: found token with 'none' permissions: .github/workflows/renovate.yml:1","Info: found token with 'none' permissions: .github/workflows/run-check-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/run-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/security-osv-scanner-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/security-osv-scanner-update.yml:1","Info: found token with 'none' permissions: .github/workflows/security-osv-scanner.yml:1","Info: found token with 'none' permissions: .github/workflows/security-scorecard-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/security-scorecard-test.yml:1","Info: found token with 'none' permissions: .github/workflows/security-scorecard-update.yml:1","Info: found token with 'none' permissions: .github/workflows/security-secrets.yml:1","Info: found token with 'none' permissions: .github/workflows/security-semgrep-renovate.yml:1","Info: found token with 'none' permissions: .github/workflows/security-semgrep-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/security-semgrep-update.yml:1","Info: found token with 'none' permissions: .github/workflows/security-semgrep.yml:1","Info: found token with 'none' permissions: .github/workflows/shell-renovate.yml:1","Info: found token with 'none' permissions: .github/workflows/shell-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/shell.yml:1","Info: found token with 'none' permissions: .github/workflows/stale.yml:1","Info: found token with 'none' permissions: .github/workflows/template-update-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/template-update.yml:1","Info: found token with 'none' permissions: .github/workflows/tests-renovate.yml:1","Info: found token with 'none' permissions: .github/workflows/tests-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/tests.yml:1","Info: found token with 'none' permissions: .github/workflows/typing-renovate.yml:1","Info: found token with 'none' permissions: .github/workflows/typing-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/typing.yml:1","Info: found token with 'none' permissions: .github/workflows/yaml-renovate.yml:1","Info: found token with 'none' permissions: .github/workflows/yaml-reusable.yml:1","Info: found token with 'none' permissions: .github/workflows/yaml.yml:1"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#token-permissions"}},{"name":"Signed-Releases","score":10,"reason":"2 out of the last 2 releases have a total of 2 signed artifacts.","details":["Info: provenance for release artifact: attestation-sbom-github-43897bac2de3837c77495e4f21d647c358099329.intoto.jsonl: https://github.com/open-nudge/cogeol/releases/tag/v0.1.6","Info: provenance for release artifact: attestation-sbom-github-b48a64bb4fafce40edfbcba489dc906b1a660468.intoto.jsonl: https://github.com/open-nudge/cogeol/releases/tag/v0.1.4"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#signed-releases"}},{"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/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#fuzzing"}},{"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/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#cii-best-practices"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#license"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/release.yml:135"],"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/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#packaging"}},{"name":"Branch-Protection","score":3,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Warn: 'branch protection settings apply to administrators' is disabled on branch 'main'","Info: 'stale review dismissal' is required to merge on branch 'main'","Warn: branch 'main' does not require approvers","Info: codeowner review is required on branch 'main'","Warn: 'last push approval' is disabled on branch 'main'","Warn: no status checks found to merge onto branch 'main'","Info: PRs are required in order to make changes on 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/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-9548-qrrj-x5pj"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 7 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#sast"}},{"name":"Contributors","score":3,"reason":"project has 1 contributing companies or organizations -- score normalized to 3","details":["Info: found contributions from: open-nudge"],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#contributors"}},{"name":"CI-Tests","score":10,"reason":"7 out of 7 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#ci-tests"}}]},"last_synced_at":"2025-09-05T10:32:24.264Z","repository_id":300379300,"created_at":"2025-09-05T10:32:24.264Z","updated_at":"2025-09-05T10:32:24.264Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31293629,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T21:15:39.731Z","status":"ssl_error","status_checked_at":"2026-04-01T21:15:34.046Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","endoflife-date","eol","github-actions","pyproject","python","tooling"],"created_at":"2025-12-13T23:13:05.749Z","updated_at":"2026-04-02T01:01:21.682Z","avatar_url":"https://github.com/open-nudge.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!--\nSPDX-FileCopyrightText: © 2025 open-nudge \u003chttps://github.com/open-nudge\u003e\nSPDX-FileContributor: szymonmaszke \u003cgithub@maszke.co\u003e\n\nSPDX-License-Identifier: Apache-2.0\n--\u003e\n\n# cogeol\n\n\u003c!-- mkdocs remove start --\u003e\n\n\u003c!-- vale off --\u003e\n\n\u003c!-- pyml disable-num-lines 30 line-length--\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cem\u003eAlign with supported Python versions - automated with endoflife.date\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n\u003ca href=\"https://pypi.org/project/cogeol\"\u003e![PyPI - Python Version](https://img.shields.io/pypi/v/cogeol?style=for-the-badge\u0026label=release\u0026labelColor=grey\u0026color=blue)\n\u003c/a\u003e\n\u003ca href=\"https://pypi.org/project/cogeol\"\u003e![Python Version from PEP 621 TOML](https://img.shields.io/python/required-version-toml?tomlFilePath=https%3A%2F%2Fraw.githubusercontent.com%2Fopen-nudge%2Fcogeol%2Fmain%2Fpyproject.toml\u0026style=for-the-badge\u0026label=python\u0026labelColor=grey\u0026color=blue)\n\u003c/a\u003e\n\u003ca href=\"https://opensource.org/licenses/Apache-2.0\"\u003e![License](https://img.shields.io/badge/License-Apache_2.0-blue?style=for-the-badge)\n\u003c/a\u003e\n\u003ca\u003e![Coverage Hardcoded](https://img.shields.io/badge/coverage-100%25-green?style=for-the-badge)\n\u003c/a\u003e\n\u003ca href=\"https://scorecard.dev/viewer/?uri=github.com/open-nudge/cogeol\"\u003e![OSSF-Scorecard Score](https://img.shields.io/ossf-scorecard/github.com/open-nudge/cogeol?style=for-the-badge\u0026label=OSSF)\n\u003c/a\u003e\n\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n✨ \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e\n🚀 \u003ca href=\"#quick-start\"\u003eQuick start\u003c/a\u003e\n📚 \u003ca href=\"https://open-nudge.github.io/cogeol\"\u003eDocumentation\u003c/a\u003e\n🤝 \u003ca href=\"#contribute\"\u003eContribute\u003c/a\u003e\n👍 \u003ca href=\"https://github.com/open-nudge/cogeol/blob/main/ADOPTERS.md\"\u003eAdopters\u003c/a\u003e\n📜 \u003ca href=\"#legal\"\u003eLegal\u003c/a\u003e\n\u003c/p\u003e\n\u003c!-- vale on --\u003e\n\n______________________________________________________________________\n\n\u003c!-- mkdocs remove end --\u003e\n\n## Features\n\n__cogeol__ is a library which allows you to:\n\n- __Works with any file format__ (e.g. updating Python versions in CI/CD tests)\n- __No need to track Python EOL dates__ — cogeol does it for you\n- __Align with [Scientific Python SPEC0](https://scientific-python.org/specs/spec-0000/)__:\n    `cogeol` will allow you to align your project to the three latest\n    supported Python versions\n- __Caching__: retrieves data from https://endoflife.date/\n    and stores it locally to minimize network requests\n- __Based on [cog](https://github.com/nedbat/cog)__: Manage versions of Python\n    by statically generated code (see examples below!)\n\n## Quick start\n\n### Installation\n\n```sh\n\u003e pip install cogeol\n```\n\n### Usage\n\n\u003e [!TIP]\n\u003e Check out the [documentation](https://open-nudge.github.io/cogeol)\n\u003e for all available functionalities and public-facing API.\n\n1. Open `pyproject.toml` of your project\n    and find __necessary to have `requires-python` field__.\n1. Update it as follows (__comments are crucial!__):\n\n```toml\n# [[[cog\n# import cog\n# import cogeol\n#\n# cycle = cogeol.scientific()[-1][\"cycle\"]\n# cog.out(f'requires-python = \"\u003e={cycle}\"')\n# ]]]\nrequires-python = \"\u003e=3.9\"\n# [[[end]]]\n```\n\nNow run the following from the command line:\n\n```sh\n\u003e cog -c -r pyproject.toml\n```\n\n__Now your `requires-python` field will be updated to the\nlatest supported Python version!__\n\nFor example (Python `3.11` is the latest supported version\nat the time of writing):\n\n```toml\n# [[[cog\n# import cog\n# import cogeol\n#\n# cycle = cogeol.scientific()[-1][\"cycle\"]\n# cog.out(f'requires-python = \"\u003e={cycle}\"')\n# ]]]\nrequires-python = \"\u003e=3.11\"\n# [[[end]]] (sum: uZEo+p96oZ)\n```\n\n\u003e [!NOTE]\n\u003e Please notice a checksum, which verifies consistency\n\u003e of the changes at each run\n\n### Examples\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003e\u003cbig\u003eSpecifying Python version classifiers\u003c/big\u003e\u003c/b\u003e (click me)\u003c/summary\u003e\n\u0026nbsp;\n\nYou can automate the classifiers in your `pyproject.toml` file like this:\n\n```toml\n# [[[cog\n# import cog\n# import cogeol\n#\n# for version in reversed(cogeol.scientific()):\n#     cycle = version[\"cycle\"]\n#     cog.outl(f'  \"Programming Language :: Python :: {cycle}\",')\n# ]]]\n\"Programming Language :: Python :: 3.11\",\n# [[[end]]]\n```\n\nNow run the following from the command line:\n\n```sh\n\u003e cog -c -r pyproject.toml\n```\n\nand you should see the following (__notice all versions are present!__):\n\n```toml\n# [[[cog\n# import cog\n# import cogeol\n#\n# for version in reversed(cogeol.scientific()):\n#     cycle = version[\"cycle\"]\n#     cog.outl(f'  \"Programming Language :: Python :: {cycle}\",')\n# ]]]\n\"Programming Language :: Python :: 3.11\",\n\"Programming Language :: Python :: 3.12\",\n\"Programming Language :: Python :: 3.13\",\n# [[[end]]] (sum: FeG7grp2Dw)\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003e\u003cbig\u003eCaching\u003c/big\u003e\u003c/b\u003e (click me)\u003c/summary\u003e\n\u0026nbsp;\n\nLet's assume you have the following code snippet in `github-workflow.yml`:\n\n```yaml\n...\njobs:\n  tests-reusable:\n    strategy:\n      matrix:\n        python:\n          #\n          #           DO NOT EDIT UNTIL end marker\n          #\n          # [[[cog\n          # import cog\n          # import cogeol\n          #\n          # for version in reversed(cogeol.scientific()):\n          #     cycle = version['cycle']\n          #     cog.outl(f'          - \"{cycle}\"')\n          # ]]]\n          - \"3.11\"\n          # [[[end]]] (sum: l3d2zGv79j)\n```\n\nin addition to your code in `pyproject.toml` using `cogeol`.\n\nNow, if you run:\n\n```sh\n\u003e cog -c -r pyproject.toml github-workflow.yml\n```\n\nThe following will happen:\n\n- Both files will be updated with appropriate Python versions\n- __Only one call to [End of Life Date](https://endoflife.date) will be made__\n    (the results are cached on disk)\n\nNext time you run the same command, the results will be read from the cache\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003e\u003cbig\u003eAdvanced\u003c/big\u003e\u003c/b\u003e (click me)\u003c/summary\u003e\n\u0026nbsp;\n\nFor more examples check out this project's:\n\n- `pyproject.toml` file\n    (see [here](https://github.com/open-nudge/cogeol/blob/main/pyproject.toml))\n- Tests of the last three versions in GitHub Actions workflow\n    (see [here](https://github.com/open-nudge/cogeol/blob/main/.github/workflows/tests-reusable.yml))\n\n\u003c/details\u003e\n\n\u003c!-- md-dead-link-check: off --\u003e\n\n\u003c!-- mkdocs remove start --\u003e\n\n## Contribute\n\nWe welcome your contributions! Start here:\n\n- [Code of Conduct](/CODE_OF_CONDUCT.md)\n- [Contributing Guide](/CONTRIBUTING.md)\n- [Roadmap](/ROADMAP.md)\n- [Changelog](/CHANGELOG.md)\n- [Report security vulnerabilities](/SECURITY.md)\n- [Open an Issue](https://github.com/open-nudge/cogeol/issues)\n\n## Legal\n\n- This project is licensed under the _Apache 2.0 License_ - see\n    the [LICENSE](/LICENSE.md) file for details.\n- This project is copyrighted by _open-nudge_ - the\n    appropriate copyright notice is included in each file.\n\n\u003c!-- mkdocs remove end --\u003e\n\n\u003c!-- md-dead-link-check: on --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopen-nudge%2Fcogeol","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopen-nudge%2Fcogeol","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopen-nudge%2Fcogeol/lists"}