{"id":28250002,"url":"https://github.com/shenxianpeng/py-eol","last_synced_at":"2026-03-02T11:01:59.345Z","repository":{"id":291484834,"uuid":"973330860","full_name":"shenxianpeng/py-eol","owner":"shenxianpeng","description":"Check if a Python version is End-Of-Life (EOL)","archived":false,"fork":false,"pushed_at":"2026-03-01T03:27:27.000Z","size":57,"stargazers_count":3,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-01T06:49:45.769Z","etag":null,"topics":["end-of-life","end-of-life-libs","eol","eols","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shenxianpeng.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"shenxianpeng"}},"created_at":"2025-04-26T18:55:21.000Z","updated_at":"2026-03-01T03:27:28.000Z","dependencies_parsed_at":"2025-09-16T20:35:59.124Z","dependency_job_id":"a15e21ba-8b0c-46c6-a06b-1b3235bf9388","html_url":"https://github.com/shenxianpeng/py-eol","commit_stats":null,"previous_names":["shenxianpeng/python-eol","shenxianpeng/py-eol"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/shenxianpeng/py-eol","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shenxianpeng%2Fpy-eol","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shenxianpeng%2Fpy-eol/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shenxianpeng%2Fpy-eol/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shenxianpeng%2Fpy-eol/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shenxianpeng","download_url":"https://codeload.github.com/shenxianpeng/py-eol/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shenxianpeng%2Fpy-eol/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29999221,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-02T09:59:02.300Z","status":"ssl_error","status_checked_at":"2026-03-02T09:59:02.001Z","response_time":60,"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":["end-of-life","end-of-life-libs","eol","eols","python"],"created_at":"2025-05-19T13:16:17.984Z","updated_at":"2026-03-02T11:01:59.335Z","avatar_url":"https://github.com/shenxianpeng.png","language":"Python","funding_links":["https://github.com/sponsors/shenxianpeng"],"categories":[],"sub_categories":[],"readme":"# py-eol\n\n[![main](https://github.com/shenxianpeng/py-eol/actions/workflows/ci.yml/badge.svg)](https://github.com/shenxianpeng/py-eol/actions/workflows/ci.yml)\n[![PyPI - Version](https://img.shields.io/pypi/v/py-eol)](https://pypi.org/project/py-eol/)\n[![codecov](https://codecov.io/gh/shenxianpeng/py-eol/graph/badge.svg?token=7B23E012SN)](https://codecov.io/gh/shenxianpeng/py-eol)\n\nCheck if a Python version is **End-Of-Life (EOL)**.\n\n## Table of Contents\n\n- [Why py-eol?](#why-py-eol)\n- [Installation](#installation)\n- [Usage](#usage)\n  - [As a Python module](#as-a-python-module)\n  - [As a CLI tool](#as-a-cli-tool)\n  - [As a pre-commit hook](#as-a-pre-commit-hook)\n- [License](#license)\n\n## Why py-eol?\n\n* Programmatically check if a Python version is supported or EOL\n* Works both as a Python module and a CLI tool\n* Useful for local checks, automation scripts, and CI/CD pipelines\n* Helps teams avoid using unsupported Python versions\n\n## Installation\n\n```bash\npip install py-eol\n```\n\n## Usage\n\n### As a Python module\n\n```python\nfrom py_eol import is_eol, get_eol_date, supported_versions, eol_versions, latest_supported_version\n\nprint(is_eol(\"3.7\")) # True\nprint(get_eol_date(\"3.8\")) # 2024-10-07\nprint(supported_versions()) # ['3.14', '3.13', '3.12', '3.11', '3.10', '3.9']\nprint(eol_versions()) # ['3.8', '3.7', '3.6', '3.5', '3.4', '3.3', '3.2', '2.7', '3.1', '3.0', '2.6']\nprint(latest_supported_version()) # 3.14\n```\n\n### As a CLI tool\n\n```\npy-eol --help\nusage: py-eol [-h] [--version] {versions,files,list,check-self,refresh} ...\n\nCheck if a Python version is EOL (End Of Life).\n\npositional arguments:\n  {versions,files,list,check-self,refresh}\n                        sub-command help\n    versions            Check specific Python versions\n    files               Check files for Python versions\n    list                List all supported Python versions\n    check-self          Check the current Python interpreter version\n    refresh             Refresh the EOL data from endoflife.date\n\noptions:\n  -h, --help            show this help message and exit\n  --version             Show the version of the tool\n```\n\nExamples\n\n```bash\n# Check a specific version\npy-eol versions 3.9\n\n# Check multiple versions\npy-eol versions 3.7 3.8 3.11\n\n# Check files for EOL Python versions (shows file:line information)\npy-eol files pyproject.toml setup.py .github/workflows/ci.yml\n\n# Check current Python interpreter\npy-eol check-self\n\n# List all currently supported versions\npy-eol list\n\n# Output result in JSON format\npy-eol versions 3.8 3.9 --json\n\n# Refresh the latest EOL data\npy-eol refresh\n```\n\n### As a pre-commit hook\n\n\u003e [!NOTE]\n\u003e This hook checks Python versions specified in pyproject.toml, setup.py, and GitHub Actions workflow files.\n\u003e When an EOL version is found, it reports the exact file and line number for easy identification.\n\nTo use `py-eol` as a pre-commit hook, you can add the following configuration to your `.pre-commit-config.yaml` file:\n\n```yaml\nrepos:\n  - repo: https://github.com/shenxianpeng/py-eol\n    rev:  # Use the ref you want to point at\n    hooks:\n      - id: py-eol\n```\n\nExample output:\n\n```\nCheck Python version EOL.................................................Failed\n- hook id: py-eol\n- exit code: 1\n\npyproject.toml:9: ⚠️ Python 3.7 is already EOL since 2023-06-27\n.github/workflows/ci.yml:16: ⚠️ Python 3.9 is already EOL since 2025-10-31\n```\n\n## License\n\n[MIT License](https://github.com/shenxianpeng/py-eol/blob/main/LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshenxianpeng%2Fpy-eol","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshenxianpeng%2Fpy-eol","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshenxianpeng%2Fpy-eol/lists"}