{
  "version": "1",
  "pip_version": "26.2.1",
  "installed": [
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "requests",
        "version": "2.33.0",
        "dynamic": [
          "license-file"
        ],
        "summary": "Python HTTP for Humans.",
        "description": "# Requests\n\n[![Version](https://img.shields.io/pypi/v/requests.svg?maxAge=86400)](https://pypi.org/project/requests/)\n[![Supported Versions](https://img.shields.io/pypi/pyversions/requests.svg)](https://pypi.org/project/requests)\n[![Downloads](https://static.pepy.tech/badge/requests/month)](https://pepy.tech/project/requests)\n[![Contributors](https://img.shields.io/github/contributors/psf/requests.svg)](https://github.com/psf/requests/graphs/contributors)\n\n**Requests** is a simple, yet elegant, HTTP library.\n\n```python\n>>> import requests\n>>> r = requests.get('https://httpbin.org/basic-auth/user/pass', auth=('user', 'pass'))\n>>> r.status_code\n200\n>>> r.headers['content-type']\n'application/json; charset=utf8'\n>>> r.encoding\n'utf-8'\n>>> r.text\n'{\"authenticated\": true, ...'\n>>> r.json()\n{'authenticated': True, ...}\n```\n\nRequests allows you to send HTTP/1.1 requests extremely easily. There’s no need to manually add query strings to your URLs, or to form-encode your `PUT` & `POST` data — but nowadays, just use the `json` method!\n\nRequests is one of the most downloaded Python packages today, pulling in around `30M downloads / week`— according to GitHub, Requests is currently [depended upon](https://github.com/psf/requests/network/dependents?package_id=UGFja2FnZS01NzA4OTExNg%3D%3D) by `1,000,000+` repositories. You may certainly put your trust in this code.\n\n## Installing Requests and Supported Versions\n\nRequests is available on PyPI:\n\n```console\n$ python -m pip install requests\n```\n\nRequests officially supports Python 3.10+.\n\n## Supported Features & Best–Practices\n\nRequests is ready for the demands of building robust and reliable HTTP–speaking applications, for the needs of today.\n\n- Keep-Alive & Connection Pooling\n- International Domains and URLs\n- Sessions with Cookie Persistence\n- Browser-style TLS/SSL Verification\n- Basic & Digest Authentication\n- Familiar `dict`–like Cookies\n- Automatic Content Decompression and Decoding\n- Multi-part File Uploads\n- SOCKS Proxy Support\n- Connection Timeouts\n- Streaming Downloads\n- Automatic honoring of `.netrc`\n- Chunked HTTP Requests\n\n## API Reference and User Guide available on [Read the Docs](https://requests.readthedocs.io)\n\n[![Read the Docs](https://raw.githubusercontent.com/psf/requests/main/ext/ss.png)](https://requests.readthedocs.io)\n\n## Cloning the repository\n\nWhen cloning the Requests repository, you may need to add the `-c\nfetch.fsck.badTimezone=ignore` flag to avoid an error about a bad commit timestamp (see\n[this issue](https://github.com/psf/requests/issues/2690) for more background):\n\n```shell\ngit clone -c fetch.fsck.badTimezone=ignore https://github.com/psf/requests.git\n```\n\nYou can also apply this setting to your global Git config:\n\n```shell\ngit config --global fetch.fsck.badTimezone ignore\n```\n\n---\n\n[![Kenneth Reitz](https://raw.githubusercontent.com/psf/requests/main/ext/kr.png)](https://kennethreitz.org) [![Python Software Foundation](https://raw.githubusercontent.com/psf/requests/main/ext/psf.png)](https://www.python.org/psf)\n",
        "description_content_type": "text/markdown",
        "author_email": "Kenneth Reitz <me@kennethreitz.org>",
        "maintainer_email": "Ian Stapleton Cordasco <graffatcolmingov@gmail.com>, Nate Prewitt <nate.prewitt@gmail.com>",
        "license": "Apache-2.0",
        "license_file": [
          "LICENSE",
          "NOTICE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Environment :: Web Environment",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: Apache Software License",
          "Natural Language :: English",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: Internet :: WWW/HTTP",
          "Topic :: Software Development :: Libraries"
        ],
        "requires_dist": [
          "charset_normalizer<4,>=2",
          "idna<4,>=2.5",
          "urllib3<3,>=1.26",
          "certifi>=2023.5.7",
          "PySocks!=1.5.7,>=1.5.6; extra == \"socks\"",
          "chardet<8,>=3.0.2; extra == \"use-chardet-on-py3\"",
          "pytest-httpbin==2.1.0; extra == \"test\"",
          "pytest-cov; extra == \"test\"",
          "pytest-mock; extra == \"test\"",
          "pytest-xdist; extra == \"test\"",
          "PySocks!=1.5.7,>=1.5.6; extra == \"test\"",
          "pytest>=3; extra == \"test\""
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Documentation, https://requests.readthedocs.io",
          "Source, https://github.com/psf/requests"
        ],
        "provides_extra": [
          "security",
          "socks",
          "use-chardet-on-py3",
          "test"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/requests-2.33.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "fastapi",
        "version": "0.133.1",
        "summary": "FastAPI framework, high performance, easy to learn, fast to code, ready for production",
        "description": "<p align=\"center\">\n  <a href=\"https://fastapi.tiangolo.com\"><img src=\"https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png\" alt=\"FastAPI\"></a>\n</p>\n<p align=\"center\">\n    <em>FastAPI framework, high performance, easy to learn, fast to code, ready for production</em>\n</p>\n<p align=\"center\">\n<a href=\"https://github.com/fastapi/fastapi/actions?query=workflow%3ATest+event%3Apush+branch%3Amaster\" target=\"_blank\">\n    <img src=\"https://github.com/fastapi/fastapi/actions/workflows/test.yml/badge.svg?event=push&branch=master\" alt=\"Test\">\n</a>\n<a href=\"https://coverage-badge.samuelcolvin.workers.dev/redirect/fastapi/fastapi\" target=\"_blank\">\n    <img src=\"https://coverage-badge.samuelcolvin.workers.dev/fastapi/fastapi.svg\" alt=\"Coverage\">\n</a>\n<a href=\"https://pypi.org/project/fastapi\" target=\"_blank\">\n    <img src=\"https://img.shields.io/pypi/v/fastapi?color=%2334D058&label=pypi%20package\" alt=\"Package version\">\n</a>\n<a href=\"https://pypi.org/project/fastapi\" target=\"_blank\">\n    <img src=\"https://img.shields.io/pypi/pyversions/fastapi.svg?color=%2334D058\" alt=\"Supported Python versions\">\n</a>\n</p>\n\n---\n\n**Documentation**: <a href=\"https://fastapi.tiangolo.com\" target=\"_blank\">https://fastapi.tiangolo.com</a>\n\n**Source Code**: <a href=\"https://github.com/fastapi/fastapi\" target=\"_blank\">https://github.com/fastapi/fastapi</a>\n\n---\n\nFastAPI is a modern, fast (high-performance), web framework for building APIs with Python based on standard Python type hints.\n\nThe key features are:\n\n* **Fast**: Very high performance, on par with **NodeJS** and **Go** (thanks to Starlette and Pydantic). [One of the fastest Python frameworks available](#performance).\n* **Fast to code**: Increase the speed to develop features by about 200% to 300%. *\n* **Fewer bugs**: Reduce about 40% of human (developer) induced errors. *\n* **Intuitive**: Great editor support. <dfn title=\"also known as auto-complete, autocompletion, IntelliSense\">Completion</dfn> everywhere. Less time debugging.\n* **Easy**: Designed to be easy to use and learn. Less time reading docs.\n* **Short**: Minimize code duplication. Multiple features from each parameter declaration. Fewer bugs.\n* **Robust**: Get production-ready code. With automatic interactive documentation.\n* **Standards-based**: Based on (and fully compatible with) the open standards for APIs: <a href=\"https://github.com/OAI/OpenAPI-Specification\" class=\"external-link\" target=\"_blank\">OpenAPI</a> (previously known as Swagger) and <a href=\"https://json-schema.org/\" class=\"external-link\" target=\"_blank\">JSON Schema</a>.\n\n<small>* estimation based on tests conducted by an internal development team, building production applications.</small>\n\n## Sponsors\n\n<!-- sponsors -->\n### Keystone Sponsor\n\n<a href=\"https://fastapicloud.com\" target=\"_blank\" title=\"FastAPI Cloud. By the same team behind FastAPI. You code. We Cloud.\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/fastapicloud.png\"></a>\n\n### Gold and Silver Sponsors\n\n<a href=\"https://blockbee.io?ref=fastapi\" target=\"_blank\" title=\"BlockBee Cryptocurrency Payment Gateway\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/blockbee.png\"></a>\n<a href=\"https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge\" target=\"_blank\" title=\"Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/scalar.svg\"></a>\n<a href=\"https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge\" target=\"_blank\" title=\"Auth, user management and more for your B2B product\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/propelauth.png\"></a>\n<a href=\"https://zuplo.link/fastapi-gh\" target=\"_blank\" title=\"Zuplo: Deploy, Secure, Document, and Monetize your FastAPI\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/zuplo.png\"></a>\n<a href=\"https://liblab.com?utm_source=fastapi\" target=\"_blank\" title=\"liblab - Generate SDKs from FastAPI\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/liblab.png\"></a>\n<a href=\"https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi\" target=\"_blank\" title=\"Deploy & scale any full-stack web app on Render. Focus on building apps, not infra.\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/render.svg\"></a>\n<a href=\"https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=badge&utm_campaign=fastapi\" target=\"_blank\" title=\"Cut Code Review Time & Bugs in Half with CodeRabbit\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/coderabbit.png\"></a>\n<a href=\"https://subtotal.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=open-source\" target=\"_blank\" title=\"The Gold Standard in Retail Account Linking\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/subtotal.svg\"></a>\n<a href=\"https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi\" target=\"_blank\" title=\"Deploy enterprise applications at startup speed\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/railway.png\"></a>\n<a href=\"https://serpapi.com/?utm_source=fastapi_website\" target=\"_blank\" title=\"SerpApi: Web Search API\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/serpapi.png\"></a>\n<a href=\"https://www.greptile.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=fastapi_sponsor_page\" target=\"_blank\" title=\"Greptile: The AI Code Reviewer\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/greptile.png\"></a>\n<a href=\"https://databento.com/?utm_source=fastapi&utm_medium=sponsor&utm_content=display\" target=\"_blank\" title=\"Pay as you go for market data\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/databento.svg\"></a>\n<a href=\"https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship\" target=\"_blank\" title=\"SDKs for your API | Speakeasy\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/speakeasy.png\"></a>\n<a href=\"https://www.svix.com/\" target=\"_blank\" title=\"Svix - Webhooks as a service\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/svix.svg\"></a>\n<a href=\"https://www.stainlessapi.com/?utm_source=fastapi&utm_medium=referral\" target=\"_blank\" title=\"Stainless | Generate best-in-class SDKs\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/stainless.png\"></a>\n<a href=\"https://www.permit.io/blog/implement-authorization-in-fastapi?utm_source=github&utm_medium=referral&utm_campaign=fastapi\" target=\"_blank\" title=\"Fine-Grained Authorization for FastAPI\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/permit.png\"></a>\n<a href=\"https://www.interviewpal.com/?utm_source=fastapi&utm_medium=open-source&utm_campaign=dev-hiring\" target=\"_blank\" title=\"InterviewPal - AI Interview Coach for Engineers and Devs\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/interviewpal.png\"></a>\n<a href=\"https://dribia.com/en/\" target=\"_blank\" title=\"Dribia - Data Science within your reach\"><img src=\"https://fastapi.tiangolo.com/img/sponsors/dribia.png\"></a>\n\n<!-- /sponsors -->\n\n<a href=\"https://fastapi.tiangolo.com/fastapi-people/#sponsors\" class=\"external-link\" target=\"_blank\">Other sponsors</a>\n\n## Opinions\n\n\"_[...] I'm using **FastAPI** a ton these days. [...] I'm actually planning to use it for all of my team's **ML services at Microsoft**. Some of them are getting integrated into the core **Windows** product and some **Office** products._\"\n\n<div style=\"text-align: right; margin-right: 10%;\">Kabir Khan - <strong>Microsoft</strong> <a href=\"https://github.com/fastapi/fastapi/pull/26\" target=\"_blank\"><small>(ref)</small></a></div>\n\n---\n\n\"_We adopted the **FastAPI** library to spawn a **REST** server that can be queried to obtain **predictions**. [for Ludwig]_\"\n\n<div style=\"text-align: right; margin-right: 10%;\">Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - <strong>Uber</strong> <a href=\"https://eng.uber.com/ludwig-v0-2/\" target=\"_blank\"><small>(ref)</small></a></div>\n\n---\n\n\"_**Netflix** is pleased to announce the open-source release of our **crisis management** orchestration framework: **Dispatch**! [built with **FastAPI**]_\"\n\n<div style=\"text-align: right; margin-right: 10%;\">Kevin Glisson, Marc Vilanova, Forest Monsen - <strong>Netflix</strong> <a href=\"https://netflixtechblog.com/introducing-dispatch-da4b8a2a8072\" target=\"_blank\"><small>(ref)</small></a></div>\n\n---\n\n\"_I’m over the moon excited about **FastAPI**. It’s so fun!_\"\n\n<div style=\"text-align: right; margin-right: 10%;\">Brian Okken - <strong><a href=\"https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855\" target=\"_blank\">Python Bytes</a> podcast host</strong> <a href=\"https://x.com/brianokken/status/1112220079972728832\" target=\"_blank\"><small>(ref)</small></a></div>\n\n---\n\n\"_Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted **Hug** to be - it's really inspiring to see someone build that._\"\n\n<div style=\"text-align: right; margin-right: 10%;\">Timothy Crosley - <strong><a href=\"https://github.com/hugapi/hug\" target=\"_blank\">Hug</a> creator</strong> <a href=\"https://news.ycombinator.com/item?id=19455465\" target=\"_blank\"><small>(ref)</small></a></div>\n\n---\n\n\"_If you're looking to learn one **modern framework** for building REST APIs, check out **FastAPI** [...] It's fast, easy to use and easy to learn [...]_\"\n\n\"_We've switched over to **FastAPI** for our **APIs** [...] I think you'll like it [...]_\"\n\n<div style=\"text-align: right; margin-right: 10%;\">Ines Montani - Matthew Honnibal - <strong><a href=\"https://explosion.ai\" target=\"_blank\">Explosion AI</a> founders - <a href=\"https://spacy.io\" target=\"_blank\">spaCy</a> creators</strong> <a href=\"https://x.com/_inesmontani/status/1144173225322143744\" target=\"_blank\"><small>(ref)</small></a> - <a href=\"https://x.com/honnibal/status/1144031421859655680\" target=\"_blank\"><small>(ref)</small></a></div>\n\n---\n\n\"_If anyone is looking to build a production Python API, I would highly recommend **FastAPI**. It is **beautifully designed**, **simple to use** and **highly scalable**, it has become a **key component** in our API first development strategy and is driving many automations and services such as our Virtual TAC Engineer._\"\n\n<div style=\"text-align: right; margin-right: 10%;\">Deon Pillsbury - <strong>Cisco</strong> <a href=\"https://www.linkedin.com/posts/deonpillsbury_cisco-cx-python-activity-6963242628536487936-trAp/\" target=\"_blank\"><small>(ref)</small></a></div>\n\n---\n\n## FastAPI mini documentary\n\nThere's a <a href=\"https://www.youtube.com/watch?v=mpR8ngthqiE\" class=\"external-link\" target=\"_blank\">FastAPI mini documentary</a> released at the end of 2025, you can watch it online:\n\n<a href=\"https://www.youtube.com/watch?v=mpR8ngthqiE\" target=\"_blank\"><img src=\"https://fastapi.tiangolo.com/img/fastapi-documentary.jpg\" alt=\"FastAPI Mini Documentary\"></a>\n\n## **Typer**, the FastAPI of CLIs\n\n<a href=\"https://typer.tiangolo.com\" target=\"_blank\"><img src=\"https://typer.tiangolo.com/img/logo-margin/logo-margin-vector.svg\" style=\"width: 20%;\"></a>\n\nIf you are building a <abbr title=\"Command Line Interface\">CLI</abbr> app to be used in the terminal instead of a web API, check out <a href=\"https://typer.tiangolo.com/\" class=\"external-link\" target=\"_blank\">**Typer**</a>.\n\n**Typer** is FastAPI's little sibling. And it's intended to be the **FastAPI of CLIs**. ⌨️ 🚀\n\n## Requirements\n\nFastAPI stands on the shoulders of giants:\n\n* <a href=\"https://www.starlette.dev/\" class=\"external-link\" target=\"_blank\">Starlette</a> for the web parts.\n* <a href=\"https://docs.pydantic.dev/\" class=\"external-link\" target=\"_blank\">Pydantic</a> for the data parts.\n\n## Installation\n\nCreate and activate a <a href=\"https://fastapi.tiangolo.com/virtual-environments/\" class=\"external-link\" target=\"_blank\">virtual environment</a> and then install FastAPI:\n\n<div class=\"termy\">\n\n```console\n$ pip install \"fastapi[standard]\"\n\n---> 100%\n```\n\n</div>\n\n**Note**: Make sure you put `\"fastapi[standard]\"` in quotes to ensure it works in all terminals.\n\n## Example\n\n### Create it\n\nCreate a file `main.py` with:\n\n```Python\nfrom fastapi import FastAPI\n\napp = FastAPI()\n\n\n@app.get(\"/\")\ndef read_root():\n    return {\"Hello\": \"World\"}\n\n\n@app.get(\"/items/{item_id}\")\ndef read_item(item_id: int, q: str | None = None):\n    return {\"item_id\": item_id, \"q\": q}\n```\n\n<details markdown=\"1\">\n<summary>Or use <code>async def</code>...</summary>\n\nIf your code uses `async` / `await`, use `async def`:\n\n```Python hl_lines=\"7  12\"\nfrom fastapi import FastAPI\n\napp = FastAPI()\n\n\n@app.get(\"/\")\nasync def read_root():\n    return {\"Hello\": \"World\"}\n\n\n@app.get(\"/items/{item_id}\")\nasync def read_item(item_id: int, q: str | None = None):\n    return {\"item_id\": item_id, \"q\": q}\n```\n\n**Note**:\n\nIf you don't know, check the _\"In a hurry?\"_ section about <a href=\"https://fastapi.tiangolo.com/async/#in-a-hurry\" target=\"_blank\">`async` and `await` in the docs</a>.\n\n</details>\n\n### Run it\n\nRun the server with:\n\n<div class=\"termy\">\n\n```console\n$ fastapi dev main.py\n\n ╭────────── FastAPI CLI - Development mode ───────────╮\n │                                                     │\n │  Serving at: http://127.0.0.1:8000                  │\n │                                                     │\n │  API docs: http://127.0.0.1:8000/docs               │\n │                                                     │\n │  Running in development mode, for production use:   │\n │                                                     │\n │  fastapi run                                        │\n │                                                     │\n ╰─────────────────────────────────────────────────────╯\n\nINFO:     Will watch for changes in these directories: ['/home/user/code/awesomeapp']\nINFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)\nINFO:     Started reloader process [2248755] using WatchFiles\nINFO:     Started server process [2248757]\nINFO:     Waiting for application startup.\nINFO:     Application startup complete.\n```\n\n</div>\n\n<details markdown=\"1\">\n<summary>About the command <code>fastapi dev main.py</code>...</summary>\n\nThe command `fastapi dev` reads your `main.py` file, detects the **FastAPI** app in it, and starts a server using <a href=\"https://www.uvicorn.dev\" class=\"external-link\" target=\"_blank\">Uvicorn</a>.\n\nBy default, `fastapi dev` will start with auto-reload enabled for local development.\n\nYou can read more about it in the <a href=\"https://fastapi.tiangolo.com/fastapi-cli/\" target=\"_blank\">FastAPI CLI docs</a>.\n\n</details>\n\n### Check it\n\nOpen your browser at <a href=\"http://127.0.0.1:8000/items/5?q=somequery\" class=\"external-link\" target=\"_blank\">http://127.0.0.1:8000/items/5?q=somequery</a>.\n\nYou will see the JSON response as:\n\n```JSON\n{\"item_id\": 5, \"q\": \"somequery\"}\n```\n\nYou already created an API that:\n\n* Receives HTTP requests in the _paths_ `/` and `/items/{item_id}`.\n* Both _paths_ take `GET` <em>operations</em> (also known as HTTP _methods_).\n* The _path_ `/items/{item_id}` has a _path parameter_ `item_id` that should be an `int`.\n* The _path_ `/items/{item_id}` has an optional `str` _query parameter_ `q`.\n\n### Interactive API docs\n\nNow go to <a href=\"http://127.0.0.1:8000/docs\" class=\"external-link\" target=\"_blank\">http://127.0.0.1:8000/docs</a>.\n\nYou will see the automatic interactive API documentation (provided by <a href=\"https://github.com/swagger-api/swagger-ui\" class=\"external-link\" target=\"_blank\">Swagger UI</a>):\n\n![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png)\n\n### Alternative API docs\n\nAnd now, go to <a href=\"http://127.0.0.1:8000/redoc\" class=\"external-link\" target=\"_blank\">http://127.0.0.1:8000/redoc</a>.\n\nYou will see the alternative automatic documentation (provided by <a href=\"https://github.com/Rebilly/ReDoc\" class=\"external-link\" target=\"_blank\">ReDoc</a>):\n\n![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)\n\n## Example upgrade\n\nNow modify the file `main.py` to receive a body from a `PUT` request.\n\nDeclare the body using standard Python types, thanks to Pydantic.\n\n```Python hl_lines=\"2  7-10 23-25\"\nfrom fastapi import FastAPI\nfrom pydantic import BaseModel\n\napp = FastAPI()\n\n\nclass Item(BaseModel):\n    name: str\n    price: float\n    is_offer: bool | None = None\n\n\n@app.get(\"/\")\ndef read_root():\n    return {\"Hello\": \"World\"}\n\n\n@app.get(\"/items/{item_id}\")\ndef read_item(item_id: int, q: str | None = None):\n    return {\"item_id\": item_id, \"q\": q}\n\n\n@app.put(\"/items/{item_id}\")\ndef update_item(item_id: int, item: Item):\n    return {\"item_name\": item.name, \"item_id\": item_id}\n```\n\nThe `fastapi dev` server should reload automatically.\n\n### Interactive API docs upgrade\n\nNow go to <a href=\"http://127.0.0.1:8000/docs\" class=\"external-link\" target=\"_blank\">http://127.0.0.1:8000/docs</a>.\n\n* The interactive API documentation will be automatically updated, including the new body:\n\n![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png)\n\n* Click on the button \"Try it out\", it allows you to fill the parameters and directly interact with the API:\n\n![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png)\n\n* Then click on the \"Execute\" button, the user interface will communicate with your API, send the parameters, get the results and show them on the screen:\n\n![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png)\n\n### Alternative API docs upgrade\n\nAnd now, go to <a href=\"http://127.0.0.1:8000/redoc\" class=\"external-link\" target=\"_blank\">http://127.0.0.1:8000/redoc</a>.\n\n* The alternative documentation will also reflect the new query parameter and body:\n\n![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png)\n\n### Recap\n\nIn summary, you declare **once** the types of parameters, body, etc. as function parameters.\n\nYou do that with standard modern Python types.\n\nYou don't have to learn a new syntax, the methods or classes of a specific library, etc.\n\nJust standard **Python**.\n\nFor example, for an `int`:\n\n```Python\nitem_id: int\n```\n\nor for a more complex `Item` model:\n\n```Python\nitem: Item\n```\n\n...and with that single declaration you get:\n\n* Editor support, including:\n    * Completion.\n    * Type checks.\n* Validation of data:\n    * Automatic and clear errors when the data is invalid.\n    * Validation even for deeply nested JSON objects.\n* <dfn title=\"also known as: serialization, parsing, marshalling\">Conversion</dfn> of input data: coming from the network to Python data and types. Reading from:\n    * JSON.\n    * Path parameters.\n    * Query parameters.\n    * Cookies.\n    * Headers.\n    * Forms.\n    * Files.\n* <dfn title=\"also known as: serialization, parsing, marshalling\">Conversion</dfn> of output data: converting from Python data and types to network data (as JSON):\n    * Convert Python types (`str`, `int`, `float`, `bool`, `list`, etc).\n    * `datetime` objects.\n    * `UUID` objects.\n    * Database models.\n    * ...and many more.\n* Automatic interactive API documentation, including 2 alternative user interfaces:\n    * Swagger UI.\n    * ReDoc.\n\n---\n\nComing back to the previous code example, **FastAPI** will:\n\n* Validate that there is an `item_id` in the path for `GET` and `PUT` requests.\n* Validate that the `item_id` is of type `int` for `GET` and `PUT` requests.\n    * If it is not, the client will see a useful, clear error.\n* Check if there is an optional query parameter named `q` (as in `http://127.0.0.1:8000/items/foo?q=somequery`) for `GET` requests.\n    * As the `q` parameter is declared with `= None`, it is optional.\n    * Without the `None` it would be required (as is the body in the case with `PUT`).\n* For `PUT` requests to `/items/{item_id}`, read the body as JSON:\n    * Check that it has a required attribute `name` that should be a `str`.\n    * Check that it has a required attribute `price` that has to be a `float`.\n    * Check that it has an optional attribute `is_offer`, that should be a `bool`, if present.\n    * All this would also work for deeply nested JSON objects.\n* Convert from and to JSON automatically.\n* Document everything with OpenAPI, that can be used by:\n    * Interactive documentation systems.\n    * Automatic client code generation systems, for many languages.\n* Provide 2 interactive documentation web interfaces directly.\n\n---\n\nWe just scratched the surface, but you already get the idea of how it all works.\n\nTry changing the line with:\n\n```Python\n    return {\"item_name\": item.name, \"item_id\": item_id}\n```\n\n...from:\n\n```Python\n        ... \"item_name\": item.name ...\n```\n\n...to:\n\n```Python\n        ... \"item_price\": item.price ...\n```\n\n...and see how your editor will auto-complete the attributes and know their types:\n\n![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png)\n\nFor a more complete example including more features, see the <a href=\"https://fastapi.tiangolo.com/tutorial/\">Tutorial - User Guide</a>.\n\n**Spoiler alert**: the tutorial - user guide includes:\n\n* Declaration of **parameters** from other different places as: **headers**, **cookies**, **form fields** and **files**.\n* How to set **validation constraints** as `maximum_length` or `regex`.\n* A very powerful and easy to use **<dfn title=\"also known as components, resources, providers, services, injectables\">Dependency Injection</dfn>** system.\n* Security and authentication, including support for **OAuth2** with **JWT tokens** and **HTTP Basic** auth.\n* More advanced (but equally easy) techniques for declaring **deeply nested JSON models** (thanks to Pydantic).\n* **GraphQL** integration with <a href=\"https://strawberry.rocks\" class=\"external-link\" target=\"_blank\">Strawberry</a> and other libraries.\n* Many extra features (thanks to Starlette) as:\n    * **WebSockets**\n    * extremely easy tests based on HTTPX and `pytest`\n    * **CORS**\n    * **Cookie Sessions**\n    * ...and more.\n\n### Deploy your app (optional)\n\nYou can optionally deploy your FastAPI app to <a href=\"https://fastapicloud.com\" class=\"external-link\" target=\"_blank\">FastAPI Cloud</a>, go and join the waiting list if you haven't. 🚀\n\nIf you already have a **FastAPI Cloud** account (we invited you from the waiting list 😉), you can deploy your application with one command.\n\nBefore deploying, make sure you are logged in:\n\n<div class=\"termy\">\n\n```console\n$ fastapi login\n\nYou are logged in to FastAPI Cloud 🚀\n```\n\n</div>\n\nThen deploy your app:\n\n<div class=\"termy\">\n\n```console\n$ fastapi deploy\n\nDeploying to FastAPI Cloud...\n\n✅ Deployment successful!\n\n🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev\n```\n\n</div>\n\nThat's it! Now you can access your app at that URL. ✨\n\n#### About FastAPI Cloud\n\n**<a href=\"https://fastapicloud.com\" class=\"external-link\" target=\"_blank\">FastAPI Cloud</a>** is built by the same author and team behind **FastAPI**.\n\nIt streamlines the process of **building**, **deploying**, and **accessing** an API with minimal effort.\n\nIt brings the same **developer experience** of building apps with FastAPI to **deploying** them to the cloud. 🎉\n\nFastAPI Cloud is the primary sponsor and funding provider for the *FastAPI and friends* open source projects. ✨\n\n#### Deploy to other cloud providers\n\nFastAPI is open source and based on standards. You can deploy FastAPI apps to any cloud provider you choose.\n\nFollow your cloud provider's guides to deploy FastAPI apps with them. 🤓\n\n## Performance\n\nIndependent TechEmpower benchmarks show **FastAPI** applications running under Uvicorn as <a href=\"https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7\" class=\"external-link\" target=\"_blank\">one of the fastest Python frameworks available</a>, only below Starlette and Uvicorn themselves (used internally by FastAPI). (*)\n\nTo understand more about it, see the section <a href=\"https://fastapi.tiangolo.com/benchmarks/\" class=\"internal-link\" target=\"_blank\">Benchmarks</a>.\n\n## Dependencies\n\nFastAPI depends on Pydantic and Starlette.\n\n### `standard` Dependencies\n\nWhen you install FastAPI with `pip install \"fastapi[standard]\"` it comes with the `standard` group of optional dependencies:\n\nUsed by Pydantic:\n\n* <a href=\"https://github.com/JoshData/python-email-validator\" target=\"_blank\"><code>email-validator</code></a> - for email validation.\n\nUsed by Starlette:\n\n* <a href=\"https://www.python-httpx.org\" target=\"_blank\"><code>httpx</code></a> - Required if you want to use the `TestClient`.\n* <a href=\"https://jinja.palletsprojects.com\" target=\"_blank\"><code>jinja2</code></a> - Required if you want to use the default template configuration.\n* <a href=\"https://github.com/Kludex/python-multipart\" target=\"_blank\"><code>python-multipart</code></a> - Required if you want to support form <dfn title=\"converting the string that comes from an HTTP request into Python data\">\"parsing\"</dfn>, with `request.form()`.\n\nUsed by FastAPI:\n\n* <a href=\"https://www.uvicorn.dev\" target=\"_blank\"><code>uvicorn</code></a> - for the server that loads and serves your application. This includes `uvicorn[standard]`, which includes some dependencies (e.g. `uvloop`) needed for high performance serving.\n* `fastapi-cli[standard]` - to provide the `fastapi` command.\n    * This includes `fastapi-cloud-cli`, which allows you to deploy your FastAPI application to <a href=\"https://fastapicloud.com\" class=\"external-link\" target=\"_blank\">FastAPI Cloud</a>.\n\n### Without `standard` Dependencies\n\nIf you don't want to include the `standard` optional dependencies, you can install with `pip install fastapi` instead of `pip install \"fastapi[standard]\"`.\n\n### Without `fastapi-cloud-cli`\n\nIf you want to install FastAPI with the standard dependencies but without the `fastapi-cloud-cli`, you can install with `pip install \"fastapi[standard-no-fastapi-cloud-cli]\"`.\n\n### Additional Optional Dependencies\n\nThere are some additional dependencies you might want to install.\n\nAdditional optional Pydantic dependencies:\n\n* <a href=\"https://docs.pydantic.dev/latest/usage/pydantic_settings/\" target=\"_blank\"><code>pydantic-settings</code></a> - for settings management.\n* <a href=\"https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/\" target=\"_blank\"><code>pydantic-extra-types</code></a> - for extra types to be used with Pydantic.\n\nAdditional optional FastAPI dependencies:\n\n* <a href=\"https://github.com/ijl/orjson\" target=\"_blank\"><code>orjson</code></a> - Required if you want to use `ORJSONResponse`.\n* <a href=\"https://github.com/esnme/ultrajson\" target=\"_blank\"><code>ujson</code></a> - Required if you want to use `UJSONResponse`.\n\n## License\n\nThis project is licensed under the terms of the MIT license.\n",
        "description_content_type": "text/markdown",
        "author_email": "=?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= <tiangolo@gmail.com>",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Intended Audience :: Information Technology",
          "Intended Audience :: System Administrators",
          "Operating System :: OS Independent",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python",
          "Topic :: Internet",
          "Topic :: Software Development :: Libraries :: Application Frameworks",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Topic :: Software Development :: Libraries",
          "Topic :: Software Development",
          "Typing :: Typed",
          "Development Status :: 4 - Beta",
          "Environment :: Web Environment",
          "Framework :: AsyncIO",
          "Framework :: FastAPI",
          "Framework :: Pydantic",
          "Framework :: Pydantic :: 2",
          "Intended Audience :: Developers",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Topic :: Internet :: WWW/HTTP :: HTTP Servers",
          "Topic :: Internet :: WWW/HTTP"
        ],
        "requires_dist": [
          "starlette>=0.40.0",
          "pydantic>=2.7.0",
          "typing-extensions>=4.8.0",
          "typing-inspection>=0.4.2",
          "annotated-doc>=0.0.2",
          "fastapi-cli[standard]>=0.0.8; extra == \"standard\"",
          "httpx<1.0.0,>=0.23.0; extra == \"standard\"",
          "jinja2>=3.1.5; extra == \"standard\"",
          "python-multipart>=0.0.18; extra == \"standard\"",
          "email-validator>=2.0.0; extra == \"standard\"",
          "uvicorn[standard]>=0.12.0; extra == \"standard\"",
          "pydantic-settings>=2.0.0; extra == \"standard\"",
          "pydantic-extra-types>=2.0.0; extra == \"standard\"",
          "fastapi-cli[standard-no-fastapi-cloud-cli]>=0.0.8; extra == \"standard-no-fastapi-cloud-cli\"",
          "httpx<1.0.0,>=0.23.0; extra == \"standard-no-fastapi-cloud-cli\"",
          "jinja2>=3.1.5; extra == \"standard-no-fastapi-cloud-cli\"",
          "python-multipart>=0.0.18; extra == \"standard-no-fastapi-cloud-cli\"",
          "email-validator>=2.0.0; extra == \"standard-no-fastapi-cloud-cli\"",
          "uvicorn[standard]>=0.12.0; extra == \"standard-no-fastapi-cloud-cli\"",
          "pydantic-settings>=2.0.0; extra == \"standard-no-fastapi-cloud-cli\"",
          "pydantic-extra-types>=2.0.0; extra == \"standard-no-fastapi-cloud-cli\"",
          "fastapi-cli[standard]>=0.0.8; extra == \"all\"",
          "httpx<1.0.0,>=0.23.0; extra == \"all\"",
          "jinja2>=3.1.5; extra == \"all\"",
          "python-multipart>=0.0.18; extra == \"all\"",
          "itsdangerous>=1.1.0; extra == \"all\"",
          "pyyaml>=5.3.1; extra == \"all\"",
          "email-validator>=2.0.0; extra == \"all\"",
          "uvicorn[standard]>=0.12.0; extra == \"all\"",
          "pydantic-settings>=2.0.0; extra == \"all\"",
          "pydantic-extra-types>=2.0.0; extra == \"all\""
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Homepage, https://github.com/fastapi/fastapi",
          "Documentation, https://fastapi.tiangolo.com/",
          "Repository, https://github.com/fastapi/fastapi",
          "Issues, https://github.com/fastapi/fastapi/issues",
          "Changelog, https://fastapi.tiangolo.com/release-notes/"
        ],
        "provides_extra": [
          "standard",
          "standard-no-fastapi-cloud-cli",
          "all"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/fastapi-0.133.1.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "pydantic",
        "version": "2.13.4",
        "summary": "Data validation using Python type hints",
        "description": "# Pydantic Validation\n\n[![CI](https://img.shields.io/github/actions/workflow/status/pydantic/pydantic/ci.yml?branch=main&logo=github&label=CI)](https://github.com/pydantic/pydantic/actions?query=event%3Apush+branch%3Amain+workflow%3ACI)\n[![Coverage](https://coverage-badge.samuelcolvin.workers.dev/pydantic/pydantic.svg)](https://coverage-badge.samuelcolvin.workers.dev/redirect/pydantic/pydantic)\n[![pypi](https://img.shields.io/pypi/v/pydantic.svg)](https://pypi.python.org/pypi/pydantic)\n[![CondaForge](https://img.shields.io/conda/v/conda-forge/pydantic.svg)](https://anaconda.org/conda-forge/pydantic)\n[![downloads](https://static.pepy.tech/badge/pydantic/month)](https://pepy.tech/project/pydantic)\n[![versions](https://img.shields.io/pypi/pyversions/pydantic.svg)](https://github.com/pydantic/pydantic)\n[![license](https://img.shields.io/github/license/pydantic/pydantic.svg)](https://github.com/pydantic/pydantic/blob/main/LICENSE)\n[![Pydantic v2](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/pydantic/pydantic/main/docs/badge/v2.json)](https://docs.pydantic.dev/latest/contributing/#badges)\n[![llms.txt](https://img.shields.io/badge/llms.txt-green)](https://docs.pydantic.dev/latest/llms.txt)\n\nData validation using Python type hints.\n\nFast and extensible, Pydantic plays nicely with your linters/IDE/brain.\nDefine how data should be in pure, canonical Python 3.9+; validate it with Pydantic.\n\n## Pydantic Logfire :fire:\n\nWe've launched Pydantic Logfire to help you monitor your applications.\n[Learn more](https://pydantic.dev/logfire/?utm_source=pydantic_validation)\n\n## Pydantic V1.10 vs. V2\n\nPydantic V2 is a ground-up rewrite that offers many new features, performance improvements, and some breaking changes compared to Pydantic V1.\n\nIf you're using Pydantic V1 you may want to look at the\n[pydantic V1.10 Documentation](https://docs.pydantic.dev/) or,\n[`1.10.X-fixes` git branch](https://github.com/pydantic/pydantic/tree/1.10.X-fixes). Pydantic V2 also ships with the latest version of Pydantic V1 built in so that you can incrementally upgrade your code base and projects: `from pydantic import v1 as pydantic_v1`.\n\n## Help\n\nSee [documentation](https://docs.pydantic.dev/) for more details.\n\n## Installation\n\nInstall using `pip install -U pydantic` or `conda install pydantic -c conda-forge`.\nFor more installation options to make Pydantic even faster,\nsee the [Install](https://docs.pydantic.dev/install/) section in the documentation.\n\n## A Simple Example\n\n```python\nfrom datetime import datetime\nfrom typing import Optional\nfrom pydantic import BaseModel\n\nclass User(BaseModel):\n    id: int\n    name: str = 'John Doe'\n    signup_ts: Optional[datetime] = None\n    friends: list[int] = []\n\nexternal_data = {'id': '123', 'signup_ts': '2017-06-01 12:22', 'friends': [1, '2', b'3']}\nuser = User(**external_data)\nprint(user)\n#> User id=123 name='John Doe' signup_ts=datetime.datetime(2017, 6, 1, 12, 22) friends=[1, 2, 3]\nprint(user.id)\n#> 123\n```\n\n## Contributing\n\nFor guidance on setting up a development environment and how to make a\ncontribution to Pydantic, see\n[Contributing to Pydantic](https://docs.pydantic.dev/contributing/).\n\n## Reporting a Security Vulnerability\n\nSee our [security policy](https://github.com/pydantic/pydantic/security/policy).\n\n## Changelog\n\n<!-- markdownlint-disable no-bare-urls -->\n<!-- markdownlint-disable descriptive-link-text -->\n<!-- markdownlint-disable-next-line first-line-heading -->\n\n## v2.13.4 (2026-05-06)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.13.4)\n\n### What's Changed\n\n#### Packaging\n\n* Bump libc from 0.2.155 to 0.2.185 by [@Viicos](https://github.com/Viicos) in [#13109](https://github.com/pydantic/pydantic/pull/13109)\n* Adapt `pydantic-core` linker flags on macOS by [@washingtoneg](https://github.com/washingtoneg) and [@Viicos](https://github.com/Viicos) in [#13147](https://github.com/pydantic/pydantic/pull/13147)\n\n#### Fixes\n\n* Preserve `RootModel` core metadata by [@Viicos](https://github.com/Viicos) in [#13129](https://github.com/pydantic/pydantic/pull/13129)\n\n## v2.13.3 (2026-04-20)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.13.3)\n\n### What's Changed\n\n#### Fixes\n\n* Handle `AttributeError` subclasses with `from_attributes` by [@Viicos](https://github.com/Viicos) in [#13096](https://github.com/pydantic/pydantic/pull/13096)\n\n## v2.13.2 (2026-04-17)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.13.2)\n\n### What's Changed\n\n#### Fixes\n\n* Fix `ValidationInfo.field_name` missing with `model_validate_json()` by [@Viicos](https://github.com/Viicos) in [#13084](https://github.com/pydantic/pydantic/pull/13084)\n\n## v2.13.1 (2026-04-15)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.13.1)\n\n### What's Changed\n\n#### Fixes\n\n* Fix `ValidationInfo.data` missing with `model_validate_json()` by [@davidhewitt](https://github.com/davidhewitt) in [#13079](https://github.com/pydantic/pydantic/pull/13079)\n\n## v2.13.0 (2026-04-13)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.13.0)\n\nThe highlights of the v2.13 release are available in the [blog post](https://pydantic.dev/articles/pydantic-v2-13-release).\nSeveral minor changes (considered non-breaking changes according to our [versioning policy](https://pydantic.dev/docs/validation/2.13/get-started/version-policy/#pydantic-v2))\nare also included in this release. Make sure to look into them before upgrading.\n\nThis release contains the updated `pydantic.v1` namespace, matching version 1.10.26 which includes support for Python 3.14.\n\n### What's Changed\n\nSee the beta releases for all changes sinces 2.12.\n\n#### New Features\n\n* Allow default factories of private attributes to take validated model data by [@Viicos](https://github.com/Viicos) in [#13013](https://github.com/pydantic/pydantic/pull/13013)\n\n#### Changes\n\n* Warn when serializing fixed length tuples with too few items by [@arvindsaripalli](https://github.com/arvindsaripalli) in [#13016](https://github.com/pydantic/pydantic/pull/13016)\n\n#### Fixes\n\n* Change type of `Any` when synthesizing `_build_sources` for  `BaseSettings.__init__()` signature in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#13049](https://github.com/pydantic/pydantic/pull/13049)\n* Fix model equality when using runtime `extra` configuration by [@Viicos](https://github.com/Viicos) in [#13062](https://github.com/pydantic/pydantic/pull/13062)\n\n#### Packaging\n\n* Add zizmor for GitHub Actions workflow linting by [@Viicos](https://github.com/Viicos) in [#13039](https://github.com/pydantic/pydantic/pull/13039)\n* Update jiter to v0.14.0 to fix a segmentation fault on musl Linux by [@Viicos](https://github.com/Viicos) in [#13064](https://github.com/pydantic/pydantic/pull/13064)\n\n### New Contributors\n\n* [@arvindsaripalli](https://github.com/arvindsaripalli) made their first contribution in [#13016](https://github.com/pydantic/pydantic/pull/13016)\n\n## v2.13.0b3 (2026-03-31)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.13.0b3)\n\n### What's Changed\n\n#### New Features\n\n* Add `ascii_only` option to `StringConstraints` by [@ai-man-codes](https://github.com/ai-man-codes) in [#12907](https://github.com/pydantic/pydantic/pull/12907)\n* Support `exclude_if` in computed fields by [@andresliszt](https://github.com/andresliszt) in [#12748](https://github.com/pydantic/pydantic/pull/12748)\n* Push down constraints in unions involving `MISSING` sentinel by [@Viicos](https://github.com/Viicos) in [#12908](https://github.com/pydantic/pydantic/pull/12908)\n\n#### Changes\n\n* Track extra fields set after init in `model_fields_set` by [@navalprakhar](https://github.com/navalprakhar) in [#12817](https://github.com/pydantic/pydantic/pull/12817)\n* Do not include annotations that are not part of named tuple fields by [@galuszkak](https://github.com/galuszkak) in [#12951](https://github.com/pydantic/pydantic/pull/12951)\n* No longer fall back to trying all union members when the variant selected by discriminator fails to serialize by [@navalprakhar](https://github.com/navalprakhar) in [#12825](https://github.com/pydantic/pydantic/pull/12825)\n\n#### Fixes\n\n* Support discriminator metadata outside union type alias by [@Viicos](https://github.com/Viicos) in [#12785](https://github.com/pydantic/pydantic/pull/12785)\n* Respect `extras_schema` when only `extra_fields_behavior` is set on the config in JSON Schema generation for typed dictionaries by [@Viicos](https://github.com/Viicos) in [#12810](https://github.com/pydantic/pydantic/pull/12810)\n* Ensure `__pydantic_private__` is set in `model_construct()` with user-defined `model_post_init()` by [@nightcityblade](https://github.com/nightcityblade) in [#12816](https://github.com/pydantic/pydantic/pull/12816)\n* Handle all schema generation errors in `InstanceOf` by [@Viicos](https://github.com/Viicos) in [#12705](https://github.com/pydantic/pydantic/pull/12705)\n* Allow dynamic models created with `create_model()` to be used as annotations in the Mypy plugin by [@Br1an67](https://github.com/Br1an67) in [#12879](https://github.com/pydantic/pydantic/pull/12879)\n* Check for `PlaceholderNode` in Mypy plugin by [@Viicos](https://github.com/Viicos) in [#12929](https://github.com/pydantic/pydantic/pull/12929)\n* Try other branches in smart union in case of omit errors by [@mikeedjones](https://github.com/mikeedjones) in [#12758](https://github.com/pydantic/pydantic/pull/12758)\n* Patch unset attributes with `MISSING` during model serialization with `exclude_unset` by [@davidhewitt](https://github.com/davidhewitt) in [#12905](https://github.com/pydantic/pydantic/pull/12905)\n* Ensure custom `__init__()` is called when using `model_validate_strings()` by [@siewcapital](https://github.com/siewcapital) in [#12897](https://github.com/pydantic/pydantic/pull/12897)\n\n#### Packaging\n\n* Add riscv64 build target for manylinux by [@boosterl](https://github.com/boosterl) in [#12723](https://github.com/pydantic/pydantic/pull/12723)\n\n### New Contributors\n\n* [@kelsonbrito50](https://github.com/kelsonbrito50) made their first contribution in [#12860](https://github.com/pydantic/pydantic/pull/12860)\n* [@boosterl](https://github.com/boosterl) made their first contribution in [#12723](https://github.com/pydantic/pydantic/pull/12723)\n* [@adityagiri3600](https://github.com/adityagiri3600) made their first contribution in [#12868](https://github.com/pydantic/pydantic/pull/12868)\n* [@navalprakhar](https://github.com/navalprakhar) made their first contribution in [#12817](https://github.com/pydantic/pydantic/pull/12817)\n* [@Br1an67](https://github.com/Br1an67) made their first contribution in [#12879](https://github.com/pydantic/pydantic/pull/12879)\n* [@rmorshea](https://github.com/rmorshea) made their first contribution in [#12910](https://github.com/pydantic/pydantic/pull/12910)\n* [@N3XT3R1337](https://github.com/N3XT3R1337) made their first contribution in [#12922](https://github.com/pydantic/pydantic/pull/12922)\n* [@ai-man-codes](https://github.com/ai-man-codes) made their first contribution in [#12907](https://github.com/pydantic/pydantic/pull/12907)\n* [@Yume05-dev](https://github.com/Yume05-dev) made their first contribution in [#12953](https://github.com/pydantic/pydantic/pull/12953)\n* [@galuszkak](https://github.com/galuszkak) made their first contribution in [#12951](https://github.com/pydantic/pydantic/pull/12951)\n* [@siewcapital](https://github.com/siewcapital) made their first contribution in [#12897](https://github.com/pydantic/pydantic/pull/12897)\n\n## v2.13.0b2 (2026-02-24)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.13.0b2)\n\n### What's Changed\n\n#### Fixes\n\n* Fix backported V1 namespace by [@Viicos](https://github.com/Viicos) in [#12855](https://github.com/pydantic/pydantic/pull/12855)\n* Allow any type form to be used in `validate_as()` by [@bledden](https://github.com/bledden) in [#12846](https://github.com/pydantic/pydantic/pull/12846)\n* Fix walrus operator precedence in `UrlConstraints.__get_pydantic_core_schema__()` by [@bysiber](https://github.com/bysiber) in [#12826](https://github.com/pydantic/pydantic/pull/12826)\n\n### New Contributors\n\n* [@bledden](https://github.com/bledden) made their first contribution in [#12846](https://github.com/pydantic/pydantic/pull/12846)\n* [@bysiber](https://github.com/bysiber) made their first contribution in [#12827](https://github.com/pydantic/pydantic/pull/12827)\n\n## v2.13.0b1 (2026-02-23)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.13.0b1)\n\nThis is the first beta release of the 2.13 version, mainly providing bug fixes and performance improvements\nfor validation and serialization.\n\nNotable changes include:\n\n* Add a new `polymorphic_serialization` option, solving issues with `serialize_as_any` introduced in 2.12.\n* Latest V1.10.26 release under the `pydantic.v1` namespace. This version includes support for Python 3.14.\n* The [`pydantic-core`](https://github.com/pydantic/pydantic-core/) repository was merged inside the main `pydantic` one.\n\n### What's Changed\n\n#### New Features\n\n* Add `polymorphic_serialization` option by [@davidhewitt](https://github.com/davidhewitt) in [#12518](https://github.com/pydantic/pydantic/pull/12518)\n* Support Root models with `Literal` root types as discriminator field types by [@YassinNouh21](https://github.com/YassinNouh21) in [#12680](https://github.com/pydantic/pydantic/pull/12680)\n\n#### Changes\n\n* Migrate `pydantic-core` CI by [@Viicos](https://github.com/Viicos) in [#12752](https://github.com/pydantic/pydantic/pull/12752)\n* Import `pydantic-core` into pydantic by [@davidhewitt](https://github.com/davidhewitt) in [#12481](https://github.com/pydantic/pydantic/pull/12481)\n* Backport V1 changes up to v1.10.26 by [@Viicos](https://github.com/Viicos) in [#12663](https://github.com/pydantic/pydantic/pull/12663)\n* Use the `complex()` constructor unconditionally when validating `complex` Python data by [@tanmaymunjal](https://github.com/tanmaymunjal) in [#12498](https://github.com/pydantic/pydantic/pull/12498)\n* Add support for three-tuple input for `Decimal` by [@tanmaymunjal](https://github.com/tanmaymunjal) in [#12500](https://github.com/pydantic/pydantic/pull/12500)\n* Align `@field_serializer` logic with `@field_validator` by [@Viicos](https://github.com/Viicos) in [#12577](https://github.com/pydantic/pydantic/pull/12577)\n* Make `PydanticUserError` a `RuntimeError` instead of a `TypeError` by [@poliakovva](https://github.com/poliakovva) in [#12579](https://github.com/pydantic/pydantic/pull/12579)\n* Remove redundant serialization attempts in nested unions by [@davidhewitt](https://github.com/davidhewitt) in [#12604](https://github.com/pydantic/pydantic/pull/12604)\n* Copy `root` value when making root model shallow copies by [@YassinNouh21](https://github.com/YassinNouh21) in [#12679](https://github.com/pydantic/pydantic/pull/12679)\n* Ensure deterministic JSON schema defaults by sorting sets by [@drshvik](https://github.com/drshvik) in [#12760](https://github.com/pydantic/pydantic/pull/12760)\n\n#### Performance\n\n* Refactor `DecoratorInfos.build()` implementation by [@Viicos](https://github.com/Viicos) in [#12536](https://github.com/pydantic/pydantic/pull/12536)\n* Cache compiled regex in `pydantic-core` by [@Viicos](https://github.com/Viicos) in [#12549](https://github.com/pydantic/pydantic/pull/12549)\n* Optimize creation of `Literal` validators by [@davidhewitt](https://github.com/davidhewitt) in [#12569](https://github.com/pydantic/pydantic/pull/12569)\n* Optimize implementation of `LookupKey` by [@davidhewitt](https://github.com/davidhewitt) in [#12571](https://github.com/pydantic/pydantic/pull/12571)\n* Use python strings for field names by [@davidhewitt](https://github.com/davidhewitt) in [#12631](https://github.com/pydantic/pydantic/pull/12631)\n* Optimize datetime formatting code by [@davidhewitt](https://github.com/davidhewitt) in [#12626](https://github.com/pydantic/pydantic/pull/12626)\n* Validate JSON model data by iteration by [@davidhewitt](https://github.com/davidhewitt) in [#12550](https://github.com/pydantic/pydantic/pull/12550)\n* Optimize annotations evaluation of Pydantic models by [@Viicos](https://github.com/Viicos) in [#12681](https://github.com/pydantic/pydantic/pull/12681)\n* Optimize `FieldInfo._copy()` by [@Viicos](https://github.com/Viicos) in [#12727](https://github.com/pydantic/pydantic/pull/12727)\n\n#### Fixes\n\n* Fix `FieldInfo` rebuilding when parameterizing generic models with an `Annotated` type by [@Viicos](https://github.com/Viicos) in [#12463](https://github.com/pydantic/pydantic/pull/12463)\n* Fix nested model schema deduplication in JSON schema generation by [@marwan-alloreview](https://github.com/marwan-alloreview) in [#12494](https://github.com/pydantic/pydantic/pull/12494)\n* Fix `InitVar` being ignored when using with the `pydantic.Field()` function by [@Viicos](https://github.com/Viicos) in [#12495](https://github.com/pydantic/pydantic/pull/12495)\n* Fix support for enums with `NamedTuple` as values by [@Viicos](https://github.com/Viicos) in [#12506](https://github.com/pydantic/pydantic/pull/12506)\n* Do not delete mock validator/serializer in `rebuild_dataclass()` by [@Viicos](https://github.com/Viicos) in [#12513](https://github.com/pydantic/pydantic/pull/12513)\n* Require test suite to pass with free threading, switch back to global generic types cache by [@davidhewitt](https://github.com/davidhewitt) in [#12537](https://github.com/pydantic/pydantic/pull/12537)\n* Refactor `__pydantic_extra__` annotation handling by [@Viicos](https://github.com/Viicos) in [#12563](https://github.com/pydantic/pydantic/pull/12563)\n* Do not add claim of UUID \"safety\" provision by [@davidhewitt](https://github.com/davidhewitt) in [#12567](https://github.com/pydantic/pydantic/pull/12567)\n* Use Python hash to perform lookup in tagged union serializer by [@davidhewitt](https://github.com/davidhewitt) in [#12594](https://github.com/pydantic/pydantic/pull/12594)\n* Do not emit serialization warning `MISSING` sentinel is present in a nested model by [@Viicos](https://github.com/Viicos) in [#12635](https://github.com/pydantic/pydantic/pull/12635)\n* Do not eagerly evaluate annotations in signature logic by [@Viicos](https://github.com/Viicos) in [#12660](https://github.com/pydantic/pydantic/pull/12660)\n* Fix serialization of typed dict unions when `exclude_none` is set by [@davidhewitt](https://github.com/davidhewitt) in [#12677](https://github.com/pydantic/pydantic/pull/12677)\n* Do not reuse prebuilt serializers/validators on rebuilds by [@lmmx](https://github.com/lmmx) in [#12689](https://github.com/pydantic/pydantic/pull/12689)\n* Fix type annotation of `field_definitions` in `create_model()` by [@lehmann-hqs](https://github.com/lehmann-hqs) in [#12734](https://github.com/pydantic/pydantic/pull/12734)\n* Fix incorrect dataclass constructor signature when overriding class `kw_only` with `Field()` by [@jfadia](https://github.com/jfadia) in [#12741](https://github.com/pydantic/pydantic/pull/12741)\n* Use `typing.Union` when replacing types under Python 3.14 by [@Viicos](https://github.com/Viicos) in [#12733](https://github.com/pydantic/pydantic/pull/12733)\n* Improve ImportString error when internal imports fail by [@tsembp](https://github.com/tsembp) in [#12740](https://github.com/pydantic/pydantic/pull/12740)\n* Fix serializing complex numbers with negative zero imaginary part by [@lhnwrk](https://github.com/lhnwrk) in [#12770](https://github.com/pydantic/pydantic/pull/12770)\n* Preserve custom docstrings on stdlib dataclasses in JSON schema by [@nightcityblade](https://github.com/nightcityblade) in [#12815](https://github.com/pydantic/pydantic/pull/12815)\n\n#### Packaging\n\n* Bump Rust url dependency from 2.5.4 to 2.5.7 in `pydantic-core` by [@dependabot](https://github.com/dependabot)[bot] in [#12508](https://github.com/pydantic/pydantic/pull/12508)\n* Bump Rust minimum version to 1.88, use edition 2024 by [@davidhewitt](https://github.com/davidhewitt) and [@Viicos](https://github.com/Viicos) in [#12551](https://github.com/pydantic/pydantic/pull/12551) and [#12752](https://github.com/pydantic/pydantic/pull/12752)\n* Bump PyO3 to 0.28, jiter to 0.13 by [@davidhewitt](https://github.com/davidhewitt) in [#12767](https://github.com/pydantic/pydantic/pull/12767)\n\n### New Contributors\n\n* [@marwan-alloreview](https://github.com/marwan-alloreview) made their first contribution in [#12494](https://github.com/pydantic/pydantic/pull/12494)\n* [@tanmaymunjal](https://github.com/tanmaymunjal) made their first contribution in [#12498](https://github.com/pydantic/pydantic/pull/12498)\n* [@poliakovva](https://github.com/poliakovva) made their first contribution in [#12579](https://github.com/pydantic/pydantic/pull/12579)\n* [@lehmann-hqs](https://github.com/lehmann-hqs) made their first contribution in [#12734](https://github.com/pydantic/pydantic/pull/12734)\n* [@jfadia](https://github.com/jfadia) made their first contribution in [#12741](https://github.com/pydantic/pydantic/pull/12741)\n* [@tsembp](https://github.com/tsembp) made their first contribution in [#12740](https://github.com/pydantic/pydantic/pull/12740)\n* [@drshvik](https://github.com/drshvik) made their first contribution in [#12760](https://github.com/pydantic/pydantic/pull/12760)\n* [@lhnwrk](https://github.com/lhnwrk) made their first contribution in [#12770](https://github.com/pydantic/pydantic/pull/12770)\n* [@nightcityblade](https://github.com/nightcityblade) made their first contribution in [#12815](https://github.com/pydantic/pydantic/pull/12811)\n\n## v2.12.5 (2025-11-26)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.5)\n\nThis is the fifth 2.12 patch release, addressing an issue with the `MISSING` sentinel and providing several documentation improvements.\n\nThe next 2.13 minor release will be published in a couple weeks, and will include a new *polymorphic serialization* feature addressing\nthe remaining unexpected changes to the *serialize as any* behavior.\n\n* Fix pickle error when using `model_construct()` on a model with `MISSING` as a default value by [@ornariece](https://github.com/ornariece) in [#12522](https://github.com/pydantic/pydantic/pull/12522).\n* Several updates to the documentation by [@Viicos](https://github.com/Viicos).\n\n## v2.12.4 (2025-11-05)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.4)\n\nThis is the fourth 2.12 patch release, fixing more regressions, and reverting a change in the `build()` method\nof the [`AnyUrl` and Dsn types](https://docs.pydantic.dev/latest/api/networks/).\n\nThis patch release also fixes an issue with the serialization of IP address types, when `serialize_as_any` is used. The next patch release\nwill try to address the remaining issues with *serialize as any* behavior by introducing a new *polymorphic serialization* feature, that\nshould be used in most cases in place of *serialize as any*.\n\n* Fix issue with forward references in parent `TypedDict` classes by [@Viicos](https://github.com/Viicos) in [#12427](https://github.com/pydantic/pydantic/pull/12427).\n\n    This issue is only relevant on Python 3.14 and greater.\n\n* Exclude fields with `exclude_if` from JSON Schema required fields by [@Viicos](https://github.com/Viicos) in [#12430](https://github.com/pydantic/pydantic/pull/12430)\n* Revert URL percent-encoding of credentials in the `build()` method\n  of the [`AnyUrl` and Dsn types](https://docs.pydantic.dev/latest/api/networks/) by [@davidhewitt](https://github.com/davidhewitt) in\n  [pydantic-core#1833](https://github.com/pydantic/pydantic-core/pull/1833).\n\n    This was initially considered as a bugfix, but caused regressions and as such was fully reverted. The next release will include\n    an opt-in option to percent-encode components of the URL.\n\n* Add type inference for IP address types by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1868](https://github.com/pydantic/pydantic-core/pull/1868).\n\n    The 2.12 changes to the `serialize_as_any` behavior made it so that IP address types could not properly serialize to JSON.\n\n* Avoid getting default values from defaultdict by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1853](https://github.com/pydantic/pydantic-core/pull/1853).\n\n    This fixes a subtle regression in the validation behavior of the [`collections.defaultdict`](https://docs.python.org/3/library/collections.html#collections.defaultdict)\n    type.\n\n* Fix issue with field serializers on nested typed dictionaries by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1879](https://github.com/pydantic/pydantic-core/pull/1879).\n* Add more `pydantic-core` builds for the three-threaded version of Python 3.14 by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1864](https://github.com/pydantic/pydantic-core/pull/1864).\n\n## v2.12.3 (2025-10-17)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.3)\n\n### What's Changed\n\nThis is the third 2.12 patch release, fixing issues related to the `FieldInfo` class, and reverting a change to the supported\n[*after* model validator](https://docs.pydantic.dev/latest/concepts/validators/#model-validators) function signatures.\n\n* Raise a warning when an invalid after model validator function signature is raised by [@Viicos](https://github.com/Viicos) in [#12414](https://github.com/pydantic/pydantic/pull/12414).\n  Starting in 2.12.0, using class methods for *after* model validators raised an error, but the error wasn't raised concistently. We decided\n  to emit a deprecation warning instead.\n* Add [`FieldInfo.asdict()`](https://docs.pydantic.dev/latest/api/fields/#pydantic.fields.FieldInfo.asdict) method, improve documentation around `FieldInfo` by [@Viicos](https://github.com/Viicos) in [#12411](https://github.com/pydantic/pydantic/pull/12411).\n  This also add back support for mutations on `FieldInfo` classes, that are reused as `Annotated` metadata. **However**, note that this is still\n  *not* a supported pattern. Instead, please refer to the [added example](https://docs.pydantic.dev/latest/examples/dynamic_models/) in the documentation.\n\nThe [blog post](https://pydantic.dev/articles/pydantic-v2-12-release#changes) section on changes was also updated to document the changes related to `serialize_as_any`.\n\n## v2.12.2 (2025-10-14)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.2)\n\n### What's Changed\n\n#### Fixes\n\n* Release a new `pydantic-core` version, as a corrupted CPython 3.10 `manylinux2014_aarch64` wheel got uploaded ([pydantic-core#1843](https://github.com/pydantic/pydantic-core/pull/1843)).\n* Fix issue with recursive generic models with a parent model class by [@Viicos](https://github.com/Viicos) in [#12398](https://github.com/pydantic/pydantic/pull/12398)\n\n## v2.12.1 (2025-10-13)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.1)\n\n### What's Changed\n\nThis is the first 2.12 patch release, addressing most (but not all yet) regressions from the initial 2.12.0 release.\n\n#### Fixes\n\n* Do not evaluate annotations when inspecting validators and serializers by [@Viicos](https://github.com/Viicos) in [#12355](https://github.com/pydantic/pydantic/pull/12355)\n* Make sure `None` is converted as `NoneType` in Python 3.14 by [@Viicos](https://github.com/Viicos) in [#12370](https://github.com/pydantic/pydantic/pull/12370)\n* Backport V1 runtime warning when using Python 3.14 by [@Viicos](https://github.com/Viicos) in [#12367](https://github.com/pydantic/pydantic/pull/12367)\n* Fix error message for invalid validator signatures by [@Viicos](https://github.com/Viicos) in [#12366](https://github.com/pydantic/pydantic/pull/12366)\n* Populate field name in `ValidationInfo` for validation of default value by [@Viicos](https://github.com/Viicos) in [pydantic-core#1826](https://github.com/pydantic/pydantic-core/pull/1826)\n* Encode credentials in `MultiHostUrl` builder by [@willswire](https://github.com/willswire) in [pydantic-core#1829](https://github.com/pydantic/pydantic-core/pull/1829)\n* Respect field serializers when using `serialize_as_any` serialization flag by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1829](https://github.com/pydantic/pydantic-core/pull/1829)\n* Fix various `RootModel` serialization issues by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1836](https://github.com/pydantic/pydantic-core/pull/1836)\n\n### New Contributors\n\n* [@willswire](https://github.com/willswire) made their first contribution in [pydantic-core#1829](https://github.com/pydantic/pydantic-core/pull/1829)\n\n## v2.12.0 (2025-10-07)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.0)\n\nThis is the final 2.12 release. It features the work of 20 external contributors and provides useful new features, along with initial Python 3.14 support.\nSeveral minor changes (considered non-breaking changes according to our [versioning policy](https://docs.pydantic.dev/2.12/version-policy/#pydantic-v2))\nare also included in this release. Make sure to look into them before upgrading.\n\n**Note that Pydantic V1 is not compatible with Python 3.14 and greater**.\n\n### What's Changed\n\nSee the beta releases for all changes sinces 2.11.\n\n#### New Features\n\n* Add `extra` parameter to the validate functions by [@anvilpete](https://github.com/anvilpete) in [#12233](https://github.com/pydantic/pydantic/pull/12233)\n* Add `exclude_computed_fields` serialization option by [@Viicos](https://github.com/Viicos) in [#12334](https://github.com/pydantic/pydantic/pull/12334)\n* Add `preverse_empty_path` URL options by [@Viicos](https://github.com/Viicos) in [#12336](https://github.com/pydantic/pydantic/pull/12336)\n* Add `union_format` parameter to JSON Schema generation by [@Viicos](https://github.com/Viicos) in [#12147](https://github.com/pydantic/pydantic/pull/12147)\n* Add `__qualname__` parameter for `create_model` by [@Atry](https://github.com/Atry) in [#12001](https://github.com/pydantic/pydantic/pull/12001)\n\n#### Fixes\n\n* Do not try to infer name from lambda definitions in pipelines API by [@Viicos](https://github.com/Viicos) in [#12289](https://github.com/pydantic/pydantic/pull/12289)\n* Use proper namespace for functions in `TypeAdapter` by [@Viicos](https://github.com/Viicos) in [#12324](https://github.com/pydantic/pydantic/pull/12324)\n* Use `Any` for context type annotation in `TypeAdapter` by [@inducer](https://github.com/inducer) in [#12279](https://github.com/pydantic/pydantic/pull/12279)\n* Expose `FieldInfo` in `pydantic.fields.__all__` by [@Viicos](https://github.com/Viicos) in [#12339](https://github.com/pydantic/pydantic/pull/12339)\n* Respect `validation_alias` in `@validate_call` by [@Viicos](https://github.com/Viicos) in [#12340](https://github.com/pydantic/pydantic/pull/12340)\n* Use `Any` as context annotation in plugin API by [@Viicos](https://github.com/Viicos) in [#12341](https://github.com/pydantic/pydantic/pull/12341)\n* Use proper `stacklevel` in warnings when possible by [@Viicos](https://github.com/Viicos) in [#12342](https://github.com/pydantic/pydantic/pull/12342)\n\n#### Packaging\n\n* Update V1 copy to v1.10.24 by [@Viicos](https://github.com/Viicos) in [#12338](https://github.com/pydantic/pydantic/pull/12338)\n\n### New Contributors\n\n* [@anvilpete](https://github.com/anvilpete) made their first contribution in [#12233](https://github.com/pydantic/pydantic/pull/12233)\n* [@JonathanWindell](https://github.com/JonathanWindell) made their first contribution in [#12327](https://github.com/pydantic/pydantic/pull/12327)\n* [@inducer](https://github.com/inducer) made their first contribution in [#12279](https://github.com/pydantic/pydantic/pull/12279)\n* [@Atry](https://github.com/Atry) made their first contribution in [#12001](https://github.com/pydantic/pydantic/pull/12001)\n\n## v2.12.0b1 (2025-10-03)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.0b1)\n\nThis is the first beta release of the upcoming 2.12 release.\n\n### What's Changed\n\n#### New Features\n\n* Add support for `exclude_if` at the field level by [@andresliszt](https://github.com/andresliszt) in [#12141](https://github.com/pydantic/pydantic/pull/12141)\n* Add `ValidateAs` annotation helper by [@Viicos](https://github.com/Viicos) in [#11942](https://github.com/pydantic/pydantic/pull/11942)\n* Add configuration options for validation and JSON serialization of temporal types by [@ollz272](https://github.com/ollz272) in [#12068](https://github.com/pydantic/pydantic/pull/12068)\n* Add support for PEP 728 by [@Viicos](https://github.com/Viicos) in [#12179](https://github.com/pydantic/pydantic/pull/12179)\n* Add field name in serialization error by [@NicolasPllr1](https://github.com/NicolasPllr1) in [pydantic-core#1799](https://github.com/pydantic/pydantic-core/pull/1799)\n* Add option to preserve empty URL paths by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1789](https://github.com/pydantic/pydantic-core/pull/1789)\n\n#### Changes\n\n* Raise error if an incompatible `pydantic-core` version is installed by [@Viicos](https://github.com/Viicos) in [#12196](https://github.com/pydantic/pydantic/pull/12196)\n* Remove runtime warning for experimental features by [@Viicos](https://github.com/Viicos) in [#12265](https://github.com/pydantic/pydantic/pull/12265)\n* Warn if registering virtual subclasses on Pydantic models by [@Viicos](https://github.com/Viicos) in [#11669](https://github.com/pydantic/pydantic/pull/11669)\n\n#### Fixes\n\n* Fix `__getattr__()` behavior on Pydantic models when a property raised an `AttributeError` and extra values are present by [@raspuchin](https://github.com/raspuchin) in [#12106](https://github.com/pydantic/pydantic/pull/12106)\n* Add test to prevent regression with Pydantic models used as annotated metadata by [@Viicos](https://github.com/Viicos) in [#12133](https://github.com/pydantic/pydantic/pull/12133)\n* Allow to use property setters on Pydantic dataclasses with `validate_assignment` set by [@Viicos](https://github.com/Viicos) in [#12173](https://github.com/pydantic/pydantic/pull/12173)\n* Fix mypy v2 plugin for upcoming mypy release by [@cdce8p](https://github.com/cdce8p) in [#12209](https://github.com/pydantic/pydantic/pull/12209)\n* Respect custom title in functions JSON Schema by [@Viicos](https://github.com/Viicos) in [#11892](https://github.com/pydantic/pydantic/pull/11892)\n* Fix `ImportString` JSON serialization for objects with a `name` attribute by [@chr1sj0nes](https://github.com/chr1sj0nes) in [#12219](https://github.com/pydantic/pydantic/pull/12219)\n* Do not error on fields overridden by methods in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#12290](https://github.com/pydantic/pydantic/pull/12290)\n\n#### Packaging\n\n* Bump `pydantic-core` to v2.40.1 by [@Viicos](https://github.com/Viicos) in [#12314](https://github.com/pydantic/pydantic/pull/12314)\n\n### New Contributors\n\n* [@raspuchin](https://github.com/raspuchin) made their first contribution in [#12106](https://github.com/pydantic/pydantic/pull/12106)\n* [@chr1sj0nes](https://github.com/chr1sj0nes) made their first contribution in [#12219](https://github.com/pydantic/pydantic/pull/12219)\n\n## v2.12.0a1 (2025-07-26)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.0a1)\n\nThis is the first alpha release of the upcoming 2.12 release, which adds initial support for Python 3.14.\n\n### What's Changed\n\n#### New Features\n\n* Add `__pydantic_on_complete__()` hook that is called once model is fully ready to be used by [@DouweM](https://github.com/DouweM) in [#11762](https://github.com/pydantic/pydantic/pull/11762)\n* Add initial support for Python 3.14 by [@Viicos](https://github.com/Viicos) in [#11991](https://github.com/pydantic/pydantic/pull/11991)\n* Add regex patterns to JSON schema for `Decimal` type by [@Dima-Bulavenko](https://github.com/Dima-Bulavenko) in [#11987](https://github.com/pydantic/pydantic/pull/11987)\n* Add support for `doc` attribute on dataclass fields by [@Viicos](https://github.com/Viicos) in [#12077](https://github.com/pydantic/pydantic/pull/12077)\n* Add experimental `MISSING` sentinel by [@Viicos](https://github.com/Viicos) in [#11883](https://github.com/pydantic/pydantic/pull/11883)\n\n#### Changes\n\n* Allow config and bases to be specified together in `create_model()` by [@Viicos](https://github.com/Viicos) in [#11714](https://github.com/pydantic/pydantic/pull/11714)\n* Move some field logic out of the `GenerateSchema` class by [@Viicos](https://github.com/Viicos) in [#11733](https://github.com/pydantic/pydantic/pull/11733)\n* Always make use of `inspect.getsourcelines()` for docstring extraction on Python 3.13 and greater by [@Viicos](https://github.com/Viicos) in [#11829](https://github.com/pydantic/pydantic/pull/11829)\n* Only support the latest Mypy version by [@Viicos](https://github.com/Viicos) in [#11832](https://github.com/pydantic/pydantic/pull/11832)\n* Do not implicitly convert after model validators to class methods by [@Viicos](https://github.com/Viicos) in [#11957](https://github.com/pydantic/pydantic/pull/11957)\n* Refactor `FieldInfo` creation implementation by [@Viicos](https://github.com/Viicos) in [#11898](https://github.com/pydantic/pydantic/pull/11898)\n* Make `Secret` covariant by [@bluenote10](https://github.com/bluenote10) in [#12008](https://github.com/pydantic/pydantic/pull/12008)\n* Emit warning when field-specific metadata is used in invalid contexts by [@Viicos](https://github.com/Viicos) in [#12028](https://github.com/pydantic/pydantic/pull/12028)\n\n#### Fixes\n\n* Properly fetch plain serializer function when serializing default value in JSON Schema by [@Viicos](https://github.com/Viicos) in [#11721](https://github.com/pydantic/pydantic/pull/11721)\n* Remove generics cache workaround by [@Viicos](https://github.com/Viicos) in [#11755](https://github.com/pydantic/pydantic/pull/11755)\n* Remove coercion of decimal constraints by [@Viicos](https://github.com/Viicos) in [#11772](https://github.com/pydantic/pydantic/pull/11772)\n* Fix crash when expanding root type in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#11735](https://github.com/pydantic/pydantic/pull/11735)\n* Only mark model as complete once all fields are complete by [@DouweM](https://github.com/DouweM) in [#11759](https://github.com/pydantic/pydantic/pull/11759)\n* Do not provide `field_name` in validator core schemas by [@DouweM](https://github.com/DouweM) in [#11761](https://github.com/pydantic/pydantic/pull/11761)\n* Fix issue with recursive generic models by [@Viicos](https://github.com/Viicos) in [#11775](https://github.com/pydantic/pydantic/pull/11775)\n* Fix qualified name comparison of private attributes during namespace inspection by [@karta9821](https://github.com/karta9821) in [#11803](https://github.com/pydantic/pydantic/pull/11803)\n* Make sure Pydantic dataclasses with slots and `validate_assignment` can be unpickled by [@Viicos](https://github.com/Viicos) in [#11769](https://github.com/pydantic/pydantic/pull/11769)\n* Traverse `function-before` schemas during schema gathering by [@Viicos](https://github.com/Viicos) in [#11801](https://github.com/pydantic/pydantic/pull/11801)\n* Fix check for stdlib dataclasses by [@Viicos](https://github.com/Viicos) in [#11822](https://github.com/pydantic/pydantic/pull/11822)\n* Check if `FieldInfo` is complete after applying type variable map by [@Viicos](https://github.com/Viicos) in [#11855](https://github.com/pydantic/pydantic/pull/11855)\n* Do not delete mock validator/serializer in `model_rebuild()` by [@Viicos](https://github.com/Viicos) in [#11890](https://github.com/pydantic/pydantic/pull/11890)\n* Rebuild dataclass fields before schema generation by [@Viicos](https://github.com/Viicos) in [#11949](https://github.com/pydantic/pydantic/pull/11949)\n* Always store the original field assignment on `FieldInfo` by [@Viicos](https://github.com/Viicos) in [#11946](https://github.com/pydantic/pydantic/pull/11946)\n* Do not use deprecated methods as default field values by [@Viicos](https://github.com/Viicos) in [#11914](https://github.com/pydantic/pydantic/pull/11914)\n* Allow callable discriminator to be applied on PEP 695 type aliases by [@Viicos](https://github.com/Viicos) in [#11941](https://github.com/pydantic/pydantic/pull/11941)\n* Suppress core schema generation warning when using `SkipValidation` by [@ygsh0816](https://github.com/ygsh0816) in [#12002](https://github.com/pydantic/pydantic/pull/12002)\n* Do not emit typechecking error for invalid `Field()` default with `validate_default` set to `True` by [@Viicos](https://github.com/Viicos) in [#11988](https://github.com/pydantic/pydantic/pull/11988)\n* Refactor logic to support Pydantic's `Field()` function in dataclasses by [@Viicos](https://github.com/Viicos) in [#12051](https://github.com/pydantic/pydantic/pull/12051)\n\n#### Packaging\n\n* Update project metadata to use PEP 639 by [@Viicos](https://github.com/Viicos) in [#11694](https://github.com/pydantic/pydantic/pull/11694)\n* Bump `mkdocs-llmstxt` to v0.2.0 by [@Viicos](https://github.com/Viicos) in [#11725](https://github.com/pydantic/pydantic/pull/11725)\n* Bump `pydantic-core` to v2.35.1 by [@Viicos](https://github.com/Viicos) in [#11963](https://github.com/pydantic/pydantic/pull/11963)\n* Bump dawidd6/action-download-artifact from 10 to 11 by [@dependabot](https://github.com/dependabot)[bot] in [#12033](https://github.com/pydantic/pydantic/pull/12033)\n* Bump astral-sh/setup-uv from 5 to 6 by [@dependabot](https://github.com/dependabot)[bot] in [#11826](https://github.com/pydantic/pydantic/pull/11826)\n* Update mypy to 1.17.0 by [@Viicos](https://github.com/Viicos) in [#12076](https://github.com/pydantic/pydantic/pull/12076)\n\n### New Contributors\n\n* [@parth-paradkar](https://github.com/parth-paradkar) made their first contribution in [#11695](https://github.com/pydantic/pydantic/pull/11695)\n* [@dqkqd](https://github.com/dqkqd) made their first contribution in [#11739](https://github.com/pydantic/pydantic/pull/11739)\n* [@fhightower](https://github.com/fhightower) made their first contribution in [#11722](https://github.com/pydantic/pydantic/pull/11722)\n* [@gbaian10](https://github.com/gbaian10) made their first contribution in [#11766](https://github.com/pydantic/pydantic/pull/11766)\n* [@DouweM](https://github.com/DouweM) made their first contribution in [#11759](https://github.com/pydantic/pydantic/pull/11759)\n* [@bowenliang123](https://github.com/bowenliang123) made their first contribution in [#11719](https://github.com/pydantic/pydantic/pull/11719)\n* [@rawwar](https://github.com/rawwar) made their first contribution in [#11799](https://github.com/pydantic/pydantic/pull/11799)\n* [@karta9821](https://github.com/karta9821) made their first contribution in [#11803](https://github.com/pydantic/pydantic/pull/11803)\n* [@jinnovation](https://github.com/jinnovation) made their first contribution in [#11834](https://github.com/pydantic/pydantic/pull/11834)\n* [@zmievsa](https://github.com/zmievsa) made their first contribution in [#11861](https://github.com/pydantic/pydantic/pull/11861)\n* [@Otto-AA](https://github.com/Otto-AA) made their first contribution in [#11860](https://github.com/pydantic/pydantic/pull/11860)\n* [@ygsh0816](https://github.com/ygsh0816) made their first contribution in [#12002](https://github.com/pydantic/pydantic/pull/12002)\n* [@lukland](https://github.com/lukland) made their first contribution in [#12015](https://github.com/pydantic/pydantic/pull/12015)\n* [@Dima-Bulavenko](https://github.com/Dima-Bulavenko) made their first contribution in [#11987](https://github.com/pydantic/pydantic/pull/11987)\n* [@GSemikozov](https://github.com/GSemikozov) made their first contribution in [#12050](https://github.com/pydantic/pydantic/pull/12050)\n* [@hannah-heywa](https://github.com/hannah-heywa) made their first contribution in [#12082](https://github.com/pydantic/pydantic/pull/12082)\n\n## v2.11.10 (2025-10-04)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.10)\n\n### What's Changed\n\n#### Fixes\n\n* Backport v1.10.24 changes by [@Viicos](https://github.com/Viicos)\n\n## v2.11.9 (2025-09-13)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.9)\n\n### What's Changed\n\n#### Fixes\n\n* Backport v1.10.23 changes by [@Viicos](https://github.com/Viicos)\n\n## v2.11.8 (2025-09-13)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.8)\n\n### What's Changed\n\n#### Fixes\n\n* Fix mypy plugin for mypy 1.18 by [@cdce8p](https://github.com/cdce8p) in [#12209](https://github.com/pydantic/pydantic/pull/12209)\n\n## v2.11.7 (2025-06-14)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.7)\n\n### What's Changed\n\n#### Fixes\n\n* Copy `FieldInfo` instance if necessary during `FieldInfo` build by [@Viicos](https://github.com/Viicos) in [#11898](https://github.com/pydantic/pydantic/pull/11898)\n\n## v2.11.6 (2025-06-13)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.6)\n\n### What's Changed\n\n#### Fixes\n\n* Rebuild dataclass fields before schema generation by [@Viicos](https://github.com/Viicos) in [#11949](https://github.com/pydantic/pydantic/pull/11949)\n* Always store the original field assignment on `FieldInfo` by [@Viicos](https://github.com/Viicos) in [#11946](https://github.com/pydantic/pydantic/pull/11946)\n\n## v2.11.5 (2025-05-22)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.5)\n\n### What's Changed\n\n#### Fixes\n\n* Check if `FieldInfo` is complete after applying type variable map by [@Viicos](https://github.com/Viicos) in [#11855](https://github.com/pydantic/pydantic/pull/11855)\n* Do not delete mock validator/serializer in `model_rebuild()` by [@Viicos](https://github.com/Viicos) in [#11890](https://github.com/pydantic/pydantic/pull/11890)\n* Do not duplicate metadata on model rebuild by [@Viicos](https://github.com/Viicos) in [#11902](https://github.com/pydantic/pydantic/pull/11902)\n\n## v2.11.4 (2025-04-29)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.4)\n\n### What's Changed\n\n#### Changes\n\n* Allow config and bases to be specified together in `create_model()` by [@Viicos](https://github.com/Viicos) in [#11714](https://github.com/pydantic/pydantic/pull/11714).\n  This change was backported as it was previously possible (although not meant to be supported)\n  to provide `model_config` as a field, which would make it possible to provide both configuration\n  and bases.\n\n#### Fixes\n\n* Remove generics cache workaround by [@Viicos](https://github.com/Viicos) in [#11755](https://github.com/pydantic/pydantic/pull/11755)\n* Remove coercion of decimal constraints by [@Viicos](https://github.com/Viicos) in [#11772](https://github.com/pydantic/pydantic/pull/11772)\n* Fix crash when expanding root type in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#11735](https://github.com/pydantic/pydantic/pull/11735)\n* Fix issue with recursive generic models by [@Viicos](https://github.com/Viicos) in [#11775](https://github.com/pydantic/pydantic/pull/11775)\n* Traverse `function-before` schemas during schema gathering by [@Viicos](https://github.com/Viicos) in [#11801](https://github.com/pydantic/pydantic/pull/11801)\n\n#### Packaging\n\n* Bump `mkdocs-llmstxt` to v0.2.0 by [@Viicos](https://github.com/Viicos) in [#11725](https://github.com/pydantic/pydantic/pull/11725)\n\n## v2.11.3 (2025-04-08)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.3)\n\n### What's Changed\n\n#### Fixes\n\n* Preserve field description when rebuilding model fields by [@Viicos](https://github.com/Viicos) in [#11698](https://github.com/pydantic/pydantic/pull/11698)\n\n#### Packaging\n\n* Update V1 copy to v1.10.21 by [@Viicos](https://github.com/Viicos) in [#11706](https://github.com/pydantic/pydantic/pull/11706)\n\n## v2.11.2 (2025-04-03)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.2)\n\n### What's Changed\n\n#### Fixes\n\n* Bump `pydantic-core` to v2.33.1 by [@Viicos](https://github.com/Viicos) in [#11678](https://github.com/pydantic/pydantic/pull/11678)\n* Make sure `__pydantic_private__` exists before setting private attributes by [@Viicos](https://github.com/Viicos) in [#11666](https://github.com/pydantic/pydantic/pull/11666)\n* Do not override `FieldInfo._complete` when using field from parent class by [@Viicos](https://github.com/Viicos) in [#11668](https://github.com/pydantic/pydantic/pull/11668)\n* Provide the available definitions when applying discriminated unions by [@Viicos](https://github.com/Viicos) in [#11670](https://github.com/pydantic/pydantic/pull/11670)\n* Do not expand root type in the mypy plugin for variables by [@Viicos](https://github.com/Viicos) in [#11676](https://github.com/pydantic/pydantic/pull/11676)\n* Mention the attribute name in model fields deprecation message by [@Viicos](https://github.com/Viicos) in [#11674](https://github.com/pydantic/pydantic/pull/11674)\n* Properly validate parameterized mappings by [@Viicos](https://github.com/Viicos) in [#11658](https://github.com/pydantic/pydantic/pull/11658)\n\n## v2.11.1 (2025-03-28)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.1)\n\n### What's Changed\n\n#### Fixes\n\n* Do not override `'definitions-ref'` schemas containing serialization schemas or metadata by [@Viicos](https://github.com/Viicos) in [#11644](https://github.com/pydantic/pydantic/pull/11644)\n\n## v2.11.0 (2025-03-27)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.0)\n\n### What's Changed\n\nPydantic v2.11 is a version strongly focused on build time performance of Pydantic models (and core schema generation in general).\nSee the [blog post](https://pydantic.dev/articles/pydantic-v2-11-release) for more details.\n\n#### New Features\n\n* Add `encoded_string()` method to the URL types by [@YassinNouh21](https://github.com/YassinNouh21) in [#11580](https://github.com/pydantic/pydantic/pull/11580)\n* Add support for `defer_build` with `@validate_call` decorator by [@Viicos](https://github.com/Viicos) in [#11584](https://github.com/pydantic/pydantic/pull/11584)\n* Allow `@with_config` decorator to be used with keyword arguments by [@Viicos](https://github.com/Viicos) in [#11608](https://github.com/pydantic/pydantic/pull/11608)\n* Simplify customization of default value inclusion in JSON Schema generation by [@Viicos](https://github.com/Viicos) in [#11634](https://github.com/pydantic/pydantic/pull/11634)\n* Add `generate_arguments_schema()` function by [@Viicos](https://github.com/Viicos) in [#11572](https://github.com/pydantic/pydantic/pull/11572)\n\n#### Fixes\n\n* Allow generic typed dictionaries to be used for unpacked variadic keyword parameters by [@Viicos](https://github.com/Viicos) in [#11571](https://github.com/pydantic/pydantic/pull/11571)\n* Fix runtime error when computing model string representation involving cached properties and self-referenced models by [@Viicos](https://github.com/Viicos) in [#11579](https://github.com/pydantic/pydantic/pull/11579)\n* Preserve other steps when using the ellipsis in the pipeline API by [@Viicos](https://github.com/Viicos) in [#11626](https://github.com/pydantic/pydantic/pull/11626)\n* Fix deferred discriminator application logic by [@Viicos](https://github.com/Viicos) in [#11591](https://github.com/pydantic/pydantic/pull/11591)\n\n#### Packaging\n\n* Bump `pydantic-core` to v2.33.0 by [@Viicos](https://github.com/Viicos) in [#11631](https://github.com/pydantic/pydantic/pull/11631)\n\n### New Contributors\n\n* [@cmenon12](https://github.com/cmenon12) made their first contribution in [#11562](https://github.com/pydantic/pydantic/pull/11562)\n* [@Jeukoh](https://github.com/Jeukoh) made their first contribution in [#11611](https://github.com/pydantic/pydantic/pull/11611)\n\n## v2.11.0b2 (2025-03-17)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.0b2)\n\n### What's Changed\n\n#### New Features\n\n* Add experimental support for free threading by [@Viicos](https://github.com/Viicos) in [#11516](https://github.com/pydantic/pydantic/pull/11516)\n\n#### Fixes\n\n* Fix `NotRequired` qualifier not taken into account in stringified annotation by [@Viicos](https://github.com/Viicos) in [#11559](https://github.com/pydantic/pydantic/pull/11559)\n\n#### Packaging\n\n* Bump `pydantic-core` to v2.32.0 by [@Viicos](https://github.com/Viicos) in [#11567](https://github.com/pydantic/pydantic/pull/11567)\n\n### New Contributors\n\n* [@joren485](https://github.com/joren485) made their first contribution in [#11547](https://github.com/pydantic/pydantic/pull/11547)\n\n## v2.11.0b1 (2025-03-06)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.0b1)\n\n### What's Changed\n\n#### New Features\n\n* Support unsubstituted type variables with both a default and a bound or constraints by [@FyZzyss](https://github.com/FyZzyss) in https://github.com/pydantic/pydantic/pull/10789\n* Add a `default_factory_takes_validated_data` property to `FieldInfo` by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11034\n* Raise a better error when a generic alias is used inside `type[]` by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11088\n* Properly support PEP 695 generics syntax by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11189\n* Properly support type variable defaults by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11332\n* Add support for validating v6, v7, v8 UUIDs by [@astei](https://github.com/astei) in https://github.com/pydantic/pydantic/pull/11436\n* Improve alias configuration APIs by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11468\n\n#### Changes\n\n* Rework `create_model` field definitions format by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11032\n* Raise a deprecation warning when a field is annotated as final with a default value by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11168\n* Deprecate accessing `model_fields` and `model_computed_fields` on instances by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11169\n* **Breaking Change:** Move core schema generation logic for path types inside the `GenerateSchema` class by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/10846\n* Remove Python 3.8 Support by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11258\n* Optimize calls to `get_type_ref` by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/10863\n* Disable `pydantic-core` core schema validation by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11271\n\n#### Performance\n\n* Only evaluate `FieldInfo` annotations if required during schema building by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/10769\n* Improve `__setattr__` performance of Pydantic models by caching setter functions by [@MarkusSintonen](https://github.com/MarkusSintonen) in https://github.com/pydantic/pydantic/pull/10868\n* Improve annotation application performance by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11186\n* Improve performance of `_typing_extra` module by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11255\n* Refactor and optimize schema cleaning logic by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11244\n* Create a single dictionary when creating a `CoreConfig` instance by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11384\n* Bump `pydantic-core` and thus use `SchemaValidator` and `SchemaSerializer` caching by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11402\n* Reuse cached core schemas for parametrized generic Pydantic models by [@MarkusSintonen](https://github.com/MarkusSintonen) in https://github.com/pydantic/pydantic/pull/11434\n\n#### Fixes\n\n* Improve `TypeAdapter` instance repr by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/10872\n* Use the correct frame when instantiating a parametrized `TypeAdapter` by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/10893\n* Infer final fields with a default value as class variables in the mypy plugin by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11121\n* Recursively unpack `Literal` values if using PEP 695 type aliases by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11114\n* Override `__subclasscheck__` on `ModelMetaclass` to avoid memory leak and performance issues by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11116\n* Remove unused `_extract_get_pydantic_json_schema()` parameter by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11155\n* Improve discriminated union error message for invalid union variants by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11161\n* Unpack PEP 695 type aliases if using the `Annotated` form by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11109\n* Add missing stacklevel in `deprecated_instance_property` warning by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11200\n* Copy `WithJsonSchema` schema to avoid sharing mutated data by [@thejcannon](https://github.com/thejcannon) in https://github.com/pydantic/pydantic/pull/11014\n* Do not cache parametrized models when in the process of parametrizing another model by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/10704\n* Add discriminated union related metadata entries to the `CoreMetadata` definition by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11216\n* Consolidate schema definitions logic in the `_Definitions` class by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11208\n* Support initializing root model fields with values of the `root` type in the mypy plugin by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11212\n* Fix various issues with dataclasses and `use_attribute_docstrings` by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11246\n* Only compute normalized decimal places if necessary in `decimal_places_validator` by [@misrasaurabh1](https://github.com/misrasaurabh1) in https://github.com/pydantic/pydantic/pull/11281\n* Add support for `validation_alias` in the mypy plugin by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11295\n* Fix JSON Schema reference collection with `\"examples\"` keys by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11305\n* Do not transform model serializer functions as class methods in the mypy plugin by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11298\n* Simplify `GenerateJsonSchema.literal_schema()` implementation by [@misrasaurabh1](https://github.com/misrasaurabh1) in https://github.com/pydantic/pydantic/pull/11321\n* Add additional allowed schemes for `ClickHouseDsn` by [@Maze21127](https://github.com/Maze21127) in https://github.com/pydantic/pydantic/pull/11319\n* Coerce decimal constraints to `Decimal` instances by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11350\n* Use the correct JSON Schema mode when handling function schemas by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11367\n* Improve exception message when encountering recursion errors during type evaluation by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11356\n* Always include `additionalProperties: True` for arbitrary dictionary schemas by [@austinyu](https://github.com/austinyu) in https://github.com/pydantic/pydantic/pull/11392\n* Expose `fallback` parameter in serialization methods by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11398\n* Fix path serialization behavior by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11416\n* Do not reuse validators and serializers during model rebuild by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11429\n* Collect model fields when rebuilding a model by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11388\n* Allow cached properties to be altered on frozen models by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11432\n* Fix tuple serialization for `Sequence` types by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11435\n* Fix: do not check for `__get_validators__` on classes where `__get_pydantic_core_schema__` is also defined by [@tlambert03](https://github.com/tlambert03) in https://github.com/pydantic/pydantic/pull/11444\n* Allow callable instances to be used as serializers by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11451\n* Improve error thrown when overriding field with a property by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11459\n* Fix JSON Schema generation with referenceable core schemas holding JSON metadata by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11475\n* Support strict specification on union member types by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11481\n* Implicitly set `validate_by_name` to `True` when `validate_by_alias` is `False` by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11503\n* Change type of `Any` when synthesizing `BaseSettings.__init__` signature in the mypy plugin by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11497\n* Support type variable defaults referencing other type variables by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11520\n* Fix `ValueError` on year zero by [@davidhewitt](https://github.com/davidhewitt) in https://github.com/pydantic/pydantic-core/pull/1583\n* `dataclass` `InitVar` shouldn't be required on serialization by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic-core/pull/1602\n\n#### Packaging\n\n* Add a `check_pydantic_core_version()` function by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11324\n* Remove `greenlet` development dependency by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11351\n* Use the `typing-inspection` library by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11479\n* Bump `pydantic-core` to `v2.31.1` by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11526\n\n## New Contributors\n\n* [@FyZzyss](https://github.com/FyZzyss) made their first contribution in https://github.com/pydantic/pydantic/pull/10789\n* [@tamird](https://github.com/tamird) made their first contribution in https://github.com/pydantic/pydantic/pull/10948\n* [@felixxm](https://github.com/felixxm) made their first contribution in https://github.com/pydantic/pydantic/pull/11077\n* [@alexprabhat99](https://github.com/alexprabhat99) made their first contribution in https://github.com/pydantic/pydantic/pull/11082\n* [@Kharianne](https://github.com/Kharianne) made their first contribution in https://github.com/pydantic/pydantic/pull/11111\n* [@mdaffad](https://github.com/mdaffad) made their first contribution in https://github.com/pydantic/pydantic/pull/11177\n* [@thejcannon](https://github.com/thejcannon) made their first contribution in https://github.com/pydantic/pydantic/pull/11014\n* [@thomasfrimannkoren](https://github.com/thomasfrimannkoren) made their first contribution in https://github.com/pydantic/pydantic/pull/11251\n* [@usernameMAI](https://github.com/usernameMAI) made their first contribution in https://github.com/pydantic/pydantic/pull/11275\n* [@ananiavito](https://github.com/ananiavito) made their first contribution in https://github.com/pydantic/pydantic/pull/11302\n* [@pawamoy](https://github.com/pawamoy) made their first contribution in https://github.com/pydantic/pydantic/pull/11311\n* [@Maze21127](https://github.com/Maze21127) made their first contribution in https://github.com/pydantic/pydantic/pull/11319\n* [@kauabh](https://github.com/kauabh) made their first contribution in https://github.com/pydantic/pydantic/pull/11369\n* [@jaceklaskowski](https://github.com/jaceklaskowski) made their first contribution in https://github.com/pydantic/pydantic/pull/11353\n* [@tmpbeing](https://github.com/tmpbeing) made their first contribution in https://github.com/pydantic/pydantic/pull/11375\n* [@petyosi](https://github.com/petyosi) made their first contribution in https://github.com/pydantic/pydantic/pull/11405\n* [@austinyu](https://github.com/austinyu) made their first contribution in https://github.com/pydantic/pydantic/pull/11392\n* [@mikeedjones](https://github.com/mikeedjones) made their first contribution in https://github.com/pydantic/pydantic/pull/11402\n* [@astei](https://github.com/astei) made their first contribution in https://github.com/pydantic/pydantic/pull/11436\n* [@dsayling](https://github.com/dsayling) made their first contribution in https://github.com/pydantic/pydantic/pull/11522\n* [@sobolevn](https://github.com/sobolevn) made their first contribution in https://github.com/pydantic/pydantic-core/pull/1645\n\n## v2.11.0a2 (2025-02-10)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.0a2)\n\n### What's Changed\n\nPydantic v2.11 is a version strongly focused on build time performance of Pydantic models (and core schema generation in general).\nThis is another early alpha release, meant to collect early feedback from users having issues with core schema builds.\n\n#### Performance\n\n* Create a single dictionary when creating a `CoreConfig` instance by [@sydney-runkle](https://github.com/sydney-runkle) in [#11384](https://github.com/pydantic/pydantic/pull/11384)\n\n#### Fixes\n\n* Use the correct JSON Schema mode when handling function schemas by [@Viicos](https://github.com/Viicos) in [#11367](https://github.com/pydantic/pydantic/pull/11367)\n* Fix JSON Schema reference logic with `examples` keys by [@Viicos](https://github.com/Viicos) in [#11366](https://github.com/pydantic/pydantic/pull/11366)\n* Improve exception message when encountering recursion errors during type evaluation by [@Viicos](https://github.com/Viicos) in [#11356](https://github.com/pydantic/pydantic/pull/11356)\n* Always include `additionalProperties: True` for arbitrary dictionary schemas by [@austinyu](https://github.com/austinyu) in [#11392](https://github.com/pydantic/pydantic/pull/11392)\n* Expose `fallback` parameter in serialization methods by [@Viicos](https://github.com/Viicos) in [#11398](https://github.com/pydantic/pydantic/pull/11398)\n* Fix path serialization behavior by [@sydney-runkle](https://github.com/sydney-runkle) in [#11416](https://github.com/pydantic/pydantic/pull/11416)\n\n#### Packaging\n\n* Bump `ruff` from 0.9.2 to 0.9.5 by [@Viicos](https://github.com/Viicos) in [#11407](https://github.com/pydantic/pydantic/pull/11407)\n* Bump `pydantic-core` to v2.29.0 by [@mikeedjones](https://github.com/mikeedjones) in [#11402](https://github.com/pydantic/pydantic/pull/11402)\n* Use locally-built rust with symbols & pgo by [@davidhewitt](https://github.com/davidhewitt) in [#11403](https://github.com/pydantic/pydantic/pull/11403)\n\n### New Contributors\n\n* [@kauabh](https://github.com/kauabh) made their first contribution in [#11369](https://github.com/pydantic/pydantic/pull/11369)\n* [@jaceklaskowski](https://github.com/jaceklaskowski) made their first contribution in [#11353](https://github.com/pydantic/pydantic/pull/11353)\n* [@tmpbeing](https://github.com/tmpbeing) made their first contribution in [#11375](https://github.com/pydantic/pydantic/pull/11375)\n* [@petyosi](https://github.com/petyosi) made their first contribution in [#11405](https://github.com/pydantic/pydantic/pull/11405)\n* [@austinyu](https://github.com/austinyu) made their first contribution in [#11392](https://github.com/pydantic/pydantic/pull/11392)\n* [@mikeedjones](https://github.com/mikeedjones) made their first contribution in [#11402](https://github.com/pydantic/pydantic/pull/11402)\n\n## v2.11.0a1 (2025-01-30)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.0a1)\n\n### What's Changed\n\nPydantic v2.11 is a version strongly focused on build time performance of Pydantic models (and core schema generation in general).\nThis is an early alpha release, meant to collect early feedback from users having issues with core schema builds.\n\n#### New Features\n\n* Support unsubstituted type variables with both a default and a bound or constraints by [@FyZzyss](https://github.com/FyZzyss) in [#10789](https://github.com/pydantic/pydantic/pull/10789)\n* Add a `default_factory_takes_validated_data` property to `FieldInfo` by [@Viicos](https://github.com/Viicos) in [#11034](https://github.com/pydantic/pydantic/pull/11034)\n* Raise a better error when a generic alias is used inside `type[]` by [@Viicos](https://github.com/Viicos) in [#11088](https://github.com/pydantic/pydantic/pull/11088)\n* Properly support PEP 695 generics syntax by [@Viicos](https://github.com/Viicos) in [#11189](https://github.com/pydantic/pydantic/pull/11189)\n* Properly support type variable defaults by [@Viicos](https://github.com/Viicos) in [#11332](https://github.com/pydantic/pydantic/pull/11332)\n\n#### Changes\n\n* Rework `create_model` field definitions format by [@Viicos](https://github.com/Viicos) in [#11032](https://github.com/pydantic/pydantic/pull/11032)\n* Raise a deprecation warning when a field is annotated as final with a default value by [@Viicos](https://github.com/Viicos) in [#11168](https://github.com/pydantic/pydantic/pull/11168)\n* Deprecate accessing `model_fields` and `model_computed_fields` on instances by [@Viicos](https://github.com/Viicos) in [#11169](https://github.com/pydantic/pydantic/pull/11169)\n* Move core schema generation logic for path types inside the `GenerateSchema` class by [@sydney-runkle](https://github.com/sydney-runkle) in [#10846](https://github.com/pydantic/pydantic/pull/10846)\n* Move `deque` schema gen to `GenerateSchema` class by [@sydney-runkle](https://github.com/sydney-runkle) in [#11239](https://github.com/pydantic/pydantic/pull/11239)\n* Move `Mapping` schema gen to `GenerateSchema` to complete removal of `prepare_annotations_for_known_type` workaround by [@sydney-runkle](https://github.com/sydney-runkle) in [#11247](https://github.com/pydantic/pydantic/pull/11247)\n* Remove Python 3.8 Support by [@sydney-runkle](https://github.com/sydney-runkle) in [#11258](https://github.com/pydantic/pydantic/pull/11258)\n* Disable `pydantic-core` core schema validation by [@sydney-runkle](https://github.com/sydney-runkle) in [#11271](https://github.com/pydantic/pydantic/pull/11271)\n\n#### Performance\n\n* Only evaluate `FieldInfo` annotations if required during schema building by [@Viicos](https://github.com/Viicos) in [#10769](https://github.com/pydantic/pydantic/pull/10769)\n* Optimize calls to `get_type_ref` by [@Viicos](https://github.com/Viicos) in [#10863](https://github.com/pydantic/pydantic/pull/10863)\n* Improve `__setattr__` performance of Pydantic models by caching setter functions by [@MarkusSintonen](https://github.com/MarkusSintonen) in [#10868](https://github.com/pydantic/pydantic/pull/10868)\n* Improve annotation application performance by [@Viicos](https://github.com/Viicos) in [#11186](https://github.com/pydantic/pydantic/pull/11186)\n* Improve performance of `_typing_extra` module by [@Viicos](https://github.com/Viicos) in [#11255](https://github.com/pydantic/pydantic/pull/11255)\n* Refactor and optimize schema cleaning logic by [@Viicos](https://github.com/Viicos) and [@MarkusSintonen](https://github.com/MarkusSintonen) in [#11244](https://github.com/pydantic/pydantic/pull/11244)\n\n#### Fixes\n\n* Add validation tests for `_internal/_validators.py` by [@tkasuz](https://github.com/tkasuz) in [#10763](https://github.com/pydantic/pydantic/pull/10763)\n* Improve `TypeAdapter` instance repr by [@sydney-runkle](https://github.com/sydney-runkle) in [#10872](https://github.com/pydantic/pydantic/pull/10872)\n* Revert \"ci: use locally built pydantic-core with debug symbols by [@sydney-runkle](https://github.com/sydney-runkle) in [#10942](https://github.com/pydantic/pydantic/pull/10942)\n* Re-enable all FastAPI tests by [@tamird](https://github.com/tamird) in [#10948](https://github.com/pydantic/pydantic/pull/10948)\n* Fix typo in HISTORY.md. by [@felixxm](https://github.com/felixxm) in [#11077](https://github.com/pydantic/pydantic/pull/11077)\n* Infer final fields with a default value as class variables in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#11121](https://github.com/pydantic/pydantic/pull/11121)\n* Recursively unpack `Literal` values if using PEP 695 type aliases by [@Viicos](https://github.com/Viicos) in [#11114](https://github.com/pydantic/pydantic/pull/11114)\n* Override `__subclasscheck__` on `ModelMetaclass` to avoid memory leak and performance issues by [@Viicos](https://github.com/Viicos) in [#11116](https://github.com/pydantic/pydantic/pull/11116)\n* Remove unused `_extract_get_pydantic_json_schema()` parameter by [@Viicos](https://github.com/Viicos) in [#11155](https://github.com/pydantic/pydantic/pull/11155)\n* Add FastAPI and SQLModel to third-party tests by [@sydney-runkle](https://github.com/sydney-runkle) in [#11044](https://github.com/pydantic/pydantic/pull/11044)\n* Fix conditional expressions syntax for third-party tests by [@Viicos](https://github.com/Viicos) in [#11162](https://github.com/pydantic/pydantic/pull/11162)\n* Move FastAPI tests to third-party workflow by [@Viicos](https://github.com/Viicos) in [#11164](https://github.com/pydantic/pydantic/pull/11164)\n* Improve discriminated union error message for invalid union variants by [@Viicos](https://github.com/Viicos) in [#11161](https://github.com/pydantic/pydantic/pull/11161)\n* Unpack PEP 695 type aliases if using the `Annotated` form by [@Viicos](https://github.com/Viicos) in [#11109](https://github.com/pydantic/pydantic/pull/11109)\n* Include `openapi-python-client` check in issue creation for third-party failures, use `main` branch by [@sydney-runkle](https://github.com/sydney-runkle) in [#11182](https://github.com/pydantic/pydantic/pull/11182)\n* Add pandera third-party tests by [@Viicos](https://github.com/Viicos) in [#11193](https://github.com/pydantic/pydantic/pull/11193)\n* Add ODMantic third-party tests by [@sydney-runkle](https://github.com/sydney-runkle) in [#11197](https://github.com/pydantic/pydantic/pull/11197)\n* Add missing stacklevel in `deprecated_instance_property` warning by [@Viicos](https://github.com/Viicos) in [#11200](https://github.com/pydantic/pydantic/pull/11200)\n* Copy `WithJsonSchema` schema to avoid sharing mutated data by [@thejcannon](https://github.com/thejcannon) in [#11014](https://github.com/pydantic/pydantic/pull/11014)\n* Do not cache parametrized models when in the process of parametrizing another model by [@Viicos](https://github.com/Viicos) in [#10704](https://github.com/pydantic/pydantic/pull/10704)\n* Re-enable Beanie third-party tests by [@Viicos](https://github.com/Viicos) in [#11214](https://github.com/pydantic/pydantic/pull/11214)\n* Add discriminated union related metadata entries to the `CoreMetadata` definition by [@Viicos](https://github.com/Viicos) in [#11216](https://github.com/pydantic/pydantic/pull/11216)\n* Consolidate schema definitions logic in the `_Definitions` class by [@Viicos](https://github.com/Viicos) in [#11208](https://github.com/pydantic/pydantic/pull/11208)\n* Support initializing root model fields with values of the `root` type in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#11212](https://github.com/pydantic/pydantic/pull/11212)\n* Fix various issues with dataclasses and `use_attribute_docstrings` by [@Viicos](https://github.com/Viicos) in [#11246](https://github.com/pydantic/pydantic/pull/11246)\n* Only compute normalized decimal places if necessary in `decimal_places_validator` by [@misrasaurabh1](https://github.com/misrasaurabh1) in [#11281](https://github.com/pydantic/pydantic/pull/11281)\n* Fix two misplaced sentences in validation errors documentation by [@ananiavito](https://github.com/ananiavito) in [#11302](https://github.com/pydantic/pydantic/pull/11302)\n* Fix mkdocstrings inventory example in documentation by [@pawamoy](https://github.com/pawamoy) in [#11311](https://github.com/pydantic/pydantic/pull/11311)\n* Add support for `validation_alias` in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#11295](https://github.com/pydantic/pydantic/pull/11295)\n* Do not transform model serializer functions as class methods in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#11298](https://github.com/pydantic/pydantic/pull/11298)\n* Simplify `GenerateJsonSchema.literal_schema()` implementation by [@misrasaurabh1](https://github.com/misrasaurabh1) in [#11321](https://github.com/pydantic/pydantic/pull/11321)\n* Add additional allowed schemes for `ClickHouseDsn` by [@Maze21127](https://github.com/Maze21127) in [#11319](https://github.com/pydantic/pydantic/pull/11319)\n* Coerce decimal constraints to `Decimal` instances by [@Viicos](https://github.com/Viicos) in [#11350](https://github.com/pydantic/pydantic/pull/11350)\n* Fix `ValueError` on year zero by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1583](https://github.com/pydantic/pydantic-core/pull/1583)\n\n#### Packaging\n\n* Bump dawidd6/action-download-artifact from 6 to 7 by [@dependabot](https://github.com/dependabot) in [#11018](https://github.com/pydantic/pydantic/pull/11018)\n* Re-enable memray related tests on Python 3.12+ by [@Viicos](https://github.com/Viicos) in [#11191](https://github.com/pydantic/pydantic/pull/11191)\n* Bump astral-sh/setup-uv to 5 by [@dependabot](https://github.com/dependabot) in [#11205](https://github.com/pydantic/pydantic/pull/11205)\n* Bump `ruff` to v0.9.0 by [@sydney-runkle](https://github.com/sydney-runkle) in [#11254](https://github.com/pydantic/pydantic/pull/11254)\n* Regular `uv.lock` deps update by [@sydney-runkle](https://github.com/sydney-runkle) in [#11333](https://github.com/pydantic/pydantic/pull/11333)\n* Add a `check_pydantic_core_version()` function by [@Viicos](https://github.com/Viicos) in [#11324](https://github.com/pydantic/pydantic/pull/11324)\n* Remove `greenlet` development dependency by [@Viicos](https://github.com/Viicos) in [#11351](https://github.com/pydantic/pydantic/pull/11351)\n* Bump `pydantic-core` to v2.28.0 by [@Viicos](https://github.com/Viicos) in [#11364](https://github.com/pydantic/pydantic/pull/11364)\n\n### New Contributors\n\n* [@FyZzyss](https://github.com/FyZzyss) made their first contribution in [#10789](https://github.com/pydantic/pydantic/pull/10789)\n* [@tamird](https://github.com/tamird) made their first contribution in [#10948](https://github.com/pydantic/pydantic/pull/10948)\n* [@felixxm](https://github.com/felixxm) made their first contribution in [#11077](https://github.com/pydantic/pydantic/pull/11077)\n* [@alexprabhat99](https://github.com/alexprabhat99) made their first contribution in [#11082](https://github.com/pydantic/pydantic/pull/11082)\n* [@Kharianne](https://github.com/Kharianne) made their first contribution in [#11111](https://github.com/pydantic/pydantic/pull/11111)\n* [@mdaffad](https://github.com/mdaffad) made their first contribution in [#11177](https://github.com/pydantic/pydantic/pull/11177)\n* [@thejcannon](https://github.com/thejcannon) made their first contribution in [#11014](https://github.com/pydantic/pydantic/pull/11014)\n* [@thomasfrimannkoren](https://github.com/thomasfrimannkoren) made their first contribution in [#11251](https://github.com/pydantic/pydantic/pull/11251)\n* [@usernameMAI](https://github.com/usernameMAI) made their first contribution in [#11275](https://github.com/pydantic/pydantic/pull/11275)\n* [@ananiavito](https://github.com/ananiavito) made their first contribution in [#11302](https://github.com/pydantic/pydantic/pull/11302)\n* [@pawamoy](https://github.com/pawamoy) made their first contribution in [#11311](https://github.com/pydantic/pydantic/pull/11311)\n* [@Maze21127](https://github.com/Maze21127) made their first contribution in [#11319](https://github.com/pydantic/pydantic/pull/11319)\n\n## v2.10.6 (2025-01-23)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.6)\n\n### What's Changed\n\n#### Fixes\n\n* Fix JSON Schema reference collection with `'examples'` keys by [@Viicos](https://github.com/Viicos) in [#11325](https://github.com/pydantic/pydantic/pull/11325)\n* Fix url python serialization by [@sydney-runkle](https://github.com/sydney-runkle) in [#11331](https://github.com/pydantic/pydantic/pull/11331)\n\n## v2.10.5 (2025-01-08)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.5)\n\n### What's Changed\n\n#### Fixes\n\n* Remove custom MRO implementation of Pydantic models by [@Viicos](https://github.com/Viicos) in [#11184](https://github.com/pydantic/pydantic/pull/11184)\n* Fix URL serialization for unions by [@sydney-runkle](https://github.com/sydney-runkle) in [#11233](https://github.com/pydantic/pydantic/pull/11233)\n\n## v2.10.4 (2024-12-18)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.4)\n\n### What's Changed\n\n#### Fixes\n\n* Fix for comparison of `AnyUrl` objects by [@alexprabhat99](https://github.com/alexprabhat99) in [#11082](https://github.com/pydantic/pydantic/pull/11082)\n* Properly fetch PEP 695 type params for functions, do not fetch annotations from signature by [@Viicos](https://github.com/Viicos) in [#11093](https://github.com/pydantic/pydantic/pull/11093)\n* Include JSON Schema input core schema in function schemas by [@Viicos](https://github.com/Viicos) in [#11085](https://github.com/pydantic/pydantic/pull/11085)\n* Add `len` to `_BaseUrl` to avoid TypeError by [@Kharianne](https://github.com/Kharianne) in [#11111](https://github.com/pydantic/pydantic/pull/11111)\n* Make sure the type reference is removed from the seen references by [@Viicos](https://github.com/Viicos) in [#11143](https://github.com/pydantic/pydantic/pull/11143)\n\n### New Contributors\n\n* [@FyZzyss](https://github.com/FyZzyss) made their first contribution in [#10789](https://github.com/pydantic/pydantic/pull/10789)\n* [@tamird](https://github.com/tamird) made their first contribution in [#10948](https://github.com/pydantic/pydantic/pull/10948)\n* [@felixxm](https://github.com/felixxm) made their first contribution in [#11077](https://github.com/pydantic/pydantic/pull/11077)\n* [@alexprabhat99](https://github.com/alexprabhat99) made their first contribution in [#11082](https://github.com/pydantic/pydantic/pull/11082)\n* [@Kharianne](https://github.com/Kharianne) made their first contribution in [#11111](https://github.com/pydantic/pydantic/pull/11111)\n\n#### Packaging\n\n* Bump `pydantic-core` to v2.27.2 by [@davidhewitt](https://github.com/davidhewitt) in [#11138](https://github.com/pydantic/pydantic/pull/11138)\n\n## v2.10.3 (2024-12-03)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.3)\n\n### What's Changed\n\n#### Fixes\n\n* Set fields when `defer_build` is set on Pydantic dataclasses by [@Viicos](https://github.com/Viicos) in [#10984](https://github.com/pydantic/pydantic/pull/10984)\n* Do not resolve the JSON Schema reference for `dict` core schema keys by [@Viicos](https://github.com/Viicos) in [#10989](https://github.com/pydantic/pydantic/pull/10989)\n* Use the globals of the function when evaluating the return type for `PlainSerializer` and `WrapSerializer` functions by [@Viicos](https://github.com/Viicos) in [#11008](https://github.com/pydantic/pydantic/pull/11008)\n* Fix host required enforcement for urls to be compatible with v2.9 behavior by [@sydney-runkle](https://github.com/sydney-runkle) in [#11027](https://github.com/pydantic/pydantic/pull/11027)\n* Add a `default_factory_takes_validated_data` property to `FieldInfo` by [@Viicos](https://github.com/Viicos) in [#11034](https://github.com/pydantic/pydantic/pull/11034)\n* Fix url json schema in `serialization` mode by [@sydney-runkle](https://github.com/sydney-runkle) in [#11035](https://github.com/pydantic/pydantic/pull/11035)\n\n## v2.10.2 (2024-11-25)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.2)\n\n### What's Changed\n\n#### Fixes\n\n* Only evaluate FieldInfo annotations if required during schema building by [@Viicos](https://github.com/Viicos) in [#10769](https://github.com/pydantic/pydantic/pull/10769)\n* Do not evaluate annotations for private fields by [@Viicos](https://github.com/Viicos) in [#10962](https://github.com/pydantic/pydantic/pull/10962)\n* Support serialization as any for `Secret` types and `Url` types by [@sydney-runkle](https://github.com/sydney-runkle) in [#10947](https://github.com/pydantic/pydantic/pull/10947)\n* Fix type hint of `Field.default` to be compatible with Python 3.8 and 3.9 by [@Viicos](https://github.com/Viicos) in [#10972](https://github.com/pydantic/pydantic/pull/10972)\n* Add hashing support for URL types by [@sydney-runkle](https://github.com/sydney-runkle) in [#10975](https://github.com/pydantic/pydantic/pull/10975)\n* Hide `BaseModel.__replace__` definition from type checkers by [@Viicos](https://github.com/Viicos) in [#10979](https://github.com/pydantic/pydantic/pull/10979)\n\n## v2.10.1 (2024-11-21)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.1)\n\n### What's Changed\n\n#### Fixes\n\n* Use the correct frame when instantiating a parametrized `TypeAdapter` by [@Viicos](https://github.com/Viicos) in [#10893](https://github.com/pydantic/pydantic/pull/10893)\n* Relax check for validated data in `default_factory` utils by [@sydney-runkle](https://github.com/sydney-runkle) in [#10909](https://github.com/pydantic/pydantic/pull/10909)\n* Fix type checking issue with `model_fields` and `model_computed_fields` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10911](https://github.com/pydantic/pydantic/pull/10911)\n* Use the parent configuration during schema generation for stdlib `dataclass`es by [@sydney-runkle](https://github.com/sydney-runkle) in [#10928](https://github.com/pydantic/pydantic/pull/10928)\n* Use the `globals` of the function when evaluating the return type of serializers and `computed_field`s by [@Viicos](https://github.com/Viicos) in [#10929](https://github.com/pydantic/pydantic/pull/10929)\n* Fix URL constraint application by [@sydney-runkle](https://github.com/sydney-runkle) in [#10922](https://github.com/pydantic/pydantic/pull/10922)\n* Fix URL equality with different validation methods by [@sydney-runkle](https://github.com/sydney-runkle) in [#10934](https://github.com/pydantic/pydantic/pull/10934)\n* Fix JSON schema title when specified as `''` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10936](https://github.com/pydantic/pydantic/pull/10936)\n* Fix `python` mode serialization for `complex` inference by [@sydney-runkle](https://github.com/sydney-runkle) in [pydantic-core#1549](https://github.com/pydantic/pydantic-core/pull/1549)\n\n#### Packaging\n\n* Bump `pydantic-core` version to `v2.27.1` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10938](https://github.com/pydantic/pydantic/pull/10938)\n\n### New Contributors\n\n## v2.10.0 (2024-11-20)\n\nThe code released in v2.10.0 is practically identical to that of v2.10.0b2.\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.0)\n\nSee the [v2.10 release blog post](https://pydantic.dev/articles/pydantic-v2-10-release) for the highlights!\n\n### What's Changed\n\n#### New Features\n\n* Support `fractions.Fraction` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10318](https://github.com/pydantic/pydantic/pull/10318)\n* Support `Hashable` for json validation by [@sydney-runkle](https://github.com/sydney-runkle) in [#10324](https://github.com/pydantic/pydantic/pull/10324)\n* Add a `SocketPath` type for `linux` systems by [@theunkn0wn1](https://github.com/theunkn0wn1) in [#10378](https://github.com/pydantic/pydantic/pull/10378)\n* Allow arbitrary refs in JSON schema `examples` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10417](https://github.com/pydantic/pydantic/pull/10417)\n* Support `defer_build` for Pydantic dataclasses by [@Viicos](https://github.com/Viicos) in [#10313](https://github.com/pydantic/pydantic/pull/10313)\n* Adding v1 / v2 incompatibility warning for nested v1 model by [@sydney-runkle](https://github.com/sydney-runkle) in [#10431](https://github.com/pydantic/pydantic/pull/10431)\n* Add support for unpacked `TypedDict` to type hint variadic keyword arguments with `@validate_call` by [@Viicos](https://github.com/Viicos) in [#10416](https://github.com/pydantic/pydantic/pull/10416)\n* Support compiled patterns in `protected_namespaces` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10522](https://github.com/pydantic/pydantic/pull/10522)\n* Add support for `propertyNames` in JSON schema by [@FlorianSW](https://github.com/FlorianSW) in [#10478](https://github.com/pydantic/pydantic/pull/10478)\n* Adding `__replace__` protocol for Python 3.13+ support by [@sydney-runkle](https://github.com/sydney-runkle) in [#10596](https://github.com/pydantic/pydantic/pull/10596)\n* Expose public `sort` method for JSON schema generation by [@sydney-runkle](https://github.com/sydney-runkle) in [#10595](https://github.com/pydantic/pydantic/pull/10595)\n* Add runtime validation of `@validate_call` callable argument by [@kc0506](https://github.com/kc0506) in [#10627](https://github.com/pydantic/pydantic/pull/10627)\n* Add `experimental_allow_partial` support by [@samuelcolvin](https://github.com/samuelcolvin) in [#10748](https://github.com/pydantic/pydantic/pull/10748)\n* Support default factories taking validated data as an argument by [@Viicos](https://github.com/Viicos) in [#10678](https://github.com/pydantic/pydantic/pull/10678)\n* Allow subclassing `ValidationError` and `PydanticCustomError` by [@Youssefares](https://github.com/Youssefares) in [pydantic/pydantic-core#1413](https://github.com/pydantic/pydantic-core/pull/1413)\n* Add `trailing-strings` support to `experimental_allow_partial` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10825](https://github.com/pydantic/pydantic/pull/10825)\n* Add `rebuild()` method for `TypeAdapter` and simplify `defer_build` patterns by [@sydney-runkle](https://github.com/sydney-runkle) in [#10537](https://github.com/pydantic/pydantic/pull/10537)\n* Improve `TypeAdapter` instance repr by [@sydney-runkle](https://github.com/sydney-runkle) in [#10872](https://github.com/pydantic/pydantic/pull/10872)\n\n#### Changes\n\n* Don't allow customization of `SchemaGenerator` until interface is more stable by [@sydney-runkle](https://github.com/sydney-runkle) in [#10303](https://github.com/pydantic/pydantic/pull/10303)\n* Cleanly `defer_build` on `TypeAdapters`, removing experimental flag by [@sydney-runkle](https://github.com/sydney-runkle) in [#10329](https://github.com/pydantic/pydantic/pull/10329)\n* Fix `mro` of generic subclass  by [@kc0506](https://github.com/kc0506) in [#10100](https://github.com/pydantic/pydantic/pull/10100)\n* Strip whitespaces on JSON Schema title generation by [@sydney-runkle](https://github.com/sydney-runkle) in [#10404](https://github.com/pydantic/pydantic/pull/10404)\n* Use `b64decode` and `b64encode` for `Base64Bytes` type by [@sydney-runkle](https://github.com/sydney-runkle) in [#10486](https://github.com/pydantic/pydantic/pull/10486)\n* Relax protected namespace config default by [@sydney-runkle](https://github.com/sydney-runkle) in [#10441](https://github.com/pydantic/pydantic/pull/10441)\n* Revalidate parametrized generics if instance's origin is subclass of OG class by [@sydney-runkle](https://github.com/sydney-runkle) in [#10666](https://github.com/pydantic/pydantic/pull/10666)\n* Warn if configuration is specified on the `@dataclass` decorator and with the `__pydantic_config__` attribute by [@sydney-runkle](https://github.com/sydney-runkle) in [#10406](https://github.com/pydantic/pydantic/pull/10406)\n* Recommend against using `Ellipsis` (...) with `Field` by [@Viicos](https://github.com/Viicos) in [#10661](https://github.com/pydantic/pydantic/pull/10661)\n* Migrate to subclassing instead of annotated approach for pydantic url types by [@sydney-runkle](https://github.com/sydney-runkle) in [#10662](https://github.com/pydantic/pydantic/pull/10662)\n* Change JSON schema generation of `Literal`s and `Enums` by [@Viicos](https://github.com/Viicos) in [#10692](https://github.com/pydantic/pydantic/pull/10692)\n* Simplify unions involving `Any` or `Never` when replacing type variables by [@Viicos](https://github.com/Viicos) in [#10338](https://github.com/pydantic/pydantic/pull/10338)\n* Do not require padding when decoding `base64` bytes by [@bschoenmaeckers](https://github.com/bschoenmaeckers) in [pydantic/pydantic-core#1448](https://github.com/pydantic/pydantic-core/pull/1448)\n* Support dates all the way to 1BC by [@changhc](https://github.com/changhc) in [pydantic/speedate#77](https://github.com/pydantic/speedate/pull/77)\n\n#### Performance\n\n* Schema cleaning: skip unnecessary copies during schema walking by [@Viicos](https://github.com/Viicos) in [#10286](https://github.com/pydantic/pydantic/pull/10286)\n* Refactor namespace logic for annotations evaluation by [@Viicos](https://github.com/Viicos) in [#10530](https://github.com/pydantic/pydantic/pull/10530)\n* Improve email regexp on edge cases by [@AlekseyLobanov](https://github.com/AlekseyLobanov) in [#10601](https://github.com/pydantic/pydantic/pull/10601)\n* `CoreMetadata` refactor with an emphasis on documentation, schema build time performance, and reducing complexity by [@sydney-runkle](https://github.com/sydney-runkle) in [#10675](https://github.com/pydantic/pydantic/pull/10675)\n\n#### Packaging\n\n* Bump `pydantic-core` to `v2.27.0` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10825](https://github.com/pydantic/pydantic/pull/10825)\n* Replaced pdm with uv by [@frfahim](https://github.com/frfahim) in [#10727](https://github.com/pydantic/pydantic/pull/10727)\n\n#### Fixes\n\n* Remove guarding check on `computed_field` with `field_serializer` by [@nix010](https://github.com/nix010) in [#10390](https://github.com/pydantic/pydantic/pull/10390)\n* Fix `Predicate` issue in `v2.9.0` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10321](https://github.com/pydantic/pydantic/pull/10321)\n* Fixing `annotated-types` bound by [@sydney-runkle](https://github.com/sydney-runkle) in [#10327](https://github.com/pydantic/pydantic/pull/10327)\n* Turn `tzdata` install requirement into optional `timezone` dependency by [@jakob-keller](https://github.com/jakob-keller) in [#10331](https://github.com/pydantic/pydantic/pull/10331)\n* Use correct types namespace when building `namedtuple` core schemas by [@Viicos](https://github.com/Viicos) in [#10337](https://github.com/pydantic/pydantic/pull/10337)\n* Fix evaluation of stringified annotations during namespace inspection by [@Viicos](https://github.com/Viicos) in [#10347](https://github.com/pydantic/pydantic/pull/10347)\n* Fix `IncEx` type alias definition by [@Viicos](https://github.com/Viicos) in [#10339](https://github.com/pydantic/pydantic/pull/10339)\n* Do not error when trying to evaluate annotations of private attributes by [@Viicos](https://github.com/Viicos) in [#10358](https://github.com/pydantic/pydantic/pull/10358)\n* Fix nested type statement by [@kc0506](https://github.com/kc0506) in [#10369](https://github.com/pydantic/pydantic/pull/10369)\n* Improve typing of `ModelMetaclass.mro` by [@Viicos](https://github.com/Viicos) in [#10372](https://github.com/pydantic/pydantic/pull/10372)\n* Fix class access of deprecated `computed_field`s by [@Viicos](https://github.com/Viicos) in [#10391](https://github.com/pydantic/pydantic/pull/10391)\n* Make sure `inspect.iscoroutinefunction` works on coroutines decorated with `@validate_call` by [@MovisLi](https://github.com/MovisLi) in [#10374](https://github.com/pydantic/pydantic/pull/10374)\n* Fix `NameError` when using `validate_call` with PEP 695 on a class by [@kc0506](https://github.com/kc0506) in [#10380](https://github.com/pydantic/pydantic/pull/10380)\n* Fix `ZoneInfo` with various invalid types by [@sydney-runkle](https://github.com/sydney-runkle) in [#10408](https://github.com/pydantic/pydantic/pull/10408)\n* Fix `PydanticUserError` on empty `model_config` with annotations by [@cdwilson](https://github.com/cdwilson) in [#10412](https://github.com/pydantic/pydantic/pull/10412)\n* Fix variance issue in `_IncEx` type alias, only allow `True` by [@Viicos](https://github.com/Viicos) in [#10414](https://github.com/pydantic/pydantic/pull/10414)\n* Fix serialization schema generation when using `PlainValidator` by [@Viicos](https://github.com/Viicos) in [#10427](https://github.com/pydantic/pydantic/pull/10427)\n* Fix schema generation error when serialization schema holds references by [@Viicos](https://github.com/Viicos) in [#10444](https://github.com/pydantic/pydantic/pull/10444)\n* Inline references if possible when generating schema for `json_schema_input_type` by [@Viicos](https://github.com/Viicos) in [#10439](https://github.com/pydantic/pydantic/pull/10439)\n* Fix recursive arguments in `Representation` by [@Viicos](https://github.com/Viicos) in [#10480](https://github.com/pydantic/pydantic/pull/10480)\n* Fix representation for builtin function types by [@kschwab](https://github.com/kschwab) in [#10479](https://github.com/pydantic/pydantic/pull/10479)\n* Add python validators for decimal constraints (`max_digits` and `decimal_places`) by [@sydney-runkle](https://github.com/sydney-runkle) in [#10506](https://github.com/pydantic/pydantic/pull/10506)\n* Only fetch `__pydantic_core_schema__` from the current class during schema generation by [@Viicos](https://github.com/Viicos) in [#10518](https://github.com/pydantic/pydantic/pull/10518)\n* Fix `stacklevel` on deprecation warnings for `BaseModel` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10520](https://github.com/pydantic/pydantic/pull/10520)\n* Fix warning `stacklevel` in `BaseModel.__init__` by [@Viicos](https://github.com/Viicos) in [#10526](https://github.com/pydantic/pydantic/pull/10526)\n* Improve error handling for in-evaluable refs for discriminator application by [@sydney-runkle](https://github.com/sydney-runkle) in [#10440](https://github.com/pydantic/pydantic/pull/10440)\n* Change the signature of `ConfigWrapper.core_config` to take the title directly by [@Viicos](https://github.com/Viicos) in [#10562](https://github.com/pydantic/pydantic/pull/10562)\n* Do not use the previous config from the stack for dataclasses without config by [@Viicos](https://github.com/Viicos) in [#10576](https://github.com/pydantic/pydantic/pull/10576)\n* Fix serialization for IP types with `mode='python'` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10594](https://github.com/pydantic/pydantic/pull/10594)\n* Support constraint application for `Base64Etc` types by [@sydney-runkle](https://github.com/sydney-runkle) in [#10584](https://github.com/pydantic/pydantic/pull/10584)\n* Fix `validate_call` ignoring `Field` in `Annotated` by [@kc0506](https://github.com/kc0506) in [#10610](https://github.com/pydantic/pydantic/pull/10610)\n* Raise an error when `Self` is invalid by [@kc0506](https://github.com/kc0506) in [#10609](https://github.com/pydantic/pydantic/pull/10609)\n* Using `core_schema.InvalidSchema` instead of metadata injection + checks by [@sydney-runkle](https://github.com/sydney-runkle) in [#10523](https://github.com/pydantic/pydantic/pull/10523)\n* Tweak type alias logic by [@kc0506](https://github.com/kc0506) in [#10643](https://github.com/pydantic/pydantic/pull/10643)\n* Support usage of `type` with `typing.Self` and type aliases by [@kc0506](https://github.com/kc0506) in [#10621](https://github.com/pydantic/pydantic/pull/10621)\n* Use overloads for `Field` and `PrivateAttr` functions by [@Viicos](https://github.com/Viicos) in [#10651](https://github.com/pydantic/pydantic/pull/10651)\n* Clean up the `mypy` plugin implementation by [@Viicos](https://github.com/Viicos) in [#10669](https://github.com/pydantic/pydantic/pull/10669)\n* Properly check for `typing_extensions` variant of `TypeAliasType` by [@Daraan](https://github.com/Daraan) in [#10713](https://github.com/pydantic/pydantic/pull/10713)\n* Allow any mapping in `BaseModel.model_copy()` by [@Viicos](https://github.com/Viicos) in [#10751](https://github.com/pydantic/pydantic/pull/10751)\n* Fix `isinstance` behavior for urls by [@sydney-runkle](https://github.com/sydney-runkle) in [#10766](https://github.com/pydantic/pydantic/pull/10766)\n* Ensure `cached_property` can be set on Pydantic models by [@Viicos](https://github.com/Viicos) in [#10774](https://github.com/pydantic/pydantic/pull/10774)\n* Fix equality checks for primitives in literals by [@sydney-runkle](https://github.com/sydney-runkle) in [pydantic/pydantic-core#1459](https://github.com/pydantic/pydantic-core/pull/1459)\n* Properly enforce `host_required` for URLs by [@Viicos](https://github.com/Viicos) in [pydantic/pydantic-core#1488](https://github.com/pydantic/pydantic-core/pull/1488)\n* Fix when `coerce_numbers_to_str` enabled and string has invalid Unicode character by [@andrey-berenda](https://github.com/andrey-berenda) in [pydantic/pydantic-core#1515](https://github.com/pydantic/pydantic-core/pull/1515)\n* Fix serializing `complex` values in `Enum`s by [@changhc](https://github.com/changhc) in [pydantic/pydantic-core#1524](https://github.com/pydantic/pydantic-core/pull/1524)\n* Refactor `_typing_extra` module by [@Viicos](https://github.com/Viicos) in [#10725](https://github.com/pydantic/pydantic/pull/10725)\n* Support intuitive equality for urls by [@sydney-runkle](https://github.com/sydney-runkle) in [#10798](https://github.com/pydantic/pydantic/pull/10798)\n* Add `bytearray` to `TypeAdapter.validate_json` signature by [@samuelcolvin](https://github.com/samuelcolvin) in [#10802](https://github.com/pydantic/pydantic/pull/10802)\n* Ensure class access of method descriptors is performed when used as a default with `Field` by [@Viicos](https://github.com/Viicos) in [#10816](https://github.com/pydantic/pydantic/pull/10816)\n* Fix circular import with `validate_call` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10807](https://github.com/pydantic/pydantic/pull/10807)\n* Fix error when using type aliases referencing other type aliases by [@Viicos](https://github.com/Viicos) in [#10809](https://github.com/pydantic/pydantic/pull/10809)\n* Fix `IncEx` type alias to be compatible with mypy by [@Viicos](https://github.com/Viicos) in [#10813](https://github.com/pydantic/pydantic/pull/10813)\n* Make `__signature__` a lazy property, do not deepcopy defaults by [@Viicos](https://github.com/Viicos) in [#10818](https://github.com/pydantic/pydantic/pull/10818)\n* Make `__signature__` lazy for dataclasses, too by [@sydney-runkle](https://github.com/sydney-runkle) in [#10832](https://github.com/pydantic/pydantic/pull/10832)\n* Subclass all single host url classes from `AnyUrl` to preserve behavior from v2.9 by [@sydney-runkle](https://github.com/sydney-runkle) in [#10856](https://github.com/pydantic/pydantic/pull/10856)\n\n### New Contributors\n\n* [@jakob-keller](https://github.com/jakob-keller) made their first contribution in [#10331](https://github.com/pydantic/pydantic/pull/10331)\n* [@MovisLi](https://github.com/MovisLi) made their first contribution in [#10374](https://github.com/pydantic/pydantic/pull/10374)\n* [@joaopalmeiro](https://github.com/joaopalmeiro) made their first contribution in [#10405](https://github.com/pydantic/pydantic/pull/10405)\n* [@theunkn0wn1](https://github.com/theunkn0wn1) made their first contribution in [#10378](https://github.com/pydantic/pydantic/pull/10378)\n* [@cdwilson](https://github.com/cdwilson) made their first contribution in [#10412](https://github.com/pydantic/pydantic/pull/10412)\n* [@dlax](https://github.com/dlax) made their first contribution in [#10421](https://github.com/pydantic/pydantic/pull/10421)\n* [@kschwab](https://github.com/kschwab) made their first contribution in [#10479](https://github.com/pydantic/pydantic/pull/10479)\n* [@santibreo](https://github.com/santibreo) made their first contribution in [#10453](https://github.com/pydantic/pydantic/pull/10453)\n* [@FlorianSW](https://github.com/FlorianSW) made their first contribution in [#10478](https://github.com/pydantic/pydantic/pull/10478)\n* [@tkasuz](https://github.com/tkasuz) made their first contribution in [#10555](https://github.com/pydantic/pydantic/pull/10555)\n* [@AlekseyLobanov](https://github.com/AlekseyLobanov) made their first contribution in [#10601](https://github.com/pydantic/pydantic/pull/10601)\n* [@NiclasvanEyk](https://github.com/NiclasvanEyk) made their first contribution in [#10667](https://github.com/pydantic/pydantic/pull/10667)\n* [@mschoettle](https://github.com/mschoettle) made their first contribution in [#10677](https://github.com/pydantic/pydantic/pull/10677)\n* [@Daraan](https://github.com/Daraan) made their first contribution in [#10713](https://github.com/pydantic/pydantic/pull/10713)\n* [@k4nar](https://github.com/k4nar) made their first contribution in [#10736](https://github.com/pydantic/pydantic/pull/10736)\n* [@UriyaHarpeness](https://github.com/UriyaHarpeness) made their first contribution in [#10740](https://github.com/pydantic/pydantic/pull/10740)\n* [@frfahim](https://github.com/frfahim) made their first contribution in [#10727](https://github.com/pydantic/pydantic/pull/10727)\n\n## v2.10.0b2 (2024-11-13)\n\nPre-release, see [the GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.0b2) for details.\n\n## v2.10.0b1 (2024-11-06)\n\nPre-release, see [the GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.0b1) for details.\n\n\n... see [here](https://docs.pydantic.dev/changelog/#v0322-2019-08-17) for earlier changes.\n",
        "description_content_type": "text/markdown",
        "author_email": "Samuel Colvin <s@muelcolvin.com>, Eric Jolibois <em.jolibois@gmail.com>, Hasan Ramezani <hasan.r67@gmail.com>, Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Terrence Dorsey <terry@pydantic.dev>, David Montague <david@pydantic.dev>, Serge Matveenko <lig@countzero.co>, Marcelo Trylesinski <marcelotryle@gmail.com>, Sydney Runkle <sydneymarierunkle@gmail.com>, David Hewitt <mail@davidhewitt.dev>, Alex Hall <alex.mojaki@gmail.com>, Victorien Plot <contact@vctrn.dev>",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Framework :: Hypothesis",
          "Framework :: Pydantic",
          "Intended Audience :: Developers",
          "Intended Audience :: Information Technology",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: Internet",
          "Topic :: Software Development :: Libraries :: Python Modules"
        ],
        "requires_dist": [
          "annotated-types>=0.6.0",
          "pydantic-core==2.46.4",
          "typing-extensions>=4.14.1",
          "typing-inspection>=0.4.2",
          "email-validator>=2.0.0; extra == 'email'",
          "tzdata; (python_version >= '3.9' and platform_system == 'Windows') and extra == 'timezone'"
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Homepage, https://github.com/pydantic/pydantic",
          "Documentation, https://docs.pydantic.dev",
          "Funding, https://github.com/sponsors/samuelcolvin",
          "Source, https://github.com/pydantic/pydantic",
          "Changelog, https://docs.pydantic.dev/latest/changelog/"
        ],
        "provides_extra": [
          "email",
          "timezone"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/pydantic-2.13.4.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "iniconfig",
        "version": "2.3.0",
        "dynamic": [
          "license-file"
        ],
        "summary": "brain-dead simple config-ini parsing",
        "description": "iniconfig: brain-dead simple parsing of ini files\n=======================================================\n\niniconfig is a small and simple INI-file parser module\nhaving a unique set of features:\n\n* maintains order of sections and entries\n* supports multi-line values with or without line-continuations\n* supports \"#\" comments everywhere\n* raises errors with proper line-numbers\n* no bells and whistles like automatic substitutions\n* iniconfig raises an Error if two sections have the same name.\n\nIf you encounter issues or have feature wishes please report them to:\n\n    https://github.com/RonnyPfannschmidt/iniconfig/issues\n\nBasic Example\n===================================\n\nIf you have an ini file like this:\n\n.. code-block:: ini\n\n    # content of example.ini\n    [section1] # comment\n    name1=value1  # comment\n    name1b=value1,value2  # comment\n\n    [section2]\n    name2=\n        line1\n        line2\n\nthen you can do:\n\n.. code-block:: pycon\n\n    >>> import iniconfig\n    >>> ini = iniconfig.IniConfig(\"example.ini\")\n    >>> ini['section1']['name1'] # raises KeyError if not exists\n    'value1'\n    >>> ini.get('section1', 'name1b', [], lambda x: x.split(\",\"))\n    ['value1', 'value2']\n    >>> ini.get('section1', 'notexist', [], lambda x: x.split(\",\"))\n    []\n    >>> [x.name for x in list(ini)]\n    ['section1', 'section2']\n    >>> list(list(ini)[0].items())\n    [('name1', 'value1'), ('name1b', 'value1,value2')]\n    >>> 'section1' in ini\n    True\n    >>> 'inexistendsection' in ini\n    False\n",
        "description_content_type": "text/x-rst",
        "author_email": "Ronny Pfannschmidt <opensource@ronnypfannschmidt.de>, Holger Krekel <holger.krekel@gmail.com>",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 4 - Beta",
          "Intended Audience :: Developers",
          "Operating System :: MacOS :: MacOS X",
          "Operating System :: Microsoft :: Windows",
          "Operating System :: POSIX",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Topic :: Software Development :: Libraries",
          "Topic :: Utilities"
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Homepage, https://github.com/pytest-dev/iniconfig"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/iniconfig-2.3.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "MarkupSafe",
        "version": "3.0.3",
        "dynamic": [
          "license-file"
        ],
        "summary": "Safely add untrusted strings to HTML/XML markup.",
        "description": "<div align=\"center\"><img src=\"https://raw.githubusercontent.com/pallets/markupsafe/refs/heads/stable/docs/_static/markupsafe-name.svg\" alt=\"\" height=\"150\"></div>\n\n# MarkupSafe\n\nMarkupSafe implements a text object that escapes characters so it is\nsafe to use in HTML and XML. Characters that have special meanings are\nreplaced so that they display as the actual characters. This mitigates\ninjection attacks, meaning untrusted user input can safely be displayed\non a page.\n\n\n## Examples\n\n```pycon\n>>> from markupsafe import Markup, escape\n\n>>> # escape replaces special characters and wraps in Markup\n>>> escape(\"<script>alert(document.cookie);</script>\")\nMarkup('&lt;script&gt;alert(document.cookie);&lt;/script&gt;')\n\n>>> # wrap in Markup to mark text \"safe\" and prevent escaping\n>>> Markup(\"<strong>Hello</strong>\")\nMarkup('<strong>hello</strong>')\n\n>>> escape(Markup(\"<strong>Hello</strong>\"))\nMarkup('<strong>hello</strong>')\n\n>>> # Markup is a str subclass\n>>> # methods and operators escape their arguments\n>>> template = Markup(\"Hello <em>{name}</em>\")\n>>> template.format(name='\"World\"')\nMarkup('Hello <em>&#34;World&#34;</em>')\n```\n\n## Donate\n\nThe Pallets organization develops and supports MarkupSafe and other\npopular packages. In order to grow the community of contributors and\nusers, and allow the maintainers to devote more time to the projects,\n[please donate today][].\n\n[please donate today]: https://palletsprojects.com/donate\n\n## Contributing\n\nSee our [detailed contributing documentation][contrib] for many ways to\ncontribute, including reporting issues, requesting features, asking or answering\nquestions, and making PRs.\n\n[contrib]: https://palletsprojects.com/contributing/\n",
        "description_content_type": "text/markdown",
        "maintainer_email": "Pallets <contact@palletsprojects.com>",
        "license_expression": "BSD-3-Clause",
        "license_file": [
          "LICENSE.txt"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Environment :: Web Environment",
          "Intended Audience :: Developers",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
          "Topic :: Text Processing :: Markup :: HTML",
          "Typing :: Typed"
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Donate, https://palletsprojects.com/donate",
          "Documentation, https://markupsafe.palletsprojects.com/",
          "Changes, https://markupsafe.palletsprojects.com/page/changes/",
          "Source, https://github.com/pallets/markupsafe/",
          "Chat, https://discord.gg/pallets"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/markupsafe-3.0.3.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "idna",
        "version": "3.15",
        "summary": "Internationalized Domain Names in Applications (IDNA)",
        "description": "# Internationalized Domain Names in Applications (IDNA)\n\nSupport for [Internationalized Domain Names in\nApplications (IDNA)](https://tools.ietf.org/html/rfc5891)\nand [Unicode IDNA Compatibility Processing](https://unicode.org/reports/tr46/).\n\nThe latest versions of these standards supplied here provide\nmore comprehensive language coverage and reduce the potential of\nallowing domains with known security vulnerabilities. This library\nis a suitable replacement for the \"encodings.idna\"\nmodule that comes with the Python standard library, but which\nonly supports an older superseded IDNA specification from 2003.\n\nBasic functions are simply executed:\n\n```pycon\n>>> import idna\n>>> idna.encode('ドメイン.テスト')\nb'xn--eckwd4c7c.xn--zckzah'\n>>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))\nドメイン.テスト\n```\n\n\n## Installation\n\nThis package is available for installation from PyPI via the\ntypical mechanisms, such as:\n\n```bash\n$ python3 -m pip install idna\n```\n\n\n## Usage\n\nFor typical usage, the `encode` and `decode` functions will take a\ndomain name argument and perform a conversion to ASCII-compatible encoding\n(known as A-labels), or to Unicode strings (known as U-labels)\nrespectively.\n\n```pycon\n>>> import idna\n>>> idna.encode('ドメイン.テスト')\nb'xn--eckwd4c7c.xn--zckzah'\n>>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))\nドメイン.テスト\n```\n\nConversions can be applied at a per-label basis using the `ulabel` or\n`alabel` functions if necessary:\n\n```pycon\n>>> idna.alabel('测试')\nb'xn--0zwm56d'\n```\n\n\n### Compatibility Mapping (UTS #46)\n\nThis library provides support for [Unicode IDNA Compatibility\nProcessing](https://unicode.org/reports/tr46/) which normalizes input from\ndifferent potential ways a user may input a domain prior to performing the IDNA\nconversion operations. This functionality, known as a\n[mapping](https://tools.ietf.org/html/rfc5895), is considered by the\nspecification to be a local user-interface issue distinct from IDNA\nconversion functionality.\n\nFor example, \"Königsgäßchen\" is not a permissible label as *LATIN\nCAPITAL LETTER K* is not allowed (nor are capital letters in general).\nUTS 46 will convert this into lower case prior to applying the IDNA\nconversion.\n\n```pycon\n>>> import idna\n>>> idna.encode('Königsgäßchen')\n...\nidna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed\n>>> idna.encode('Königsgäßchen', uts46=True)\nb'xn--knigsgchen-b4a3dun'\n>>> print(idna.decode('xn--knigsgchen-b4a3dun'))\nkönigsgäßchen\n```\n\n\n## Exceptions\n\nAll errors raised during the conversion following the specification\nshould raise an exception derived from the `idna.IDNAError` base\nclass.\n\nMore specific exceptions that may be generated as `idna.IDNABidiError`\nwhen the error reflects an illegal combination of left-to-right and\nright-to-left characters in a label; `idna.InvalidCodepoint` when\na specific codepoint is an illegal character in an IDN label (i.e.\nINVALID); and `idna.InvalidCodepointContext` when the codepoint is\nillegal based on its position in the string (i.e. it is CONTEXTO or CONTEXTJ\nbut the contextual requirements are not satisfied.)\n\n## Building and Diagnostics\n\nThe IDNA and UTS 46 functionality relies upon pre-calculated lookup\ntables for performance. These tables are derived from computing against\neligibility criteria in the respective standards using the command-line\nscript `tools/idna-data`.\n\nThis tool will fetch relevant codepoint data from the Unicode repository\nand perform the required calculations to identify eligibility. There are\nthree main modes:\n\n* `idna-data make-libdata`. Generates `idnadata.py` and\n  `uts46data.py`, the pre-calculated lookup tables used for IDNA and\n  UTS 46 conversions. Implementers who wish to track this library against\n  a different Unicode version may use this tool to manually generate a\n  different version of the `idnadata.py` and `uts46data.py` files.\n\n* `idna-data make-table`. Generate a table of the IDNA disposition\n  (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix\n  B.1 of RFC 5892 and the pre-computed tables published by [IANA](https://www.iana.org/).\n\n* `idna-data U+0061`. Prints debugging output on the various\n  properties associated with an individual Unicode codepoint (in this\n  case, U+0061), that are used to assess the IDNA and UTS 46 status of a\n  codepoint. This is helpful in debugging or analysis.\n\nThe tool accepts a number of arguments, described using `idna-data -h`.\nMost notably, the `--version` argument allows the specification\nof the version of Unicode to be used in computing the table data. For\nexample, `idna-data --version 9.0.0 make-libdata` will generate\nlibrary data against Unicode 9.0.0.\n\n\n## Additional Notes\n\n* **Packages**. The latest tagged release version is published in the\n  [Python Package Index](https://pypi.org/project/idna/).\n\n* **Version support**. This library supports Python 3.8 and higher.\n  As this library serves as a low-level toolkit for a variety of\n  applications, many of which strive for broad compatibility with older\n  Python versions, there is no rush to remove older interpreter support.\n  Support for older versions are likely to be removed from new releases\n  as automated tests can no longer easily be run, i.e. once the Python\n  version is officially end-of-life.\n\n* **Testing**. The library has a test suite based on each rule of the\n  IDNA specification, as well as tests that are provided as part of the\n  Unicode Technical Standard 46, [Unicode IDNA Compatibility Processing](https://unicode.org/reports/tr46/).\n\n* **Emoji**. It is an occasional request to support emoji domains in\n  this library. Encoding of symbols like emoji is expressly prohibited by\n  the IDNA technical standard, and emoji domains are broadly phased\n  out across the domain industry due to associated security risks.\n\n* **Transitional processing**. Unicode 16.0.0 removed transitional\n  processing so the `transitional` argument for the encode() method\n  no longer has any effect and will be removed at a later date.\n\n",
        "description_content_type": "text/markdown",
        "author_email": "Kim Davies <kim+pypi@gumleaf.org>",
        "license_expression": "BSD-3-Clause",
        "license_file": [
          "LICENSE.md"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "Intended Audience :: System Administrators",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: Internet :: Name Service (DNS)",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Topic :: Utilities"
        ],
        "requires_dist": [
          "ruff >= 0.6.2 ; extra == \"all\"",
          "mypy >= 1.11.2 ; extra == \"all\"",
          "pytest >= 8.3.2 ; extra == \"all\""
        ],
        "requires_python": ">=3.8",
        "project_url": [
          "Changelog, https://github.com/kjd/idna/blob/master/HISTORY.md",
          "Issue tracker, https://github.com/kjd/idna/issues",
          "Source, https://github.com/kjd/idna"
        ],
        "provides_extra": [
          "all"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/idna-3.15.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "jsonschema",
        "version": "4.26.0",
        "summary": "An implementation of JSON Schema validation for Python",
        "description": "==========\njsonschema\n==========\n\n|PyPI| |Pythons| |CI| |ReadTheDocs| |Precommit| |Zenodo|\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/jsonschema.svg\n   :alt: PyPI version\n   :target: https://pypi.org/project/jsonschema/\n\n.. |Pythons| image:: https://img.shields.io/pypi/pyversions/jsonschema.svg\n   :alt: Supported Python versions\n   :target: https://pypi.org/project/jsonschema/\n\n.. |CI| image:: https://github.com/python-jsonschema/jsonschema/workflows/CI/badge.svg\n  :alt: Build status\n  :target: https://github.com/python-jsonschema/jsonschema/actions?query=workflow%3ACI\n\n.. |ReadTheDocs| image:: https://readthedocs.org/projects/python-jsonschema/badge/?version=stable&style=flat\n   :alt: ReadTheDocs status\n   :target: https://python-jsonschema.readthedocs.io/en/stable/\n\n.. |Precommit| image:: https://results.pre-commit.ci/badge/github/python-jsonschema/jsonschema/main.svg\n   :alt: pre-commit.ci status\n   :target: https://results.pre-commit.ci/latest/github/python-jsonschema/jsonschema/main\n\n.. |Zenodo| image:: https://zenodo.org/badge/3072629.svg\n   :alt: Zenodo DOI\n   :target: https://zenodo.org/badge/latestdoi/3072629\n\n\n``jsonschema`` is an implementation of the `JSON Schema <https://json-schema.org>`_ specification for Python.\n\n.. code:: python\n\n    >>> from jsonschema import validate\n\n    >>> # A sample schema, like what we'd get from json.load()\n    >>> schema = {\n    ...     \"type\" : \"object\",\n    ...     \"properties\" : {\n    ...         \"price\" : {\"type\" : \"number\"},\n    ...         \"name\" : {\"type\" : \"string\"},\n    ...     },\n    ... }\n\n    >>> # If no exception is raised by validate(), the instance is valid.\n    >>> validate(instance={\"name\" : \"Eggs\", \"price\" : 34.99}, schema=schema)\n\n    >>> validate(\n    ...     instance={\"name\" : \"Eggs\", \"price\" : \"Invalid\"}, schema=schema,\n    ... )                                   # doctest: +IGNORE_EXCEPTION_DETAIL\n    Traceback (most recent call last):\n        ...\n    ValidationError: 'Invalid' is not of type 'number'\n\nIt can also be used from the command line by installing `check-jsonschema <https://github.com/python-jsonschema/check-jsonschema>`_.\n\nFeatures\n--------\n\n* Full support for `Draft 2020-12 <https://python-jsonschema.readthedocs.io/en/latest/api/jsonschema/validators/#jsonschema.validators.Draft202012Validator>`_, `Draft 2019-09 <https://python-jsonschema.readthedocs.io/en/latest/api/jsonschema/validators/#jsonschema.validators.Draft201909Validator>`_, `Draft 7 <https://python-jsonschema.readthedocs.io/en/latest/api/jsonschema/validators/#jsonschema.validators.Draft7Validator>`_, `Draft 6 <https://python-jsonschema.readthedocs.io/en/latest/api/jsonschema/validators/#jsonschema.validators.Draft6Validator>`_, `Draft 4 <https://python-jsonschema.readthedocs.io/en/latest/api/jsonschema/validators/#jsonschema.validators.Draft4Validator>`_ and `Draft 3 <https://python-jsonschema.readthedocs.io/en/latest/api/jsonschema/validators/#jsonschema.validators.Draft3Validator>`_\n\n* `Lazy validation <https://python-jsonschema.readthedocs.io/en/latest/api/jsonschema/protocols/#jsonschema.protocols.Validator.iter_errors>`_ that can iteratively report *all* validation errors.\n\n* `Programmatic querying <https://python-jsonschema.readthedocs.io/en/latest/errors/>`_ of which properties or items failed validation.\n\n\nInstallation\n------------\n\n``jsonschema`` is available on `PyPI <https://pypi.org/project/jsonschema/>`_. You can install using `pip <https://pip.pypa.io/en/stable/>`_:\n\n.. code:: bash\n\n    $ pip install jsonschema\n\n\nExtras\n======\n\nTwo extras are available when installing the package, both currently related to ``format`` validation:\n\n    * ``format``\n    * ``format-nongpl``\n\nThey can be used when installing in order to include additional dependencies, e.g.:\n\n.. code:: bash\n\n    $ pip install jsonschema'[format]'\n\nBe aware that the mere presence of these dependencies – or even the specification of ``format`` checks in a schema – do *not* activate format checks (as per the specification).\nPlease read the `format validation documentation <https://python-jsonschema.readthedocs.io/en/latest/validate/#validating-formats>`_ for further details.\n\nAbout\n-----\n\nI'm Julian Berman.\n\n``jsonschema`` is on `GitHub <https://github.com/python-jsonschema/jsonschema>`_.\n\nGet in touch, via GitHub or otherwise, if you've got something to contribute, it'd be most welcome!\n\nIf you feel overwhelmingly grateful, you can also `sponsor me <https://github.com/sponsors/Julian/>`_.\n\nAnd for companies who appreciate ``jsonschema`` and its continued support and growth, ``jsonschema`` is also now supportable via `TideLift <https://tidelift.com/subscription/pkg/pypi-jsonschema?utm_source=pypi-jsonschema&utm_medium=referral&utm_campaign=readme>`_.\n\n\nRelease Information\n-------------------\n\nv4.26.0\n=======\n\n* Decrease import time by delaying importing of ``urllib.request`` (#1416).\n",
        "description_content_type": "text/x-rst",
        "keywords": [
          "data validation",
          "json",
          "json schema",
          "jsonschema",
          "validation"
        ],
        "author_email": "Julian Berman <Julian+jsonschema@GrayVines.com>",
        "license_expression": "MIT",
        "license_file": [
          "COPYING"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: File Formats :: JSON",
          "Topic :: File Formats :: JSON :: JSON Schema"
        ],
        "requires_dist": [
          "attrs>=22.2.0",
          "jsonschema-specifications>=2023.03.6",
          "referencing>=0.28.4",
          "rpds-py>=0.25.0",
          "fqdn; extra == 'format'",
          "idna; extra == 'format'",
          "isoduration; extra == 'format'",
          "jsonpointer>1.13; extra == 'format'",
          "rfc3339-validator; extra == 'format'",
          "rfc3987; extra == 'format'",
          "uri-template; extra == 'format'",
          "webcolors>=1.11; extra == 'format'",
          "fqdn; extra == 'format-nongpl'",
          "idna; extra == 'format-nongpl'",
          "isoduration; extra == 'format-nongpl'",
          "jsonpointer>1.13; extra == 'format-nongpl'",
          "rfc3339-validator; extra == 'format-nongpl'",
          "rfc3986-validator>0.1.0; extra == 'format-nongpl'",
          "rfc3987-syntax>=1.1.0; extra == 'format-nongpl'",
          "uri-template; extra == 'format-nongpl'",
          "webcolors>=24.6.0; extra == 'format-nongpl'"
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Homepage, https://github.com/python-jsonschema/jsonschema",
          "Documentation, https://python-jsonschema.readthedocs.io/",
          "Issues, https://github.com/python-jsonschema/jsonschema/issues/",
          "Funding, https://github.com/sponsors/Julian",
          "Tidelift, https://tidelift.com/subscription/pkg/pypi-jsonschema?utm_source=pypi-jsonschema&utm_medium=referral&utm_campaign=pypi-link",
          "Changelog, https://github.com/python-jsonschema/jsonschema/blob/main/CHANGELOG.rst",
          "Source, https://github.com/python-jsonschema/jsonschema"
        ],
        "provides_extra": [
          "format",
          "format-nongpl"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/jsonschema-4.26.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "pycparser",
        "version": "3.0",
        "dynamic": [
          "license-file"
        ],
        "summary": "C parser in Python",
        "description": "===============\npycparser v3.00\n===============\n\n\n.. image:: https://github.com/eliben/pycparser/workflows/pycparser-tests/badge.svg\n  :align: center\n  :target: https://github.com/eliben/pycparser/actions\n\n----\n\n.. contents::\n    :backlinks: none\n\n.. sectnum::\n\nIntroduction\n============\n\nWhat is pycparser?\n------------------\n\n**pycparser** is a parser for the C language, written in pure Python. It is a\nmodule designed to be easily integrated into applications that need to parse\nC source code.\n\nWhat is it good for?\n--------------------\n\nAnything that needs C code to be parsed. The following are some uses for\n**pycparser**, taken from real user reports:\n\n* C code obfuscator\n* Front-end for various specialized C compilers\n* Static code checker\n* Automatic unit-test discovery\n* Adding specialized extensions to the C language\n\nOne of the most popular uses of **pycparser** is in the `cffi\n<https://cffi.readthedocs.io/en/latest/>`_ library, which uses it to parse the\ndeclarations of C functions and types in order to auto-generate FFIs.\n\n**pycparser** is unique in the sense that it's written in pure Python - a very\nhigh level language that's easy to experiment with and tweak. To people familiar\nwith Lex and Yacc, **pycparser**'s code will be simple to understand. It also\nhas no external dependencies (except for a Python interpreter), making it very\nsimple to install and deploy.\n\nWhich version of C does pycparser support?\n------------------------------------------\n\n**pycparser** aims to support the full C99 language (according to the standard\nISO/IEC 9899). Some features from C11 are also supported, and patches to support\nmore are welcome.\n\n**pycparser** supports very few GCC extensions, but it's fairly easy to set\nthings up so that it parses code with a lot of GCC-isms successfully. See the\n`FAQ <https://github.com/eliben/pycparser/wiki/FAQ>`_ for more details.\n\nWhat grammar does pycparser follow?\n-----------------------------------\n\n**pycparser** very closely follows the C grammar provided in Annex A of the C99\nstandard (ISO/IEC 9899).\n\nHow is pycparser licensed?\n--------------------------\n\n`BSD license <https://github.com/eliben/pycparser/blob/master/LICENSE>`_.\n\nContact details\n---------------\n\nFor reporting problems with **pycparser** or submitting feature requests, please\nopen an `issue <https://github.com/eliben/pycparser/issues>`_, or submit a\npull request.\n\n\nInstalling\n==========\n\nPrerequisites\n-------------\n\n**pycparser** is being tested with modern versions of Python on\nLinux, macOS and Windows. See `the CI dashboard <https://github.com/eliben/pycparser/actions/workflows/ci.yml>`__\nfor details.\n\n**pycparser** has no external dependencies.\n\nInstallation process\n--------------------\n\nThe recommended way to install **pycparser** is with ``pip``::\n\n    > pip install pycparser\n\nUsing\n=====\n\nInteraction with the C preprocessor\n-----------------------------------\n\nIn order to be compilable, C code must be preprocessed by the C preprocessor -\n``cpp``. A compatible ``cpp`` handles preprocessing directives like ``#include`` and\n``#define``, removes comments, and performs other minor tasks that prepare the C\ncode for compilation.\n\nFor all but the most trivial snippets of C code **pycparser**, like a C\ncompiler, must receive preprocessed C code in order to function correctly. If\nyou import the top-level ``parse_file`` function from the **pycparser** package,\nit will interact with ``cpp`` for you, as long as it's in your PATH, or you\nprovide a path to it.\n\nNote also that you can use ``gcc -E`` or ``clang -E`` instead of ``cpp``. See\nthe ``using_gcc_E_libc.py`` example for more details. Windows users can download\nand install a binary build of Clang for Windows `from this website\n<http://llvm.org/releases/download.html>`_.\n\nWhat about the standard C library headers?\n------------------------------------------\n\nC code almost always ``#include``\\s various header files from the standard C\nlibrary, like ``stdio.h``. While (with some effort) **pycparser** can be made to\nparse the standard headers from any C compiler, it's much simpler to use the\nprovided \"fake\" standard includes for C11 in ``utils/fake_libc_include``. These\nare standard C header files that contain only the bare necessities to allow\nvalid parsing of the files that use them. As a bonus, since they're minimal, it\ncan significantly improve the performance of parsing large C files.\n\nThe key point to understand here is that **pycparser** doesn't really care about\nthe semantics of types. It only needs to know whether some token encountered in\nthe source is a previously defined type. This is essential in order to be able\nto parse C correctly.\n\nSee `this blog post\n<https://eli.thegreenplace.net/2015/on-parsing-c-type-declarations-and-fake-headers>`_\nfor more details.\n\nNote that the fake headers are not included in the ``pip`` package nor installed\nvia the package build (`#224 <https://github.com/eliben/pycparser/issues/224>`_).\n\nBasic usage\n-----------\n\nTake a look at the |examples|_ directory of the distribution for a few examples\nof using **pycparser**. These should be enough to get you started. Please note\nthat most realistic C code samples would require running the C preprocessor\nbefore passing the code to **pycparser**; see the previous sections for more\ndetails.\n\n.. |examples| replace:: ``examples``\n.. _examples: examples\n\n\nAdvanced usage\n--------------\n\nThe public interface of **pycparser** is well documented with comments in\n``pycparser/c_parser.py``. For a detailed overview of the various AST nodes\ncreated by the parser, see ``pycparser/_c_ast.cfg``.\n\nThere's also a `FAQ available here <https://github.com/eliben/pycparser/wiki/FAQ>`_.\nIn any case, you can always drop me an `email <eliben@gmail.com>`_ for help.\n\n\nModifying\n=========\n\nThere are a few points to keep in mind when modifying **pycparser**:\n\n* The code for **pycparser**'s AST nodes is automatically generated from a\n  configuration file - ``_c_ast.cfg``, by ``_ast_gen.py``. If you modify the AST\n  configuration, make sure to re-generate the code. This can be done by running\n  the ``_ast_gen.py`` script (from the repository root or the\n  ``pycparser`` directory).\n* Read the docstring in the constructor of the ``CParser`` class for details\n  on configuration and compatibility arguments.\n\n\nPackage contents\n================\n\nOnce you unzip the ``pycparser`` package, you'll see the following files and\ndirectories:\n\nREADME.rst:\n  This README file.\n\nLICENSE:\n  The pycparser license\n\nsetup.py:\n  Legacy installation script (build metadata lives in ``pyproject.toml``).\n\npyproject.toml:\n  Package metadata and build configuration.\n\nexamples/:\n  A directory with some examples of using **pycparser**\n\npycparser/:\n  The **pycparser** module source code.\n\ntests/:\n  Unit tests.\n\nutils/fake_libc_include:\n  Minimal standard C library include files that should allow to parse any C code.\n  Note that these headers now include C11 code, so they may not work when the\n  preprocessor is configured to an earlier C standard (like ``-std=c99``).\n\nutils/internal/:\n  Internal utilities for my own use. You probably don't need them.\n\n\nContributors\n============\n\nSome people have contributed to **pycparser** by opening issues on bugs they've\nfound and/or submitting patches. The list of contributors is in the CONTRIBUTORS\nfile in the source distribution. After **pycparser** moved to Github I stopped\nupdating this list because Github does a much better job at tracking\ncontributions.\n",
        "description_content_type": "text/x-rst",
        "author_email": "Eli Bendersky <eliben@gmail.com>",
        "maintainer_email": "Eli Bendersky <eliben@gmail.com>",
        "license_expression": "BSD-3-Clause",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14"
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Homepage, https://github.com/eliben/pycparser"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/pycparser-3.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "jsonschema-specifications",
        "version": "2025.9.1",
        "summary": "The JSON Schema meta-schemas and vocabularies, exposed as a Registry",
        "description": "=============================\n``jsonschema-specifications``\n=============================\n\n|PyPI| |Pythons| |CI| |ReadTheDocs|\n\nJSON support files from the `JSON Schema Specifications <https://json-schema.org/specification.html>`_ (metaschemas, vocabularies, etc.), packaged for runtime access from Python as a `referencing-based Schema Registry <https://referencing.readthedocs.io/en/stable/api/#referencing.Registry>`_.\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/jsonschema-specifications.svg\n  :alt: PyPI version\n  :target: https://pypi.org/project/jsonschema-specifications/\n\n.. |Pythons| image:: https://img.shields.io/pypi/pyversions/jsonschema-specifications.svg\n  :alt: Supported Python versions\n  :target: https://pypi.org/project/jsonschema-specifications/\n\n.. |CI| image:: https://github.com/python-jsonschema/jsonschema-specifications/workflows/CI/badge.svg\n  :alt: Build status\n  :target: https://github.com/python-jsonschema/jsonschema-specifications/actions?query=workflow%3ACI\n\n.. |ReadTheDocs| image:: https://readthedocs.org/projects/jsonschema-specifications/badge/?version=stable&style=flat\n  :alt: ReadTheDocs status\n  :target: https://jsonschema-specifications.readthedocs.io/en/stable/\n",
        "description_content_type": "text/x-rst",
        "keywords": [
          "data validation",
          "json",
          "json schema",
          "jsonschema",
          "validation"
        ],
        "author_email": "Julian Berman <Julian+jsonschema-specifications@GrayVines.com>",
        "license_expression": "MIT",
        "license_file": [
          "COPYING"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: File Formats :: JSON",
          "Topic :: File Formats :: JSON :: JSON Schema"
        ],
        "requires_dist": [
          "referencing>=0.31.0"
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Documentation, https://jsonschema-specifications.readthedocs.io/",
          "Homepage, https://github.com/python-jsonschema/jsonschema-specifications",
          "Issues, https://github.com/python-jsonschema/jsonschema-specifications/issues/",
          "Funding, https://github.com/sponsors/Julian",
          "Tidelift, https://tidelift.com/subscription/pkg/pypi-jsonschema-specifications?utm_source=pypi-jsonschema-specifications&utm_medium=referral&utm_campaign=pypi-link",
          "Source, https://github.com/python-jsonschema/jsonschema-specifications"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/jsonschema_specifications-2025.9.1.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "watchfiles",
        "version": "1.1.1",
        "summary": "Simple, modern and high performance file watching and code reload in python.",
        "description": "# watchfiles\n\n[![CI](https://github.com/samuelcolvin/watchfiles/actions/workflows/ci.yml/badge.svg)](https://github.com/samuelcolvin/watchfiles/actions/workflows/ci.yml?query=branch%3Amain)\n[![Coverage](https://codecov.io/gh/samuelcolvin/watchfiles/branch/main/graph/badge.svg)](https://codecov.io/gh/samuelcolvin/watchfiles)\n[![pypi](https://img.shields.io/pypi/v/watchfiles.svg)](https://pypi.python.org/pypi/watchfiles)\n[![CondaForge](https://img.shields.io/conda/v/conda-forge/watchfiles.svg)](https://anaconda.org/conda-forge/watchfiles)\n[![license](https://img.shields.io/github/license/samuelcolvin/watchfiles.svg)](https://github.com/samuelcolvin/watchfiles/blob/main/LICENSE)\n\nSimple, modern and high performance file watching and code reload in python.\n\n---\n\n**Documentation**: [watchfiles.helpmanual.io](https://watchfiles.helpmanual.io)\n\n**Source Code**: [github.com/samuelcolvin/watchfiles](https://github.com/samuelcolvin/watchfiles)\n\n---\n\nUnderlying file system notifications are handled by the [Notify](https://github.com/notify-rs/notify) rust library.\n\nThis package was previously named \"watchgod\",\nsee [the migration guide](https://watchfiles.helpmanual.io/migrating/) for more information.\n\n## Installation\n\n**watchfiles** requires Python 3.9 - 3.14.\n\n```bash\npip install watchfiles\n```\n\nBinaries are available for most architectures on Linux, MacOS and Windows ([learn more](https://watchfiles.helpmanual.io/#installation)).\n\nOtherwise, you can install from source which requires Rust stable to be installed.\n\n## Usage\n\nHere are some examples of what **watchfiles** can do:\n\n### `watch` Usage\n\n```py\nfrom watchfiles import watch\n\nfor changes in watch('./path/to/dir'):\n    print(changes)\n```\nSee [`watch` docs](https://watchfiles.helpmanual.io/api/watch/#watchfiles.watch) for more details.\n\n### `awatch` Usage\n\n```py\nimport asyncio\nfrom watchfiles import awatch\n\nasync def main():\n    async for changes in awatch('/path/to/dir'):\n        print(changes)\n\nasyncio.run(main())\n```\nSee [`awatch` docs](https://watchfiles.helpmanual.io/api/watch/#watchfiles.awatch) for more details.\n\n### `run_process` Usage\n\n```py\nfrom watchfiles import run_process\n\ndef foobar(a, b, c):\n    ...\n\nif __name__ == '__main__':\n    run_process('./path/to/dir', target=foobar, args=(1, 2, 3))\n```\nSee [`run_process` docs](https://watchfiles.helpmanual.io/api/run_process/#watchfiles.run_process) for more details.\n\n### `arun_process` Usage\n\n```py\nimport asyncio\nfrom watchfiles import arun_process\n\ndef foobar(a, b, c):\n    ...\n\nasync def main():\n    await arun_process('./path/to/dir', target=foobar, args=(1, 2, 3))\n\nif __name__ == '__main__':\n    asyncio.run(main())\n```\nSee [`arun_process` docs](https://watchfiles.helpmanual.io/api/run_process/#watchfiles.arun_process) for more details.\n\n## CLI\n\n**watchfiles** also comes with a CLI for running and reloading code. To run `some command` when files in `src` change:\n\n```\nwatchfiles \"some command\" src\n```\n\nFor more information, see [the CLI docs](https://watchfiles.helpmanual.io/cli/).\n\nOr run\n\n```bash\nwatchfiles --help\n```\n\n",
        "description_content_type": "text/markdown; charset=UTF-8; variant=GFM",
        "home_page": "https://github.com/samuelcolvin/watchfiles",
        "author_email": "Samuel Colvin <s@muelcolvin.com>",
        "license": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Environment :: Console",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Intended Audience :: Developers",
          "Intended Audience :: Information Technology",
          "Intended Audience :: System Administrators",
          "License :: OSI Approved :: MIT License",
          "Operating System :: POSIX :: Linux",
          "Operating System :: Microsoft :: Windows",
          "Operating System :: MacOS",
          "Environment :: MacOS X",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Topic :: System :: Filesystems",
          "Framework :: AnyIO"
        ],
        "requires_dist": [
          "anyio>=3.0.0"
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Homepage, https://github.com/samuelcolvin/watchfiles",
          "Documentation, https://watchfiles.helpmanual.io",
          "Funding, https://github.com/sponsors/samuelcolvin",
          "Source, https://github.com/samuelcolvin/watchfiles",
          "Changelog, https://github.com/samuelcolvin/watchfiles/releases"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/watchfiles-1.1.1.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "pluggy",
        "version": "1.6.0",
        "dynamic": [
          "license-file"
        ],
        "summary": "plugin and hook calling mechanisms for python",
        "description": "====================================================\npluggy - A minimalist production ready plugin system\n====================================================\n\n|pypi| |conda-forge| |versions| |github-actions| |gitter| |black| |codecov|\n\nThis is the core framework used by the `pytest`_, `tox`_, and `devpi`_ projects.\n\nPlease `read the docs`_ to learn more!\n\nA definitive example\n====================\n.. code-block:: python\n\n    import pluggy\n\n    hookspec = pluggy.HookspecMarker(\"myproject\")\n    hookimpl = pluggy.HookimplMarker(\"myproject\")\n\n\n    class MySpec:\n        \"\"\"A hook specification namespace.\"\"\"\n\n        @hookspec\n        def myhook(self, arg1, arg2):\n            \"\"\"My special little hook that you can customize.\"\"\"\n\n\n    class Plugin_1:\n        \"\"\"A hook implementation namespace.\"\"\"\n\n        @hookimpl\n        def myhook(self, arg1, arg2):\n            print(\"inside Plugin_1.myhook()\")\n            return arg1 + arg2\n\n\n    class Plugin_2:\n        \"\"\"A 2nd hook implementation namespace.\"\"\"\n\n        @hookimpl\n        def myhook(self, arg1, arg2):\n            print(\"inside Plugin_2.myhook()\")\n            return arg1 - arg2\n\n\n    # create a manager and add the spec\n    pm = pluggy.PluginManager(\"myproject\")\n    pm.add_hookspecs(MySpec)\n\n    # register plugins\n    pm.register(Plugin_1())\n    pm.register(Plugin_2())\n\n    # call our ``myhook`` hook\n    results = pm.hook.myhook(arg1=1, arg2=2)\n    print(results)\n\n\nRunning this directly gets us::\n\n    $ python docs/examples/toy-example.py\n    inside Plugin_2.myhook()\n    inside Plugin_1.myhook()\n    [-1, 3]\n\n\n.. badges\n\n.. |pypi| image:: https://img.shields.io/pypi/v/pluggy.svg\n    :target: https://pypi.org/pypi/pluggy\n\n.. |versions| image:: https://img.shields.io/pypi/pyversions/pluggy.svg\n    :target: https://pypi.org/pypi/pluggy\n\n.. |github-actions| image:: https://github.com/pytest-dev/pluggy/workflows/main/badge.svg\n    :target: https://github.com/pytest-dev/pluggy/actions\n\n.. |conda-forge| image:: https://img.shields.io/conda/vn/conda-forge/pluggy.svg\n    :target: https://anaconda.org/conda-forge/pytest\n\n.. |gitter| image:: https://badges.gitter.im/pytest-dev/pluggy.svg\n    :alt: Join the chat at https://gitter.im/pytest-dev/pluggy\n    :target: https://gitter.im/pytest-dev/pluggy?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge\n\n.. |black| image:: https://img.shields.io/badge/code%20style-black-000000.svg\n    :target: https://github.com/ambv/black\n\n.. |codecov| image:: https://codecov.io/gh/pytest-dev/pluggy/branch/master/graph/badge.svg\n    :target: https://codecov.io/gh/pytest-dev/pluggy\n    :alt: Code coverage Status\n\n.. links\n.. _pytest:\n    http://pytest.org\n.. _tox:\n    https://tox.readthedocs.org\n.. _devpi:\n    http://doc.devpi.net\n.. _read the docs:\n   https://pluggy.readthedocs.io/en/latest/\n\n\nSupport pluggy\n--------------\n\n`Open Collective`_ is an online funding platform for open and transparent communities.\nIt provides tools to raise money and share your finances in full transparency.\n\nIt is the platform of choice for individuals and companies that want to make one-time or\nmonthly donations directly to the project.\n\n``pluggy`` is part of the ``pytest-dev`` project, see more details in the `pytest collective`_.\n\n.. _Open Collective: https://opencollective.com\n.. _pytest collective: https://opencollective.com/pytest\n",
        "description_content_type": "text/x-rst",
        "author_email": "Holger Krekel <holger@merlinux.eu>",
        "license": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 6 - Mature",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: MIT License",
          "Operating System :: POSIX",
          "Operating System :: Microsoft :: Windows",
          "Operating System :: MacOS :: MacOS X",
          "Topic :: Software Development :: Testing",
          "Topic :: Software Development :: Libraries",
          "Topic :: Utilities",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13"
        ],
        "requires_dist": [
          "pre-commit; extra == \"dev\"",
          "tox; extra == \"dev\"",
          "pytest; extra == \"testing\"",
          "pytest-benchmark; extra == \"testing\"",
          "coverage; extra == \"testing\""
        ],
        "requires_python": ">=3.9",
        "provides_extra": [
          "dev",
          "testing"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/pluggy-1.6.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "multidict",
        "version": "6.7.1",
        "dynamic": [
          "license-file"
        ],
        "summary": "multidict implementation",
        "description": "=========\nmultidict\n=========\n\n.. image:: https://github.com/aio-libs/multidict/actions/workflows/ci-cd.yml/badge.svg\n   :target: https://github.com/aio-libs/multidict/actions\n   :alt: GitHub status for master branch\n\n.. image:: https://codecov.io/gh/aio-libs/multidict/branch/master/graph/badge.svg?flag=pytest\n   :target: https://codecov.io/gh/aio-libs/multidict?flags[]=pytest\n   :alt: Coverage metrics\n\n.. image:: https://img.shields.io/pypi/v/multidict.svg\n   :target: https://pypi.org/project/multidict\n   :alt: PyPI\n\n.. image:: https://readthedocs.org/projects/multidict/badge/?version=latest\n   :target: https://multidict.aio-libs.org\n   :alt: Read The Docs build status badge\n\n.. image:: https://img.shields.io/endpoint?url=https://codspeed.io/badge.json\n   :target: https://codspeed.io/aio-libs/multidict\n   :alt: CodSpeed\n\n.. image:: https://img.shields.io/pypi/pyversions/multidict.svg\n   :target: https://pypi.org/project/multidict\n   :alt: Python versions\n\n.. image:: https://img.shields.io/matrix/aio-libs:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat\n   :target: https://matrix.to/#/%23aio-libs:matrix.org\n   :alt: Matrix Room — #aio-libs:matrix.org\n\n.. image:: https://img.shields.io/matrix/aio-libs-space:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs-space%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat\n   :target: https://matrix.to/#/%23aio-libs-space:matrix.org\n   :alt: Matrix Space — #aio-libs-space:matrix.org\n\nMultidict is dict-like collection of *key-value pairs* where key\nmight occur more than once in the container.\n\nIntroduction\n------------\n\n*HTTP Headers* and *URL query string* require specific data structure:\n*multidict*. It behaves mostly like a regular ``dict`` but it may have\nseveral *values* for the same *key* and *preserves insertion ordering*.\n\nThe *key* is ``str`` (or ``istr`` for case-insensitive dictionaries).\n\n``multidict`` has four multidict classes:\n``MultiDict``, ``MultiDictProxy``, ``CIMultiDict``\nand ``CIMultiDictProxy``.\n\nImmutable proxies (``MultiDictProxy`` and\n``CIMultiDictProxy``) provide a dynamic view for the\nproxied multidict, the view reflects underlying collection changes. They\nimplement the ``collections.abc.Mapping`` interface.\n\nRegular mutable (``MultiDict`` and ``CIMultiDict``) classes\nimplement ``collections.abc.MutableMapping`` and allows them to change\ntheir own content.\n\n\n*Case insensitive* (``CIMultiDict`` and\n``CIMultiDictProxy``) assume the *keys* are case\ninsensitive, e.g.::\n\n   >>> dct = CIMultiDict(key='val')\n   >>> 'Key' in dct\n   True\n   >>> dct['Key']\n   'val'\n\n*Keys* should be ``str`` or ``istr`` instances.\n\nThe library has optional C Extensions for speed.\n\n\nLicense\n-------\n\nApache 2\n\nLibrary Installation\n--------------------\n\n.. code-block:: bash\n\n   $ pip install multidict\n\nThe library is Python 3 only!\n\nPyPI contains binary wheels for Linux, Windows and MacOS.  If you want to install\n``multidict`` on another operating system (or *Alpine Linux* inside a Docker) the\ntarball will be used to compile the library from source.  It requires a C compiler and\nPython headers to be installed.\n\nTo skip the compilation, please use the `MULTIDICT_NO_EXTENSIONS` environment variable,\ne.g.:\n\n.. code-block:: bash\n\n   $ MULTIDICT_NO_EXTENSIONS=1 pip install multidict\n\nPlease note, the pure Python (uncompiled) version is about 20-50 times slower depending on\nthe usage scenario!!!\n\nFor extension development, set the ``MULTIDICT_DEBUG_BUILD`` environment variable to compile\nthe extensions in debug mode:\n\n.. code-block:: console\n\n   $ MULTIDICT_DEBUG_BUILD=1 pip install multidict\n\nChangelog\n---------\nSee `RTD page <http://multidict.aio-libs.org/en/latest/changes>`_.\n",
        "description_content_type": "text/x-rst",
        "home_page": "https://github.com/aio-libs/multidict",
        "author": "Andrew Svetlov",
        "author_email": "andrew.svetlov@gmail.com",
        "license": "Apache License 2.0",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14"
        ],
        "requires_dist": [
          "typing-extensions>=4.1.0; python_version < \"3.11\""
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org",
          "Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org",
          "CI: GitHub, https://github.com/aio-libs/multidict/actions",
          "Code of Conduct, https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md",
          "Coverage: codecov, https://codecov.io/github/aio-libs/multidict",
          "Docs: Changelog, https://multidict.aio-libs.org/en/latest/changes/",
          "Docs: RTD, https://multidict.aio-libs.org",
          "GitHub: issues, https://github.com/aio-libs/multidict/issues",
          "GitHub: repo, https://github.com/aio-libs/multidict"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/multidict-6.7.1.dist-info",
      "installer": "pip",
      "requested": false
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "discord.py",
        "version": "2.7.1",
        "dynamic": [
          "license-file"
        ],
        "summary": "A Python wrapper for the Discord API",
        "description": "discord.py\n==========\n\n.. image:: https://discord.com/api/guilds/336642139381301249/embed.png\n   :target: https://discord.gg/r3sSKJJ\n   :alt: Discord server invite\n.. image:: https://img.shields.io/pypi/v/discord.py.svg\n   :target: https://pypi.python.org/pypi/discord.py\n   :alt: PyPI version info\n.. image:: https://img.shields.io/pypi/pyversions/discord.py.svg\n   :target: https://pypi.python.org/pypi/discord.py\n   :alt: PyPI supported Python versions\n\nA modern, easy to use, feature-rich, and async ready API wrapper for Discord written in Python.\n\nKey Features\n-------------\n\n- Modern Pythonic API using ``async`` and ``await``.\n- Proper rate limit handling.\n- Optimised in both speed and memory.\n\nInstalling\n----------\n\n**Python 3.8 or higher is required**\n\nTo install the library without full voice support, you can just run the following command:\n\n.. note::\n\n    A `Virtual Environment <https://docs.python.org/3/library/venv.html>`__ is recommended to install\n    the library, especially on Linux where the system Python is externally managed and restricts which\n    packages you can install on it.\n\n\n.. code:: sh\n\n    # Linux/macOS\n    python3 -m pip install -U discord.py\n\n    # Windows\n    py -3 -m pip install -U discord.py\n\nOtherwise to get voice support you should run the following command:\n\n.. code:: sh\n\n    # Linux/macOS\n    python3 -m pip install -U \"discord.py[voice]\"\n\n    # Windows\n    py -3 -m pip install -U discord.py[voice]\n\n\nTo install the development version, do the following:\n\n.. code:: sh\n\n    $ git clone https://github.com/Rapptz/discord.py\n    $ cd discord.py\n    $ python3 -m pip install -U .[voice]\n\n\nOptional Packages\n~~~~~~~~~~~~~~~~~~\n\n* `PyNaCl <https://pypi.org/project/PyNaCl/>`__ (for voice support)\n\nPlease note that when installing voice support on Linux, you must install the following packages via your favourite package manager (e.g. ``apt``, ``dnf``, etc) before running the above commands:\n\n* libffi-dev (or ``libffi-devel`` on some systems)\n* python-dev (e.g. ``python3.8-dev`` for Python 3.8)\n\nQuick Example\n--------------\n\n.. code:: py\n\n    import discord\n\n    class MyClient(discord.Client):\n        async def on_ready(self):\n            print('Logged on as', self.user)\n\n        async def on_message(self, message):\n            # don't respond to ourselves\n            if message.author == self.user:\n                return\n\n            if message.content == 'ping':\n                await message.channel.send('pong')\n\n    intents = discord.Intents.default()\n    intents.message_content = True\n    client = MyClient(intents=intents)\n    client.run('token')\n\nBot Example\n~~~~~~~~~~~~~\n\n.. code:: py\n\n    import discord\n    from discord.ext import commands\n\n    intents = discord.Intents.default()\n    intents.message_content = True\n    bot = commands.Bot(command_prefix='>', intents=intents)\n\n    @bot.command()\n    async def ping(ctx):\n        await ctx.send('pong')\n\n    bot.run('token')\n\nYou can find more examples in the examples directory.\n\nLinks\n------\n\n- `Documentation <https://discordpy.readthedocs.io/en/latest/index.html>`_\n- `Official Discord Server <https://discord.gg/r3sSKJJ>`_\n- `Discord API <https://discord.gg/discord-api>`_\n",
        "description_content_type": "text/x-rst",
        "author": "Rapptz",
        "license": "The MIT License (MIT)\n\nCopyright (c) 2015-present Rapptz\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the \"Software\"),\nto deal in the Software without restriction, including without limitation\nthe rights to use, copy, modify, merge, publish, distribute, sublicense,\nand/or sell copies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "License :: OSI Approved :: MIT License",
          "Intended Audience :: Developers",
          "Natural Language :: English",
          "Operating System :: OS Independent",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Topic :: Internet",
          "Topic :: Software Development :: Libraries",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Topic :: Utilities",
          "Typing :: Typed"
        ],
        "requires_dist": [
          "aiohttp<4,>=3.7.4",
          "audioop-lts; python_version >= \"3.13\"",
          "PyNaCl<1.6,>=1.5.0; extra == \"voice\"",
          "davey>=0.1.0; extra == \"voice\"",
          "sphinx==4.4.0; extra == \"docs\"",
          "sphinxcontrib_trio==1.1.2; extra == \"docs\"",
          "sphinxcontrib-websupport==1.2.4; extra == \"docs\"",
          "sphinxcontrib-applehelp==1.0.4; extra == \"docs\"",
          "sphinxcontrib-devhelp==1.0.2; extra == \"docs\"",
          "sphinxcontrib-htmlhelp==2.0.1; extra == \"docs\"",
          "sphinxcontrib-jsmath==1.0.1; extra == \"docs\"",
          "sphinxcontrib-qthelp==1.0.3; extra == \"docs\"",
          "sphinxcontrib-serializinghtml==1.1.5; extra == \"docs\"",
          "typing-extensions<5,>=4.3; extra == \"docs\"",
          "sphinx-inline-tabs==2023.4.21; extra == \"docs\"",
          "imghdr-lts==1.0.0; python_version >= \"3.13\" and extra == \"docs\"",
          "orjson>=3.5.4; extra == \"speed\"",
          "aiodns>=1.1; sys_platform != \"win32\" and extra == \"speed\"",
          "Brotli; extra == \"speed\"",
          "cchardet==2.1.7; python_version < \"3.10\" and extra == \"speed\"",
          "zstandard>=0.23.0; python_version <= \"3.13\" and extra == \"speed\"",
          "coverage[toml]; extra == \"test\"",
          "pytest; extra == \"test\"",
          "pytest-asyncio; extra == \"test\"",
          "pytest-cov; extra == \"test\"",
          "pytest-mock; extra == \"test\"",
          "typing-extensions<5,>=4.3; extra == \"test\"",
          "tzdata; sys_platform == \"win32\" and extra == \"test\"",
          "ruff==0.12; extra == \"dev\"",
          "typing_extensions<5,>=4.3; extra == \"dev\""
        ],
        "requires_python": ">=3.8",
        "project_url": [
          "Documentation, https://discordpy.readthedocs.io/en/latest/",
          "Issue tracker, https://github.com/Rapptz/discord.py/issues"
        ],
        "provides_extra": [
          "voice",
          "docs",
          "speed",
          "test",
          "dev"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/discord_py-2.7.1.dist-info",
      "installer": "uv",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "referencing",
        "version": "0.37.0",
        "summary": "JSON Referencing + Python",
        "description": "===============\n``referencing``\n===============\n\n|PyPI| |Pythons| |CI| |ReadTheDocs| |pre-commit|\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/referencing.svg\n  :alt: PyPI version\n  :target: https://pypi.org/project/referencing/\n\n.. |Pythons| image:: https://img.shields.io/pypi/pyversions/referencing.svg\n  :alt: Supported Python versions\n  :target: https://pypi.org/project/referencing/\n\n.. |CI| image:: https://github.com/python-jsonschema/referencing/workflows/CI/badge.svg\n  :alt: Build status\n  :target: https://github.com/python-jsonschema/referencing/actions?query=workflow%3ACI\n\n.. |ReadTheDocs| image:: https://readthedocs.org/projects/referencing/badge/?version=stable&style=flat\n   :alt: ReadTheDocs status\n   :target: https://referencing.readthedocs.io/en/stable/\n\n.. |pre-commit| image:: https://results.pre-commit.ci/badge/github/python-jsonschema/referencing/main.svg\n  :alt: pre-commit.ci status\n  :target: https://results.pre-commit.ci/latest/github/python-jsonschema/referencing/main\n\n\nAn implementation-agnostic implementation of JSON reference resolution.\n\nSee `the documentation <https://referencing.readthedocs.io/>`_ for more details.\n",
        "description_content_type": "text/x-rst",
        "keywords": [
          "asyncapi",
          "json",
          "jsonschema",
          "openapi",
          "referencing"
        ],
        "author_email": "Julian Berman <Julian+referencing@GrayVines.com>",
        "license_expression": "MIT",
        "license_file": [
          "COPYING"
        ],
        "classifier": [
          "Development Status :: 3 - Alpha",
          "Intended Audience :: Developers",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: File Formats :: JSON",
          "Topic :: File Formats :: JSON :: JSON Schema"
        ],
        "requires_dist": [
          "attrs>=22.2.0",
          "rpds-py>=0.7.0",
          "typing-extensions>=4.4.0; python_version < '3.13'"
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Documentation, https://referencing.readthedocs.io/",
          "Homepage, https://github.com/python-jsonschema/referencing",
          "Issues, https://github.com/python-jsonschema/referencing/issues/",
          "Funding, https://github.com/sponsors/Julian",
          "Tidelift, https://tidelift.com/subscription/pkg/pypi-referencing?utm_source=pypi-referencing&utm_medium=referral&utm_campaign=pypi-link",
          "Changelog, https://referencing.readthedocs.io/en/stable/changes/",
          "Source, https://github.com/python-jsonschema/referencing"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/referencing-0.37.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "ty",
        "version": "0.0.21",
        "summary": "An extremely fast Python type checker, written in Rust.",
        "description": "# ty\n\n[![ty](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ty/main/assets/badge/v0.json)](https://github.com/astral-sh/ty)\n[![PyPI](https://img.shields.io/pypi/v/ty.svg)](https://pypi.python.org/pypi/ty)\n[![Discord](https://img.shields.io/badge/Discord-%235865F2.svg?logo=discord&logoColor=white)](https://discord.com/invite/astral-sh)\n\nAn extremely fast Python type checker and language server, written in Rust.\n\n<br />\n\n<p align=\"center\">\n  <img alt=\"Shows a bar chart with benchmark results.\" width=\"500px\" src=\"https://raw.githubusercontent.com/astral-sh/ty/main/docs/assets/ty-benchmark-cli-light.svg\">\n</p>\n\n<p align=\"center\">\n  <i>Type checking the <a href=\"https://github.com/home-assistant/core\">home-assistant</a> project without caching.</i>\n</p>\n\n<br />\n\nty is backed by [Astral](https://astral.sh), the creators of\n[uv](https://github.com/astral-sh/uv) and [Ruff](https://github.com/astral-sh/ruff).\n\nty is currently in [beta](https://github.com/astral-sh/ty/blob/0.0.21/README.md#version-policy).\n\n## Highlights\n\n- 10x - 100x faster than mypy and Pyright\n- Comprehensive [diagnostics](https://docs.astral.sh/ty/features/diagnostics/) with rich contextual information\n- Configurable [rule levels](https://docs.astral.sh/ty/rules/), [per-file overrides](https://docs.astral.sh/ty/reference/configuration/#overrides), [suppression comments](https://docs.astral.sh/ty/suppression/), and first-class project support\n- Designed for adoption, with support for [redeclarations](https://docs.astral.sh/ty/features/type-system/#redeclarations) and [partially typed code](https://docs.astral.sh/ty/features/type-system/#gradual-guarantee)\n- [Language server](https://docs.astral.sh/ty/features/language-server/) with code navigation, completions, code actions, auto-import, inlay hints, on-hover help, etc.\n- Fine-grained [incremental analysis](https://docs.astral.sh/ty/features/language-server/#fine-grained-incrementality) designed for fast updates when editing files in an IDE\n- Editor integrations for [VS Code](https://docs.astral.sh/ty/editors/#vs-code), [PyCharm](https://docs.astral.sh/ty/editors/#pycharm), [Neovim](https://docs.astral.sh/ty/editors/#neovim) and more\n- Advanced typing features like first-class [intersection types](https://docs.astral.sh/ty/features/type-system/#intersection-types), advanced [type narrowing](https://docs.astral.sh/ty/features/type-system/#top-and-bottom-materializations), and\n    [sophisticated reachability analysis](https://docs.astral.sh/ty/features/type-system/#reachability-based-on-types)\n\n## Getting started\n\nRun ty with [uvx](https://docs.astral.sh/uv/guides/tools/#running-tools) to get started quickly:\n\n```shell\nuvx ty check\n```\n\nOr, check out the [ty playground](https://play.ty.dev) to try it out in your browser.\n\nTo learn more about using ty, see the [documentation](https://docs.astral.sh/ty/).\n\n## Installation\n\nTo install ty, see the [installation](https://docs.astral.sh/ty/installation/) documentation.\n\nTo add the ty language server to your editor, see the [editor integration](https://docs.astral.sh/ty/editors/) guide.\n\n## Getting help\n\nIf you have questions or want to report a bug, please open an\n[issue](https://github.com/astral-sh/ty/issues) in this repository.\n\nYou may also join our [Discord server](https://discord.com/invite/astral-sh).\n\n## Contributing\n\nDevelopment of this project takes place in the [Ruff](https://github.com/astral-sh/ruff) repository\nat this time. Please [open pull requests](https://github.com/astral-sh/ruff/pulls) there for changes\nto anything in the `ruff` submodule (which includes all of the Rust source code).\n\nSee the\n[contributing guide](https://github.com/astral-sh/ty/blob/0.0.21/CONTRIBUTING.md) for more details.\n\n## Version policy\n\nty uses `0.0.x` versioning. ty does not yet have a stable API; breaking changes, including changes\nto diagnostics, may occur between any two versions. See the [type system support](https://github.com/astral-sh/ty/issues/1889)\ntracking issue for a detailed overview of currently supported features.\n\n## FAQ\n\n<!-- We intentionally use smaller headings for the FAQ items -->\n\n<!-- markdownlint-disable MD001 -->\n\n#### Why is ty doing \\_\\_\\_\\_\\_?\n\nSee our [typing FAQ](https://docs.astral.sh/ty/reference/typing-faq).\n\n#### How do you pronounce ty?\n\nIt's pronounced as \"tee - why\" ([`/tiː waɪ/`](https://en.wikipedia.org/wiki/Help:IPA/English#Key))\n\n#### How should I stylize ty?\n\nJust \"ty\", please.\n\n<!-- markdownlint-enable MD001 -->\n\n## License\n\nty is licensed under the MIT license ([LICENSE](https://github.com/astral-sh/ty/blob/0.0.21/LICENSE) or\n<https://opensource.org/licenses/MIT>).\n\nUnless you explicitly state otherwise, any contribution intentionally submitted for inclusion in ty\nby you, as defined in the MIT license, shall be licensed as above, without any additional terms or\nconditions.\n\n<div align=\"center\">\n  <a target=\"_blank\" href=\"https://astral.sh\" style=\"background:none\">\n    <img src=\"https://raw.githubusercontent.com/astral-sh/uv/main/assets/svg/Astral.svg\" alt=\"Made by Astral\">\n  </a>\n</div>\n\n",
        "description_content_type": "text/markdown; charset=UTF-8; variant=GFM",
        "keywords": [
          "ty",
          "typing",
          "analysis",
          "check"
        ],
        "home_page": "https://github.com/astral-sh/ty/",
        "author_email": "\"Astral Software Inc.\" <hey@astral.sh>",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 4 - Beta",
          "Environment :: Console",
          "Intended Audience :: Developers",
          "Operating System :: OS Independent",
          "License :: OSI Approved :: MIT License",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Rust",
          "Topic :: Software Development :: Quality Assurance",
          "Topic :: Software Development :: Testing",
          "Topic :: Software Development :: Libraries",
          "Topic :: Software Development :: Libraries :: Python Modules"
        ],
        "requires_python": ">=3.8",
        "project_url": [
          "Changelog, https://github.com/astral-sh/ty/blob/main/CHANGELOG.md",
          "Discord, https://discord.gg/astral-sh",
          "Releases, https://github.com/astral-sh/ty/releases",
          "Repository, https://github.com/astral-sh/ty"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/ty-0.0.21.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.1",
        "name": "PyNaCl",
        "version": "1.5.0",
        "platform": [
          "UNKNOWN"
        ],
        "summary": "Python binding to the Networking and Cryptography (NaCl) library",
        "description": "===============================================\nPyNaCl: Python binding to the libsodium library\n===============================================\n\n.. image:: https://img.shields.io/pypi/v/pynacl.svg\n    :target: https://pypi.org/project/PyNaCl/\n    :alt: Latest Version\n\n.. image:: https://codecov.io/github/pyca/pynacl/coverage.svg?branch=main\n    :target: https://codecov.io/github/pyca/pynacl?branch=main\n\n.. image:: https://img.shields.io/pypi/pyversions/pynacl.svg\n    :target: https://pypi.org/project/PyNaCl/\n    :alt: Compatible Python Versions\n\nPyNaCl is a Python binding to `libsodium`_, which is a fork of the\n`Networking and Cryptography library`_. These libraries have a stated goal of\nimproving usability, security and speed. It supports Python 3.6+ as well as\nPyPy 3.\n\n.. _libsodium: https://github.com/jedisct1/libsodium\n.. _Networking and Cryptography library: https://nacl.cr.yp.to/\n\nFeatures\n--------\n\n* Digital signatures\n* Secret-key encryption\n* Public-key encryption\n* Hashing and message authentication\n* Password based key derivation and password hashing\n\n`Changelog`_\n------------\n\n.. _Changelog: https://pynacl.readthedocs.io/en/stable/changelog/\n\nInstallation\n============\n\nBinary wheel install\n--------------------\n\nPyNaCl ships as a binary wheel on macOS, Windows and Linux ``manylinux1`` [#many]_ ,\nso all dependencies are included. Make sure you have an up-to-date pip\nand run:\n\n.. code-block:: console\n\n    $ pip install pynacl\n\nFaster wheel build\n------------------\n\nYou can define the environment variable ``LIBSODIUM_MAKE_ARGS`` to pass arguments to ``make``\nand enable `parallelization`_:\n\n.. code-block:: console\n\n    $ LIBSODIUM_MAKE_ARGS=-j4 pip install pynacl\n\nLinux source build\n------------------\n\nPyNaCl relies on `libsodium`_, a portable C library. A copy is bundled\nwith PyNaCl so to install you can run:\n\n.. code-block:: console\n\n    $ pip install pynacl\n\nIf you'd prefer to use the version of ``libsodium`` provided by your\ndistribution, you can disable the bundled copy during install by running:\n\n.. code-block:: console\n\n    $ SODIUM_INSTALL=system pip install pynacl\n\n.. warning:: Usage of the legacy ``easy_install`` command provided by setuptools\n   is generally discouraged, and is completely unsupported in PyNaCl's case.\n\n.. _parallelization: https://www.gnu.org/software/make/manual/html_node/Parallel.html\n\n.. _libsodium: https://github.com/jedisct1/libsodium\n\n.. [#many] `manylinux1 wheels <https://www.python.org/dev/peps/pep-0513/>`_\n    are built on a baseline linux environment based on Centos 5.11\n    and should work on most x86 and x86_64 glibc based linux environments.\n\nChangelog\n=========\n\n1.5.0 (2022-01-07)\n------------------\n\n* **BACKWARDS INCOMPATIBLE:** Removed support for Python 2.7 and Python 3.5.\n* **BACKWARDS INCOMPATIBLE:** We no longer distribute ``manylinux1``\n  wheels.\n* Added ``manylinux2014``, ``manylinux_2_24``, ``musllinux``, and macOS\n  ``universal2`` wheels (the latter supports macOS ``arm64``).\n* Update ``libsodium`` to 1.0.18-stable (July 25, 2021 release).\n* Add inline type hints.\n\n1.4.0 (2020-05-25)\n------------------\n\n* Update ``libsodium`` to 1.0.18.\n* **BACKWARDS INCOMPATIBLE:** We no longer distribute 32-bit ``manylinux1``\n  wheels. Continuing to produce them was a maintenance burden.\n* Added support for Python 3.8, and removed support for Python 3.4.\n* Add low level bindings for extracting the seed and the public key\n  from crypto_sign_ed25519 secret key\n* Add low level bindings for deterministic random generation.\n* Add ``wheel`` and ``setuptools`` setup_requirements in ``setup.py`` (#485)\n* Fix checks on very slow builders (#481, #495)\n* Add low-level bindings to ed25519 arithmetic functions\n* Update low-level blake2b state implementation\n* Fix wrong short-input behavior of SealedBox.decrypt() (#517)\n* Raise CryptPrefixError exception instead of InvalidkeyError when trying\n  to check a password against a verifier stored in a unknown format (#519)\n* Add support for minimal builds of libsodium. Trying to call functions\n  not available in a minimal build will raise an UnavailableError\n  exception. To compile a minimal build of the bundled libsodium, set\n  the SODIUM_INSTALL_MINIMAL environment variable to any non-empty\n  string (e.g. ``SODIUM_INSTALL_MINIMAL=1``) for setup.\n\n1.3.0 2018-09-26\n----------------\n\n* Added support for Python 3.7.\n* Update ``libsodium`` to 1.0.16.\n* Run and test all code examples in PyNaCl docs through sphinx's\n  doctest builder.\n* Add low-level bindings for chacha20-poly1305 AEAD constructions.\n* Add low-level bindings for the chacha20-poly1305 secretstream constructions.\n* Add low-level bindings for ed25519ph pre-hashed signing construction.\n* Add low-level bindings for constant-time increment and addition\n  on fixed-precision big integers represented as little-endian\n  byte sequences.\n* Add low-level bindings for the ISO/IEC 7816-4 compatible padding API.\n* Add low-level bindings for libsodium's crypto_kx... key exchange\n  construction.\n* Set hypothesis deadline to None in tests/test_pwhash.py to avoid\n  incorrect test failures on slower processor architectures.  GitHub\n  issue #370\n\n1.2.1 - 2017-12-04\n------------------\n\n* Update hypothesis minimum allowed version.\n* Infrastructure: add proper configuration for readthedocs builder\n  runtime environment.\n\n1.2.0 - 2017-11-01\n------------------\n\n* Update ``libsodium`` to 1.0.15.\n* Infrastructure: add jenkins support for automatic build of\n  ``manylinux1`` binary wheels\n* Added support for ``SealedBox`` construction.\n* Added support for ``argon2i`` and ``argon2id`` password hashing constructs\n  and restructured high-level password hashing implementation to expose\n  the same interface for all hashers.\n* Added support for 128 bit ``siphashx24`` variant of ``siphash24``.\n* Added support for ``from_seed`` APIs for X25519 keypair generation.\n* Dropped support for Python 3.3.\n\n1.1.2 - 2017-03-31\n------------------\n\n* reorder link time library search path when using bundled\n  libsodium\n\n1.1.1 - 2017-03-15\n------------------\n\n* Fixed a circular import bug in ``nacl.utils``.\n\n1.1.0 - 2017-03-14\n------------------\n\n* Dropped support for Python 2.6.\n* Added ``shared_key()`` method on ``Box``.\n* You can now pass ``None`` to ``nonce`` when encrypting with ``Box`` or\n  ``SecretBox`` and it will automatically generate a random nonce.\n* Added support for ``siphash24``.\n* Added support for ``blake2b``.\n* Added support for ``scrypt``.\n* Update ``libsodium`` to 1.0.11.\n* Default to the bundled ``libsodium`` when compiling.\n* All raised exceptions are defined mixing-in\n  ``nacl.exceptions.CryptoError``\n\n1.0.1 - 2016-01-24\n------------------\n\n* Fix an issue with absolute paths that prevented the creation of wheels.\n\n1.0 - 2016-01-23\n----------------\n\n* PyNaCl has been ported to use the new APIs available in cffi 1.0+.\n  Due to this change we no longer support PyPy releases older than 2.6.\n* Python 3.2 support has been dropped.\n* Functions to convert between Ed25519 and Curve25519 keys have been added.\n\n0.3.0 - 2015-03-04\n------------------\n\n* The low-level API (`nacl.c.*`) has been changed to match the\n  upstream NaCl C/C++ conventions (as well as those of other NaCl bindings).\n  The order of arguments and return values has changed significantly. To\n  avoid silent failures, `nacl.c` has been removed, and replaced with\n  `nacl.bindings` (with the new argument ordering). If you have code which\n  calls these functions (e.g. `nacl.c.crypto_box_keypair()`), you must review\n  the new docstrings and update your code/imports to match the new\n  conventions.\n\n\n",
        "home_page": "https://github.com/pyca/pynacl/",
        "author": "The PyNaCl developers",
        "author_email": "cryptography-dev@python.org",
        "license": "Apache License 2.0",
        "classifier": [
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.6",
          "Programming Language :: Python :: 3.7",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10"
        ],
        "requires_dist": [
          "cffi (>=1.4.1)",
          "sphinx (>=1.6.5) ; extra == 'docs'",
          "sphinx-rtd-theme ; extra == 'docs'",
          "pytest (!=3.3.0,>=3.2.1) ; extra == 'tests'",
          "hypothesis (>=3.27.0) ; extra == 'tests'"
        ],
        "requires_python": ">=3.6",
        "provides_extra": [
          "docs",
          "tests"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/PyNaCl-1.5.0.dist-info",
      "installer": "uv",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "Jinja2",
        "version": "3.1.6",
        "summary": "A very fast and expressive template engine.",
        "description": "# Jinja\n\nJinja is a fast, expressive, extensible templating engine. Special\nplaceholders in the template allow writing code similar to Python\nsyntax. Then the template is passed data to render the final document.\n\nIt includes:\n\n-   Template inheritance and inclusion.\n-   Define and import macros within templates.\n-   HTML templates can use autoescaping to prevent XSS from untrusted\n    user input.\n-   A sandboxed environment can safely render untrusted templates.\n-   AsyncIO support for generating templates and calling async\n    functions.\n-   I18N support with Babel.\n-   Templates are compiled to optimized Python code just-in-time and\n    cached, or can be compiled ahead-of-time.\n-   Exceptions point to the correct line in templates to make debugging\n    easier.\n-   Extensible filters, tests, functions, and even syntax.\n\nJinja's philosophy is that while application logic belongs in Python if\npossible, it shouldn't make the template designer's job difficult by\nrestricting functionality too much.\n\n\n## In A Nutshell\n\n```jinja\n{% extends \"base.html\" %}\n{% block title %}Members{% endblock %}\n{% block content %}\n  <ul>\n  {% for user in users %}\n    <li><a href=\"{{ user.url }}\">{{ user.username }}</a></li>\n  {% endfor %}\n  </ul>\n{% endblock %}\n```\n\n## Donate\n\nThe Pallets organization develops and supports Jinja and other popular\npackages. In order to grow the community of contributors and users, and\nallow the maintainers to devote more time to the projects, [please\ndonate today][].\n\n[please donate today]: https://palletsprojects.com/donate\n\n## Contributing\n\nSee our [detailed contributing documentation][contrib] for many ways to\ncontribute, including reporting issues, requesting features, asking or answering\nquestions, and making PRs.\n\n[contrib]: https://palletsprojects.com/contributing/\n\n",
        "description_content_type": "text/markdown",
        "maintainer_email": "Pallets <contact@palletsprojects.com>",
        "license_file": [
          "LICENSE.txt"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Environment :: Web Environment",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: BSD License",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
          "Topic :: Text Processing :: Markup :: HTML",
          "Typing :: Typed"
        ],
        "requires_dist": [
          "MarkupSafe>=2.0",
          "Babel>=2.7 ; extra == \"i18n\""
        ],
        "requires_python": ">=3.7",
        "project_url": [
          "Changes, https://jinja.palletsprojects.com/changes/",
          "Chat, https://discord.gg/pallets",
          "Documentation, https://jinja.palletsprojects.com/",
          "Donate, https://palletsprojects.com/donate",
          "Source, https://github.com/pallets/jinja/"
        ],
        "provides_extra": [
          "i18n"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "davey",
        "version": "0.1.6",
        "summary": "A Discord Audio & Video End-to-End Encryption (DAVE) Protocol implementation",
        "description": "# Davey!\n\n[![PyPI version](https://img.shields.io/pypi/v/davey?maxAge=3600)](https://pypi.org/project/davey/) [![PyPI supported python versions](https://img.shields.io/pypi/pyversions/davey?maxAge=3600)](https://pypi.org/project/davey/) [![discord chat](https://img.shields.io/discord/311027228177727508?logo=discord&logoColor=white&color=5865F2)](https://snaz.in/discord)\n\nA [Discord Audio & Video End-to-End Encryption (DAVE) Protocol](https://daveprotocol.com/) implementation using [OpenMLS](https://openmls.tech/).\n\n> Proper usage documentation does not exist yet.\n",
        "description_content_type": "text/markdown; charset=UTF-8; variant=GFM",
        "keywords": [
          "discord",
          "e2ee",
          "mls",
          "rust"
        ],
        "author_email": "Snazzah <me@snazzah.com>",
        "classifier": [
          "Development Status :: 4 - Beta",
          "License :: OSI Approved :: MIT License",
          "Intended Audience :: Developers",
          "Natural Language :: English",
          "Operating System :: OS Independent",
          "Programming Language :: Rust",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: Software Development :: Libraries",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Topic :: Utilities",
          "Typing :: Typed"
        ],
        "requires_python": ">=3.8",
        "project_url": [
          "Issue tracker, https://github.com/Snazzah/davey/issues",
          "Repository, https://github.com/Snazzah/davey"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/davey-0.1.6.dist-info",
      "installer": "uv",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "pip",
        "version": "26.2.1",
        "summary": "The PyPA recommended tool for installing Python packages.",
        "description": "pip - The Python Package Installer\n==================================\n\n.. |pypi-version| image:: https://img.shields.io/pypi/v/pip.svg\n   :target: https://pypi.org/project/pip/\n   :alt: PyPI\n\n.. |python-versions| image:: https://img.shields.io/pypi/pyversions/pip\n   :target: https://pypi.org/project/pip\n   :alt: PyPI - Python Version\n\n.. |docs-badge| image:: https://readthedocs.org/projects/pip/badge/?version=latest\n   :target: https://pip.pypa.io/en/latest\n   :alt: Documentation\n\n|pypi-version| |python-versions| |docs-badge|\n\nPip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.\n\nPlease take a look at our documentation for how to install and use pip:\n\n* `Installation`_\n* `Usage`_\n\nWe release updates regularly, with a new version every 3 months. Find more details in our documentation:\n\n* `Release notes`_\n* `Release process`_\n\nIf you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:\n\n* `Issue tracking`_\n* `Discourse channel`_\n* `User IRC`_\n\nIf you want to get involved, head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:\n\n* `GitHub page`_\n* `Development documentation`_\n* `Development IRC`_\n\nCode of Conduct\n---------------\n\nEveryone interacting in the pip project's codebases, issue trackers, chat\nrooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.\n\n.. _package installer: https://packaging.python.org/guides/tool-recommendations/\n.. _Python Package Index: https://pypi.org\n.. _Installation: https://pip.pypa.io/en/stable/installation/\n.. _Usage: https://pip.pypa.io/en/stable/\n.. _Release notes: https://pip.pypa.io/en/stable/news.html\n.. _Release process: https://pip.pypa.io/en/latest/development/release-process/\n.. _GitHub page: https://github.com/pypa/pip\n.. _Development documentation: https://pip.pypa.io/en/latest/development\n.. _Issue tracking: https://github.com/pypa/pip/issues\n.. _Discourse channel: https://discuss.python.org/c/packaging\n.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa\n.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev\n.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md\n\n",
        "description_content_type": "text/x-rst",
        "author_email": "The pip developers <distutils-sig@python.org>",
        "license_expression": "MIT",
        "license_file": [
          "AUTHORS.txt",
          "LICENSE.txt",
          "src/pip/_vendor/cachecontrol/LICENSE.txt",
          "src/pip/_vendor/certifi/LICENSE",
          "src/pip/_vendor/distlib/LICENSE.txt",
          "src/pip/_vendor/distro/LICENSE",
          "src/pip/_vendor/idna/LICENSE.md",
          "src/pip/_vendor/msgpack/COPYING",
          "src/pip/_vendor/packaging/LICENSE",
          "src/pip/_vendor/packaging/LICENSE.APACHE",
          "src/pip/_vendor/packaging/LICENSE.BSD",
          "src/pip/_vendor/pkg_resources/LICENSE",
          "src/pip/_vendor/platformdirs/LICENSE",
          "src/pip/_vendor/pygments/LICENSE",
          "src/pip/_vendor/pyproject_hooks/LICENSE",
          "src/pip/_vendor/requests/LICENSE",
          "src/pip/_vendor/resolvelib/LICENSE",
          "src/pip/_vendor/rich/LICENSE",
          "src/pip/_vendor/tomli/LICENSE",
          "src/pip/_vendor/tomli_w/LICENSE",
          "src/pip/_vendor/truststore/LICENSE",
          "src/pip/_vendor/urllib3/LICENSE.txt"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "Topic :: Software Development :: Build Tools",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: 3.15",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy"
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Changelog, https://pip.pypa.io/en/stable/news/",
          "Documentation, https://pip.pypa.io",
          "Homepage, https://pip.pypa.io/",
          "Source, https://github.com/pypa/pip"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/pip-26.2.1.dist-info",
      "installer": "uv",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "annotated-doc",
        "version": "0.0.4",
        "summary": "Document parameters, class attributes, return types, and variables inline, with Annotated.",
        "description": "# Annotated Doc\n\nDocument parameters, class attributes, return types, and variables inline, with `Annotated`.\n\n<a href=\"https://github.com/fastapi/annotated-doc/actions?query=workflow%3ATest+event%3Apush+branch%3Amain\" target=\"_blank\">\n    <img src=\"https://github.com/fastapi/annotated-doc/actions/workflows/test.yml/badge.svg?event=push&branch=main\" alt=\"Test\">\n</a>\n<a href=\"https://coverage-badge.samuelcolvin.workers.dev/redirect/fastapi/annotated-doc\" target=\"_blank\">\n    <img src=\"https://coverage-badge.samuelcolvin.workers.dev/fastapi/annotated-doc.svg\" alt=\"Coverage\">\n</a>\n<a href=\"https://pypi.org/project/annotated-doc\" target=\"_blank\">\n    <img src=\"https://img.shields.io/pypi/v/annotated-doc?color=%2334D058&label=pypi%20package\" alt=\"Package version\">\n</a>\n<a href=\"https://pypi.org/project/annotated-doc\" target=\"_blank\">\n    <img src=\"https://img.shields.io/pypi/pyversions/annotated-doc.svg?color=%2334D058\" alt=\"Supported Python versions\">\n</a>\n\n## Installation\n\n```bash\npip install annotated-doc\n```\n\nOr with `uv`:\n\n```Python\nuv add annotated-doc\n```\n\n## Usage\n\nImport `Doc` and pass a single literal string with the documentation for the specific parameter, class attribute, return type, or variable.\n\nFor example, to document a parameter `name` in a function `hi` you could do:\n\n```Python\nfrom typing import Annotated\n\nfrom annotated_doc import Doc\n\ndef hi(name: Annotated[str, Doc(\"Who to say hi to\")]) -> None:\n    print(f\"Hi, {name}!\")\n```\n\nYou can also use it to document class attributes:\n\n```Python\nfrom typing import Annotated\n\nfrom annotated_doc import Doc\n\nclass User:\n    name: Annotated[str, Doc(\"The user's name\")]\n    age: Annotated[int, Doc(\"The user's age\")]\n```\n\nThe same way, you could document return types and variables, or anything that could have a type annotation with `Annotated`.\n\n## Who Uses This\n\n`annotated-doc` was made for:\n\n* [FastAPI](https://fastapi.tiangolo.com/)\n* [Typer](https://typer.tiangolo.com/)\n* [SQLModel](https://sqlmodel.tiangolo.com/)\n* [Asyncer](https://asyncer.tiangolo.com/)\n\n`annotated-doc` is supported by [griffe-typingdoc](https://github.com/mkdocstrings/griffe-typingdoc), which powers reference documentation like the one in the [FastAPI Reference](https://fastapi.tiangolo.com/reference/).\n\n## Reasons not to use `annotated-doc`\n\nYou are already comfortable with one of the existing docstring formats, like:\n\n* Sphinx\n* numpydoc\n* Google\n* Keras\n\nYour team is already comfortable using them.\n\nYou prefer having the documentation about parameters all together in a docstring, separated from the code defining them.\n\nYou care about a specific set of users, using one specific editor, and that editor already has support for the specific docstring format you use.\n\n## Reasons to use `annotated-doc`\n\n* No micro-syntax to learn for newcomers, it’s **just Python** syntax.\n* **Editing** would be already fully supported by default by any editor (current or future) supporting Python syntax, including syntax errors, syntax highlighting, etc.\n* **Rendering** would be relatively straightforward to implement by static tools (tools that don't need runtime execution), as the information can be extracted from the AST they normally already create.\n* **Deduplication of information**: the name of a parameter would be defined in a single place, not duplicated inside of a docstring.\n* **Elimination** of the possibility of having **inconsistencies** when removing a parameter or class variable and **forgetting to remove** its documentation.\n* **Minimization** of the probability of adding a new parameter or class variable and **forgetting to add its documentation**.\n* **Elimination** of the possibility of having **inconsistencies** between the **name** of a parameter in the **signature** and the name in the docstring when it is renamed.\n* **Access** to the documentation string for each symbol at **runtime**, including existing (older) Python versions.\n* A more formalized way to document other symbols, like type aliases, that could use Annotated.\n* **Support** for apps using FastAPI, Typer and others.\n* **AI Accessibility**: AI tools will have an easier way understanding each parameter as the distance from documentation to parameter is much closer.\n\n## History\n\nI ([@tiangolo](https://github.com/tiangolo)) originally wanted for this to be part of the Python standard library (in [PEP 727](https://peps.python.org/pep-0727/)), but the proposal was withdrawn as there was a fair amount of negative feedback and opposition.\n\nThe conclusion was that this was better done as an external effort, in a third-party library.\n\nSo, here it is, with a simpler approach, as a third-party library, in a way that can be used by others, starting with FastAPI and friends.\n\n## License\n\nThis project is licensed under the terms of the MIT license.\n",
        "description_content_type": "text/markdown",
        "author_email": "=?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= <tiangolo@gmail.com>",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Intended Audience :: Information Technology",
          "Intended Audience :: System Administrators",
          "Operating System :: OS Independent",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python",
          "Topic :: Internet",
          "Topic :: Software Development :: Libraries :: Application Frameworks",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Topic :: Software Development :: Libraries",
          "Topic :: Software Development",
          "Typing :: Typed",
          "Development Status :: 4 - Beta",
          "Intended Audience :: Developers",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14"
        ],
        "requires_python": ">=3.8",
        "project_url": [
          "Homepage, https://github.com/fastapi/annotated-doc",
          "Documentation, https://github.com/fastapi/annotated-doc",
          "Repository, https://github.com/fastapi/annotated-doc",
          "Issues, https://github.com/fastapi/annotated-doc/issues",
          "Changelog, https://github.com/fastapi/annotated-doc/release-notes.md"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/annotated_doc-0.0.4.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "starlette",
        "version": "1.0.1",
        "summary": "The little ASGI library that shines.",
        "description": "<p align=\"center\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/Kludex/starlette/main/docs/img/starlette_dark.svg\" width=\"420px\">\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://raw.githubusercontent.com/Kludex/starlette/main/docs/img/starlette.svg\" width=\"420px\">\n    <img alt=\"starlette-logo\" src=\"https://raw.githubusercontent.com/Kludex/starlette/main/docs/img/starlette.svg\">\n  </picture>\n</p>\n\n<p align=\"center\">\n    <em>✨ The little ASGI framework that shines. ✨</em>\n</p>\n\n---\n\n[![Build Status](https://github.com/Kludex/starlette/workflows/Test%20Suite/badge.svg)](https://github.com/Kludex/starlette/actions)\n[![Package version](https://badge.fury.io/py/starlette.svg)](https://pypi.python.org/pypi/starlette)\n[![Supported Python Version](https://img.shields.io/pypi/pyversions/starlette.svg?color=%2334D058)](https://pypi.org/project/starlette)\n[![Discord](https://img.shields.io/discord/1051468649518616576?logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/RxKUF5JuHs)\n\n---\n\n**Documentation**: <a href=\"https://starlette.dev/\" target=\"_blank\">https://starlette.dev</a>\n\n**Source Code**: <a href=\"https://github.com/Kludex/starlette\" target=\"_blank\">https://github.com/Kludex/starlette</a>\n\n---\n\n# Starlette\n\nStarlette is a lightweight [ASGI][asgi] framework/toolkit,\nwhich is ideal for building async web services in Python.\n\nIt is production-ready, and gives you the following:\n\n* A lightweight, low-complexity HTTP web framework.\n* WebSocket support.\n* In-process background tasks.\n* Startup and shutdown events.\n* Test client built on `httpx`.\n* CORS, GZip, Static Files, Streaming responses.\n* Session and Cookie support.\n* 100% test coverage.\n* 100% type annotated codebase.\n* Few hard dependencies.\n* Compatible with `asyncio` and `trio` backends.\n* Great overall performance [against independent benchmarks][techempower].\n\n## Installation\n\n```shell\n$ pip install starlette\n```\n\nYou'll also want to install an ASGI server, such as [uvicorn](https://uvicorn.dev), [daphne](https://github.com/django/daphne/), or [hypercorn](https://hypercorn.readthedocs.io/en/latest/).\n\n```shell\n$ pip install uvicorn\n```\n\n## Example\n\n```python title=\"main.py\"\nfrom starlette.applications import Starlette\nfrom starlette.responses import JSONResponse\nfrom starlette.routing import Route\n\n\nasync def homepage(request):\n    return JSONResponse({'hello': 'world'})\n\nroutes = [\n    Route(\"/\", endpoint=homepage)\n]\n\napp = Starlette(debug=True, routes=routes)\n```\n\nThen run the application using Uvicorn:\n\n```shell\n$ uvicorn main:app\n```\n\n## Dependencies\n\nStarlette only requires `anyio`, and the following are optional:\n\n* [`httpx`][httpx] - Required if you want to use the `TestClient`.\n* [`jinja2`][jinja2] - Required if you want to use `Jinja2Templates`.\n* [`python-multipart`][python-multipart] - Required if you want to support form parsing, with `request.form()`.\n* [`itsdangerous`][itsdangerous] - Required for `SessionMiddleware` support.\n* [`pyyaml`][pyyaml] - Required for `SchemaGenerator` support.\n\nYou can install all of these with `pip install starlette[full]`.\n\n## Framework or Toolkit\n\nStarlette is designed to be used either as a complete framework, or as\nan ASGI toolkit. You can use any of its components independently.\n\n```python\nfrom starlette.responses import PlainTextResponse\n\n\nasync def app(scope, receive, send):\n    assert scope['type'] == 'http'\n    response = PlainTextResponse('Hello, world!')\n    await response(scope, receive, send)\n```\n\nRun the `app` application in `example.py`:\n\n```shell\n$ uvicorn example:app\nINFO: Started server process [11509]\nINFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)\n```\n\nRun uvicorn with `--reload` to enable auto-reloading on code changes.\n\n## Modularity\n\nThe modularity that Starlette is designed on promotes building reusable\ncomponents that can be shared between any ASGI framework. This should enable\nan ecosystem of shared middleware and mountable applications.\n\nThe clean API separation also means it's easier to understand each component\nin isolation.\n\n---\n\n<p align=\"center\"><i>Starlette is <a href=\"https://github.com/Kludex/starlette/blob/main/LICENSE.md\">BSD licensed</a> code.<br/>Designed & crafted with care.</i></br>&mdash; ⭐️ &mdash;</p>\n\n[asgi]: https://asgi.readthedocs.io/en/latest/\n[httpx]: https://www.python-httpx.org/\n[jinja2]: https://jinja.palletsprojects.com/\n[python-multipart]: https://multipart.fastapiexpert.com/\n[itsdangerous]: https://itsdangerous.palletsprojects.com/\n[sqlalchemy]: https://www.sqlalchemy.org\n[pyyaml]: https://pyyaml.org/wiki/PyYAMLDocumentation\n[techempower]: https://www.techempower.com/benchmarks/#hw=ph&test=fortune&l=zijzen-sf\n",
        "description_content_type": "text/markdown",
        "author_email": "Tom Christie <tom@tomchristie.com>",
        "maintainer_email": "Marcelo Trylesinski <marcelotryle@gmail.com>",
        "license_expression": "BSD-3-Clause",
        "license_file": [
          "LICENSE.md"
        ],
        "classifier": [
          "Development Status :: 3 - Alpha",
          "Environment :: Web Environment",
          "Framework :: AnyIO",
          "Intended Audience :: Developers",
          "Operating System :: OS Independent",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Topic :: Internet :: WWW/HTTP"
        ],
        "requires_dist": [
          "anyio<5,>=3.6.2",
          "typing-extensions>=4.10.0; python_version < '3.13'",
          "httpx<0.29.0,>=0.27.0; extra == 'full'",
          "itsdangerous; extra == 'full'",
          "jinja2; extra == 'full'",
          "python-multipart>=0.0.18; extra == 'full'",
          "pyyaml; extra == 'full'"
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Homepage, https://github.com/Kludex/starlette",
          "Documentation, https://starlette.dev/",
          "Changelog, https://starlette.dev/release-notes/",
          "Funding, https://github.com/sponsors/Kludex",
          "Source, https://github.com/Kludex/starlette"
        ],
        "provides_extra": [
          "full"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/starlette-1.0.1.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "aiohttp",
        "version": "3.14.1",
        "dynamic": [
          "license-file"
        ],
        "summary": "Async http client/server framework (asyncio)",
        "description": "==================================\nAsync http client/server framework\n==================================\n\n.. image:: https://raw.githubusercontent.com/aio-libs/aiohttp/master/docs/aiohttp-plain.svg\n   :height: 64px\n   :width: 64px\n   :alt: aiohttp logo\n\n|\n\n.. image:: https://github.com/aio-libs/aiohttp/workflows/CI/badge.svg\n   :target: https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI\n   :alt: GitHub Actions status for master branch\n\n.. image:: https://codecov.io/gh/aio-libs/aiohttp/branch/master/graph/badge.svg\n   :target: https://codecov.io/gh/aio-libs/aiohttp\n   :alt: codecov.io status for master branch\n\n.. image:: https://badge.fury.io/py/aiohttp.svg\n   :target: https://pypi.org/project/aiohttp\n   :alt: Latest PyPI package version\n\n.. image:: https://img.shields.io/pypi/dm/aiohttp\n   :target: https://pypistats.org/packages/aiohttp\n   :alt: Downloads count\n\n.. image:: https://readthedocs.org/projects/aiohttp/badge/?version=latest\n   :target: https://docs.aiohttp.org/\n   :alt: Latest Read The Docs\n\n.. image:: https://img.shields.io/endpoint?url=https://codspeed.io/badge.json\n   :target: https://codspeed.io/aio-libs/aiohttp\n   :alt: Codspeed.io status for aiohttp\n\n\nKey Features\n============\n\n- Supports both client and server side of HTTP protocol.\n- Supports both client and server Web-Sockets out-of-the-box and avoids\n  Callback Hell.\n- Provides Web-server with middleware and pluggable routing.\n\n\nGetting started\n===============\n\nClient\n------\n\nTo get something from the web:\n\n.. code-block:: python\n\n  import aiohttp\n  import asyncio\n\n  async def main():\n\n      async with aiohttp.ClientSession() as session:\n          async with session.get('http://python.org') as response:\n\n              print(\"Status:\", response.status)\n              print(\"Content-type:\", response.headers['content-type'])\n\n              html = await response.text()\n              print(\"Body:\", html[:15], \"...\")\n\n  asyncio.run(main())\n\nThis prints:\n\n.. code-block::\n\n    Status: 200\n    Content-type: text/html; charset=utf-8\n    Body: <!doctype html> ...\n\nComing from `requests <https://requests.readthedocs.io/>`_ ? Read `why we need so many lines <https://aiohttp.readthedocs.io/en/latest/http_request_lifecycle.html>`_.\n\nServer\n------\n\nAn example using a simple server:\n\n.. code-block:: python\n\n    # examples/server_simple.py\n    from aiohttp import web\n\n    async def handle(request):\n        name = request.match_info.get('name', \"Anonymous\")\n        text = \"Hello, \" + name\n        return web.Response(text=text)\n\n    async def wshandle(request):\n        ws = web.WebSocketResponse()\n        await ws.prepare(request)\n\n        async for msg in ws:\n            if msg.type == web.WSMsgType.text:\n                await ws.send_str(\"Hello, {}\".format(msg.data))\n            elif msg.type == web.WSMsgType.binary:\n                await ws.send_bytes(msg.data)\n            elif msg.type == web.WSMsgType.close:\n                break\n\n        return ws\n\n\n    app = web.Application()\n    app.add_routes([web.get('/', handle),\n                    web.get('/echo', wshandle),\n                    web.get('/{name}', handle)])\n\n    if __name__ == '__main__':\n        web.run_app(app)\n\n\nDocumentation\n=============\n\nhttps://aiohttp.readthedocs.io/\n\n\nDemos\n=====\n\nhttps://github.com/aio-libs/aiohttp-demos\n\n\nExternal links\n==============\n\n* `Third party libraries\n  <http://aiohttp.readthedocs.io/en/latest/third_party.html>`_\n* `Built with aiohttp\n  <http://aiohttp.readthedocs.io/en/latest/built_with.html>`_\n* `Powered by aiohttp\n  <http://aiohttp.readthedocs.io/en/latest/powered_by.html>`_\n\nFeel free to make a Pull Request for adding your link to these pages!\n\n\nCommunication channels\n======================\n\n*aio-libs Discussions*: https://github.com/aio-libs/aiohttp/discussions\n\n*Matrix*: `#aio-libs:matrix.org <https://matrix.to/#/#aio-libs:matrix.org>`_\n\nWe support `Stack Overflow\n<https://stackoverflow.com/questions/tagged/aiohttp>`_.\nPlease add *aiohttp* tag to your question there.\n\nRequirements\n============\n\n- attrs_\n- multidict_\n- yarl_\n- frozenlist_\n\nOptionally you may install the aiodns_ library (highly recommended for sake of speed).\n\n.. _aiodns: https://pypi.python.org/pypi/aiodns\n.. _attrs: https://github.com/python-attrs/attrs\n.. _multidict: https://pypi.python.org/pypi/multidict\n.. _frozenlist: https://pypi.org/project/frozenlist/\n.. _yarl: https://pypi.python.org/pypi/yarl\n.. _async-timeout: https://pypi.python.org/pypi/async_timeout\n\n\nKeepsafe\n========\n\nThe aiohttp community would like to thank Keepsafe\n(https://www.getkeepsafe.com) for its support in the early days of\nthe project.\n\n\nSource code\n===========\n\nThe latest developer version is available in a GitHub repository:\nhttps://github.com/aio-libs/aiohttp\n\nBenchmarks\n==========\n\nIf you are interested in efficiency, the AsyncIO community maintains a\nlist of benchmarks on the official wiki:\nhttps://github.com/python/asyncio/wiki/Benchmarks\n\n--------\n\n.. image:: https://img.shields.io/matrix/aio-libs:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat\n   :target: https://matrix.to/#/%23aio-libs:matrix.org\n   :alt: Matrix Room — #aio-libs:matrix.org\n\n.. image:: https://img.shields.io/matrix/aio-libs-space:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs-space%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat\n   :target: https://matrix.to/#/%23aio-libs-space:matrix.org\n   :alt: Matrix Space — #aio-libs-space:matrix.org\n\n.. image:: https://insights.linuxfoundation.org/api/badge/health-score?project=aiohttp\n   :target: https://insights.linuxfoundation.org/project/aiohttp\n   :alt: LFX Health Score\n",
        "description_content_type": "text/x-rst",
        "maintainer_email": "aiohttp team <team@aiohttp.org>",
        "license": "Apache-2.0 AND MIT",
        "license_file": [
          "LICENSE.txt",
          "vendor/llhttp/LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Framework :: AsyncIO",
          "Intended Audience :: Developers",
          "Operating System :: POSIX",
          "Operating System :: MacOS :: MacOS X",
          "Operating System :: Microsoft :: Windows",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Topic :: Internet :: WWW/HTTP"
        ],
        "requires_dist": [
          "aiohappyeyeballs>=2.5.0",
          "aiosignal>=1.4.0",
          "async-timeout<6.0,>=4.0; python_version < \"3.11\"",
          "attrs>=17.3.0",
          "frozenlist>=1.1.1",
          "multidict<7.0,>=4.5",
          "propcache>=0.2.0",
          "typing_extensions>=4.4; python_version < \"3.13\"",
          "yarl<2.0,>=1.17.0",
          "aiodns>=3.3.0; (sys_platform != \"android\" and sys_platform != \"ios\") and extra == \"speedups\"",
          "Brotli>=1.2; (platform_python_implementation == \"CPython\" and sys_platform != \"android\" and sys_platform != \"ios\") and extra == \"speedups\"",
          "brotlicffi>=1.2; platform_python_implementation != \"CPython\" and extra == \"speedups\"",
          "backports.zstd; (platform_python_implementation == \"CPython\" and python_version < \"3.14\" and sys_platform != \"android\" and sys_platform != \"ios\") and extra == \"speedups\""
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Homepage, https://github.com/aio-libs/aiohttp",
          "Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org",
          "Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org",
          "CI: GitHub Actions, https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI",
          "Coverage: codecov, https://codecov.io/github/aio-libs/aiohttp",
          "Docs: Changelog, https://docs.aiohttp.org/en/stable/changes.html",
          "Docs: RTD, https://docs.aiohttp.org",
          "GitHub: issues, https://github.com/aio-libs/aiohttp/issues",
          "GitHub: repo, https://github.com/aio-libs/aiohttp"
        ],
        "provides_extra": [
          "speedups"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/aiohttp-3.14.1.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.1",
        "name": "distro",
        "version": "1.9.0",
        "platform": [
          "All"
        ],
        "summary": "Distro - an OS platform information API",
        "description": "Distro - an OS platform information API\n=======================================\n\n[![CI Status](https://github.com/python-distro/distro/workflows/CI/badge.svg)](https://github.com/python-distro/distro/actions/workflows/ci.yaml)\n[![PyPI version](http://img.shields.io/pypi/v/distro.svg)](https://pypi.python.org/pypi/distro)\n[![Supported Python Versions](https://img.shields.io/pypi/pyversions/distro.svg)](https://img.shields.io/pypi/pyversions/distro.svg)\n[![Code Coverage](https://codecov.io/github/python-distro/distro/coverage.svg?branch=master)](https://codecov.io/github/python-distro/distro?branch=master)\n[![Is Wheel](https://img.shields.io/pypi/wheel/distro.svg?style=flat)](https://pypi.python.org/pypi/distro)\n[![Latest Github Release](https://readthedocs.org/projects/distro/badge/?version=stable)](http://distro.readthedocs.io/en/latest/)\n\n`distro` provides information about the\nOS distribution it runs on, such as a reliable machine-readable ID, or\nversion information.\n\nIt is the recommended replacement for Python's original\n[`platform.linux_distribution`](https://docs.python.org/3.7/library/platform.html#platform.linux_distribution)\nfunction (removed in Python 3.8). It also provides much more functionality\nwhich isn't necessarily Python bound, like a command-line interface.\n\nDistro currently supports Linux and BSD based systems but [Windows and OS X support](https://github.com/python-distro/distro/issues/177) is also planned.\n\nFor Python 2.6 support, see https://github.com/python-distro/distro/tree/python2.6-support\n\n## Installation\n\nInstallation of the latest released version from PyPI:\n\n```shell\npip install distro\n```\n\nInstallation of the latest development version:\n\n```shell\npip install https://github.com/python-distro/distro/archive/master.tar.gz\n```\n\nTo use as a standalone script, download `distro.py` directly:\n\n```shell\ncurl -O https://raw.githubusercontent.com/python-distro/distro/master/src/distro/distro.py\npython distro.py\n```\n\n``distro`` is safe to vendor within projects that do not wish to add\ndependencies.\n\n```shell\ncd myproject\ncurl -O https://raw.githubusercontent.com/python-distro/distro/master/src/distro/distro.py\n```\n\n## Usage\n\n```bash\n$ distro\nName: Antergos Linux\nVersion: 2015.10 (ISO-Rolling)\nCodename: ISO-Rolling\n\n$ distro -j\n{\n    \"codename\": \"ISO-Rolling\",\n    \"id\": \"antergos\",\n    \"like\": \"arch\",\n    \"version\": \"16.9\",\n    \"version_parts\": {\n        \"build_number\": \"\",\n        \"major\": \"16\",\n        \"minor\": \"9\"\n    }\n}\n\n\n$ python\n>>> import distro\n>>> distro.name(pretty=True)\n'CentOS Linux 8'\n>>> distro.id()\n'centos'\n>>> distro.version(best=True)\n'8.4.2105'\n```\n\n\n## Documentation\n\nOn top of the aforementioned API, several more functions are available. For a complete description of the\nAPI, see the [latest API documentation](http://distro.readthedocs.org/en/latest/).\n\n## Background\n\nAn alternative implementation became necessary because Python 3.5 deprecated\nthis function, and Python 3.8 removed it altogether. Its predecessor function\n[`platform.dist`](https://docs.python.org/3.7/library/platform.html#platform.dist)\nwas already deprecated since Python 2.6 and removed in Python 3.8. Still, there\nare many cases in which access to that information is needed. See [Python issue\n1322](https://bugs.python.org/issue1322) for more information.\n\nThe `distro` package implements a robust and inclusive way of retrieving the\ninformation about a distribution based on new standards and old methods,\nnamely from these data sources (from high to low precedence):\n\n* The os-release file `/etc/os-release` if present, with a fall-back on `/usr/lib/os-release` if needed.\n* The output of the `lsb_release` command, if available.\n* The distro release file (`/etc/*(-|_)(release|version)`), if present.\n* The `uname` command for BSD based distrubtions.\n\n\n## Python and Distribution Support\n\n`distro` is supported and tested on Python 3.6+ and PyPy and on any\ndistribution that provides one or more of the data sources covered.\n\nThis package is tested with test data that mimics the exact behavior of the data sources of [a number of Linux distributions](https://github.com/python-distro/distro/tree/master/tests/resources/distros).\n\n\n## Testing\n\n```shell\ngit clone git@github.com:python-distro/distro.git\ncd distro\npip install tox\ntox\n```\n\n\n## Contributions\n\nPull requests are always welcome to deal with specific distributions or just\nfor general merriment.\n\nSee [CONTRIBUTIONS](https://github.com/python-distro/distro/blob/master/CONTRIBUTING.md) for contribution info.\n\nReference implementations for supporting additional distributions and file\nformats can be found here:\n\n* https://github.com/saltstack/salt/blob/develop/salt/grains/core.py#L1172\n* https://github.com/chef/ohai/blob/master/lib/ohai/plugins/linux/platform.rb\n* https://github.com/ansible/ansible/blob/devel/lib/ansible/module_utils/facts/system/distribution.py\n* https://github.com/puppetlabs/facter/blob/master/lib/src/facts/linux/os_linux.cc\n\n## Package manager distributions\n\n* https://src.fedoraproject.org/rpms/python-distro\n* https://www.archlinux.org/packages/community/any/python-distro/\n* https://launchpad.net/ubuntu/+source/python-distro\n* https://packages.debian.org/stable/python3-distro\n* https://packages.gentoo.org/packages/dev-python/distro\n* https://pkgs.org/download/python3-distro\n* https://slackbuilds.org/repository/14.2/python/python-distro/\n",
        "description_content_type": "text/markdown",
        "home_page": "https://github.com/python-distro/distro",
        "author": "Nir Cohen",
        "author_email": "nir36g@gmail.com",
        "license": "Apache License, Version 2.0",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "Intended Audience :: System Administrators",
          "License :: OSI Approved :: Apache Software License",
          "Operating System :: POSIX :: Linux",
          "Operating System :: POSIX :: BSD",
          "Operating System :: POSIX :: BSD :: FreeBSD",
          "Operating System :: POSIX :: BSD :: NetBSD",
          "Operating System :: POSIX :: BSD :: OpenBSD",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.6",
          "Programming Language :: Python :: 3.7",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Topic :: System :: Operating System"
        ],
        "requires_python": ">=3.6"
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/distro-1.9.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.1",
        "name": "sniffio",
        "version": "1.3.1",
        "summary": "Sniff out which async library your code is running under",
        "description": ".. image:: https://img.shields.io/badge/chat-join%20now-blue.svg\n   :target: https://gitter.im/python-trio/general\n   :alt: Join chatroom\n\n.. image:: https://img.shields.io/badge/docs-read%20now-blue.svg\n   :target: https://sniffio.readthedocs.io/en/latest/?badge=latest\n   :alt: Documentation Status\n\n.. image:: https://img.shields.io/pypi/v/sniffio.svg\n   :target: https://pypi.org/project/sniffio\n   :alt: Latest PyPi version\n   \n.. image:: https://img.shields.io/conda/vn/conda-forge/sniffio.svg\n   :target: https://anaconda.org/conda-forge/sniffio \n   :alt: Latest conda-forge version   \n\n.. image:: https://travis-ci.org/python-trio/sniffio.svg?branch=master\n   :target: https://travis-ci.org/python-trio/sniffio\n   :alt: Automated test status\n\n.. image:: https://codecov.io/gh/python-trio/sniffio/branch/master/graph/badge.svg\n   :target: https://codecov.io/gh/python-trio/sniffio\n   :alt: Test coverage\n\n=================================================================\nsniffio: Sniff out which async library your code is running under\n=================================================================\n\nYou're writing a library. You've decided to be ambitious, and support\nmultiple async I/O packages, like `Trio\n<https://trio.readthedocs.io>`__, and `asyncio\n<https://docs.python.org/3/library/asyncio.html>`__, and ... You've\nwritten a bunch of clever code to handle all the differences. But...\nhow do you know *which* piece of clever code to run?\n\nThis is a tiny package whose only purpose is to let you detect which\nasync library your code is running under.\n\n* Documentation: https://sniffio.readthedocs.io\n\n* Bug tracker and source code: https://github.com/python-trio/sniffio\n\n* License: MIT or Apache License 2.0, your choice\n\n* Contributor guide: https://trio.readthedocs.io/en/latest/contributing.html\n\n* Code of conduct: Contributors are requested to follow our `code of\n  conduct\n  <https://trio.readthedocs.io/en/latest/code-of-conduct.html>`_\n  in all project spaces.\n\nThis library is maintained by the Trio project, as a service to the\nasync Python community as a whole.\n\n\nQuickstart\n----------\n\n.. code-block:: python3\n\n   from sniffio import current_async_library\n   import trio\n   import asyncio\n\n   async def print_library():\n       library = current_async_library()\n       print(\"This is:\", library)\n\n   # Prints \"This is trio\"\n   trio.run(print_library)\n\n   # Prints \"This is asyncio\"\n   asyncio.run(print_library())\n\nFor more details, including how to add support to new async libraries,\n`please peruse our fine manual <https://sniffio.readthedocs.io>`__.\n",
        "description_content_type": "text/x-rst",
        "keywords": [
          "async",
          "trio",
          "asyncio"
        ],
        "author_email": "\"Nathaniel J. Smith\" <njs@pobox.com>",
        "license": "MIT OR Apache-2.0",
        "license_file": [
          "LICENSE",
          "LICENSE.APACHE2",
          "LICENSE.MIT"
        ],
        "classifier": [
          "License :: OSI Approved :: MIT License",
          "License :: OSI Approved :: Apache Software License",
          "Framework :: Trio",
          "Framework :: AsyncIO",
          "Operating System :: POSIX :: Linux",
          "Operating System :: MacOS :: MacOS X",
          "Operating System :: Microsoft :: Windows",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Intended Audience :: Developers",
          "Development Status :: 5 - Production/Stable"
        ],
        "requires_python": ">=3.7",
        "project_url": [
          "Homepage, https://github.com/python-trio/sniffio",
          "Documentation, https://sniffio.readthedocs.io/",
          "Changelog, https://sniffio.readthedocs.io/en/latest/history.html"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/sniffio-1.3.1.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.1",
        "name": "pytz",
        "version": "2025.2",
        "platform": [
          "Independent"
        ],
        "summary": "World timezone definitions, modern and historical",
        "description": "pytz - World Timezone Definitions for Python\n============================================\n\n:Author: Stuart Bishop <stuart@stuartbishop.net>\n\nIntroduction\n~~~~~~~~~~~~\n\npytz brings the Olson tz database into Python. This library allows\naccurate and cross platform timezone calculations using Python 2.4\nor higher. It also solves the issue of ambiguous times at the end\nof daylight saving time, which you can read more about in the Python\nLibrary Reference (``datetime.tzinfo``).\n\nAlmost all of the Olson timezones are supported.\n\n.. note::\n\n    Projects using Python 3.9 or later should be using the support\n    now included as part of the standard library, and third party\n    packages work with it such as `tzdata <https://pypi.org/project/tzdata/>`_.\n    pytz offers no advantages beyond backwards compatibility with\n    code written for earlier versions of Python.\n\n.. note::\n\n    This library differs from the documented Python API for\n    tzinfo implementations; if you want to create local wallclock\n    times you need to use the ``localize()`` method documented in this\n    document. In addition, if you perform date arithmetic on local\n    times that cross DST boundaries, the result may be in an incorrect\n    timezone (ie. subtract 1 minute from 2002-10-27 1:00 EST and you get\n    2002-10-27 0:59 EST instead of the correct 2002-10-27 1:59 EDT). A\n    ``normalize()`` method is provided to correct this. Unfortunately these\n    issues cannot be resolved without modifying the Python datetime\n    implementation (see PEP-431).\n\n\nInstallation\n~~~~~~~~~~~~\n\nThis package can either be installed using ``pip`` or from a tarball using the\nstandard Python distutils.\n\nIf you are installing using ``pip``, you don't need to download anything as the\nlatest version will be downloaded for you from PyPI::\n\n    pip install pytz\n\nIf you are installing from a tarball, run the following command as an\nadministrative user::\n\n    python setup.py install\n\n\npytz for Enterprise\n~~~~~~~~~~~~~~~~~~~\n\nAvailable as part of the Tidelift Subscription.\n\nThe maintainers of pytz and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. `Learn more. <https://tidelift.com/subscription/pkg/pypi-pytz?utm_source=pypi-pytz&utm_medium=referral&utm_campaign=enterprise&utm_term=repo>`_.\n\n\nExample & Usage\n~~~~~~~~~~~~~~~\n\nLocalized times and date arithmetic\n-----------------------------------\n\n>>> from datetime import datetime, timedelta\n>>> from pytz import timezone\n>>> import pytz\n>>> utc = pytz.utc\n>>> utc.zone\n'UTC'\n>>> eastern = timezone('US/Eastern')\n>>> eastern.zone\n'US/Eastern'\n>>> amsterdam = timezone('Europe/Amsterdam')\n>>> fmt = '%Y-%m-%d %H:%M:%S %Z%z'\n\nThis library only supports two ways of building a localized time. The\nfirst is to use the ``localize()`` method provided by the pytz library.\nThis is used to localize a naive datetime (datetime with no timezone\ninformation):\n\n>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))\n>>> print(loc_dt.strftime(fmt))\n2002-10-27 06:00:00 EST-0500\n\nThe second way of building a localized time is by converting an existing\nlocalized time using the standard ``astimezone()`` method:\n\n>>> ams_dt = loc_dt.astimezone(amsterdam)\n>>> ams_dt.strftime(fmt)\n'2002-10-27 12:00:00 CET+0100'\n\nUnfortunately using the tzinfo argument of the standard datetime\nconstructors ''does not work'' with pytz for many timezones.\n\n>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=amsterdam).strftime(fmt)  # /!\\ Does not work this way!\n'2002-10-27 12:00:00 LMT+0018'\n\nIt is safe for timezones without daylight saving transitions though, such\nas UTC:\n\n>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=pytz.utc).strftime(fmt)  # /!\\ Not recommended except for UTC\n'2002-10-27 12:00:00 UTC+0000'\n\nThe preferred way of dealing with times is to always work in UTC,\nconverting to localtime only when generating output to be read\nby humans.\n\n>>> utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc)\n>>> loc_dt = utc_dt.astimezone(eastern)\n>>> loc_dt.strftime(fmt)\n'2002-10-27 01:00:00 EST-0500'\n\nThis library also allows you to do date arithmetic using local\ntimes, although it is more complicated than working in UTC as you\nneed to use the ``normalize()`` method to handle daylight saving time\nand other timezone transitions. In this example, ``loc_dt`` is set\nto the instant when daylight saving time ends in the US/Eastern\ntimezone.\n\n>>> before = loc_dt - timedelta(minutes=10)\n>>> before.strftime(fmt)\n'2002-10-27 00:50:00 EST-0500'\n>>> eastern.normalize(before).strftime(fmt)\n'2002-10-27 01:50:00 EDT-0400'\n>>> after = eastern.normalize(before + timedelta(minutes=20))\n>>> after.strftime(fmt)\n'2002-10-27 01:10:00 EST-0500'\n\nCreating local times is also tricky, and the reason why working with\nlocal times is not recommended. Unfortunately, you cannot just pass\na ``tzinfo`` argument when constructing a datetime (see the next\nsection for more details)\n\n>>> dt = datetime(2002, 10, 27, 1, 30, 0)\n>>> dt1 = eastern.localize(dt, is_dst=True)\n>>> dt1.strftime(fmt)\n'2002-10-27 01:30:00 EDT-0400'\n>>> dt2 = eastern.localize(dt, is_dst=False)\n>>> dt2.strftime(fmt)\n'2002-10-27 01:30:00 EST-0500'\n\nConverting between timezones is more easily done, using the\nstandard astimezone method.\n\n>>> utc_dt = datetime.fromtimestamp(1143408899, tz=utc)\n>>> utc_dt.strftime(fmt)\n'2006-03-26 21:34:59 UTC+0000'\n>>> au_tz = timezone('Australia/Sydney')\n>>> au_dt = utc_dt.astimezone(au_tz)\n>>> au_dt.strftime(fmt)\n'2006-03-27 08:34:59 AEDT+1100'\n>>> utc_dt2 = au_dt.astimezone(utc)\n>>> utc_dt2.strftime(fmt)\n'2006-03-26 21:34:59 UTC+0000'\n>>> utc_dt == utc_dt2\nTrue\n\nYou can take shortcuts when dealing with the UTC side of timezone\nconversions. ``normalize()`` and ``localize()`` are not really\nnecessary when there are no daylight saving time transitions to\ndeal with.\n\n>>> utc_dt = datetime.fromtimestamp(1143408899, tz=utc)\n>>> utc_dt.strftime(fmt)\n'2006-03-26 21:34:59 UTC+0000'\n>>> au_tz = timezone('Australia/Sydney')\n>>> au_dt = au_tz.normalize(utc_dt.astimezone(au_tz))\n>>> au_dt.strftime(fmt)\n'2006-03-27 08:34:59 AEDT+1100'\n>>> utc_dt2 = au_dt.astimezone(utc)\n>>> utc_dt2.strftime(fmt)\n'2006-03-26 21:34:59 UTC+0000'\n\n\n``tzinfo`` API\n--------------\n\nThe ``tzinfo`` instances returned by the ``timezone()`` function have\nbeen extended to cope with ambiguous times by adding an ``is_dst``\nparameter to the ``utcoffset()``, ``dst()`` && ``tzname()`` methods.\n\n>>> tz = timezone('America/St_Johns')\n\n>>> normal = datetime(2009, 9, 1)\n>>> ambiguous = datetime(2009, 10, 31, 23, 30)\n\nThe ``is_dst`` parameter is ignored for most timestamps. It is only used\nduring DST transition ambiguous periods to resolve that ambiguity.\n\n>>> print(tz.utcoffset(normal, is_dst=True))\n-1 day, 21:30:00\n>>> print(tz.dst(normal, is_dst=True))\n1:00:00\n>>> tz.tzname(normal, is_dst=True)\n'NDT'\n\n>>> print(tz.utcoffset(ambiguous, is_dst=True))\n-1 day, 21:30:00\n>>> print(tz.dst(ambiguous, is_dst=True))\n1:00:00\n>>> tz.tzname(ambiguous, is_dst=True)\n'NDT'\n\n>>> print(tz.utcoffset(normal, is_dst=False))\n-1 day, 21:30:00\n>>> tz.dst(normal, is_dst=False).seconds\n3600\n>>> tz.tzname(normal, is_dst=False)\n'NDT'\n\n>>> print(tz.utcoffset(ambiguous, is_dst=False))\n-1 day, 20:30:00\n>>> tz.dst(ambiguous, is_dst=False)\ndatetime.timedelta(0)\n>>> tz.tzname(ambiguous, is_dst=False)\n'NST'\n\nIf ``is_dst`` is not specified, ambiguous timestamps will raise\nan ``pytz.exceptions.AmbiguousTimeError`` exception.\n\n>>> print(tz.utcoffset(normal))\n-1 day, 21:30:00\n>>> print(tz.dst(normal))\n1:00:00\n>>> tz.tzname(normal)\n'NDT'\n\n>>> import pytz.exceptions\n>>> try:\n...     tz.utcoffset(ambiguous)\n... except pytz.exceptions.AmbiguousTimeError:\n...     print('pytz.exceptions.AmbiguousTimeError: %s' % ambiguous)\npytz.exceptions.AmbiguousTimeError: 2009-10-31 23:30:00\n>>> try:\n...     tz.dst(ambiguous)\n... except pytz.exceptions.AmbiguousTimeError:\n...     print('pytz.exceptions.AmbiguousTimeError: %s' % ambiguous)\npytz.exceptions.AmbiguousTimeError: 2009-10-31 23:30:00\n>>> try:\n...     tz.tzname(ambiguous)\n... except pytz.exceptions.AmbiguousTimeError:\n...     print('pytz.exceptions.AmbiguousTimeError: %s' % ambiguous)\npytz.exceptions.AmbiguousTimeError: 2009-10-31 23:30:00\n\n\nProblems with Localtime\n~~~~~~~~~~~~~~~~~~~~~~~\n\nThe major problem we have to deal with is that certain datetimes\nmay occur twice in a year. For example, in the US/Eastern timezone\non the last Sunday morning in October, the following sequence\nhappens:\n\n    - 01:00 EDT occurs\n    - 1 hour later, instead of 2:00am the clock is turned back 1 hour\n      and 01:00 happens again (this time 01:00 EST)\n\nIn fact, every instant between 01:00 and 02:00 occurs twice. This means\nthat if you try and create a time in the 'US/Eastern' timezone\nthe standard datetime syntax, there is no way to specify if you meant\nbefore of after the end-of-daylight-saving-time transition. Using the\npytz custom syntax, the best you can do is make an educated guess:\n\n>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 1, 30, 00))\n>>> loc_dt.strftime(fmt)\n'2002-10-27 01:30:00 EST-0500'\n\nAs you can see, the system has chosen one for you and there is a 50%\nchance of it being out by one hour. For some applications, this does\nnot matter. However, if you are trying to schedule meetings with people\nin different timezones or analyze log files it is not acceptable.\n\nThe best and simplest solution is to stick with using UTC.  The pytz\npackage encourages using UTC for internal timezone representation by\nincluding a special UTC implementation based on the standard Python\nreference implementation in the Python documentation.\n\nThe UTC timezone unpickles to be the same instance, and pickles to a\nsmaller size than other pytz tzinfo instances.  The UTC implementation\ncan be obtained as pytz.utc, pytz.UTC, or pytz.timezone('UTC').\n\n>>> import pickle, pytz\n>>> dt = datetime(2005, 3, 1, 14, 13, 21, tzinfo=utc)\n>>> naive = dt.replace(tzinfo=None)\n>>> p = pickle.dumps(dt, 1)\n>>> naive_p = pickle.dumps(naive, 1)\n>>> len(p) - len(naive_p)\n17\n>>> new = pickle.loads(p)\n>>> new == dt\nTrue\n>>> new is dt\nFalse\n>>> new.tzinfo is dt.tzinfo\nTrue\n>>> pytz.utc is pytz.UTC is pytz.timezone('UTC')\nTrue\n\nNote that some other timezones are commonly thought of as the same (GMT,\nGreenwich, Universal, etc.). The definition of UTC is distinct from these\nother timezones, and they are not equivalent. For this reason, they will\nnot compare the same in Python.\n\n>>> utc == pytz.timezone('GMT')\nFalse\n\nSee the section `What is UTC`_, below.\n\nIf you insist on working with local times, this library provides a\nfacility for constructing them unambiguously:\n\n>>> loc_dt = datetime(2002, 10, 27, 1, 30, 00)\n>>> est_dt = eastern.localize(loc_dt, is_dst=True)\n>>> edt_dt = eastern.localize(loc_dt, is_dst=False)\n>>> print(est_dt.strftime(fmt) + ' / ' + edt_dt.strftime(fmt))\n2002-10-27 01:30:00 EDT-0400 / 2002-10-27 01:30:00 EST-0500\n\nIf you pass None as the is_dst flag to localize(), pytz will refuse to\nguess and raise exceptions if you try to build ambiguous or non-existent\ntimes.\n\nFor example, 1:30am on 27th Oct 2002 happened twice in the US/Eastern\ntimezone when the clocks where put back at the end of Daylight Saving\nTime:\n\n>>> dt = datetime(2002, 10, 27, 1, 30, 00)\n>>> try:\n...     eastern.localize(dt, is_dst=None)\n... except pytz.exceptions.AmbiguousTimeError:\n...     print('pytz.exceptions.AmbiguousTimeError: %s' % dt)\npytz.exceptions.AmbiguousTimeError: 2002-10-27 01:30:00\n\nSimilarly, 2:30am on 7th April 2002 never happened at all in the\nUS/Eastern timezone, as the clocks where put forward at 2:00am skipping\nthe entire hour:\n\n>>> dt = datetime(2002, 4, 7, 2, 30, 00)\n>>> try:\n...     eastern.localize(dt, is_dst=None)\n... except pytz.exceptions.NonExistentTimeError:\n...     print('pytz.exceptions.NonExistentTimeError: %s' % dt)\npytz.exceptions.NonExistentTimeError: 2002-04-07 02:30:00\n\nBoth of these exceptions share a common base class to make error handling\neasier:\n\n>>> isinstance(pytz.AmbiguousTimeError(), pytz.InvalidTimeError)\nTrue\n>>> isinstance(pytz.NonExistentTimeError(), pytz.InvalidTimeError)\nTrue\n\n\nA special case is where countries change their timezone definitions\nwith no daylight savings time switch. For example, in 1915 Warsaw\nswitched from Warsaw time to Central European time with no daylight savings\ntransition. So at the stroke of midnight on August 5th 1915 the clocks\nwere wound back 24 minutes creating an ambiguous time period that cannot\nbe specified without referring to the timezone abbreviation or the\nactual UTC offset. In this case midnight happened twice, neither time\nduring a daylight saving time period. pytz handles this transition by\ntreating the ambiguous period before the switch as daylight savings\ntime, and the ambiguous period after as standard time.\n\n\n>>> warsaw = pytz.timezone('Europe/Warsaw')\n>>> amb_dt1 = warsaw.localize(datetime(1915, 8, 4, 23, 59, 59), is_dst=True)\n>>> amb_dt1.strftime(fmt)\n'1915-08-04 23:59:59 WMT+0124'\n>>> amb_dt2 = warsaw.localize(datetime(1915, 8, 4, 23, 59, 59), is_dst=False)\n>>> amb_dt2.strftime(fmt)\n'1915-08-04 23:59:59 CET+0100'\n>>> switch_dt = warsaw.localize(datetime(1915, 8, 5, 00, 00, 00), is_dst=False)\n>>> switch_dt.strftime(fmt)\n'1915-08-05 00:00:00 CET+0100'\n>>> str(switch_dt - amb_dt1)\n'0:24:01'\n>>> str(switch_dt - amb_dt2)\n'0:00:01'\n\nThe best way of creating a time during an ambiguous time period is\nby converting from another timezone such as UTC:\n\n>>> utc_dt = datetime(1915, 8, 4, 22, 36, tzinfo=pytz.utc)\n>>> utc_dt.astimezone(warsaw).strftime(fmt)\n'1915-08-04 23:36:00 CET+0100'\n\nThe standard Python way of handling all these ambiguities is not to\nhandle them, such as demonstrated in this example using the US/Eastern\ntimezone definition from the Python documentation (Note that this\nimplementation only works for dates between 1987 and 2006 - it is\nincluded for tests only!):\n\n>>> from pytz.reference import Eastern # pytz.reference only for tests\n>>> dt = datetime(2002, 10, 27, 0, 30, tzinfo=Eastern)\n>>> str(dt)\n'2002-10-27 00:30:00-04:00'\n>>> str(dt + timedelta(hours=1))\n'2002-10-27 01:30:00-05:00'\n>>> str(dt + timedelta(hours=2))\n'2002-10-27 02:30:00-05:00'\n>>> str(dt + timedelta(hours=3))\n'2002-10-27 03:30:00-05:00'\n\nNotice the first two results? At first glance you might think they are\ncorrect, but taking the UTC offset into account you find that they are\nactually two hours appart instead of the 1 hour we asked for.\n\n>>> from pytz.reference import UTC # pytz.reference only for tests\n>>> str(dt.astimezone(UTC))\n'2002-10-27 04:30:00+00:00'\n>>> str((dt + timedelta(hours=1)).astimezone(UTC))\n'2002-10-27 06:30:00+00:00'\n\n\nCountry Information\n~~~~~~~~~~~~~~~~~~~\n\nA mechanism is provided to access the timezones commonly in use\nfor a particular country, looked up using the ISO 3166 country code.\nIt returns a list of strings that can be used to retrieve the relevant\ntzinfo instance using ``pytz.timezone()``:\n\n>>> print(' '.join(pytz.country_timezones['nz']))\nPacific/Auckland Pacific/Chatham\n\nThe Olson database comes with a ISO 3166 country code to English country\nname mapping that pytz exposes as a dictionary:\n\n>>> print(pytz.country_names['nz'])\nNew Zealand\n\n\nWhat is UTC\n~~~~~~~~~~~\n\n'UTC' is `Coordinated Universal Time`_. It is a successor to, but distinct\nfrom, Greenwich Mean Time (GMT) and the various definitions of Universal\nTime. UTC is now the worldwide standard for regulating clocks and time\nmeasurement.\n\nAll other timezones are defined relative to UTC, and include offsets like\nUTC+0800 - hours to add or subtract from UTC to derive the local time. No\ndaylight saving time occurs in UTC, making it a useful timezone to perform\ndate arithmetic without worrying about the confusion and ambiguities caused\nby daylight saving time transitions, your country changing its timezone, or\nmobile computers that roam through multiple timezones.\n\n..  _Coordinated Universal Time: https://en.wikipedia.org/wiki/Coordinated_Universal_Time\n\n\nHelpers\n~~~~~~~\n\nThere are two lists of timezones provided.\n\n``all_timezones`` is the exhaustive list of the timezone names that can\nbe used.\n\n>>> from pytz import all_timezones\n>>> len(all_timezones) >= 500\nTrue\n>>> 'Etc/Greenwich' in all_timezones\nTrue\n\n``common_timezones`` is a list of useful, current timezones. It doesn't\ncontain deprecated zones or historical zones, except for a few I've\ndeemed in common usage, such as US/Eastern (open a bug report if you\nthink other timezones are deserving of being included here). It is also\na sequence of strings.\n\n>>> from pytz import common_timezones\n>>> len(common_timezones) < len(all_timezones)\nTrue\n>>> 'Etc/Greenwich' in common_timezones\nFalse\n>>> 'Australia/Melbourne' in common_timezones\nTrue\n>>> 'US/Eastern' in common_timezones\nTrue\n>>> 'Canada/Eastern' in common_timezones\nTrue\n>>> 'Australia/Yancowinna' in all_timezones\nTrue\n>>> 'Australia/Yancowinna' in common_timezones\nFalse\n\nBoth ``common_timezones`` and ``all_timezones`` are alphabetically\nsorted:\n\n>>> common_timezones_dupe = common_timezones[:]\n>>> common_timezones_dupe.sort()\n>>> common_timezones == common_timezones_dupe\nTrue\n>>> all_timezones_dupe = all_timezones[:]\n>>> all_timezones_dupe.sort()\n>>> all_timezones == all_timezones_dupe\nTrue\n\n``all_timezones`` and ``common_timezones`` are also available as sets.\n\n>>> from pytz import all_timezones_set, common_timezones_set\n>>> 'US/Eastern' in all_timezones_set\nTrue\n>>> 'US/Eastern' in common_timezones_set\nTrue\n>>> 'Australia/Victoria' in common_timezones_set\nFalse\n\nYou can also retrieve lists of timezones used by particular countries\nusing the ``country_timezones()`` function. It requires an ISO-3166\ntwo letter country code.\n\n>>> from pytz import country_timezones\n>>> print(' '.join(country_timezones('ch')))\nEurope/Zurich\n>>> print(' '.join(country_timezones('CH')))\nEurope/Zurich\n\n\nInternationalization - i18n/l10n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nPytz is an interface to the IANA database, which uses ASCII names. The `Unicode  Consortium's Unicode Locales (CLDR) <http://cldr.unicode.org>`_\nproject provides translations. Python packages such as\n`Babel <https://babel.pocoo.org/en/latest/api/dates.html#timezone-functionality>`_\nand Thomas Khyn's `l18n <https://pypi.org/project/l18n/>`_ package can be used\nto access these translations from Python.\n\n\nLicense\n~~~~~~~\n\nMIT license.\n\nThis code is also available as part of Zope 3 under the Zope Public\nLicense,  Version 2.1 (ZPL).\n\nI'm happy to relicense this code if necessary for inclusion in other\nopen source projects.\n\n\nLatest Versions\n~~~~~~~~~~~~~~~\n\nThis package will be updated after releases of the Olson timezone\ndatabase.  The latest version can be downloaded from the `Python Package\nIndex <https://pypi.org/project/pytz/>`_.  The code that is used\nto generate this distribution is hosted on Github and available\nusing git::\n\n    git clone https://github.com/stub42/pytz.git\n\nAnnouncements of new releases are made on\n`Launchpad <https://launchpad.net/pytz>`_, and the\n`Atom feed <http://feeds.launchpad.net/pytz/announcements.atom>`_\nhosted there.\n\n\nBugs, Feature Requests & Patches\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nBugs should be reported on `Github <https://github.com/stub42/pytz/issues>`_.\nFeature requests are unlikely to be considered, and efforts instead directed\nto timezone support now built into Python or packages that work with it.\n\n\nSecurity Issues\n~~~~~~~~~~~~~~~\n\nReports about security issues can be made via `Tidelift <https://tidelift.com/security>`_.\n\n\nIssues & Limitations\n~~~~~~~~~~~~~~~~~~~~\n\n- This project is in maintenance mode. Projects using Python 3.9 or later\n  are best served by using the timezone functionaly now included in core\n  Python and packages that work with it such as `tzdata <https://pypi.org/project/tzdata/>`_.\n\n- Offsets from UTC are rounded to the nearest whole minute, so timezones\n  such as Europe/Amsterdam pre 1937 will be up to 30 seconds out. This\n  was a limitation of the Python datetime library.\n\n- If you think a timezone definition is incorrect, I probably can't fix\n  it. pytz is a direct translation of the Olson timezone database, and\n  changes to the timezone definitions need to be made to this source.\n  If you find errors they should be reported to the time zone mailing\n  list, linked from http://www.iana.org/time-zones.\n\n\nFurther Reading\n~~~~~~~~~~~~~~~\n\nMore info than you want to know about timezones:\nhttps://data.iana.org/time-zones/tz-link.html\n\n\nContact\n~~~~~~~\n\nStuart Bishop <stuart@stuartbishop.net>\n",
        "keywords": [
          "timezone",
          "tzinfo",
          "datetime",
          "olson",
          "time"
        ],
        "home_page": "http://pythonhosted.org/pytz",
        "download_url": "https://pypi.org/project/pytz/",
        "author": "Stuart Bishop",
        "author_email": "stuart@stuartbishop.net",
        "maintainer": "Stuart Bishop",
        "maintainer_email": "stuart@stuartbishop.net",
        "license": "MIT",
        "license_file": [
          "LICENSE.txt"
        ],
        "classifier": [
          "Development Status :: 6 - Mature",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: MIT License",
          "Natural Language :: English",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Programming Language :: Python :: 2",
          "Programming Language :: Python :: 2.4",
          "Programming Language :: Python :: 2.5",
          "Programming Language :: Python :: 2.6",
          "Programming Language :: Python :: 2.7",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.1",
          "Programming Language :: Python :: 3.2",
          "Programming Language :: Python :: 3.3",
          "Programming Language :: Python :: 3.4",
          "Programming Language :: Python :: 3.5",
          "Programming Language :: Python :: 3.6",
          "Programming Language :: Python :: 3.7",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Topic :: Software Development :: Libraries :: Python Modules"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/pytz-2025.2.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.1",
        "name": "croniter",
        "version": "6.0.0",
        "summary": "croniter provides iteration for datetime object with cron like format",
        "description": "Introduction\n============\n\nDISCLAIMER\n============\n\n**UNMAINTAINED/ABANDONED CODE / DO NOT USE**\n\nDue to the new EU Cyber Resilience Act (as European Union), even if it was implied because there was no more activity, this repository is now explicitly declared unmaintained.\n\nThe content does not meet the new regulatory requirements and therefore cannot be deployed or distributed, especially in a European context.\n\nThis repository now remains online ONLY for public archiving, documentation and education purposes and we ask everyone to respect this.\n\nAs stated, the maintainers stopped development and therefore all support some time ago, and make this declaration on December 15, 2024.\n\nWe may also unpublish soon (as in the following monthes) any published ressources tied to this project (pypi, the repositories, ...).\nSo, please don't rely on it after March 15, 2025 and adapt whatever project which used this code.\n\n\n.. contents::\n\n\ncroniter provides iteration for the datetime object with a cron like format.\n\n::\n\n                          _ _\n      ___ _ __ ___  _ __ (_) |_ ___ _ __\n     / __| '__/ _ \\| '_ \\| | __/ _ \\ '__|\n    | (__| | | (_) | | | | | ||  __/ |\n     \\___|_|  \\___/|_| |_|_|\\__\\___|_|\n\n\nWebsite: https://github.com/kiorky/croniter\n\nBuild Badge\n===========\n.. image:: https://github.com/kiorky/croniter/actions/workflows/cicd.yml/badge.svg\n    :target: https://github.com/kiorky/croniter/actions/workflows/cicd.yml\n\n\nUsage\n============\n\nA simple example::\n\n    >>> from croniter import croniter\n    >>> from datetime import datetime\n    >>> base = datetime(2010, 1, 25, 4, 46)\n    >>> iter = croniter('*/5 * * * *', base)  # every 5 minutes\n    >>> print(iter.get_next(datetime))   # 2010-01-25 04:50:00\n    >>> print(iter.get_next(datetime))   # 2010-01-25 04:55:00\n    >>> print(iter.get_next(datetime))   # 2010-01-25 05:00:00\n    >>>\n    >>> iter = croniter('2 4 * * mon,fri', base)  # 04:02 on every Monday and Friday\n    >>> print(iter.get_next(datetime))   # 2010-01-26 04:02:00\n    >>> print(iter.get_next(datetime))   # 2010-01-30 04:02:00\n    >>> print(iter.get_next(datetime))   # 2010-02-02 04:02:00\n    >>>\n    >>> iter = croniter('2 4 1 * wed', base)  # 04:02 on every Wednesday OR on 1st day of month\n    >>> print(iter.get_next(datetime))   # 2010-01-27 04:02:00\n    >>> print(iter.get_next(datetime))   # 2010-02-01 04:02:00\n    >>> print(iter.get_next(datetime))   # 2010-02-03 04:02:00\n    >>>\n    >>> iter = croniter('2 4 1 * wed', base, day_or=False)  # 04:02 on every 1st day of the month if it is a Wednesday\n    >>> print(iter.get_next(datetime))   # 2010-09-01 04:02:00\n    >>> print(iter.get_next(datetime))   # 2010-12-01 04:02:00\n    >>> print(iter.get_next(datetime))   # 2011-06-01 04:02:00\n    >>>\n    >>> iter = croniter('0 0 * * sat#1,sun#2', base)  # 1st Saturday, and 2nd Sunday of the month\n    >>> print(iter.get_next(datetime))   # 2010-02-06 00:00:00\n    >>>\n    >>> iter = croniter('0 0 * * 5#3,L5', base)  # 3rd and last Friday of the month\n    >>> print(iter.get_next(datetime))   # 2010-01-29 00:00:00\n    >>> print(iter.get_next(datetime))   # 2010-02-19 00:00:00\n\n\nAll you need to know is how to use the constructor and the ``get_next``\nmethod, the signature of these methods are listed below::\n\n    >>> def __init__(self, cron_format, start_time=time.time(), day_or=True)\n\ncroniter iterates along with ``cron_format`` from ``start_time``.\n``cron_format`` is **min hour day month day_of_week**, you can refer to\nhttp://en.wikipedia.org/wiki/Cron for more details. The ``day_or``\nswitch is used to control how croniter handles **day** and **day_of_week**\nentries. Default option is the cron behaviour, which connects those\nvalues using **OR**. If the switch is set to False, the values are connected\nusing **AND**. This behaves like fcron and enables you to e.g. define a job that\nexecutes each 2nd Friday of a month by setting the days of month and the\nweekday.\n::\n\n    >>> def get_next(self, ret_type=float)\n\nget_next calculates the next value according to the cron expression and\nreturns an object of type ``ret_type``. ``ret_type`` should be a ``float`` or a\n``datetime`` object.\n\nSupported added for ``get_prev`` method. (>= 0.2.0)::\n\n    >>> base = datetime(2010, 8, 25)\n    >>> itr = croniter('0 0 1 * *', base)\n    >>> print(itr.get_prev(datetime))  # 2010-08-01 00:00:00\n    >>> print(itr.get_prev(datetime))  # 2010-07-01 00:00:00\n    >>> print(itr.get_prev(datetime))  # 2010-06-01 00:00:00\n\nYou can validate your crons using ``is_valid`` class method. (>= 0.3.18)::\n\n    >>> croniter.is_valid('0 0 1 * *')  # True\n    >>> croniter.is_valid('0 wrong_value 1 * *')  # False\n\nAbout DST\n=========\nBe sure to init your croniter instance with a TZ aware datetime for this to work!\n\nExample using pytz::\n\n    >>> import pytz\n    >>> tz = pytz.timezone(\"Europe/Paris\")\n    >>> local_date = tz.localize(datetime(2017, 3, 26))\n    >>> val = croniter('0 0 * * *', local_date).get_next(datetime)\n\nExample using python_dateutil::\n\n    >>> import dateutil.tz\n    >>> tz = dateutil.tz.gettz('Asia/Tokyo')\n    >>> local_date = datetime(2017, 3, 26, tzinfo=tz)\n    >>> val = croniter('0 0 * * *', local_date).get_next(datetime)\n\nExample using python built in module::\n\n    >>> from datetime import datetime, timezone\n    >>> local_date = datetime(2017, 3, 26, tzinfo=timezone.utc)\n    >>> val = croniter('0 0 * * *', local_date).get_next(datetime)\n\nAbout second repeats\n=====================\nCroniter is able to do second repetition crontabs form and by default seconds are the 6th field::\n\n    >>> base = datetime(2012, 4, 6, 13, 26, 10)\n    >>> itr = croniter('* * * * * 15,25', base)\n    >>> itr.get_next(datetime) # 4/6 13:26:15\n    >>> itr.get_next(datetime) # 4/6 13:26:25\n    >>> itr.get_next(datetime) # 4/6 13:27:15\n\nYou can also note that this expression will repeat every second from the start datetime.::\n\n    >>> croniter('* * * * * *', local_date).get_next(datetime)\n\nYou can also use seconds as first field::\n\n    >>> itr = croniter('15,25 * * * * *', base, second_at_beginning=True)\n\n\nAbout year\n===========\nCroniter also support year field.\nYear presents at the seventh field, which is after second repetition.\nThe range of year field is from 1970 to 2099.\nTo ignore second repetition, simply set second to ``0`` or any other const::\n\n    >>> base = datetime(2012, 4, 6, 2, 6, 59)\n    >>> itr = croniter('0 0 1 1 * 0 2020/2', base)\n    >>> itr.get_next(datetime) # 2020 1/1 0:0:0\n    >>> itr.get_next(datetime) # 2022 1/1 0:0:0\n    >>> itr.get_next(datetime) # 2024 1/1 0:0:0\n\nSupport for start_time shifts\n==============================\nSee https://github.com/kiorky/croniter/pull/76,\nYou can set start_time=, then expand_from_start_time=True for your generations to be computed from start_time instead of calendar days::\n\n    >>> from pprint import pprint\n    >>> iter = croniter('0 0 */7 * *', start_time=datetime(2024, 7, 11), expand_from_start_time=True);pprint([iter.get_next(datetime) for a in range(10)])\n    [datetime.datetime(2024, 7, 18, 0, 0),\n     datetime.datetime(2024, 7, 25, 0, 0),\n     datetime.datetime(2024, 8, 4, 0, 0),\n     datetime.datetime(2024, 8, 11, 0, 0),\n     datetime.datetime(2024, 8, 18, 0, 0),\n     datetime.datetime(2024, 8, 25, 0, 0),\n     datetime.datetime(2024, 9, 4, 0, 0),\n     datetime.datetime(2024, 9, 11, 0, 0),\n     datetime.datetime(2024, 9, 18, 0, 0),\n     datetime.datetime(2024, 9, 25, 0, 0)]\n    >>> # INSTEAD OF THE DEFAULT BEHAVIOR:\n    >>> iter = croniter('0 0 */7 * *', start_time=datetime(2024, 7, 11), expand_from_start_time=False);pprint([iter.get_next(datetime) for a in range(10)])\n    [datetime.datetime(2024, 7, 15, 0, 0),\n     datetime.datetime(2024, 7, 22, 0, 0),\n     datetime.datetime(2024, 7, 29, 0, 0),\n     datetime.datetime(2024, 8, 1, 0, 0),\n     datetime.datetime(2024, 8, 8, 0, 0),\n     datetime.datetime(2024, 8, 15, 0, 0),\n     datetime.datetime(2024, 8, 22, 0, 0),\n     datetime.datetime(2024, 8, 29, 0, 0),\n     datetime.datetime(2024, 9, 1, 0, 0),\n     datetime.datetime(2024, 9, 8, 0, 0)]\n\n\nTesting if a date matches a crontab\n===================================\nTest for a match with (>=0.3.32)::\n\n    >>> croniter.match(\"0 0 * * *\", datetime(2019, 1, 14, 0, 0, 0, 0))\n    True\n    >>> croniter.match(\"0 0 * * *\", datetime(2019, 1, 14, 0, 2, 0, 0))\n    False\n    >>>\n    >>> croniter.match(\"2 4 1 * wed\", datetime(2019, 1, 1, 4, 2, 0, 0)) # 04:02 on every Wednesday OR on 1st day of month\n    True\n    >>> croniter.match(\"2 4 1 * wed\", datetime(2019, 1, 1, 4, 2, 0, 0), day_or=False) # 04:02 on every 1st day of the month if it is a Wednesday\n    False\n\nTesting if a crontab matches in datetime range\n==============================================\nTest for a match_range with (>=2.0.3)::\n\n    >>> croniter.match_range(\"0 0 * * *\", datetime(2019, 1, 13, 0, 59, 0, 0), datetime(2019, 1, 14, 0, 1, 0, 0))\n    True\n    >>> croniter.match_range(\"0 0 * * *\", datetime(2019, 1, 13, 0, 1, 0, 0), datetime(2019, 1, 13, 0, 59, 0, 0))\n    False\n    >>> croniter.match_range(\"2 4 1 * wed\", datetime(2019, 1, 1, 3, 2, 0, 0), datetime(2019, 1, 1, 5, 1, 0, 0))\n    # 04:02 on every Wednesday OR on 1st day of month\n    True\n    >>> croniter.match_range(\"2 4 1 * wed\", datetime(2019, 1, 1, 3, 2, 0, 0), datetime(2019, 1, 1, 5, 2, 0, 0), day_or=False)\n    # 04:02 on every 1st day of the month if it is a Wednesday\n    False\n\nGaps between date matches\n=========================\nFor performance reasons, croniter limits the amount of CPU cycles spent attempting to find the next match.\nStarting in v0.3.35, this behavior is configurable via the ``max_years_between_matches`` parameter, and the default window has been increased from 1 year to 50 years.\n\nThe defaults should be fine for many use cases.\nApplications that evaluate multiple cron expressions or handle cron expressions from untrusted sources or end-users should use this parameter.\nIterating over sparse cron expressions can result in increased CPU consumption or a raised ``CroniterBadDateError`` exception which indicates that croniter has given up attempting to find the next (or previous) match.\nExplicitly specifying ``max_years_between_matches`` provides a way to limit CPU utilization and simplifies the iterable interface by eliminating the need for ``CroniterBadDateError``.\nThe difference in the iterable interface is based on the reasoning that whenever ``max_years_between_matches`` is explicitly agreed upon, there is no need for croniter to signal that it has given up; simply stopping the iteration is preferable.\n\nThis example matches 4 AM Friday, January 1st.\nSince January 1st isn't often a Friday, there may be a few years between each occurrence.\nSetting the limit to 15 years ensures all matches::\n\n    >>> it = croniter(\"0 4 1 1 fri\", datetime(2000,1,1), day_or=False, max_years_between_matches=15).all_next(datetime)\n    >>> for i in range(5):\n    ...     print(next(it))\n    ...\n    2010-01-01 04:00:00\n    2016-01-01 04:00:00\n    2021-01-01 04:00:00\n    2027-01-01 04:00:00\n    2038-01-01 04:00:00\n\nHowever, when only concerned with dates within the next 5 years, simply set ``max_years_between_matches=5`` in the above example.\nThis will result in no matches found, but no additional cycles will be wasted on unwanted matches far in the future.\n\nIterating over a range using cron\n=================================\nFind matches within a range using the ``croniter_range()`` function.  This is much like the builtin ``range(start,stop,step)`` function, but for dates.  The `step` argument is a cron expression.\nAdded in (>=0.3.34)\n\nList the first Saturday of every month in 2019::\n\n    >>> from croniter import croniter_range\n    >>> for dt in croniter_range(datetime(2019, 1, 1), datetime(2019, 12, 31), \"0 0 * * sat#1\"):\n    >>>     print(dt)\n\n\nHashed expressions\n==================\n\ncroniter supports Jenkins-style hashed expressions, using the \"H\" definition keyword and the required hash_id keyword argument.\nHashed expressions remain consistent, given the same hash_id, but different hash_ids will evaluate completely different to each other.\nThis allows, for example, for an even distribution of differently-named jobs without needing to manually spread them out.\n\n    >>> itr = croniter(\"H H * * *\", hash_id=\"hello\")\n    >>> itr.get_next(datetime)\n    datetime.datetime(2021, 4, 10, 11, 10)\n    >>> itr.get_next(datetime)\n    datetime.datetime(2021, 4, 11, 11, 10)\n    >>> itr = croniter(\"H H * * *\", hash_id=\"hello\")\n    >>> itr.get_next(datetime)\n    datetime.datetime(2021, 4, 10, 11, 10)\n    >>> itr = croniter(\"H H * * *\", hash_id=\"bonjour\")\n    >>> itr.get_next(datetime)\n    datetime.datetime(2021, 4, 10, 20, 52)\n\n\nRandom expressions\n==================\n\nRandom \"R\" definition keywords are supported, and remain consistent only within their croniter() instance.\n\n    >>> itr = croniter(\"R R * * *\")\n    >>> itr.get_next(datetime)\n    datetime.datetime(2021, 4, 10, 22, 56)\n    >>> itr.get_next(datetime)\n    datetime.datetime(2021, 4, 11, 22, 56)\n    >>> itr = croniter(\"R R * * *\")\n    >>> itr.get_next(datetime)\n    datetime.datetime(2021, 4, 11, 4, 19)\n\n\nNote about Ranges\n=================\n\nNote that as a deviation from cron standard, croniter is somehow laxist with ranges and will allow ranges of ``Jan-Dec``, & ``Sun-Sat`` in reverse way and interpret them as following examples:\n\n    - ``Apr-Jan``: from April to january\n    - ``Sat-Sun``: Saturday, Sunday\n    - ``Wed-Sun``: Wednesday to Saturday, Sunday\n\nPlease note that if a /step is given, it will be respected.\n\nNote about Sunday\n=================\n\nNote that as a deviation from cron standard, croniter like numerous cron implementations supports ``SUNDAY`` to be expressed as ``DAY7``, allowing such expressions:\n\n    - ``0 0 * * 7``\n    - ``0 0 * * 6-7``\n    - ``0 0 * * 6,7``\n\n\nKeyword expressions\n===================\n\nVixie cron-style \"@\" keyword expressions are supported.\nWhat they evaluate to depends on whether you supply hash_id: no hash_id corresponds to Vixie cron definitions (exact times, minute resolution), while with hash_id corresponds to Jenkins definitions (hashed within the period, second resolution).\n\n    ============ ============ ================\n    Keyword      No hash_id   With hash_id\n    ============ ============ ================\n    @midnight    0 0 * * *    H H(0-2) * * * H\n    @hourly      0 * * * *    H * * * * H\n    @daily       0 0 * * *    H H * * * H\n    @weekly      0 0 * * 0    H H * * H H\n    @monthly     0 0 1 * *    H H H * * H\n    @yearly      0 0 1 1 *    H H H H * H\n    @annually    0 0 1 1 *    H H H H * H\n    ============ ============ ================\n\nUpgrading\n==========\n\nTo 2.0.0\n---------\n\n- Install or upgrade pytz by using version specified  requirements/base.txt if you have it installed `<=2021.1`.\n\nDevelop this package\n====================\n\n::\n\n    git clone https://github.com/kiorky/croniter.git\n    cd croniter\n    virtualenv --no-site-packages venv3\n    venv3/bin/pip install --upgrade -r requirements/test.txt -r requirements/lint.txt -r requirements/format.txt -r requirements/tox.txt\n    venv3/bin/black src/\n    venv3/bin/isort src/\n    venv3/bin/tox --current-env -e fmt,lint,test\n\n\nTesting under py2\n==================\n\nInstall prerequisisites ::\n\n    # install py 2 with eg: apt install python2.7\n    mkdir venv2 && curl -sSL \"https://github.com/pypa/get-virtualenv/blob/20.27.0/public/2.7/virtualenv.pyz?raw=true\" > venv2/venv && python2 venv2/venv venv2\n    venv2/bin/python2 -m pip install -r ./requirements/test.txt\n\nRun tests::\n\n    ./venv2/bin/pytest src\n\n\nMake a new release\n====================\nWe use zest.fullreleaser, a great release infrastructure.\n\nDo and follow these instructions\n::\n\n    venv3/bin/pip install --upgrade -r requirements/release.txt\n    ./release.sh\n\n\nContributors\n===============\nThanks to all who have contributed to this project!\nIf you have contributed and your name is not listed below please let us know.\n\n    - Aarni Koskela (akx)\n    - chris-baynes\n    - djmitche\n    - evanpurkhiser\n    - GreatCombinator\n    - Hinnack\n    - ipartola\n    - jlsandell\n    - kiorky\n    - lowell80 (Kintyre)\n    - mag009\n    - mrmachine\n    - Ryan Finnie (rfinnie)\n    - salitaba\n    - scop\n    - shazow\n    - yuzawa-san\n    - zed2015\n\n\n\nChangelog\n==============\n\n6.0.0 (2024-12-17)\n------------------\n- Announce for now that croniter dev is ended (CRA).\n- Rework timestamp_to_datetime to use whatever timezone [kiorky]\n- Make datetime_to_timestamp & timestamp_to_datetime public [kiorky]\n- Fix EPOCH calculation in case of non UTC & 32 bits based systems [kiorky]\n- Apply isort formatter [kiorky]\n- Reintegrate test_speed [kiorky]\n- Apply black formatter [evanpurkhiser, kiorky]\n- Code quality changes [evanpurkhiser, kiorky]\n    - Remove unused _get_caller_globals_and_locals [evanpurkhiser]\n    - Remove single-use bad_length [evanpurkhiser]\n    - Remove unused `days` in `proc_month` [evanpurkhiser]\n    - Use `field_index` over `i` for readability [evanpurkhiser]\n    - Always use `\"\"\"` for docstrings [evanpurkhiser]\n    - Make helper instance methods that do not use self static [evanpurkhiser]\n    - Remove unusd call to sys.exc_info [evanpurkhiser]\n    - Remove unused `ALPHAS` [evanpurkhiser]\n    - Improve `croniter.expand` documentation [evanpurkhiser]\n\n5.0.1 (2024-10-29)\n------------------\n\n- Community wanted: Reintroduce 7 as DayOfWeek in deviation from standard cron (#90). [kiorky]\n\n4.0.0 (2024-10-28)\n------------------\n\n- Remove DayOfWeek alias 7 to DayOfWeek 0 to stick to standard cron (#90). [kiorky]\n- Fix DOW ranges calculations when lastday is a Sunday. [kiorky]\n\n3.0.4 (2024-10-25)\n------------------\n\n- Fix overflow on 32bits systems (#87) [kiorky]\n- Fix python2 testing (related to #93) [kiorky]\n- Modernize packaging. Special thanks to Aarni Koskela (akx) for all the inputs. [kiorky, akx]\n\n3.0.3 (2024-07-26)\n------------------\n\n- fix lint [kiorky]\n\n3.0.2 (2024-07-26)\n------------------\n\n- Fix start_time not respected in get_next/get_prev/all_next/all_prev (#86) [hesstobi, kiorky]\n\n3.0.1 (2024-07-25)\n------------------\n\n- Add an `update_current` argument to get_next/get_prev/all_next/all_prev to facilitate writing of some downstream code, see #83. [kiorky]\n\n3.0.0 (2024-07-23)\n------------------\n\n- Support for year field [zhouyizhen, kiorky]\n- Better support for 6 fields (second), and 7 fields crons [zhouyizhen, kiorky]\n- Better fix hashed expressions omitting some entries (#82, #42, #30) fix is retained over #42 initial fix [zhouyizhen, kiorky]\n- Ensure match return false when not time available (#81) [zhouyizhen, kiorky]\n\n\n2.0.7 (2024-07-16)\n------------------\n\n- fix doc\n\n\n2.0.6 (2024-07-16)\n------------------\n\n- Implement second_at_beginning [zhouyizhen, kiorky]\n- Support question mark as wildcard [zhouyizhen, kiorky]\n- Support to start a cron from a reference start time [mghextreme, kiorky]\n\n\n2.0.5 (2024-04-20)\n------------------\n\n- No changes, fix lint [kiorky]\n\n\n2.0.4 (2024-04-20)\n------------------\n\n- Support hashid strings in is_valid [george-kuanli-peng, kiorky]\n- Avoid over-optimization in crontab expansions [Cherie0125, liqirui <liqirui@baidu.com>, kiorky]\n\n\n2.0.3 (2024-03-19)\n------------------\n\n- Add match_range function [salitaba]\n\n\n2.0.2 (2024-02-29)\n------------------\n\n- fix leap year (29 days in February) [zed2015]\n\n\n2.0.1 (2023-10-11)\n------------------\n\n- Fix release issue [kiorky]\n\n\n2.0.0 (2023-10-10)\n------------------\n\n- Add Python 3.12 support [rafsaf]\n- Make major release instructions [kiorky]\n\n\n1.4.1 (2023-06-15)\n------------------\n\n- Make a retrocompatible version of 1.4.0 change about supporting VIXIECRON bug. (fix #47)\n  [kiorky]\n\n\n1.4.0 (2023-06-15)\n------------------\n\n- Added \"implement_cron_bug\" flag to make the cron parser compatible with a bug in Vixie/ISC Cron\n  [kiorky, David White <dwhite2@cisco.com>]\n  *WARNING*: EXPAND METHOD CHANGES RETURN VALUE\n\n\n1.3.15 (2023-05-25)\n-------------------\n\n- Fix hashed expressions omitting some entries\n  [@waltervos/Walter Vos <walter.vos@ns.nl>]\n- Enhance .match() precision for 6 position expressions\n  [@szpol/szymon <szymon.polinkiewicz@gmail.com>]\n\n1.3.14 (2023-04-12)\n-------------------\n\n- Lint\n\n\n1.3.13 (2023-04-12)\n-------------------\n\n- Add check for range begin/end\n\n\n\n1.3.12 (2023-04-12)\n-------------------\n\n- restore py2 compat\n\n\n1.3.11 (2023-04-12)\n-------------------\n\n-  Do not expose `i` into global namespace\n\n\n1.3.10 (2023-04-07)\n-------------------\n\n- Fix DOW hash parsing [kiorky]\n- better error handling on py3 [kiorky]\n\n1.3.8 (2022-11-22)\n------------------\n\n- Add Python 3.11 support and move docs files to main folder [rafsaf]\n\n\n1.3.7 (2022-09-06)\n------------------\n\n- fix tests\n- Fix croniter_range infinite loop  [Shachar Snapiri <ssnapiri@paloaltonetworks.com>]\n\n\n1.3.5 (2022-05-14)\n------------------\n\n- Add Python 3.10 support [eelkevdbos]\n\n\n1.3.4 (2022-02-18)\n------------------\n\n- Really fix compat for tests under py27\n  [kiorky]\n\n\n1.3.3 (2022-02-18)\n------------------\n\n- Fix compat for tests under py27\n  [kiorky]\n\n\n1.3.2 (2022-02-18)\n------------------\n\n- Fix #12: regressions with set_current\n  [kiorky, agateblue]\n\n\n1.3.1 (2022-02-15)\n------------------\n\n- Restore compat with python2\n  [kiorky]\n\n\n1.3.0 (2022-02-15)\n------------------\n\n- Add a way to make next() easier to use. This fixes #11\n  [kiorky]\n\n\n1.2.0 (2022-01-14)\n------------------\n\n- Enforce validation for day=1. Before this release we used to support day=0 and it was silently glided to day=1 to support having both day in day in 4th field when it came to have 6fields cron forms (second repeat). It will now raises a CroniterBadDateError. See https://github.com/kiorky/croniter/issues/6\n  [kiorky]\n\n1.1.0 (2021-12-03)\n------------------\n\n- Enforce validation for month=1. Before this release we used to support month=0 and it was silently glided to month=1 to support having both day in month in 4th field when it came to have 6fields cron forms (second repeat). It will now raises a CroniterBadDateError. See https://github.com/kiorky/croniter/issues/6\n  [kiorky]\n\n1.0.15 (2021-06-25)\n-------------------\n\n- restore py2 [kiorky]\n\n\n1.0.14 (2021-06-25)\n-------------------\n\n- better type checks [kiorky]\n\n\n1.0.13 (2021-05-06)\n-------------------\n\n- Fix ZeroDivisionError with ``* * R/0 * *``\n  [cuu508]\n\n1.0.12 (2021-04-13)\n-------------------\n\n- Add support for hashed/random/keyword expressions\n  Ryan Finnie (rfinnie)\n- Review support support for hashed/random/keyword expression and add expanders reactor\n  [ kiorky ]\n\n\n1.0.11 (2021-04-07)\n-------------------\n\n- fix bug: bad case:``0 6 30 3 *``\n  [zed2015(zhangchi)]\n- Add support for ``L`` in the day_of_week component.  This enable expressions like ``* * * * L4``, which means last Thursday of the month.  This resolves #159.\n  [Kintyre]\n- Create ``CroniterUnsupportedSyntaxError`` exception for situations where CRON syntax may be valid but some combinations of features is not supported.\n  Currently, this is used when the ``day_of_week`` component has a combination of literal values and nth/last syntax at the same time.\n  For example, ``0 0 * * 1,L6`` or ``0 0 * * 15,sat#1`` will both raise this exception because of mixing literal days of the week with nth-weekday or last-weekday syntax.\n  This *may* impact existing cron expressions in prior releases, because ``0 0 * * 15,sat#1`` was previously allowed but incorrectly handled.\n  [Kintyre]\n\n- Update ``croniter_range()`` to allow an alternate ``croniter`` class to be used.  Helpful when using a custom class derived from croniter.\n  [Kintyre]\n\n\n1.0.10 (2021-03-25)\n-------------------\n\n- Remove external library ``natsort``.\n  Sorting of cron expression components now handled with ``sorted()`` with a custom ``key`` function.\n  [Kintyre]\n\n\n\n1.0.9 (2021-03-23)\n------------------\n\n- Remove futures dependency\n  [kiorky]\n\n\n1.0.8 (2021-03-06)\n------------------\n\n- Update `_expand` to lowercase each component of the expression.\n  This is in relation to #157. With this change, croniter accepts and correctly handles `* * 10-L * *`.\n  [cuu508]\n\n\n1.0.7 (2021-03-02)\n------------------\n\n- Fix _expand to reject int literals with underscores\n  [cuu508]\n- Remove a debug statement to make flake8 happy\n  [cuu508]\n\n1.0.6 (2021-02-01)\n------------------\n\n- Fix combination of star and invalid expression bugs\n  [kiorky]\n\n\n1.0.5 (2021-01-29)\n------------------\n\n- Security fix: fix overflow when using cron ranges\n  [kiorky]\n\n1.0.4 (2021-01-29)\n------------------\n\n- Spelling fix release\n\n\n1.0.3 (2021-01-29)\n------------------\n\n- Fix #155: raise CroniterBadCronError when error syntax\n  [kiorky]\n\n\n1.0.2 (2021-01-19)\n------------------\n\n- Fix match when datetime has microseconds\n  [kiorky]\n\n1.0.1 (2021-01-06)\n------------------\n- no changes, just to make sense with new semver2 (making croniter on a stable state)\n  [kiorky]\n\n\n0.3.37 (2020-12-31)\n-------------------\n\n- Added Python 3.8 and 3.9 support\n  [eumiro]\n\n\n0.3.36 (2020-11-02)\n-------------------\n\n- Updated docs section regarding ``max_years_between_matches`` to be more shorter and hopefully more relevant.\n  [Kintyre]\n- Don't install tests\n  [scop]\n\n\n0.3.35 (2020-10-11)\n-------------------\n\n- Handle L in ranges. This fixes #142.\n  [kiorky]\n- Add a new initialization parameter ``max_years_between_matches`` to support finding the next/previous date beyond the default 1 year window, if so desired.  Updated README to include additional notes and example of this usage.  Fixes #145.\n  [Kintyre]\n- The ``croniter_range()`` function was updated to automatically determines the appropriate ``max_years_between_matches`` value, this preventing handling of the ``CroniterBadDateError`` exception.\n  [Kintyre]\n- Updated exception handling classes:  ``CroniterBadDateError`` now only\n  applies during date finding operations (next/prev), and all parsing errors can now be caught using ``CroniterBadCronError``.  The ``CroniterNotAlphaError`` exception is now a subclass of ``CroniterBadCronError``.  A brief description of each exception class was added as an inline docstring.\n  [Kintyre]\n- Updated iterable interfaces to replace the ``CroniterBadDateError`` with ``StopIteration`` if (and only if) the ``max_years_between_matches`` argument is provided.  The rationale here is that if the user has specified the max tolerance between matches, then there's no need to further inform them of no additional matches.  Just stop the iteration.  This also keeps backwards compatibility.\n  [Kintyre]\n- Minor docs update\n  [Kintyre]\n\n\n0.3.34 (2020-06-19)\n-------------------\n\n- Feat ``croniter_range(start, stop, cron)``\n  [Kintyre]\n- Optimization for poorly written cron expression\n  [Kintyre]\n\n0.3.33 (2020-06-15)\n-------------------\n\n- Make dateutil tz support more official\n  [Kintyre]\n- Feat/support for day or\n  [田口信元]\n\n0.3.32 (2020-05-27)\n-------------------\n\n- document seconds repeats, fixes #122\n  [kiorky]\n- Implement match method, fixes #54\n  [kiorky]\n- Adding tests for #127 (test more DSTs and croniter behavior around)\n  [kiorky]\n- Changed lag_hours comparison to absolute to manage dst boundary when getting previous\n  [Sokkka]\n\n0.3.31 (2020-01-02)\n-------------------\n\n- Fix get_next() when start_time less then 1s before next instant\n  [AlexHill]\n\n\n0.3.30 (2019-04-20)\n-------------------\n\n- credits\n\n\n0.3.29 (2019-03-26)\n-------------------\n\n- credits\n- history stripping (security)\n- Handle -Sun notation, This fixes `#119 <https://github.com/taichino/croniter/issues/119>`_.\n  [kiorky]\n- Handle invalid ranges correctly,  This fixes `#114 <https://github.com/taichino/croniter/issues/114>`_.\n  [kiorky]\n\n0.3.25 (2018-08-07)\n-------------------\n- Pypi hygiene\n  [hugovk]\n\n\n0.3.24 (2018-06-20)\n-------------------\n- fix `#107 <https://github.com/taichino/croniter/issues/107>`_: microsecond threshold\n  [kiorky]\n\n\n0.3.23 (2018-05-23)\n-------------------\n\n- fix ``get_next`` while preserving the fix of ``get_prev`` in 7661c2aaa\n  [Avikam Agur <avikam@pagaya-inv.com>]\n\n\n0.3.22 (2018-05-16)\n-------------------\n- Don't count previous minute if now is dynamic\n  If the code is triggered from 5-asterisk based cron\n  ``get_prev`` based on ``datetime.now()`` is expected to return\n  current cron iteration and not previous execution.\n  [Igor Khrol <igor.khrol@toptal.com>]\n\n0.3.20 (2017-11-06)\n-------------------\n\n- More DST fixes\n  [Kevin Rose <kbrose@github>]\n\n\n0.3.19 (2017-08-31)\n-------------------\n\n- fix #87: backward dst changes\n  [kiorky]\n\n\n0.3.18 (2017-08-31)\n-------------------\n\n- Add is valid method, refactor errors\n  [otherpirate, Mauro Murari <mauro_murari@hotmail.com>]\n\n\n0.3.17 (2017-05-22)\n-------------------\n- DOW occurrence sharp style support.\n  [kiorky, Kengo Seki <sekikn@apache.org>]\n\n\n0.3.16 (2017-03-15)\n-------------------\n\n- Better test suite [mrcrilly@github]\n- DST support [kiorky]\n\n0.3.15 (2017-02-16)\n-------------------\n\n- fix bug around multiple conditions and range_val in\n  _get_prev_nearest_diff.\n  [abeja-yuki@github]\n\n0.3.14 (2017-01-25)\n-------------------\n\n- issue #69: added day_or option to change behavior when day-of-month and\n  day-of-week is given\n  [Andreas Vogl <a.vogl@hackner-security.com>]\n\n\n\n0.3.13 (2016-11-01)\n-------------------\n\n- `Real fix for #34 <https://github.com/taichino/croniter/pull/73>`_\n  [kiorky@github]\n- `Modernize test infra <https://github.com/taichino/croniter/pull/72>`_\n  [kiorky@github]\n- `Release as a universal wheel <https://github.com/kiorky/croniter/pull/16>`_\n  [adamchainz@github]\n- `Raise ValueError on negative numbers <https://github.com/taichino/croniter/pull/63>`_\n  [josegonzalez@github]\n- `Compare types using \"issubclass\" instead of exact match <https://github.com/taichino/croniter/pull/70>`_\n  [darkk@github]\n- `Implement step cron with a variable base <https://github.com/taichino/croniter/pull/60>`_\n  [josegonzalez@github]\n\n0.3.12 (2016-03-10)\n-------------------\n- support setting ret_type in __init__ [Brent Tubbs <brent.tubbs@gmail.com>]\n\n0.3.11 (2016-01-13)\n-------------------\n\n- Bug fix: The get_prev API crashed when last day of month token was used. Some\n  essential logic was missing.\n  [Iddo Aviram <iddo.aviram@similarweb.com>]\n\n\n0.3.10 (2015-11-29)\n-------------------\n\n- The functionality of 'l' as day of month was broken, since the month variable\n  was not properly updated\n  [Iddo Aviram <iddo.aviram@similarweb.com>]\n\n0.3.9 (2015-11-19)\n------------------\n\n- Don't use datetime functions python 2.6 doesn't support\n  [petervtzand]\n\n0.3.8 (2015-06-23)\n------------------\n- Truncate microseconds by setting to 0\n  [Corey Wright]\n\n\n0.3.7 (2015-06-01)\n------------------\n\n- converting sun in range sun-thu transforms to int 0 which is\n  recognized as empty string; the solution was to convert sun to string \"0\"\n\n0.3.6 (2015-05-29)\n------------------\n\n- Fix default behavior when no start_time given\n  Default value for ``start_time`` parameter is calculated at module init time rather than call time.\n- Fix timezone support and stop depending on the system time zone\n\n\n\n0.3.5 (2014-08-01)\n------------------\n\n- support for 'l' (last day of month)\n\n\n0.3.4 (2014-01-30)\n------------------\n\n- Python 3 compat\n- QA Release\n\n\n0.3.3 (2012-09-29)\n------------------\n- proper packaging\n\n",
        "keywords": [
          "datetime",
          "iterator",
          "cron"
        ],
        "home_page": "http://github.com/kiorky/croniter",
        "author": "Matsumoto Taichi, kiorky",
        "author_email": "taichino@gmail.com, kiorky@cryptelium.net",
        "license": "MIT License",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 4 - Beta",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: MIT License",
          "Operating System :: POSIX",
          "Programming Language :: Python",
          "Programming Language :: Python :: 2",
          "Programming Language :: Python :: 2.6",
          "Programming Language :: Python :: 2.7",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.4",
          "Programming Language :: Python :: 3.5",
          "Programming Language :: Python :: 3.6",
          "Programming Language :: Python :: 3.7",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Topic :: Software Development :: Libraries :: Python Modules"
        ],
        "requires_dist": [
          "python-dateutil",
          "pytz>2021.1"
        ],
        "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/croniter-6.0.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.3",
        "name": "annotated-types",
        "version": "0.7.0",
        "summary": "Reusable constraint types to use with typing.Annotated",
        "description": "# annotated-types\n\n[![CI](https://github.com/annotated-types/annotated-types/workflows/CI/badge.svg?event=push)](https://github.com/annotated-types/annotated-types/actions?query=event%3Apush+branch%3Amain+workflow%3ACI)\n[![pypi](https://img.shields.io/pypi/v/annotated-types.svg)](https://pypi.python.org/pypi/annotated-types)\n[![versions](https://img.shields.io/pypi/pyversions/annotated-types.svg)](https://github.com/annotated-types/annotated-types)\n[![license](https://img.shields.io/github/license/annotated-types/annotated-types.svg)](https://github.com/annotated-types/annotated-types/blob/main/LICENSE)\n\n[PEP-593](https://peps.python.org/pep-0593/) added `typing.Annotated` as a way of\nadding context-specific metadata to existing types, and specifies that\n`Annotated[T, x]` _should_ be treated as `T` by any tool or library without special\nlogic for `x`.\n\nThis package provides metadata objects which can be used to represent common\nconstraints such as upper and lower bounds on scalar values and collection sizes,\na `Predicate` marker for runtime checks, and\ndescriptions of how we intend these metadata to be interpreted. In some cases,\nwe also note alternative representations which do not require this package.\n\n## Install\n\n```bash\npip install annotated-types\n```\n\n## Examples\n\n```python\nfrom typing import Annotated\nfrom annotated_types import Gt, Len, Predicate\n\nclass MyClass:\n    age: Annotated[int, Gt(18)]                         # Valid: 19, 20, ...\n                                                        # Invalid: 17, 18, \"19\", 19.0, ...\n    factors: list[Annotated[int, Predicate(is_prime)]]  # Valid: 2, 3, 5, 7, 11, ...\n                                                        # Invalid: 4, 8, -2, 5.0, \"prime\", ...\n\n    my_list: Annotated[list[int], Len(0, 10)]           # Valid: [], [10, 20, 30, 40, 50]\n                                                        # Invalid: (1, 2), [\"abc\"], [0] * 20\n```\n\n## Documentation\n\n_While `annotated-types` avoids runtime checks for performance, users should not\nconstruct invalid combinations such as `MultipleOf(\"non-numeric\")` or `Annotated[int, Len(3)]`.\nDownstream implementors may choose to raise an error, emit a warning, silently ignore\na metadata item, etc., if the metadata objects described below are used with an\nincompatible type - or for any other reason!_\n\n### Gt, Ge, Lt, Le\n\nExpress inclusive and/or exclusive bounds on orderable values - which may be numbers,\ndates, times, strings, sets, etc. Note that the boundary value need not be of the\nsame type that was annotated, so long as they can be compared: `Annotated[int, Gt(1.5)]`\nis fine, for example, and implies that the value is an integer x such that `x > 1.5`.\n\nWe suggest that implementors may also interpret `functools.partial(operator.le, 1.5)`\nas being equivalent to `Gt(1.5)`, for users who wish to avoid a runtime dependency on\nthe `annotated-types` package.\n\nTo be explicit, these types have the following meanings:\n\n* `Gt(x)` - value must be \"Greater Than\" `x` - equivalent to exclusive minimum\n* `Ge(x)` - value must be \"Greater than or Equal\" to `x` - equivalent to inclusive minimum\n* `Lt(x)` - value must be \"Less Than\" `x` - equivalent to exclusive maximum\n* `Le(x)` - value must be \"Less than or Equal\" to `x` - equivalent to inclusive maximum\n\n### Interval\n\n`Interval(gt, ge, lt, le)` allows you to specify an upper and lower bound with a single\nmetadata object. `None` attributes should be ignored, and non-`None` attributes\ntreated as per the single bounds above.\n\n### MultipleOf\n\n`MultipleOf(multiple_of=x)` might be interpreted in two ways:\n\n1. Python semantics, implying `value % multiple_of == 0`, or\n2. [JSONschema semantics](https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6.2.1),\n   where `int(value / multiple_of) == value / multiple_of`.\n\nWe encourage users to be aware of these two common interpretations and their\ndistinct behaviours, especially since very large or non-integer numbers make\nit easy to cause silent data corruption due to floating-point imprecision.\n\nWe encourage libraries to carefully document which interpretation they implement.\n\n### MinLen, MaxLen, Len\n\n`Len()` implies that `min_length <= len(value) <= max_length` - lower and upper bounds are inclusive.\n\nAs well as `Len()` which can optionally include upper and lower bounds, we also\nprovide `MinLen(x)` and `MaxLen(y)` which are equivalent to `Len(min_length=x)`\nand `Len(max_length=y)` respectively.\n\n`Len`, `MinLen`, and `MaxLen` may be used with any type which supports `len(value)`.\n\nExamples of usage:\n\n* `Annotated[list, MaxLen(10)]` (or `Annotated[list, Len(max_length=10))`) - list must have a length of 10 or less\n* `Annotated[str, MaxLen(10)]` - string must have a length of 10 or less\n* `Annotated[list, MinLen(3))` (or `Annotated[list, Len(min_length=3))`) - list must have a length of 3 or more\n* `Annotated[list, Len(4, 6)]` - list must have a length of 4, 5, or 6\n* `Annotated[list, Len(8, 8)]` - list must have a length of exactly 8\n\n#### Changed in v0.4.0\n\n* `min_inclusive` has been renamed to `min_length`, no change in meaning\n* `max_exclusive` has been renamed to `max_length`, upper bound is now **inclusive** instead of **exclusive**\n* The recommendation that slices are interpreted as `Len` has been removed due to ambiguity and different semantic\n  meaning of the upper bound in slices vs. `Len`\n\nSee [issue #23](https://github.com/annotated-types/annotated-types/issues/23) for discussion.\n\n### Timezone\n\n`Timezone` can be used with a `datetime` or a `time` to express which timezones\nare allowed. `Annotated[datetime, Timezone(None)]` must be a naive datetime.\n`Timezone[...]` ([literal ellipsis](https://docs.python.org/3/library/constants.html#Ellipsis))\nexpresses that any timezone-aware datetime is allowed. You may also pass a specific\ntimezone string or [`tzinfo`](https://docs.python.org/3/library/datetime.html#tzinfo-objects)\nobject such as `Timezone(timezone.utc)` or `Timezone(\"Africa/Abidjan\")` to express that you only\nallow a specific timezone, though we note that this is often a symptom of fragile design.\n\n#### Changed in v0.x.x\n\n* `Timezone` accepts [`tzinfo`](https://docs.python.org/3/library/datetime.html#tzinfo-objects) objects instead of\n  `timezone`, extending compatibility to [`zoneinfo`](https://docs.python.org/3/library/zoneinfo.html) and third party libraries.\n\n### Unit\n\n`Unit(unit: str)` expresses that the annotated numeric value is the magnitude of\na quantity with the specified unit. For example, `Annotated[float, Unit(\"m/s\")]`\nwould be a float representing a velocity in meters per second.\n\nPlease note that `annotated_types` itself makes no attempt to parse or validate\nthe unit string in any way. That is left entirely to downstream libraries,\nsuch as [`pint`](https://pint.readthedocs.io) or\n[`astropy.units`](https://docs.astropy.org/en/stable/units/).\n\nAn example of how a library might use this metadata:\n\n```python\nfrom annotated_types import Unit\nfrom typing import Annotated, TypeVar, Callable, Any, get_origin, get_args\n\n# given a type annotated with a unit:\nMeters = Annotated[float, Unit(\"m\")]\n\n\n# you can cast the annotation to a specific unit type with any\n# callable that accepts a string and returns the desired type\nT = TypeVar(\"T\")\ndef cast_unit(tp: Any, unit_cls: Callable[[str], T]) -> T | None:\n    if get_origin(tp) is Annotated:\n        for arg in get_args(tp):\n            if isinstance(arg, Unit):\n                return unit_cls(arg.unit)\n    return None\n\n\n# using `pint`\nimport pint\npint_unit = cast_unit(Meters, pint.Unit)\n\n\n# using `astropy.units`\nimport astropy.units as u\nastropy_unit = cast_unit(Meters, u.Unit)\n```\n\n### Predicate\n\n`Predicate(func: Callable)` expresses that `func(value)` is truthy for valid values.\nUsers should prefer the statically inspectable metadata above, but if you need\nthe full power and flexibility of arbitrary runtime predicates... here it is.\n\nFor some common constraints, we provide generic types:\n\n* `IsLower       = Annotated[T, Predicate(str.islower)]`\n* `IsUpper       = Annotated[T, Predicate(str.isupper)]`\n* `IsDigit       = Annotated[T, Predicate(str.isdigit)]`\n* `IsFinite      = Annotated[T, Predicate(math.isfinite)]`\n* `IsNotFinite   = Annotated[T, Predicate(Not(math.isfinite))]`\n* `IsNan         = Annotated[T, Predicate(math.isnan)]`\n* `IsNotNan      = Annotated[T, Predicate(Not(math.isnan))]`\n* `IsInfinite    = Annotated[T, Predicate(math.isinf)]`\n* `IsNotInfinite = Annotated[T, Predicate(Not(math.isinf))]`\n\nso that you can write e.g. `x: IsFinite[float] = 2.0` instead of the longer\n(but exactly equivalent) `x: Annotated[float, Predicate(math.isfinite)] = 2.0`.\n\nSome libraries might have special logic to handle known or understandable predicates,\nfor example by checking for `str.isdigit` and using its presence to both call custom\nlogic to enforce digit-only strings, and customise some generated external schema.\nUsers are therefore encouraged to avoid indirection like `lambda s: s.lower()`, in\nfavor of introspectable methods such as `str.lower` or `re.compile(\"pattern\").search`.\n\nTo enable basic negation of commonly used predicates like `math.isnan` without introducing introspection that makes it impossible for implementers to introspect the predicate we provide a `Not` wrapper that simply negates the predicate in an introspectable manner. Several of the predicates listed above are created in this manner.\n\nWe do not specify what behaviour should be expected for predicates that raise\nan exception.  For example `Annotated[int, Predicate(str.isdigit)]` might silently\nskip invalid constraints, or statically raise an error; or it might try calling it\nand then propagate or discard the resulting\n`TypeError: descriptor 'isdigit' for 'str' objects doesn't apply to a 'int' object`\nexception.  We encourage libraries to document the behaviour they choose.\n\n### Doc\n\n`doc()` can be used to add documentation information in `Annotated`, for function and method parameters, variables, class attributes, return types, and any place where `Annotated` can be used.\n\nIt expects a value that can be statically analyzed, as the main use case is for static analysis, editors, documentation generators, and similar tools.\n\nIt returns a `DocInfo` class with a single attribute `documentation` containing the value passed to `doc()`.\n\nThis is the early adopter's alternative form of the [`typing-doc` proposal](https://github.com/tiangolo/fastapi/blob/typing-doc/typing_doc.md).\n\n### Integrating downstream types with `GroupedMetadata`\n\nImplementers may choose to provide a convenience wrapper that groups multiple pieces of metadata.\nThis can help reduce verbosity and cognitive overhead for users.\nFor example, an implementer like Pydantic might provide a `Field` or `Meta` type that accepts keyword arguments and transforms these into low-level metadata:\n\n```python\nfrom dataclasses import dataclass\nfrom typing import Iterator\nfrom annotated_types import GroupedMetadata, Ge\n\n@dataclass\nclass Field(GroupedMetadata):\n    ge: int | None = None\n    description: str | None = None\n\n    def __iter__(self) -> Iterator[object]:\n        # Iterating over a GroupedMetadata object should yield annotated-types\n        # constraint metadata objects which describe it as fully as possible,\n        # and may include other unknown objects too.\n        if self.ge is not None:\n            yield Ge(self.ge)\n        if self.description is not None:\n            yield Description(self.description)\n```\n\nLibraries consuming annotated-types constraints should check for `GroupedMetadata` and unpack it by iterating over the object and treating the results as if they had been \"unpacked\" in the `Annotated` type.  The same logic should be applied to the [PEP 646 `Unpack` type](https://peps.python.org/pep-0646/), so that `Annotated[T, Field(...)]`, `Annotated[T, Unpack[Field(...)]]` and `Annotated[T, *Field(...)]` are all treated consistently.\n\nLibraries consuming annotated-types should also ignore any metadata they do not recongize that came from unpacking a `GroupedMetadata`, just like they ignore unrecognized metadata in `Annotated` itself.\n\nOur own `annotated_types.Interval` class is a `GroupedMetadata` which unpacks itself into `Gt`, `Lt`, etc., so this is not an abstract concern.  Similarly, `annotated_types.Len` is a `GroupedMetadata` which unpacks itself into `MinLen` (optionally) and `MaxLen`.\n\n### Consuming metadata\n\nWe intend to not be prescriptive as to _how_ the metadata and constraints are used, but as an example of how one might parse constraints from types annotations see our [implementation in `test_main.py`](https://github.com/annotated-types/annotated-types/blob/f59cf6d1b5255a0fe359b93896759a180bec30ae/tests/test_main.py#L94-L103).\n\nIt is up to the implementer to determine how this metadata is used.\nYou could use the metadata for runtime type checking, for generating schemas or to generate example data, amongst other use cases.\n\n## Design & History\n\nThis package was designed at the PyCon 2022 sprints by the maintainers of Pydantic\nand Hypothesis, with the goal of making it as easy as possible for end-users to\nprovide more informative annotations for use by runtime libraries.\n\nIt is deliberately minimal, and following PEP-593 allows considerable downstream\ndiscretion in what (if anything!) they choose to support. Nonetheless, we expect\nthat staying simple and covering _only_ the most common use-cases will give users\nand maintainers the best experience we can. If you'd like more constraints for your\ntypes - follow our lead, by defining them and documenting them downstream!\n",
        "description_content_type": "text/markdown",
        "author_email": "Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Samuel Colvin <s@muelcolvin.com>, Zac Hatfield-Dodds <zac@zhd.dev>",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 4 - Beta",
          "Environment :: Console",
          "Environment :: MacOS X",
          "Intended Audience :: Developers",
          "Intended Audience :: Information Technology",
          "License :: OSI Approved :: MIT License",
          "Operating System :: POSIX :: Linux",
          "Operating System :: Unix",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Typing :: Typed"
        ],
        "requires_dist": [
          "typing-extensions>=4.0.0; python_version < '3.9'"
        ],
        "requires_python": ">=3.8",
        "project_url": [
          "Homepage, https://github.com/annotated-types/annotated-types",
          "Source, https://github.com/annotated-types/annotated-types",
          "Changelog, https://github.com/annotated-types/annotated-types/releases"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/annotated_types-0.7.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "tqdm",
        "version": "4.67.3",
        "dynamic": [
          "license-file"
        ],
        "summary": "Fast, Extensible Progress Meter",
        "description": "|Logo|\n\ntqdm\n====\n\n|Py-Versions| |Versions| |Conda-Forge-Status| |Docker| |Snapcraft|\n\n|Build-Status| |Coverage-Status| |Branch-Coverage-Status| |Codacy-Grade| |Libraries-Rank| |PyPI-Downloads|\n\n|LICENCE| |OpenHub-Status| |binder-demo| |awesome-python|\n\n``tqdm`` derives from the Arabic word *taqaddum* (تقدّم) which can mean \"progress,\"\nand is an abbreviation for \"I love you so much\" in Spanish (*te quiero demasiado*).\n\nInstantly make your loops show a smart progress meter - just wrap any\niterable with ``tqdm(iterable)``, and you're done!\n\n.. code:: python\n\n    from tqdm import tqdm\n    for i in tqdm(range(10000)):\n        ...\n\n``76%|████████████████████████        | 7568/10000 [00:33<00:10, 229.00it/s]``\n\n``trange(N)`` can be also used as a convenient shortcut for\n``tqdm(range(N))``.\n\n|Screenshot|\n    |Video| |Slides| |Merch|\n\nIt can also be executed as a module with pipes:\n\n.. code:: sh\n\n    $ seq 9999999 | tqdm --bytes | wc -l\n    75.2MB [00:00, 217MB/s]\n    9999999\n\n    $ tar -zcf - docs/ | tqdm --bytes --total `du -sb docs/ | cut -f1` \\\n        > backup.tgz\n     32%|██████████▍                      | 8.89G/27.9G [00:42<01:31, 223MB/s]\n\nOverhead is low -- about 60ns per iteration (80ns with ``tqdm.gui``), and is\nunit tested against performance regression.\nBy comparison, the well-established\n`ProgressBar <https://github.com/niltonvolpato/python-progressbar>`__ has\nan 800ns/iter overhead.\n\nIn addition to its low overhead, ``tqdm`` uses smart algorithms to predict\nthe remaining time and to skip unnecessary iteration displays, which allows\nfor a negligible overhead in most cases.\n\n``tqdm`` works on any platform\n(Linux, Windows, Mac, FreeBSD, NetBSD, Solaris/SunOS),\nin any console or in a GUI, and is also friendly with IPython/Jupyter notebooks.\n\n``tqdm`` does not require any dependencies (not even ``curses``!), just\nPython and an environment supporting ``carriage return \\r`` and\n``line feed \\n`` control characters.\n\n------------------------------------------\n\n.. contents:: Table of contents\n   :backlinks: top\n   :local:\n\n\nInstallation\n------------\n\nLatest PyPI stable release\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n|Versions| |PyPI-Downloads| |Libraries-Dependents|\n\n.. code:: sh\n\n    pip install tqdm\n\nLatest development release on GitHub\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n|GitHub-Status| |GitHub-Stars| |GitHub-Commits| |GitHub-Forks| |GitHub-Updated|\n\nPull and install pre-release ``devel`` branch:\n\n.. code:: sh\n\n    pip install \"git+https://github.com/tqdm/tqdm.git@devel#egg=tqdm\"\n\nLatest Conda release\n~~~~~~~~~~~~~~~~~~~~\n\n|Conda-Forge-Status|\n\n.. code:: sh\n\n    conda install -c conda-forge tqdm\n\nLatest Snapcraft release\n~~~~~~~~~~~~~~~~~~~~~~~~\n\n|Snapcraft|\n\nThere are 3 channels to choose from:\n\n.. code:: sh\n\n    snap install tqdm  # implies --stable, i.e. latest tagged release\n    snap install tqdm  --candidate  # master branch\n    snap install tqdm  --edge  # devel branch\n\nNote that ``snap`` binaries are purely for CLI use (not ``import``-able), and\nautomatically set up ``bash`` tab-completion.\n\nLatest Docker release\n~~~~~~~~~~~~~~~~~~~~~\n\n|Docker|\n\n.. code:: sh\n\n    docker pull tqdm/tqdm\n    docker run -i --rm tqdm/tqdm --help\n\nOther\n~~~~~\n\nThere are other (unofficial) places where ``tqdm`` may be downloaded, particularly for CLI use:\n\n|Repology|\n\n.. |Repology| image:: https://repology.org/badge/tiny-repos/python:tqdm.svg\n   :target: https://repology.org/project/python:tqdm/versions\n\nChangelog\n---------\n\nThe list of all changes is available either on GitHub's Releases:\n|GitHub-Status|, on the\n`wiki <https://github.com/tqdm/tqdm/wiki/Releases>`__, or on the\n`website <https://tqdm.github.io/releases>`__.\n\n\nUsage\n-----\n\n``tqdm`` is very versatile and can be used in a number of ways.\nThe three main ones are given below.\n\nIterable-based\n~~~~~~~~~~~~~~\n\nWrap ``tqdm()`` around any iterable:\n\n.. code:: python\n\n    from tqdm import tqdm\n    from time import sleep\n\n    text = \"\"\n    for char in tqdm([\"a\", \"b\", \"c\", \"d\"]):\n        sleep(0.25)\n        text = text + char\n\n``trange(i)`` is a special optimised instance of ``tqdm(range(i))``:\n\n.. code:: python\n\n    from tqdm import trange\n\n    for i in trange(100):\n        sleep(0.01)\n\nInstantiation outside of the loop allows for manual control over ``tqdm()``:\n\n.. code:: python\n\n    pbar = tqdm([\"a\", \"b\", \"c\", \"d\"])\n    for char in pbar:\n        sleep(0.25)\n        pbar.set_description(\"Processing %s\" % char)\n\nManual\n~~~~~~\n\nManual control of ``tqdm()`` updates using a ``with`` statement:\n\n.. code:: python\n\n    with tqdm(total=100) as pbar:\n        for i in range(10):\n            sleep(0.1)\n            pbar.update(10)\n\nIf the optional variable ``total`` (or an iterable with ``len()``) is\nprovided, predictive stats are displayed.\n\n``with`` is also optional (you can just assign ``tqdm()`` to a variable,\nbut in this case don't forget to ``del`` or ``close()`` at the end:\n\n.. code:: python\n\n    pbar = tqdm(total=100)\n    for i in range(10):\n        sleep(0.1)\n        pbar.update(10)\n    pbar.close()\n\nModule\n~~~~~~\n\nPerhaps the most wonderful use of ``tqdm`` is in a script or on the command\nline. Simply inserting ``tqdm`` (or ``python -m tqdm``) between pipes will pass\nthrough all ``stdin`` to ``stdout`` while printing progress to ``stderr``.\n\nThe example below demonstrate counting the number of lines in all Python files\nin the current directory, with timing information included.\n\n.. code:: sh\n\n    $ time find . -name '*.py' -type f -exec cat \\{} \\; | wc -l\n    857365\n\n    real    0m3.458s\n    user    0m0.274s\n    sys     0m3.325s\n\n    $ time find . -name '*.py' -type f -exec cat \\{} \\; | tqdm | wc -l\n    857366it [00:03, 246471.31it/s]\n    857365\n\n    real    0m3.585s\n    user    0m0.862s\n    sys     0m3.358s\n\nNote that the usual arguments for ``tqdm`` can also be specified.\n\n.. code:: sh\n\n    $ find . -name '*.py' -type f -exec cat \\{} \\; |\n        tqdm --unit loc --unit_scale --total 857366 >> /dev/null\n    100%|█████████████████████████████████| 857K/857K [00:04<00:00, 246Kloc/s]\n\nBacking up a large directory?\n\n.. code:: sh\n\n    $ tar -zcf - docs/ | tqdm --bytes --total `du -sb docs/ | cut -f1` \\\n      > backup.tgz\n     44%|██████████████▊                   | 153M/352M [00:14<00:18, 11.0MB/s]\n\nThis can be beautified further:\n\n.. code:: sh\n\n    $ BYTES=$(du -sb docs/ | cut -f1)\n    $ tar -cf - docs/ \\\n      | tqdm --bytes --total \"$BYTES\" --desc Processing | gzip \\\n      | tqdm --bytes --total \"$BYTES\" --desc Compressed --position 1 \\\n      > ~/backup.tgz\n    Processing: 100%|██████████████████████| 352M/352M [00:14<00:00, 30.2MB/s]\n    Compressed:  42%|█████████▎            | 148M/352M [00:14<00:19, 10.9MB/s]\n\nOr done on a file level using 7-zip:\n\n.. code:: sh\n\n    $ 7z a -bd -r backup.7z docs/ | grep Compressing \\\n      | tqdm --total $(find docs/ -type f | wc -l) --unit files \\\n      | grep -v Compressing\n    100%|██████████████████████████▉| 15327/15327 [01:00<00:00, 712.96files/s]\n\nPre-existing CLI programs already outputting basic progress information will\nbenefit from ``tqdm``'s ``--update`` and ``--update_to`` flags:\n\n.. code:: sh\n\n    $ seq 3 0.1 5 | tqdm --total 5 --update_to --null\n    100%|████████████████████████████████████| 5.0/5 [00:00<00:00, 9673.21it/s]\n    $ seq 10 | tqdm --update --null  # 1 + 2 + ... + 10 = 55 iterations\n    55it [00:00, 90006.52it/s]\n\nFAQ and Known Issues\n--------------------\n\n|GitHub-Issues|\n\nThe most common issues relate to excessive output on multiple lines, instead\nof a neat one-line progress bar.\n\n- Consoles in general: require support for carriage return (``CR``, ``\\r``).\n\n  * Some cloud logging consoles which don't support ``\\r`` properly\n    (`cloudwatch <https://github.com/tqdm/tqdm/issues/966>`__,\n    `K8s <https://github.com/tqdm/tqdm/issues/1319>`__) may benefit from\n    ``export TQDM_POSITION=-1``.\n\n- Nested progress bars:\n\n  * Consoles in general: require support for moving cursors up to the\n    previous line. For example,\n    `IDLE <https://github.com/tqdm/tqdm/issues/191#issuecomment-230168030>`__,\n    `ConEmu <https://github.com/tqdm/tqdm/issues/254>`__ and\n    `PyCharm <https://github.com/tqdm/tqdm/issues/203>`__ (also\n    `here <https://github.com/tqdm/tqdm/issues/208>`__,\n    `here <https://github.com/tqdm/tqdm/issues/307>`__, and\n    `here <https://github.com/tqdm/tqdm/issues/454#issuecomment-335416815>`__)\n    lack full support.\n  * Windows: additionally may require the Python module ``colorama``\n    to ensure nested bars stay within their respective lines.\n\n- Unicode:\n\n  * Environments which report that they support unicode will have solid smooth\n    progressbars. The fallback is an ``ascii``-only bar.\n  * Windows consoles often only partially support unicode and thus\n    `often require explicit ascii=True <https://github.com/tqdm/tqdm/issues/454#issuecomment-335416815>`__\n    (also `here <https://github.com/tqdm/tqdm/issues/499>`__). This is due to\n    either normal-width unicode characters being incorrectly displayed as\n    \"wide\", or some unicode characters not rendering.\n\n- Wrapping generators:\n\n  * Generator wrapper functions tend to hide the length of iterables.\n    ``tqdm`` does not.\n  * Replace ``tqdm(enumerate(...))`` with ``enumerate(tqdm(...))`` or\n    ``tqdm(enumerate(x), total=len(x), ...)``.\n    The same applies to ``numpy.ndenumerate``.\n  * Replace ``tqdm(zip(a, b))`` with ``zip(tqdm(a), b)`` or even\n    ``zip(tqdm(a), tqdm(b))``.\n  * The same applies to ``itertools``.\n  * Some useful convenience functions can be found under ``tqdm.contrib``.\n\n- `No intermediate output in docker-compose <https://github.com/tqdm/tqdm/issues/771>`__:\n  use ``docker-compose run`` instead of ``docker-compose up`` and ``tty: true``.\n\n- Overriding defaults via environment variables:\n  e.g. in CI/cloud jobs, ``export TQDM_MININTERVAL=5`` to avoid log spam.\n  This override logic is handled by the ``tqdm.utils.envwrap`` decorator\n  (useful independent of ``tqdm``).\n\nIf you come across any other difficulties, browse and file |GitHub-Issues|.\n\nDocumentation\n-------------\n\n|Py-Versions| |README-Hits| (Since 19 May 2016)\n\n.. code:: python\n\n    class tqdm():\n      \"\"\"\n      Decorate an iterable object, returning an iterator which acts exactly\n      like the original iterable, but prints a dynamically updating\n      progressbar every time a value is requested.\n      \"\"\"\n\n      @envwrap(\"TQDM_\")  # override defaults via env vars\n      def __init__(self, iterable=None, desc=None, total=None, leave=True,\n                   file=None, ncols=None, mininterval=0.1,\n                   maxinterval=10.0, miniters=None, ascii=None, disable=False,\n                   unit='it', unit_scale=False, dynamic_ncols=False,\n                   smoothing=0.3, bar_format=None, initial=0, position=None,\n                   postfix=None, unit_divisor=1000, write_bytes=False,\n                   lock_args=None, nrows=None, colour=None, delay=0):\n\nParameters\n~~~~~~~~~~\n\n* iterable  : iterable, optional  \n    Iterable to decorate with a progressbar.\n    Leave blank to manually manage the updates.\n* desc  : str, optional  \n    Prefix for the progressbar.\n* total  : int or float, optional  \n    The number of expected iterations. If unspecified,\n    len(iterable) is used if possible. If float(\"inf\") or as a last\n    resort, only basic progress statistics are displayed\n    (no ETA, no progressbar).\n    If ``gui`` is True and this parameter needs subsequent updating,\n    specify an initial arbitrary large positive number,\n    e.g. 9e9.\n* leave  : bool, optional  \n    If [default: True], keeps all traces of the progressbar\n    upon termination of iteration.\n    If ``None``, will leave only if ``position`` is ``0``.\n* file  : ``io.TextIOWrapper`` or ``io.StringIO``, optional  \n    Specifies where to output the progress messages\n    (default: sys.stderr). Uses ``file.write(str)`` and ``file.flush()``\n    methods.  For encoding, see ``write_bytes``.\n* ncols  : int, optional  \n    The width of the entire output message. If specified,\n    dynamically resizes the progressbar to stay within this bound.\n    If unspecified, attempts to use environment width. The\n    fallback is a meter width of 10 and no limit for the counter and\n    statistics. If 0, will not print any meter (only stats).\n* mininterval  : float, optional  \n    Minimum progress display update interval [default: 0.1] seconds.\n* maxinterval  : float, optional  \n    Maximum progress display update interval [default: 10] seconds.\n    Automatically adjusts ``miniters`` to correspond to ``mininterval``\n    after long display update lag. Only works if ``dynamic_miniters``\n    or monitor thread is enabled.\n* miniters  : int or float, optional  \n    Minimum progress display update interval, in iterations.\n    If 0 and ``dynamic_miniters``, will automatically adjust to equal\n    ``mininterval`` (more CPU efficient, good for tight loops).\n    If > 0, will skip display of specified number of iterations.\n    Tweak this and ``mininterval`` to get very efficient loops.\n    If your progress is erratic with both fast and slow iterations\n    (network, skipping items, etc) you should set miniters=1.\n* ascii  : bool or str, optional  \n    If unspecified or False, use unicode (smooth blocks) to fill\n    the meter. The fallback is to use ASCII characters \" 123456789#\".\n* disable  : bool, optional  \n    Whether to disable the entire progressbar wrapper\n    [default: False]. If set to None, disable on non-TTY.\n* unit  : str, optional  \n    String that will be used to define the unit of each iteration\n    [default: it].\n* unit_scale  : bool or int or float, optional  \n    If 1 or True, the number of iterations will be reduced/scaled\n    automatically and a metric prefix following the\n    International System of Units standard will be added\n    (kilo, mega, etc.) [default: False]. If any other non-zero\n    number, will scale ``total`` and ``n``.\n* dynamic_ncols  : bool, optional  \n    If set, constantly alters ``ncols`` and ``nrows`` to the\n    environment (allowing for window resizes) [default: False].\n* smoothing  : float, optional  \n    Exponential moving average smoothing factor for speed estimates\n    (ignored in GUI mode). Ranges from 0 (average speed) to 1\n    (current/instantaneous speed) [default: 0.3].\n* bar_format  : str, optional  \n    Specify a custom bar string formatting. May impact performance.\n    [default: '{l_bar}{bar}{r_bar}'], where\n    l_bar='{desc}: {percentage:3.0f}%|' and\n    r_bar='| {n_fmt}/{total_fmt} [{elapsed}<{remaining}, '\n    '{rate_fmt}{postfix}]'\n    Possible vars: l_bar, bar, r_bar, n, n_fmt, total, total_fmt,\n    percentage, elapsed, elapsed_s, ncols, nrows, desc, unit,\n    rate, rate_fmt, rate_noinv, rate_noinv_fmt,\n    rate_inv, rate_inv_fmt, postfix, unit_divisor,\n    remaining, remaining_s, eta.\n    Note that a trailing \": \" is automatically removed after {desc}\n    if the latter is empty.\n* initial  : int or float, optional  \n    The initial counter value. Useful when restarting a progress\n    bar [default: 0]. If using float, consider specifying ``{n:.3f}``\n    or similar in ``bar_format``, or specifying ``unit_scale``.\n* position  : int, optional  \n    Specify the line offset to print this bar (starting from 0)\n    Automatic if unspecified.\n    Useful to manage multiple bars at once (eg, from threads).\n* postfix  : dict or ``*``, optional  \n    Specify additional stats to display at the end of the bar.\n    Calls ``set_postfix(**postfix)`` if possible (dict).\n* unit_divisor  : float, optional  \n    [default: 1000], ignored unless ``unit_scale`` is True.\n* write_bytes  : bool, optional  \n    Whether to write bytes. If (default: False) will write unicode.\n* lock_args  : tuple, optional  \n    Passed to ``refresh`` for intermediate output\n    (initialisation, iterating, and updating).\n* nrows  : int, optional  \n    The screen height. If specified, hides nested bars outside this\n    bound. If unspecified, attempts to use environment height.\n    The fallback is 20.\n* colour  : str, optional  \n    Bar colour (e.g. 'green', '#00ff00').\n* delay  : float, optional  \n    Don't display until [default: 0] seconds have elapsed.\n\nExtra CLI Options\n~~~~~~~~~~~~~~~~~\n\n* delim  : chr, optional  \n    Delimiting character [default: '\\n']. Use '\\0' for null.\n    N.B.: on Windows systems, Python converts '\\n' to '\\r\\n'.\n* buf_size  : int, optional  \n    String buffer size in bytes [default: 256]\n    used when ``delim`` is specified.\n* bytes  : bool, optional  \n    If true, will count bytes, ignore ``delim``, and default\n    ``unit_scale`` to True, ``unit_divisor`` to 1024, and ``unit`` to 'B'.\n* tee  : bool, optional  \n    If true, passes ``stdin`` to both ``stderr`` and ``stdout``.\n* update  : bool, optional  \n    If true, will treat input as newly elapsed iterations,\n    i.e. numbers to pass to ``update()``. Note that this is slow\n    (~2e5 it/s) since every input must be decoded as a number.\n* update_to  : bool, optional  \n    If true, will treat input as total elapsed iterations,\n    i.e. numbers to assign to ``self.n``. Note that this is slow\n    (~2e5 it/s) since every input must be decoded as a number.\n* null  : bool, optional  \n    If true, will discard input (no stdout).\n* manpath  : str, optional  \n    Directory in which to install tqdm man pages.\n* comppath  : str, optional  \n    Directory in which to place tqdm completion.\n* log  : str, optional  \n    CRITICAL|FATAL|ERROR|WARN(ING)|[default: 'INFO']|DEBUG|NOTSET.\n\nReturns\n~~~~~~~\n\n* out  : decorated iterator.  \n\n.. code:: python\n\n    class tqdm():\n      def update(self, n=1):\n          \"\"\"\n          Manually update the progress bar, useful for streams\n          such as reading files.\n          E.g.:\n          >>> t = tqdm(total=filesize) # Initialise\n          >>> for current_buffer in stream:\n          ...    ...\n          ...    t.update(len(current_buffer))\n          >>> t.close()\n          The last line is highly recommended, but possibly not necessary if\n          ``t.update()`` will be called in such a way that ``filesize`` will be\n          exactly reached and printed.\n\n          Parameters\n          ----------\n          n  : int or float, optional\n              Increment to add to the internal counter of iterations\n              [default: 1]. If using float, consider specifying ``{n:.3f}``\n              or similar in ``bar_format``, or specifying ``unit_scale``.\n\n          Returns\n          -------\n          out  : bool or None\n              True if a ``display()`` was triggered.\n          \"\"\"\n\n      def close(self):\n          \"\"\"Cleanup and (if leave=False) close the progressbar.\"\"\"\n\n      def clear(self, nomove=False):\n          \"\"\"Clear current bar display.\"\"\"\n\n      def refresh(self):\n          \"\"\"\n          Force refresh the display of this bar.\n\n          Parameters\n          ----------\n          nolock  : bool, optional\n              If ``True``, does not lock.\n              If [default: ``False``]: calls ``acquire()`` on internal lock.\n          lock_args  : tuple, optional\n              Passed to internal lock's ``acquire()``.\n              If specified, will only ``display()`` if ``acquire()`` returns ``True``.\n          \"\"\"\n\n      def unpause(self):\n          \"\"\"Restart tqdm timer from last print time.\"\"\"\n\n      def reset(self, total=None):\n          \"\"\"\n          Resets to 0 iterations for repeated use.\n\n          Consider combining with ``leave=True``.\n\n          Parameters\n          ----------\n          total  : int or float, optional. Total to use for the new bar.\n          \"\"\"\n\n      def set_description(self, desc=None, refresh=True):\n          \"\"\"\n          Set/modify description of the progress bar.\n\n          Parameters\n          ----------\n          desc  : str, optional\n          refresh  : bool, optional\n              Forces refresh [default: True].\n          \"\"\"\n\n      def set_postfix(self, ordered_dict=None, refresh=True, **tqdm_kwargs):\n          \"\"\"\n          Set/modify postfix (additional stats)\n          with automatic formatting based on datatype.\n\n          Parameters\n          ----------\n          ordered_dict  : dict or OrderedDict, optional\n          refresh  : bool, optional\n              Forces refresh [default: True].\n          kwargs  : dict, optional\n          \"\"\"\n\n      @classmethod\n      def write(cls, s, file=sys.stdout, end=\"\\n\"):\n          \"\"\"Print a message via tqdm (without overlap with bars).\"\"\"\n\n      @property\n      def format_dict(self):\n          \"\"\"Public API for read-only member access.\"\"\"\n\n      def display(self, msg=None, pos=None):\n          \"\"\"\n          Use ``self.sp`` to display ``msg`` in the specified ``pos``.\n\n          Consider overloading this function when inheriting to use e.g.:\n          ``self.some_frontend(**self.format_dict)`` instead of ``self.sp``.\n\n          Parameters\n          ----------\n          msg  : str, optional. What to display (default: ``repr(self)``).\n          pos  : int, optional. Position to ``moveto``\n            (default: ``abs(self.pos)``).\n          \"\"\"\n\n      @classmethod\n      @contextmanager\n      def wrapattr(cls, stream, method, total=None, bytes=True, **tqdm_kwargs):\n          \"\"\"\n          stream  : file-like object.\n          method  : str, \"read\" or \"write\". The result of ``read()`` and\n              the first argument of ``write()`` should have a ``len()``.\n\n          >>> with tqdm.wrapattr(file_obj, \"read\", total=file_obj.size) as fobj:\n          ...     while True:\n          ...         chunk = fobj.read(chunk_size)\n          ...         if not chunk:\n          ...             break\n          \"\"\"\n\n      @classmethod\n      def pandas(cls, *targs, **tqdm_kwargs):\n          \"\"\"Registers the current `tqdm` class with `pandas`.\"\"\"\n\n    def trange(*args, **tqdm_kwargs):\n        \"\"\"Shortcut for `tqdm(range(*args), **tqdm_kwargs)`.\"\"\"\n\nConvenience Functions\n~~~~~~~~~~~~~~~~~~~~~\n\n.. code:: python\n\n    def tqdm.contrib.tenumerate(iterable, start=0, total=None,\n                                tqdm_class=tqdm.auto.tqdm, **tqdm_kwargs):\n        \"\"\"Equivalent of `numpy.ndenumerate` or builtin `enumerate`.\"\"\"\n\n    def tqdm.contrib.tzip(iter1, *iter2plus, **tqdm_kwargs):\n        \"\"\"Equivalent of builtin `zip`.\"\"\"\n\n    def tqdm.contrib.tmap(function, *sequences, **tqdm_kwargs):\n        \"\"\"Equivalent of builtin `map`.\"\"\"\n\nSubmodules\n~~~~~~~~~~\n\n.. code:: python\n\n    class tqdm.notebook.tqdm(tqdm.tqdm):\n        \"\"\"IPython/Jupyter Notebook widget.\"\"\"\n\n    class tqdm.auto.tqdm(tqdm.tqdm):\n        \"\"\"Automatically chooses beween `tqdm.notebook` and `tqdm.tqdm`.\"\"\"\n\n    class tqdm.asyncio.tqdm(tqdm.tqdm):\n      \"\"\"Asynchronous version.\"\"\"\n      @classmethod\n      def as_completed(cls, fs, *, loop=None, timeout=None, total=None,\n                       **tqdm_kwargs):\n          \"\"\"Wrapper for `asyncio.as_completed`.\"\"\"\n\n    class tqdm.gui.tqdm(tqdm.tqdm):\n        \"\"\"Matplotlib GUI version.\"\"\"\n\n    class tqdm.tk.tqdm(tqdm.tqdm):\n        \"\"\"Tkinter GUI version.\"\"\"\n\n    class tqdm.rich.tqdm(tqdm.tqdm):\n        \"\"\"`rich.progress` version.\"\"\"\n\n    class tqdm.keras.TqdmCallback(keras.callbacks.Callback):\n        \"\"\"Keras callback for epoch and batch progress.\"\"\"\n\n    class tqdm.dask.TqdmCallback(dask.callbacks.Callback):\n        \"\"\"Dask callback for task progress.\"\"\"\n\n\n``contrib``\n+++++++++++\n\nThe ``tqdm.contrib`` package also contains experimental modules:\n\n- ``tqdm.contrib.itertools``: Thin wrappers around ``itertools``\n- ``tqdm.contrib.concurrent``: Thin wrappers around ``concurrent.futures``\n- ``tqdm.contrib.slack``: Posts to `Slack <https://slack.com>`__ bots\n- ``tqdm.contrib.discord``: Posts to `Discord <https://discord.com>`__ bots\n- ``tqdm.contrib.telegram``: Posts to `Telegram <https://telegram.org>`__ bots\n- ``tqdm.contrib.bells``: Automagically enables all optional features\n\n  * ``auto``, ``pandas``, ``slack``, ``discord``, ``telegram``\n\nExamples and Advanced Usage\n---------------------------\n\n- See the `examples <https://github.com/tqdm/tqdm/tree/master/examples>`__\n  folder;\n- import the module and run ``help()``;\n- consult the `wiki <https://github.com/tqdm/tqdm/wiki>`__;\n\n  * this has an\n    `excellent article <https://github.com/tqdm/tqdm/wiki/How-to-make-a-great-Progress-Bar>`__\n    on how to make a **great** progressbar;\n\n- check out the `slides from PyData London <https://tqdm.github.io/PyData2019/slides.html>`__, or\n- run the |binder-demo|.\n\nDescription and additional stats\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nCustom information can be displayed and updated dynamically on ``tqdm`` bars\nwith the ``desc`` and ``postfix`` arguments:\n\n.. code:: python\n\n    from tqdm import tqdm, trange\n    from random import random, randint\n    from time import sleep\n\n    with trange(10) as t:\n        for i in t:\n            # Description will be displayed on the left\n            t.set_description('GEN %i' % i)\n            # Postfix will be displayed on the right,\n            # formatted automatically based on argument's datatype\n            t.set_postfix(loss=random(), gen=randint(1,999), str='h',\n                          lst=[1, 2])\n            sleep(0.1)\n\n    with tqdm(total=10, bar_format=\"{postfix[0]} {postfix[1][value]:>8.2g}\",\n              postfix=[\"Batch\", {\"value\": 0}]) as t:\n        for i in range(10):\n            sleep(0.1)\n            t.postfix[1][\"value\"] = i / 2\n            t.update()\n\nPoints to remember when using ``{postfix[...]}`` in the ``bar_format`` string:\n\n- ``postfix`` also needs to be passed as an initial argument in a compatible\n  format, and\n- ``postfix`` will be auto-converted to a string if it is a ``dict``-like\n  object. To prevent this behaviour, insert an extra item into the dictionary\n  where the key is not a string.\n\nAdditional ``bar_format`` parameters may also be defined by overriding\n``format_dict``, and the bar itself may be modified using ``ascii``:\n\n.. code:: python\n\n    from tqdm import tqdm\n    class TqdmExtraFormat(tqdm):\n        \"\"\"Provides a `total_time` format parameter\"\"\"\n        @property\n        def format_dict(self):\n            d = super().format_dict\n            total_time = d[\"elapsed\"] * (d[\"total\"] or 0) / max(d[\"n\"], 1)\n            d.update(total_time=self.format_interval(total_time) + \" in total\")\n            return d\n\n    for i in TqdmExtraFormat(\n          range(9), ascii=\" .oO0\",\n          bar_format=\"{total_time}: {percentage:.0f}%|{bar}{r_bar}\"):\n        if i == 4:\n            break\n\n.. code::\n\n    00:00 in total: 44%|0000.     | 4/9 [00:00<00:00, 962.93it/s]\n\nNote that ``{bar}`` also supports a format specifier ``[width][type]``.\n\n- ``width``\n\n  * unspecified (default): automatic to fill ``ncols``\n  * ``int >= 0``: fixed width overriding ``ncols`` logic\n  * ``int < 0``: subtract from the automatic default\n\n- ``type``\n\n  * ``a``: ascii (``ascii=True`` override)\n  * ``u``: unicode (``ascii=False`` override)\n  * ``b``: blank (``ascii=\"  \"`` override)\n\nThis means a fixed bar with right-justified text may be created by using:\n``bar_format=\"{l_bar}{bar:10}|{bar:-10b}right-justified\"``\n\nNested progress bars\n~~~~~~~~~~~~~~~~~~~~\n\n``tqdm`` supports nested progress bars. Here's an example:\n\n.. code:: python\n\n    from tqdm.auto import trange\n    from time import sleep\n\n    for i in trange(4, desc='1st loop'):\n        for j in trange(5, desc='2nd loop'):\n            for k in trange(50, desc='3rd loop', leave=False):\n                sleep(0.01)\n\nFor manual control over positioning (e.g. for multi-processing use),\nyou may specify ``position=n`` where ``n=0`` for the outermost bar,\n``n=1`` for the next, and so on.\nHowever, it's best to check if ``tqdm`` can work without manual ``position``\nfirst.\n\n.. code:: python\n\n    from time import sleep\n    from tqdm import trange, tqdm\n    from multiprocessing import Pool, RLock, freeze_support\n\n    L = list(range(9))\n\n    def progresser(n):\n        interval = 0.001 / (n + 2)\n        total = 5000\n        text = f\"#{n}, est. {interval * total:<04.2}s\"\n        for _ in trange(total, desc=text, position=n):\n            sleep(interval)\n\n    if __name__ == '__main__':\n        freeze_support()  # for Windows support\n        tqdm.set_lock(RLock())  # for managing output contention\n        p = Pool(initializer=tqdm.set_lock, initargs=(tqdm.get_lock(),))\n        p.map(progresser, L)\n\nNote that in Python 3, ``tqdm.write`` is thread-safe:\n\n.. code:: python\n\n    from time import sleep\n    from tqdm import tqdm, trange\n    from concurrent.futures import ThreadPoolExecutor\n\n    L = list(range(9))\n\n    def progresser(n):\n        interval = 0.001 / (n + 2)\n        total = 5000\n        text = f\"#{n}, est. {interval * total:<04.2}s\"\n        for _ in trange(total, desc=text):\n            sleep(interval)\n        if n == 6:\n            tqdm.write(\"n == 6 completed.\")\n            tqdm.write(\"`tqdm.write()` is thread-safe in py3!\")\n\n    if __name__ == '__main__':\n        with ThreadPoolExecutor() as p:\n            p.map(progresser, L)\n\nHooks and callbacks\n~~~~~~~~~~~~~~~~~~~\n\n``tqdm`` can easily support callbacks/hooks and manual updates.\nHere's an example with ``urllib``:\n\n**``urllib.urlretrieve`` documentation**\n\n    | [...]\n    | If present, the hook function will be called once\n    | on establishment of the network connection and once after each block read\n    | thereafter. The hook will be passed three arguments; a count of blocks\n    | transferred so far, a block size in bytes, and the total size of the file.\n    | [...]\n\n.. code:: python\n\n    import urllib, os\n    from tqdm import tqdm\n    urllib = getattr(urllib, 'request', urllib)\n\n    class TqdmUpTo(tqdm):\n        \"\"\"Provides `update_to(n)` which uses `tqdm.update(delta_n)`.\"\"\"\n        def update_to(self, b=1, bsize=1, tsize=None):\n            \"\"\"\n            b  : int, optional\n                Number of blocks transferred so far [default: 1].\n            bsize  : int, optional\n                Size of each block (in tqdm units) [default: 1].\n            tsize  : int, optional\n                Total size (in tqdm units). If [default: None] remains unchanged.\n            \"\"\"\n            if tsize is not None:\n                self.total = tsize\n            return self.update(b * bsize - self.n)  # also sets self.n = b * bsize\n\n    eg_link = \"https://caspersci.uk.to/matryoshka.zip\"\n    with TqdmUpTo(unit='B', unit_scale=True, unit_divisor=1024, miniters=1,\n                  desc=eg_link.split('/')[-1]) as t:  # all optional kwargs\n        urllib.urlretrieve(eg_link, filename=os.devnull,\n                           reporthook=t.update_to, data=None)\n        t.total = t.n\n\nInspired by `twine#242 <https://github.com/pypa/twine/pull/242>`__.\nFunctional alternative in\n`examples/tqdm_wget.py <https://github.com/tqdm/tqdm/blob/master/examples/tqdm_wget.py>`__.\n\nIt is recommend to use ``miniters=1`` whenever there is potentially\nlarge differences in iteration speed (e.g. downloading a file over\na patchy connection).\n\n**Wrapping read/write methods**\n\nTo measure throughput through a file-like object's ``read`` or ``write``\nmethods, use ``CallbackIOWrapper``:\n\n.. code:: python\n\n    from tqdm.auto import tqdm\n    from tqdm.utils import CallbackIOWrapper\n\n    with tqdm(total=file_obj.size,\n              unit='B', unit_scale=True, unit_divisor=1024) as t:\n        fobj = CallbackIOWrapper(t.update, file_obj, \"read\")\n        while True:\n            chunk = fobj.read(chunk_size)\n            if not chunk:\n                break\n        t.reset()\n        # ... continue to use `t` for something else\n\nAlternatively, use the even simpler ``wrapattr`` convenience function,\nwhich would condense both the ``urllib`` and ``CallbackIOWrapper`` examples\ndown to:\n\n.. code:: python\n\n    import urllib, os\n    from tqdm import tqdm\n\n    eg_link = \"https://caspersci.uk.to/matryoshka.zip\"\n    response = getattr(urllib, 'request', urllib).urlopen(eg_link)\n    with tqdm.wrapattr(open(os.devnull, \"wb\"), \"write\",\n                       miniters=1, desc=eg_link.split('/')[-1],\n                       total=getattr(response, 'length', None)) as fout:\n        for chunk in response:\n            fout.write(chunk)\n\nThe ``requests`` equivalent is nearly identical:\n\n.. code:: python\n\n    import requests, os\n    from tqdm import tqdm\n\n    eg_link = \"https://caspersci.uk.to/matryoshka.zip\"\n    response = requests.get(eg_link, stream=True)\n    with tqdm.wrapattr(open(os.devnull, \"wb\"), \"write\",\n                       miniters=1, desc=eg_link.split('/')[-1],\n                       total=int(response.headers.get('content-length', 0))) as fout:\n        for chunk in response.iter_content(chunk_size=4096):\n            fout.write(chunk)\n\n**Custom callback**\n\n``tqdm`` is known for intelligently skipping unnecessary displays. To make a\ncustom callback take advantage of this, simply use the return value of\n``update()``. This is set to ``True`` if a ``display()`` was triggered.\n\n.. code:: python\n\n    from tqdm.auto import tqdm as std_tqdm\n\n    def external_callback(*args, **kwargs):\n        ...\n\n    class TqdmExt(std_tqdm):\n        def update(self, n=1):\n            displayed = super().update(n)\n            if displayed:\n                external_callback(**self.format_dict)\n            return displayed\n\n``asyncio``\n~~~~~~~~~~~\n\nNote that ``break`` isn't currently caught by asynchronous iterators.\nThis means that ``tqdm`` cannot clean up after itself in this case:\n\n.. code:: python\n\n    from tqdm.asyncio import tqdm\n\n    async for i in tqdm(range(9)):\n        if i == 2:\n            break\n\nInstead, either call ``pbar.close()`` manually or use the context manager syntax:\n\n.. code:: python\n\n    from tqdm.asyncio import tqdm\n\n    with tqdm(range(9)) as pbar:\n        async for i in pbar:\n            if i == 2:\n                break\n\nPandas Integration\n~~~~~~~~~~~~~~~~~~\n\nDue to popular demand we've added support for ``pandas`` -- here's an example\nfor ``DataFrame.progress_apply`` and ``DataFrameGroupBy.progress_apply``:\n\n.. code:: python\n\n    import pandas as pd\n    import numpy as np\n    from tqdm import tqdm\n\n    df = pd.DataFrame(np.random.randint(0, 100, (100000, 6)))\n\n    # Register `pandas.progress_apply` and `pandas.Series.map_apply` with `tqdm`\n    # (can use `tqdm.gui.tqdm`, `tqdm.notebook.tqdm`, optional kwargs, etc.)\n    tqdm.pandas(desc=\"my bar!\")\n\n    # Now you can use `progress_apply` instead of `apply`\n    # and `progress_map` instead of `map`\n    df.progress_apply(lambda x: x**2)\n    # can also groupby:\n    # df.groupby(0).progress_apply(lambda x: x**2)\n\nIn case you're interested in how this works (and how to modify it for your\nown callbacks), see the\n`examples <https://github.com/tqdm/tqdm/tree/master/examples>`__\nfolder or import the module and run ``help()``.\n\nKeras Integration\n~~~~~~~~~~~~~~~~~\n\nA ``keras`` callback is also available:\n\n.. code:: python\n\n    from tqdm.keras import TqdmCallback\n\n    ...\n\n    model.fit(..., verbose=0, callbacks=[TqdmCallback()])\n\nDask Integration\n~~~~~~~~~~~~~~~~\n\nA ``dask`` callback is also available:\n\n.. code:: python\n\n    from tqdm.dask import TqdmCallback\n\n    with TqdmCallback(desc=\"compute\"):\n        ...\n        arr.compute()\n\n    # or use callback globally\n    cb = TqdmCallback(desc=\"global\")\n    cb.register()\n    arr.compute()\n\nIPython/Jupyter Integration\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIPython/Jupyter is supported via the ``tqdm.notebook`` submodule:\n\n.. code:: python\n\n    from tqdm.notebook import trange, tqdm\n    from time import sleep\n\n    for i in trange(3, desc='1st loop'):\n        for j in tqdm(range(100), desc='2nd loop'):\n            sleep(0.01)\n\nIn addition to ``tqdm`` features, the submodule provides a native Jupyter\nwidget (compatible with IPython v1-v4 and Jupyter), fully working nested bars\nand colour hints (blue: normal, green: completed, red: error/interrupt,\nlight blue: no ETA); as demonstrated below.\n\n|Screenshot-Jupyter1|\n|Screenshot-Jupyter2|\n|Screenshot-Jupyter3|\n\nThe ``notebook`` version supports percentage or pixels for overall width\n(e.g.: ``ncols='100%'`` or ``ncols='480px'``).\n\nIt is also possible to let ``tqdm`` automatically choose between\nconsole or notebook versions by using the ``autonotebook`` submodule:\n\n.. code:: python\n\n    from tqdm.autonotebook import tqdm\n    tqdm.pandas()\n\nNote that this will issue a ``TqdmExperimentalWarning`` if run in a notebook\nsince it is not meant to be possible to distinguish between ``jupyter notebook``\nand ``jupyter console``. Use ``auto`` instead of ``autonotebook`` to suppress\nthis warning.\n\nNote that notebooks will display the bar in the cell where it was created.\nThis may be a different cell from the one where it is used.\nIf this is not desired, either\n\n- delay the creation of the bar to the cell where it must be displayed, or\n- create the bar with ``display=False``, and in a later cell call\n  ``display(bar.container)``:\n\n.. code:: python\n\n    from tqdm.notebook import tqdm\n    pbar = tqdm(..., display=False)\n\n.. code:: python\n\n    # different cell\n    display(pbar.container)\n\nThe ``keras`` callback has a ``display()`` method which can be used likewise:\n\n.. code:: python\n\n    from tqdm.keras import TqdmCallback\n    cbk = TqdmCallback(display=False)\n\n.. code:: python\n\n    # different cell\n    cbk.display()\n    model.fit(..., verbose=0, callbacks=[cbk])\n\nAnother possibility is to have a single bar (near the top of the notebook)\nwhich is constantly re-used (using ``reset()`` rather than ``close()``).\nFor this reason, the notebook version (unlike the CLI version) does not\nautomatically call ``close()`` upon ``Exception``.\n\n.. code:: python\n\n    from tqdm.notebook import tqdm\n    pbar = tqdm()\n\n.. code:: python\n\n    # different cell\n    iterable = range(100)\n    pbar.reset(total=len(iterable))  # initialise with new `total`\n    for i in iterable:\n        pbar.update()\n    pbar.refresh()  # force print final status but don't `close()`\n\nCustom Integration\n~~~~~~~~~~~~~~~~~~\n\nTo change the default arguments (such as making ``dynamic_ncols=True``),\nsimply use built-in Python magic:\n\n.. code:: python\n\n    from functools import partial\n    from tqdm import tqdm as std_tqdm\n    tqdm = partial(std_tqdm, dynamic_ncols=True)\n\nFor further customisation,\n``tqdm`` may be inherited from to create custom callbacks (as with the\n``TqdmUpTo`` example `above <#hooks-and-callbacks>`__) or for custom frontends\n(e.g. GUIs such as notebook or plotting packages). In the latter case:\n\n1. ``def __init__()`` to call ``super().__init__(..., gui=True)`` to disable\n   terminal ``status_printer`` creation.\n2. Redefine: ``close()``, ``clear()``, ``display()``.\n\nConsider overloading ``display()`` to use e.g.\n``self.frontend(**self.format_dict)`` instead of ``self.sp(repr(self))``.\n\nSome submodule examples of inheritance:\n\n- `tqdm/notebook.py <https://github.com/tqdm/tqdm/blob/master/tqdm/notebook.py>`__\n- `tqdm/gui.py <https://github.com/tqdm/tqdm/blob/master/tqdm/gui.py>`__\n- `tqdm/tk.py <https://github.com/tqdm/tqdm/blob/master/tqdm/tk.py>`__\n- `tqdm/contrib/slack.py <https://github.com/tqdm/tqdm/blob/master/tqdm/contrib/slack.py>`__\n- `tqdm/contrib/discord.py <https://github.com/tqdm/tqdm/blob/master/tqdm/contrib/discord.py>`__\n- `tqdm/contrib/telegram.py <https://github.com/tqdm/tqdm/blob/master/tqdm/contrib/telegram.py>`__\n\nDynamic Monitor/Meter\n~~~~~~~~~~~~~~~~~~~~~\n\nYou can use a ``tqdm`` as a meter which is not monotonically increasing.\nThis could be because ``n`` decreases (e.g. a CPU usage monitor) or ``total``\nchanges.\n\nOne example would be recursively searching for files. The ``total`` is the\nnumber of objects found so far, while ``n`` is the number of those objects which\nare files (rather than folders):\n\n.. code:: python\n\n    from tqdm import tqdm\n    import os.path\n\n    def find_files_recursively(path, show_progress=True):\n        files = []\n        # total=1 assumes `path` is a file\n        t = tqdm(total=1, unit=\"file\", disable=not show_progress)\n        if not os.path.exists(path):\n            raise IOError(\"Cannot find:\" + path)\n\n        def append_found_file(f):\n            files.append(f)\n            t.update()\n\n        def list_found_dir(path):\n            \"\"\"returns os.listdir(path) assuming os.path.isdir(path)\"\"\"\n            listing = os.listdir(path)\n            # subtract 1 since a \"file\" we found was actually this directory\n            t.total += len(listing) - 1\n            # fancy way to give info without forcing a refresh\n            t.set_postfix(dir=path[-10:], refresh=False)\n            t.update(0)  # may trigger a refresh\n            return listing\n\n        def recursively_search(path):\n            if os.path.isdir(path):\n                for f in list_found_dir(path):\n                    recursively_search(os.path.join(path, f))\n            else:\n                append_found_file(path)\n\n        recursively_search(path)\n        t.set_postfix(dir=path)\n        t.close()\n        return files\n\nUsing ``update(0)`` is a handy way to let ``tqdm`` decide when to trigger a\ndisplay refresh to avoid console spamming.\n\nWriting messages\n~~~~~~~~~~~~~~~~\n\nThis is a work in progress (see\n`#737 <https://github.com/tqdm/tqdm/issues/737>`__).\n\nSince ``tqdm`` uses a simple printing mechanism to display progress bars,\nyou should not write any message in the terminal using ``print()`` while\na progressbar is open.\n\nTo write messages in the terminal without any collision with ``tqdm`` bar\ndisplay, a ``.write()`` method is provided:\n\n.. code:: python\n\n    from tqdm.auto import tqdm, trange\n    from time import sleep\n\n    bar = trange(10)\n    for i in bar:\n        # Print using tqdm class method .write()\n        sleep(0.1)\n        if not (i % 3):\n            tqdm.write(\"Done task %i\" % i)\n        # Can also use bar.write()\n\nBy default, this will print to standard output ``sys.stdout``. but you can\nspecify any file-like object using the ``file`` argument. For example, this\ncan be used to redirect the messages writing to a log file or class.\n\nRedirecting writing\n~~~~~~~~~~~~~~~~~~~\n\nIf using a library that can print messages to the console, editing the library\nby  replacing ``print()`` with ``tqdm.write()`` may not be desirable.\nIn that case, redirecting ``sys.stdout`` to ``tqdm.write()`` is an option.\n\nTo redirect ``sys.stdout``, create a file-like class that will write\nany input string to ``tqdm.write()``, and supply the arguments\n``file=sys.stdout, dynamic_ncols=True``.\n\nA reusable canonical example is given below:\n\n.. code:: python\n\n    from time import sleep\n    import contextlib\n    import sys\n    from tqdm import tqdm\n    from tqdm.contrib import DummyTqdmFile\n\n\n    @contextlib.contextmanager\n    def std_out_err_redirect_tqdm():\n        orig_out_err = sys.stdout, sys.stderr\n        try:\n            sys.stdout, sys.stderr = map(DummyTqdmFile, orig_out_err)\n            yield orig_out_err[0]\n        # Relay exceptions\n        except Exception as exc:\n            raise exc\n        # Always restore sys.stdout/err if necessary\n        finally:\n            sys.stdout, sys.stderr = orig_out_err\n\n    def some_fun(i):\n        print(\"Fee, fi, fo,\".split()[i])\n\n    # Redirect stdout to tqdm.write() (don't forget the `as save_stdout`)\n    with std_out_err_redirect_tqdm() as orig_stdout:\n        # tqdm needs the original stdout\n        # and dynamic_ncols=True to autodetect console width\n        for i in tqdm(range(3), file=orig_stdout, dynamic_ncols=True):\n            sleep(.5)\n            some_fun(i)\n\n    # After the `with`, printing is restored\n    print(\"Done!\")\n\nRedirecting ``logging``\n~~~~~~~~~~~~~~~~~~~~~~~\n\nSimilar to ``sys.stdout``/``sys.stderr`` as detailed above, console ``logging``\nmay also be redirected to ``tqdm.write()``.\n\nWarning: if also redirecting ``sys.stdout``/``sys.stderr``, make sure to\nredirect ``logging`` first if needed.\n\nHelper methods are available in ``tqdm.contrib.logging``. For example:\n\n.. code:: python\n\n    import logging\n    from tqdm import trange\n    from tqdm.contrib.logging import logging_redirect_tqdm\n\n    LOG = logging.getLogger(__name__)\n\n    if __name__ == '__main__':\n        logging.basicConfig(level=logging.INFO)\n        with logging_redirect_tqdm():\n            for i in trange(9):\n                if i == 4:\n                    LOG.info(\"console logging redirected to `tqdm.write()`\")\n        # logging restored\n\nMonitoring thread, intervals and miniters\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n``tqdm`` implements a few tricks to increase efficiency and reduce overhead.\n\n- Avoid unnecessary frequent bar refreshing: ``mininterval`` defines how long\n  to wait between each refresh. ``tqdm`` always gets updated in the background,\n  but it will display only every ``mininterval``.\n- Reduce number of calls to check system clock/time.\n- ``mininterval`` is more intuitive to configure than ``miniters``.\n  A clever adjustment system ``dynamic_miniters`` will automatically adjust\n  ``miniters`` to the amount of iterations that fit into time ``mininterval``.\n  Essentially, ``tqdm`` will check if it's time to print without actually\n  checking time. This behaviour can be still be bypassed by manually setting\n  ``miniters``.\n\nHowever, consider a case with a combination of fast and slow iterations.\nAfter a few fast iterations, ``dynamic_miniters`` will set ``miniters`` to a\nlarge number. When iteration rate subsequently slows, ``miniters`` will\nremain large and thus reduce display update frequency. To address this:\n\n- ``maxinterval`` defines the maximum time between display refreshes.\n  A concurrent monitoring thread checks for overdue updates and forces one\n  where necessary.\n\nThe monitoring thread should not have a noticeable overhead, and guarantees\nupdates at least every 10 seconds by default.\nThis value can be directly changed by setting the ``monitor_interval`` of\nany ``tqdm`` instance (i.e. ``t = tqdm.tqdm(...); t.monitor_interval = 2``).\nThe monitor thread may be disabled application-wide by setting\n``tqdm.tqdm.monitor_interval = 0`` before instantiation of any ``tqdm`` bar.\n\n\nMerch\n-----\n\nYou can buy `tqdm branded merch <https://tqdm.github.io/merch>`__ now!\n\nContributions\n-------------\n\n|GitHub-Commits| |GitHub-Issues| |GitHub-PRs| |OpenHub-Status| |GitHub-Contributions| |CII Best Practices|\n\nAll source code is hosted on `GitHub <https://github.com/tqdm/tqdm>`__.\nContributions are welcome.\n\nSee the\n`CONTRIBUTING <https://github.com/tqdm/tqdm/blob/master/CONTRIBUTING.md>`__\nfile for more information.\n\nDevelopers who have made significant contributions, ranked by *SLoC*\n(surviving lines of code,\n`git fame <https://github.com/casperdcl/git-fame>`__ ``-wMC --excl '\\.(png|gif|jpg)$'``),\nare:\n\n==================== ======================================================== ==== ================================\nName                 ID                                                       SLoC Notes\n==================== ======================================================== ==== ================================\nCasper da Costa-Luis `casperdcl <https://github.com/casperdcl>`__             ~80% primary maintainer |Gift-Casper|\nStephen Larroque     `lrq3000 <https://github.com/lrq3000>`__                 ~9%  team member\nMartin Zugnoni       `martinzugnoni <https://github.com/martinzugnoni>`__     ~3%\nDaniel Ecer          `de-code <https://github.com/de-code>`__                 ~2%\nRichard Sheridan     `richardsheridan <https://github.com/richardsheridan>`__ ~1%\nGuangshuo Chen       `chengs <https://github.com/chengs>`__                   ~1%\nHelio Machado        `0x2b3bfa0 <https://github.com/0x2b3bfa0>`__             ~1%\nKyle Altendorf       `altendky <https://github.com/altendky>`__               <1%\nNoam Yorav-Raphael   `noamraph <https://github.com/noamraph>`__               <1%  original author\nMatthew Stevens      `mjstevens777 <https://github.com/mjstevens777>`__       <1%\nHadrien Mary         `hadim <https://github.com/hadim>`__                     <1%  team member\nMikhail Korobov      `kmike <https://github.com/kmike>`__                     <1%  team member\n==================== ======================================================== ==== ================================\n\nPorts to Other Languages\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nA list is available on\n`this wiki page <https://github.com/tqdm/tqdm/wiki/tqdm-ports>`__.\n\n\nLICENCE\n-------\n\nOpen Source (OSI approved): |LICENCE|\n\nCitation information: |DOI|\n\n|README-Hits| (Since 19 May 2016)\n\n.. |Logo| image:: https://tqdm.github.io/img/logo.gif\n.. |Screenshot| image:: https://tqdm.github.io/img/tqdm.gif\n.. |Video| image:: https://tqdm.github.io/img/video.jpg\n   :target: https://tqdm.github.io/video\n.. |Slides| image:: https://tqdm.github.io/img/slides.jpg\n   :target: https://tqdm.github.io/PyData2019/slides.html\n.. |Merch| image:: https://tqdm.github.io/img/merch.jpg\n   :target: https://tqdm.github.io/merch\n.. |Build-Status| image:: https://img.shields.io/github/actions/workflow/status/tqdm/tqdm/test.yml?branch=master&label=tqdm&logo=GitHub\n   :target: https://github.com/tqdm/tqdm/actions/workflows/test.yml\n.. |Coverage-Status| image:: https://img.shields.io/coveralls/github/tqdm/tqdm/master?logo=coveralls\n   :target: https://coveralls.io/github/tqdm/tqdm\n.. |Branch-Coverage-Status| image:: https://codecov.io/gh/tqdm/tqdm/branch/master/graph/badge.svg\n   :target: https://codecov.io/gh/tqdm/tqdm\n.. |Codacy-Grade| image:: https://app.codacy.com/project/badge/Grade/3f965571598f44549c7818f29cdcf177\n   :target: https://www.codacy.com/gh/tqdm/tqdm/dashboard\n.. |CII Best Practices| image:: https://bestpractices.coreinfrastructure.org/projects/3264/badge\n   :target: https://bestpractices.coreinfrastructure.org/projects/3264\n.. |GitHub-Status| image:: https://img.shields.io/github/tag/tqdm/tqdm.svg?maxAge=86400&logo=github&logoColor=white\n   :target: https://github.com/tqdm/tqdm/releases\n.. |GitHub-Forks| image:: https://img.shields.io/github/forks/tqdm/tqdm.svg?logo=github&logoColor=white\n   :target: https://github.com/tqdm/tqdm/network\n.. |GitHub-Stars| image:: https://img.shields.io/github/stars/tqdm/tqdm.svg?logo=github&logoColor=white\n   :target: https://github.com/tqdm/tqdm/stargazers\n.. |GitHub-Commits| image:: https://img.shields.io/github/commit-activity/y/tqdm/tqdm.svg?logo=git&logoColor=white\n   :target: https://github.com/tqdm/tqdm/graphs/commit-activity\n.. |GitHub-Issues| image:: https://img.shields.io/github/issues-closed/tqdm/tqdm.svg?logo=github&logoColor=white\n   :target: https://github.com/tqdm/tqdm/issues?q=\n.. |GitHub-PRs| image:: https://img.shields.io/github/issues-pr-closed/tqdm/tqdm.svg?logo=github&logoColor=white\n   :target: https://github.com/tqdm/tqdm/pulls\n.. |GitHub-Contributions| image:: https://img.shields.io/github/contributors/tqdm/tqdm.svg?logo=github&logoColor=white\n   :target: https://github.com/tqdm/tqdm/graphs/contributors\n.. |GitHub-Updated| image:: https://img.shields.io/github/last-commit/tqdm/tqdm/master.svg?logo=github&logoColor=white&label=pushed\n   :target: https://github.com/tqdm/tqdm/pulse\n.. |Gift-Casper| image:: https://img.shields.io/badge/dynamic/json.svg?color=ff69b4&label=gifts%20received&prefix=%C2%A3&query=%24..sum&url=https%3A%2F%2Fcaspersci.uk.to%2Fgifts.json\n   :target: https://cdcl.ml/sponsor\n.. |Versions| image:: https://img.shields.io/pypi/v/tqdm.svg\n   :target: https://tqdm.github.io/releases\n.. |PyPI-Downloads| image:: https://img.shields.io/pypi/dm/tqdm.svg?label=pypi%20downloads&logo=PyPI&logoColor=white\n   :target: https://pepy.tech/project/tqdm\n.. |Py-Versions| image:: https://img.shields.io/pypi/pyversions/tqdm.svg?logo=python&logoColor=white\n   :target: https://pypi.org/project/tqdm\n.. |Conda-Forge-Status| image:: https://img.shields.io/conda/v/conda-forge/tqdm.svg?label=conda-forge&logo=conda-forge\n   :target: https://anaconda.org/conda-forge/tqdm\n.. |Snapcraft| image:: https://img.shields.io/badge/snap-install-82BEA0.svg?logo=snapcraft\n   :target: https://snapcraft.io/tqdm\n.. |Docker| image:: https://img.shields.io/badge/docker-pull-blue.svg?logo=docker&logoColor=white\n   :target: https://hub.docker.com/r/tqdm/tqdm\n.. |Libraries-Rank| image:: https://img.shields.io/librariesio/sourcerank/pypi/tqdm.svg?logo=koding&logoColor=white\n   :target: https://libraries.io/pypi/tqdm\n.. |Libraries-Dependents| image:: https://img.shields.io/librariesio/dependent-repos/pypi/tqdm.svg?logo=koding&logoColor=white\n    :target: https://github.com/tqdm/tqdm/network/dependents\n.. |OpenHub-Status| image:: https://www.openhub.net/p/tqdm/widgets/project_thin_badge?format=gif\n   :target: https://www.openhub.net/p/tqdm?ref=Thin+badge\n.. |awesome-python| image:: https://awesome.re/mentioned-badge.svg\n   :target: https://github.com/vinta/awesome-python\n.. |LICENCE| image:: https://img.shields.io/pypi/l/tqdm.svg\n   :target: https://raw.githubusercontent.com/tqdm/tqdm/master/LICENCE\n.. |DOI| image:: https://img.shields.io/badge/DOI-10.5281/zenodo.595120-blue.svg\n   :target: https://doi.org/10.5281/zenodo.595120\n.. |binder-demo| image:: https://mybinder.org/badge_logo.svg\n   :target: https://mybinder.org/v2/gh/tqdm/tqdm/master?filepath=DEMO.ipynb\n.. |Screenshot-Jupyter1| image:: https://tqdm.github.io/img/jupyter-1.gif\n.. |Screenshot-Jupyter2| image:: https://tqdm.github.io/img/jupyter-2.gif\n.. |Screenshot-Jupyter3| image:: https://tqdm.github.io/img/jupyter-3.gif\n.. |README-Hits| image:: https://cgi.cdcl.ml/hits?q=tqdm&style=social&r=https://github.com/tqdm/tqdm&l=https://tqdm.github.io/img/favicon.png&f=https://tqdm.github.io/img/logo.gif\n   :target: https://cgi.cdcl.ml/hits?q=tqdm&a=plot&r=https://github.com/tqdm/tqdm&l=https://tqdm.github.io/img/favicon.png&f=https://tqdm.github.io/img/logo.gif&style=social\n",
        "description_content_type": "text/x-rst",
        "keywords": [
          "progressbar",
          "progressmeter",
          "progress",
          "bar",
          "meter",
          "rate",
          "eta",
          "console",
          "terminal",
          "time"
        ],
        "maintainer_email": "tqdm developers <devs@tqdm.ml>",
        "license": "MPL-2.0 AND MIT",
        "license_file": [
          "LICENCE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Environment :: Console",
          "Environment :: MacOS X",
          "Environment :: Other Environment",
          "Environment :: Win32 (MS Windows)",
          "Environment :: X11 Applications",
          "Framework :: IPython",
          "Framework :: Jupyter",
          "Intended Audience :: Developers",
          "Intended Audience :: Education",
          "Intended Audience :: End Users/Desktop",
          "Intended Audience :: Other Audience",
          "Intended Audience :: System Administrators",
          "Operating System :: MacOS",
          "Operating System :: MacOS :: MacOS X",
          "Operating System :: Microsoft",
          "Operating System :: Microsoft :: MS-DOS",
          "Operating System :: Microsoft :: Windows",
          "Operating System :: POSIX",
          "Operating System :: POSIX :: BSD",
          "Operating System :: POSIX :: BSD :: FreeBSD",
          "Operating System :: POSIX :: Linux",
          "Operating System :: POSIX :: SunOS/Solaris",
          "Operating System :: Unix",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.7",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: Implementation",
          "Programming Language :: Python :: Implementation :: IronPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Programming Language :: Unix Shell",
          "Topic :: Desktop Environment",
          "Topic :: Education :: Computer Aided Instruction (CAI)",
          "Topic :: Education :: Testing",
          "Topic :: Office/Business",
          "Topic :: Other/Nonlisted Topic",
          "Topic :: Software Development :: Build Tools",
          "Topic :: Software Development :: Libraries",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Topic :: Software Development :: Pre-processors",
          "Topic :: Software Development :: User Interfaces",
          "Topic :: System :: Installation/Setup",
          "Topic :: System :: Logging",
          "Topic :: System :: Monitoring",
          "Topic :: System :: Shells",
          "Topic :: Terminals",
          "Topic :: Utilities"
        ],
        "requires_dist": [
          "colorama; platform_system == \"Windows\"",
          "importlib_metadata; python_version < \"3.8\"",
          "pytest>=6; extra == \"dev\"",
          "pytest-cov; extra == \"dev\"",
          "pytest-timeout; extra == \"dev\"",
          "pytest-asyncio>=0.24; extra == \"dev\"",
          "nbval; extra == \"dev\"",
          "requests; extra == \"discord\"",
          "slack-sdk; extra == \"slack\"",
          "requests; extra == \"telegram\"",
          "ipywidgets>=6; extra == \"notebook\""
        ],
        "requires_python": ">=3.7",
        "project_url": [
          "homepage, https://tqdm.github.io",
          "repository, https://github.com/tqdm/tqdm",
          "changelog, https://tqdm.github.io/releases",
          "wiki, https://github.com/tqdm/tqdm/wiki"
        ],
        "provides_extra": [
          "dev",
          "discord",
          "slack",
          "telegram",
          "notebook"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/tqdm-4.67.3.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "urllib3",
        "version": "2.7.0",
        "summary": "HTTP library with thread-safe connection pooling, file post, and more.",
        "description": "<h1 align=\"center\">\n\n![urllib3](https://github.com/urllib3/urllib3/raw/main/docs/_static/banner_github.svg)\n\n</h1>\n\n<p align=\"center\">\n  <a href=\"https://pypi.org/project/urllib3\"><img alt=\"PyPI Version\" src=\"https://img.shields.io/pypi/v/urllib3.svg?maxAge=86400\" /></a>\n  <a href=\"https://pypi.org/project/urllib3\"><img alt=\"Python Versions\" src=\"https://img.shields.io/pypi/pyversions/urllib3.svg?maxAge=86400\" /></a>\n  <a href=\"https://discord.gg/urllib3\"><img alt=\"Join our Discord\" src=\"https://img.shields.io/discord/756342717725933608?color=%237289da&label=discord\" /></a>\n  <a href=\"https://github.com/urllib3/urllib3/actions?query=workflow%3ACI\"><img alt=\"Coverage Status\" src=\"https://img.shields.io/badge/coverage-100%25-success\" /></a>\n  <a href=\"https://github.com/urllib3/urllib3/actions/workflows/ci.yml?query=branch%3Amain\"><img alt=\"Build Status on GitHub\" src=\"https://github.com/urllib3/urllib3/actions/workflows/ci.yml/badge.svg?branch:main&workflow:CI\" /></a>\n  <a href=\"https://urllib3.readthedocs.io\"><img alt=\"Documentation Status\" src=\"https://readthedocs.org/projects/urllib3/badge/?version=latest\" /></a><br>\n  <a href=\"https://deps.dev/pypi/urllib3\"><img alt=\"OpenSSF Scorecard\" src=\"https://api.securityscorecards.dev/projects/github.com/urllib3/urllib3/badge\" /></a>\n  <a href=\"https://slsa.dev\"><img alt=\"SLSA 3\" src=\"https://slsa.dev/images/gh-badge-level3.svg\" /></a>\n  <a href=\"https://bestpractices.coreinfrastructure.org/projects/6227\"><img alt=\"CII Best Practices\" src=\"https://bestpractices.coreinfrastructure.org/projects/6227/badge\" /></a>\n</p>\n\nurllib3 is a powerful, *user-friendly* HTTP client for Python.\nurllib3 brings many critical features that are missing from the Python\nstandard libraries:\n\n- Thread safety.\n- Connection pooling.\n- Client-side SSL/TLS verification.\n- File uploads with multipart encoding.\n- Helpers for retrying requests and dealing with HTTP redirects.\n- Support for gzip, deflate, brotli, and zstd encoding.\n- Proxy support for HTTP and SOCKS.\n- 100% test coverage.\n\n... and many more features, but most importantly: Our maintainers have a 15+\nyear track record of maintaining urllib3 with the highest code standards and\nattention to security and safety.\n\n[Much of the Python ecosystem already uses urllib3](https://urllib3.readthedocs.io/en/stable/#who-uses)\nand you should too.\n\n\n## Installing\n\nurllib3 can be installed with [pip](https://pip.pypa.io):\n\n```bash\n$ python -m pip install urllib3\n```\n\nAlternatively, you can grab the latest source code from [GitHub](https://github.com/urllib3/urllib3):\n\n```bash\n$ git clone https://github.com/urllib3/urllib3.git\n$ cd urllib3\n$ pip install .\n```\n\n## Getting Started\n\nurllib3 is easy to use:\n\n```python3\n>>> import urllib3\n>>> resp = urllib3.request(\"GET\", \"http://httpbin.org/robots.txt\")\n>>> resp.status\n200\n>>> resp.data\nb\"User-agent: *\\nDisallow: /deny\\n\"\n```\n\nurllib3 has usage and reference documentation at [urllib3.readthedocs.io](https://urllib3.readthedocs.io).\n\n\n## Community\n\nurllib3 has a [community Discord channel](https://discord.gg/urllib3) for asking questions and\ncollaborating with other contributors. Drop by and say hello 👋\n\n\n## Contributing\n\nurllib3 happily accepts contributions. Please see our\n[contributing documentation](https://urllib3.readthedocs.io/en/latest/contributing.html)\nfor some tips on getting started.\n\n\n## Security Disclosures\n\nTo report a security vulnerability, please use the\n[Tidelift security contact](https://tidelift.com/security).\nTidelift will coordinate the fix and disclosure with maintainers.\n\n\n## Maintainers\n\nMeet our maintainers since 2008:\n\n- Current Lead: [@illia-v](https://github.com/illia-v) (Illia Volochii)\n- [@sethmlarson](https://github.com/sethmlarson) (Seth M. Larson)\n- [@pquentin](https://github.com/pquentin) (Quentin Pradet)\n- [@theacodes](https://github.com/theacodes) (Thea Flowers)\n- [@haikuginger](https://github.com/haikuginger) (Jess Shapiro)\n- [@lukasa](https://github.com/lukasa) (Cory Benfield)\n- [@sigmavirus24](https://github.com/sigmavirus24) (Ian Stapleton Cordasco)\n- [@shazow](https://github.com/shazow) (Andrey Petrov)\n\n👋\n\n\n## Sponsorship\n\nIf your company benefits from this library, please consider [sponsoring its\ndevelopment](https://urllib3.readthedocs.io/en/latest/sponsors.html).\n\n\n## For Enterprise\n\nProfessional support for urllib3 is available as part of the [Tidelift\nSubscription][1]. Tidelift gives software development teams a single source for\npurchasing and maintaining their software, with professional grade assurances\nfrom the experts who know it best, while seamlessly integrating with existing\ntools.\n\n[1]: https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=readme\n",
        "description_content_type": "text/markdown",
        "keywords": [
          "filepost",
          "http",
          "httplib",
          "https",
          "pooling",
          "ssl",
          "threadsafe",
          "urllib"
        ],
        "author_email": "Andrey Petrov <andrey.petrov@shazow.net>",
        "maintainer_email": "Seth Michael Larson <sethmichaellarson@gmail.com>, Quentin Pradet <quentin@pradet.me>, Illia Volochii <illia.volochii@gmail.com>",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE.txt"
        ],
        "classifier": [
          "Environment :: Web Environment",
          "Intended Audience :: Developers",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Free Threading :: 2 - Beta",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: Internet :: WWW/HTTP",
          "Topic :: Software Development :: Libraries"
        ],
        "requires_dist": [
          "brotli>=1.2.0; (platform_python_implementation == 'CPython') and extra == 'brotli'",
          "brotlicffi>=1.2.0.0; (platform_python_implementation != 'CPython') and extra == 'brotli'",
          "h2<5,>=4; extra == 'h2'",
          "pysocks!=1.5.7,<2.0,>=1.5.6; extra == 'socks'",
          "backports-zstd>=1.0.0; (python_version < '3.14') and extra == 'zstd'"
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Changelog, https://github.com/urllib3/urllib3/blob/main/CHANGES.rst",
          "Documentation, https://urllib3.readthedocs.io",
          "Code, https://github.com/urllib3/urllib3",
          "Issue tracker, https://github.com/urllib3/urllib3/issues"
        ],
        "provides_extra": [
          "brotli",
          "h2",
          "socks",
          "zstd"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/urllib3-2.7.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "PyJWT",
        "version": "2.13.0",
        "dynamic": [
          "license-file"
        ],
        "summary": "JSON Web Token implementation in Python",
        "description": "PyJWT\n=====\n\n.. image:: https://github.com/jpadilla/pyjwt/workflows/CI/badge.svg\n   :target: https://github.com/jpadilla/pyjwt/actions?query=workflow%3ACI\n\n.. image:: https://img.shields.io/pypi/v/pyjwt.svg\n   :target: https://pypi.python.org/pypi/pyjwt\n\n.. image:: https://codecov.io/gh/jpadilla/pyjwt/branch/master/graph/badge.svg\n   :target: https://codecov.io/gh/jpadilla/pyjwt\n\n.. image:: https://readthedocs.org/projects/pyjwt/badge/?version=stable\n   :target: https://pyjwt.readthedocs.io/en/stable/\n\nA Python implementation of `RFC 7519 <https://tools.ietf.org/html/rfc7519>`_. Original implementation was written by `@progrium <https://github.com/progrium>`_.\n\nSponsor\n-------\n\n.. |auth0-logo| image:: https://github.com/user-attachments/assets/ee98379e-ee76-4bcb-943a-e25c4ea6d174\n   :width: 160px\n\n+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n| |auth0-logo| | If you want to quickly add secure token-based authentication to Python projects, feel free to check Auth0's Python SDK and free plan at `auth0.com/signup <https://auth0.com/signup?utm_source=external_sites&utm_medium=pyjwt&utm_campaign=devn_signup>`_. |\n+--------------+-----------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n\nInstalling\n----------\n\nInstall with **pip**:\n\n.. code-block:: console\n\n    $ pip install PyJWT\n\n\nUsage\n-----\n\n.. code-block:: pycon\n\n    >>> import jwt\n    >>> encoded = jwt.encode({\"some\": \"payload\"}, \"secret\", algorithm=\"HS256\")\n    >>> print(encoded)\n    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg\n    >>> jwt.decode(encoded, \"secret\", algorithms=[\"HS256\"])\n    {'some': 'payload'}\n\nDocumentation\n-------------\n\nView the full docs online at https://pyjwt.readthedocs.io/en/stable/\n\n\nTests\n-----\n\nYou can run tests from the project root after cloning with:\n\n.. code-block:: console\n\n    $ tox\n",
        "description_content_type": "text/x-rst",
        "keywords": [
          "json",
          "jwt",
          "security",
          "signing",
          "token",
          "web"
        ],
        "author_email": "Jose Padilla <hello@jpadilla.com>",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE",
          "AUTHORS.rst"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "Natural Language :: English",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Topic :: Utilities"
        ],
        "requires_dist": [
          "typing_extensions>=4.0; python_version < \"3.11\"",
          "cryptography>=3.4.0; extra == \"crypto\""
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Homepage, https://github.com/jpadilla/pyjwt"
        ],
        "provides_extra": [
          "crypto"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/pyjwt-2.13.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "yarl",
        "version": "1.24.2",
        "dynamic": [
          "license-file"
        ],
        "summary": "Yet another URL library",
        "description": "yarl\n====\n\nThe module provides handy URL class for URL parsing and changing.\n\n.. image:: https://github.com/aio-libs/yarl/workflows/CI/badge.svg\n   :target: https://github.com/aio-libs/yarl/actions?query=workflow%3ACI\n   :align: right\n\n.. image:: https://codecov.io/gh/aio-libs/yarl/graph/badge.svg?flag=pytest\n   :target: https://app.codecov.io/gh/aio-libs/yarl?flags[]=pytest\n   :alt: Codecov coverage for the pytest-driven measurements\n\n.. image:: https://img.shields.io/endpoint?url=https://codspeed.io/badge.json\n   :target: https://codspeed.io/aio-libs/yarl\n\n.. image:: https://badge.fury.io/py/yarl.svg\n   :target: https://badge.fury.io/py/yarl\n\n.. image:: https://readthedocs.org/projects/yarl/badge/?version=latest\n   :target: https://yarl.aio-libs.org\n\n.. image:: https://img.shields.io/pypi/pyversions/yarl.svg\n   :target: https://pypi.python.org/pypi/yarl\n\n.. image:: https://img.shields.io/matrix/aio-libs:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat\n   :target: https://matrix.to/#/%23aio-libs:matrix.org\n   :alt: Matrix Room — #aio-libs:matrix.org\n\n.. image:: https://img.shields.io/matrix/aio-libs-space:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs-space%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat\n   :target: https://matrix.to/#/%23aio-libs-space:matrix.org\n   :alt: Matrix Space — #aio-libs-space:matrix.org\n\n\nIntroduction\n------------\n\nUrl is constructed from ``str``:\n\n.. code-block:: pycon\n\n   >>> from yarl import URL\n   >>> url = URL('https://www.python.org/~guido?arg=1#frag')\n   >>> url\n   URL('https://www.python.org/~guido?arg=1#frag')\n\nAll url parts: *scheme*, *user*, *password*, *host*, *port*, *path*,\n*query* and *fragment* are accessible by properties:\n\n.. code-block:: pycon\n\n   >>> url.scheme\n   'https'\n   >>> url.host\n   'www.python.org'\n   >>> url.path\n   '/~guido'\n   >>> url.query_string\n   'arg=1'\n   >>> url.query\n   <MultiDictProxy('arg': '1')>\n   >>> url.fragment\n   'frag'\n\nAll url manipulations produce a new url object:\n\n.. code-block:: pycon\n\n   >>> url = URL('https://www.python.org')\n   >>> url / 'foo' / 'bar'\n   URL('https://www.python.org/foo/bar')\n   >>> url / 'foo' % {'bar': 'baz'}\n   URL('https://www.python.org/foo?bar=baz')\n\nStrings passed to constructor and modification methods are\nautomatically encoded giving canonical representation as result:\n\n.. code-block:: pycon\n\n   >>> url = URL('https://www.python.org/шлях')\n   >>> url\n   URL('https://www.python.org/%D1%88%D0%BB%D1%8F%D1%85')\n\nRegular properties are *percent-decoded*, use ``raw_`` versions for\ngetting *encoded* strings:\n\n.. code-block:: pycon\n\n   >>> url.path\n   '/шлях'\n\n   >>> url.raw_path\n   '/%D1%88%D0%BB%D1%8F%D1%85'\n\nHuman readable representation of URL is available as ``.human_repr()``:\n\n.. code-block:: pycon\n\n   >>> url.human_repr()\n   'https://www.python.org/шлях'\n\nFor full documentation please read https://yarl.aio-libs.org.\n\n\nInstallation\n------------\n\n::\n\n   $ pip install yarl\n\nThe library is Python 3 only!\n\nPyPI contains binary wheels for Linux, Windows and MacOS.  If you want to install\n``yarl`` on another operating system where wheels are not provided,\nthe tarball will be used to compile the library from\nthe source code. It requires a C compiler and and Python headers installed.\n\nTo skip the compilation you must explicitly opt-in by using a PEP 517\nconfiguration setting ``pure-python``, or setting the ``YARL_NO_EXTENSIONS``\nenvironment variable to a non-empty value, e.g.:\n\n.. code-block:: console\n\n   $ pip install yarl --config-settings=pure-python=false\n\nPlease note that the pure-Python (uncompiled) version is much slower. However,\nPyPy always uses a pure-Python implementation, and, as such, it is unaffected\nby this variable.\n\nDependencies\n------------\n\nYARL requires multidict_ and propcache_ libraries.\n\n\nAPI documentation\n------------------\n\nThe documentation is located at https://yarl.aio-libs.org.\n\n\nWhy isn't boolean supported by the URL query API?\n-------------------------------------------------\n\nThere is no standard for boolean representation of boolean values.\n\nSome systems prefer ``true``/``false``, others like ``yes``/``no``, ``on``/``off``,\n``Y``/``N``, ``1``/``0``, etc.\n\n``yarl`` cannot make an unambiguous decision on how to serialize ``bool`` values because\nit is specific to how the end-user's application is built and would be different for\ndifferent apps.  The library doesn't accept booleans in the API; a user should convert\nbools into strings using own preferred translation protocol.\n\n\nComparison with other URL libraries\n------------------------------------\n\n* furl (https://pypi.python.org/pypi/furl)\n\n  The library has rich functionality but the ``furl`` object is mutable.\n\n  I'm afraid to pass this object into foreign code: who knows if the\n  code will modify my url in a terrible way while I just want to send URL\n  with handy helpers for accessing URL properties.\n\n  ``furl`` has other non-obvious tricky things but the main objection\n  is mutability.\n\n* URLObject (https://pypi.python.org/pypi/URLObject)\n\n  URLObject is immutable, that's pretty good.\n\n  Every URL change generates a new URL object.\n\n  But the library doesn't do any decode/encode transformations leaving the\n  end user to cope with these gory details.\n\n\nSource code\n-----------\n\nThe project is hosted on GitHub_\n\nPlease file an issue on the `bug tracker\n<https://github.com/aio-libs/yarl/issues>`_ if you have found a bug\nor have some suggestion in order to improve the library.\n\nDiscussion list\n---------------\n\n*aio-libs* google group: https://groups.google.com/forum/#!forum/aio-libs\n\nFeel free to post your questions and ideas here.\n\n\nAuthors and License\n-------------------\n\nThe ``yarl`` package is written by Andrew Svetlov.\n\nIt's *Apache 2* licensed and freely available.\n\n\n.. _GitHub: https://github.com/aio-libs/yarl\n\n.. _multidict: https://github.com/aio-libs/multidict\n\n.. _propcache: https://github.com/aio-libs/propcache\n\n=========\nChangelog\n=========\n\n..\n    You should *NOT* be adding new change log entries to this file, this\n    file is managed by towncrier. You *may* edit previous change logs to\n    fix problems like typo corrections or such.\n    To add a new change log entry, please see\n    https://pip.pypa.io/en/latest/development/#adding-a-news-entry\n    we named the news folder \"changes\".\n\n    WARNING: Don't drop the next directive!\n\n.. towncrier release notes start\n\nv1.24.2\n=======\n\n*(2026-05-19)*\n\n\nContributor-facing changes\n--------------------------\n\n- Switched the aarch64 and armv7l wheel builds to GitHub's native ARM\n  runners. The aarch64 wheels now build without QEMU emulation, and\n  armv7l runs on aarch64 hosts so its 32-bit ARM execution is far\n  cheaper than the previous aarch64-on-x86_64 path\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1724 <https://github.com/aio-libs/yarl/issues/1724>`__.\n\n- Restored per-runner native arches in the Windows wheel matrix on tag\n  releases. The previous ``CIBW_ARCHS_WINDOWS=AMD64 ARM64`` setting made\n  both ``windows-latest`` and ``windows-11-arm`` cross-compile the other\n  arch, producing two artifacts with identically-named wheels whose\n  bytes differed; the deploy job's ``download-artifact ... merge-multiple``\n  step tore those writes together, yielding a wheel that PyPI rejected\n  with ``400 Invalid distribution file. ZIP archive not accepted:\n  Mis-matched data size`` during the 1.24.0 and 1.24.1 releases\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1725 <https://github.com/aio-libs/yarl/issues/1725>`__.\n\n\n----\n\n\nv1.24.1\n=======\n\n*(2026-05-19)*\n\n\nContributor-facing changes\n--------------------------\n\n- Allowed re-running the deploy job after a partial release failure: the\n  ``Make Release`` step now skips when the GitHub Release already exists,\n  and the PyPI publish step uses ``skip-existing`` so dists that were\n  already uploaded on a prior attempt do not break the retry\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1721 <https://github.com/aio-libs/yarl/issues/1721>`__.\n\n\n----\n\n\nv1.24.0\n=======\n\n*(2026-05-19)*\n\n\nBug fixes\n---------\n\n- Delayed importing pydantic until it's needed to avoid increased import time -- by `@Dreamsorcerer <https://github.com/sponsors/Dreamsorcerer>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1607 <https://github.com/aio-libs/yarl/issues/1607>`__, `#1702 <https://github.com/aio-libs/yarl/issues/1702>`__.\n\n- Fixed pickling of ``~yarl.URL`` on Python 3.15, where ``SplitResult``\n  gained a ``__getstate__`` that requires attributes set by ``__init__``.\n  ``__getstate__`` now returns the raw 5-tuple instead of a ``SplitResult``\n  built via ``tuple.__new__``, so pickling no longer touches ``SplitResult``\n  serialization at all. Pickles produced by older yarl releases (which embed\n  a ``SplitResult``) continue to load unchanged\n  -- by `@befeleme <https://github.com/sponsors/befeleme>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1632 <https://github.com/aio-libs/yarl/issues/1632>`__, `#1642 <https://github.com/aio-libs/yarl/issues/1642>`__, `#1687 <https://github.com/aio-libs/yarl/issues/1687>`__.\n\n- Fixed a parsing issue where URLs containing text before an opening bracket\n  in the host component (e.g. ``http://127.0.0.1[aa::ff]``) were silently accepted\n  instead of being rejected as strictly invalid per RFC 3986\n  -- by `@rodrigobnogueira <https://github.com/sponsors/rodrigobnogueira>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1654 <https://github.com/aio-libs/yarl/issues/1654>`__.\n\n- Raise ``ValueError`` when a URL's authority component contains a\n  backslash, which is not a valid character per ``3986``\n  -- by `@rodrigobnogueira <https://github.com/sponsors/rodrigobnogueira>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1659 <https://github.com/aio-libs/yarl/issues/1659>`__.\n\n- Fixed a host-confusion parsing bug where URLs containing multiple bracket\n  characters in the host component (e.g. ``http://[:localhost[]].google:80``)\n  were silently parsed as an unintended host. Both ``split_url()`` and\n  ``split_netloc()`` now raise ``ValueError`` when more than one ``[`` or\n  ``]`` is found in the authority, or when ``[`` does not appear at the start of\n  the host subcomponent, in compliance with ``3986`` -- by\n  `@rodrigobnogueira <https://github.com/sponsors/rodrigobnogueira>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1661 <https://github.com/aio-libs/yarl/issues/1661>`__.\n\n- Fixed a parser/serializer inconsistency where percent-encoded characters in\n  the scheme portion of a URL (e.g. ``ht%74p://...``) were decoded by the\n  requoter, causing ``str()`` and ``yarl.URL.human_repr()`` to emit an\n  absolute URL with a scheme and host while the parsed properties\n  (``~yarl.URL.scheme``, ``~yarl.URL.host``, ``~yarl.URL.absolute``)\n  reported a relative, hostless URL. The fix preserves the percent-encoding of\n  the colon (``%3A``) in relative paths whenever decoding it would materialize a\n  URL scheme -- by `@rodrigobnogueira <https://github.com/sponsors/rodrigobnogueira>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1669 <https://github.com/aio-libs/yarl/issues/1669>`__.\n\n- Fixed a parsing issue where URLs containing text after the closing bracket\n  of an IP-literal host (e.g. ``http://[::1]allowed.example:1/``) were silently\n  accepted and normalized to the bracketed IP address (``http://[::1]:1/``),\n  dropping the trailing suffix and changing the effective host identity.\n  Per RFC 3986, after the closing ``]`` only ``:`` followed by a port number or\n  end-of-authority is valid\n  -- by `@rodrigobnogueira <https://github.com/sponsors/rodrigobnogueira>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1672 <https://github.com/aio-libs/yarl/issues/1672>`__.\n\n\nFeatures\n--------\n\n- Start building and shipping riscv64 wheels\n  -- by `@justeph <https://github.com/sponsors/justeph>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1626 <https://github.com/aio-libs/yarl/issues/1626>`__.\n\n\nRemovals and backward incompatible breaking changes\n---------------------------------------------------\n\n- Dropped support for the experimental free-threaded build of Python 3.13 -- by `@ngoldbaum <https://github.com/sponsors/ngoldbaum>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1667 <https://github.com/aio-libs/yarl/issues/1667>`__.\n\n\nImproved documentation\n----------------------\n\n- Added a note in the ``yarl.URL.with_query()`` documentation explaining\n  that types implementing ``__int__`` (e.g. ``~uuid.UUID``) are\n  converted to integers, and advising users to cast to ``str`` when the\n  human-readable representation is needed -- by `@r266-tech <https://github.com/sponsors/r266-tech>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1638 <https://github.com/aio-libs/yarl/issues/1638>`__, `#1645 <https://github.com/aio-libs/yarl/issues/1645>`__.\n\n\nContributor-facing changes\n--------------------------\n\n- Resolved a ruff ``ISC004`` violation in the PEP 517 build backend so the\n  pre-commit ``ruff-check`` hook passes again\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1674 <https://github.com/aio-libs/yarl/issues/1674>`__.\n\n- Renamed the ``actions/checkout`` ``depth`` input to ``fetch-depth`` in the\n  reusable codspeed workflow so the actionlint pre-commit hook passes and the\n  intended shallow clone actually takes effect\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1676 <https://github.com/aio-libs/yarl/issues/1676>`__.\n\n- Bumped the pinned ``pyupgrade`` pre-commit hook to ``v3.21.2`` so it stops\n  crashing on Python 3.14, which made ``tokenize.cookie_re`` bytes-only\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1677 <https://github.com/aio-libs/yarl/issues/1677>`__.\n\n- The type preciseness coverage report generated by `MyPy\n  <https://mypy-lang.org>`__ is now uploaded to `Coveralls\n  <https://coveralls.io/github/aio-libs/yarl>`__ and\n  will not be included in the `Codecov views\n  <https://app.codecov.io/gh/aio-libs/yarl>`__ going forward\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1680 <https://github.com/aio-libs/yarl/issues/1680>`__.\n\n- Raised the per-matrix-cell timeout of the CI ``Test`` job from\n  5 to 10 minutes to prevent false failures on slower runners\n  -- by `@aiolibsbot <https://github.com/sponsors/aiolibsbot>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1683 <https://github.com/aio-libs/yarl/issues/1683>`__.\n\n- Added an ``AGENTS.md`` orientation file at the repository root,\n  covering the pull request template, ``CHANGES/`` news fragment\n  conventions, draft-PR workflow, and the Cython quoter layout, so\n  LLM contributors land changes that match project style\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1685 <https://github.com/aio-libs/yarl/issues/1685>`__.\n\n- Documented in ``AGENTS.md`` that the coverage gate also\n  applies to test code, so unreachable defensive ``raise`` guards\n  and one-sided cleanup branches in tests will fail CI\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1689 <https://github.com/aio-libs/yarl/issues/1689>`__.\n\n- Shrunk the CI wheel-build matrix on pull requests and non-tag pushes by\n  restricting ``CIBW_ARCHS_MACOS`` to ``arm64``, ``CIBW_ARCHS_WINDOWS`` to\n  ``AMD64``, and skipping the ``windows-11-arm`` runner -- the test matrix only\n  exercises those architectures, so the previously-built ``x86_64`` macOS and\n  ``ARM64`` Windows wheels were never installed. Tag releases still build the\n  full architecture set\n  -- by `@aiolibsbot <https://github.com/sponsors/aiolibsbot>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1692 <https://github.com/aio-libs/yarl/issues/1692>`__.\n\n- Documented the docs spell check (``make doc-spelling``) in\n  ``AGENTS.md`` as a pre-push gate, mirroring\n  `aio-libs/multidict#1345\n  <https://github.com/aio-libs/multidict/pull/1345>`__. The\n  spell checker reads every ``CHANGES/*.rst`` fragment as part\n  of the docs build, so an unknown technical word in a news\n  fragment fails CI before a human sees the PR\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1693 <https://github.com/aio-libs/yarl/issues/1693>`__.\n\n- Added a ``CLAUDE.md`` at the repository root that imports\n  ``AGENTS.md`` via Claude Code's ``@``-syntax, so the\n  project's LLM contributor rules load automatically when\n  working in Claude Code\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1696 <https://github.com/aio-libs/yarl/issues/1696>`__.\n\n- Enforced top-level imports across ``yarl`` and ``tests`` via the ruff\n  ``PLC0415`` rule, wired through a new ``ruff-check`` pre-commit hook.\n  Function-scoped imports must now opt in with ``# noqa: PLC0415`` plus\n  a comment explaining the import-time reason. Dropped the ``yesqa``\n  hook, which could not recognize ruff-only codes and stripped the new\n  ``noqa`` comments as stale; a wider migration off flake8 onto ruff\n  will follow separately\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1697 <https://github.com/aio-libs/yarl/issues/1697>`__.\n\n- Migrated the main tree from standalone ``black`` and ``isort``\n  pre-commit hooks to ``ruff format`` and the ruff ``I`` lint rule,\n  sharing the existing ``[tool.ruff]`` config in ``pyproject.toml``.\n  ``ruff-check`` now runs with ``--fix`` so import-order fixes apply\n  on commit, and the orphan ``[isort]`` block in ``setup.cfg`` was\n  removed. The ``packaging/pep517_backend/`` subtree keeps its own\n  ``.ruff.toml`` and is unaffected\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1698 <https://github.com/aio-libs/yarl/issues/1698>`__.\n\n- Switched the ``cibuildwheel`` build frontend to ``build[uv]`` so\n  that ``uv`` provisions every build and test virtual environment\n  in the wheel matrix. Test-dependency installation in particular\n  drops from a multi-second ``pip install`` per ABI to a roughly\n  sub-second ``uv`` resolve\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1699 <https://github.com/aio-libs/yarl/issues/1699>`__.\n\n- Restructured the root ``CLAUDE.md`` to import contributor\n  context from a shared ``aio-libs`` layer\n  (``~/.claude/aio-libs/context.md``), a project-specific layer\n  (``~/.claude/aio-libs/yarl/context.md``), the in-tree\n  ``AGENTS.md``, and an optional per-checkout\n  ``CLAUDE.local.md`` override (added to ``.gitignore``),\n  so shared ``aio-libs`` guidance can live outside the repository\n  while project rules continue to load automatically in Claude\n  Code -- by `@aiolibsbot <https://github.com/sponsors/aiolibsbot>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1700 <https://github.com/aio-libs/yarl/issues/1700>`__, `#1701 <https://github.com/aio-libs/yarl/issues/1701>`__.\n\n- Switched CI/CD to ``tox-dev/workflow``'s ``reusable-tox.yml``\n  driven by an in-tree ``tox.ini``. The ``build``,\n  ``metadata-validation`` and ``lint`` (``pre-commit``,\n  ``spellcheck-docs``, ``build-docs``) jobs all run through the\n  reusable workflow; MyPy coverage uploads to Coveralls from a\n  ``post-tox-job`` hook\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1711 <https://github.com/aio-libs/yarl/issues/1711>`__.\n\n- Switched the CI ``test`` job from ``actions/setup-python`` to\n  ``astral-sh/setup-uv`` with ``uv pip install``. Pre-release\n  interpreters skip the wheel cache so each run resolves freshly\n  against the current snapshot\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1715 <https://github.com/aio-libs/yarl/issues/1715>`__.\n\n- Switched the ``Aiohttp`` workflow that runs the aiohttp test\n  suite against the in-tree yarl checkout from\n  ``actions/setup-python`` to ``astral-sh/setup-uv`` with ``uv\n  pip install``\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1716 <https://github.com/aio-libs/yarl/issues/1716>`__.\n\n- Switched the ``Aiohttp`` workflow's ``make .develop`` step to\n  install aiohttp's dev env through ``uv pip`` by passing\n  ``PIP=\"uv pip\"``\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1717 <https://github.com/aio-libs/yarl/issues/1717>`__.\n\n\n----\n\n\n1.23.0\n======\n\n*(2025-12-16)*\n\n\nFeatures\n--------\n\n- Added support for ``pydantic``, the ``~yarl.URL`` could be used as a\n  field type in ``pydantic`` models seamlessly.\n\n  *Related issues and pull requests on GitHub:*\n  `#1607 <https://github.com/aio-libs/yarl/issues/1607>`__.\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- The CI has been set up to notify Codecov about upload completion\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  With this, Codecov no longer needs to guess whether it received all\n  the intended coverage reports or not.\n\n  *Related issues and pull requests on GitHub:*\n  `#1577 <https://github.com/aio-libs/yarl/issues/1577>`__.\n\n- The in-tree build backend allows the end-users appending\n  ``CFLAGS`` and ``LDFLAGS`` by setting respective environment\n  variables externally.\n\n  It additionally sets up default compiler flags to perform\n  building with maximum optimization in release mode. This\n  makes the resulting artifacts shipped to PyPI smaller.\n\n  When line tracing is requested, the compiler and linker\n  flags are configured to include as much information as\n  possible for debugging and coverage tracking. The\n  development builds are therefore smaller.\n\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#1586 <https://github.com/aio-libs/yarl/issues/1586>`__.\n\n- The `PEP 517 <https://peps.python.org/pep-517>`__ build backend now supports a new config\n  setting for controlling whether to build the project in-tree\n  or in a temporary directory. It only affects wheels and is\n  set up to build in a temporary directory by default. It does\n  not affect editable wheel builds — they will keep being\n  built in-tree regardless.\n\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  Here's an example of using this setting:\n\n  .. code-block:: console\n\n     $ python -m build \\\n         --config-setting=build-inplace=true\n\n  *Related issues and pull requests on GitHub:*\n  `#1590 <https://github.com/aio-libs/yarl/issues/1590>`__.\n\n- Starting this version, when building the wheels is happening\n  in an automatically created temporary directory, the build\n  backend makes an effort to normalize the respective file\n  system path to a deterministic source checkout directory.\n\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  It does so by injecting the ``-ffile-prefix-map`` compiler\n  option into the ``CFLAGS`` environment variable as suggested\n  by known `reproducible build practices\n  <https://reproducible-builds.org/docs/build-path/>`__.\n\n  The effect is that downstreams will get more reproducible\n  build results.\n\n  *Related issues and pull requests on GitHub:*\n  `#1591 <https://github.com/aio-libs/yarl/issues/1591>`__.\n\n- Dropped Python 3.9 support; Python 3.10 is the minimal supported Python version\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1609 <https://github.com/aio-libs/yarl/issues/1609>`__.\n\n\nContributor-facing changes\n--------------------------\n\n- The deprecated license classifier was removed from ``setup.cfg``\n  -- by `@yegorich <https://github.com/sponsors/yegorich>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1550 <https://github.com/aio-libs/yarl/issues/1550>`__.\n\n- The in-tree build backend allows the end-users appending\n  ``CFLAGS`` and ``LDFLAGS`` by setting respective environment\n  variables externally.\n\n  It additionally sets up default compiler flags to perform\n  building with maximum optimization in release mode. This\n  makes the resulting artifacts shipped to PyPI smaller.\n\n  When line tracing is requested, the compiler and linker\n  flags are configured to include as much information as\n  possible for debugging and coverage tracking. The\n  development builds are therefore smaller.\n\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#1586 <https://github.com/aio-libs/yarl/issues/1586>`__.\n\n- The CI has been updated to consistently benchmark optimized\n  release builds -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  When the release workflow is triggered, the pre-built wheels\n  ready to hit PyPI are being tested. Otherwise, the job\n  builds the project from source, while the rest of the\n  workflow uses debug builds for line tracing and coverage\n  collection.\n\n  *Related issues and pull requests on GitHub:*\n  `#1587 <https://github.com/aio-libs/yarl/issues/1587>`__.\n\n\n----\n\n\n1.22.0\n======\n\n*(2025-10-05)*\n\n\nFeatures\n--------\n\n- Added arm64 Windows wheel builds\n  -- by `@finnagin <https://github.com/sponsors/finnagin>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1516 <https://github.com/aio-libs/yarl/issues/1516>`__.\n\n\n----\n\n\n1.21.0\n======\n\n*(2025-10-05)*\n\n\nContributor-facing changes\n--------------------------\n\n- The ``reusable-cibuildwheel.yml`` workflow has been refactored to\n  be more generic and ``ci-cd.yml`` now holds all the configuration\n  toggles -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1535 <https://github.com/aio-libs/yarl/issues/1535>`__.\n\n- When building wheels, the source distribution is now passed directly\n  to the ``cibuildwheel`` invocation -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1536 <https://github.com/aio-libs/yarl/issues/1536>`__.\n\n- Added CI for Python 3.14 -- by `@kumaraditya303 <https://github.com/sponsors/kumaraditya303>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1560 <https://github.com/aio-libs/yarl/issues/1560>`__.\n\n\n----\n\n\n1.20.1\n======\n\n*(2025-06-09)*\n\n\nBug fixes\n---------\n\n- Started raising a ``ValueError`` exception raised for corrupted\n  IPv6 URL values.\n\n  These fixes the issue where exception ``IndexError`` was\n  leaking from the internal code because of not being handled and\n  transformed into a user-facing error. The problem was happening\n  under the following conditions: empty IPv6 URL, brackets in\n  reverse order.\n\n  -- by `@MaelPic <https://github.com/sponsors/MaelPic>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1512 <https://github.com/aio-libs/yarl/issues/1512>`__.\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- Updated to use Cython 3.1 universally across the build path -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1514 <https://github.com/aio-libs/yarl/issues/1514>`__.\n\n- Made Cython line tracing opt-in via the ``with-cython-tracing`` build config setting -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  Previously, line tracing was enabled by default in ``pyproject.toml``, which caused build issues for some users and made wheels nearly twice as slow.\n  Now line tracing is only enabled when explicitly requested via ``pip install . --config-setting=with-cython-tracing=true`` or by setting the ``YARL_CYTHON_TRACING`` environment variable.\n\n  *Related issues and pull requests on GitHub:*\n  `#1521 <https://github.com/aio-libs/yarl/issues/1521>`__.\n\n\n----\n\n\n1.20.0\n======\n\n*(2025-04-16)*\n\n\nFeatures\n--------\n\n- Implemented support for the free-threaded build of CPython 3.13 -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1456 <https://github.com/aio-libs/yarl/issues/1456>`__.\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- Started building wheels for the free-threaded build of CPython 3.13 -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1456 <https://github.com/aio-libs/yarl/issues/1456>`__.\n\n\n----\n\n\n1.19.0\n======\n\n*(2025-04-05)*\n\n\nBug fixes\n---------\n\n- Fixed entire name being re-encoded when using ``yarl.URL.with_suffix()`` -- by `@NTFSvolume <https://github.com/sponsors/NTFSvolume>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1468 <https://github.com/aio-libs/yarl/issues/1468>`__.\n\n\nFeatures\n--------\n\n- Started building armv7l wheels for manylinux -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1495 <https://github.com/aio-libs/yarl/issues/1495>`__.\n\n\nContributor-facing changes\n--------------------------\n\n- GitHub Actions CI/CD is now configured to manage caching pip-ecosystem\n  dependencies using `re-actors/cache-python-deps`_ -- an action by\n  `@webknjaz <https://github.com/sponsors/webknjaz>`__ that takes into account ABI stability and the exact\n  version of Python runtime.\n\n  .. _`re-actors/cache-python-deps`:\n     https://github.com/marketplace/actions/cache-python-deps\n\n  *Related issues and pull requests on GitHub:*\n  `#1471 <https://github.com/aio-libs/yarl/issues/1471>`__.\n\n- Increased minimum `propcache`_ version to 0.2.1 to fix failing tests -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  .. _`propcache`:\n     https://github.com/aio-libs/propcache\n\n  *Related issues and pull requests on GitHub:*\n  `#1479 <https://github.com/aio-libs/yarl/issues/1479>`__.\n\n- Added all hidden folders to pytest's ``norecursedirs`` to prevent it\n  from trying to collect tests there -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1480 <https://github.com/aio-libs/yarl/issues/1480>`__.\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved accuracy of type annotations -- by `@Dreamsorcerer <https://github.com/sponsors/Dreamsorcerer>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1484 <https://github.com/aio-libs/yarl/issues/1484>`__.\n\n- Improved performance of parsing query strings -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1493 <https://github.com/aio-libs/yarl/issues/1493>`__, `#1497 <https://github.com/aio-libs/yarl/issues/1497>`__.\n\n- Improved performance of the C unquoter -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1496 <https://github.com/aio-libs/yarl/issues/1496>`__, `#1498 <https://github.com/aio-libs/yarl/issues/1498>`__.\n\n\n----\n\n\n1.18.3\n======\n\n*(2024-12-01)*\n\n\nBug fixes\n---------\n\n- Fixed uppercase ASCII hosts being rejected by ``URL.build()()`` and ``yarl.URL.with_host()`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#954 <https://github.com/aio-libs/yarl/issues/954>`__, `#1442 <https://github.com/aio-libs/yarl/issues/1442>`__.\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performances of multiple path properties on cache miss -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1443 <https://github.com/aio-libs/yarl/issues/1443>`__.\n\n\n----\n\n\n1.18.2\n======\n\n*(2024-11-29)*\n\n\nNo significant changes.\n\n\n----\n\n\n1.18.1\n======\n\n*(2024-11-29)*\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved cache performance when ``~yarl.URL`` objects are constructed from ``yarl.URL.build()`` with ``encoded=True`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1432 <https://github.com/aio-libs/yarl/issues/1432>`__.\n\n- Improved cache performance for operations that produce a new ``~yarl.URL`` object -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1434 <https://github.com/aio-libs/yarl/issues/1434>`__, `#1436 <https://github.com/aio-libs/yarl/issues/1436>`__.\n\n\n----\n\n\n1.18.0\n======\n\n*(2024-11-21)*\n\n\nFeatures\n--------\n\n- Added ``keep_query`` and ``keep_fragment`` flags in the ``yarl.URL.with_path()``, ``yarl.URL.with_name()`` and ``yarl.URL.with_suffix()`` methods, allowing users to optionally retain the query string and fragment in the resulting URL when replacing the path -- by `@paul-nameless <https://github.com/sponsors/paul-nameless>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#111 <https://github.com/aio-libs/yarl/issues/111>`__, `#1421 <https://github.com/aio-libs/yarl/issues/1421>`__.\n\n\nContributor-facing changes\n--------------------------\n\n- Started running downstream ``aiohttp`` tests in CI -- by `@Cycloctane <https://github.com/sponsors/Cycloctane>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1415 <https://github.com/aio-libs/yarl/issues/1415>`__.\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performance of converting ``~yarl.URL`` to a string -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1422 <https://github.com/aio-libs/yarl/issues/1422>`__.\n\n\n----\n\n\n1.17.2\n======\n\n*(2024-11-17)*\n\n\nBug fixes\n---------\n\n- Stopped implicitly allowing the use of Cython pre-release versions when\n  building the distribution package -- by `@ajsanchezsanz <https://github.com/sponsors/ajsanchezsanz>`__ and\n  `@markgreene74 <https://github.com/sponsors/markgreene74>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1411 <https://github.com/aio-libs/yarl/issues/1411>`__, `#1412 <https://github.com/aio-libs/yarl/issues/1412>`__.\n\n- Fixed a bug causing ``~yarl.URL.port`` to return the default port when the given port was zero\n  -- by `@gmacon <https://github.com/sponsors/gmacon>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1413 <https://github.com/aio-libs/yarl/issues/1413>`__.\n\n\nFeatures\n--------\n\n- Make error messages include details of incorrect type when ``port`` is not int in ``yarl.URL.build()``.\n  -- by `@Cycloctane <https://github.com/sponsors/Cycloctane>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1414 <https://github.com/aio-libs/yarl/issues/1414>`__.\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- Stopped implicitly allowing the use of Cython pre-release versions when\n  building the distribution package -- by `@ajsanchezsanz <https://github.com/sponsors/ajsanchezsanz>`__ and\n  `@markgreene74 <https://github.com/sponsors/markgreene74>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1411 <https://github.com/aio-libs/yarl/issues/1411>`__, `#1412 <https://github.com/aio-libs/yarl/issues/1412>`__.\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performance of the ``yarl.URL.joinpath()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1418 <https://github.com/aio-libs/yarl/issues/1418>`__.\n\n\n----\n\n\n1.17.1\n======\n\n*(2024-10-30)*\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performance of many ``~yarl.URL`` methods -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1396 <https://github.com/aio-libs/yarl/issues/1396>`__, `#1397 <https://github.com/aio-libs/yarl/issues/1397>`__, `#1398 <https://github.com/aio-libs/yarl/issues/1398>`__.\n\n- Improved performance of passing a `dict` or `str` to ``yarl.URL.extend_query()`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1401 <https://github.com/aio-libs/yarl/issues/1401>`__.\n\n\n----\n\n\n1.17.0\n======\n\n*(2024-10-28)*\n\n\nFeatures\n--------\n\n- Added ``~yarl.URL.host_port_subcomponent`` which returns the ``3986#section-3.2.2`` host and ``3986#section-3.2.3`` port subcomponent -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1375 <https://github.com/aio-libs/yarl/issues/1375>`__.\n\n\n----\n\n\n1.16.0\n======\n\n*(2024-10-21)*\n\n\nBug fixes\n---------\n\n- Fixed blocking I/O to load Python code when creating a new ``~yarl.URL`` with non-ascii characters in the network location part -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1342 <https://github.com/aio-libs/yarl/issues/1342>`__.\n\n\nRemovals and backward incompatible breaking changes\n---------------------------------------------------\n\n- Migrated to using a single cache for encoding hosts -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  Passing ``ip_address_size`` and ``host_validate_size`` to ``yarl.cache_configure()`` is deprecated in favor of the new ``encode_host_size`` parameter and will be removed in a future release. For backwards compatibility, the old parameters affect the ``encode_host`` cache size.\n\n  *Related issues and pull requests on GitHub:*\n  `#1348 <https://github.com/aio-libs/yarl/issues/1348>`__, `#1357 <https://github.com/aio-libs/yarl/issues/1357>`__, `#1363 <https://github.com/aio-libs/yarl/issues/1363>`__.\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performance of constructing ``~yarl.URL`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1336 <https://github.com/aio-libs/yarl/issues/1336>`__.\n\n- Improved performance of calling ``yarl.URL.build()`` and constructing unencoded ``~yarl.URL`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1345 <https://github.com/aio-libs/yarl/issues/1345>`__.\n\n- Reworked the internal encoding cache to improve performance on cache hit -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1369 <https://github.com/aio-libs/yarl/issues/1369>`__.\n\n\n----\n\n\n1.15.5\n======\n\n*(2024-10-18)*\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performance of the ``yarl.URL.joinpath()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1304 <https://github.com/aio-libs/yarl/issues/1304>`__.\n\n- Improved performance of the ``yarl.URL.extend_query()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1305 <https://github.com/aio-libs/yarl/issues/1305>`__.\n\n- Improved performance of the ``yarl.URL.origin()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1306 <https://github.com/aio-libs/yarl/issues/1306>`__.\n\n- Improved performance of the ``yarl.URL.with_path()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1307 <https://github.com/aio-libs/yarl/issues/1307>`__.\n\n- Improved performance of the ``yarl.URL.with_query()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1308 <https://github.com/aio-libs/yarl/issues/1308>`__, `#1328 <https://github.com/aio-libs/yarl/issues/1328>`__.\n\n- Improved performance of the ``yarl.URL.update_query()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1309 <https://github.com/aio-libs/yarl/issues/1309>`__, `#1327 <https://github.com/aio-libs/yarl/issues/1327>`__.\n\n- Improved performance of the ``yarl.URL.join()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1313 <https://github.com/aio-libs/yarl/issues/1313>`__.\n\n- Improved performance of ``~yarl.URL`` equality checks -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1315 <https://github.com/aio-libs/yarl/issues/1315>`__.\n\n- Improved performance of ``~yarl.URL`` methods that modify the network location -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1316 <https://github.com/aio-libs/yarl/issues/1316>`__.\n\n- Improved performance of the ``yarl.URL.with_fragment()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1317 <https://github.com/aio-libs/yarl/issues/1317>`__.\n\n- Improved performance of calculating the hash of ``~yarl.URL`` objects -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1318 <https://github.com/aio-libs/yarl/issues/1318>`__.\n\n- Improved performance of the ``yarl.URL.relative()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1319 <https://github.com/aio-libs/yarl/issues/1319>`__.\n\n- Improved performance of the ``yarl.URL.with_name()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1320 <https://github.com/aio-libs/yarl/issues/1320>`__.\n\n- Improved performance of ``~yarl.URL.parent`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1321 <https://github.com/aio-libs/yarl/issues/1321>`__.\n\n- Improved performance of the ``yarl.URL.with_scheme()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1322 <https://github.com/aio-libs/yarl/issues/1322>`__.\n\n\n----\n\n\n1.15.4\n======\n\n*(2024-10-16)*\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performance of the quoter when all characters are safe -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1288 <https://github.com/aio-libs/yarl/issues/1288>`__.\n\n- Improved performance of unquoting strings -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1292 <https://github.com/aio-libs/yarl/issues/1292>`__, `#1293 <https://github.com/aio-libs/yarl/issues/1293>`__.\n\n- Improved performance of calling ``yarl.URL.build()`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1297 <https://github.com/aio-libs/yarl/issues/1297>`__.\n\n\n----\n\n\n1.15.3\n======\n\n*(2024-10-15)*\n\n\nBug fixes\n---------\n\n- Fixed ``yarl.URL.build()`` failing to validate paths must start with a ``/`` when passing ``authority`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  The validation only worked correctly when passing ``host``.\n\n  *Related issues and pull requests on GitHub:*\n  `#1265 <https://github.com/aio-libs/yarl/issues/1265>`__.\n\n\nRemovals and backward incompatible breaking changes\n---------------------------------------------------\n\n- Removed support for Python 3.8 as it has reached end of life -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1203 <https://github.com/aio-libs/yarl/issues/1203>`__.\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performance of constructing ``~yarl.URL`` when the net location is only the host -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1271 <https://github.com/aio-libs/yarl/issues/1271>`__.\n\n\n----\n\n\n1.15.2\n======\n\n*(2024-10-13)*\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performance of converting ``~yarl.URL`` to a string -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1234 <https://github.com/aio-libs/yarl/issues/1234>`__.\n\n- Improved performance of ``yarl.URL.joinpath()`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1248 <https://github.com/aio-libs/yarl/issues/1248>`__, `#1250 <https://github.com/aio-libs/yarl/issues/1250>`__.\n\n- Improved performance of constructing query strings from ``~multidict.MultiDict`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1256 <https://github.com/aio-libs/yarl/issues/1256>`__.\n\n- Improved performance of constructing query strings with ``int`` values -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1259 <https://github.com/aio-libs/yarl/issues/1259>`__.\n\n\n----\n\n\n1.15.1\n======\n\n*(2024-10-12)*\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performance of calling ``yarl.URL.build()`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1222 <https://github.com/aio-libs/yarl/issues/1222>`__.\n\n- Improved performance of all ``~yarl.URL`` methods that create new ``~yarl.URL`` objects -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1226 <https://github.com/aio-libs/yarl/issues/1226>`__.\n\n- Improved performance of ``~yarl.URL`` methods that modify the network location -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1229 <https://github.com/aio-libs/yarl/issues/1229>`__.\n\n\n----\n\n\n1.15.0\n======\n\n*(2024-10-11)*\n\n\nBug fixes\n---------\n\n- Fixed validation with ``yarl.URL.with_scheme()`` when passed scheme is not lowercase -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1189 <https://github.com/aio-libs/yarl/issues/1189>`__.\n\n\nFeatures\n--------\n\n- Started building ``armv7l`` wheels -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1204 <https://github.com/aio-libs/yarl/issues/1204>`__.\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performance of constructing unencoded ``~yarl.URL`` objects -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1188 <https://github.com/aio-libs/yarl/issues/1188>`__.\n\n- Added a cache for parsing hosts to reduce overhead of encoding ``~yarl.URL`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1190 <https://github.com/aio-libs/yarl/issues/1190>`__.\n\n- Improved performance of constructing query strings from ``~collections.abc.Mapping`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1193 <https://github.com/aio-libs/yarl/issues/1193>`__.\n\n- Improved performance of converting ``~yarl.URL`` objects to strings -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1198 <https://github.com/aio-libs/yarl/issues/1198>`__.\n\n\n----\n\n\n1.14.0\n======\n\n*(2024-10-08)*\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- Switched to using the ``propcache`` package for property caching\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  The ``propcache`` package is derived from the property caching\n  code in ``yarl`` and has been broken out to avoid maintaining it for multiple\n  projects.\n\n  *Related issues and pull requests on GitHub:*\n  `#1169 <https://github.com/aio-libs/yarl/issues/1169>`__.\n\n\nContributor-facing changes\n--------------------------\n\n- Started testing with Hypothesis -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__ and `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  Special thanks to `@Zac-HD <https://github.com/sponsors/Zac-HD>`__ for helping us get started with this framework.\n\n  *Related issues and pull requests on GitHub:*\n  `#860 <https://github.com/aio-libs/yarl/issues/860>`__.\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performance of ``yarl.URL.is_default_port()`` when no explicit port is set -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1168 <https://github.com/aio-libs/yarl/issues/1168>`__.\n\n- Improved performance of converting ``~yarl.URL`` to a string when no explicit port is set -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1170 <https://github.com/aio-libs/yarl/issues/1170>`__.\n\n- Improved performance of the ``yarl.URL.origin()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1175 <https://github.com/aio-libs/yarl/issues/1175>`__.\n\n- Improved performance of encoding hosts -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1176 <https://github.com/aio-libs/yarl/issues/1176>`__.\n\n\n----\n\n\n1.13.1\n======\n\n*(2024-09-27)*\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performance of calling ``yarl.URL.build()`` with ``authority`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1163 <https://github.com/aio-libs/yarl/issues/1163>`__.\n\n\n----\n\n\n1.13.0\n======\n\n*(2024-09-26)*\n\n\nBug fixes\n---------\n\n- Started rejecting ASCII hostnames with invalid characters. For host strings that\n  look like authority strings, the exception message includes advice on what to do\n  instead -- by `@mjpieters <https://github.com/sponsors/mjpieters>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#880 <https://github.com/aio-libs/yarl/issues/880>`__, `#954 <https://github.com/aio-libs/yarl/issues/954>`__.\n\n- Fixed IPv6 addresses missing brackets when the ``~yarl.URL`` was converted to a string -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1157 <https://github.com/aio-libs/yarl/issues/1157>`__, `#1158 <https://github.com/aio-libs/yarl/issues/1158>`__.\n\n\nFeatures\n--------\n\n- Added ``~yarl.URL.host_subcomponent`` which returns the ``3986#section-3.2.2`` host subcomponent -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  The only current practical difference between ``~yarl.URL.raw_host`` and ``~yarl.URL.host_subcomponent`` is that IPv6 addresses are returned bracketed.\n\n  *Related issues and pull requests on GitHub:*\n  `#1159 <https://github.com/aio-libs/yarl/issues/1159>`__.\n\n\n----\n\n\n1.12.1\n======\n\n*(2024-09-23)*\n\n\nNo significant changes.\n\n\n----\n\n\n1.12.0\n======\n\n*(2024-09-23)*\n\n\nFeatures\n--------\n\n- Added ``~yarl.URL.path_safe`` to be able to fetch the path without ``%2F`` and ``%25`` decoded -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1150 <https://github.com/aio-libs/yarl/issues/1150>`__.\n\n\nRemovals and backward incompatible breaking changes\n---------------------------------------------------\n\n- Restore decoding ``%2F`` (``/``) in ``URL.path`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  This change restored the behavior before `#1057 <https://github.com/aio-libs/yarl/issues/1057>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1151 <https://github.com/aio-libs/yarl/issues/1151>`__.\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performance of processing paths -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1143 <https://github.com/aio-libs/yarl/issues/1143>`__.\n\n\n----\n\n\n1.11.1\n======\n\n*(2024-09-09)*\n\n\nBug fixes\n---------\n\n- Allowed scheme replacement for relative URLs if the scheme does not require a host -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#280 <https://github.com/aio-libs/yarl/issues/280>`__, `#1138 <https://github.com/aio-libs/yarl/issues/1138>`__.\n\n- Allowed empty host for URL schemes other than the special schemes listed in the WHATWG URL spec -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1136 <https://github.com/aio-libs/yarl/issues/1136>`__.\n\n\nFeatures\n--------\n\n- Loosened restriction on integers as query string values to allow classes that implement ``__int__`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1139 <https://github.com/aio-libs/yarl/issues/1139>`__.\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performance of normalizing paths -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1137 <https://github.com/aio-libs/yarl/issues/1137>`__.\n\n\n----\n\n\n1.11.0\n======\n\n*(2024-09-08)*\n\n\nFeatures\n--------\n\n- Added ``URL.extend_query()()`` method, which can be used to extend parameters without replacing same named keys -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  This method was primarily added to replace the inefficient hand rolled method currently used in ``aiohttp``.\n\n  *Related issues and pull requests on GitHub:*\n  `#1128 <https://github.com/aio-libs/yarl/issues/1128>`__.\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performance of the Cython ``cached_property`` implementation -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1122 <https://github.com/aio-libs/yarl/issues/1122>`__.\n\n- Simplified computing ports by removing unnecessary code -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1123 <https://github.com/aio-libs/yarl/issues/1123>`__.\n\n- Improved performance of encoding non IPv6 hosts -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1125 <https://github.com/aio-libs/yarl/issues/1125>`__.\n\n- Improved performance of ``URL.build()()`` when the path, query string, or fragment is an empty string -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1126 <https://github.com/aio-libs/yarl/issues/1126>`__.\n\n- Improved performance of the ``URL.update_query()()`` method -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1130 <https://github.com/aio-libs/yarl/issues/1130>`__.\n\n- Improved performance of processing query string changes when arguments are ``str`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1131 <https://github.com/aio-libs/yarl/issues/1131>`__.\n\n\n----\n\n\n1.10.0\n======\n\n*(2024-09-06)*\n\n\nBug fixes\n---------\n\n- Fixed joining a path when the existing path was empty -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  A regression in ``URL.join()()`` was introduced in `#1082 <https://github.com/aio-libs/yarl/issues/1082>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1118 <https://github.com/aio-libs/yarl/issues/1118>`__.\n\n\nFeatures\n--------\n\n- Added ``URL.without_query_params()()`` method, to drop some parameters from query string -- by `@hongquan <https://github.com/sponsors/hongquan>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#774 <https://github.com/aio-libs/yarl/issues/774>`__, `#898 <https://github.com/aio-libs/yarl/issues/898>`__, `#1010 <https://github.com/aio-libs/yarl/issues/1010>`__.\n\n- The previously protected types ``_SimpleQuery``, ``_QueryVariable``, and ``_Query`` are now available for use externally as ``SimpleQuery``, ``QueryVariable``, and ``Query`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1050 <https://github.com/aio-libs/yarl/issues/1050>`__, `#1113 <https://github.com/aio-libs/yarl/issues/1113>`__.\n\n\nContributor-facing changes\n--------------------------\n\n- Replaced all ``~typing.Optional`` with ``~typing.Union`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1095 <https://github.com/aio-libs/yarl/issues/1095>`__.\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Significantly improved performance of parsing the network location -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1112 <https://github.com/aio-libs/yarl/issues/1112>`__.\n\n- Added internal types to the cache to prevent future refactoring errors -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1117 <https://github.com/aio-libs/yarl/issues/1117>`__.\n\n\n----\n\n\n1.9.11\n======\n\n*(2024-09-04)*\n\n\nBug fixes\n---------\n\n- Fixed a ``TypeError`` with ``MultiDictProxy`` and Python 3.8 -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1084 <https://github.com/aio-libs/yarl/issues/1084>`__, `#1105 <https://github.com/aio-libs/yarl/issues/1105>`__, `#1107 <https://github.com/aio-libs/yarl/issues/1107>`__.\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performance of encoding hosts -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  Previously, the library would unconditionally try to parse a host as an IP Address. The library now avoids trying to parse a host as an IP Address if the string is not in one of the formats described in ``3986#section-3.2.2``.\n\n  *Related issues and pull requests on GitHub:*\n  `#1104 <https://github.com/aio-libs/yarl/issues/1104>`__.\n\n\n----\n\n\n1.9.10\n======\n\n*(2024-09-04)*\n\n\nBug fixes\n---------\n\n- ``URL.join()()`` has been changed to match\n  ``3986`` and align with\n  ``/ operation()`` and ``URL.joinpath()()``\n  when joining URLs with empty segments.\n  Previously ``urllib.parse.urljoin`` was used,\n  which has known issues with empty segments\n  (`python/cpython#84774 <https://github.com/python/cpython/issues/84774>`_).\n\n  Due to the semantics of ``URL.join()()``, joining an\n  URL with scheme requires making it relative, prefixing with ``./``.\n\n  .. code-block:: pycon\n\n     >>> URL(\"https://web.archive.org/web/\").join(URL(\"./https://github.com/aio-libs/yarl\"))\n     URL('https://web.archive.org/web/https://github.com/aio-libs/yarl')\n\n\n  Empty segments are honored in the base as well as the joined part.\n\n  .. code-block:: pycon\n\n     >>> URL(\"https://web.archive.org/web/https://\").join(URL(\"github.com/aio-libs/yarl\"))\n     URL('https://web.archive.org/web/https://github.com/aio-libs/yarl')\n\n\n\n  -- by `@commonism <https://github.com/sponsors/commonism>`__\n\n  This change initially appeared in 1.9.5 but was reverted in 1.9.6 to resolve a problem with query string handling.\n\n  *Related issues and pull requests on GitHub:*\n  `#1039 <https://github.com/aio-libs/yarl/issues/1039>`__, `#1082 <https://github.com/aio-libs/yarl/issues/1082>`__.\n\n\nFeatures\n--------\n\n- Added ``~yarl.URL.absolute`` which is now preferred over ``URL.is_absolute()`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1100 <https://github.com/aio-libs/yarl/issues/1100>`__.\n\n\n----\n\n\n1.9.9\n=====\n\n*(2024-09-04)*\n\n\nBug fixes\n---------\n\n- Added missing type on ``~yarl.URL.port`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1097 <https://github.com/aio-libs/yarl/issues/1097>`__.\n\n\n----\n\n\n1.9.8\n=====\n\n*(2024-09-03)*\n\n\nFeatures\n--------\n\n- Covered the ``~yarl.URL`` object with types -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1084 <https://github.com/aio-libs/yarl/issues/1084>`__.\n\n- Cache parsing of IP Addresses when encoding hosts -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1086 <https://github.com/aio-libs/yarl/issues/1086>`__.\n\n\nContributor-facing changes\n--------------------------\n\n- Covered the ``~yarl.URL`` object with types -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1084 <https://github.com/aio-libs/yarl/issues/1084>`__.\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performance of handling ports -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1081 <https://github.com/aio-libs/yarl/issues/1081>`__.\n\n\n----\n\n\n1.9.7\n=====\n\n*(2024-09-01)*\n\n\nRemovals and backward incompatible breaking changes\n---------------------------------------------------\n\n- Removed support ``3986#section-3.2.3`` port normalization when the scheme is not one of ``http``, ``https``, ``wss``, or ``ws`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  Support for port normalization was recently added in `#1033 <https://github.com/aio-libs/yarl/issues/1033>`__ and contained code that would do blocking I/O if the scheme was not one of the four listed above. The code has been removed because this library is intended to be safe for usage with ``asyncio``.\n\n  *Related issues and pull requests on GitHub:*\n  `#1076 <https://github.com/aio-libs/yarl/issues/1076>`__.\n\n\nMiscellaneous internal changes\n------------------------------\n\n- Improved performance of property caching -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  The ``reify`` implementation from ``aiohttp`` was adapted to replace the internal ``cached_property`` implementation.\n\n  *Related issues and pull requests on GitHub:*\n  `#1070 <https://github.com/aio-libs/yarl/issues/1070>`__.\n\n\n----\n\n\n1.9.6\n=====\n\n*(2024-08-30)*\n\n\nBug fixes\n---------\n\n- Reverted ``3986`` compatible ``URL.join()()`` honoring empty segments which was introduced in `#1039 <https://github.com/aio-libs/yarl/issues/1039>`__.\n\n  This change introduced a regression handling query string parameters with joined URLs. The change was reverted to maintain compatibility with the previous behavior.\n\n  *Related issues and pull requests on GitHub:*\n  `#1067 <https://github.com/aio-libs/yarl/issues/1067>`__.\n\n\n----\n\n\n1.9.5\n=====\n\n*(2024-08-30)*\n\n\nBug fixes\n---------\n\n- Joining URLs with empty segments has been changed\n  to match ``3986``.\n\n  Previously empty segments would be removed from path,\n  breaking use-cases such as\n\n  .. code-block:: python\n\n     URL(\"https://web.archive.org/web/\") / \"https://github.com/\"\n\n  Now ``/ operation()`` and ``URL.joinpath()()``\n  keep empty segments, but do not introduce new empty segments.\n  e.g.\n\n  .. code-block:: python\n\n     URL(\"https://example.org/\") / \"\"\n\n  does not introduce an empty segment.\n\n  -- by `@commonism <https://github.com/sponsors/commonism>`__ and `@youtux <https://github.com/sponsors/youtux>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#1026 <https://github.com/aio-libs/yarl/issues/1026>`__.\n\n- The default protocol ports of well-known URI schemes are now taken into account\n  during the normalization of the URL string representation in accordance with\n  ``3986#section-3.2.3``.\n\n  Specified ports are removed from the ``str`` representation of a ``~yarl.URL``\n  if the port matches the scheme's default port -- by `@commonism <https://github.com/sponsors/commonism>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1033 <https://github.com/aio-libs/yarl/issues/1033>`__.\n\n- ``URL.join()()`` has been changed to match\n  ``3986`` and align with\n  ``/ operation()`` and ``URL.joinpath()()``\n  when joining URLs with empty segments.\n  Previously ``urllib.parse.urljoin`` was used,\n  which has known issues with empty segments\n  (`python/cpython#84774 <https://github.com/python/cpython/issues/84774>`_).\n\n  Due to the semantics of ``URL.join()()``, joining an\n  URL with scheme requires making it relative, prefixing with ``./``.\n\n  .. code-block:: pycon\n\n     >>> URL(\"https://web.archive.org/web/\").join(URL(\"./https://github.com/aio-libs/yarl\"))\n     URL('https://web.archive.org/web/https://github.com/aio-libs/yarl')\n\n\n  Empty segments are honored in the base as well as the joined part.\n\n  .. code-block:: pycon\n\n     >>> URL(\"https://web.archive.org/web/https://\").join(URL(\"github.com/aio-libs/yarl\"))\n     URL('https://web.archive.org/web/https://github.com/aio-libs/yarl')\n\n\n\n  -- by `@commonism <https://github.com/sponsors/commonism>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#1039 <https://github.com/aio-libs/yarl/issues/1039>`__.\n\n\nRemovals and backward incompatible breaking changes\n---------------------------------------------------\n\n- Stopped decoding ``%2F`` (``/``) in ``URL.path``, as this could lead to code incorrectly treating it as a path separator\n  -- by `@Dreamsorcerer <https://github.com/sponsors/Dreamsorcerer>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1057 <https://github.com/aio-libs/yarl/issues/1057>`__.\n\n- Dropped support for Python 3.7 -- by `@Dreamsorcerer <https://github.com/sponsors/Dreamsorcerer>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1016 <https://github.com/aio-libs/yarl/issues/1016>`__.\n\n\nImproved documentation\n----------------------\n\n- On the ``Contributing docs`` page,\n  a link to the ``Towncrier philosophy`` has been fixed.\n\n  *Related issues and pull requests on GitHub:*\n  `#981 <https://github.com/aio-libs/yarl/issues/981>`__.\n\n- The pre-existing ``/ magic method()``\n  has been documented in the API reference -- by `@commonism <https://github.com/sponsors/commonism>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1026 <https://github.com/aio-libs/yarl/issues/1026>`__.\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- A flaw in the logic for copying the project directory into a\n  temporary folder that led to infinite recursion when ``TMPDIR``\n  was set to a project subdirectory path. This was happening in Fedora\n  and its downstream due to the use of `pyproject-rpm-macros\n  <https://src.fedoraproject.org/rpms/pyproject-rpm-macros>`__. It was\n  only reproducible with ``pip wheel`` and was not affecting the\n  ``pyproject-build`` users.\n\n  -- by `@hroncok <https://github.com/sponsors/hroncok>`__ and `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#992 <https://github.com/aio-libs/yarl/issues/992>`__, `#1014 <https://github.com/aio-libs/yarl/issues/1014>`__.\n\n- Support Python 3.13 and publish non-free-threaded wheels\n\n  *Related issues and pull requests on GitHub:*\n  `#1054 <https://github.com/aio-libs/yarl/issues/1054>`__.\n\n\nContributor-facing changes\n--------------------------\n\n- The CI/CD setup has been updated to test ``arm64`` wheels\n  under macOS 14, except for Python 3.7 that is unsupported\n  in that environment -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1015 <https://github.com/aio-libs/yarl/issues/1015>`__.\n\n- Removed unused type ignores and casts -- by `@hauntsaninja <https://github.com/sponsors/hauntsaninja>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#1031 <https://github.com/aio-libs/yarl/issues/1031>`__.\n\n\nMiscellaneous internal changes\n------------------------------\n\n- ``port``, ``scheme``, and ``raw_host`` are now ``cached_property`` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  ``aiohttp`` accesses these properties quite often, which cause ``urllib`` to build the ``_hostinfo`` property every time. ``port``, ``scheme``, and ``raw_host`` are now cached properties, which will improve performance.\n\n  *Related issues and pull requests on GitHub:*\n  `#1044 <https://github.com/aio-libs/yarl/issues/1044>`__, `#1058 <https://github.com/aio-libs/yarl/issues/1058>`__.\n\n\n----\n\n\n1.9.4 (2023-12-06)\n==================\n\nBug fixes\n---------\n\n- Started raising ``TypeError`` when a string value is passed into\n  ``yarl.URL.build()`` as the ``port`` argument  -- by `@commonism <https://github.com/sponsors/commonism>`__.\n\n  Previously the empty string as port would create malformed URLs when rendered as string representations. (`#883 <https://github.com/aio-libs/yarl/issues/883>`__)\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- The leading ``--`` has been dropped from the `PEP 517 <https://peps.python.org/pep-517>`__ in-tree build\n  backend config setting names. ``--pure-python`` is now just ``pure-python``\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  The usage now looks as follows:\n\n  .. code-block:: console\n\n      $ python -m build \\\n          --config-setting=pure-python=true \\\n          --config-setting=with-cython-tracing=true\n\n  (`#963 <https://github.com/aio-libs/yarl/issues/963>`__)\n\n\nContributor-facing changes\n--------------------------\n\n- A step-by-step ``Release Guide`` guide has\n  been added, describing how to release *yarl* -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  This is primarily targeting maintainers. (`#960 <https://github.com/aio-libs/yarl/issues/960>`__)\n- Coverage collection has been implemented for the Cython modules\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  It will also be reported to Codecov from any non-release CI jobs.\n\n  To measure coverage in a development environment, *yarl* can be\n  installed in editable mode:\n\n  .. code-block:: console\n\n      $ python -Im pip install -e .\n\n  Editable install produces C-files required for the Cython coverage\n  plugin to map the measurements back to the PYX-files.\n\n  `#961 <https://github.com/aio-libs/yarl/issues/961>`__\n\n- It is now possible to request line tracing in Cython builds using the\n  ``with-cython-tracing`` `PEP 517 <https://peps.python.org/pep-517>`__ config setting\n  -- `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  This can be used in CI and development environment to measure coverage\n  on Cython modules, but is not normally useful to the end-users or\n  downstream packagers.\n\n  Here's a usage example:\n\n  .. code-block:: console\n\n      $ python -Im pip install . --config-settings=with-cython-tracing=true\n\n  For editable installs, this setting is on by default. Otherwise, it's\n  off unless requested explicitly.\n\n  The following produces C-files required for the Cython coverage\n  plugin to map the measurements back to the PYX-files:\n\n  .. code-block:: console\n\n      $ python -Im pip install -e .\n\n  Alternatively, the ``YARL_CYTHON_TRACING=1`` environment variable\n  can be set to do the same as the `PEP 517 <https://peps.python.org/pep-517>`__ config setting.\n\n  `#962 <https://github.com/aio-libs/yarl/issues/962>`__\n\n\n1.9.3 (2023-11-20)\n==================\n\nBug fixes\n---------\n\n- Stopped dropping trailing slashes in ``yarl.URL.joinpath()`` -- by `@gmacon <https://github.com/sponsors/gmacon>`__. (`#862 <https://github.com/aio-libs/yarl/issues/862>`__, `#866 <https://github.com/aio-libs/yarl/issues/866>`__)\n- Started accepting string subclasses in ``yarl.URL.__truediv__()`` operations (``URL / segment``) -- by `@mjpieters <https://github.com/sponsors/mjpieters>`__. (`#871 <https://github.com/aio-libs/yarl/issues/871>`__, `#884 <https://github.com/aio-libs/yarl/issues/884>`__)\n- Fixed the human representation of URLs with square brackets in usernames and passwords -- by `@mjpieters <https://github.com/sponsors/mjpieters>`__. (`#876 <https://github.com/aio-libs/yarl/issues/876>`__, `#882 <https://github.com/aio-libs/yarl/issues/882>`__)\n- Updated type hints to include ``URL.missing_port()``, ``URL.__bytes__()``\n  and the ``encoding`` argument to ``yarl.URL.joinpath()``\n  -- by `@mjpieters <https://github.com/sponsors/mjpieters>`__. (`#891 <https://github.com/aio-libs/yarl/issues/891>`__)\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- Integrated Cython 3 to enable building *yarl* under Python 3.12 -- by `@mjpieters <https://github.com/sponsors/mjpieters>`__. (`#829 <https://github.com/aio-libs/yarl/issues/829>`__, `#881 <https://github.com/aio-libs/yarl/issues/881>`__)\n- Declared modern ``setuptools.build_meta`` as the `PEP 517 <https://peps.python.org/pep-517>`__ build\n  backend in ``pyproject.toml`` explicitly -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__. (`#886 <https://github.com/aio-libs/yarl/issues/886>`__)\n- Converted most of the packaging setup into a declarative ``setup.cfg``\n  config -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__. (`#890 <https://github.com/aio-libs/yarl/issues/890>`__)\n- The packaging is replaced from an old-fashioned ``setup.py`` to an\n  in-tree `PEP 517 <https://peps.python.org/pep-517>`__ build backend -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  Whenever the end-users or downstream packagers need to build ``yarl`` from\n  source (a Git checkout or an sdist), they may pass a ``config_settings``\n  flag ``--pure-python``. If this flag is not set, a C-extension will be built\n  and included into the distribution.\n\n  Here is how this can be done with ``pip``:\n\n  .. code-block:: console\n\n      $ python -m pip install . --config-settings=--pure-python=false\n\n  This will also work with ``-e | --editable``.\n\n  The same can be achieved via ``pypa/build``:\n\n  .. code-block:: console\n\n      $ python -m build --config-setting=--pure-python=false\n\n  Adding ``-w | --wheel`` can force ``pypa/build`` produce a wheel from source\n  directly, as opposed to building an ``sdist`` and then building from it. (`#893 <https://github.com/aio-libs/yarl/issues/893>`__)\n\n  .. attention::\n\n     v1.9.3 was the only version using the ``--pure-python`` setting name.\n     Later versions dropped the ``--`` prefix, making it just ``pure-python``.\n\n- Declared Python 3.12 supported officially in the distribution package metadata\n  -- by `@edgarrmondragon <https://github.com/sponsors/edgarrmondragon>`__. (`#942 <https://github.com/aio-libs/yarl/issues/942>`__)\n\n\nContributor-facing changes\n--------------------------\n\n- A regression test for no-host URLs was added per `#821 <https://github.com/aio-libs/yarl/issues/821>`__\n  and ``3986`` -- by `@kenballus <https://github.com/sponsors/kenballus>`__. (`#821 <https://github.com/aio-libs/yarl/issues/821>`__, `#822 <https://github.com/aio-libs/yarl/issues/822>`__)\n- Started testing *yarl* against Python 3.12 in CI -- by `@mjpieters <https://github.com/sponsors/mjpieters>`__. (`#881 <https://github.com/aio-libs/yarl/issues/881>`__)\n- All Python 3.12 jobs are now marked as required to pass in CI\n  -- by `@edgarrmondragon <https://github.com/sponsors/edgarrmondragon>`__. (`#942 <https://github.com/aio-libs/yarl/issues/942>`__)\n- MyST is now integrated in Sphinx -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  This allows the contributors to author new documents in Markdown\n  when they have difficulties with going straight RST. (`#953 <https://github.com/aio-libs/yarl/issues/953>`__)\n\n\n1.9.2 (2023-04-25)\n==================\n\nBugfixes\n--------\n\n- Fix regression with ``yarl.URL.__truediv__()`` and absolute URLs with empty paths causing the raw path to lack the leading ``/``.\n  (`#854 <https://github.com/aio-libs/yarl/issues/854>`_)\n\n\n1.9.1 (2023-04-21)\n==================\n\nBugfixes\n--------\n\n- Marked tests that fail on older Python patch releases (< 3.7.10, < 3.8.8 and < 3.9.2) as expected to fail due to missing a security fix for CVE-2021-23336. (`#850 <https://github.com/aio-libs/yarl/issues/850>`_)\n\n\n1.9.0 (2023-04-19)\n==================\n\nThis release was never published to PyPI, due to issues with the build process.\n\nFeatures\n--------\n\n- Added ``URL.joinpath(*elements)``, to create a new URL appending multiple path elements. (`#704 <https://github.com/aio-libs/yarl/issues/704>`_)\n- Made ``URL.__truediv__()()`` return ``NotImplemented`` if called with an\n  unsupported type — by `@michaeljpeters <https://github.com/sponsors/michaeljpeters>`__.\n  (`#832 <https://github.com/aio-libs/yarl/issues/832>`_)\n\n\nBugfixes\n--------\n\n- Path normalization for absolute URLs no longer raises a ValueError exception\n  when ``..`` segments would otherwise go beyond the URL path root.\n  (`#536 <https://github.com/aio-libs/yarl/issues/536>`_)\n- Fixed an issue with update_query() not getting rid of the query when argument is None. (`#792 <https://github.com/aio-libs/yarl/issues/792>`_)\n- Added some input restrictions on with_port() function to prevent invalid boolean inputs or out of valid port inputs; handled incorrect 0 port representation. (`#793 <https://github.com/aio-libs/yarl/issues/793>`_)\n- Made ``yarl.URL.build()`` raise a ``TypeError`` if the ``host`` argument is ``None`` — by `@paulpapacz <https://github.com/sponsors/paulpapacz>`__. (`#808 <https://github.com/aio-libs/yarl/issues/808>`_)\n- Fixed an issue with ``update_query()`` getting rid of the query when the argument\n  is empty but not ``None``. (`#845 <https://github.com/aio-libs/yarl/issues/845>`_)\n\n\nMisc\n----\n\n- `#220 <https://github.com/aio-libs/yarl/issues/220>`_\n\n\n1.8.2 (2022-12-03)\n==================\n\nThis is the first release that started shipping wheels for Python 3.11.\n\n\n1.8.1 (2022-08-01)\n==================\n\nMisc\n----\n\n- `#694 <https://github.com/aio-libs/yarl/issues/694>`_, `#699 <https://github.com/aio-libs/yarl/issues/699>`_, `#700 <https://github.com/aio-libs/yarl/issues/700>`_, `#701 <https://github.com/aio-libs/yarl/issues/701>`_, `#702 <https://github.com/aio-libs/yarl/issues/702>`_, `#703 <https://github.com/aio-libs/yarl/issues/703>`_, `#739 <https://github.com/aio-libs/yarl/issues/739>`_\n\n\n1.8.0 (2022-08-01)\n==================\n\nFeatures\n--------\n\n- Added ``URL.raw_suffix``, ``URL.suffix``, ``URL.raw_suffixes``, ``URL.suffixes``, ``URL.with_suffix``. (`#613 <https://github.com/aio-libs/yarl/issues/613>`_)\n\n\nImproved Documentation\n----------------------\n\n- Fixed broken internal references to ``yarl.URL.human_repr()``.\n  (`#665 <https://github.com/aio-libs/yarl/issues/665>`_)\n- Fixed broken external references to ``multidict:index`` docs. (`#665 <https://github.com/aio-libs/yarl/issues/665>`_)\n\n\nDeprecations and Removals\n-------------------------\n\n- Dropped Python 3.6 support. (`#672 <https://github.com/aio-libs/yarl/issues/672>`_)\n\n\nMisc\n----\n\n- `#646 <https://github.com/aio-libs/yarl/issues/646>`_, `#699 <https://github.com/aio-libs/yarl/issues/699>`_, `#701 <https://github.com/aio-libs/yarl/issues/701>`_\n\n\n1.7.2 (2021-11-01)\n==================\n\nBugfixes\n--------\n\n- Changed call in ``with_port()`` to stop reencoding parts of the URL that were already encoded. (`#623 <https://github.com/aio-libs/yarl/issues/623>`_)\n\n\n1.7.1 (2021-10-07)\n==================\n\nBugfixes\n--------\n\n- Fix 1.7.0 build error\n\n1.7.0 (2021-10-06)\n==================\n\nFeatures\n--------\n\n- Add ``__bytes__()`` magic method so that ``bytes(url)`` will work and use optimal ASCII encoding.\n  (`#582 <https://github.com/aio-libs/yarl/issues/582>`_)\n- Started shipping platform-specific arm64 wheels for Apple Silicon. (`#622 <https://github.com/aio-libs/yarl/issues/622>`_)\n- Started shipping platform-specific wheels with the ``musl`` tag targeting typical Alpine Linux runtimes. (`#622 <https://github.com/aio-libs/yarl/issues/622>`_)\n- Added support for Python 3.10. (`#622 <https://github.com/aio-libs/yarl/issues/622>`_)\n\n\n1.6.3 (2020-11-14)\n==================\n\nBugfixes\n--------\n\n- No longer loose characters when decoding incorrect percent-sequences (like ``%e2%82%f8``). All non-decodable percent-sequences are now preserved.\n  `#517 <https://github.com/aio-libs/yarl/issues/517>`_\n- Provide x86 Windows wheels.\n  `#535 <https://github.com/aio-libs/yarl/issues/535>`_\n\n\n----\n\n\n1.6.2 (2020-10-12)\n==================\n\n\nBugfixes\n--------\n\n- Provide generated ``.c`` files in TarBall distribution.\n  `#530  <https://github.com/aio-libs/multidict/issues/530>`_\n\n1.6.1 (2020-10-12)\n==================\n\nFeatures\n--------\n\n- Provide wheels for ``aarch64``, ``i686``, ``ppc64le``, ``s390x`` architectures on\n  Linux as well as ``x86_64``.\n  `#507  <https://github.com/aio-libs/yarl/issues/507>`_\n- Provide wheels for Python 3.9.\n  `#526 <https://github.com/aio-libs/yarl/issues/526>`_\n\nBugfixes\n--------\n\n- ``human_repr()`` now always produces valid representation equivalent to the original URL (if the original URL is valid).\n  `#511 <https://github.com/aio-libs/yarl/issues/511>`_\n- Fixed  requoting a single percent followed by a percent-encoded character in the Cython implementation.\n  `#514 <https://github.com/aio-libs/yarl/issues/514>`_\n- Fix ValueError when decoding ``%`` which is not followed by two hexadecimal digits.\n  `#516 <https://github.com/aio-libs/yarl/issues/516>`_\n- Fix decoding ``%`` followed by a space and hexadecimal digit.\n  `#520 <https://github.com/aio-libs/yarl/issues/520>`_\n- Fix annotation of ``with_query()``/``update_query()`` methods for ``key=[val1, val2]`` case.\n  `#528 <https://github.com/aio-libs/yarl/issues/528>`_\n\nRemoval\n-------\n\n- Drop Python 3.5 support; Python 3.6 is the minimal supported Python version.\n\n\n----\n\n\n1.6.0 (2020-09-23)\n==================\n\nFeatures\n--------\n\n- Allow for int and float subclasses in query, while still denying bool.\n  `#492 <https://github.com/aio-libs/yarl/issues/492>`_\n\n\nBugfixes\n--------\n\n- Do not requote arguments in ``URL.build()``, ``with_xxx()`` and in ``/`` operator.\n  `#502 <https://github.com/aio-libs/yarl/issues/502>`_\n- Keep IPv6 brackets in ``origin()``.\n  `#504 <https://github.com/aio-libs/yarl/issues/504>`_\n\n\n----\n\n\n1.5.1 (2020-08-01)\n==================\n\nBugfixes\n--------\n\n- Fix including relocated internal ``yarl._quoting_c`` C-extension into published PyPI dists.\n  `#485 <https://github.com/aio-libs/yarl/issues/485>`_\n\n\nMisc\n----\n\n- `#484 <https://github.com/aio-libs/yarl/issues/484>`_\n\n\n----\n\n\n1.5.0 (2020-07-26)\n==================\n\nFeatures\n--------\n\n- Convert host to lowercase on URL building.\n  `#386 <https://github.com/aio-libs/yarl/issues/386>`_\n- Allow using ``mod`` operator (``%``) for updating query string (an alias for ``update_query()`` method).\n  `#435 <https://github.com/aio-libs/yarl/issues/435>`_\n- Allow use of sequences such as ``list`` and ``tuple`` in the values\n  of a mapping such as ``dict`` to represent that a key has many values::\n\n      url = URL(\"http://example.com\")\n      assert url.with_query({\"a\": [1, 2]}) == URL(\"http://example.com/?a=1&a=2\")\n\n  `#443 <https://github.com/aio-libs/yarl/issues/443>`_\n- Support ``URL.build()`` with scheme and path (creates a relative URL).\n  `#464 <https://github.com/aio-libs/yarl/issues/464>`_\n- Cache slow IDNA encode/decode calls.\n  `#476 <https://github.com/aio-libs/yarl/issues/476>`_\n- Add ``@final`` / ``Final`` type hints\n  `#477 <https://github.com/aio-libs/yarl/issues/477>`_\n- Support URL authority/raw_authority properties and authority argument of ``URL.build()`` method.\n  `#478 <https://github.com/aio-libs/yarl/issues/478>`_\n- Hide the library implementation details, make the exposed public list very clean.\n  `#483 <https://github.com/aio-libs/yarl/issues/483>`_\n\n\nBugfixes\n--------\n\n- Fix tests with newer Python (3.7.6, 3.8.1 and 3.9.0+).\n  `#409 <https://github.com/aio-libs/yarl/issues/409>`_\n- Fix a bug where query component, passed in a form of mapping or sequence, is unquoted in unexpected way.\n  `#426 <https://github.com/aio-libs/yarl/issues/426>`_\n- Hide ``Query`` and ``QueryVariable`` type aliases in ``__init__.pyi``, now they are prefixed with underscore.\n  `#431 <https://github.com/aio-libs/yarl/issues/431>`_\n- Keep IPv6 brackets after updating port/user/password.\n  `#451 <https://github.com/aio-libs/yarl/issues/451>`_\n\n\n----\n\n\n1.4.2 (2019-12-05)\n==================\n\nFeatures\n--------\n\n- Workaround for missing ``str.isascii()`` in Python 3.6\n  `#389 <https://github.com/aio-libs/yarl/issues/389>`_\n\n\n----\n\n\n1.4.1 (2019-11-29)\n==================\n\n* Fix regression, make the library work on Python 3.5 and 3.6 again.\n\n1.4.0 (2019-11-29)\n==================\n\n* Distinguish an empty password in URL from a password not provided at all (#262)\n\n* Fixed annotations for optional parameters of ``URL.build`` (#309)\n\n* Use None as default value of ``user`` parameter of ``URL.build`` (#309)\n\n* Enforce building C Accelerated modules when installing from source tarball, use\n  ``YARL_NO_EXTENSIONS`` environment variable for falling back to (slower) Pure Python\n  implementation (#329)\n\n* Drop Python 3.5 support\n\n* Fix quoting of plus in path by pure python version (#339)\n\n* Don't create a new URL if fragment is unchanged (#292)\n\n* Included in error message the path that produces starting slash forbidden error (#376)\n\n* Skip slow IDNA encoding for ASCII-only strings (#387)\n\n\n1.3.0 (2018-12-11)\n==================\n\n* Fix annotations for ``query`` parameter (#207)\n\n* An incoming query sequence can have int variables (the same as for\n  Mapping type) (#208)\n\n* Add ``URL.explicit_port`` property (#218)\n\n* Give a friendlier error when port can't be converted to int (#168)\n\n* ``bool(URL())`` now returns ``False`` (#272)\n\n1.2.6 (2018-06-14)\n==================\n\n* Drop Python 3.4 trove classifier (#205)\n\n1.2.5 (2018-05-23)\n==================\n\n* Fix annotations for ``build`` (#199)\n\n1.2.4 (2018-05-08)\n==================\n\n* Fix annotations for ``cached_property`` (#195)\n\n1.2.3 (2018-05-03)\n==================\n\n* Accept ``str`` subclasses in ``URL`` constructor (#190)\n\n1.2.2 (2018-05-01)\n==================\n\n* Fix build\n\n1.2.1 (2018-04-30)\n==================\n\n* Pin minimal required Python to 3.5.3 (#189)\n\n1.2.0 (2018-04-30)\n==================\n\n* Forbid inheritance, replace ``__init__`` with ``__new__`` (#171)\n\n* Support PEP-561 (provide type hinting marker) (#182)\n\n1.1.1 (2018-02-17)\n==================\n\n* Fix performance regression: don't encode empty ``netloc`` (#170)\n\n1.1.0 (2018-01-21)\n==================\n\n* Make pure Python quoter consistent with Cython version (#162)\n\n1.0.0 (2018-01-15)\n==================\n\n* Use fast path if quoted string does not need requoting (#154)\n\n* Speed up quoting/unquoting by ``_Quoter`` and ``_Unquoter`` classes (#155)\n\n* Drop ``yarl.quote`` and ``yarl.unquote`` public functions (#155)\n\n* Add custom string writer, reuse static buffer if available (#157)\n  Code is 50-80 times faster than Pure Python version (was 4-5 times faster)\n\n* Don't recode IP zone (#144)\n\n* Support ``encoded=True`` in ``yarl.URL.build()`` (#158)\n\n* Fix updating query with multiple keys (#160)\n\n0.18.0 (2018-01-10)\n===================\n\n* Fallback to IDNA 2003 if domain name is not IDNA 2008 compatible (#152)\n\n0.17.0 (2017-12-30)\n===================\n\n* Use IDNA 2008 for domain name processing (#149)\n\n0.16.0 (2017-12-07)\n===================\n\n* Fix raising ``TypeError`` by ``url.query_string()`` after\n  ``url.with_query({})`` (empty mapping) (#141)\n\n0.15.0 (2017-11-23)\n===================\n\n* Add ``raw_path_qs`` attribute (#137)\n\n0.14.2 (2017-11-14)\n===================\n\n* Restore ``strict`` parameter as no-op in ``quote`` / ``unquote``\n\n0.14.1 (2017-11-13)\n===================\n\n* Restore ``strict`` parameter as no-op for sake of compatibility with\n  aiohttp 2.2\n\n0.14.0 (2017-11-11)\n===================\n\n* Drop strict mode (#123)\n\n* Fix ``\"ValueError: Unallowed PCT %\"`` when there's a ``\"%\"`` in the URL (#124)\n\n0.13.0 (2017-10-01)\n===================\n\n* Document ``encoded`` parameter (#102)\n\n* Support relative URLs like ``'?key=value'`` (#100)\n\n* Unsafe encoding for QS fixed. Encode ``;`` character in value parameter (#104)\n\n* Process passwords without user names (#95)\n\n0.12.0 (2017-06-26)\n===================\n\n* Properly support paths without leading slash in ``URL.with_path()`` (#90)\n\n* Enable type annotation checks\n\n0.11.0 (2017-06-26)\n===================\n\n* Normalize path (#86)\n\n* Clear query and fragment parts in ``.with_path()`` (#85)\n\n0.10.3 (2017-06-13)\n===================\n\n* Prevent double URL arguments unquoting (#83)\n\n0.10.2 (2017-05-05)\n===================\n\n* Unexpected hash behavior (#75)\n\n\n0.10.1 (2017-05-03)\n===================\n\n* Unexpected compare behavior (#73)\n\n* Do not quote or unquote + if not a query string. (#74)\n\n\n0.10.0 (2017-03-14)\n===================\n\n* Added ``URL.build`` class method (#58)\n\n* Added ``path_qs`` attribute (#42)\n\n\n0.9.8 (2017-02-16)\n==================\n\n* Do not quote ``:`` in path\n\n\n0.9.7 (2017-02-16)\n==================\n\n* Load from pickle without _cache (#56)\n\n* Percent-encoded pluses in path variables become spaces (#59)\n\n\n0.9.6 (2017-02-15)\n==================\n\n* Revert backward incompatible change (BaseURL)\n\n\n0.9.5 (2017-02-14)\n==================\n\n* Fix BaseURL rich comparison support\n\n\n0.9.4 (2017-02-14)\n==================\n\n* Use BaseURL\n\n\n0.9.3 (2017-02-14)\n==================\n\n* Added BaseURL\n\n\n0.9.2 (2017-02-08)\n==================\n\n* Remove debug print\n\n\n0.9.1 (2017-02-07)\n==================\n\n* Do not lose tail chars (#45)\n\n\n0.9.0 (2017-02-07)\n==================\n\n* Allow to quote ``%`` in non strict mode (#21)\n\n* Incorrect parsing of query parameters with %3B (;) inside (#34)\n\n* Fix core dumps (#41)\n\n* ``tmpbuf`` - compiling error (#43)\n\n* Added ``URL.update_path()`` method\n\n* Added ``URL.update_query()`` method (#47)\n\n\n0.8.1 (2016-12-03)\n==================\n\n* Fix broken aiohttp: revert back ``quote`` / ``unquote``.\n\n\n0.8.0 (2016-12-03)\n==================\n\n* Support more verbose error messages in ``.with_query()`` (#24)\n\n* Don't percent-encode ``@`` and ``:`` in path (#32)\n\n* Don't expose ``yarl.quote`` and ``yarl.unquote``, these functions are\n  part of private API\n\n0.7.1 (2016-11-18)\n==================\n\n* Accept not only ``str`` but all classes inherited from ``str`` also (#25)\n\n0.7.0 (2016-11-07)\n==================\n\n* Accept ``int`` as value for ``.with_query()``\n\n0.6.0 (2016-11-07)\n==================\n\n* Explicitly use UTF8 encoding in ``setup.py`` (#20)\n* Properly unquote non-UTF8 strings (#19)\n\n0.5.3 (2016-11-02)\n==================\n\n* Don't use ``typing.NamedTuple`` fields but indexes on URL construction\n\n0.5.2 (2016-11-02)\n==================\n\n* Inline ``_encode`` class method\n\n0.5.1 (2016-11-02)\n==================\n\n* Make URL construction faster by removing extra classmethod calls\n\n0.5.0 (2016-11-02)\n==================\n\n* Add Cython optimization for quoting/unquoting\n* Provide binary wheels\n\n0.4.3 (2016-09-29)\n==================\n\n* Fix typing stubs\n\n0.4.2 (2016-09-29)\n==================\n\n* Expose ``quote()`` and ``unquote()`` as public API\n\n0.4.1 (2016-09-28)\n==================\n\n* Support empty values in query (``'/path?arg'``)\n\n0.4.0 (2016-09-27)\n==================\n\n* Introduce ``relative()`` (#16)\n\n0.3.2 (2016-09-27)\n==================\n\n* Typo fixes #15\n\n0.3.1 (2016-09-26)\n==================\n\n* Support sequence of pairs as ``with_query()`` parameter\n\n0.3.0 (2016-09-26)\n==================\n\n* Introduce ``is_default_port()``\n\n0.2.1 (2016-09-26)\n==================\n\n* Raise ValueError for URLs like 'http://:8080/'\n\n0.2.0 (2016-09-18)\n==================\n\n* Avoid doubling slashes when joining paths (#13)\n\n* Appending path starting from slash is forbidden (#12)\n\n0.1.4 (2016-09-09)\n==================\n\n* Add ``kwargs`` support for ``with_query()`` (#10)\n\n0.1.3 (2016-09-07)\n==================\n\n* Document ``with_query()``, ``with_fragment()`` and ``origin()``\n\n* Allow ``None`` for ``with_query()`` and ``with_fragment()``\n\n0.1.2 (2016-09-07)\n==================\n\n* Fix links, tune docs theme.\n\n0.1.1 (2016-09-06)\n==================\n\n* Update README, old version used obsolete API\n\n0.1.0 (2016-09-06)\n==================\n\n* The library was deeply refactored, bytes are gone away but all\n  accepted strings are encoded if needed.\n\n0.0.1 (2016-08-30)\n==================\n\n* The first release.\n",
        "description_content_type": "text/x-rst",
        "keywords": [
          "cython",
          "cext",
          "yarl"
        ],
        "home_page": "https://github.com/aio-libs/yarl",
        "author": "Andrew Svetlov",
        "author_email": "andrew.svetlov@gmail.com",
        "maintainer": "aiohttp team <team@aiohttp.org>",
        "maintainer_email": "team@aiohttp.org",
        "license": "Apache-2.0",
        "license_file": [
          "LICENSE",
          "NOTICE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "Programming Language :: Cython",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Topic :: Internet :: WWW/HTTP",
          "Topic :: Software Development :: Libraries :: Python Modules"
        ],
        "requires_dist": [
          "idna>=2.0",
          "multidict>=4.0",
          "propcache>=0.2.1"
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org",
          "Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org",
          "CI: GitHub Workflows, https://github.com/aio-libs/yarl/actions?query=branch:master",
          "Code of Conduct, https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md",
          "Coverage: codecov, https://codecov.io/github/aio-libs/yarl",
          "Docs: Changelog, https://yarl.aio-libs.org/en/latest/changes/",
          "Docs: RTD, https://yarl.aio-libs.org",
          "GitHub: issues, https://github.com/aio-libs/yarl/issues",
          "GitHub: repo, https://github.com/aio-libs/yarl"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/yarl-1.24.2.dist-info",
      "installer": "pip",
      "requested": false
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "aiohappyeyeballs",
        "version": "2.7.1",
        "summary": "Happy Eyeballs for asyncio",
        "description": "# aiohappyeyeballs\n\n<p align=\"center\">\n  <a href=\"https://github.com/aio-libs/aiohappyeyeballs/actions/workflows/ci.yml?query=branch%3Amain\">\n    <img src=\"https://img.shields.io/github/actions/workflow/status/aio-libs/aiohappyeyeballs/ci-cd.yml?branch=main&label=CI&logo=github&style=flat-square\" alt=\"CI Status\" >\n  </a>\n  <a href=\"https://aiohappyeyeballs.readthedocs.io\">\n    <img src=\"https://img.shields.io/readthedocs/aiohappyeyeballs.svg?logo=read-the-docs&logoColor=fff&style=flat-square\" alt=\"Documentation Status\">\n  </a>\n  <a href=\"https://codecov.io/gh/aio-libs/aiohappyeyeballs\">\n    <img src=\"https://img.shields.io/codecov/c/github/aio-libs/aiohappyeyeballs.svg?logo=codecov&logoColor=fff&style=flat-square\" alt=\"Test coverage percentage\">\n  </a>\n</p>\n<p align=\"center\">\n  <a href=\"https://python-poetry.org/\">\n    <img src=\"https://img.shields.io/badge/packaging-poetry-299bd7?style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAASCAYAAABrXO8xAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAJJSURBVHgBfZLPa1NBEMe/s7tNXoxW1KJQKaUHkXhQvHgW6UHQQ09CBS/6V3hKc/AP8CqCrUcpmop3Cx48eDB4yEECjVQrlZb80CRN8t6OM/teagVxYZi38+Yz853dJbzoMV3MM8cJUcLMSUKIE8AzQ2PieZzFxEJOHMOgMQQ+dUgSAckNXhapU/NMhDSWLs1B24A8sO1xrN4NECkcAC9ASkiIJc6k5TRiUDPhnyMMdhKc+Zx19l6SgyeW76BEONY9exVQMzKExGKwwPsCzza7KGSSWRWEQhyEaDXp6ZHEr416ygbiKYOd7TEWvvcQIeusHYMJGhTwF9y7sGnSwaWyFAiyoxzqW0PM/RjghPxF2pWReAowTEXnDh0xgcLs8l2YQmOrj3N7ByiqEoH0cARs4u78WgAVkoEDIDoOi3AkcLOHU60RIg5wC4ZuTC7FaHKQm8Hq1fQuSOBvX/sodmNJSB5geaF5CPIkUeecdMxieoRO5jz9bheL6/tXjrwCyX/UYBUcjCaWHljx1xiX6z9xEjkYAzbGVnB8pvLmyXm9ep+W8CmsSHQQY77Zx1zboxAV0w7ybMhQmfqdmmw3nEp1I0Z+FGO6M8LZdoyZnuzzBdjISicKRnpxzI9fPb+0oYXsNdyi+d3h9bm9MWYHFtPeIZfLwzmFDKy1ai3p+PDls1Llz4yyFpferxjnyjJDSEy9CaCx5m2cJPerq6Xm34eTrZt3PqxYO1XOwDYZrFlH1fWnpU38Y9HRze3lj0vOujZcXKuuXm3jP+s3KbZVra7y2EAAAAAASUVORK5CYII=\" alt=\"Poetry\">\n  </a>\n  <a href=\"https://github.com/astral-sh/ruff\">\n    <img src=\"https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json\" alt=\"Ruff\">\n  </a>\n  <a href=\"https://github.com/pre-commit/pre-commit\">\n    <img src=\"https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=flat-square\" alt=\"pre-commit\">\n  </a>\n</p>\n<p align=\"center\">\n  <a href=\"https://pypi.org/project/aiohappyeyeballs/\">\n    <img src=\"https://img.shields.io/pypi/v/aiohappyeyeballs.svg?logo=python&logoColor=fff&style=flat-square\" alt=\"PyPI Version\">\n  </a>\n  <img src=\"https://img.shields.io/pypi/pyversions/aiohappyeyeballs.svg?style=flat-square&logo=python&amp;logoColor=fff\" alt=\"Supported Python versions\">\n  <img src=\"https://img.shields.io/pypi/l/aiohappyeyeballs.svg?style=flat-square\" alt=\"License\">\n</p>\n\n---\n\n**Documentation**: <a href=\"https://aiohappyeyeballs.readthedocs.io\" target=\"_blank\">https://aiohappyeyeballs.readthedocs.io </a>\n\n**Source Code**: <a href=\"https://github.com/aio-libs/aiohappyeyeballs\" target=\"_blank\">https://github.com/aio-libs/aiohappyeyeballs </a>\n\n---\n\n[Happy Eyeballs](https://en.wikipedia.org/wiki/Happy_Eyeballs)\n([RFC 8305](https://www.rfc-editor.org/rfc/rfc8305.html))\n\n## Use case\n\nThis library exists to allow connecting with\n[Happy Eyeballs](https://en.wikipedia.org/wiki/Happy_Eyeballs)\n([RFC 8305](https://www.rfc-editor.org/rfc/rfc8305.html))\nwhen you\nalready have a list of addrinfo and not a DNS name.\n\nThe stdlib version of `loop.create_connection()`\nwill only work when you pass in an unresolved name which\nis not a good fit when using DNS caching or resolving\nnames via another method such as `zeroconf`.\n\n## Installation\n\nInstall this via pip (or your favourite package manager):\n\n`pip install aiohappyeyeballs`\n\n## License\n\n[aiohappyeyeballs is licensed under the same terms as cpython itself.](https://github.com/python/cpython/blob/main/LICENSE)\n\n## Example usage\n\n```python\n\naddr_infos = await loop.getaddrinfo(\"example.org\", 80)\n\nsocket = await start_connection(addr_infos)\nsocket = await start_connection(addr_infos, local_addr_infos=local_addr_infos, happy_eyeballs_delay=0.2)\n\ntransport, protocol = await loop.create_connection(\n    MyProtocol, sock=socket, ...)\n\n# Remove the first address for each family from addr_info\npop_addr_infos_interleave(addr_info, 1)\n\n# Remove all matching address from addr_info\nremove_addr_infos(addr_info, \"dead::beef::\")\n\n# Convert a local_addr to local_addr_infos\nlocal_addr_infos = addr_to_addr_infos((\"127.0.0.1\",0))\n```\n\n## Credits\n\nThis package contains code from cpython and is licensed under the same terms as cpython itself.\n\nThis package was created with\n[Copier](https://copier.readthedocs.io/) and the\n[browniebroke/pypackage-template](https://github.com/browniebroke/pypackage-template)\nproject template.\n\n",
        "description_content_type": "text/markdown",
        "author": "J. Nick Koston",
        "author_email": "nick@koston.org",
        "license": "PSF-2.0",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "Natural Language :: English",
          "Operating System :: OS Independent",
          "Topic :: Software Development :: Libraries",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "License :: OSI Approved :: Python Software Foundation License"
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Bug Tracker, https://github.com/aio-libs/aiohappyeyeballs/issues",
          "Changelog, https://github.com/aio-libs/aiohappyeyeballs/blob/main/CHANGELOG.md",
          "Documentation, https://aiohappyeyeballs.readthedocs.io",
          "Repository, https://github.com/aio-libs/aiohappyeyeballs"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/aiohappyeyeballs-2.7.1.dist-info",
      "installer": "pip",
      "requested": false
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "typing_extensions",
        "version": "4.15.0",
        "summary": "Backported and Experimental Type Hints for Python 3.9+",
        "description": "# Typing Extensions\n\n[![Chat at https://gitter.im/python/typing](https://badges.gitter.im/python/typing.svg)](https://gitter.im/python/typing)\n\n[Documentation](https://typing-extensions.readthedocs.io/en/latest/#) –\n[PyPI](https://pypi.org/project/typing-extensions/)\n\n## Overview\n\nThe `typing_extensions` module serves two related purposes:\n\n- Enable use of new type system features on older Python versions. For example,\n  `typing.TypeGuard` is new in Python 3.10, but `typing_extensions` allows\n  users on previous Python versions to use it too.\n- Enable experimentation with new type system PEPs before they are accepted and\n  added to the `typing` module.\n\n`typing_extensions` is treated specially by static type checkers such as\nmypy and pyright. Objects defined in `typing_extensions` are treated the same\nway as equivalent forms in `typing`.\n\n`typing_extensions` uses\n[Semantic Versioning](https://semver.org/). The\nmajor version will be incremented only for backwards-incompatible changes.\nTherefore, it's safe to depend\non `typing_extensions` like this: `typing_extensions ~=x.y`,\nwhere `x.y` is the first version that includes all features you need.\n[This](https://packaging.python.org/en/latest/specifications/version-specifiers/#compatible-release)\nis equivalent to `typing_extensions >=x.y, <(x+1)`. Do not depend on `~= x.y.z`\nunless you really know what you're doing; that defeats the purpose of\nsemantic versioning.\n\n## Included items\n\nSee [the documentation](https://typing-extensions.readthedocs.io/en/latest/#) for a\ncomplete listing of module contents.\n\n## Contributing\n\nSee [CONTRIBUTING.md](https://github.com/python/typing_extensions/blob/main/CONTRIBUTING.md)\nfor how to contribute to `typing_extensions`.\n\n",
        "description_content_type": "text/markdown",
        "keywords": [
          "annotations",
          "backport",
          "checker",
          "checking",
          "function",
          "hinting",
          "hints",
          "type",
          "typechecking",
          "typehinting",
          "typehints",
          "typing"
        ],
        "author_email": "\"Guido van Rossum, Jukka Lehtosalo, Łukasz Langa, Michael Lee\" <levkivskyi@gmail.com>",
        "license_expression": "PSF-2.0",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Environment :: Console",
          "Intended Audience :: Developers",
          "Operating System :: OS Independent",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Topic :: Software Development"
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Bug Tracker, https://github.com/python/typing_extensions/issues",
          "Changes, https://github.com/python/typing_extensions/blob/main/CHANGELOG.md",
          "Documentation, https://typing-extensions.readthedocs.io/",
          "Home, https://github.com/python/typing_extensions",
          "Q & A, https://github.com/python/typing/discussions",
          "Repository, https://github.com/python/typing_extensions"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.2",
        "name": "websockets",
        "version": "15.0.1",
        "dynamic": [
          "description",
          "description-content-type"
        ],
        "summary": "An implementation of the WebSocket Protocol (RFC 6455 & 7692)",
        "description": ".. image:: logo/horizontal.svg\n   :width: 480px\n   :alt: websockets\n\n|licence| |version| |pyversions| |tests| |docs| |openssf|\n\n.. |licence| image:: https://img.shields.io/pypi/l/websockets.svg\n    :target: https://pypi.python.org/pypi/websockets\n\n.. |version| image:: https://img.shields.io/pypi/v/websockets.svg\n    :target: https://pypi.python.org/pypi/websockets\n\n.. |pyversions| image:: https://img.shields.io/pypi/pyversions/websockets.svg\n    :target: https://pypi.python.org/pypi/websockets\n\n.. |tests| image:: https://img.shields.io/github/checks-status/python-websockets/websockets/main?label=tests\n   :target: https://github.com/python-websockets/websockets/actions/workflows/tests.yml\n\n.. |docs| image:: https://img.shields.io/readthedocs/websockets.svg\n   :target: https://websockets.readthedocs.io/\n\n.. |openssf| image:: https://bestpractices.coreinfrastructure.org/projects/6475/badge\n   :target: https://bestpractices.coreinfrastructure.org/projects/6475\n\nWhat is ``websockets``?\n-----------------------\n\nwebsockets is a library for building WebSocket_ servers and clients in Python\nwith a focus on correctness, simplicity, robustness, and performance.\n\n.. _WebSocket: https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API\n\nBuilt on top of ``asyncio``, Python's standard asynchronous I/O framework, the\ndefault implementation provides an elegant coroutine-based API.\n\nAn implementation on top of ``threading`` and a Sans-I/O implementation are also\navailable.\n\n`Documentation is available on Read the Docs. <https://websockets.readthedocs.io/>`_\n\n.. copy-pasted because GitHub doesn't support the include directive\n\nHere's an echo server with the ``asyncio`` API:\n\n.. code:: python\n\n    #!/usr/bin/env python\n\n    import asyncio\n    from websockets.asyncio.server import serve\n\n    async def echo(websocket):\n        async for message in websocket:\n            await websocket.send(message)\n\n    async def main():\n        async with serve(echo, \"localhost\", 8765) as server:\n            await server.serve_forever()\n\n    asyncio.run(main())\n\nHere's how a client sends and receives messages with the ``threading`` API:\n\n.. code:: python\n\n    #!/usr/bin/env python\n\n    from websockets.sync.client import connect\n\n    def hello():\n        with connect(\"ws://localhost:8765\") as websocket:\n            websocket.send(\"Hello world!\")\n            message = websocket.recv()\n            print(f\"Received: {message}\")\n\n    hello()\n\n\nDoes that look good?\n\n`Get started with the tutorial! <https://websockets.readthedocs.io/en/stable/intro/index.html>`_\n\nWhy should I use ``websockets``?\n--------------------------------\n\nThe development of ``websockets`` is shaped by four principles:\n\n1. **Correctness**: ``websockets`` is heavily tested for compliance with\n   :rfc:`6455`. Continuous integration fails under 100% branch coverage.\n\n2. **Simplicity**: all you need to understand is ``msg = await ws.recv()`` and\n   ``await ws.send(msg)``. ``websockets`` takes care of managing connections\n   so you can focus on your application.\n\n3. **Robustness**: ``websockets`` is built for production. For example, it was\n   the only library to `handle backpressure correctly`_ before the issue\n   became widely known in the Python community.\n\n4. **Performance**: memory usage is optimized and configurable. A C extension\n   accelerates expensive operations. It's pre-compiled for Linux, macOS and\n   Windows and packaged in the wheel format for each system and Python version.\n\nDocumentation is a first class concern in the project. Head over to `Read the\nDocs`_ and see for yourself.\n\n.. _Read the Docs: https://websockets.readthedocs.io/\n.. _handle backpressure correctly: https://vorpus.org/blog/some-thoughts-on-asynchronous-api-design-in-a-post-asyncawait-world/#websocket-servers\n\nWhy shouldn't I use ``websockets``?\n-----------------------------------\n\n* If you prefer callbacks over coroutines: ``websockets`` was created to\n  provide the best coroutine-based API to manage WebSocket connections in\n  Python. Pick another library for a callback-based API.\n\n* If you're looking for a mixed HTTP / WebSocket library: ``websockets`` aims\n  at being an excellent implementation of :rfc:`6455`: The WebSocket Protocol\n  and :rfc:`7692`: Compression Extensions for WebSocket. Its support for HTTP\n  is minimal — just enough for an HTTP health check.\n\n  If you want to do both in the same server, look at HTTP + WebSocket servers\n  that build on top of ``websockets`` to support WebSocket connections, like\n  uvicorn_ or Sanic_.\n\n.. _uvicorn: https://www.uvicorn.org/\n.. _Sanic: https://sanic.dev/en/\n\nWhat else?\n----------\n\nBug reports, patches and suggestions are welcome!\n\nTo report a security vulnerability, please use the `Tidelift security\ncontact`_. Tidelift will coordinate the fix and disclosure.\n\n.. _Tidelift security contact: https://tidelift.com/security\n\nFor anything else, please open an issue_ or send a `pull request`_.\n\n.. _issue: https://github.com/python-websockets/websockets/issues/new\n.. _pull request: https://github.com/python-websockets/websockets/compare/\n\nParticipants must uphold the `Contributor Covenant code of conduct`_.\n\n.. _Contributor Covenant code of conduct: https://github.com/python-websockets/websockets/blob/main/CODE_OF_CONDUCT.md\n\n``websockets`` is released under the `BSD license`_.\n\n.. _BSD license: https://github.com/python-websockets/websockets/blob/main/LICENSE\n",
        "description_content_type": "text/x-rst",
        "keywords": [
          "WebSocket"
        ],
        "author_email": "Aymeric Augustin <aymeric.augustin@m4x.org>",
        "license": "BSD-3-Clause",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Environment :: Web Environment",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: BSD License",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13"
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Homepage, https://github.com/python-websockets/websockets",
          "Changelog, https://websockets.readthedocs.io/en/stable/project/changelog.html",
          "Documentation, https://websockets.readthedocs.io/",
          "Funding, https://tidelift.com/subscription/pkg/pypi-websockets?utm_source=pypi-websockets&utm_medium=referral&utm_campaign=readme",
          "Tracker, https://github.com/python-websockets/websockets/issues"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/websockets-15.0.1.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "markdown-it-py",
        "version": "4.0.0",
        "summary": "Python port of markdown-it. Markdown parsing, done right!",
        "description": "# markdown-it-py\n\n[![Github-CI][github-ci]][github-link]\n[![Coverage Status][codecov-badge]][codecov-link]\n[![PyPI][pypi-badge]][pypi-link]\n[![Conda][conda-badge]][conda-link]\n[![PyPI - Downloads][install-badge]][install-link]\n\n<p align=\"center\">\n  <img alt=\"markdown-it-py icon\" src=\"https://raw.githubusercontent.com/executablebooks/markdown-it-py/master/docs/_static/markdown-it-py.svg\">\n</p>\n\n> Markdown parser done right.\n\n- Follows the __[CommonMark spec](http://spec.commonmark.org/)__ for baseline parsing\n- Configurable syntax: you can add new rules and even replace existing ones.\n- Pluggable: Adds syntax extensions to extend the parser (see the [plugin list][md-plugins]).\n- High speed (see our [benchmarking tests][md-performance])\n- Easy to configure for [security][md-security]\n- Member of [Google's Assured Open Source Software](https://cloud.google.com/assured-open-source-software/docs/supported-packages)\n\nThis is a Python port of [markdown-it], and some of its associated plugins.\nFor more details see: <https://markdown-it-py.readthedocs.io>.\n\nFor details on [markdown-it] itself, see:\n\n- The __[Live demo](https://markdown-it.github.io)__\n- [The markdown-it README][markdown-it-readme]\n\n**See also:** [markdown-it-pyrs](https://github.com/chrisjsewell/markdown-it-pyrs) for an experimental Rust binding,\nfor even more speed!\n\n## Installation\n\n### PIP\n\n```bash\npip install markdown-it-py[plugins]\n```\n\nor with extras\n\n```bash\npip install markdown-it-py[linkify,plugins]\n```\n\n### Conda\n\n```bash\nconda install -c conda-forge markdown-it-py\n```\n\nor with extras\n\n```bash\nconda install -c conda-forge markdown-it-py linkify-it-py mdit-py-plugins\n```\n\n## Usage\n\n### Python API Usage\n\nRender markdown to HTML with markdown-it-py and a custom configuration\nwith and without plugins and features:\n\n```python\nfrom markdown_it import MarkdownIt\nfrom mdit_py_plugins.front_matter import front_matter_plugin\nfrom mdit_py_plugins.footnote import footnote_plugin\n\nmd = (\n    MarkdownIt('commonmark', {'breaks':True,'html':True})\n    .use(front_matter_plugin)\n    .use(footnote_plugin)\n    .enable('table')\n)\ntext = (\"\"\"\n---\na: 1\n---\n\na | b\n- | -\n1 | 2\n\nA footnote [^1]\n\n[^1]: some details\n\"\"\")\ntokens = md.parse(text)\nhtml_text = md.render(text)\n\n## To export the html to a file, uncomment the lines below:\n# from pathlib import Path\n# Path(\"output.html\").write_text(html_text)\n```\n\n### Command-line Usage\n\nRender markdown to HTML with markdown-it-py from the\ncommand-line:\n\n```console\nusage: markdown-it [-h] [-v] [filenames [filenames ...]]\n\nParse one or more markdown files, convert each to HTML, and print to stdout\n\npositional arguments:\n  filenames      specify an optional list of files to convert\n\noptional arguments:\n  -h, --help     show this help message and exit\n  -v, --version  show program's version number and exit\n\nInteractive:\n\n  $ markdown-it\n  markdown-it-py [version 0.0.0] (interactive)\n  Type Ctrl-D to complete input, or Ctrl-C to exit.\n  >>> # Example\n  ... > markdown *input*\n  ...\n  <h1>Example</h1>\n  <blockquote>\n  <p>markdown <em>input</em></p>\n  </blockquote>\n\nBatch:\n\n  $ markdown-it README.md README.footer.md > index.html\n\n```\n\n## References / Thanks\n\nBig thanks to the authors of [markdown-it]:\n\n- Alex Kocharin [github/rlidwka](https://github.com/rlidwka)\n- Vitaly Puzrin [github/puzrin](https://github.com/puzrin)\n\nAlso [John MacFarlane](https://github.com/jgm) for his work on the CommonMark spec and reference implementations.\n\n[github-ci]: https://github.com/executablebooks/markdown-it-py/actions/workflows/tests.yml/badge.svg?branch=master\n[github-link]: https://github.com/executablebooks/markdown-it-py\n[pypi-badge]: https://img.shields.io/pypi/v/markdown-it-py.svg\n[pypi-link]: https://pypi.org/project/markdown-it-py\n[conda-badge]: https://anaconda.org/conda-forge/markdown-it-py/badges/version.svg\n[conda-link]: https://anaconda.org/conda-forge/markdown-it-py\n[codecov-badge]: https://codecov.io/gh/executablebooks/markdown-it-py/branch/master/graph/badge.svg\n[codecov-link]: https://codecov.io/gh/executablebooks/markdown-it-py\n[install-badge]: https://img.shields.io/pypi/dw/markdown-it-py?label=pypi%20installs\n[install-link]: https://pypistats.org/packages/markdown-it-py\n\n[CommonMark spec]: http://spec.commonmark.org/\n[markdown-it]: https://github.com/markdown-it/markdown-it\n[markdown-it-readme]: https://github.com/markdown-it/markdown-it/blob/master/README.md\n[md-security]: https://markdown-it-py.readthedocs.io/en/latest/security.html\n[md-performance]: https://markdown-it-py.readthedocs.io/en/latest/performance.html\n[md-plugins]: https://markdown-it-py.readthedocs.io/en/latest/plugins.html\n\n",
        "description_content_type": "text/markdown",
        "keywords": [
          "markdown",
          "lexer",
          "parser",
          "commonmark",
          "markdown-it"
        ],
        "author_email": "Chris Sewell <chrisj_sewell@hotmail.com>",
        "license_file": [
          "LICENSE",
          "LICENSE.markdown-it"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: MIT License",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Topic :: Text Processing :: Markup"
        ],
        "requires_dist": [
          "mdurl~=0.1",
          "psutil ; extra == \"benchmarking\"",
          "pytest ; extra == \"benchmarking\"",
          "pytest-benchmark ; extra == \"benchmarking\"",
          "commonmark~=0.9 ; extra == \"compare\"",
          "markdown~=3.4 ; extra == \"compare\"",
          "mistletoe~=1.0 ; extra == \"compare\"",
          "mistune~=3.0 ; extra == \"compare\"",
          "panflute~=2.3 ; extra == \"compare\"",
          "markdown-it-pyrs ; extra == \"compare\"",
          "linkify-it-py>=1,<3 ; extra == \"linkify\"",
          "mdit-py-plugins>=0.5.0 ; extra == \"plugins\"",
          "gprof2dot ; extra == \"profiling\"",
          "mdit-py-plugins>=0.5.0 ; extra == \"rtd\"",
          "myst-parser ; extra == \"rtd\"",
          "pyyaml ; extra == \"rtd\"",
          "sphinx ; extra == \"rtd\"",
          "sphinx-copybutton ; extra == \"rtd\"",
          "sphinx-design ; extra == \"rtd\"",
          "sphinx-book-theme~=1.0 ; extra == \"rtd\"",
          "jupyter_sphinx ; extra == \"rtd\"",
          "ipykernel ; extra == \"rtd\"",
          "coverage ; extra == \"testing\"",
          "pytest ; extra == \"testing\"",
          "pytest-cov ; extra == \"testing\"",
          "pytest-regressions ; extra == \"testing\"",
          "requests ; extra == \"testing\""
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Documentation, https://markdown-it-py.readthedocs.io",
          "Homepage, https://github.com/executablebooks/markdown-it-py"
        ],
        "provides_extra": [
          "benchmarking",
          "compare",
          "linkify",
          "plugins",
          "profiling",
          "rtd",
          "testing"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/markdown_it_py-4.0.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "uvloop",
        "version": "0.22.1",
        "dynamic": [
          "license-file"
        ],
        "summary": "Fast implementation of asyncio event loop on top of libuv",
        "description": ".. image:: https://img.shields.io/github/actions/workflow/status/MagicStack/uvloop/tests.yml?branch=master\n    :target: https://github.com/MagicStack/uvloop/actions/workflows/tests.yml?query=branch%3Amaster\n\n.. image:: https://img.shields.io/pypi/v/uvloop.svg\n    :target: https://pypi.python.org/pypi/uvloop\n\n.. image:: https://pepy.tech/badge/uvloop\n    :target: https://pepy.tech/project/uvloop\n    :alt: PyPI - Downloads\n\n\nuvloop is a fast, drop-in replacement of the built-in asyncio\nevent loop.  uvloop is implemented in Cython and uses libuv\nunder the hood.\n\nThe project documentation can be found\n`here <http://uvloop.readthedocs.org/>`_.  Please also check out the\n`wiki <https://github.com/MagicStack/uvloop/wiki>`_.\n\n\nPerformance\n-----------\n\nuvloop makes asyncio 2-4x faster.\n\n.. image:: https://raw.githubusercontent.com/MagicStack/uvloop/master/performance.png\n    :target: http://magic.io/blog/uvloop-blazing-fast-python-networking/\n\nThe above chart shows the performance of an echo server with different\nmessage sizes.  The *sockets* benchmark uses ``loop.sock_recv()`` and\n``loop.sock_sendall()`` methods; the *streams* benchmark uses asyncio\nhigh-level streams, created by the ``asyncio.start_server()`` function;\nand the *protocol* benchmark uses ``loop.create_server()`` with a simple\necho protocol.  Read more about uvloop in a\n`blog post <http://magic.io/blog/uvloop-blazing-fast-python-networking/>`_\nabout it.\n\n\nInstallation\n------------\n\nuvloop requires Python 3.8 or greater and is available on PyPI.\nUse pip to install it::\n\n    $ pip install uvloop\n\nNote that it is highly recommended to **upgrade pip before** installing\nuvloop with::\n\n    $ pip install -U pip\n\n\nUsing uvloop\n------------\n\nAs of uvloop 0.18, the preferred way of using it is via the\n``uvloop.run()`` helper function:\n\n\n.. code:: python\n\n    import uvloop\n\n    async def main():\n        # Main entry-point.\n        ...\n\n    uvloop.run(main())\n\n``uvloop.run()`` works by simply configuring ``asyncio.run()``\nto use uvloop, passing all of the arguments to it, such as ``debug``,\ne.g. ``uvloop.run(main(), debug=True)``.\n\nWith Python 3.11 and earlier the following alternative\nsnippet can be used:\n\n.. code:: python\n\n    import asyncio\n    import sys\n\n    import uvloop\n\n    async def main():\n        # Main entry-point.\n        ...\n\n    if sys.version_info >= (3, 11):\n        with asyncio.Runner(loop_factory=uvloop.new_event_loop) as runner:\n            runner.run(main())\n    else:\n        uvloop.install()\n        asyncio.run(main())\n\n\nBuilding From Source\n--------------------\n\nTo build uvloop, you'll need Python 3.8 or greater:\n\n1. Clone the repository:\n\n   .. code::\n\n    $ git clone --recursive git@github.com:MagicStack/uvloop.git\n    $ cd uvloop\n\n2. Create a virtual environment and activate it:\n\n   .. code::\n\n    $ python3 -m venv uvloop-dev\n    $ source uvloop-dev/bin/activate\n\n3. Install development dependencies:\n\n   ..  code::\n\n    $ pip install -e .[dev]\n\n4. Build and run tests:\n\n   .. code::\n\n    $ make\n    $ make test\n\n\nLicense\n-------\n\nuvloop is dual-licensed under MIT and Apache 2.0 licenses.\n",
        "description_content_type": "text/x-rst",
        "keywords": [
          "asyncio",
          "networking"
        ],
        "author_email": "Yury Selivanov <yury@magic.io>",
        "license": "MIT License",
        "license_file": [
          "LICENSE-APACHE",
          "LICENSE-MIT"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Framework :: AsyncIO",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: Apache Software License",
          "License :: OSI Approved :: MIT License",
          "Operating System :: POSIX",
          "Operating System :: MacOS :: MacOS X",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: Implementation :: CPython",
          "Topic :: System :: Networking"
        ],
        "requires_dist": [
          "aiohttp>=3.10.5; extra == \"test\"",
          "flake8~=6.1; extra == \"test\"",
          "psutil; extra == \"test\"",
          "pycodestyle~=2.11.0; extra == \"test\"",
          "pyOpenSSL~=25.3.0; extra == \"test\"",
          "mypy>=0.800; extra == \"test\"",
          "setuptools>=60; extra == \"dev\"",
          "Cython~=3.0; extra == \"dev\"",
          "Sphinx~=4.1.2; extra == \"docs\"",
          "sphinxcontrib-asyncio~=0.3.0; extra == \"docs\"",
          "sphinx_rtd_theme~=0.5.2; extra == \"docs\""
        ],
        "requires_python": ">=3.8.1",
        "project_url": [
          "github, https://github.com/MagicStack/uvloop"
        ],
        "provides_extra": [
          "test",
          "dev",
          "docs"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/uvloop-0.22.1.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "pathspec",
        "version": "1.1.1",
        "summary": "Utility library for gitignore style pattern matching of file paths.",
        "description": "\nPathSpec\n========\n\n*pathspec* is a utility library for pattern matching of file paths. So far this\nonly includes Git's `gitignore`_ pattern matching.\n\n.. _`gitignore`: http://git-scm.com/docs/gitignore\n\n\nTutorial\n--------\n\nSay you have a \"Projects\" directory and you want to back it up, but only\ncertain files, and ignore others depending on certain conditions::\n\n\t>>> from pathspec import PathSpec\n\t>>> # The gitignore-style patterns for files to select, but we're including\n\t>>> # instead of ignoring.\n\t>>> spec_text = \"\"\"\n\t...\n\t... # This is a comment because the line begins with a hash: \"#\"\n\t...\n\t... # Include several project directories (and all descendants) relative to\n\t... # the current directory. To reference only a directory you must end with a\n\t... # slash: \"/\"\n\t... /project-a/\n\t... /project-b/\n\t... /project-c/\n\t...\n\t... # Patterns can be negated by prefixing with exclamation mark: \"!\"\n\t...\n\t... # Ignore temporary files beginning or ending with \"~\" and ending with\n\t... # \".swp\".\n\t... !~*\n\t... !*~\n\t... !*.swp\n\t...\n\t... # These are python projects so ignore compiled python files from\n\t... # testing.\n\t... !*.pyc\n\t...\n\t... # Ignore the build directories but only directly under the project\n\t... # directories.\n\t... !/*/build/\n\t...\n\t... \"\"\"\n\nThe ``PathSpec`` class provides an abstraction around pattern implementations,\nand we want to compile our patterns as \"gitignore\" patterns. You could call it a\nwrapper for a list of compiled patterns::\n\n\t>>> spec = PathSpec.from_lines('gitignore', spec_text.splitlines())\n\nIf we wanted to manually compile the patterns, we can use the ``GitIgnoreBasicPattern``\nclass directly. It is used in the background for \"gitignore\" which internally\nconverts patterns to regular expressions::\n\n\t>>> from pathspec.patterns.gitignore.basic import GitIgnoreBasicPattern\n\t>>> patterns = map(GitIgnoreBasicPattern, spec_text.splitlines())\n\t>>> spec = PathSpec(patterns)\n\n``PathSpec.from_lines()`` is a class method which simplifies that.\n\nIf you want to load the patterns from file, you can pass the file object\ndirectly as well::\n\n\t>>> with open('patterns.list', 'r') as fh:\n\t>>>     spec = PathSpec.from_lines('gitignore', fh)\n\nYou can perform matching on a whole directory tree with::\n\n\t>>> matches = set(spec.match_tree_files('path/to/directory'))\n\nOr you can perform matching on a specific set of file paths with::\n\n\t>>> matches = set(spec.match_files(file_paths))\n\nOr check to see if an individual file matches::\n\n\t>>> is_matched = spec.match_file(file_path)\n\nThere's actually two implementations of \"gitignore\". The basic implementation is\nused by ``PathSpec`` and follows patterns as documented by `gitignore`_.\nHowever, Git's behavior differs from the documented patterns. There's some\nedge-cases, and in particular, Git allows including files from excluded\ndirectories which appears to contradict the documentation. ``GitIgnoreSpec``\nhandles these cases to more closely replicate Git's behavior::\n\n\t>>> from pathspec import GitIgnoreSpec\n\t>>> spec = GitIgnoreSpec.from_lines(spec_text.splitlines())\n\nYou do not specify the style of pattern for ``GitIgnoreSpec`` because it should\nalways use ``GitIgnoreSpecPattern`` internally.\n\n\nPerformance\n-----------\n\nRunning lots of regular expression matches against thousands of files in Python\nis slow. Alternate regular expression backends can be used to improve\nperformance. ``PathSpec`` and ``GitIgnoreSpec`` both accept a ``backend``\nparameter to control the backend. The default is \"best\" to automatically choose\nthe best available backend. There are currently 3 backends.\n\nThe \"simple\" backend is the default and it simply uses Python's ``re.Pattern``\nobjects that are normally created. This can be the fastest when there's only 1\nor 2 patterns.\n\nThe \"hyperscan\" backend uses the `hyperscan`_ library. Hyperscan tends to be at\nleast 2 times faster than \"simple\", and generally slower than \"re2\". This can be\nfaster than \"re2\" under the right conditions with pattern counts of 1-25.\n\nThe \"re2\" backend uses the `google-re2`_ library (not to be confused with the\n*re2* library on PyPI which is unrelated and abandoned). Google's re2 tends to\nbe significantly faster than \"simple\", and 3 times faster than \"hyperscan\" at\nhigh pattern counts.\n\nSee `benchmarks_backends.md`_ for comparisons between native Python regular\nexpressions and the optional backends.\n\n\n.. _`benchmarks_backends.md`: https://github.com/cpburnz/python-pathspec/blob/master/benchmarks_backends.md\n.. _`google-re2`: https://pypi.org/project/google-re2/\n.. _`hyperscan`: https://pypi.org/project/hyperscan/\n\n\nFAQ\n---\n\n\n1. How do I ignore files like *.gitignore*?\n+++++++++++++++++++++++++++++++++++++++++++\n\n``GitIgnoreSpec`` (and ``PathSpec``) positively match files by default. To find\nthe files to keep, and exclude files like *.gitignore*, you need to set\n``negate=True`` to flip the results::\n\n\t>>> from pathspec import GitIgnoreSpec\n\t>>> spec = GitIgnoreSpec.from_lines([...])\n\t>>> keep_files = set(spec.match_tree_files('path/to/directory', negate=True))\n\t>>> ignore_files = set(spec.match_tree_files('path/to/directory'))\n\n\nLicense\n-------\n\n*pathspec* is licensed under the `Mozilla Public License Version 2.0`_. See\n`LICENSE`_ or the `FAQ`_ for more information.\n\nIn summary, you may use *pathspec* with any closed or open source project\nwithout affecting the license of the larger work so long as you:\n\n- give credit where credit is due,\n\n- and release any custom changes made to *pathspec*.\n\n.. _`Mozilla Public License Version 2.0`: http://www.mozilla.org/MPL/2.0\n.. _`LICENSE`: LICENSE\n.. _`FAQ`: http://www.mozilla.org/MPL/2.0/FAQ.html\n\n\nSource\n------\n\nThe source code for *pathspec* is available from the GitHub repo\n`cpburnz/python-pathspec`_.\n\n.. _`cpburnz/python-pathspec`: https://github.com/cpburnz/python-pathspec\n\n\nInstallation\n------------\n\n*pathspec* is available for install through `PyPI`_::\n\n\tpip install pathspec\n\n*pathspec* can also be built from source. The following packages will be\nrequired:\n\n- `build`_ (>=0.6.0)\n\n*pathspec* can then be built and installed with::\n\n\tpython -m build\n\tpip install dist/pathspec-*-py3-none-any.whl\n\nThe following optional dependencies can be installed:\n\n- `google-re2`_: Enables optional \"re2\" backend.\n- `hyperscan`_: Enables optional \"hyperscan\" backend.\n- `typing-extensions`_: Improves some type hints.\n\n.. _`PyPI`: http://pypi.python.org/pypi/pathspec\n.. _`build`: https://pypi.org/project/build/\n.. _`typing-extensions`: https://pypi.org/project/typing-extensions/\n\n\nDocumentation\n-------------\n\nDocumentation for *pathspec* is available on `Read the Docs`_.\n\nThe full change history can be found in `CHANGES.rst`_ and `Change History`_.\n\nAn upgrade guide is available in `UPGRADING.rst`_ and `Upgrade Guide`_.\n\n.. _`CHANGES.rst`: https://github.com/cpburnz/python-pathspec/blob/master/CHANGES.rst\n.. _`Change History`: https://python-path-specification.readthedocs.io/en/stable/changes.html\n.. _`Read the Docs`: https://python-path-specification.readthedocs.io\n.. _`UPGRADING.rst`: https://github.com/cpburnz/python-pathspec/blob/master/UPGRADING.rst\n.. _`Upgrade Guide`: https://python-path-specification.readthedocs.io/en/stable/upgrading.html\n\n\nOther Languages\n---------------\n\nThe related project `pathspec-ruby`_ (by *highb*) provides a similar library as\na `Ruby gem`_.\n\n.. _`pathspec-ruby`: https://github.com/highb/pathspec-ruby\n.. _`Ruby gem`: https://rubygems.org/gems/pathspec\n\n\nChange History\n==============\n\n\n1.1.1 (2026-04-26)\n------------------\n\nImprovements:\n\n- Improved type checking with mypy and pyright.\n\nBug fixes:\n\n- Fixed typing on `PathSpec[TPattern]` to `PathSpec[TPattern_co]`.\n- Added missing variant type-hint `type[Pattern]` to `PathSpec.from_lines()` parameter `pattern_factory`.\n- Fixed possible type error when using `+` and `+=` operators on `PathSpec`.\n\n\n1.1.0 (2026-04-22)\n------------------\n\nNew features:\n\n- `Issue #108`_: Specialize pattern type for `PathSpec` as `PathSpec[TPattern]` for better debugging of `PathSpec().patterns`.\n\nBug fixes:\n\n- `Issue #93`_: Git discards invalid range notation. `GitIgnoreSpecPattern` now discards patterns with invalid range notation like Git.\n- `Pull #106`_: Fix escape() not escaping backslash characters.\n\nImprovements:\n\n- `Pull #110`_: Nicer debug print outs (and str for regex pattern).\n\n\n.. _`Pull #106`: https://github.com/cpburnz/python-pathspec/pull/106\n.. _`Issue #108`: https://github.com/cpburnz/python-pathspec/issues/108\n.. _`Pull #110`: https://github.com/cpburnz/python-pathspec/pull/110\n\n\n1.0.4 (2026-01-26)\n------------------\n\nBug fixes:\n\n- `Issue #103`_: Using re2 fails if pyre2 is also installed.\n\n.. _`Issue #103`: https://github.com/cpburnz/python-pathspec/issues/103\n\n\n1.0.3 (2026-01-09)\n------------------\n\nBug fixes:\n\n- `Issue #101`_: pyright strict errors with pathspec >= 1.0.0.\n- `Issue #102`_: No module named 'tomllib'.\n\n\n.. _`Issue #101`: https://github.com/cpburnz/python-pathspec/issues/101\n.. _`Issue #102`: https://github.com/cpburnz/python-pathspec/issues/102\n\n\n1.0.2 (2026-01-07)\n------------------\n\nBug fixes:\n\n- Type hint `collections.abc.Callable` does not properly replace `typing.Callable` until Python 3.9.2.\n\n\n1.0.1 (2026-01-06)\n------------------\n\nBug fixes:\n\n- `Issue #100`_: ValueError(f\"{patterns=!r} cannot be empty.\") when using black.\n\n\n.. _`Issue #100`: https://github.com/cpburnz/python-pathspec/issues/100\n\n\n1.0.0 (2026-01-05)\n------------------\n\nMajor changes:\n\n- `Issue #91`_: Dropped support of EoL Python 3.8.\n- Added concept of backends to allow for faster regular expression matching. The backend can be controlled using the `backend` argument to `PathSpec()`, `PathSpec.from_lines()`, `GitIgnoreSpec()`, and `GitIgnoreSpec.from_lines()`.\n- Renamed \"gitwildmatch\" pattern back to \"gitignore\". The \"gitignore\" pattern behaves slightly differently when used with `PathSpec` (*gitignore* as documented) than with `GitIgnoreSpec` (replicates *Git*'s edge cases).\n\nAPI changes:\n\n- Breaking: protected method `pathspec.pathspec.PathSpec._match_file()` (with a leading underscore) has been removed and replaced by backends. This does not affect normal usage of `PathSpec` or `GitIgnoreSpec`. Only custom subclasses will be affected. If this breaks your usage, let me know by `opening an issue <https://github.com/cpburnz/python-pathspec/issues>`_.\n- Deprecated: \"gitwildmatch\" is now an alias for \"gitignore\".\n- Deprecated: `pathspec.patterns.GitWildMatchPattern` is now an alias for `pathspec.patterns.gitignore.spec.GitIgnoreSpecPattern`.\n- Deprecated: `pathspec.patterns.gitwildmatch` module has been replaced by the `pathspec.patterns.gitignore` package.\n- Deprecated: `pathspec.patterns.gitwildmatch.GitWildMatchPattern` is now an alias for `pathspec.patterns.gitignore.spec.GitIgnoreSpecPattern`.\n- Deprecated: `pathspec.patterns.gitwildmatch.GitWildMatchPatternError` is now an alias for `pathspec.patterns.gitignore.GitIgnorePatternError`.\n- Removed: `pathspec.patterns.gitwildmatch.GitIgnorePattern` has been deprecated since v0.4 (2016-07-15).\n- Signature of method `pathspec.pattern.RegexPattern.match_file()` has been changed from `def match_file(self, file: str) -> RegexMatchResult | None` to `def match_file(self, file: AnyStr) -> RegexMatchResult | None` to reflect usage.\n- Signature of class method `pathspec.pattern.RegexPattern.pattern_to_regex()` has been changed from `def pattern_to_regex(cls, pattern: str) -> tuple[str, bool]` to `def pattern_to_regex(cls, pattern: AnyStr) -> tuple[AnyStr | None, bool | None]` to reflect usage and documentation.\n\nNew features:\n\n- Added optional \"hyperscan\" backend using `hyperscan`_ library. It will automatically be used when installed. This dependency can be installed with ``pip install 'pathspec[hyperscan]'``.\n- Added optional \"re2\" backend using the `google-re2`_ library. It will automatically be used when installed. This dependency can be installed with ``pip install 'pathspec[re2]'``.\n- Added optional dependency on `typing-extensions`_ library to improve some type hints.\n\nBug fixes:\n\n- `Issue #93`_: Do not remove leading spaces.\n- `Issue #95`_: Matching for files inside folder does not seem to behave like .gitignore's.\n- `Issue #98`_: UnboundLocalError in RegexPattern when initialized with `pattern=None`.\n- Type hint on return value of `pathspec.pattern.RegexPattern.match_file()` to match documentation.\n\nImprovements:\n\n- Mark Python 3.13 and 3.14 as supported.\n- No-op patterns are now filtered out when matching files, slightly improving performance.\n- Fix performance regression in `iter_tree_files()` from v0.10.\n\n\n.. _`Issue #38`: https://github.com/cpburnz/python-pathspec/issues/38\n.. _`Issue #91`: https://github.com/cpburnz/python-pathspec/issues/91\n.. _`Issue #93`: https://github.com/cpburnz/python-pathspec/issues/93\n.. _`Issue #95`: https://github.com/cpburnz/python-pathspec/issues/95\n.. _`Issue #98`: https://github.com/cpburnz/python-pathspec/issues/98\n.. _`google-re2`: https://pypi.org/project/google-re2/\n.. _`hyperscan`: https://pypi.org/project/hyperscan/\n.. _`typing-extensions`: https://pypi.org/project/typing-extensions/\n\n",
        "description_content_type": "text/x-rst",
        "author_email": "\"Caleb P. Burns\" <cpburnz@gmail.com>",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Topic :: Utilities"
        ],
        "requires_dist": [
          "hyperscan >=0.7 ; extra == \"hyperscan\"",
          "typing-extensions >=4 ; extra == \"optional\"",
          "google-re2 >=1.1 ; extra == \"re2\""
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Change Log, https://python-path-specification.readthedocs.io/en/latest/changes.html",
          "Documentation, https://python-path-specification.readthedocs.io/en/latest/index.html",
          "Issue Tracker, https://github.com/cpburnz/python-pathspec/issues",
          "Source Code, https://github.com/cpburnz/python-pathspec"
        ],
        "provides_extra": [
          "hyperscan",
          "optional",
          "re2"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/pathspec-1.1.1.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "edge-tts",
        "version": "7.2.7",
        "dynamic": [
          "license-file",
          "requires-dist"
        ],
        "summary": "Microsoft Edge's TTS",
        "description": "# edge-tts\n\n`edge-tts` is a Python module that allows you to use Microsoft Edge's online text-to-speech service from within your Python code or using the provided `edge-tts` or `edge-playback` command.\n\n## Installation\n\nTo install it, run the following command:\n\n    $ pip install edge-tts\n\nIf you only want to use the `edge-tts` and `edge-playback` commands, it would be better to use `pipx`:\n\n    $ pipx install edge-tts\n\n## Usage\n\n### Basic usage\n\nIf you want to use the `edge-tts` command, you can simply run it with the following command:\n\n    $ edge-tts --text \"Hello, world!\" --write-media hello.mp3 --write-subtitles hello.srt\n\nIf you wish to play it back immediately with subtitles, you could use the `edge-playback` command:\n\n    $ edge-playback --text \"Hello, world!\"\n\nNote that `edge-playback` requires the installation of the [`mpv` command line player](https://mpv.io/), except on Windows.\n\nAll `edge-tts` commands work with `edge-playback` with the exception of the `--write-media`, `--write-subtitles` and `--list-voices` options.\n\n### Changing the voice\n\nYou can change the voice used by the text-to-speech service by using the `--voice` option. The `--list-voices` option can be used to list all available voices.\n\n    $ edge-tts --list-voices\n    Name                               Gender    ContentCategories      VoicePersonalities\n    ---------------------------------  --------  ---------------------  --------------------------------------\n    af-ZA-AdriNeural                   Female    General                Friendly, Positive\n    af-ZA-WillemNeural                 Male      General                Friendly, Positive\n    am-ET-AmehaNeural                  Male      General                Friendly, Positive\n    am-ET-MekdesNeural                 Female    General                Friendly, Positive\n    ar-AE-FatimaNeural                 Female    General                Friendly, Positive\n    ar-AE-HamdanNeural                 Male      General                Friendly, Positive\n    ar-BH-AliNeural                    Male      General                Friendly, Positive\n    ar-BH-LailaNeural                  Female    General                Friendly, Positive\n    ar-DZ-AminaNeural                  Female    General                Friendly, Positive\n    ar-DZ-IsmaelNeural                 Male      General                Friendly, Positive\n    ar-EG-SalmaNeural                  Female    General                Friendly, Positive\n    ...\n\n    $ edge-tts --voice ar-EG-SalmaNeural --text \"مرحبا كيف حالك؟\" --write-media hello_in_arabic.mp3 --write-subtitles hello_in_arabic.srt\n\n### Custom SSML\n\nSupport for custom SSML was removed because Microsoft prevents the use of any SSML that could not be generated by Microsoft Edge itself. This means that all the cases where custom SSML would be useful cannot be supported as the service only permits a single `<voice>` tag with a single `<prosody>` tag inside it. Any available customization options that could be used in the `<prosody>` tag are already available from the library or the command line itself.\n\n### Changing rate, volume and pitch\n\nYou can change the rate, volume and pitch of the generated speech by using the `--rate`, `--volume` and `--pitch` options. When using a negative value, you will need to use `--[option]=-50%` instead of `--[option] -50%` to avoid the option being interpreted as a command line option.\n\n    $ edge-tts --rate=-50% --text \"Hello, world!\" --write-media hello_with_rate_lowered.mp3 --write-subtitles hello_with_rate_lowered.srt\n    $ edge-tts --volume=-50% --text \"Hello, world!\" --write-media hello_with_volume_lowered.mp3 --write-subtitles hello_with_volume_lowered.srt\n    $ edge-tts --pitch=-50Hz --text \"Hello, world!\" --write-media hello_with_pitch_lowered.mp3 --write-subtitles hello_with_pitch_lowered.srt\n\n## Python module\n\nIt is possible to use the `edge-tts` module directly from Python. Examples from the project itself include:\n\n* [/examples/](/examples/)\n* [/src/edge_tts/util.py](/src/edge_tts/util.py)\n\nOther projects that use the `edge-tts` module include:\n\n* [hass-edge-tts](https://github.com/hasscc/hass-edge-tts/blob/main/custom_components/edge_tts/tts.py)\n* [Podcastfy](https://github.com/souzatharsis/podcastfy/blob/main/podcastfy/tts/providers/edge.py)\n* [tts-samples](https://github.com/yaph/tts-samples/blob/main/bin/create_sound_samples.py) - a collection of [mp3 sound samples](https://github.com/yaph/tts-samples/tree/main/mp3) to facilitate picking a voice for your project.\n",
        "description_content_type": "text/markdown",
        "home_page": "https://github.com/rany2/edge-tts",
        "author": "rany",
        "author_email": "ranygh@riseup.net",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Programming Language :: Python :: 3",
          "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
          "Operating System :: OS Independent"
        ],
        "requires_dist": [
          "aiohttp<4.0.0,>=3.8.0",
          "certifi>=2023.11.17",
          "tabulate<1.0.0,>=0.4.4",
          "typing-extensions<5.0.0,>=4.1.0",
          "black; extra == \"dev\"",
          "isort; extra == \"dev\"",
          "mypy; extra == \"dev\"",
          "pylint; extra == \"dev\"",
          "types-tabulate; extra == \"dev\""
        ],
        "requires_python": ">=3.7",
        "project_url": [
          "Bug Tracker, https://github.com/rany2/edge-tts/issues"
        ],
        "provides_extra": [
          "dev"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/edge_tts-7.2.7.dist-info",
      "installer": "uv",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "PyYAML",
        "version": "6.0.3",
        "dynamic": [
          "author",
          "author-email",
          "classifier",
          "description",
          "download-url",
          "home-page",
          "license",
          "license-file",
          "platform",
          "project-url",
          "requires-python",
          "summary"
        ],
        "platform": [
          "Any"
        ],
        "summary": "YAML parser and emitter for Python",
        "description": "YAML is a data serialization format designed for human readability\nand interaction with scripting languages.  PyYAML is a YAML parser\nand emitter for Python.\n\nPyYAML features a complete YAML 1.1 parser, Unicode support, pickle\nsupport, capable extension API, and sensible error messages.  PyYAML\nsupports standard YAML tags and provides Python-specific tags that\nallow to represent an arbitrary Python object.\n\nPyYAML is applicable for a broad range of tasks from complex\nconfiguration files to object serialization and persistence.\n",
        "home_page": "https://pyyaml.org/",
        "download_url": "https://pypi.org/project/PyYAML/",
        "author": "Kirill Simonov",
        "author_email": "xi@resolvent.net",
        "license": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: MIT License",
          "Operating System :: OS Independent",
          "Programming Language :: Cython",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Topic :: Text Processing :: Markup"
        ],
        "requires_python": ">=3.8",
        "project_url": [
          "Bug Tracker, https://github.com/yaml/pyyaml/issues",
          "CI, https://github.com/yaml/pyyaml/actions",
          "Documentation, https://pyyaml.org/wiki/PyYAMLDocumentation",
          "Mailing lists, http://lists.sourceforge.net/lists/listinfo/yaml-core",
          "Source Code, https://github.com/yaml/pyyaml"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/pyyaml-6.0.3.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "wcwidth",
        "version": "0.6.0",
        "summary": "Measures the displayed width of unicode strings in a terminal",
        "description": "|pypi_downloads| |codecov| |license|\n\n============\nIntroduction\n============\n\nThis library is mainly for CLI/TUI programs that carefully produce output for Terminals.\n\nInstallation\n------------\n\nThe stable version of this package is maintained on pypi, install or upgrade, using pip::\n\n    pip install --upgrade wcwidth\n\nProblem\n-------\n\nAll Python string-formatting functions, `textwrap.wrap()`_, `str.ljust()`_, `str.rjust()`_, and\n`str.center()`_ **incorrectly** measure the displayed width of a string as equal to the number of\ntheir codepoints.\n\nSome examples of **incorrect results**:\n\n.. code-block:: python\n\n    >>> # result consumes 16 total cells, 11 expected,\n    >>> 'コンニチハ'.rjust(11, 'X')\n    'XXXXXXコンニチハ'\n\n    >>> # result consumes 5 total cells, 6 expected,\n    >>> 'café'.center(6, 'X')\n    'caféX'\n\nSolution\n--------\n\nThe lowest-level functions in this library are the POSIX.1-2001 and POSIX.1-2008 `wcwidth(3)`_ and\n`wcswidth(3)`_, which this library precisely copies by interface as `wcwidth()`_ and `wcswidth()`_.\nThese functions return -1 when C0 and C1 control codes are present.\n\nAn easy-to-use `width()`_ function is provided as a wrapper of `wcswidth()`_ that is also capable of\nmeasuring most terminal control codes and sequences, like colors, bold, tabstops, and horizontal\ncursor movement.\n\nText-justification is solved by the grapheme and sequence-aware functions `ljust()`_,\n`rjust()`_, `center()`_, and `wrap()`_, serving as drop-in replacements to python standard functions\nof the same names.\n\nThe iterator functions `iter_graphemes()`_ and `iter_sequences()`_ allow for careful navigation of\ngrapheme and terminal control sequence boundaries.  `iter_graphemes_reverse()`_, and\n`grapheme_boundary_before()`_ are useful for editing and searching of complex unicode.  The\n`clip()`_ function extracts substrings by display column positions, and `strip_sequences()`_ removes\nterminal escape sequences from text altogether.\n\nDiscrepancies\n-------------\n\nYou may find that support *varies* for complex unicode sequences or codepoints.\n\nA companion utility, `jquast/ucs-detect`_ was authored to gather and publish the results of Wide\ncharacter, language/grapheme clustering and complex script support, emojis and zero-width joiner,\nvariations, and regional indicator (flags) as a `General Tabulated Summary`_ by terminal emulator\nsoftware and version.\n\n========\nOverview\n========\n\nwcwidth()\n---------\n\nUse function ``wcwidth()`` to determine the length of a *single unicode\ncodepoint*.\n\nA brief overview, through examples, for all of the public API functions.\n\nFull API Documentation at https://wcwidth.readthedocs.io/en/latest/api.html\n\nwcwidth()\n---------\n\nMeasures width of a single codepoint,\n\n.. code-block:: python\n\n    >>> # '♀' narrow emoji\n    >>> wcwidth.wcwidth('\\u2640')\n    1\n\nUse function `wcwidth()`_ to determine the length of a *single unicode character*.\n\nSee specification_ of character measurements. Note that ``-1`` is returned for control codes.\n\nwcswidth()\n----------\n\nMeasures width of a string, returns -1 for control codes.\n\n.. code-block:: python\n\n    >>> # '♀️' emoji w/vs-16\n    >>> wcwidth.wcswidth('\\u2640\\ufe0f')\n    2\n\nUse function `wcswidth()`_ to determine the length of many, a *string of unicode characters*.\n\nSee specification_ of character measurements. Note that ``-1`` is returned if control codes occurs\nanywhere in the string.\n\nwidth()\n-------\n\nUse function `width()`_ to measure a string with improved handling of ``control_codes``.\n\n.. code-block:: python\n\n    >>> # same support as wcswidth(), eg. regional indicator flag:\n    >>> wcwidth.width('\\U0001F1FF\\U0001F1FC')\n    2\n    >>> # but also supports SGR colored text, 'WARN', followed by SGR reset\n    >>> wcwidth.width('\\x1b[38;2;255;150;100mWARN\\x1b[0m')\n    4\n    >>> # tabs,\n    >>> wcwidth.width('\\t', tabsize=4)\n    4\n    >>> # or, tab and all other control characters can be ignored\n    >>> wcwidth.width('\\t', control_codes='ignore')\n    0\n    >>> # \"vertical\" control characters are ignored\n    >>> wcwidth.width('\\n')\n    0\n    >>> # as well as sequences with \"indeterminate\" effects like Home + Clear\n    >>> wcwidth.width('\\x1b[H\\x1b[2J')\n    0\n    >>> # or, raise ValueError for \"indeterminate\" effects using control_codes='strict'\n    >>> wcwidth.width('\\n', control_codes='strict')\n    Traceback (most recent call last):\n    ...\n    ValueError: Vertical movement character 0xa at position 0\n\nUse ``control_codes='ignore'`` when the input is known not to contain any control characters or\nterminal sequences for slightly improved performance. Note that TAB (``'\\t'``) is a control\ncharacter and is also ignored, you may want to use `str.expandtabs()`_, first.\n\niter_sequences()\n----------------\n\nIterates through text, segmented by terminal sequence,\n\n.. code-block:: python\n\n    >>> list(wcwidth.iter_sequences('hello'))\n    [('hello', False)]\n    >>> list(wcwidth.iter_sequences('\\x1b[31mred\\x1b[0m'))\n    [('\\x1b[31m', True), ('red', False), ('\\x1b[0m', True)]\n\nUse `iter_sequences()`_ to split text into segments of plain text and escape sequences. Each tuple\ncontains the segment string and a boolean indicating whether it is an escape sequence (``True``) or\ntext (``False``).\n\niter_graphemes()\n----------------\n\nUse `iter_graphemes()`_ to iterate over *grapheme clusters* of a string.\n\n.. code-block:: python\n\n    >>> from wcwidth import iter_graphemes\n    >>> # ok + Regional Indicator 'Z', 'W' (Zimbabwe)\n    >>> list(wcwidth.iter_graphemes('ok\\U0001F1FF\\U0001F1FC'))\n    ['o', 'k', '🇿🇼']\n\n    >>> # cafe + combining acute accent\n    >>> list(wcwidth.iter_graphemes('cafe\\u0301'))\n    ['c', 'a', 'f', 'é']\n\n    >>> # ok + Emoji Man + ZWJ + Woman + ZWJ + Girl\n    >>> list(wcwidth.iter_graphemes('ok\\U0001F468\\u200D\\U0001F469\\u200D\\U0001F467'))\n    ['o', 'k', '👨\\u200d👩\\u200d👧']\n\nA grapheme cluster is what a user perceives as a single character, even if it is composed of\nmultiple Unicode codepoints. This function implements `Unicode Standard Annex #29`_ grapheme cluster\nboundary rules.\n\nljust()\n-------\n\nUse `ljust()`_ as replacement of `str.ljust()`_:\n\n.. code-block:: python\n\n    >>> 'コンニチハ'.ljust(11, '*')             # don't do this\n    'コンニチハ******'\n    >>> wcwidth.ljust('コンニチハ', 11, '*')    # do this!\n    'コンニチハ*'\n\nrjust()\n-------\n\nUse `rjust()`_ as replacement of `str.rjust()`_:\n\n.. code-block:: python\n\n    >>> 'コンニチハ'.rjust(11, '*')             # don't do this\n    '******コンニチハ'\n    >>> wcwidth.rjust('コンニチハ', 11, '*')    # do this!\n    '*コンニチハ'\n\ncenter()\n--------\n\nUse `center()`_ as replacement of `str.center()`_:\n\n.. code-block:: python\n\n    >>> 'cafe\\u0301'.center(6, '*')             # don't do this\n    'café*'\n    >>> wcwidth.center('cafe\\u0301', 6, '*')\n    '*café*'                                    # do this!\n\nwrap()\n------\n\nUse function `wrap()`_ to wrap text containing terminal sequences, Unicode grapheme\nclusters, and wide characters to a given display width.\n\n.. code-block:: python\n\n    >>> from wcwidth import wrap\n    >>> # Basic wrapping\n    >>> wrap('hello world', 5)\n    ['hello', 'world']\n\n    >>> # Wrapping CJK text (each character is 2 cells wide)\n    >>> wrap('コンニチハ', 4)\n    ['コン', 'ニチ', 'ハ']\n\n    >>> # Text with ANSI color sequences - SGR codes are propagated by default\n    >>> # Each line ends with reset, next line starts with restored style\n    >>> wrap('\\x1b[1;31mhello world\\x1b[0m', 5)\n    ['\\x1b[1;31mhello\\x1b[0m', '\\x1b[1;31mworld\\x1b[0m']\n\nclip()\n------\n\nUse `clip()`_ to extract a substring by column positions, preserving terminal sequences.\n\n.. code-block:: python\n\n    >>> from wcwidth import clip\n    >>> # Wide characters split to Narrow boundaries using fillchar=' '\n    >>> clip('中文字', 0, 3)\n    '中 '\n    >>> clip('中文字', 1, 5, fillchar='.')\n    '.文.'\n\n    >>> # SGR codes are propagated by default - result begins with active style\n    >>> # and ends with reset if styles are active\n    >>> clip('\\x1b[1;31mHello world\\x1b[0m', 6, 11)\n    '\\x1b[1;31mworld\\x1b[0m'\n\n    >>> # Disable SGR propagation to preserve original sequences as-is\n    >>> clip('\\x1b[31m中文\\x1b[0m', 0, 3, propagate_sgr=False)\n    '\\x1b[31m中 \\x1b[0m'\n\nstrip_sequences()\n-----------------\n\nUse `strip_sequences()`_ to remove all terminal escape sequences from text.\n\n.. code-block:: python\n\n    >>> from wcwidth import strip_sequences\n    >>> strip_sequences('\\x1b[31mred\\x1b[0m')\n    'red'\n\n.. _ambiguous_width:\n\nambiguous_width\n---------------\n\nSome Unicode characters have \"East Asian Ambiguous\" (A) width. These characters display as 1 cell by\ndefault, matching Western terminal contexts, but many CJK (Chinese, Japanese, Korean) environments\nmay have a preference for 2 cells.  This is often found as boolean option, \"Ambiguous width as wide\"\nin Terminal Emulator software preferences.\n\nBy default, wcwidth treats ambiguous characters as narrow (width 1). For CJK environments where your\nterminal is configured to display ambiguous characters as double-width, pass ``ambiguous_width=2``:\n\n.. code-block:: python\n\n    >>> # CIRCLED DIGIT ONE - ambiguous width\n    >>> wcwidth.width('\\u2460')\n    1\n    >>> wcwidth.width('\\u2460', ambiguous_width=2)\n    2\n\nThe ``ambiguous_width`` parameter is available on all width-measuring functions: `wcwidth()`_,\n`wcswidth()`_, `width()`_, `ljust()`_, `rjust()`_, `center()`_, `wrap()`_, and `clip()`_.\n\n**Terminal Detection**\n\nThe most reliable method to detect whether a terminal profile is set for \"Ambiguous width as wide\"\nmode is to display an ambiguous character surrounded by a pair of Cursor Position Report (CPR)\nqueries with a terminal in cooked or raw mode, and to parse the responses for their ``(y, x)``\nlocations and measure the difference ``x``.\n\nThis code should also be careful check whether it is attached to a terminal and be careful of\npossible timeout, slow network, or non-response when working with \"dumb terminals\" like a CI build.\n\n`jquast/blessed`_ library provides such a helping `Terminal.detect_ambiguous_width()`_ method:\n\n.. code-block:: python\n\n    >>> import blessed, functools\n    >>> # Detect terminal ambiguous width as wide (2) or narrow (1)\n    >>> ambiguous_width = blessed.Terminal().detect_ambiguous_width()\n    >>> # Define a new 'width' function with this argument\n    >>> awidth = functools.partial(wcwidth.width, ambiguous_width=ambiguous_width)\n    >>> # result depends on attached terminal mode\n    >>> awidth('\\u2460')\n    1\n\n==========\nDeveloping\n==========\n\nInstall wcwidth in editable mode::\n\n   pip install -e .\n\nExecute all code generation, autoformatters, linters and unit tests using tox::\n\n   tox\n\nOr execute individual tasks, see ``tox -lv`` for all available targets::\n\n   tox -e pylint,py36,py314\n\nTo run tests with detailed coverage reporting showing missing lines::\n\n   tox -epy314 -- --cov-report=term-missing\n\nUpdating Unicode Version\n------------------------\n\nRegenerate python code tables from latest Unicode Specification data files::\n\n   tox -e update\n\nThe script is located at ``bin/update-tables.py``, requires Python 3.9 or\nlater. It is recommended but not necessary to run this script with the newest\nPython, because the newest Python has the latest ``unicodedata`` for generating\ncomments.\n\nBuilding Documentation\n----------------------\n\nThis project is using `sphinx`_ 4.5 to build documentation::\n\n   tox -e sphinx\n\nThe output will be in ``docs/_build/html/``.\n\nUpdating Requirements\n---------------------\n\nThis project is using `pip-tools`_ to manage requirements.\n\nTo upgrade requirements for updating unicode version, run::\n\n   tox -e update_requirements_update\n\nTo upgrade requirements for testing, run::\n\n   tox -e update_requirements38,update_requirements39\n\nTo upgrade requirements for building documentation, run::\n\n   tox -e update_requirements_docs\n\nUtilities\n---------\n\nSupplementary tools for browsing and testing terminals for wide unicode\ncharacters are found in the `bin/`_ of this project's source code.  Just ensure\nto first ``pip install -r requirements-develop.txt`` from this projects main\nfolder. For example, an interactive browser for testing::\n\n  python ./bin/wcwidth-browser.py\n\n====\nUses\n====\n\nThis library is used in:\n\n- `jquast/blessed`_: a thin, practical wrapper around terminal capabilities in\n  Python.\n\n- `prompt-toolkit/python-prompt-toolkit`_: a Library for building powerful\n  interactive command lines in Python.\n\n- `dbcli/pgcli`_: Postgres CLI with autocompletion and syntax highlighting.\n\n- `thomasballinger/curtsies`_: a Curses-like terminal wrapper with a display\n  based on compositing 2d arrays of text.\n\n- `selectel/pyte`_: Simple VTXXX-compatible linux terminal emulator.\n\n- `astanin/python-tabulate`_: Pretty-print tabular data in Python, a library\n  and a command-line utility.\n\n- `rspeer/python-ftfy`_: Fixes mojibake and other glitches in Unicode\n  text.\n\n- `nbedos/termtosvg`_: Terminal recorder that renders sessions as SVG\n  animations.\n\n- `peterbrittain/asciimatics`_: Package to help people create full-screen text\n  UIs.\n\n- `python-cmd2/cmd2`_: A tool for building interactive command line apps\n\n- `stratis-storage/stratis-cli`_: CLI for the Stratis project\n\n- `ihabunek/toot`_: A Mastodon CLI/TUI client\n\n- `saulpw/visidata`_: Terminal spreadsheet multitool for discovering and\n  arranging data\n\n- `jquast/ucs-detect`_: Utility for unicode support detection.\n\n===============\nOther Languages\n===============\n\nThere are similar implementations of the `wcwidth()`_ and `wcswidth()`_ functions in other\nlanguages.\n\n- `timoxley/wcwidth`_: JavaScript\n- `janlelis/unicode-display_width`_: Ruby\n- `alecrabbit/php-wcwidth`_: PHP\n- `Text::CharWidth`_: Perl\n- `bluebear94/Terminal-WCWidth`_: Perl 6\n- `mattn/go-runewidth`_: Go\n- `grepsuzette/wcwidth`_: Haxe\n- `aperezdc/lua-wcwidth`_: Lua\n- `joachimschmidt557/zig-wcwidth`_: Zig\n- `fumiyas/wcwidth-cjk`_: `LD_PRELOAD` override\n- `joshuarubin/wcwidth9`_: Unicode version 9 in C\n- `spectreconsole/wcwidth`_: C#\n\n=======\nHistory\n=======\n\n0.6.0 *2026-02-06*\n  * **New** Parameters ``expand_tabs``, ``replace_whitespace``, ``fix_sentence_endings``,\n    ``drop_whitespace``, ``max_lines``, and ``placeholder`` for `wrap()`_, completing stdlib\n    `textwrap.wrap()`_ compatibility.\n\n0.5.3 *2026-01-30*\n  * **Bugfix** Brahmic using Virama conjunct formation. `Issue #155`_, `PR #204`_.\n\n0.5.2 *2026-01-29*\n  * **Bugfix** Measurement of category ``Mc`` (`Spacing Combining Mark`_), approx.  443, has a more\n    nuanced specification_, and may be categorized as either zero or wide. `PR #200`_.\n  * **Bugfix** Measurement of \"standalone\" modifiers and regional indicators, `PR #202`_.\n  * **Updated** Data files used in some automatic tests are no longer distributed. `PR #199`_\n\n0.5.1 *2026-01-27*\n  * **Updated** generated zero and wide code tables to length of 1 to complete the previously\n    announced removal of historical wide and zero tables. `PR #196`_.\n\n0.5.0 *2026-01-26*\n  * **Drop Support** of many historical versions of wide and zero unicode tables.  Only the latest\n    Unicode version (17.0.0) is now shipped. The related ``unicode_version='auto'`` keyword of the\n    `wcwidth()`_ family of functions are ignored. `list_versions()`_ always returns a tuple of only\n    a single element of the only unicode version supported. `PR #195`_.\n  * **Performance** improvement of most common call without version or ambiguous_width specified by\n    20%. `PR #195`_.\n  * **New** Function `propagate_sgr()`_ for applying SGR state propagation to a list of lines.\n    `PR #194`_.\n  * **Improved** `wrap()`_ and `clip()`_ with ``propagate_sgr=True``. `PR #194`_.\n  * **Bugfix** `clip()`_ zero-width characters at clipping boundaries. `PR #194`_.\n  * **Bugfix** OSC Hyperlinks when broken mid-text by `wrap()`_. `PR #193`_.\n\n0.4.0 *2026-01-25*\n  * **New** Functions `iter_graphemes_reverse()`_, `grapheme_boundary_before()`_. `PR #192`_.\n  * **Bugfix** OSC Hyperlinks should not be broken by `wrap()`_. `PR #191`_.\n\n0.3.5 *2026-01-24*\n  * **Bugfix** packaging of 0.3.4 contains a failing test.\n\n0.3.4 *2026-01-24*\n  * **Bugfix** `center()`_ should match the eccentric `parity padding`_.\n    of `str.center()`_. `PR #188`_.\n\n0.3.3 *2026-01-24*\n  * **Performance** improvement in `width()`_. `PR #185`_.\n  * **Bugfix** missing ``py.typed``, ``Typing :: Typed``. `PR #184`_.\n\n0.3.2 *2026-01-23*\n  * **Updated** type hinting for full ``mympy --strict`` compliance. `PR #183`_.\n\n0.3.1 *2026-01-22*\n  * **Performance** improvement up to 30% in `width()_`. `PR #181`_.\n\n0.3.0 *2026-01-21*\n  * **Drop Support** for Python 3.6 and 3.7. `PR #156`_.\n  * **New** Function `iter_graphemes()`_. `PR #165`_.\n  * **New** Functions `width()`_ and `iter_sequences()`_. `PR #166`_.\n  * **New** Functions `ljust()`_, `rjust()`_, `center()`_. `PR #168`_.\n  * **New** Function `wrap()`_. `PR #169`_.\n  * **Performance** improvement in `wcswidth()`_. `PR #171`_.\n  * **New** argument ``ambiguous_width`` to all functions. `PR #172`_.\n  * **New** Functions `clip()`_ and `strip_sequences()`_. `PR #173`_.\n  * **Bugfix** Characters with ``Default_Ignorable_Code_Point`` property now\n    return width 0. `PR #174`_.\n  * **Bugfix** Characters with ``Prepended_Concatenation_Mark`` property now\n    return width 1. `PR #175`_.\n\n0.2.14 *2025-09-22*\n  * **Drop Support** for Python 2.7 and 3.5. `PR #117`_.\n  * **Update** tables to include Unicode Specifications 16.0.0 and 17.0.0.\n    `PR #146`_.\n  * **Bugfix** U+00AD SOFT HYPHEN should measure as 1, versions 0.2.9 through\n    0.2.13 measured as 0. `PR #149`_.\n\n0.2.13 *2024-01-06*\n  * **Bugfix** zero-width support for Hangul Jamo (Korean)\n\n0.2.12 *2023-11-21*\n  * **Bugfix** Re-release to remove `.pyi` files misplaced in wheel `Issue #101`_.\n\n0.2.11 *2023-11-20*\n  * **Updated** Include tests files in the source distribution (`PR #98`_, `PR #100`_).\n\n0.2.10 *2023-11-13*\n  * **Bugfix** accounting of some kinds of emoji sequences using U+FE0F\n    Variation Selector 16 (`PR #97`_).\n  * **Updated** specification_.\n\n0.2.9 *2023-10-30*\n  * **Bugfix** zero-width characters used in Emoji ZWJ sequences, Balinese,\n    Jamo, Devanagari, Tamil, Kannada and others (`PR #91`_).\n  * **Updated** to include specification_ of character measurements.\n\n0.2.8 *2023-09-30*\n  * Include requirements files in the source distribution (`PR #82`_).\n\n0.2.7 *2023-09-28*\n  * **Updated** tables to include Unicode Specification 15.1.0.\n  * Include ``bin``, ``docs``, and ``tox.ini`` in the source distribution\n\n0.2.6 *2023-01-14*\n  * **Updated** tables to include Unicode Specification 14.0.0 and 15.0.0.\n  * **Changed** developer tools to use pip-compile, and to use jinja2 templates\n    for code generation in `bin/update-tables.py` to prepare for possible\n    compiler optimization release.\n\n0.2.1 .. 0.2.5 *2020-06-23*\n  * **Repository** changes to update tests and packaging issues, and\n    begin tagging repository with matching release versions.\n\n0.2.0 *2020-06-01*\n  * **Enhancement**: Unicode version may be selected by exporting the\n    Environment variable ``UNICODE_VERSION``, such as ``13.0``, or ``6.3.0``.\n    See the `jquast/ucs-detect`_ CLI utility for automatic detection.\n  * **Enhancement**:\n    API Documentation is published to readthedocs.io.\n  * **Updated** tables for *all* Unicode Specifications with files\n    published in a programmatically consumable format, versions 4.1.0\n    through 13.0\n\n0.1.9 *2020-03-22*\n  * **Performance** optimization by `Avram Lubkin`_, `PR #35`_.\n  * **Updated** tables to Unicode Specification 13.0.0.\n\n0.1.8 *2020-01-01*\n  * **Updated** tables to Unicode Specification 12.0.0. (`PR #30`_).\n\n0.1.7 *2016-07-01*\n  * **Updated** tables to Unicode Specification 9.0.0. (`PR #18`_).\n\n0.1.6 *2016-01-08 Production/Stable*\n  * ``LICENSE`` file now included with distribution.\n\n0.1.5 *2015-09-13 Alpha*\n  * **Bugfix**:\n    Resolution of \"combining_ character width\" issue, most especially\n    those that previously returned -1 now often (correctly) return 0.\n    resolved by `Philip Craig`_ via `PR #11`_.\n  * **Deprecated**:\n    The module path ``wcwidth.table_comb`` is no longer available,\n    it has been superseded by module path ``wcwidth.table_zero``.\n\n0.1.4 *2014-11-20 Pre-Alpha*\n  * **Feature**: ``wcswidth()`` now determines printable length\n    for (most) combining_ characters.  The developer's tool\n    `bin/wcwidth-browser.py`_ is improved to display combining_\n    characters when provided the ``--combining`` option\n    (`Thomas Ballinger`_ and `Leta Montopoli`_ `PR #5`_).\n  * **Feature**: added static analysis (prospector_) to testing\n    framework.\n\n0.1.3 *2014-10-29 Pre-Alpha*\n  * **Bugfix**: 2nd parameter of wcswidth was not honored.\n    (`Thomas Ballinger`_, `PR #4`_).\n\n0.1.2 *2014-10-28 Pre-Alpha*\n  * **Updated** tables to Unicode Specification 7.0.0.\n    (`Thomas Ballinger`_, `PR #3`_).\n\n0.1.1 *2014-05-14 Pre-Alpha*\n  * Initial release to pypi, Based on Unicode Specification 6.3.0\n\nThis code was originally derived directly from C code of the same name,\nwhose latest version is available at\nhttps://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c::\n\n * Markus Kuhn -- 2007-05-26 (Unicode 5.0)\n *\n * Permission to use, copy, modify, and distribute this software\n * for any purpose and without fee is hereby granted. The author\n * disclaims all warranties with regard to this software.\n\n.. _`Spacing Combining Mark`: https://www.unicode.org/versions/latest/ch04.pdf#G134153\n.. _`specification`: https://wcwidth.readthedocs.io/en/latest/specs.html\n.. _`tox`: https://tox.wiki/en/latest/\n.. _`prospector`: https://github.com/landscapeio/prospector\n.. _`combining`: https://en.wikipedia.org/wiki/Combining_character\n.. _`bin/`: https://github.com/jquast/wcwidth/tree/master/bin\n.. _`bin/wcwidth-browser.py`: https://github.com/jquast/wcwidth/blob/master/bin/wcwidth-browser.py\n.. _`Thomas Ballinger`: https://github.com/thomasballinger\n.. _`Leta Montopoli`: https://github.com/lmontopo\n.. _`Philip Craig`: https://github.com/philipc\n.. _`PR #3`: https://github.com/jquast/wcwidth/pull/3\n.. _`PR #4`: https://github.com/jquast/wcwidth/pull/4\n.. _`PR #5`: https://github.com/jquast/wcwidth/pull/5\n.. _`PR #11`: https://github.com/jquast/wcwidth/pull/11\n.. _`PR #18`: https://github.com/jquast/wcwidth/pull/18\n.. _`PR #30`: https://github.com/jquast/wcwidth/pull/30\n.. _`PR #35`: https://github.com/jquast/wcwidth/pull/35\n.. _`PR #82`: https://github.com/jquast/wcwidth/pull/82\n.. _`PR #91`: https://github.com/jquast/wcwidth/pull/91\n.. _`PR #97`: https://github.com/jquast/wcwidth/pull/97\n.. _`PR #98`: https://github.com/jquast/wcwidth/pull/98\n.. _`PR #100`: https://github.com/jquast/wcwidth/pull/100\n.. _`PR #117`: https://github.com/jquast/wcwidth/pull/117\n.. _`PR #146`: https://github.com/jquast/wcwidth/pull/146\n.. _`PR #149`: https://github.com/jquast/wcwidth/pull/149\n.. _`PR #156`: https://github.com/jquast/wcwidth/pull/156\n.. _`PR #165`: https://github.com/jquast/wcwidth/pull/165\n.. _`PR #166`: https://github.com/jquast/wcwidth/pull/166\n.. _`PR #168`: https://github.com/jquast/wcwidth/pull/168\n.. _`PR #169`: https://github.com/jquast/wcwidth/pull/169\n.. _`PR #171`: https://github.com/jquast/wcwidth/pull/171\n.. _`PR #172`: https://github.com/jquast/wcwidth/pull/172\n.. _`PR #173`: https://github.com/jquast/wcwidth/pull/173\n.. _`PR #174`: https://github.com/jquast/wcwidth/pull/174\n.. _`PR #175`: https://github.com/jquast/wcwidth/pull/175\n.. _`PR #181`: https://github.com/jquast/wcwidth/pull/181\n.. _`PR #183`: https://github.com/jquast/wcwidth/pull/183\n.. _`PR #184`: https://github.com/jquast/wcwidth/pull/184\n.. _`PR #185`: https://github.com/jquast/wcwidth/pull/185\n.. _`PR #188`: https://github.com/jquast/wcwidth/pull/188\n.. _`PR #191`: https://github.com/jquast/wcwidth/pull/191\n.. _`PR #192`: https://github.com/jquast/wcwidth/pull/192\n.. _`PR #193`: https://github.com/jquast/wcwidth/pull/193\n.. _`PR #194`: https://github.com/jquast/wcwidth/pull/194\n.. _`PR #195`: https://github.com/jquast/wcwidth/pull/195\n.. _`PR #196`: https://github.com/jquast/wcwidth/pull/196\n.. _`PR #199`: https://github.com/jquast/wcwidth/pull/199\n.. _`PR #200`: https://github.com/jquast/wcwidth/pull/200\n.. _`PR #202`: https://github.com/jquast/wcwidth/pull/202\n.. _`PR #204`: https://github.com/jquast/wcwidth/pull/204\n.. _`Issue #101`: https://github.com/jquast/wcwidth/issues/101\n.. _`Issue #155`: https://github.com/jquast/wcwidth/issues/155\n.. _`Issue #190`: https://github.com/jquast/wcwidth/issues/190\n.. _`jquast/blessed`: https://github.com/jquast/blessed\n.. _`selectel/pyte`: https://github.com/selectel/pyte\n.. _`thomasballinger/curtsies`: https://github.com/thomasballinger/curtsies\n.. _`dbcli/pgcli`: https://github.com/dbcli/pgcli\n.. _`prompt-toolkit/python-prompt-toolkit`: https://github.com/prompt-toolkit/python-prompt-toolkit\n.. _`timoxley/wcwidth`: https://github.com/timoxley/wcwidth\n.. _`wcwidth(3)`:  https://man7.org/linux/man-pages/man3/wcwidth.3.html\n.. _`wcswidth(3)`: https://man7.org/linux/man-pages/man3/wcswidth.3.html\n.. _`astanin/python-tabulate`: https://github.com/astanin/python-tabulate\n.. _`janlelis/unicode-display_width`: https://github.com/janlelis/unicode-display_width\n.. _`rspeer/python-ftfy`: https://github.com/rspeer/python-ftfy\n.. _`alecrabbit/php-wcwidth`: https://github.com/alecrabbit/php-wcwidth\n.. _`Text::CharWidth`: https://metacpan.org/pod/Text::CharWidth\n.. _`bluebear94/Terminal-WCWidth`: https://github.com/bluebear94/Terminal-WCWidth\n.. _`mattn/go-runewidth`: https://github.com/mattn/go-runewidth\n.. _`grepsuzette/wcwidth`: https://github.com/grepsuzette/wcwidth\n.. _`jquast/ucs-detect`: https://github.com/jquast/ucs-detect\n.. _`Avram Lubkin`: https://github.com/avylove\n.. _`nbedos/termtosvg`: https://github.com/nbedos/termtosvg\n.. _`peterbrittain/asciimatics`: https://github.com/peterbrittain/asciimatics\n.. _`aperezdc/lua-wcwidth`: https://github.com/aperezdc/lua-wcwidth\n.. _`joachimschmidt557/zig-wcwidth`: https://github.com/joachimschmidt557/zig-wcwidth\n.. _`fumiyas/wcwidth-cjk`: https://github.com/fumiyas/wcwidth-cjk\n.. _`joshuarubin/wcwidth9`: https://github.com/joshuarubin/wcwidth9\n.. _`spectreconsole/wcwidth`: https://github.com/spectreconsole/wcwidth\n.. _`python-cmd2/cmd2`: https://github.com/python-cmd2/cmd2\n.. _`stratis-storage/stratis-cli`: https://github.com/stratis-storage/stratis-cli\n.. _`ihabunek/toot`: https://github.com/ihabunek/toot\n.. _`saulpw/visidata`: https://github.com/saulpw/visidata\n.. _`pip-tools`: https://pip-tools.readthedocs.io/\n.. _`sphinx`: https://www.sphinx-doc.org/\n.. _`textwrap.wrap()`: https://docs.python.org/3/library/textwrap.html#textwrap.wrap\n.. _`str.ljust()`: https://docs.python.org/3/library/stdtypes.html#str.ljust\n.. _`str.rjust()`: https://docs.python.org/3/library/stdtypes.html#str.rjust\n.. _`str.center()`: https://docs.python.org/3/library/stdtypes.html#str.center\n.. _`str.expandtabs()`: https://docs.python.org/3/library/stdtypes.html#str.expandtabs\n.. _`General Tabulated Summary`: https://ucs-detect.readthedocs.io/results.html#tabulated-results\n.. _`wcwidth()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.wcwidth\n.. _`wcswidth()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.wcswidth\n.. _`width()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.width\n.. _`iter_graphemes()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.iter_graphemes\n.. _`iter_graphemes_reverse()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.iter_graphemes_reverse\n.. _`grapheme_boundary_before()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.grapheme_boundary_before\n.. _`ljust()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.ljust\n.. _`rjust()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.rjust\n.. _`center()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.center\n.. _`wrap()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.wrap\n.. _`clip()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.clip\n.. _`strip_sequences()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.strip_sequences\n.. _`propagate_sgr()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.propagate_sgr\n.. _`iter_sequences()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.iter_sequences\n.. _`list_versions()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.list_versions\n.. _`Unicode Standard Annex #29`: https://www.unicode.org/reports/tr29/\n.. _`Terminal.detect_ambiguous_width()`: https://blessed.readthedocs.io/en/latest/api/terminal.html#blessed.terminal.Terminal.detect_ambiguous_width\n.. _`parity padding`: https://jazcap53.github.io/pythons-eccentric-strcenter.html\n.. |pypi_downloads| image:: https://img.shields.io/pypi/dm/wcwidth.svg?logo=pypi\n    :alt: Downloads\n    :target: https://pypi.org/project/wcwidth/\n.. |codecov| image:: https://codecov.io/gh/jquast/wcwidth/branch/master/graph/badge.svg\n    :alt: codecov.io Code Coverage\n    :target: https://app.codecov.io/gh/jquast/wcwidth/\n.. |license| image:: https://img.shields.io/pypi/l/wcwidth.svg\n    :target: https://pypi.org/project/wcwidth/\n    :alt: MIT License\n",
        "description_content_type": "text/x-rst",
        "keywords": [
          "cjk",
          "combining",
          "console",
          "eastasian",
          "emoji",
          "emulator",
          "terminal",
          "unicode",
          "wcswidth",
          "wcwidth",
          "xterm"
        ],
        "author_email": "Jeff Quast <contact@jeffquast.com>",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Environment :: Console",
          "Intended Audience :: Developers",
          "Natural Language :: English",
          "Operating System :: POSIX",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Topic :: Software Development :: Internationalization",
          "Topic :: Software Development :: Libraries",
          "Topic :: Software Development :: Localization",
          "Topic :: Terminals",
          "Typing :: Typed"
        ],
        "requires_python": ">=3.8",
        "project_url": [
          "Homepage, https://github.com/jquast/wcwidth"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/wcwidth-0.6.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "httptools",
        "version": "0.7.1",
        "dynamic": [
          "license-file",
          "platform"
        ],
        "platform": [
          "macOS",
          "POSIX",
          "Windows"
        ],
        "summary": "A collection of framework independent HTTP protocol utils.",
        "description": "![Tests](https://github.com/MagicStack/httptools/workflows/Tests/badge.svg)\n\nhttptools is a Python binding for the nodejs HTTP parser.\n\nThe package is available on PyPI: `pip install httptools`.\n\n\n# APIs\n\nhttptools contains two classes `httptools.HttpRequestParser`,\n`httptools.HttpResponseParser` (fulfilled through\n[llhttp](https://github.com/nodejs/llhttp)) and a function for\nparsing URLs `httptools.parse_url` (through\n[http-parse](https://github.com/nodejs/http-parser) for now).\nSee unittests for examples.\n\n\n```python\n\nclass HttpRequestParser:\n\n    def __init__(self, protocol):\n        \"\"\"HttpRequestParser\n\n        protocol -- a Python object with the following methods\n        (all optional):\n\n          - on_message_begin()\n          - on_url(url: bytes)\n          - on_header(name: bytes, value: bytes)\n          - on_headers_complete()\n          - on_body(body: bytes)\n          - on_message_complete()\n          - on_chunk_header()\n          - on_chunk_complete()\n          - on_status(status: bytes)\n        \"\"\"\n\n    def get_http_version(self) -> str:\n        \"\"\"Return an HTTP protocol version.\"\"\"\n\n    def should_keep_alive(self) -> bool:\n        \"\"\"Return ``True`` if keep-alive mode is preferred.\"\"\"\n\n    def should_upgrade(self) -> bool:\n        \"\"\"Return ``True`` if the parsed request is a valid Upgrade request.\n\tThe method exposes a flag set just before on_headers_complete.\n\tCalling this method earlier will only yield `False`.\n\t\"\"\"\n\n    def feed_data(self, data: bytes):\n        \"\"\"Feed data to the parser.\n\n        Will eventually trigger callbacks on the ``protocol``\n        object.\n\n        On HTTP upgrade, this method will raise an\n        ``HttpParserUpgrade`` exception, with its sole argument\n        set to the offset of the non-HTTP data in ``data``.\n        \"\"\"\n\n    def get_method(self) -> bytes:\n        \"\"\"Return HTTP request method (GET, HEAD, etc)\"\"\"\n\n\nclass HttpResponseParser:\n\n    \"\"\"Has all methods except ``get_method()`` that\n    HttpRequestParser has.\"\"\"\n\n    def get_status_code(self) -> int:\n        \"\"\"Return the status code of the HTTP response\"\"\"\n\n\ndef parse_url(url: bytes):\n    \"\"\"Parse URL strings into a structured Python object.\n\n    Returns an instance of ``httptools.URL`` class with the\n    following attributes:\n\n      - schema: bytes\n      - host: bytes\n      - port: int\n      - path: bytes\n      - query: bytes\n      - fragment: bytes\n      - userinfo: bytes\n    \"\"\"\n```\n\n\n# Development\n\n1. Clone this repository with\n   `git clone --recursive git@github.com:MagicStack/httptools.git`\n\n2. Create a virtual environment with Python 3:\n   `python3 -m venv envname`\n\n3. Activate the environment with `source envname/bin/activate`\n\n4. Run `make` and `make test`.\n\n\n# License\n\nMIT.\n",
        "description_content_type": "text/markdown",
        "author_email": "Yury Selivanov <yury@magic.io>",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Intended Audience :: Developers",
          "Programming Language :: Python :: 3",
          "Operating System :: POSIX",
          "Operating System :: MacOS :: MacOS X",
          "Environment :: Web Environment",
          "Development Status :: 5 - Production/Stable"
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Homepage, https://github.com/MagicStack/httptools"
        ],
        "provides_extra": [
          "test"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/httptools-0.7.1.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "uvicorn",
        "version": "0.41.0",
        "summary": "The lightning-fast ASGI server.",
        "description": "<p align=\"center\">\n  <img width=\"320\" height=\"320\" src=\"https://raw.githubusercontent.com/tomchristie/uvicorn/main/docs/uvicorn.png\" alt='uvicorn'>\n</p>\n\n<p align=\"center\">\n<em>An ASGI web server, for Python.</em>\n</p>\n\n---\n\n[![Build Status](https://github.com/Kludex/uvicorn/workflows/Test%20Suite/badge.svg)](https://github.com/Kludex/uvicorn/actions)\n[![Package version](https://badge.fury.io/py/uvicorn.svg)](https://pypi.python.org/pypi/uvicorn)\n[![Supported Python Version](https://img.shields.io/pypi/pyversions/uvicorn.svg?color=%2334D058)](https://pypi.org/project/uvicorn)\n[![Discord](https://img.shields.io/discord/1051468649518616576?logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/RxKUF5JuHs)\n\n---\n\n**Documentation**: [https://uvicorn.dev](https://uvicorn.dev)\n\n**Source Code**: [https://www.github.com/Kludex/uvicorn](https://www.github.com/Kludex/uvicorn)\n\n---\n\nUvicorn is an ASGI web server implementation for Python.\n\nUntil recently Python has lacked a minimal low-level server/application interface for\nasync frameworks. The [ASGI specification][asgi] fills this gap, and means we're now able to\nstart building a common set of tooling usable across all async frameworks.\n\nUvicorn supports HTTP/1.1 and WebSockets.\n\n## Quickstart\n\nInstall using `pip`:\n\n```shell\n$ pip install uvicorn\n```\n\nThis will install uvicorn with minimal (pure Python) dependencies.\n\n```shell\n$ pip install 'uvicorn[standard]'\n```\n\nThis will install uvicorn with \"Cython-based\" dependencies (where possible) and other \"optional extras\".\n\nIn this context, \"Cython-based\" means the following:\n\n- the event loop `uvloop` will be installed and used if possible.\n- the http protocol will be handled by `httptools` if possible.\n\nMoreover, \"optional extras\" means that:\n\n- the websocket protocol will be handled by `websockets` (should you want to use `wsproto` you'd need to install it manually) if possible.\n- the `--reload` flag in development mode will use `watchfiles`.\n- windows users will have `colorama` installed for the colored logs.\n- `python-dotenv` will be installed should you want to use the `--env-file` option.\n- `PyYAML` will be installed to allow you to provide a `.yaml` file to `--log-config`, if desired.\n\nCreate an application, in `example.py`:\n\n```python\nasync def app(scope, receive, send):\n    assert scope['type'] == 'http'\n\n    await send({\n        'type': 'http.response.start',\n        'status': 200,\n        'headers': [\n            (b'content-type', b'text/plain'),\n        ],\n    })\n    await send({\n        'type': 'http.response.body',\n        'body': b'Hello, world!',\n    })\n```\n\nRun the server:\n\n```shell\n$ uvicorn example:app\n```\n\n---\n\n## Why ASGI?\n\nMost well established Python Web frameworks started out as WSGI-based frameworks.\n\nWSGI applications are a single, synchronous callable that takes a request and returns a response.\nThis doesn’t allow for long-lived connections, like you get with long-poll HTTP or WebSocket connections,\nwhich WSGI doesn't support well.\n\nHaving an async concurrency model also allows for options such as lightweight background tasks,\nand can be less of a limiting factor for endpoints that have long periods being blocked on network\nI/O such as dealing with slow HTTP requests.\n\n---\n\n## Alternative ASGI servers\n\nA strength of the ASGI protocol is that it decouples the server implementation\nfrom the application framework. This allows for an ecosystem of interoperating\nwebservers and application frameworks.\n\n### Daphne\n\nThe first ASGI server implementation, originally developed to power Django Channels, is [the Daphne webserver][daphne].\n\nIt is run widely in production, and supports HTTP/1.1, HTTP/2, and WebSockets.\n\nAny of the example applications given here can equally well be run using `daphne` instead.\n\n```\n$ pip install daphne\n$ daphne app:App\n```\n\n### Hypercorn\n\n[Hypercorn][hypercorn] was initially part of the Quart web framework, before\nbeing separated out into a standalone ASGI server.\n\nHypercorn supports HTTP/1.1, HTTP/2, and WebSockets.\n\nIt also supports [the excellent `trio` async framework][trio], as an alternative to `asyncio`.\n\n```\n$ pip install hypercorn\n$ hypercorn app:App\n```\n\n### Mangum\n\n[Mangum][mangum] is an adapter for using ASGI applications with AWS Lambda & API Gateway.\n\n### Granian\n\n[Granian][granian] is an ASGI compatible Rust HTTP server which supports HTTP/2, TLS and WebSockets.\n\n---\n\n<p align=\"center\"><i>Uvicorn is <a href=\"https://github.com/Kludex/uvicorn/blob/main/LICENSE.md\">BSD licensed</a> code.<br/>Designed & crafted with care.</i><br/>&mdash; 🦄  &mdash;</p>\n\n[asgi]: https://asgi.readthedocs.io/en/latest/\n[daphne]: https://github.com/django/daphne\n[hypercorn]: https://github.com/pgjones/hypercorn\n[trio]: https://trio.readthedocs.io\n[mangum]: https://github.com/jordaneremieff/mangum\n[granian]: https://github.com/emmett-framework/granian\n",
        "description_content_type": "text/markdown",
        "author_email": "Tom Christie <tom@tomchristie.com>",
        "maintainer_email": "Marcelo Trylesinski <marcelotryle@gmail.com>",
        "license_expression": "BSD-3-Clause",
        "license_file": [
          "LICENSE.md"
        ],
        "classifier": [
          "Development Status :: 4 - Beta",
          "Environment :: Web Environment",
          "Intended Audience :: Developers",
          "Operating System :: OS Independent",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: Internet :: WWW/HTTP"
        ],
        "requires_dist": [
          "click>=7.0",
          "h11>=0.8",
          "typing-extensions>=4.0; python_version < '3.11'",
          "colorama>=0.4; (sys_platform == 'win32') and extra == 'standard'",
          "httptools>=0.6.3; extra == 'standard'",
          "python-dotenv>=0.13; extra == 'standard'",
          "pyyaml>=5.1; extra == 'standard'",
          "uvloop>=0.15.1; (sys_platform != 'win32' and (sys_platform != 'cygwin' and platform_python_implementation != 'PyPy')) and extra == 'standard'",
          "watchfiles>=0.20; extra == 'standard'",
          "websockets>=10.4; extra == 'standard'"
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Changelog, https://uvicorn.dev/release-notes",
          "Funding, https://github.com/sponsors/encode",
          "Homepage, https://uvicorn.dev/",
          "Source, https://github.com/Kludex/uvicorn"
        ],
        "provides_extra": [
          "standard"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/uvicorn-0.41.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "python-dotenv",
        "version": "1.2.2",
        "dynamic": [
          "license-file"
        ],
        "summary": "Read key-value pairs from a .env file and set them as environment variables",
        "description": "# python-dotenv\n\n[![Build Status][build_status_badge]][build_status_link]\n[![PyPI version][pypi_badge]][pypi_link]\n\npython-dotenv reads key-value pairs from a `.env` file and can set them as\nenvironment variables. It helps in the development of applications following the\n[12-factor](https://12factor.net/) principles.\n\n- [Getting Started](#getting-started)\n- [Other Use Cases](#other-use-cases)\n  - [Load configuration without altering the environment](#load-configuration-without-altering-the-environment)\n  - [Parse configuration as a stream](#parse-configuration-as-a-stream)\n  - [Load .env files in IPython](#load-env-files-in-ipython)\n- [Command-line Interface](#command-line-interface)\n- [File format](#file-format)\n  - [Multiline values](#multiline-values)\n  - [Variable expansion](#variable-expansion)\n- [Related Projects](#related-projects)\n- [Acknowledgements](#acknowledgements)\n\n## Getting Started\n\n```shell\npip install python-dotenv\n```\n\nIf your application takes its configuration from environment variables, like a\n12-factor application, launching it in development is not very practical because\nyou have to set those environment variables yourself.\n\nTo help you with that, you can add python-dotenv to your application to make it\nload the configuration from a `.env` file when it is present (e.g. in\ndevelopment) while remaining configurable via the environment:\n\n```python\nfrom dotenv import load_dotenv\n\nload_dotenv()  # reads variables from a .env file and sets them in os.environ\n\n# Code of your application, which uses environment variables (e.g. from `os.environ` or\n# `os.getenv`) as if they came from the actual environment.\n```\n\nBy default, `load_dotenv()` will:\n\n- Look for a `.env` file in the same directory as the Python script (or higher up the directory tree).\n- Read each key-value pair and add it to `os.environ`.\n- **Not override** existing environment variables (`override=False`). Pass `override=True` to override existing variables.\n\nTo configure the development environment, add a `.env` in the root directory of\nyour project:\n\n```\n.\n├── .env\n└── foo.py\n```\n\nThe syntax of `.env` files supported by python-dotenv is similar to that of\nBash:\n\n```bash\n# Development settings\nDOMAIN=example.org\nADMIN_EMAIL=admin@${DOMAIN}\nROOT_URL=${DOMAIN}/app\n```\n\nIf you use variables in values, ensure they are surrounded with `{` and `}`,\nlike `${DOMAIN}`, as bare variables such as `$DOMAIN` are not expanded.\n\nYou will probably want to add `.env` to your `.gitignore`, especially if it\ncontains secrets like a password.\n\nSee the section \"[File format](#file-format)\" below for more information about what you can write in a `.env` file.\n\n## Other Use Cases\n\n### Load configuration without altering the environment\n\nThe function `dotenv_values` works more or less the same way as `load_dotenv`,\nexcept it doesn't touch the environment, it just returns a `dict` with the\nvalues parsed from the `.env` file.\n\n```python\nfrom dotenv import dotenv_values\n\nconfig = dotenv_values(\".env\")  # config = {\"USER\": \"foo\", \"EMAIL\": \"foo@example.org\"}\n```\n\nThis notably enables advanced configuration management:\n\n```python\nimport os\nfrom dotenv import dotenv_values\n\nconfig = {\n    **dotenv_values(\".env.shared\"),  # load shared development variables\n    **dotenv_values(\".env.secret\"),  # load sensitive variables\n    **os.environ,  # override loaded values with environment variables\n}\n```\n\n### Parse configuration as a stream\n\n`load_dotenv` and `dotenv_values` accept [streams][python_streams] via their\n`stream` argument. It is thus possible to load the variables from sources other\nthan the filesystem (e.g. the network).\n\n```python\nfrom io import StringIO\n\nfrom dotenv import load_dotenv\n\nconfig = StringIO(\"USER=foo\\nEMAIL=foo@example.org\")\nload_dotenv(stream=config)\n```\n\n### Load .env files in IPython\n\nYou can use dotenv in IPython. By default, it will use `find_dotenv` to search for a\n`.env` file:\n\n```python\n%load_ext dotenv\n%dotenv\n```\n\nYou can also specify a path:\n\n```python\n%dotenv relative/or/absolute/path/to/.env\n```\n\nOptional flags:\n\n- `-o` to override existing variables.\n- `-v` for increased verbosity.\n\n### Disable load_dotenv\n\nSet `PYTHON_DOTENV_DISABLED=1` to disable `load_dotenv()` from loading .env\nfiles or streams. Useful when you can't modify third-party package calls or in\nproduction.\n\n## Command-line Interface\n\nA CLI interface `dotenv` is also included, which helps you manipulate the `.env`\nfile without manually opening it.\n\n```shell\n$ pip install \"python-dotenv[cli]\"\n$ dotenv set USER foo\n$ dotenv set EMAIL foo@example.org\n$ dotenv list\nUSER=foo\nEMAIL=foo@example.org\n$ dotenv list --format=json\n{\n  \"USER\": \"foo\",\n  \"EMAIL\": \"foo@example.org\"\n}\n$ dotenv run -- python foo.py\n```\n\nRun `dotenv --help` for more information about the options and subcommands.\n\n## File format\n\nThe format is not formally specified and still improves over time. That being\nsaid, `.env` files should mostly look like Bash files. Reading from FIFOs (named\npipes) on Unix systems is also supported.\n\nKeys can be unquoted or single-quoted. Values can be unquoted, single- or\ndouble-quoted. Spaces before and after keys, equal signs, and values are\nignored. Values can be followed by a comment. Lines can start with the `export`\ndirective, which does not affect their interpretation.\n\nAllowed escape sequences:\n\n- in single-quoted values: `\\\\`, `\\'`\n- in double-quoted values: `\\\\`, `\\'`, `\\\"`, `\\a`, `\\b`, `\\f`, `\\n`, `\\r`, `\\t`, `\\v`\n\n### Multiline values\n\nIt is possible for single- or double-quoted values to span multiple lines. The\nfollowing examples are equivalent:\n\n```bash\nFOO=\"first line\nsecond line\"\n```\n\n```bash\nFOO=\"first line\\nsecond line\"\n```\n\n### Variable without a value\n\nA variable can have no value:\n\n```bash\nFOO\n```\n\nIt results in `dotenv_values` associating that variable name with the value\n`None` (e.g. `{\"FOO\": None}`. `load_dotenv`, on the other hand, simply ignores\nsuch variables.\n\nThis shouldn't be confused with `FOO=`, in which case the variable is associated\nwith the empty string.\n\n### Variable expansion\n\npython-dotenv can interpolate variables using POSIX variable expansion.\n\nWith `load_dotenv(override=True)` or `dotenv_values()`, the value of a variable\nis the first of the values defined in the following list:\n\n- Value of that variable in the `.env` file.\n- Value of that variable in the environment.\n- Default value, if provided.\n- Empty string.\n\nWith `load_dotenv(override=False)`, the value of a variable is the first of the\nvalues defined in the following list:\n\n- Value of that variable in the environment.\n- Value of that variable in the `.env` file.\n- Default value, if provided.\n- Empty string.\n\n## Related Projects\n\n- [environs](https://github.com/sloria/environs)\n- [Honcho](https://github.com/nickstenning/honcho)\n- [dump-env](https://github.com/sobolevn/dump-env)\n- [dynaconf](https://github.com/dynaconf/dynaconf)\n- [parse_it](https://github.com/naorlivne/parse_it)\n- [django-dotenv](https://github.com/jpadilla/django-dotenv)\n- [django-environ](https://github.com/joke2k/django-environ)\n- [python-decouple](https://github.com/HBNetwork/python-decouple)\n- [django-configuration](https://github.com/jezdez/django-configurations)\n\n## Acknowledgements\n\nThis project is currently maintained by [Saurabh Kumar][saurabh-homepage] and\n[Bertrand Bonnefoy-Claudet][gh-bbc2] and would not have been possible without\nthe support of these [awesome people][contributors].\n\n[gh-bbc2]: https://github.com/bbc2\n[saurabh-homepage]: https://saurabh-kumar.com\n[pypi_link]: https://badge.fury.io/py/python-dotenv\n[pypi_badge]: https://badge.fury.io/py/python-dotenv.svg\n[python_streams]: https://docs.python.org/3/library/io.html\n[contributors]: https://github.com/theskumar/python-dotenv/graphs/contributors\n[build_status_link]: https://github.com/theskumar/python-dotenv/actions/workflows/test.yml\n[build_status_badge]: https://github.com/theskumar/python-dotenv/actions/workflows/test.yml/badge.svg\n\n# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this\nproject adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [v1.2.2] - 2026-03-01\n\n### Added\n\n- Support for Python 3.14, including the free-threaded (3.14t) build. (#)\n\n### Changed\n\n- The `dotenv run` command now forwards flags directly to the specified command by [@bbc2] in [#607]\n- Improved documentation clarity regarding override behavior and the reference page.\n- Updated PyPy support to version 3.11.\n- Documentation for FIFO file support.\n- Dropped Support for Python 3.9.\n\n### Fixed\n\n- Improved `set_key` and `unset_key` behavior when interacting with symlinks by [@bbc2] in [#790c5](https://github.com/theskumar/python-dotenv/commit/790c5c02991100aa1bf41ee5330aca75edc51311)\n- Corrected the license specifier and added missing Python 3.14 classifiers in package metadata by [@JYOuyang] in [#590]\n\n### Breaking Changes\n\n- `dotenv.set_key` and `dotenv.unset_key` used to follow symlinks in some\n  situations. This is no longer the case. For that behavior to be restored in\n  all cases, `follow_symlinks=True` should be used.\n\n- In the CLI, `set` and `unset` used to follow symlinks in some situations. This\n  is no longer the case.\n\n- `dotenv.set_key`, `dotenv.unset_key` and the CLI commands `set` and `unset`\n  used to reset the file mode of the modified .env file to `0o600` in some\n  situations. This is no longer the case: The original mode of the file is now\n  preserved. Is the file needed to be created or wasn't a regular file, mode\n  `0o600` is used.\n\n## [1.2.1] - 2025-10-26\n\n- Move more config to `pyproject.toml`, removed `setup.cfg`\n- Add support for reading `.env` from FIFOs (Unix) by [@sidharth-sudhir] in [#586]\n\n## [1.2.0] - 2025-10-26\n\n- Upgrade build system to use PEP 517 & PEP 518 to use `build` and `pyproject.toml` by [@EpicWink] in [#583]\n- Add support for Python 3.14 by [@23f3001135] in [#579](https://github.com/theskumar/python-dotenv/pull/563)\n- Add support for disabling of `load_dotenv()` using `PYTHON_DOTENV_DISABLED` env var. by [@matthewfranglen] in [#569]\n\n## [1.1.1] - 2025-06-24\n\n### Fixed\n\n- CLI: Ensure `find_dotenv` work reliably on python 3.13 by [@theskumar] in [#563](https://github.com/theskumar/python-dotenv/pull/563)\n- CLI: revert the use of execvpe on Windows by [@wrongontheinternet] in [#566](https://github.com/theskumar/python-dotenv/pull/566)\n\n## [1.1.0] - 2025-03-25\n\n**Feature**\n\n- Add support for python 3.13\n- Enhance `dotenv run`, switch to `execvpe` for better resource management and signal handling ([#523]) by [@eekstunt]\n\n**Fixed**\n\n- `find_dotenv` and `load_dotenv` now correctly looks up at the current directory when running in debugger or pdb ([#553] by [@randomseed42])\n\n**Misc**\n\n- Drop support for Python 3.8\n\n## [1.0.1] - 2024-01-23\n\n**Fixed**\n\n- Gracefully handle code which has been imported from a zipfile ([#456] by [@samwyma])\n- Allow modules using `load_dotenv` to be reloaded when launched in a separate thread ([#497] by [@freddyaboulton])\n- Fix file not closed after deletion, handle error in the rewrite function ([#469] by [@Qwerty-133])\n\n**Misc**\n\n- Use pathlib.Path in tests ([#466] by [@eumiro])\n- Fix year in release date in changelog.md ([#454] by [@jankislinger])\n- Use https in README links ([#474] by [@Nicals])\n\n## [1.0.0] - 2023-02-24\n\n**Fixed**\n\n- Drop support for python 3.7, add python 3.12-dev (#449 by [@theskumar])\n- Handle situations where the cwd does not exist. (#446 by [@jctanner])\n\n## [0.21.1] - 2023-01-21\n\n**Added**\n\n- Use Python 3.11 non-beta in CI (#438 by [@bbc2])\n- Modernize variables code (#434 by [@Nougat-Waffle])\n- Modernize main.py and parser.py code (#435 by [@Nougat-Waffle])\n- Improve conciseness of cli.py and **init**.py (#439 by [@Nougat-Waffle])\n- Improve error message for `get` and `list` commands when env file can't be opened (#441 by [@bbc2])\n- Updated License to align with BSD OSI template (#433 by [@lsmith77])\n\n**Fixed**\n\n- Fix Out-of-scope error when \"dest\" variable is undefined (#413 by [@theGOTOguy])\n- Fix IPython test warning about deprecated `magic` (#440 by [@bbc2])\n- Fix type hint for dotenv_path var, add StrPath alias (#432 by [@eaf])\n\n## [0.21.0] - 2022-09-03\n\n**Added**\n\n- CLI: add support for invocations via 'python -m'. (#395 by [@theskumar])\n- `load_dotenv` function now returns `False`. (#388 by [@larsks])\n- CLI: add --format= option to list command. (#407 by [@sammck])\n\n**Fixed**\n\n- Drop Python 3.5 and 3.6 and upgrade GA (#393 by [@eggplants])\n- Use `open` instead of `io.open`. (#389 by [@rabinadk1])\n- Improve documentation for variables without a value (#390 by [@bbc2])\n- Add `parse_it` to Related Projects (#410 by [@naorlivne])\n- Update README.md (#415 by [@harveer07])\n- Improve documentation with direct use of MkDocs (#398 by [@bbc2])\n\n## [0.20.0] - 2022-03-24\n\n**Added**\n\n- Add `encoding` (`Optional[str]`) parameter to `get_key`, `set_key` and `unset_key`.\n  (#379 by [@bbc2])\n\n**Fixed**\n\n- Use dict to specify the `entry_points` parameter of `setuptools.setup` (#376 by\n  [@mgorny]).\n- Don't build universal wheels (#387 by [@bbc2]).\n\n## [0.19.2] - 2021-11-11\n\n**Fixed**\n\n- In `set_key`, add missing newline character before new entry if necessary. (#361 by\n  [@bbc2])\n\n## [0.19.1] - 2021-08-09\n\n**Added**\n\n- Add support for Python 3.10. (#359 by [@theskumar])\n\n## [0.19.0] - 2021-07-24\n\n**Changed**\n\n- Require Python 3.5 or a later version. Python 2 and 3.4 are no longer supported. (#341\n  by [@bbc2]).\n\n**Added**\n\n- The `dotenv_path` argument of `set_key` and `unset_key` now has a type of `Union[str,\nos.PathLike]` instead of just `os.PathLike` (#347 by [@bbc2]).\n- The `stream` argument of `load_dotenv` and `dotenv_values` can now be a text stream\n  (`IO[str]`), which includes values like `io.StringIO(\"foo\")` and `open(\"file.env\",\n\"r\")` (#348 by [@bbc2]).\n\n## [0.18.0] - 2021-06-20\n\n**Changed**\n\n- Raise `ValueError` if `quote_mode` isn't one of `always`, `auto` or `never` in\n  `set_key` (#330 by [@bbc2]).\n- When writing a value to a .env file with `set_key` or `dotenv set <key> <value>` (#330\n  by [@bbc2]):\n  - Use single quotes instead of double quotes.\n  - Don't strip surrounding quotes.\n  - In `auto` mode, don't add quotes if the value is only made of alphanumeric characters\n    (as determined by `string.isalnum`).\n\n## [0.17.1] - 2021-04-29\n\n**Fixed**\n\n- Fixed tests for build environments relying on `PYTHONPATH` (#318 by [@befeleme]).\n\n## [0.17.0] - 2021-04-02\n\n**Changed**\n\n- Make `dotenv get <key>` only show the value, not `key=value` (#313 by [@bbc2]).\n\n**Added**\n\n- Add `--override`/`--no-override` option to `dotenv run` (#312 by [@zueve] and [@bbc2]).\n\n## [0.16.0] - 2021-03-27\n\n**Changed**\n\n- The default value of the `encoding` parameter for `load_dotenv` and `dotenv_values` is\n  now `\"utf-8\"` instead of `None` (#306 by [@bbc2]).\n- Fix resolution order in variable expansion with `override=False` (#287 by [@bbc2]).\n\n## [0.15.0] - 2020-10-28\n\n**Added**\n\n- Add `--export` option to `set` to make it prepend the binding with `export` (#270 by\n  [@jadutter]).\n\n**Changed**\n\n- Make `set` command create the `.env` file in the current directory if no `.env` file was\n  found (#270 by [@jadutter]).\n\n**Fixed**\n\n- Fix potentially empty expanded value for duplicate key (#260 by [@bbc2]).\n- Fix import error on Python 3.5.0 and 3.5.1 (#267 by [@gongqingkui]).\n- Fix parsing of unquoted values containing several adjacent space or tab characters\n  (#277 by [@bbc2], review by [@x-yuri]).\n\n## [0.14.0] - 2020-07-03\n\n**Changed**\n\n- Privilege definition in file over the environment in variable expansion (#256 by\n  [@elbehery95]).\n\n**Fixed**\n\n- Improve error message for when file isn't found (#245 by [@snobu]).\n- Use HTTPS URL in package meta data (#251 by [@ekohl]).\n\n## [0.13.0] - 2020-04-16\n\n**Added**\n\n- Add support for a Bash-like default value in variable expansion (#248 by [@bbc2]).\n\n## [0.12.0] - 2020-02-28\n\n**Changed**\n\n- Use current working directory to find `.env` when bundled by PyInstaller (#213 by\n  [@gergelyk]).\n\n**Fixed**\n\n- Fix escaping of quoted values written by `set_key` (#236 by [@bbc2]).\n- Fix `dotenv run` crashing on environment variables without values (#237 by [@yannham]).\n- Remove warning when last line is empty (#238 by [@bbc2]).\n\n## [0.11.0] - 2020-02-07\n\n**Added**\n\n- Add `interpolate` argument to `load_dotenv` and `dotenv_values` to disable interpolation\n  (#232 by [@ulyssessouza]).\n\n**Changed**\n\n- Use logging instead of warnings (#231 by [@bbc2]).\n\n**Fixed**\n\n- Fix installation in non-UTF-8 environments (#225 by [@altendky]).\n- Fix PyPI classifiers (#228 by [@bbc2]).\n\n## [0.10.5] - 2020-01-19\n\n**Fixed**\n\n- Fix handling of malformed lines and lines without a value (#222 by [@bbc2]):\n  - Don't print warning when key has no value.\n  - Reject more malformed lines (e.g. \"A: B\", \"a='b',c\").\n- Fix handling of lines with just a comment (#224 by [@bbc2]).\n\n## [0.10.4] - 2020-01-17\n\n**Added**\n\n- Make typing optional (#179 by [@techalchemy]).\n- Print a warning on malformed line (#211 by [@bbc2]).\n- Support keys without a value (#220 by [@ulyssessouza]).\n\n## 0.10.3\n\n- Improve interactive mode detection ([@andrewsmith])([#183]).\n- Refactor parser to fix parsing inconsistencies ([@bbc2])([#170]).\n  - Interpret escapes as control characters only in double-quoted strings.\n  - Interpret `#` as start of comment only if preceded by whitespace.\n\n## 0.10.2\n\n- Add type hints and expose them to users ([@qnighy])([#172])\n- `load_dotenv` and `dotenv_values` now accept an `encoding` parameter, defaults to `None`\n  ([@theskumar])([@earlbread])([#161])\n- Fix `str`/`unicode` inconsistency in Python 2: values are always `str` now. ([@bbc2])([#121])\n- Fix Unicode error in Python 2, introduced in 0.10.0. ([@bbc2])([#176])\n\n## 0.10.1\n\n- Fix parsing of variable without a value ([@asyncee])([@bbc2])([#158])\n\n## 0.10.0\n\n- Add support for UTF-8 in unquoted values ([@bbc2])([#148])\n- Add support for trailing comments ([@bbc2])([#148])\n- Add backslashes support in values ([@bbc2])([#148])\n- Add support for newlines in values ([@bbc2])([#148])\n- Force environment variables to str with Python2 on Windows ([@greyli])\n- Drop Python 3.3 support ([@greyli])\n- Fix stderr/-out/-in redirection ([@venthur])\n\n## 0.9.0\n\n- Add `--version` parameter to cli ([@venthur])\n- Enable loading from current directory ([@cjauvin])\n- Add 'dotenv run' command for calling arbitrary shell script with .env ([@venthur])\n\n## 0.8.1\n\n- Add tests for docs ([@Flimm])\n- Make 'cli' support optional. Use `pip install python-dotenv[cli]`. ([@theskumar])\n\n## 0.8.0\n\n- `set_key` and `unset_key` only modified the affected file instead of\n  parsing and re-writing file, this causes comments and other file\n  entact as it is.\n- Add support for `export` prefix in the line.\n- Internal refractoring ([@theskumar])\n- Allow `load_dotenv` and `dotenv_values` to work with `StringIO())` ([@alanjds])([@theskumar])([#78])\n\n## 0.7.1\n\n- Remove hard dependency on iPython ([@theskumar])\n\n## 0.7.0\n\n- Add support to override system environment variable via .env.\n  ([@milonimrod](https://github.com/milonimrod))\n  ([\\#63](https://github.com/theskumar/python-dotenv/issues/63))\n- Disable \".env not found\" warning by default\n  ([@maxkoryukov](https://github.com/maxkoryukov))\n  ([\\#57](https://github.com/theskumar/python-dotenv/issues/57))\n\n## 0.6.5\n\n- Add support for special characters `\\`.\n  ([@pjona](https://github.com/pjona))\n  ([\\#60](https://github.com/theskumar/python-dotenv/issues/60))\n\n## 0.6.4\n\n- Fix issue with single quotes ([@Flimm])\n  ([\\#52](https://github.com/theskumar/python-dotenv/issues/52))\n\n## 0.6.3\n\n- Handle unicode exception in setup.py\n  ([\\#46](https://github.com/theskumar/python-dotenv/issues/46))\n\n## 0.6.2\n\n- Fix dotenv list command ([@ticosax](https://github.com/ticosax))\n- Add iPython Support\n  ([@tillahoffmann](https://github.com/tillahoffmann))\n\n## 0.6.0\n\n- Drop support for Python 2.6\n- Handle escaped characters and newlines in quoted values. (Thanks\n  [@iameugenejo](https://github.com/iameugenejo))\n- Remove any spaces around unquoted key/value. (Thanks\n  [@paulochf](https://github.com/paulochf))\n- Added POSIX variable expansion. (Thanks\n  [@hugochinchilla](https://github.com/hugochinchilla))\n\n## 0.5.1\n\n- Fix `find_dotenv` - it now start search from the file where this\n  function is called from.\n\n## 0.5.0\n\n- Add `find_dotenv` method that will try to find a `.env` file.\n  (Thanks [@isms](https://github.com/isms))\n\n## 0.4.0\n\n- cli: Added `-q/--quote` option to control the behaviour of quotes\n  around values in `.env`. (Thanks\n  [@hugochinchilla](https://github.com/hugochinchilla)).\n- Improved test coverage.\n\n<!-- PR LINKS -->\n\n[#78]: https://github.com/theskumar/python-dotenv/issues/78\n[#121]: https://github.com/theskumar/python-dotenv/issues/121\n[#148]: https://github.com/theskumar/python-dotenv/issues/148\n[#158]: https://github.com/theskumar/python-dotenv/issues/158\n[#170]: https://github.com/theskumar/python-dotenv/issues/170\n[#172]: https://github.com/theskumar/python-dotenv/issues/172\n[#176]: https://github.com/theskumar/python-dotenv/issues/176\n[#183]: https://github.com/theskumar/python-dotenv/issues/183\n[#359]: https://github.com/theskumar/python-dotenv/issues/359\n[#469]: https://github.com/theskumar/python-dotenv/issues/469\n[#456]: https://github.com/theskumar/python-dotenv/issues/456\n[#466]: https://github.com/theskumar/python-dotenv/issues/466\n[#454]: https://github.com/theskumar/python-dotenv/issues/454\n[#474]: https://github.com/theskumar/python-dotenv/issues/474\n[#523]: https://github.com/theskumar/python-dotenv/issues/523\n[#553]: https://github.com/theskumar/python-dotenv/issues/553\n[#569]: https://github.com/theskumar/python-dotenv/issues/569\n[#583]: https://github.com/theskumar/python-dotenv/issues/583\n[#586]: https://github.com/theskumar/python-dotenv/issues/586\n[#590]: https://github.com/theskumar/python-dotenv/issues/590\n[#607]: https://github.com/theskumar/python-dotenv/issues/607\n\n<!-- contributors -->\n\n[@23f3001135]: https://github.com/23f3001135\n[@EpicWink]: https://github.com/EpicWink\n[@Flimm]: https://github.com/Flimm\n[@Nicals]: https://github.com/Nicals\n[@Nougat-Waffle]: https://github.com/Nougat-Waffle\n[@Qwerty-133]: https://github.com/Qwerty-133\n[@alanjds]: https://github.com/alanjds\n[@altendky]: https://github.com/altendky\n[@andrewsmith]: https://github.com/andrewsmith\n[@asyncee]: https://github.com/asyncee\n[@bbc2]: https://github.com/bbc2\n[@befeleme]: https://github.com/befeleme\n[@cjauvin]: https://github.com/cjauvin\n[@eaf]: https://github.com/eaf\n[@earlbread]: https://github.com/earlbread\n[@eekstunt]: https://github.com/eekstunt\n[@eggplants]: https://github.com/@eggplants\n[@ekohl]: https://github.com/ekohl\n[@elbehery95]: https://github.com/elbehery95\n[@eumiro]: https://github.com/eumiro\n[@freddyaboulton]: https://github.com/freddyaboulton\n[@gergelyk]: https://github.com/gergelyk\n[@gongqingkui]: https://github.com/gongqingkui\n[@greyli]: https://github.com/greyli\n[@harveer07]: https://github.com/@harveer07\n[@jadutter]: https://github.com/jadutter\n[@jankislinger]: https://github.com/jankislinger\n[@jctanner]: https://github.com/jctanner\n[@larsks]: https://github.com/@larsks\n[@lsmith77]: https://github.com/lsmith77\n[@matthewfranglen]: https://github.com/matthewfranglen\n[@mgorny]: https://github.com/mgorny\n[@naorlivne]: https://github.com/@naorlivne\n[@qnighy]: https://github.com/qnighy\n[@rabinadk1]: https://github.com/@rabinadk1\n[@randomseed42]: https://github.com/zueve\n[@sammck]: https://github.com/@sammck\n[@samwyma]: https://github.com/samwyma\n[@sidharth-sudhir]: https://github.com/sidharth-sudhir\n[@snobu]: https://github.com/snobu\n[@techalchemy]: https://github.com/techalchemy\n[@theGOTOguy]: https://github.com/theGOTOguy\n[@theskumar]: https://github.com/theskumar\n[@ulyssessouza]: https://github.com/ulyssessouza\n[@venthur]: https://github.com/venthur\n[@wrongontheinternet]: https://github.com/wrongontheinternet\n[@x-yuri]: https://github.com/x-yuri\n[@yannham]: https://github.com/yannham\n[@zueve]: https://github.com/zueve\n[@JYOuyang]: https://github.com/JYOuyang\n[@burnout-projects]: https://github.com/burnout-projects\n[@cpackham-atlnz]: https://github.com/cpackham-atlnz\n[Unreleased]: https://github.com/theskumar/python-dotenv/compare/v1.2.2...HEAD\n[1.2.2]: https://github.com/theskumar/python-dotenv/compare/v1.2.1...v1.2.2\n[1.2.1]: https://github.com/theskumar/python-dotenv/compare/v1.2.0...v1.2.1\n[1.2.0]: https://github.com/theskumar/python-dotenv/compare/v1.1.1...v1.2.0\n[1.1.1]: https://github.com/theskumar/python-dotenv/compare/v1.1.0...v1.1.1\n[1.1.0]: https://github.com/theskumar/python-dotenv/compare/v1.0.1...v1.1.0\n[1.0.1]: https://github.com/theskumar/python-dotenv/compare/v1.0.0...v1.0.1\n[1.0.0]: https://github.com/theskumar/python-dotenv/compare/v0.21.0...v1.0.0\n[0.21.1]: https://github.com/theskumar/python-dotenv/compare/v0.21.0...v0.21.1\n[0.21.0]: https://github.com/theskumar/python-dotenv/compare/v0.20.0...v0.21.0\n[0.20.0]: https://github.com/theskumar/python-dotenv/compare/v0.19.2...v0.20.0\n[0.19.2]: https://github.com/theskumar/python-dotenv/compare/v0.19.1...v0.19.2\n[0.19.1]: https://github.com/theskumar/python-dotenv/compare/v0.19.0...v0.19.1\n[0.19.0]: https://github.com/theskumar/python-dotenv/compare/v0.18.0...v0.19.0\n[0.18.0]: https://github.com/theskumar/python-dotenv/compare/v0.17.1...v0.18.0\n[0.17.1]: https://github.com/theskumar/python-dotenv/compare/v0.17.0...v0.17.1\n[0.17.0]: https://github.com/theskumar/python-dotenv/compare/v0.16.0...v0.17.0\n[0.16.0]: https://github.com/theskumar/python-dotenv/compare/v0.15.0...v0.16.0\n[0.15.0]: https://github.com/theskumar/python-dotenv/compare/v0.14.0...v0.15.0\n[0.14.0]: https://github.com/theskumar/python-dotenv/compare/v0.13.0...v0.14.0\n[0.13.0]: https://github.com/theskumar/python-dotenv/compare/v0.12.0...v0.13.0\n[0.12.0]: https://github.com/theskumar/python-dotenv/compare/v0.11.0...v0.12.0\n[0.11.0]: https://github.com/theskumar/python-dotenv/compare/v0.10.5...v0.11.0\n[0.10.5]: https://github.com/theskumar/python-dotenv/compare/v0.10.4...v0.10.5\n[0.10.4]: https://github.com/theskumar/python-dotenv/compare/v0.10.3...v0.10.4\n",
        "description_content_type": "text/markdown",
        "keywords": [
          "environment variables",
          "deployments",
          "settings",
          "env",
          "dotenv",
          "configurations",
          "python"
        ],
        "author_email": "Saurabh Kumar <me+github@saurabh-kumar.com>",
        "license": "BSD-3-Clause",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Intended Audience :: Developers",
          "Intended Audience :: System Administrators",
          "Operating System :: OS Independent",
          "Topic :: System :: Systems Administration",
          "Topic :: Utilities",
          "Environment :: Web Environment"
        ],
        "requires_dist": [
          "click>=5.0; extra == \"cli\""
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Source, https://github.com/theskumar/python-dotenv"
        ],
        "provides_extra": [
          "cli"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/python_dotenv-1.2.2.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "termcolor",
        "version": "3.3.0",
        "summary": "ANSI color formatting for output in terminal",
        "description": "# termcolor\n\n[![PyPI version](https://img.shields.io/pypi/v/termcolor.svg?logo=pypi&logoColor=FFE873)](https://pypi.org/project/termcolor)\n[![Supported Python versions](https://img.shields.io/pypi/pyversions/termcolor.svg?logo=python&logoColor=FFE873)](https://pypi.org/project/termcolor)\n[![PyPI downloads](https://img.shields.io/pypi/dm/termcolor.svg)](https://pypistats.org/packages/termcolor)\n[![GitHub Actions status](https://github.com/termcolor/termcolor/workflows/Test/badge.svg)](https://github.com/termcolor/termcolor/actions)\n[![Codecov](https://codecov.io/gh/termcolor/termcolor/branch/main/graph/badge.svg)](https://codecov.io/gh/termcolor/termcolor)\n[![Licence](https://img.shields.io/github/license/termcolor/termcolor.svg)](COPYING.txt)\n[![Code style: Black](https://img.shields.io/badge/code%20style-Black-000000.svg)](https://github.com/psf/black)\n[![Tidelift](https://tidelift.com/badges/package/pypi/termcolor)](https://tidelift.com/subscription/pkg/pypi-termcolor?utm_source=pypi-termcolor&utm_medium=referral&utm_campaign=readme)\n\n## Installation\n\n### From PyPI\n\n```bash\npython3 -m pip install --upgrade termcolor\n```\n\n### From source\n\n```bash\ngit clone https://github.com/termcolor/termcolor\ncd termcolor\npython3 -m pip install .\n```\n\n### Demo\n\nTo see demo output, run:\n\n```bash\npython3 -m termcolor\n```\n\n## Example\n\n```python\nimport sys\n\nfrom termcolor import colored, cprint\n\ntext = colored(\"Hello, World!\", \"red\", attrs=[\"reverse\", \"blink\"])\nprint(text)\ncprint(\"Hello, World!\", \"green\", \"on_red\")\n\nprint_red_on_cyan = lambda x: cprint(x, \"red\", \"on_cyan\")\nprint_red_on_cyan(\"Hello, World!\")\nprint_red_on_cyan(\"Hello, Universe!\")\n\nfor i in range(10):\n    cprint(i, \"magenta\", end=\" \")\n\ncprint(\"Attention!\", \"red\", attrs=[\"bold\"], file=sys.stderr)\n\n# You can also specify 0-255 RGB ints via a tuple\ncprint(\"Both foreground and background can use tuples\", (100, 150, 250), (50, 60, 70))\n```\n\n## Text properties\n\n| Text colors     | Text highlights    | Attributes  |\n| --------------- | ------------------ | ----------- |\n| `black`         | `on_black`         | `bold`      |\n| `red`           | `on_red`           | `dark`      |\n| `green`         | `on_green`         | `italic`    |\n| `yellow`        | `on_yellow`        | `underline` |\n| `blue`          | `on_blue`          | `blink`     |\n| `magenta`       | `on_magenta`       | `reverse`   |\n| `cyan`          | `on_cyan`          | `concealed` |\n| `white`         | `on_white`         | `strike`    |\n| `light_grey`    | `on_light_grey`    |             |\n| `dark_grey`     | `on_dark_grey`     |             |\n| `light_red`     | `on_light_red`     |             |\n| `light_green`   | `on_light_green`   |             |\n| `light_yellow`  | `on_light_yellow`  |             |\n| `light_blue`    | `on_light_blue`    |             |\n| `light_magenta` | `on_light_magenta` |             |\n| `light_cyan`    | `on_light_cyan`    |             |\n\nYou can also use any arbitrary RGB color specified as a tuple of 0-255 integers, for\nexample, `(100, 150, 250)`.\n\n## Terminal properties\n\n| Terminal     | bold    | dark | italic | underline | blink      | reverse | concealed |\n| ------------ | ------- | ---- | ------ | --------- | ---------- | ------- | --------- |\n| xterm        | yes     | no   | yes    | yes       | bold       | yes     | yes       |\n| linux        | yes     | yes  | color  | bold      | yes        | yes     | no        |\n| rxvt         | yes     | no   | yes    | yes       | bold/black | yes     | no        |\n| dtterm       | yes     | yes  | ?      | yes       | reverse    | yes     | yes       |\n| teraterm     | reverse | no   | ?      | yes       | rev/red    | yes     | no        |\n| aixterm      | normal  | no   | ?      | yes       | no         | yes     | yes       |\n| PuTTY        | color   | no   | no     | yes       | no         | yes     | no        |\n| Windows      | no      | no   | no     | no        | no         | yes     | no        |\n| Cygwin SSH   | yes     | no   | ?      | color     | color      | color   | yes       |\n| Mac Terminal | yes     | no   | yes    | yes       | yes        | yes     | yes       |\n\n## Overrides\n\nTerminal colour detection can be disabled or enabled in several ways.\n\nIn order of precedence:\n\n1. Calling `colored` or `cprint` with a truthy `no_color` disables colour.\n2. Calling `colored` or `cprint` with a truthy `force_color` forces colour.\n3. Setting the `ANSI_COLORS_DISABLED` environment variable to any non-empty value\n   disables colour.\n4. Setting the [`NO_COLOR`](https://no-color.org/) environment variable to any non-empty\n   value disables colour.\n5. Setting the [`FORCE_COLOR`](https://force-color.org/) environment variable to any\n   non-empty value forces colour.\n6. Setting the `TERM` environment variable to `dumb`, or using such a\n   [dumb terminal](https://en.wikipedia.org/wiki/Computer_terminal#Character-oriented_terminal),\n   disables colour.\n7. Finally, termcolor will attempt to detect whether the terminal supports colour.\n",
        "description_content_type": "text/markdown",
        "keywords": [
          "ANSI",
          "ANSI color",
          "ANSI colour",
          "color",
          "colour",
          "formatting",
          "termcolor",
          "terminal"
        ],
        "author_email": "Konstantin Lepa <konstantin.lepa@gmail.com>",
        "maintainer": "Hugo van Kemenade",
        "license_expression": "MIT",
        "license_file": [
          "COPYING.txt"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Environment :: Console",
          "Intended Audience :: Developers",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: 3.15",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: Terminals",
          "Typing :: Typed"
        ],
        "requires_dist": [
          "pytest; extra == 'tests'",
          "pytest-cov; extra == 'tests'"
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Changelog, https://github.com/termcolor/termcolor/releases",
          "Homepage, https://github.com/termcolor/termcolor",
          "Source, https://github.com/termcolor/termcolor"
        ],
        "provides_extra": [
          "tests"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/termcolor-3.3.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "ruamel.yaml.clib",
        "version": "0.2.15",
        "dynamic": [
          "author",
          "author-email",
          "classifier",
          "description",
          "description-content-type",
          "keywords",
          "license",
          "license-file",
          "project-url",
          "requires-python",
          "summary"
        ],
        "summary": "C version of reader, parser and emitter for ruamel.yaml derived from libyaml",
        "description": "\n# ruamel.yaml.clib\n\n`ruamel.yaml.clib` is the C based reader/scanner and emitter for ruamel.yaml\n\n<table class=\"docutils\">\n  <tr>\n    <td>version</td>\n    <td>0.2.15</td>\n  </tr>\n  <tr>\n    <td>updated</td>\n    <td>2025-11-16</td>\n  </tr>\n  <tr>\n    <td>documentation</td>\n    <td><a href=\"https://yaml.dev/doc/ruamel.yaml.clib\">https://yaml.dev/doc/ruamel.yaml.clib</a></td>\n  </tr>\n  <tr>\n    <td>repository</td>\n    <td><a href=\"https://sourceforge.net/projects/ruamel-yaml-clib/\">https://sourceforge.net/projects/ruamel-yaml-clib/</a></td>\n  </tr>\n  <tr>\n    <td>pypi</td>\n    <td><a href=\"https://pypi.org/project/ruamel.yaml.clib/\">https://pypi.org/project/ruamel.yaml.clib/</a></td>\n  </tr>\n</table>\n\n\nThis package was split of from ruamel.yaml, so that ruamel.yaml can be\nbuild as a universal wheel. Apart from the C code seldom changing, and\ntaking a long time to compile for all platforms, this allows\ninstallation of the .so on Linux systems under /usr/lib64/pythonX.Y\n(without a .pth file or a ruamel directory) and the Python code for\nruamel.yaml under /usr/lib/pythonX.Y.\n\nFor packaging purposes you can use a download of the [tar balls of tagged source](https://yaml.dev/ruamel-dl-tagged-releases)\n\n[![image](https://bestpractices.coreinfrastructure.org/projects/1128/badge)](https://bestpractices.coreinfrastructure.org/projects/1128)\n[![image](https://sourceforge.net/p/ruamel-yaml-clib/code/ci/default/tree/_doc/_static/license.svg?format=raw)](https://opensource.org/licenses/MIT)\n[![image](https://sourceforge.net/p/ruamel-yaml-clib/code/ci/default/tree/_doc/_static/pypi.svg?format=raw)](https://pypi.org/project/ruamel.yaml.clib/)\n\nThis release in loving memory of \nJohanna Clasina van der Neut-Bandel \\[1922-10-19 – 2015-11-21\\] and \nJan van der Neut \\[1919-12-01 – 1998-11-19\\]. \n\nKlaus E. \\[1938-04-25 – 2025-11-01\\],\nthanx for your help and trust, I do miss \"Und was macht Coco?\".\n",
        "description_content_type": "text/markdown; charset=UTF-8; variant=CommonMark",
        "keywords": [
          "yaml",
          "1.2",
          "parser",
          "c-library",
          "config"
        ],
        "author": "Anthon van der Neut",
        "author_email": "a.van.der.neut@ruamel.eu",
        "license": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 4 - Beta",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: MIT License",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Implementation :: CPython",
          "Topic :: Software Development :: Libraries :: Python Modules"
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Home, https://sourceforge.net/p/ruamel-yaml-clib/",
          "Source, https://sourceforge.net/p/ruamel-yaml-clib/code/ci/default/tree/",
          "Tracker, https://sourceforge.net/p/ruamel-yaml-clib/tickets/",
          "Documentation, https://yaml.dev/doc/ruamel.yaml.clib/"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/ruamel_yaml_clib-0.2.15.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "typing-inspection",
        "version": "0.4.2",
        "summary": "Runtime typing introspection tools",
        "description": "# typing-inspection\n\n[![CI](https://img.shields.io/github/actions/workflow/status/pydantic/typing-inspection/ci.yml?branch=main&logo=github&label=CI)](https://github.com/pydantic/typing-inspection/actions?query=event%3Apush+branch%3Amain+workflow%3ACI)\n[![Coverage](https://coverage-badge.samuelcolvin.workers.dev/pydantic/typing-inspection.svg)](https://coverage-badge.samuelcolvin.workers.dev/redirect/pydantic/typing-inspection)\n[![PyPI](https://img.shields.io/pypi/v/typing-inspection.svg)](https://pypi.org/project/typing-inspection/)\n[![Versions](https://img.shields.io/pypi/pyversions/typing-inspection.svg)](https://github.com/pydantic/typing-inspection)\n[![License](https://img.shields.io/github/license/pydantic/typing-inspection.svg)](https://github.com/pydantic/typing-inspection/blob/main/LICENSE)\n[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n\n`typing-inspection` provides tools to inspect type annotations at runtime.\n\n## Installation\n\nFrom [PyPI](https://pypi.org/project/typing-inspection/):\n\n```bash\npip install typing-inspection\n```\n\nThe library can be imported from the `typing_inspection` module.\n",
        "description_content_type": "text/markdown",
        "author_email": "Victorien Plot <contact@vctrn.dev>",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 3 - Alpha",
          "Intended Audience :: Developers",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Implementation :: CPython",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Typing :: Typed"
        ],
        "requires_dist": [
          "typing-extensions>=4.12.0"
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Homepage, https://github.com/pydantic/typing-inspection",
          "Documentation, https://pydantic.github.io/typing-inspection/dev/",
          "Source, https://github.com/pydantic/typing-inspection",
          "Changelog, https://github.com/pydantic/typing-inspection/blob/main/HISTORY.md"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/typing_inspection-0.4.2.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.1",
        "name": "ptyprocess",
        "version": "0.7.0",
        "summary": "Run a subprocess in a pseudo terminal",
        "description": "Launch a subprocess in a pseudo terminal (pty), and interact with both the\nprocess and its pty.\n\nSometimes, piping stdin and stdout is not enough. There might be a password\nprompt that doesn't read from stdin, output that changes when it's going to a\npipe rather than a terminal, or curses-style interfaces that rely on a terminal.\nIf you need to automate these things, running the process in a pseudo terminal\n(pty) is the answer.\n\nInterface::\n\n    p = PtyProcessUnicode.spawn(['python'])\n    p.read(20)\n    p.write('6+6\\n')\n    p.read(20)\n\n",
        "description_content_type": "text/x-rst",
        "home_page": "https://github.com/pexpect/ptyprocess",
        "author": "Thomas Kluyver",
        "author_email": "thomas@kluyver.me.uk",
        "license": "UNKNOWN",
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Environment :: Console",
          "Intended Audience :: Developers",
          "Intended Audience :: System Administrators",
          "License :: OSI Approved :: ISC License (ISCL)",
          "Operating System :: POSIX",
          "Operating System :: MacOS :: MacOS X",
          "Programming Language :: Python",
          "Programming Language :: Python :: 2.7",
          "Programming Language :: Python :: 3",
          "Topic :: Terminals"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/ptyprocess-0.7.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "packaging",
        "version": "26.0",
        "summary": "Core utilities for Python packages",
        "description": "packaging\n=========\n\n.. start-intro\n\nReusable core utilities for various Python Packaging\n`interoperability specifications <https://packaging.python.org/specifications/>`_.\n\nThis library provides utilities that implement the interoperability\nspecifications which have clearly one correct behaviour (eg: :pep:`440`)\nor benefit greatly from having a single shared implementation (eg: :pep:`425`).\n\n.. end-intro\n\nThe ``packaging`` project includes the following: version handling, specifiers,\nmarkers, requirements, tags, metadata, lockfiles, utilities.\n\nDocumentation\n-------------\n\nThe `documentation`_ provides information and the API for the following:\n\n- Version Handling\n- Specifiers\n- Markers\n- Requirements\n- Tags\n- Metadata\n- Lockfiles\n- Utilities\n\nInstallation\n------------\n\nUse ``pip`` to install these utilities::\n\n    pip install packaging\n\nThe ``packaging`` library uses calendar-based versioning (``YY.N``).\n\nDiscussion\n----------\n\nIf you run into bugs, you can file them in our `issue tracker`_.\n\nYou can also join ``#pypa`` on Freenode to ask questions or get involved.\n\n\n.. _`documentation`: https://packaging.pypa.io/\n.. _`issue tracker`: https://github.com/pypa/packaging/issues\n\n\nCode of Conduct\n---------------\n\nEveryone interacting in the packaging project's codebases, issue trackers, chat\nrooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.\n\n.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md\n\nContributing\n------------\n\nThe ``CONTRIBUTING.rst`` file outlines how to contribute to this project as\nwell as how to report a potential security issue. The documentation for this\nproject also covers information about `project development`_ and `security`_.\n\n.. _`project development`: https://packaging.pypa.io/en/latest/development/\n.. _`security`: https://packaging.pypa.io/en/latest/security/\n\nProject History\n---------------\n\nPlease review the ``CHANGELOG.rst`` file or the `Changelog documentation`_ for\nrecent changes and project history.\n\n.. _`Changelog documentation`: https://packaging.pypa.io/en/latest/changelog/\n\n",
        "description_content_type": "text/x-rst",
        "author_email": "Donald Stufft <donald@stufft.io>",
        "license_expression": "Apache-2.0 OR BSD-2-Clause",
        "license_file": [
          "LICENSE",
          "LICENSE.APACHE",
          "LICENSE.BSD"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Typing :: Typed"
        ],
        "requires_python": ">=3.8",
        "project_url": [
          "Documentation, https://packaging.pypa.io/",
          "Source, https://github.com/pypa/packaging"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/packaging-26.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "Markdown",
        "version": "3.10.2",
        "dynamic": [
          "license-file"
        ],
        "summary": "Python implementation of John Gruber's Markdown.",
        "description": "[Python-Markdown][]\n===================\n\n[![Build Status][build-button]][build]\n[![Coverage Status][codecov-button]][codecov]\n[![Latest Version][mdversion-button]][md-pypi]\n[![Python Versions][pyversion-button]][md-pypi]\n[![BSD License][bsdlicense-button]][bsdlicense]\n[![Code of Conduct][codeofconduct-button]][Code of Conduct]\n\n[build-button]: https://github.com/Python-Markdown/markdown/actions/workflows/tox.yml/badge.svg\n[build]: https://github.com/Python-Markdown/markdown/actions/workflows/tox.yml\n[codecov-button]: https://codecov.io/gh/Python-Markdown/markdown/branch/master/graph/badge.svg\n[codecov]: https://codecov.io/gh/Python-Markdown/markdown\n[mdversion-button]: https://img.shields.io/pypi/v/Markdown.svg\n[md-pypi]: https://pypi.org/project/Markdown/\n[pyversion-button]: https://img.shields.io/pypi/pyversions/Markdown.svg\n[bsdlicense-button]: https://img.shields.io/badge/license-BSD-yellow.svg\n[bsdlicense]: https://opensource.org/licenses/BSD-3-Clause\n[codeofconduct-button]: https://img.shields.io/badge/code%20of%20conduct-contributor%20covenant-green.svg?style=flat-square\n[Code of Conduct]: https://github.com/Python-Markdown/markdown/blob/master/CODE_OF_CONDUCT.md\n\nThis is a Python implementation of John Gruber's [Markdown][].\nIt is almost completely compliant with the reference implementation,\nthough there are a few known issues. See [Features][] for information\non what exactly is supported and what is not. Additional features are\nsupported by the [Available Extensions][].\n\n[Python-Markdown]: https://Python-Markdown.github.io/\n[Markdown]: https://daringfireball.net/projects/markdown/\n[Features]: https://Python-Markdown.github.io#Features\n[Available Extensions]: https://Python-Markdown.github.io/extensions\n\nDocumentation\n-------------\n\n```bash\npip install markdown\n```\n```python\nimport markdown\nhtml = markdown.markdown(your_text_string)\n```\n\nFor more advanced [installation] and [usage] documentation, see the `docs/` directory\nof the distribution or the project website at <https://Python-Markdown.github.io/>.\n\n[installation]: https://python-markdown.github.io/install/\n[usage]: https://python-markdown.github.io/reference/\n\nSee the change log at <https://python-markdown.github.io/changelog/>.\n\nSupport\n-------\n\nYou may report bugs, ask for help, and discuss various other issues on the [bug tracker][].\n\n[bug tracker]: https://github.com/Python-Markdown/markdown/issues\n\nCode of Conduct\n---------------\n\nEveryone interacting in the Python-Markdown project's code bases, issue trackers,\nand mailing lists is expected to follow the [Code of Conduct].\n",
        "description_content_type": "text/markdown",
        "keywords": [
          "markdown",
          "markdown-parser",
          "python-markdown",
          "markdown-to-html"
        ],
        "author": "Manfred Stienstra, Yuri Takhteyev",
        "author_email": "Waylan limberg <python.markdown@gmail.com>",
        "maintainer": "Isaac Muse",
        "maintainer_email": "Waylan Limberg <python.markdown@gmail.com>",
        "license_expression": "BSD-3-Clause",
        "license_file": [
          "LICENSE.md"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: Communications :: Email :: Filters",
          "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries",
          "Topic :: Internet :: WWW/HTTP :: Site Management",
          "Topic :: Software Development :: Documentation",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Topic :: Text Processing :: Filters",
          "Topic :: Text Processing :: Markup :: HTML",
          "Topic :: Text Processing :: Markup :: Markdown"
        ],
        "requires_dist": [
          "coverage; extra == \"testing\"",
          "pyyaml; extra == \"testing\"",
          "mkdocs>=1.6; extra == \"docs\"",
          "mkdocs-nature>=0.6; extra == \"docs\"",
          "mdx_gh_links>=0.2; extra == \"docs\"",
          "mkdocstrings[python]>=0.28.3; extra == \"docs\"",
          "mkdocs-gen-files; extra == \"docs\"",
          "mkdocs-section-index; extra == \"docs\"",
          "mkdocs-literate-nav; extra == \"docs\""
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Homepage, https://Python-Markdown.github.io/",
          "Documentation, https://Python-Markdown.github.io/",
          "Repository, https://github.com/Python-Markdown/markdown",
          "Issue Tracker, https://github.com/Python-Markdown/markdown/issues",
          "Changelog, https://python-markdown.github.io/changelog/"
        ],
        "provides_extra": [
          "testing",
          "docs"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/markdown-3.10.2.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "certifi",
        "version": "2026.5.20",
        "dynamic": [
          "author",
          "author-email",
          "classifier",
          "description",
          "home-page",
          "license",
          "license-file",
          "project-url",
          "requires-python",
          "summary"
        ],
        "summary": "Python package for providing Mozilla's CA Bundle.",
        "description": "Certifi: Python SSL Certificates\n================================\n\nCertifi provides Mozilla's carefully curated collection of Root Certificates for\nvalidating the trustworthiness of SSL certificates while verifying the identity\nof TLS hosts. It has been extracted from the `Requests`_ project.\n\nInstallation\n------------\n\n``certifi`` is available on PyPI. Simply install it with ``pip``::\n\n    $ pip install certifi\n\nUsage\n-----\n\nTo reference the installed certificate authority (CA) bundle, you can use the\nbuilt-in function::\n\n    >>> import certifi\n\n    >>> certifi.where()\n    '/usr/local/lib/python3.7/site-packages/certifi/cacert.pem'\n\nOr from the command line::\n\n    $ python -m certifi\n    /usr/local/lib/python3.7/site-packages/certifi/cacert.pem\n\nEnjoy!\n\n.. _`Requests`: https://requests.readthedocs.io/en/master/\n\nAddition/Removal of Certificates\n--------------------------------\n\nCertifi does not support any addition/removal or other modification of the\nCA trust store content. This project is intended to provide a reliable and\nhighly portable root of trust to python deployments. Look to upstream projects\nfor methods to use alternate trust.\n",
        "home_page": "https://github.com/certifi/python-certifi",
        "author": "Kenneth Reitz",
        "author_email": "me@kennethreitz.com",
        "license": "MPL-2.0",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)",
          "Natural Language :: English",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.7",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14"
        ],
        "requires_python": ">=3.7",
        "project_url": [
          "Source, https://github.com/certifi/python-certifi"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/certifi-2026.5.20.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "ruff",
        "version": "0.15.10",
        "summary": "An extremely fast Python linter and code formatter, written in Rust.",
        "description": "<!-- Begin section: Overview -->\n\n# Ruff\n\n[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n[![image](https://img.shields.io/pypi/v/ruff.svg)](https://pypi.python.org/pypi/ruff)\n[![image](https://img.shields.io/pypi/l/ruff.svg)](https://github.com/astral-sh/ruff/blob/main/LICENSE)\n[![image](https://img.shields.io/pypi/pyversions/ruff.svg)](https://pypi.python.org/pypi/ruff)\n[![Actions status](https://github.com/astral-sh/ruff/workflows/CI/badge.svg)](https://github.com/astral-sh/ruff/actions)\n[![Discord](https://img.shields.io/badge/Discord-%235865F2.svg?logo=discord&logoColor=white)](https://discord.com/invite/astral-sh)\n\n[**Docs**](https://docs.astral.sh/ruff/) | [**Playground**](https://play.ruff.rs/)\n\nAn extremely fast Python linter and code formatter, written in Rust.\n\n<p align=\"center\">\n  <img alt=\"Shows a bar chart with benchmark results.\" src=\"https://user-images.githubusercontent.com/1309177/232603516-4fb4892d-585c-4b20-b810-3db9161831e4.svg\">\n</p>\n\n<p align=\"center\">\n  <i>Linting the CPython codebase from scratch.</i>\n</p>\n\n- ⚡️ 10-100x faster than existing linters (like Flake8) and formatters (like Black)\n- 🐍 Installable via `pip`\n- 🛠️ `pyproject.toml` support\n- 🤝 Python 3.14 compatibility\n- ⚖️ Drop-in parity with [Flake8](https://docs.astral.sh/ruff/faq/#how-does-ruffs-linter-compare-to-flake8), isort, and [Black](https://docs.astral.sh/ruff/faq/#how-does-ruffs-formatter-compare-to-black)\n- 📦 Built-in caching, to avoid re-analyzing unchanged files\n- 🔧 Fix support, for automatic error correction (e.g., automatically remove unused imports)\n- 📏 Over [800 built-in rules](https://docs.astral.sh/ruff/rules/), with native re-implementations\n    of popular Flake8 plugins, like flake8-bugbear\n- ⌨️ First-party [editor integrations](https://docs.astral.sh/ruff/editors) for [VS Code](https://github.com/astral-sh/ruff-vscode) and [more](https://docs.astral.sh/ruff/editors/setup)\n- 🌎 Monorepo-friendly, with [hierarchical and cascading configuration](https://docs.astral.sh/ruff/configuration/#config-file-discovery)\n\nRuff aims to be orders of magnitude faster than alternative tools while integrating more\nfunctionality behind a single, common interface.\n\nRuff can be used to replace [Flake8](https://pypi.org/project/flake8/) (plus dozens of plugins),\n[Black](https://github.com/psf/black), [isort](https://pypi.org/project/isort/),\n[pydocstyle](https://pypi.org/project/pydocstyle/), [pyupgrade](https://pypi.org/project/pyupgrade/),\n[autoflake](https://pypi.org/project/autoflake/), and more, all while executing tens or hundreds of\ntimes faster than any individual tool.\n\nRuff is extremely actively developed and used in major open-source projects like:\n\n- [Apache Airflow](https://github.com/apache/airflow)\n- [Apache Superset](https://github.com/apache/superset)\n- [FastAPI](https://github.com/tiangolo/fastapi)\n- [Hugging Face](https://github.com/huggingface/transformers)\n- [Pandas](https://github.com/pandas-dev/pandas)\n- [SciPy](https://github.com/scipy/scipy)\n\n...and [many more](#whos-using-ruff).\n\nRuff is backed by [Astral](https://astral.sh), the creators of\n[uv](https://github.com/astral-sh/uv) and [ty](https://github.com/astral-sh/ty).\n\nRead the [launch\npost](https://astral.sh/blog/announcing-astral-the-company-behind-ruff), or the\noriginal [project\nannouncement](https://notes.crmarsh.com/python-tooling-could-be-much-much-faster).\n\n## Testimonials\n\n[**Sebastián Ramírez**](https://twitter.com/tiangolo/status/1591912354882764802), creator\nof [FastAPI](https://github.com/tiangolo/fastapi):\n\n> Ruff is so fast that sometimes I add an intentional bug in the code just to confirm it's actually\n> running and checking the code.\n\n[**Nick Schrock**](https://twitter.com/schrockn/status/1612615862904827904), founder of [Elementl](https://www.elementl.com/),\nco-creator of [GraphQL](https://graphql.org/):\n\n> Why is Ruff a gamechanger? Primarily because it is nearly 1000x faster. Literally. Not a typo. On\n> our largest module (dagster itself, 250k LOC) pylint takes about 2.5 minutes, parallelized across 4\n> cores on my M1. Running ruff against our _entire_ codebase takes .4 seconds.\n\n[**Bryan Van de Ven**](https://github.com/bokeh/bokeh/pull/12605), co-creator\nof [Bokeh](https://github.com/bokeh/bokeh/), original author\nof [Conda](https://docs.conda.io/en/latest/):\n\n> Ruff is ~150-200x faster than flake8 on my machine, scanning the whole repo takes ~0.2s instead of\n> ~20s. This is an enormous quality of life improvement for local dev. It's fast enough that I added\n> it as an actual commit hook, which is terrific.\n\n[**Timothy Crosley**](https://twitter.com/timothycrosley/status/1606420868514877440),\ncreator of [isort](https://github.com/PyCQA/isort):\n\n> Just switched my first project to Ruff. Only one downside so far: it's so fast I couldn't believe\n> it was working till I intentionally introduced some errors.\n\n[**Tim Abbott**](https://github.com/zulip/zulip/pull/23431#issuecomment-1302557034), lead developer of [Zulip](https://github.com/zulip/zulip) (also [here](https://github.com/astral-sh/ruff/issues/465#issuecomment-1317400028)):\n\n> This is just ridiculously fast... `ruff` is amazing.\n\n<!-- End section: Overview -->\n\n## Table of Contents\n\nFor more, see the [documentation](https://docs.astral.sh/ruff/).\n\n1. [Getting Started](#getting-started)\n1. [Configuration](#configuration)\n1. [Rules](#rules)\n1. [Contributing](#contributing)\n1. [Support](#support)\n1. [Acknowledgements](#acknowledgements)\n1. [Who's Using Ruff?](#whos-using-ruff)\n1. [License](#license)\n\n## Getting Started<a id=\"getting-started\"></a>\n\nFor more, see the [documentation](https://docs.astral.sh/ruff/).\n\n### Installation\n\nRuff is available as [`ruff`](https://pypi.org/project/ruff/) on PyPI.\n\nInvoke Ruff directly with [`uvx`](https://docs.astral.sh/uv/):\n\n```shell\nuvx ruff check   # Lint all files in the current directory.\nuvx ruff format  # Format all files in the current directory.\n```\n\nOr install Ruff with `uv` (recommended), `pip`, or `pipx`:\n\n```shell\n# With uv.\nuv tool install ruff@latest  # Install Ruff globally.\nuv add --dev ruff            # Or add Ruff to your project.\n\n# With pip.\npip install ruff\n\n# With pipx.\npipx install ruff\n```\n\nStarting with version `0.5.0`, Ruff can be installed with our standalone installers:\n\n```shell\n# On macOS and Linux.\ncurl -LsSf https://astral.sh/ruff/install.sh | sh\n\n# On Windows.\npowershell -c \"irm https://astral.sh/ruff/install.ps1 | iex\"\n\n# For a specific version.\ncurl -LsSf https://astral.sh/ruff/0.15.10/install.sh | sh\npowershell -c \"irm https://astral.sh/ruff/0.15.10/install.ps1 | iex\"\n```\n\nYou can also install Ruff via [Homebrew](https://formulae.brew.sh/formula/ruff), [Conda](https://anaconda.org/conda-forge/ruff),\nand with [a variety of other package managers](https://docs.astral.sh/ruff/installation/).\n\n### Usage\n\nTo run Ruff as a linter, try any of the following:\n\n```shell\nruff check                          # Lint all files in the current directory (and any subdirectories).\nruff check path/to/code/            # Lint all files in `/path/to/code` (and any subdirectories).\nruff check path/to/code/*.py        # Lint all `.py` files in `/path/to/code`.\nruff check path/to/code/to/file.py  # Lint `file.py`.\nruff check @arguments.txt           # Lint using an input file, treating its contents as newline-delimited command-line arguments.\n```\n\nOr, to run Ruff as a formatter:\n\n```shell\nruff format                          # Format all files in the current directory (and any subdirectories).\nruff format path/to/code/            # Format all files in `/path/to/code` (and any subdirectories).\nruff format path/to/code/*.py        # Format all `.py` files in `/path/to/code`.\nruff format path/to/code/to/file.py  # Format `file.py`.\nruff format @arguments.txt           # Format using an input file, treating its contents as newline-delimited command-line arguments.\n```\n\nRuff can also be used as a [pre-commit](https://pre-commit.com/) hook via [`ruff-pre-commit`](https://github.com/astral-sh/ruff-pre-commit):\n\n```yaml\n- repo: https://github.com/astral-sh/ruff-pre-commit\n  # Ruff version.\n  rev: v0.15.10\n  hooks:\n    # Run the linter.\n    - id: ruff-check\n      args: [ --fix ]\n    # Run the formatter.\n    - id: ruff-format\n```\n\nRuff can also be used as a [VS Code extension](https://github.com/astral-sh/ruff-vscode) or with [various other editors](https://docs.astral.sh/ruff/editors/setup).\n\nRuff can also be used as a [GitHub Action](https://github.com/features/actions) via\n[`ruff-action`](https://github.com/astral-sh/ruff-action):\n\n```yaml\nname: Ruff\non: [ push, pull_request ]\njobs:\n  ruff:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: astral-sh/ruff-action@v3\n```\n\n### Configuration<a id=\"configuration\"></a>\n\nRuff can be configured through a `pyproject.toml`, `ruff.toml`, or `.ruff.toml` file (see:\n[_Configuration_](https://docs.astral.sh/ruff/configuration/), or [_Settings_](https://docs.astral.sh/ruff/settings/)\nfor a complete list of all configuration options).\n\nIf left unspecified, Ruff's default configuration is equivalent to the following `ruff.toml` file:\n\n```toml\n# Exclude a variety of commonly ignored directories.\nexclude = [\n    \".bzr\",\n    \".direnv\",\n    \".eggs\",\n    \".git\",\n    \".git-rewrite\",\n    \".hg\",\n    \".ipynb_checkpoints\",\n    \".mypy_cache\",\n    \".nox\",\n    \".pants.d\",\n    \".pyenv\",\n    \".pytest_cache\",\n    \".pytype\",\n    \".ruff_cache\",\n    \".svn\",\n    \".tox\",\n    \".venv\",\n    \".vscode\",\n    \"__pypackages__\",\n    \"_build\",\n    \"buck-out\",\n    \"build\",\n    \"dist\",\n    \"node_modules\",\n    \"site-packages\",\n    \"venv\",\n]\n\n# Same as Black.\nline-length = 88\nindent-width = 4\n\n# Assume Python 3.10\ntarget-version = \"py310\"\n\n[lint]\n# Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default.\nselect = [\"E4\", \"E7\", \"E9\", \"F\"]\nignore = []\n\n# Allow fix for all enabled rules (when `--fix`) is provided.\nfixable = [\"ALL\"]\nunfixable = []\n\n# Allow unused variables when underscore-prefixed.\ndummy-variable-rgx = \"^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$\"\n\n[format]\n# Like Black, use double quotes for strings.\nquote-style = \"double\"\n\n# Like Black, indent with spaces, rather than tabs.\nindent-style = \"space\"\n\n# Like Black, respect magic trailing commas.\nskip-magic-trailing-comma = false\n\n# Like Black, automatically detect the appropriate line ending.\nline-ending = \"auto\"\n```\n\nNote that, in a `pyproject.toml`, each section header should be prefixed with `tool.ruff`. For\nexample, `[lint]` should be replaced with `[tool.ruff.lint]`.\n\nSome configuration options can be provided via dedicated command-line arguments, such as those\nrelated to rule enablement and disablement, file discovery, and logging level:\n\n```shell\nruff check --select F401 --select F403 --quiet\n```\n\nThe remaining configuration options can be provided through a catch-all `--config` argument:\n\n```shell\nruff check --config \"lint.per-file-ignores = {'some_file.py' = ['F841']}\"\n```\n\nTo opt in to the latest lint rules, formatter style changes, interface updates, and more, enable\n[preview mode](https://docs.astral.sh/ruff/preview/) by setting `preview = true` in your configuration\nfile or passing `--preview` on the command line. Preview mode enables a collection of unstable\nfeatures that may change prior to stabilization.\n\nSee `ruff help` for more on Ruff's top-level commands, or `ruff help check` and `ruff help format`\nfor more on the linting and formatting commands, respectively.\n\n## Rules<a id=\"rules\"></a>\n\n<!-- Begin section: Rules -->\n\n**Ruff supports over 900 lint rules**, many of which are inspired by popular tools like Flake8,\nisort, pyupgrade, and others. Regardless of the rule's origin, Ruff re-implements every rule in\nRust as a first-party feature.\n\nBy default, Ruff enables Flake8's `F` rules, along with a subset of the `E` rules, omitting any\nstylistic rules that overlap with the use of a formatter, like `ruff format` or\n[Black](https://github.com/psf/black).\n\nIf you're just getting started with Ruff, **the default rule set is a great place to start**: it\ncatches a wide variety of common errors (like unused imports) with zero configuration.\n\nIn [preview](https://docs.astral.sh/ruff/preview/), Ruff enables an expanded set of default rules\nthat includes rules from the `B`, `UP`, and `RUF` categories, as well as many more. If you give the\nnew defaults a try, feel free to leave feedback in the [GitHub\ndiscussion](https://github.com/astral-sh/ruff/discussions/23203), where you can also find the new\nrule set listed in full.\n\n<!-- End section: Rules -->\n\nBeyond the defaults, Ruff re-implements some of the most popular Flake8 plugins and related code\nquality tools, including:\n\n- [autoflake](https://pypi.org/project/autoflake/)\n- [eradicate](https://pypi.org/project/eradicate/)\n- [flake8-2020](https://pypi.org/project/flake8-2020/)\n- [flake8-annotations](https://pypi.org/project/flake8-annotations/)\n- [flake8-async](https://pypi.org/project/flake8-async)\n- [flake8-bandit](https://pypi.org/project/flake8-bandit/) ([#1646](https://github.com/astral-sh/ruff/issues/1646))\n- [flake8-blind-except](https://pypi.org/project/flake8-blind-except/)\n- [flake8-boolean-trap](https://pypi.org/project/flake8-boolean-trap/)\n- [flake8-bugbear](https://pypi.org/project/flake8-bugbear/)\n- [flake8-builtins](https://pypi.org/project/flake8-builtins/)\n- [flake8-commas](https://pypi.org/project/flake8-commas/)\n- [flake8-comprehensions](https://pypi.org/project/flake8-comprehensions/)\n- [flake8-copyright](https://pypi.org/project/flake8-copyright/)\n- [flake8-datetimez](https://pypi.org/project/flake8-datetimez/)\n- [flake8-debugger](https://pypi.org/project/flake8-debugger/)\n- [flake8-django](https://pypi.org/project/flake8-django/)\n- [flake8-docstrings](https://pypi.org/project/flake8-docstrings/)\n- [flake8-eradicate](https://pypi.org/project/flake8-eradicate/)\n- [flake8-errmsg](https://pypi.org/project/flake8-errmsg/)\n- [flake8-executable](https://pypi.org/project/flake8-executable/)\n- [flake8-future-annotations](https://pypi.org/project/flake8-future-annotations/)\n- [flake8-gettext](https://pypi.org/project/flake8-gettext/)\n- [flake8-implicit-str-concat](https://pypi.org/project/flake8-implicit-str-concat/)\n- [flake8-import-conventions](https://github.com/joaopalmeiro/flake8-import-conventions)\n- [flake8-logging](https://pypi.org/project/flake8-logging/)\n- [flake8-logging-format](https://pypi.org/project/flake8-logging-format/)\n- [flake8-no-pep420](https://pypi.org/project/flake8-no-pep420)\n- [flake8-pie](https://pypi.org/project/flake8-pie/)\n- [flake8-print](https://pypi.org/project/flake8-print/)\n- [flake8-pyi](https://pypi.org/project/flake8-pyi/)\n- [flake8-pytest-style](https://pypi.org/project/flake8-pytest-style/)\n- [flake8-quotes](https://pypi.org/project/flake8-quotes/)\n- [flake8-raise](https://pypi.org/project/flake8-raise/)\n- [flake8-return](https://pypi.org/project/flake8-return/)\n- [flake8-self](https://pypi.org/project/flake8-self/)\n- [flake8-simplify](https://pypi.org/project/flake8-simplify/)\n- [flake8-slots](https://pypi.org/project/flake8-slots/)\n- [flake8-super](https://pypi.org/project/flake8-super/)\n- [flake8-tidy-imports](https://pypi.org/project/flake8-tidy-imports/)\n- [flake8-todos](https://pypi.org/project/flake8-todos/)\n- [flake8-type-checking](https://pypi.org/project/flake8-type-checking/)\n- [flake8-use-pathlib](https://pypi.org/project/flake8-use-pathlib/)\n- [flynt](https://pypi.org/project/flynt/) ([#2102](https://github.com/astral-sh/ruff/issues/2102))\n- [isort](https://pypi.org/project/isort/)\n- [mccabe](https://pypi.org/project/mccabe/)\n- [pandas-vet](https://pypi.org/project/pandas-vet/)\n- [pep8-naming](https://pypi.org/project/pep8-naming/)\n- [pydocstyle](https://pypi.org/project/pydocstyle/)\n- [pygrep-hooks](https://github.com/pre-commit/pygrep-hooks)\n- [pylint-airflow](https://pypi.org/project/pylint-airflow/)\n- [pyupgrade](https://pypi.org/project/pyupgrade/)\n- [tryceratops](https://pypi.org/project/tryceratops/)\n- [yesqa](https://pypi.org/project/yesqa/)\n\nFor a complete enumeration of the supported rules, see [_Rules_](https://docs.astral.sh/ruff/rules/).\n\n## Contributing<a id=\"contributing\"></a>\n\nContributions are welcome and highly appreciated. To get started, check out the\n[**contributing guidelines**](https://docs.astral.sh/ruff/contributing/).\n\nYou can also join us on [**Discord**](https://discord.com/invite/astral-sh).\n\n## Support<a id=\"support\"></a>\n\nHaving trouble? Check out the existing issues on [**GitHub**](https://github.com/astral-sh/ruff/issues),\nor feel free to [**open a new one**](https://github.com/astral-sh/ruff/issues/new).\n\nYou can also ask for help on [**Discord**](https://discord.com/invite/astral-sh).\n\n## Acknowledgements<a id=\"acknowledgements\"></a>\n\nRuff's linter draws on both the APIs and implementation details of many other\ntools in the Python ecosystem, especially [Flake8](https://github.com/PyCQA/flake8), [Pyflakes](https://github.com/PyCQA/pyflakes),\n[pycodestyle](https://github.com/PyCQA/pycodestyle), [pydocstyle](https://github.com/PyCQA/pydocstyle),\n[pyupgrade](https://github.com/asottile/pyupgrade), and [isort](https://github.com/PyCQA/isort).\n\nIn some cases, Ruff includes a \"direct\" Rust port of the corresponding tool.\nWe're grateful to the maintainers of these tools for their work, and for all\nthe value they've provided to the Python community.\n\nRuff's formatter is built on a fork of Rome's [`rome_formatter`](https://github.com/rome/tools/tree/main/crates/rome_formatter),\nand again draws on both API and implementation details from [Rome](https://github.com/rome/tools),\n[Prettier](https://github.com/prettier/prettier), and [Black](https://github.com/psf/black).\n\nRuff's import resolver is based on the import resolution algorithm from [Pyright](https://github.com/microsoft/pyright).\n\nRuff is also influenced by a number of tools outside the Python ecosystem, like\n[Clippy](https://github.com/rust-lang/rust-clippy) and [ESLint](https://github.com/eslint/eslint).\n\nRuff is the beneficiary of a large number of [contributors](https://github.com/astral-sh/ruff/graphs/contributors).\n\nRuff is released under the MIT license.\n\n## Who's Using Ruff?<a id=\"whos-using-ruff\"></a>\n\nRuff is used by a number of major open-source projects and companies, including:\n\n- [Albumentations](https://github.com/albumentations-team/AlbumentationsX)\n- Amazon ([AWS SAM](https://github.com/aws/serverless-application-model))\n- [Anki](https://apps.ankiweb.net/)\n- Anthropic ([Python SDK](https://github.com/anthropics/anthropic-sdk-python))\n- [Apache Airflow](https://github.com/apache/airflow)\n- AstraZeneca ([Magnus](https://github.com/AstraZeneca/magnus-core))\n- [Babel](https://github.com/python-babel/babel)\n- Benchling ([Refac](https://github.com/benchling/refac))\n- [Bokeh](https://github.com/bokeh/bokeh)\n- Capital One ([datacompy](https://github.com/capitalone/datacompy))\n- CrowdCent ([NumerBlox](https://github.com/crowdcent/numerblox)) <!-- typos: ignore -->\n- [Cryptography (PyCA)](https://github.com/pyca/cryptography)\n- CERN ([Indico](https://getindico.io/))\n- [DVC](https://github.com/iterative/dvc)\n- [Dagger](https://github.com/dagger/dagger)\n- [Dagster](https://github.com/dagster-io/dagster)\n- Databricks ([MLflow](https://github.com/mlflow/mlflow))\n- [Dify](https://github.com/langgenius/dify)\n- [FastAPI](https://github.com/tiangolo/fastapi)\n- [Godot](https://github.com/godotengine/godot)\n- [Gradio](https://github.com/gradio-app/gradio)\n- [Great Expectations](https://github.com/great-expectations/great_expectations)\n- [HTTPX](https://github.com/encode/httpx)\n- [Hatch](https://github.com/pypa/hatch)\n- [Home Assistant](https://github.com/home-assistant/core)\n- Hugging Face ([Transformers](https://github.com/huggingface/transformers),\n    [Datasets](https://github.com/huggingface/datasets),\n    [Diffusers](https://github.com/huggingface/diffusers))\n- IBM ([Qiskit](https://github.com/Qiskit/qiskit))\n- ING Bank ([popmon](https://github.com/ing-bank/popmon), [probatus](https://github.com/ing-bank/probatus))\n- [Ibis](https://github.com/ibis-project/ibis)\n- [ivy](https://github.com/unifyai/ivy)\n- [JAX](https://github.com/jax-ml/jax)\n- [Jupyter](https://github.com/jupyter-server/jupyter_server)\n- [Kraken Tech](https://kraken.tech/)\n- [LangChain](https://github.com/hwchase17/langchain)\n- [Litestar](https://litestar.dev/)\n- [LlamaIndex](https://github.com/jerryjliu/llama_index)\n- Matrix ([Synapse](https://github.com/matrix-org/synapse))\n- [MegaLinter](https://github.com/oxsecurity/megalinter)\n- Meltano ([Meltano CLI](https://github.com/meltano/meltano), [Singer SDK](https://github.com/meltano/sdk))\n- Microsoft ([Semantic Kernel](https://github.com/microsoft/semantic-kernel),\n    [ONNX Runtime](https://github.com/microsoft/onnxruntime),\n    [LightGBM](https://github.com/microsoft/LightGBM))\n- Modern Treasury ([Python SDK](https://github.com/Modern-Treasury/modern-treasury-python))\n- Mozilla ([Firefox](https://github.com/mozilla/gecko-dev))\n- [Mypy](https://github.com/python/mypy)\n- [Nautobot](https://github.com/nautobot/nautobot)\n- Netflix ([Dispatch](https://github.com/Netflix/dispatch))\n- [Neon](https://github.com/neondatabase/neon)\n- [Nokia](https://nokia.com/)\n- [NoneBot](https://github.com/nonebot/nonebot2)\n- [NumPyro](https://github.com/pyro-ppl/numpyro)\n- [ONNX](https://github.com/onnx/onnx)\n- [OpenBB](https://github.com/OpenBB-finance/OpenBBTerminal)\n- [Open Wine Components](https://github.com/Open-Wine-Components/umu-launcher)\n- [PDM](https://github.com/pdm-project/pdm)\n- [PaddlePaddle](https://github.com/PaddlePaddle/Paddle)\n- [Pandas](https://github.com/pandas-dev/pandas)\n- [Pillow](https://github.com/python-pillow/Pillow)\n- [Poetry](https://github.com/python-poetry/poetry)\n- [Polars](https://github.com/pola-rs/polars)\n- [PostHog](https://github.com/PostHog/posthog)\n- Prefect ([Python SDK](https://github.com/PrefectHQ/prefect), [Marvin](https://github.com/PrefectHQ/marvin))\n- [PyInstaller](https://github.com/pyinstaller/pyinstaller)\n- [PyMC](https://github.com/pymc-devs/pymc/)\n- [PyMC-Marketing](https://github.com/pymc-labs/pymc-marketing)\n- [pytest](https://github.com/pytest-dev/pytest)\n- [PyTorch](https://github.com/pytorch/pytorch)\n- [Pydantic](https://github.com/pydantic/pydantic)\n- [Pylint](https://github.com/PyCQA/pylint)\n- [PyScripter](https://github.com/pyscripter/pyscripter)\n- [PyVista](https://github.com/pyvista/pyvista)\n- [Reflex](https://github.com/reflex-dev/reflex)\n- [River](https://github.com/online-ml/river)\n- [Rippling](https://rippling.com)\n- [Robyn](https://github.com/sansyrox/robyn)\n- [Saleor](https://github.com/saleor/saleor)\n- Scale AI ([Launch SDK](https://github.com/scaleapi/launch-python-client))\n- [SciPy](https://github.com/scipy/scipy)\n- Snowflake ([SnowCLI](https://github.com/Snowflake-Labs/snowcli))\n- [Sphinx](https://github.com/sphinx-doc/sphinx)\n- [Stable Baselines3](https://github.com/DLR-RM/stable-baselines3)\n- [Starlette](https://github.com/encode/starlette)\n- [Streamlit](https://github.com/streamlit/streamlit)\n- [The Algorithms](https://github.com/TheAlgorithms/Python)\n- [Vega-Altair](https://github.com/altair-viz/altair)\n- [Weblate](https://weblate.org/)\n- WordPress ([Openverse](https://github.com/WordPress/openverse))\n- [ZenML](https://github.com/zenml-io/zenml)\n- [Zulip](https://github.com/zulip/zulip)\n- [build (PyPA)](https://github.com/pypa/build)\n- [cibuildwheel (PyPA)](https://github.com/pypa/cibuildwheel)\n- [delta-rs](https://github.com/delta-io/delta-rs)\n- [featuretools](https://github.com/alteryx/featuretools)\n- [meson-python](https://github.com/mesonbuild/meson-python)\n- [nox](https://github.com/wntrblm/nox)\n- [pip](https://github.com/pypa/pip)\n\n### Show Your Support\n\nIf you're using Ruff, consider adding the Ruff badge to your project's `README.md`:\n\n```md\n[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n```\n\n...or `README.rst`:\n\n```rst\n.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json\n    :target: https://github.com/astral-sh/ruff\n    :alt: Ruff\n```\n\n...or, as HTML:\n\n```html\n<a href=\"https://github.com/astral-sh/ruff\"><img src=\"https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json\" alt=\"Ruff\" style=\"max-width:100%;\"></a>\n```\n\n## License<a id=\"license\"></a>\n\nThis repository is licensed under the [MIT License](https://github.com/astral-sh/ruff/blob/main/LICENSE)\n\n<div align=\"center\">\n  <a target=\"_blank\" href=\"https://astral.sh\" style=\"background:none\">\n    <img src=\"https://raw.githubusercontent.com/astral-sh/ruff/main/assets/svg/Astral.svg\" alt=\"Made by Astral\">\n  </a>\n</div>\n\n",
        "description_content_type": "text/markdown; charset=UTF-8; variant=GFM",
        "keywords": [
          "automation",
          "flake8",
          "pycodestyle",
          "pyflakes",
          "pylint",
          "clippy"
        ],
        "home_page": "https://docs.astral.sh/ruff",
        "author_email": "\"Astral Software Inc.\" <hey@astral.sh>",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Environment :: Console",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: MIT License",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3.7",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Rust",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Topic :: Software Development :: Quality Assurance"
        ],
        "requires_python": ">=3.7",
        "project_url": [
          "Changelog, https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md",
          "Documentation, https://docs.astral.sh/ruff/",
          "Repository, https://github.com/astral-sh/ruff"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/ruff-0.15.10.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "typer",
        "version": "0.27.0",
        "summary": "Typer, build great CLIs. Easy to code. Based on Python type hints.",
        "description": "<p align=\"center\">\n  <a href=\"https://typer.tiangolo.com\"><img src=\"https://typer.tiangolo.com/img/logo-margin/logo-margin-vector.svg#only-light\" alt=\"Typer\"></a>\n\n</p>\n<p align=\"center\">\n    <em>Typer, build great CLIs. Easy to code. Based on Python type hints.</em>\n</p>\n<p align=\"center\">\n<a href=\"https://github.com/fastapi/typer/actions?query=workflow%3ATest+event%3Apush+branch%3Amaster\">\n    <img src=\"https://github.com/fastapi/typer/actions/workflows/test.yml/badge.svg?event=push&branch=master\" alt=\"Test\">\n</a>\n<a href=\"https://coverage-badge.samuelcolvin.workers.dev/redirect/fastapi/typer\">\n    <img src=\"https://coverage-badge.samuelcolvin.workers.dev/fastapi/typer.svg\" alt=\"Coverage\">\n<a href=\"https://pypi.org/project/typer\">\n    <img src=\"https://img.shields.io/pypi/v/typer?color=%2334D058&label=pypi%20package\" alt=\"Package version\">\n</a>\n</p>\n\n---\n\n**Documentation**: [https://typer.tiangolo.com](https://typer.tiangolo.com)\n\n**Source Code**: [https://github.com/fastapi/typer](https://github.com/fastapi/typer)\n\n---\n\nTyper is a library for building <abbr title=\"command line interface, programs executed from a terminal\">CLI</abbr> applications that users will **love using** and developers will **love creating**. Based on Python type hints.\n\nIt's also a command line tool to run scripts, automatically converting them to CLI applications.\n\nThe key features are:\n\n* **Intuitive to write**: Great editor support. <abbr title=\"also known as auto-complete, autocompletion, IntelliSense\">Completion</abbr> everywhere. Less time debugging. Designed to be easy to use and learn. Less time reading docs.\n* **Easy to use**: It's easy to use for the final users. Automatic help, and automatic completion for all shells.\n* **Short**: Minimize code duplication. Multiple features from each parameter declaration. Fewer bugs.\n* **Start simple**: The simplest example adds only 2 lines of code to your app: **1 import, 1 function call**.\n* **Grow large**: Grow in complexity as much as you want, create arbitrarily complex trees of commands and groups of subcommands, with options and arguments.\n* **Run scripts**: Typer includes a `typer` command/program that you can use to run scripts, automatically converting them to CLIs, even if they don't use Typer internally.\n\n## FastAPI of CLIs\n\n**Typer** is [FastAPI](https://fastapi.tiangolo.com)'s little sibling, it's the FastAPI of CLIs.\n\n## Installation\n\nCreate and activate a [virtual environment](https://typer.tiangolo.com/virtual-environments/) and then install **Typer**:\n\n<div class=\"termy\">\n\n```console\n$ pip install typer\n---> 100%\nSuccessfully installed typer rich shellingham\n```\n\n</div>\n\n## Example\n\n### The absolute minimum\n\n* Create a file `main.py` with:\n\n```Python\ndef main(name: str):\n    print(f\"Hello {name}\")\n```\n\nThis script doesn't even use Typer internally. But you can use the `typer` command to run it as a CLI application.\n\n### Run it\n\nRun your application with the `typer` command:\n\n<div class=\"termy\">\n\n```console\n// Run your application\n$ typer main.py run\n\n// You get a nice error, you are missing 'name'\nUsage: typer [PATH_OR_MODULE] run [OPTIONS] {name}\nTry 'typer [PATH_OR_MODULE] run --help' for help.\n╭─ Error ───────────────────────────────────────────╮\n│ Missing argument 'name'.                          │\n╰───────────────────────────────────────────────────╯\n\n\n// You get a --help for free\n$ typer main.py run --help\n\nUsage: typer [PATH_OR_MODULE] run [OPTIONS] {name}\n\nRun the provided Typer app.\n\n╭─ Arguments ───────────────────────────────────────╮\n│ *    name      <str>  [required]                  │\n╰───────────────────────────────────────────────────╯\n╭─ Options ─────────────────────────────────────────╮\n│ --help          Show this message and exit.       │\n╰───────────────────────────────────────────────────╯\n\n// Now pass the 'name' argument\n$ typer main.py run Camila\n\nHello Camila\n\n// It works! 🎉\n```\n\n</div>\n\nThis is the simplest use case, not even using Typer internally, but it can already be quite useful for simple scripts.\n\n**Note**: auto-completion works when you create a Python package and run it with `--install-completion` or when you use the `typer` command.\n\n## Use Typer in your code\n\nNow let's start using Typer in your own code, update `main.py` with:\n\n```Python\nimport typer\n\n\ndef main(name: str):\n    print(f\"Hello {name}\")\n\n\nif __name__ == \"__main__\":\n    typer.run(main)\n```\n\nNow you could run it with Python directly:\n\n<div class=\"termy\">\n\n```console\n// Run your application\n$ python main.py\n\n// You get a nice error, you are missing 'name'\nUsage: main.py [OPTIONS] {name}\nTry 'main.py --help' for help.\n╭─ Error ───────────────────────────────────────────╮\n│ Missing argument 'name'.                          │\n╰───────────────────────────────────────────────────╯\n\n\n// You get a --help for free\n$ python main.py --help\n\nUsage: main.py [OPTIONS] {name}\n\n╭─ Arguments ───────────────────────────────────────╮\n│ *    name      <str>  [required]                  │\n╰───────────────────────────────────────────────────╯\n╭─ Options ─────────────────────────────────────────╮\n│ --help          Show this message and exit.       │\n╰───────────────────────────────────────────────────╯\n\n// Now pass the 'name' argument\n$ python main.py Camila\n\nHello Camila\n\n// It works! 🎉\n```\n\n</div>\n\n**Note**: you can also call this same script with the `typer` command, but you don't need to.\n\n## Example upgrade\n\nThis was the simplest example possible.\n\nNow let's see one a bit more complex.\n\n### An example with two subcommands\n\nModify the file `main.py`.\n\nCreate a `typer.Typer()` app, and create two subcommands with their parameters.\n\n```Python hl_lines=\"3  6  11  20\"\nimport typer\n\napp = typer.Typer()\n\n\n@app.command()\ndef hello(name: str):\n    print(f\"Hello {name}\")\n\n\n@app.command()\ndef goodbye(name: str, formal: bool = False):\n    if formal:\n        print(f\"Goodbye Ms. {name}. Have a good day.\")\n    else:\n        print(f\"Bye {name}!\")\n\n\nif __name__ == \"__main__\":\n    app()\n```\n\nAnd that will:\n\n* Explicitly create a `typer.Typer` app.\n    * The previous `typer.run` actually creates one implicitly for you.\n* Add two subcommands with `@app.command()`.\n* Execute the `app()` itself, as if it was a function (instead of `typer.run`).\n\n### Run the upgraded example\n\nCheck the new help:\n\n<div class=\"termy\">\n\n```console\n$ python main.py --help\n\n Usage: main.py [OPTIONS] COMMAND [ARGS]...\n\n╭─ Options ─────────────────────────────────────────╮\n│ --install-completion          Install completion  │\n│                               for the current     │\n│                               shell.              │\n│ --show-completion             Show completion for │\n│                               the current shell,  │\n│                               to copy it or       │\n│                               customize the       │\n│                               installation.       │\n│ --help                        Show this message   │\n│                               and exit.           │\n╰───────────────────────────────────────────────────╯\n╭─ Commands ────────────────────────────────────────╮\n│ hello                                             │\n│ goodbye                                           │\n╰───────────────────────────────────────────────────╯\n\n// When you create a package you get ✨ auto-completion ✨ for free, installed with --install-completion\n\n// You have 2 subcommands (the 2 functions): hello and goodbye\n```\n\n</div>\n\nNow check the help for the `hello` command:\n\n<div class=\"termy\">\n\n```console\n$ python main.py hello --help\n\n Usage: main.py hello [OPTIONS] {name}\n\n╭─ Arguments ───────────────────────────────────────╮\n│ *    name      <str>  [required]                  │\n╰───────────────────────────────────────────────────╯\n╭─ Options ─────────────────────────────────────────╮\n│ --help          Show this message and exit.       │\n╰───────────────────────────────────────────────────╯\n```\n\n</div>\n\nAnd now check the help for the `goodbye` command:\n\n<div class=\"termy\">\n\n```console\n$ python main.py goodbye --help\n\n Usage: main.py goodbye [OPTIONS] {name}\n\n╭─ Arguments ───────────────────────────────────────╮\n│ *    name      <str>  [required]                  │\n╰───────────────────────────────────────────────────╯\n╭─ Options ─────────────────────────────────────────╮\n│ --formal    --no-formal      [default: no-formal] │\n│ --help                       Show this message    │\n│                              and exit.            │\n╰───────────────────────────────────────────────────╯\n\n// Automatic --formal and --no-formal for the bool option 🎉\n```\n\n</div>\n\nNow you can try out the new command line application:\n\n<div class=\"termy\">\n\n```console\n// Use it with the hello command\n\n$ python main.py hello Camila\n\nHello Camila\n\n// And with the goodbye command\n\n$ python main.py goodbye Camila\n\nBye Camila!\n\n// And with --formal\n\n$ python main.py goodbye --formal Camila\n\nGoodbye Ms. Camila. Have a good day.\n```\n\n</div>\n\n**Note**: If your app only has one command, by default the command name is **omitted** in usage: `python main.py Camila`. However, when there are multiple commands, you must **explicitly include the command name**: `python main.py hello Camila`. See [One or Multiple Commands](https://typer.tiangolo.com/tutorial/commands/one-or-multiple/) for more details.\n\n### Recap\n\nIn summary, you declare **once** the types of parameters (*CLI arguments* and *CLI options*) as function parameters.\n\nYou do that with standard modern Python types.\n\nYou don't have to learn a new syntax, the methods or classes of a specific library, etc.\n\nJust standard **Python**.\n\nFor example, for an `int`:\n\n```Python\ntotal: int\n```\n\nor for a `bool` flag:\n\n```Python\nforce: bool\n```\n\nAnd similarly for **files**, **paths**, **enums** (choices), etc. And there are tools to create **groups of subcommands**, add metadata, extra **validation**, etc.\n\n**You get**: great editor support, including **completion** and **type checks** everywhere.\n\n**Your users get**: automatic **`--help`**, **auto-completion** in their terminal (Bash, Zsh, Fish, PowerShell) when they install your package or when using the `typer` command.\n\nFor a more complete example including more features, see the <a href=\"https://typer.tiangolo.com/tutorial/\">Tutorial - User Guide</a>.\n\n## Dependencies\n\n**Typer** requires only a few dependencies (most are tiny):\n\n* [`rich`](https://rich.readthedocs.io/en/stable/index.html): to show nicely formatted errors automatically.\n* [`shellingham`](https://github.com/sarugaku/shellingham): to automatically detect the current shell when installing completion.\n* [`annotated-doc`](https://github.com/fastapi/annotated-doc): to generate documentation from Python type annotations.\n* [`colorama`](https://github.com/tartley/colorama) (only on Windows): for producing colored terminal text on Windows.\n\n### Click code\n\nTyper used to depend on [Click](https://click.palletsprojects.com/) as well, a popular tool for building CLIs in Python.\n\nSince version 0.26.0, Typer has vendored Click (included Click's source code internally, instead of installing it as a third party package) and has unified the code interactions between Typer and the embedded Click source code for easier maintainability in the future.\n\nNote that some Click functionality will not be available anymore in the future, as we continue to improve and extend Typer's codebase.\n\n### `typer-slim`\n\nThere used to be a slimmed-down version of Typer called `typer-slim`, which didn't include the dependencies `rich` and `shellingham`, nor the `typer` command.\n\nHowever, since version 0.22.0, we have stopped supporting this, and `typer-slim` now simply installs (all of) Typer.\n\nIf you want to disable Rich globally, you can set an environmental variable `TYPER_USE_RICH` to `False` or `0`.\n\n## License\n\nThis project is licensed under the terms of the MIT license.\n",
        "description_content_type": "text/markdown",
        "author_email": "=?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= <tiangolo@gmail.com>",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Intended Audience :: Information Technology",
          "Intended Audience :: System Administrators",
          "Operating System :: OS Independent",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python",
          "Topic :: Software Development :: Libraries :: Application Frameworks",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Topic :: Software Development :: Libraries",
          "Topic :: Software Development",
          "Typing :: Typed",
          "Development Status :: 4 - Beta",
          "Intended Audience :: Developers",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14"
        ],
        "requires_dist": [
          "shellingham>=1.3.0",
          "rich>=13.8.0",
          "annotated-doc>=0.0.2",
          "colorama; platform_system == \"Windows\""
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Homepage, https://github.com/fastapi/typer",
          "Documentation, https://typer.tiangolo.com",
          "Repository, https://github.com/fastapi/typer",
          "Issues, https://github.com/fastapi/typer/issues",
          "Changelog, https://typer.tiangolo.com/release-notes/"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/typer-0.27.0.dist-info",
      "installer": "pip",
      "requested": false
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "tenacity",
        "version": "9.1.4",
        "dynamic": [
          "license-file"
        ],
        "summary": "Retry code until it succeeds",
        "description": "Tenacity is a general-purpose retrying library to simplify the task of adding retry behavior to just about anything.\n",
        "home_page": "https://github.com/jd/tenacity",
        "author": "Julien Danjou",
        "author_email": "julien@danjou.info",
        "license": "Apache 2.0",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Intended Audience :: Developers",
          "License :: OSI Approved :: Apache Software License",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Topic :: Utilities"
        ],
        "requires_dist": [
          "reno; extra == \"doc\"",
          "sphinx; extra == \"doc\"",
          "pytest; extra == \"test\"",
          "tornado>=4.5; extra == \"test\"",
          "typeguard; extra == \"test\""
        ],
        "requires_python": ">=3.10",
        "provides_extra": [
          "doc",
          "test"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/tenacity-9.1.4.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "attrs",
        "version": "25.4.0",
        "summary": "Classes Without Boilerplate",
        "description": "<p align=\"center\">\n  <a href=\"https://www.attrs.org/\">\n    <img src=\"https://raw.githubusercontent.com/python-attrs/attrs/main/docs/_static/attrs_logo.svg\" width=\"35%\" alt=\"attrs\" />\n  </a>\n</p>\n\n\n*attrs* is the Python package that will bring back the **joy** of **writing classes** by relieving you from the drudgery of implementing object protocols (aka [dunder methods](https://www.attrs.org/en/latest/glossary.html#term-dunder-methods)).\nTrusted by NASA for [Mars missions since 2020](https://github.com/readme/featured/nasa-ingenuity-helicopter)!\n\nIts main goal is to help you to write **concise** and **correct** software without slowing down your code.\n\n\n## Sponsors\n\n*attrs* would not be possible without our [amazing sponsors](https://github.com/sponsors/hynek).\nEspecially those generously supporting us at the *The Organization* tier and higher:\n\n<!-- sponsor-break-begin -->\n\n<p align=\"center\">\n\n<!-- [[[cog\nimport pathlib, tomllib\n\nfor sponsor in tomllib.loads(pathlib.Path(\"pyproject.toml\").read_text())[\"tool\"][\"sponcon\"][\"sponsors\"]:\n      print(f'<a href=\"{sponsor[\"url\"]}\"><img title=\"{sponsor[\"title\"]}\" src=\"https://www.attrs.org/en/25.4.0/_static/sponsors/{sponsor[\"img\"]}\" width=\"190\" /></a>')\n]]] -->\n<a href=\"https://www.variomedia.de/\"><img title=\"Variomedia AG\" src=\"https://www.attrs.org/en/25.4.0/_static/sponsors/Variomedia.svg\" width=\"190\" /></a>\n<a href=\"https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek\"><img title=\"Tidelift\" src=\"https://www.attrs.org/en/25.4.0/_static/sponsors/Tidelift.svg\" width=\"190\" /></a>\n<a href=\"https://privacy-solutions.org/\"><img title=\"Privacy Solutions\" src=\"https://www.attrs.org/en/25.4.0/_static/sponsors/Privacy-Solutions.svg\" width=\"190\" /></a>\n<a href=\"https://filepreviews.io/\"><img title=\"FilePreviews\" src=\"https://www.attrs.org/en/25.4.0/_static/sponsors/FilePreviews.svg\" width=\"190\" /></a>\n<a href=\"https://polar.sh/\"><img title=\"Polar\" src=\"https://www.attrs.org/en/25.4.0/_static/sponsors/Polar.svg\" width=\"190\" /></a>\n<!-- [[[end]]] -->\n\n</p>\n\n<!-- sponsor-break-end -->\n\n<p align=\"center\">\n   <strong>Please consider <a href=\"https://github.com/sponsors/hynek\">joining them</a> to help make <em>attrs</em>’s maintenance more sustainable!</strong>\n</p>\n\n<!-- teaser-end -->\n\n## Example\n\n*attrs* gives you a class decorator and a way to declaratively define the attributes on that class:\n\n<!-- code-begin -->\n\n```pycon\n>>> from attrs import asdict, define, make_class, Factory\n\n>>> @define\n... class SomeClass:\n...     a_number: int = 42\n...     list_of_numbers: list[int] = Factory(list)\n...\n...     def hard_math(self, another_number):\n...         return self.a_number + sum(self.list_of_numbers) * another_number\n\n\n>>> sc = SomeClass(1, [1, 2, 3])\n>>> sc\nSomeClass(a_number=1, list_of_numbers=[1, 2, 3])\n\n>>> sc.hard_math(3)\n19\n>>> sc == SomeClass(1, [1, 2, 3])\nTrue\n>>> sc != SomeClass(2, [3, 2, 1])\nTrue\n\n>>> asdict(sc)\n{'a_number': 1, 'list_of_numbers': [1, 2, 3]}\n\n>>> SomeClass()\nSomeClass(a_number=42, list_of_numbers=[])\n\n>>> C = make_class(\"C\", [\"a\", \"b\"])\n>>> C(\"foo\", \"bar\")\nC(a='foo', b='bar')\n```\n\nAfter *declaring* your attributes, *attrs* gives you:\n\n- a concise and explicit overview of the class's attributes,\n- a nice human-readable `__repr__`,\n- equality-checking methods,\n- an initializer,\n- and much more,\n\n*without* writing dull boilerplate code again and again and *without* runtime performance penalties.\n\n---\n\nThis example uses *attrs*'s modern APIs that have been introduced in version 20.1.0, and the *attrs* package import name that has been added in version 21.3.0.\nThe classic APIs (`@attr.s`, `attr.ib`, plus their serious-business aliases) and the `attr` package import name will remain **indefinitely**.\n\nCheck out [*On The Core API Names*](https://www.attrs.org/en/latest/names.html) for an in-depth explanation!\n\n\n### Hate Type Annotations!?\n\nNo problem!\nTypes are entirely **optional** with *attrs*.\nSimply assign `attrs.field()` to the attributes instead of annotating them with types:\n\n```python\nfrom attrs import define, field\n\n@define\nclass SomeClass:\n    a_number = field(default=42)\n    list_of_numbers = field(factory=list)\n```\n\n\n## Data Classes\n\nOn the tin, *attrs* might remind you of `dataclasses` (and indeed, `dataclasses` [are a descendant](https://hynek.me/articles/import-attrs/) of *attrs*).\nIn practice it does a lot more and is more flexible.\nFor instance, it allows you to define [special handling of NumPy arrays for equality checks](https://www.attrs.org/en/stable/comparison.html#customization), allows more ways to [plug into the initialization process](https://www.attrs.org/en/stable/init.html#hooking-yourself-into-initialization), has a replacement for `__init_subclass__`, and allows for stepping through the generated methods using a debugger.\n\nFor more details, please refer to our [comparison page](https://www.attrs.org/en/stable/why.html#data-classes), but generally speaking, we are more likely to commit crimes against nature to make things work that one would expect to work, but that are quite complicated in practice.\n\n\n## Project Information\n\n- [**Changelog**](https://www.attrs.org/en/stable/changelog.html)\n- [**Documentation**](https://www.attrs.org/)\n- [**PyPI**](https://pypi.org/project/attrs/)\n- [**Source Code**](https://github.com/python-attrs/attrs)\n- [**Contributing**](https://github.com/python-attrs/attrs/blob/main/.github/CONTRIBUTING.md)\n- [**Third-party Extensions**](https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs)\n- **Get Help**: use the `python-attrs` tag on [Stack Overflow](https://stackoverflow.com/questions/tagged/python-attrs)\n\n\n### *attrs* for Enterprise\n\nAvailable as part of the [Tidelift Subscription](https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek).\n\nThe maintainers of *attrs* and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications.\nSave time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.\n\n## Release Information\n\n### Backwards-incompatible Changes\n\n- Class-level `kw_only=True` behavior is now consistent with `dataclasses`.\n\n  Previously, a class that sets `kw_only=True` makes all attributes keyword-only, including those from base classes.\n  If an attribute sets `kw_only=False`, that setting is ignored, and it is still made keyword-only.\n\n  Now, only the attributes defined in that class that doesn't explicitly set `kw_only=False` are made keyword-only.\n\n  This shouldn't be a problem for most users, unless you have a pattern like this:\n\n  ```python\n  @attrs.define(kw_only=True)\n  class Base:\n      a: int\n      b: int = attrs.field(default=1, kw_only=False)\n\n  @attrs.define\n  class Subclass(Base):\n      c: int\n  ```\n\n  Here, we have a `kw_only=True` *attrs* class (`Base`) with an attribute that sets `kw_only=False` and has a default (`Base.b`), and then create a subclass (`Subclass`) with required arguments (`Subclass.c`).\n  Previously this would work, since it would make `Base.b` keyword-only, but now this fails since `Base.b` is positional, and we have a required positional argument (`Subclass.c`) following another argument with defaults.\n  [#1457](https://github.com/python-attrs/attrs/issues/1457)\n\n\n### Changes\n\n- Values passed to the `__init__()` method of `attrs` classes are now correctly passed to `__attrs_pre_init__()` instead of their default values (in cases where *kw_only* was not specified).\n  [#1427](https://github.com/python-attrs/attrs/issues/1427)\n- Added support for Python 3.14 and [PEP 749](https://peps.python.org/pep-0749/).\n  [#1446](https://github.com/python-attrs/attrs/issues/1446),\n  [#1451](https://github.com/python-attrs/attrs/issues/1451)\n- `attrs.validators.deep_mapping()` now allows to leave out either *key_validator* xor *value_validator*.\n  [#1448](https://github.com/python-attrs/attrs/issues/1448)\n- `attrs.validators.deep_iterator()` and `attrs.validators.deep_mapping()` now accept lists and tuples for all validators and wrap them into a `attrs.validators.and_()`.\n  [#1449](https://github.com/python-attrs/attrs/issues/1449)\n- Added a new **experimental** way to inspect classes:\n\n  `attrs.inspect(cls)` returns the _effective_ class-wide parameters that were used by *attrs* to construct the class.\n\n  The returned class is the same data structure that *attrs* uses internally to decide how to construct the final class.\n  [#1454](https://github.com/python-attrs/attrs/issues/1454)\n- Fixed annotations for `attrs.field(converter=...)`.\n  Previously, a `tuple` of converters was only accepted if it had exactly one element.\n  [#1461](https://github.com/python-attrs/attrs/issues/1461)\n- The performance of `attrs.asdict()` has been improved by 45–260%.\n  [#1463](https://github.com/python-attrs/attrs/issues/1463)\n- The performance of `attrs.astuple()` has been improved by 49–270%.\n  [#1469](https://github.com/python-attrs/attrs/issues/1469)\n- The type annotation for `attrs.validators.or_()` now allows for different types of validators.\n\n  This was only an issue on Pyright.\n  [#1474](https://github.com/python-attrs/attrs/issues/1474)\n\n\n\n---\n\n[Full changelog →](https://www.attrs.org/en/stable/changelog.html)\n",
        "description_content_type": "text/markdown",
        "keywords": [
          "attribute",
          "boilerplate",
          "class"
        ],
        "author_email": "Hynek Schlawack <hs@ox.cx>",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Typing :: Typed"
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Documentation, https://www.attrs.org/",
          "Changelog, https://www.attrs.org/en/stable/changelog.html",
          "GitHub, https://github.com/python-attrs/attrs",
          "Funding, https://github.com/sponsors/hynek",
          "Tidelift, https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=pypi"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/attrs-25.4.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.3",
        "name": "httpx",
        "version": "0.28.1",
        "summary": "The next generation HTTP client.",
        "description": "<p align=\"center\">\n  <a href=\"https://www.python-httpx.org/\"><img width=\"350\" height=\"208\" src=\"https://raw.githubusercontent.com/encode/httpx/master/docs/img/butterfly.png\" alt='HTTPX'></a>\n</p>\n\n<p align=\"center\"><strong>HTTPX</strong> <em>- A next-generation HTTP client for Python.</em></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/encode/httpx/actions\">\n    <img src=\"https://github.com/encode/httpx/workflows/Test%20Suite/badge.svg\" alt=\"Test Suite\">\n</a>\n<a href=\"https://pypi.org/project/httpx/\">\n    <img src=\"https://badge.fury.io/py/httpx.svg\" alt=\"Package version\">\n</a>\n</p>\n\nHTTPX is a fully featured HTTP client library for Python 3. It includes **an integrated command line client**, has support for both **HTTP/1.1 and HTTP/2**, and provides both **sync and async APIs**.\n\n---\n\nInstall HTTPX using pip:\n\n```shell\n$ pip install httpx\n```\n\nNow, let's get started:\n\n```pycon\n>>> import httpx\n>>> r = httpx.get('https://www.example.org/')\n>>> r\n<Response [200 OK]>\n>>> r.status_code\n200\n>>> r.headers['content-type']\n'text/html; charset=UTF-8'\n>>> r.text\n'<!doctype html>\\n<html>\\n<head>\\n<title>Example Domain</title>...'\n```\n\nOr, using the command-line client.\n\n```shell\n$ pip install 'httpx[cli]'  # The command line client is an optional dependency.\n```\n\nWhich now allows us to use HTTPX directly from the command-line...\n\n<p align=\"center\">\n  <img width=\"700\" src=\"https://raw.githubusercontent.com/encode/httpx/master/docs/img/httpx-help.png\" alt='httpx --help'>\n</p>\n\nSending a request...\n\n<p align=\"center\">\n  <img width=\"700\" src=\"https://raw.githubusercontent.com/encode/httpx/master/docs/img/httpx-request.png\" alt='httpx http://httpbin.org/json'>\n</p>\n\n## Features\n\nHTTPX builds on the well-established usability of `requests`, and gives you:\n\n* A broadly [requests-compatible API](https://www.python-httpx.org/compatibility/).\n* An integrated command-line client.\n* HTTP/1.1 [and HTTP/2 support](https://www.python-httpx.org/http2/).\n* Standard synchronous interface, but with [async support if you need it](https://www.python-httpx.org/async/).\n* Ability to make requests directly to [WSGI applications](https://www.python-httpx.org/advanced/transports/#wsgi-transport) or [ASGI applications](https://www.python-httpx.org/advanced/transports/#asgi-transport).\n* Strict timeouts everywhere.\n* Fully type annotated.\n* 100% test coverage.\n\nPlus all the standard features of `requests`...\n\n* International Domains and URLs\n* Keep-Alive & Connection Pooling\n* Sessions with Cookie Persistence\n* Browser-style SSL Verification\n* Basic/Digest Authentication\n* Elegant Key/Value Cookies\n* Automatic Decompression\n* Automatic Content Decoding\n* Unicode Response Bodies\n* Multipart File Uploads\n* HTTP(S) Proxy Support\n* Connection Timeouts\n* Streaming Downloads\n* .netrc Support\n* Chunked Requests\n\n## Installation\n\nInstall with pip:\n\n```shell\n$ pip install httpx\n```\n\nOr, to include the optional HTTP/2 support, use:\n\n```shell\n$ pip install httpx[http2]\n```\n\nHTTPX requires Python 3.8+.\n\n## Documentation\n\nProject documentation is available at [https://www.python-httpx.org/](https://www.python-httpx.org/).\n\nFor a run-through of all the basics, head over to the [QuickStart](https://www.python-httpx.org/quickstart/).\n\nFor more advanced topics, see the [Advanced Usage](https://www.python-httpx.org/advanced/) section, the [async support](https://www.python-httpx.org/async/) section, or the [HTTP/2](https://www.python-httpx.org/http2/) section.\n\nThe [Developer Interface](https://www.python-httpx.org/api/) provides a comprehensive API reference.\n\nTo find out about tools that integrate with HTTPX, see [Third Party Packages](https://www.python-httpx.org/third_party_packages/).\n\n## Contribute\n\nIf you want to contribute with HTTPX check out the [Contributing Guide](https://www.python-httpx.org/contributing/) to learn how to start.\n\n## Dependencies\n\nThe HTTPX project relies on these excellent libraries:\n\n* `httpcore` - The underlying transport implementation for `httpx`.\n  * `h11` - HTTP/1.1 support.\n* `certifi` - SSL certificates.\n* `idna` - Internationalized domain name support.\n* `sniffio` - Async library autodetection.\n\nAs well as these optional installs:\n\n* `h2` - HTTP/2 support. *(Optional, with `httpx[http2]`)*\n* `socksio` - SOCKS proxy support. *(Optional, with `httpx[socks]`)*\n* `rich` - Rich terminal support. *(Optional, with `httpx[cli]`)*\n* `click` - Command line client support. *(Optional, with `httpx[cli]`)*\n* `brotli` or `brotlicffi` - Decoding for \"brotli\" compressed responses. *(Optional, with `httpx[brotli]`)*\n* `zstandard` - Decoding for \"zstd\" compressed responses. *(Optional, with `httpx[zstd]`)*\n\nA huge amount of credit is due to `requests` for the API layout that\nmuch of this work follows, as well as to `urllib3` for plenty of design\ninspiration around the lower-level networking details.\n\n---\n\n<p align=\"center\"><i>HTTPX is <a href=\"https://github.com/encode/httpx/blob/master/LICENSE.md\">BSD licensed</a> code.<br/>Designed & crafted with care.</i><br/>&mdash; 🦋 &mdash;</p>\n\n## Release Information\n\n### Fixed\n\n* Reintroduced supposedly-private `URLTypes` shortcut. (#2673)\n\n\n---\n\n[Full changelog](https://github.com/encode/httpx/blob/master/CHANGELOG.md)\n",
        "description_content_type": "text/markdown",
        "author_email": "Tom Christie <tom@tomchristie.com>",
        "license": "BSD-3-Clause",
        "classifier": [
          "Development Status :: 4 - Beta",
          "Environment :: Web Environment",
          "Framework :: AsyncIO",
          "Framework :: Trio",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: BSD License",
          "Operating System :: OS Independent",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Topic :: Internet :: WWW/HTTP"
        ],
        "requires_dist": [
          "anyio",
          "certifi",
          "httpcore==1.*",
          "idna",
          "brotli; (platform_python_implementation == 'CPython') and extra == 'brotli'",
          "brotlicffi; (platform_python_implementation != 'CPython') and extra == 'brotli'",
          "click==8.*; extra == 'cli'",
          "pygments==2.*; extra == 'cli'",
          "rich<14,>=10; extra == 'cli'",
          "h2<5,>=3; extra == 'http2'",
          "socksio==1.*; extra == 'socks'",
          "zstandard>=0.18.0; extra == 'zstd'"
        ],
        "requires_python": ">=3.8",
        "project_url": [
          "Changelog, https://github.com/encode/httpx/blob/master/CHANGELOG.md",
          "Documentation, https://www.python-httpx.org",
          "Homepage, https://github.com/encode/httpx",
          "Source, https://github.com/encode/httpx"
        ],
        "provides_extra": [
          "brotli",
          "cli",
          "http2",
          "socks",
          "zstd"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "fire",
        "version": "0.7.1",
        "dynamic": [
          "license-file"
        ],
        "summary": "A library for automatically generating command line interfaces.",
        "description": "# Python Fire [![PyPI](https://img.shields.io/pypi/pyversions/fire.svg?style=plastic)](https://github.com/google/python-fire)\n\n_Python Fire is a library for automatically generating command line interfaces\n(CLIs) from absolutely any Python object._\n\n-   Python Fire is a simple way to create a CLI in Python.\n    [[1]](docs/benefits.md#simple-cli)\n-   Python Fire is a helpful tool for developing and debugging Python code.\n    [[2]](docs/benefits.md#debugging)\n-   Python Fire helps with exploring existing code or turning other people's\n    code into a CLI. [[3]](docs/benefits.md#exploring)\n-   Python Fire makes transitioning between Bash and Python easier.\n    [[4]](docs/benefits.md#bash)\n-   Python Fire makes using a Python REPL easier by setting up the REPL with the\n    modules and variables you'll need already imported and created.\n    [[5]](docs/benefits.md#repl)\n\n## Installation\n\nTo install Python Fire with pip, run: `pip install fire`\n\nTo install Python Fire with conda, run: `conda install fire -c conda-forge`\n\nTo install Python Fire from source, first clone the repository and then run:\n`python setup.py install`\n\n## Basic Usage\n\nYou can call `Fire` on any Python object:<br>\nfunctions, classes, modules, objects, dictionaries, lists, tuples, etc.\nThey all work!\n\nHere's an example of calling Fire on a function.\n\n```python\nimport fire\n\ndef hello(name=\"World\"):\n  return \"Hello %s!\" % name\n\nif __name__ == '__main__':\n  fire.Fire(hello)\n```\n\nThen, from the command line, you can run:\n\n```bash\npython hello.py  # Hello World!\npython hello.py --name=David  # Hello David!\npython hello.py --help  # Shows usage information.\n```\n\nHere's an example of calling Fire on a class.\n\n```python\nimport fire\n\nclass Calculator(object):\n  \"\"\"A simple calculator class.\"\"\"\n\n  def double(self, number):\n    return 2 * number\n\nif __name__ == '__main__':\n  fire.Fire(Calculator)\n```\n\nThen, from the command line, you can run:\n\n```bash\npython calculator.py double 10  # 20\npython calculator.py double --number=15  # 30\n```\n\nTo learn how Fire behaves on functions, objects, dicts, lists, etc, and to learn\nabout Fire's other features, see the [Using a Fire CLI page](docs/using-cli.md).\n\nFor additional examples, see [The Python Fire Guide](docs/guide.md).\n\n## Why is it called Fire?\n\nWhen you call `Fire`, it fires off (executes) your command.\n\n## Where can I learn more?\n\nPlease see [The Python Fire Guide](docs/guide.md).\n\n## Reference\n\n| Setup   | Command             | Notes\n| :------ | :------------------ | :---------\n| install | `pip install fire`  |\n\n| Creating a CLI | Command                | Notes\n| :--------------| :--------------------- | :---------\n| import         | `import fire`          |\n| Call           | `fire.Fire()`          | Turns the current module into a Fire CLI.\n| Call           | `fire.Fire(component)` | Turns `component` into a Fire CLI.\n\n| Using a CLI                                     | Command                                 | Notes\n| :---------------------------------------------- | :-------------------------------------- | :----\n| [Help](docs/using-cli.md#help-flag)             | `command --help` or `command -- --help` |\n| [REPL](docs/using-cli.md#interactive-flag)      | `command -- --interactive`              | Enters interactive mode.\n| [Separator](docs/using-cli.md#separator-flag)   | `command -- --separator=X`              | Sets the separator to `X`. The default separator is `-`.\n| [Completion](docs/using-cli.md#completion-flag) | `command -- --completion [shell]`       | Generates a completion script for the CLI.\n| [Trace](docs/using-cli.md#trace-flag)           | `command -- --trace`                    | Gets a Fire trace for the command.\n| [Verbose](docs/using-cli.md#verbose-flag)       | `command -- --verbose`                  |\n\n_Note that these flags are separated from the Fire command by an isolated `--`._\n\n## License\n\nLicensed under the\n[Apache 2.0](https://github.com/google/python-fire/blob/master/LICENSE) License.\n\n## Disclaimer\n\nThis is not an official Google product.\n",
        "description_content_type": "text/markdown",
        "keywords": [
          "command",
          "line",
          "interface",
          "cli",
          "python",
          "fire",
          "interactive",
          "bash",
          "tool"
        ],
        "author_email": "David Bieber <david810+fire@gmail.com>",
        "license": "Apache-2.0",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 4 - Beta",
          "Intended Audience :: Developers",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.7",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Operating System :: OS Independent",
          "Operating System :: POSIX",
          "Operating System :: MacOS",
          "Operating System :: Unix"
        ],
        "requires_dist": [
          "termcolor",
          "setuptools<=80.9.0; extra == \"test\"",
          "pip; extra == \"test\"",
          "pylint<3.3.8; extra == \"test\"",
          "pytest<=8.4.1; extra == \"test\"",
          "pytest-pylint<=1.1.2; extra == \"test\"",
          "pytest-runner<7.0.0; extra == \"test\"",
          "termcolor<3.2.0; extra == \"test\"",
          "hypothesis<6.136.0; extra == \"test\"",
          "levenshtein<=0.27.1; extra == \"test\""
        ],
        "requires_python": ">=3.7",
        "project_url": [
          "Homepage, https://github.com/google/python-fire",
          "Repository, https://github.com/google/python-fire"
        ],
        "provides_extra": [
          "test"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/fire-0.7.1.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "python-multipart",
        "version": "0.0.27",
        "summary": "A streaming multipart parser for Python",
        "description": "# [Python-Multipart](https://kludex.github.io/python-multipart/)\n\n[![Build Status](https://github.com/Kludex/python-multipart/workflows/CI/badge.svg)](https://github.com/Kludex/python-multipart/actions)\n[![Package version](https://badge.fury.io/py/python-multipart.svg)](https://pypi.python.org/pypi/python-multipart)\n[![Supported Python Version](https://img.shields.io/pypi/pyversions/python-multipart.svg?color=%2334D058)](https://pypi.org/project/python-multipart)\n[![Discord](https://img.shields.io/discord/1051468649518616576?logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/RxKUF5JuHs)\n\n---\n\n`python-multipart` is an Apache2-licensed streaming multipart parser for Python.\nTest coverage is currently 100%.\n\n## Why?\n\nBecause streaming uploads are awesome for large files.\n",
        "description_content_type": "text/markdown",
        "author_email": "Andrew Dunham <andrew@du.nham.ca>",
        "maintainer_email": "Marcelo Trylesinski <marcelotryle@gmail.com>",
        "license_expression": "Apache-2.0",
        "license_file": [
          "LICENSE.txt"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Environment :: Web Environment",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: Apache Software License",
          "Operating System :: OS Independent",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Topic :: Software Development :: Libraries :: Python Modules"
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Homepage, https://github.com/Kludex/python-multipart",
          "Documentation, https://kludex.github.io/python-multipart/",
          "Changelog, https://github.com/Kludex/python-multipart/blob/master/CHANGELOG.md",
          "Source, https://github.com/Kludex/python-multipart"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/python_multipart-0.0.27.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "pillow",
        "version": "12.2.0",
        "dynamic": [
          "license-file"
        ],
        "summary": "Python Imaging Library (fork)",
        "description": "<p align=\"center\">\n    <img width=\"248\" height=\"250\" src=\"https://raw.githubusercontent.com/python-pillow/pillow-logo/main/pillow-logo-248x250.png\" alt=\"Pillow logo\">\n</p>\n\n# Pillow\n\n## Python Imaging Library (Fork)\n\nPillow is the friendly PIL fork by [Jeffrey 'Alex' Clark and\ncontributors](https://github.com/python-pillow/Pillow/graphs/contributors).\nPIL is the Python Imaging Library by Fredrik Lundh and contributors.\nAs of 2019, Pillow development is\n[supported by Tidelift](https://tidelift.com/subscription/pkg/pypi-pillow?utm_source=pypi-pillow&utm_medium=readme&utm_campaign=enterprise).\n\n<table>\n    <tr>\n        <th>docs</th>\n        <td>\n            <a href=\"https://pillow.readthedocs.io/?badge=latest\"><img\n                alt=\"Documentation Status\"\n                src=\"https://readthedocs.org/projects/pillow/badge/?version=latest\"></a>\n        </td>\n    </tr>\n    <tr>\n        <th>tests</th>\n        <td>\n            <a href=\"https://github.com/python-pillow/Pillow/actions/workflows/lint.yml\"><img\n                alt=\"GitHub Actions build status (Lint)\"\n                src=\"https://github.com/python-pillow/Pillow/workflows/Lint/badge.svg\"></a>\n            <a href=\"https://github.com/python-pillow/Pillow/actions/workflows/test.yml\"><img\n                alt=\"GitHub Actions build status (Test Linux and macOS)\"\n                src=\"https://github.com/python-pillow/Pillow/workflows/Test/badge.svg\"></a>\n            <a href=\"https://github.com/python-pillow/Pillow/actions/workflows/test-windows.yml\"><img\n                alt=\"GitHub Actions build status (Test Windows)\"\n                src=\"https://github.com/python-pillow/Pillow/workflows/Test%20Windows/badge.svg\"></a>\n            <a href=\"https://github.com/python-pillow/Pillow/actions/workflows/test-mingw.yml\"><img\n                alt=\"GitHub Actions build status (Test MinGW)\"\n                src=\"https://github.com/python-pillow/Pillow/workflows/Test%20MinGW/badge.svg\"></a>\n            <a href=\"https://github.com/python-pillow/Pillow/actions/workflows/test-docker.yml\"><img\n                alt=\"GitHub Actions build status (Test Docker)\"\n                src=\"https://github.com/python-pillow/Pillow/workflows/Test%20Docker/badge.svg\"></a>\n            <a href=\"https://github.com/python-pillow/Pillow/actions/workflows/wheels.yml\"><img\n                alt=\"GitHub Actions build status (Wheels)\"\n                src=\"https://github.com/python-pillow/Pillow/workflows/Wheels/badge.svg\"></a>\n            <a href=\"https://app.codecov.io/gh/python-pillow/Pillow\"><img\n                alt=\"Code coverage\"\n                src=\"https://codecov.io/gh/python-pillow/Pillow/branch/main/graph/badge.svg\"></a>\n            <a href=\"https://issues.oss-fuzz.com/issues?q=title:pillow\"><img\n                alt=\"Fuzzing Status\"\n                src=\"https://oss-fuzz-build-logs.storage.googleapis.com/badges/pillow.svg\"></a>\n        </td>\n    </tr>\n    <tr>\n        <th>package</th>\n        <td>\n            <a href=\"https://zenodo.org/badge/latestdoi/17549/python-pillow/Pillow\"><img\n                alt=\"Zenodo\"\n                src=\"https://zenodo.org/badge/17549/python-pillow/Pillow.svg\"></a>\n            <a href=\"https://tidelift.com/subscription/pkg/pypi-pillow?utm_source=pypi-pillow&utm_medium=badge\"><img\n                alt=\"Tidelift\"\n                src=\"https://tidelift.com/badges/package/pypi/pillow?style=flat\"></a>\n            <a href=\"https://pypi.org/project/pillow/\"><img\n                alt=\"Newest PyPI version\"\n                src=\"https://img.shields.io/pypi/v/pillow.svg\"></a>\n            <a href=\"https://pypi.org/project/pillow/\"><img\n                alt=\"Number of PyPI downloads\"\n                src=\"https://img.shields.io/pypi/dm/pillow.svg\"></a>\n            <a href=\"https://www.bestpractices.dev/projects/6331\"><img\n                alt=\"OpenSSF Best Practices\"\n                src=\"https://www.bestpractices.dev/projects/6331/badge\"></a>\n        </td>\n    </tr>\n    <tr>\n        <th>social</th>\n        <td>\n            <a href=\"https://gitter.im/python-pillow/Pillow?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge\"><img\n                alt=\"Join the chat at https://gitter.im/python-pillow/Pillow\"\n                src=\"https://badges.gitter.im/python-pillow/Pillow.svg\"></a>\n            <a href=\"https://fosstodon.org/@pillow\"><img\n                alt=\"Follow on https://fosstodon.org/@pillow\"\n                src=\"https://img.shields.io/badge/publish-on%20Mastodon-595aff.svg\"\n                rel=\"me\"></a>\n        </td>\n    </tr>\n</table>\n\n## Overview\n\nThe Python Imaging Library adds image processing capabilities to your Python interpreter.\n\nThis library provides extensive file format support, an efficient internal representation, and fairly powerful image processing capabilities.\n\nThe core image library is designed for fast access to data stored in a few basic pixel formats. It should provide a solid foundation for a general image processing tool.\n\n## More information\n\n- [Documentation](https://pillow.readthedocs.io/)\n  - [Installation](https://pillow.readthedocs.io/en/latest/installation/basic-installation.html)\n  - [Handbook](https://pillow.readthedocs.io/en/latest/handbook/index.html)\n- [Contribute](https://github.com/python-pillow/Pillow/blob/main/.github/CONTRIBUTING.md)\n  - [Issues](https://github.com/python-pillow/Pillow/issues)\n  - [Pull requests](https://github.com/python-pillow/Pillow/pulls)\n- [Release notes](https://pillow.readthedocs.io/en/stable/releasenotes/index.html)\n- [Changelog](https://github.com/python-pillow/Pillow/releases)\n  - [Pre-fork](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst#pre-fork)\n\n## Report a vulnerability\n\nTo report a security vulnerability, please follow the procedure described in the [Tidelift security policy](https://tidelift.com/docs/security).\n",
        "description_content_type": "text/markdown",
        "keywords": [
          "Imaging"
        ],
        "author_email": "Jeffrey 'Alex' Clark <aclark@aclark.net>",
        "license_expression": "MIT-CMU",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 6 - Mature",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: Multimedia :: Graphics",
          "Topic :: Multimedia :: Graphics :: Capture :: Digital Camera",
          "Topic :: Multimedia :: Graphics :: Capture :: Screen Capture",
          "Topic :: Multimedia :: Graphics :: Graphics Conversion",
          "Topic :: Multimedia :: Graphics :: Viewers",
          "Typing :: Typed"
        ],
        "requires_dist": [
          "furo; extra == \"docs\"",
          "olefile; extra == \"docs\"",
          "sphinx>=8.2; extra == \"docs\"",
          "sphinx-autobuild; extra == \"docs\"",
          "sphinx-copybutton; extra == \"docs\"",
          "sphinx-inline-tabs; extra == \"docs\"",
          "sphinxext-opengraph; extra == \"docs\"",
          "olefile; extra == \"fpx\"",
          "olefile; extra == \"mic\"",
          "arro3-compute; extra == \"test-arrow\"",
          "arro3-core; extra == \"test-arrow\"",
          "nanoarrow; extra == \"test-arrow\"",
          "pyarrow; extra == \"test-arrow\"",
          "check-manifest; extra == \"tests\"",
          "coverage>=7.4.2; extra == \"tests\"",
          "defusedxml; extra == \"tests\"",
          "markdown2; extra == \"tests\"",
          "olefile; extra == \"tests\"",
          "packaging; extra == \"tests\"",
          "pyroma>=5; extra == \"tests\"",
          "pytest; extra == \"tests\"",
          "pytest-cov; extra == \"tests\"",
          "pytest-timeout; extra == \"tests\"",
          "pytest-xdist; extra == \"tests\"",
          "trove-classifiers>=2024.10.12; extra == \"tests\"",
          "defusedxml; extra == \"xmp\""
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Release notes, https://pillow.readthedocs.io/en/stable/releasenotes/index.html",
          "Changelog, https://github.com/python-pillow/Pillow/releases",
          "Documentation, https://pillow.readthedocs.io",
          "Funding, https://tidelift.com/subscription/pkg/pypi-pillow?utm_source=pypi-pillow&utm_medium=pypi",
          "Homepage, https://python-pillow.github.io",
          "Mastodon, https://fosstodon.org/@pillow",
          "Source, https://github.com/python-pillow/Pillow"
        ],
        "provides_extra": [
          "docs",
          "fpx",
          "mic",
          "test-arrow",
          "tests",
          "xmp"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/pillow-12.2.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "Pygments",
        "version": "2.19.2",
        "summary": "Pygments is a syntax highlighting package written in Python.",
        "description": "Pygments\n~~~~~~~~\n\nPygments is a syntax highlighting package written in Python.\n\nIt is a generic syntax highlighter suitable for use in code hosting, forums,\nwikis or other applications that need to prettify source code.  Highlights\nare:\n\n* a wide range of over 500 languages and other text formats is supported\n* special attention is paid to details, increasing quality by a fair amount\n* support for new languages and formats are added easily\n* a number of output formats, presently HTML, LaTeX, RTF, SVG, all image\n  formats that PIL supports and ANSI sequences\n* it is usable as a command-line tool and as a library\n\nCopyright 2006-2025 by the Pygments team, see ``AUTHORS``.\nLicensed under the BSD, see ``LICENSE`` for details.\n",
        "description_content_type": "text/x-rst",
        "keywords": [
          "syntax",
          "highlighting"
        ],
        "author_email": "Georg Brandl <georg@python.org>",
        "maintainer": "Matthäus G. Chajdas",
        "maintainer_email": "Georg Brandl <georg@python.org>, Jean Abou Samra <jean@abou-samra.fr>",
        "license": "BSD-2-Clause",
        "license_file": [
          "AUTHORS",
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 6 - Mature",
          "Intended Audience :: Developers",
          "Intended Audience :: End Users/Desktop",
          "Intended Audience :: System Administrators",
          "License :: OSI Approved :: BSD License",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: Text Processing :: Filters",
          "Topic :: Utilities"
        ],
        "requires_dist": [
          "colorama>=0.4.6; extra == 'windows-terminal'"
        ],
        "requires_python": ">=3.8",
        "project_url": [
          "Homepage, https://pygments.org",
          "Documentation, https://pygments.org/docs",
          "Source, https://github.com/pygments/pygments",
          "Bug Tracker, https://github.com/pygments/pygments/issues",
          "Changelog, https://github.com/pygments/pygments/blob/master/CHANGES"
        ],
        "provides_extra": [
          "plugins",
          "windows-terminal"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/pygments-2.19.2.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "anyio",
        "version": "4.12.1",
        "dynamic": [
          "license-file"
        ],
        "summary": "High-level concurrency and networking framework on top of asyncio or Trio",
        "description": ".. image:: https://github.com/agronholm/anyio/actions/workflows/test.yml/badge.svg\n  :target: https://github.com/agronholm/anyio/actions/workflows/test.yml\n  :alt: Build Status\n.. image:: https://coveralls.io/repos/github/agronholm/anyio/badge.svg?branch=master\n  :target: https://coveralls.io/github/agronholm/anyio?branch=master\n  :alt: Code Coverage\n.. image:: https://readthedocs.org/projects/anyio/badge/?version=latest\n  :target: https://anyio.readthedocs.io/en/latest/?badge=latest\n  :alt: Documentation\n.. image:: https://badges.gitter.im/gitterHQ/gitter.svg\n  :target: https://gitter.im/python-trio/AnyIO\n  :alt: Gitter chat\n\nAnyIO is an asynchronous networking and concurrency library that works on top of either asyncio_ or\nTrio_. It implements Trio-like `structured concurrency`_ (SC) on top of asyncio and works in harmony\nwith the native SC of Trio itself.\n\nApplications and libraries written against AnyIO's API will run unmodified on either asyncio_ or\nTrio_. AnyIO can also be adopted into a library or application incrementally – bit by bit, no full\nrefactoring necessary. It will blend in with the native libraries of your chosen backend.\n\nTo find out why you might want to use AnyIO's APIs instead of asyncio's, you can read about it\n`here <https://anyio.readthedocs.io/en/stable/why.html>`_.\n\nDocumentation\n-------------\n\nView full documentation at: https://anyio.readthedocs.io/\n\nFeatures\n--------\n\nAnyIO offers the following functionality:\n\n* Task groups (nurseries_ in trio terminology)\n* High-level networking (TCP, UDP and UNIX sockets)\n\n  * `Happy eyeballs`_ algorithm for TCP connections (more robust than that of asyncio on Python\n    3.8)\n  * async/await style UDP sockets (unlike asyncio where you still have to use Transports and\n    Protocols)\n\n* A versatile API for byte streams and object streams\n* Inter-task synchronization and communication (locks, conditions, events, semaphores, object\n  streams)\n* Worker threads\n* Subprocesses\n* Subinterpreter support for code parallelization (on Python 3.13 and later)\n* Asynchronous file I/O (using worker threads)\n* Signal handling\n* Asynchronous version of the functools_ module\n\nAnyIO also comes with its own pytest_ plugin which also supports asynchronous fixtures.\nIt even works with the popular Hypothesis_ library.\n\n.. _asyncio: https://docs.python.org/3/library/asyncio.html\n.. _Trio: https://github.com/python-trio/trio\n.. _structured concurrency: https://en.wikipedia.org/wiki/Structured_concurrency\n.. _nurseries: https://trio.readthedocs.io/en/stable/reference-core.html#nurseries-and-spawning\n.. _Happy eyeballs: https://en.wikipedia.org/wiki/Happy_Eyeballs\n.. _pytest: https://docs.pytest.org/en/latest/\n.. _functools: https://docs.python.org/3/library/functools.html\n.. _Hypothesis: https://hypothesis.works/\n",
        "description_content_type": "text/x-rst",
        "author_email": "Alex Grönholm <alex.gronholm@nextday.fi>",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "Framework :: AnyIO",
          "Typing :: Typed",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14"
        ],
        "requires_dist": [
          "exceptiongroup>=1.0.2; python_version < \"3.11\"",
          "idna>=2.8",
          "typing_extensions>=4.5; python_version < \"3.13\"",
          "trio>=0.32.0; python_version >= \"3.10\" and extra == \"trio\"",
          "trio>=0.31.0; python_version < \"3.10\" and extra == \"trio\""
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Documentation, https://anyio.readthedocs.io/en/latest/",
          "Changelog, https://anyio.readthedocs.io/en/stable/versionhistory.html",
          "Source code, https://github.com/agronholm/anyio",
          "Issue tracker, https://github.com/agronholm/anyio/issues"
        ],
        "provides_extra": [
          "trio"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/anyio-4.12.1.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "jiter",
        "version": "0.13.0",
        "summary": "Fast iterable JSON parser.",
        "description": "# jiter\n\n[![CI](https://github.com/pydantic/jiter/workflows/CI/badge.svg?event=push)](https://github.com/pydantic/jiter/actions?query=event%3Apush+branch%3Amain+workflow%3ACI)\n[![pypi](https://img.shields.io/pypi/v/jiter.svg)](https://pypi.python.org/pypi/jiter)\n[![versions](https://img.shields.io/pypi/pyversions/jiter.svg)](https://github.com/pydantic/jiter)\n[![license](https://img.shields.io/github/license/pydantic/jiter.svg)](https://github.com/pydantic/jiter/blob/main/LICENSE)\n\nThis is a standalone version of the JSON parser used in `pydantic-core`. The recommendation is to only use this package directly if you do not use `pydantic`.\n\nThe API is extremely minimal:\n\n```python\ndef from_json(\n    json_data: bytes,\n    /,\n    *,\n    allow_inf_nan: bool = True,\n    cache_mode: Literal[True, False, \"all\", \"keys\", \"none\"] = \"all\",\n    partial_mode: Literal[True, False, \"off\", \"on\", \"trailing-strings\"] = False,\n    catch_duplicate_keys: bool = False,\n    float_mode: Literal[\"float\", \"decimal\", \"lossless-float\"] = \"float\",\n) -> Any:\n    \"\"\"\n    Parse input bytes into a JSON object.\n\n    Arguments:\n        json_data: The JSON data to parse\n        allow_inf_nan: Whether to allow infinity (`Infinity` an `-Infinity`) and `NaN` values to float fields.\n            Defaults to True.\n        cache_mode: cache Python strings to improve performance at the cost of some memory usage\n            - True / 'all' - cache all strings\n            - 'keys' - cache only object keys\n            - False / 'none' - cache nothing\n        partial_mode: How to handle incomplete strings:\n            - False / 'off' - raise an exception if the input is incomplete\n            - True / 'on' - allow incomplete JSON but discard the last string if it is incomplete\n            - 'trailing-strings' - allow incomplete JSON, and include the last incomplete string in the output\n        catch_duplicate_keys: if True, raise an exception if objects contain the same key multiple times\n        float_mode: How to return floats: as a `float`, `Decimal` or `LosslessFloat`\n\n    Returns:\n        Python object built from the JSON input.\n    \"\"\"\n\ndef cache_clear() -> None:\n    \"\"\"\n    Reset the string cache.\n    \"\"\"\n\ndef cache_usage() -> int:\n    \"\"\"\n    get the size of the string cache.\n\n    Returns:\n        Size of the string cache in bytes.\n    \"\"\"\n```\n## Examples\n\nThe main function provided by Jiter is `from_json()`, which accepts a bytes object containing JSON and returns a Python dictionary, list or other value.\n\n```python\nimport jiter\n\njson_data = b'{\"name\": \"John\", \"age\": 30}'\nparsed_data = jiter.from_json(json_data)\nprint(parsed_data)  # Output: {'name': 'John', 'age': 30}\n```\n\n### Handling Partial JSON\n\nIncomplete JSON objects can be parsed using the `partial_mode=` parameter.\n\n```python\nimport jiter\n\npartial_json = b'{\"name\": \"John\", \"age\": 30, \"city\": \"New Yor'\n\n# Raise error on incomplete JSON\ntry:\n    jiter.from_json(partial_json, partial_mode=False)\nexcept ValueError as e:\n    print(f\"Error: {e}\")\n\n# Parse incomplete JSON, discarding incomplete last field\nresult = jiter.from_json(partial_json, partial_mode=True)\nprint(result)  # Output: {'name': 'John', 'age': 30}\n\n# Parse incomplete JSON, including incomplete last field\nresult = jiter.from_json(partial_json, partial_mode='trailing-strings')\nprint(result)  # Output: {'name': 'John', 'age': 30, 'city': 'New Yor'}\n```\n\n### Catching Duplicate Keys\n\nThe `catch_duplicate_keys=True` option can be used to raise a `ValueError` if an object contains duplicate keys.\n\n```python\nimport jiter\n\njson_with_dupes = b'{\"foo\": 1, \"foo\": 2}'\n\n# Default behavior (last value wins)\nresult = jiter.from_json(json_with_dupes)\nprint(result)  # Output: {'foo': 2}\n\n# Catch duplicate keys\ntry:\n    jiter.from_json(json_with_dupes, catch_duplicate_keys=True)\nexcept ValueError as e:\n    print(f\"Error: {e}\")\n```\n\n",
        "description_content_type": "text/markdown; charset=UTF-8; variant=GFM",
        "home_page": "https://github.com/pydantic/jiter/",
        "author_email": "Samuel Colvin <s@muelcolvin.com>",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 4 - Beta",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: GraalPy",
          "Intended Audience :: Developers",
          "Intended Audience :: Information Technology",
          "Intended Audience :: System Administrators",
          "License :: OSI Approved :: MIT License",
          "Operating System :: Unix",
          "Operating System :: POSIX :: Linux",
          "Environment :: Console",
          "Environment :: MacOS X",
          "Topic :: File Formats :: JSON",
          "Framework :: Pydantic :: 2"
        ],
        "requires_python": ">=3.9"
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/jiter-0.13.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "propcache",
        "version": "0.5.2",
        "dynamic": [
          "license-file"
        ],
        "summary": "Accelerated property cache",
        "description": "propcache\n=========\n\nThe module provides a fast implementation of cached properties for Python 3.10+.\n\n.. image:: https://github.com/aio-libs/propcache/actions/workflows/ci-cd.yml/badge.svg\n  :target: https://github.com/aio-libs/propcache/actions?query=workflow%3ACI\n  :align: right\n\n.. image:: https://codecov.io/gh/aio-libs/propcache/branch/master/graph/badge.svg\n  :target: https://codecov.io/gh/aio-libs/propcache\n\n.. image:: https://badge.fury.io/py/propcache.svg\n    :target: https://badge.fury.io/py/propcache\n\n\n.. image:: https://readthedocs.org/projects/propcache/badge/?version=latest\n    :target: https://propcache.readthedocs.io\n\n\n.. image:: https://img.shields.io/pypi/pyversions/propcache.svg\n    :target: https://pypi.python.org/pypi/propcache\n\n.. image:: https://img.shields.io/matrix/aio-libs:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat\n   :target: https://matrix.to/#/%23aio-libs:matrix.org\n   :alt: Matrix Room — #aio-libs:matrix.org\n\n.. image:: https://img.shields.io/matrix/aio-libs-space:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs-space%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat\n   :target: https://matrix.to/#/%23aio-libs-space:matrix.org\n   :alt: Matrix Space — #aio-libs-space:matrix.org\n\nIntroduction\n------------\n\nThe API is designed to be nearly identical to the built-in ``functools.cached_property`` class,\nexcept for the additional ``under_cached_property`` class which uses ``self._cache``\ninstead of ``self.__dict__`` to store the cached values and prevents ``__set__`` from being called.\n\nFor full documentation please read https://propcache.readthedocs.io.\n\nInstallation\n------------\n\n::\n\n   $ pip install propcache\n\nThe library is Python 3 only!\n\nPyPI contains binary wheels for Linux, Windows and MacOS.  If you want to install\n``propcache`` on another operating system where wheels are not provided,\nthe the tarball will be used to compile the library from\nthe source code. It requires a C compiler and and Python headers installed.\n\nTo skip the compilation you must explicitly opt-in by using a PEP 517\nconfiguration setting ``pure-python``, or setting the ``PROPCACHE_NO_EXTENSIONS``\nenvironment variable to a non-empty value, e.g.:\n\n.. code-block:: console\n\n   $ pip install propcache --config-settings=pure-python=false\n\nPlease note that the pure-Python (uncompiled) version is much slower. However,\nPyPy always uses a pure-Python implementation, and, as such, it is unaffected\nby this variable.\n\n\nAPI documentation\n------------------\n\nThe documentation is located at https://propcache.readthedocs.io.\n\nSource code\n-----------\n\nThe project is hosted on GitHub_\n\nPlease file an issue on the `bug tracker\n<https://github.com/aio-libs/propcache/issues>`_ if you have found a bug\nor have some suggestion in order to improve the library.\n\nDiscussion list\n---------------\n\n*aio-libs* google group: https://groups.google.com/forum/#!forum/aio-libs\n\nFeel free to post your questions and ideas here.\n\n\nAuthors and License\n-------------------\n\nThe ``propcache`` package is derived from ``yarl`` which is written by Andrew Svetlov.\n\nIt's *Apache 2* licensed and freely available.\n\n\n.. _GitHub: https://github.com/aio-libs/propcache\n\n=========\nChangelog\n=========\n\n..\n    You should *NOT* be adding new change log entries to this file, this\n    file is managed by towncrier. You *may* edit previous change logs to\n    fix problems like typo corrections or such.\n    To add a new change log entry, please see\n    https://pip.pypa.io/en/latest/development/#adding-a-news-entry\n    we named the news folder \"changes\".\n\n    WARNING: Don't drop the next directive!\n\n.. towncrier release notes start\n\n0.5.2\n=====\n\n*(2026-05-08)*\n\n\nNo significant changes.\n\n\n----\n\n\n0.5.1\n=====\n\n*(2026-05-08)*\n\n\nNo significant changes.\n\n\n----\n\n\n0.5.0\n=====\n\n*(2026-05-08)*\n\n\nFeatures\n--------\n\n- Added support for newer type hints and remove ``Optional`` and ``Union`` from all annotations\n  -- by `@Vizonex <https://github.com/sponsors/Vizonex>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#193 <https://github.com/aio-libs/propcache/issues/193>`__.\n\n\nRemovals and backward incompatible breaking changes\n---------------------------------------------------\n\n- Dropped support for Python 3.9 as it has reached end of life.\n\n  *Related issues and pull requests on GitHub:*\n  `#216 <https://github.com/aio-libs/propcache/issues/216>`__.\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- Changed the Cython build dependency from ``~= 3.1.0`` to ``>= 3.2.0``,\n  removing the upper version bound to avoid conflicts for downstream packagers\n  -- by `@jameshilliard <https://github.com/sponsors/jameshilliard>`__ and `@gundalow <https://github.com/sponsors/gundalow>`__.\n\n  The upstream Cython version is pinned to 3.2.4 in the CI/CD environment.\n\n  *Related issues and pull requests on GitHub:*\n  `#184 <https://github.com/aio-libs/propcache/issues/184>`__, `#188 <https://github.com/aio-libs/propcache/issues/188>`__, `#214 <https://github.com/aio-libs/propcache/issues/214>`__.\n\n- Start building and shipping riscv64 wheels\n  -- by `@justeph <https://github.com/sponsors/justeph>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#194 <https://github.com/aio-libs/propcache/issues/194>`__.\n\n- The `PEP 517 <https://peps.python.org/pep-517>`__ build backend now supports a new ``build-inplace``\n  config setting (and ``PROPCACHE_BUILD_INPLACE`` environment variable)\n  for controlling whether to build the project in-tree or in a\n  temporary directory. It only affects wheels and is set up to build\n  in a temporary directory by default. It does not affect editable\n  wheel builds; they will keep being built in-tree regardless.\n\n  Here's an example of using this setting:\n\n  .. code-block:: console\n\n     $ python -m build --config-setting=build-inplace=true\n\n  Additionally, when building wheels in an automatically created\n  temporary directory, the build backend now normalizes the\n  respective file system path to a deterministic source checkout\n  directory by injecting the ``-ffile-prefix-map`` compiler option\n  into the ``CFLAGS`` environment variable, as suggested by known\n  `reproducible build practices\n  <https://reproducible-builds.org/docs/build-path/>`__.\n\n  The effect is that downstreams will get reproducible build results.\n\n  *Related issues and pull requests on GitHub:*\n  `#218 <https://github.com/aio-libs/propcache/issues/218>`__.\n\n\n----\n\n\n0.4.1\n=====\n\n*(2025-10-08)*\n\n\nBug fixes\n---------\n\n- Fixed reference leak caused by ``Py_INCREF`` because Cython has its own reference counter systems -- by `@Vizonex <https://github.com/sponsors/Vizonex>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#162 <https://github.com/aio-libs/propcache/issues/162>`__.\n\n\nContributor-facing changes\n--------------------------\n\n- Fixes the default value for the ``os``\n  parameter in ``reusable-build-wheel.yml``\n  to be ``ubuntu-latest`` instead of\n  ``ubuntu``.\n\n  *Related issues and pull requests on GitHub:*\n  `#155 <https://github.com/aio-libs/propcache/issues/155>`__.\n\n\n----\n\n\n0.4.0\n=====\n\n*(2025-10-04)*\n\n\nFeatures\n--------\n\n- Optimized propcache by replacing sentinel ``object`` for checking if\n  the ``object`` is ``NULL`` and changed ``dict`` API for\n  Python C-API -- by `@Vizonex <https://github.com/sponsors/Vizonex>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#121 <https://github.com/aio-libs/propcache/issues/121>`__.\n\n\nContributor-facing changes\n--------------------------\n\n- Builds have been added for arm64 Windows\n  wheels and the ``reusable-build-wheel.yml``\n  workflow has been modified to allow for\n  an OS value (``windows-11-arm``) which\n  does not include the ``-latest`` postfix\n  -- by `@finnagin <https://github.com/sponsors/finnagin>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#133 <https://github.com/aio-libs/propcache/issues/133>`__.\n\n- Added CI for CPython 3.14 -- by `@kumaraditya303 <https://github.com/sponsors/kumaraditya303>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#140 <https://github.com/aio-libs/propcache/issues/140>`__.\n\n\n----\n\n\n0.3.2\n=====\n\n*(2025-06-09)*\n\n\nImproved documentation\n----------------------\n\n- Fixed incorrect decorator usage in the ``~propcache.api.under_cached_property`` example code -- by `@meanmail <https://github.com/sponsors/meanmail>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#109 <https://github.com/aio-libs/propcache/issues/109>`__.\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- Updated to use Cython 3.1 universally across the build path -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#117 <https://github.com/aio-libs/propcache/issues/117>`__.\n\n- Made Cython line tracing opt-in via the ``with-cython-tracing`` build config setting -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  Previously, line tracing was enabled by default in ``pyproject.toml``, which caused build issues for some users and made wheels nearly twice as slow.\n\n  Now line tracing is only enabled when explicitly requested via ``pip install . --config-setting=with-cython-tracing=true`` or by setting the ``PROPCACHE_CYTHON_TRACING`` environment variable.\n\n  *Related issues and pull requests on GitHub:*\n  `#118 <https://github.com/aio-libs/propcache/issues/118>`__.\n\n\n----\n\n\n0.3.1\n=====\n\n*(2025-03-25)*\n\n\nBug fixes\n---------\n\n- Improved typing annotations, fixing some type errors under correct usage\n  and improving typing robustness generally -- by `@Dreamsorcerer <https://github.com/sponsors/Dreamsorcerer>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#103 <https://github.com/aio-libs/propcache/issues/103>`__.\n\n\n----\n\n\n0.3.0\n=====\n\n*(2025-02-20)*\n\n\nFeatures\n--------\n\n- Implemented support for the free-threaded build of CPython 3.13 -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#84 <https://github.com/aio-libs/propcache/issues/84>`__.\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- Started building wheels for the free-threaded build of CPython 3.13 -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#84 <https://github.com/aio-libs/propcache/issues/84>`__.\n\n\nContributor-facing changes\n--------------------------\n\n- GitHub Actions CI/CD is now configured to manage caching pip-ecosystem\n  dependencies using `re-actors/cache-python-deps`_ -- an action by\n  `@webknjaz <https://github.com/sponsors/webknjaz>`__ that takes into account ABI stability and the exact\n  version of Python runtime.\n\n  .. _`re-actors/cache-python-deps`:\n     https://github.com/marketplace/actions/cache-python-deps\n\n  *Related issues and pull requests on GitHub:*\n  `#93 <https://github.com/aio-libs/propcache/issues/93>`__.\n\n\n----\n\n\n0.2.1\n=====\n\n*(2024-12-01)*\n\n\nBug fixes\n---------\n\n- Stopped implicitly allowing the use of Cython pre-release versions when\n  building the distribution package -- by `@ajsanchezsanz <https://github.com/sponsors/ajsanchezsanz>`__ and\n  `@markgreene74 <https://github.com/sponsors/markgreene74>`__.\n\n  *Related commits on GitHub:*\n  `64df0a6 <https://github.com/aio-libs/propcache/commit/64df0a6>`__.\n\n- Fixed ``wrapped`` and ``func`` not being accessible in the Cython versions of ``propcache.api.cached_property`` and ``propcache.api.under_cached_property`` decorators -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#72 <https://github.com/aio-libs/propcache/issues/72>`__.\n\n\nRemovals and backward incompatible breaking changes\n---------------------------------------------------\n\n- Removed support for Python 3.8 as it has reached end of life -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#57 <https://github.com/aio-libs/propcache/issues/57>`__.\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- Stopped implicitly allowing the use of Cython pre-release versions when\n  building the distribution package -- by `@ajsanchezsanz <https://github.com/sponsors/ajsanchezsanz>`__ and\n  `@markgreene74 <https://github.com/sponsors/markgreene74>`__.\n\n  *Related commits on GitHub:*\n  `64df0a6 <https://github.com/aio-libs/propcache/commit/64df0a6>`__.\n\n\n----\n\n\n0.2.0\n=====\n\n*(2024-10-07)*\n\n\nBug fixes\n---------\n\n- Fixed loading the C-extensions on Python 3.8 -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#26 <https://github.com/aio-libs/propcache/issues/26>`__.\n\n\nFeatures\n--------\n\n- Improved typing for the ``propcache.api.under_cached_property`` decorator -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#38 <https://github.com/aio-libs/propcache/issues/38>`__.\n\n\nImproved documentation\n----------------------\n\n- Added API documentation for the ``propcache.api.cached_property`` and ``propcache.api.under_cached_property`` decorators -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#16 <https://github.com/aio-libs/propcache/issues/16>`__.\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- Moved ``propcache.api.under_cached_property`` and ``propcache.api.cached_property`` to `propcache.api` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  Both decorators remain importable from the top-level package, however importing from `propcache.api` is now the recommended way to use them.\n\n  *Related issues and pull requests on GitHub:*\n  `#19 <https://github.com/aio-libs/propcache/issues/19>`__, `#24 <https://github.com/aio-libs/propcache/issues/24>`__, `#32 <https://github.com/aio-libs/propcache/issues/32>`__.\n\n- Converted project to use a src layout -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#22 <https://github.com/aio-libs/propcache/issues/22>`__, `#29 <https://github.com/aio-libs/propcache/issues/29>`__, `#37 <https://github.com/aio-libs/propcache/issues/37>`__.\n\n\n----\n\n\n0.1.0\n=====\n\n*(2024-10-03)*\n\n\nFeatures\n--------\n\n- Added ``armv7l`` wheels -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#5 <https://github.com/aio-libs/propcache/issues/5>`__.\n\n\n----\n\n\n0.0.0\n=====\n\n*(2024-10-02)*\n\n\n- Initial release.\n",
        "description_content_type": "text/x-rst",
        "keywords": [
          "cython",
          "cext",
          "propcache"
        ],
        "home_page": "https://github.com/aio-libs/propcache",
        "author": "Andrew Svetlov",
        "author_email": "andrew.svetlov@gmail.com",
        "maintainer": "aiohttp team <team@aiohttp.org>",
        "maintainer_email": "team@aiohttp.org",
        "license": "Apache-2.0",
        "license_file": [
          "LICENSE",
          "NOTICE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: Apache Software License",
          "Programming Language :: Cython",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Topic :: Internet :: WWW/HTTP",
          "Topic :: Software Development :: Libraries :: Python Modules"
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org",
          "Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org",
          "CI: GitHub Workflows, https://github.com/aio-libs/propcache/actions?query=branch:master",
          "Code of Conduct, https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md",
          "Coverage: codecov, https://codecov.io/github/aio-libs/propcache",
          "Docs: Changelog, https://propcache.readthedocs.io/en/latest/changes/",
          "Docs: RTD, https://propcache.readthedocs.io",
          "GitHub: issues, https://github.com/aio-libs/propcache/issues",
          "GitHub: repo, https://github.com/aio-libs/propcache"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/propcache-0.5.2.dist-info",
      "installer": "pip",
      "requested": false
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "pytest-asyncio",
        "version": "1.3.0",
        "dynamic": [
          "license-file"
        ],
        "summary": "Pytest support for asyncio",
        "description": "pytest-asyncio\n==============\n\n.. image:: https://img.shields.io/pypi/v/pytest-asyncio.svg\n    :target: https://pypi.python.org/pypi/pytest-asyncio\n.. image:: https://github.com/pytest-dev/pytest-asyncio/workflows/CI/badge.svg\n    :target: https://github.com/pytest-dev/pytest-asyncio/actions?workflow=CI\n.. image:: https://codecov.io/gh/pytest-dev/pytest-asyncio/branch/main/graph/badge.svg\n    :target: https://codecov.io/gh/pytest-dev/pytest-asyncio\n.. image:: https://img.shields.io/pypi/pyversions/pytest-asyncio.svg\n    :target: https://github.com/pytest-dev/pytest-asyncio\n    :alt: Supported Python versions\n.. image:: https://img.shields.io/badge/Matrix-%23pytest--asyncio-brightgreen\n    :alt: Matrix chat room: #pytest-asyncio\n    :target: https://matrix.to/#/#pytest-asyncio:matrix.org\n\n`pytest-asyncio <https://pytest-asyncio.readthedocs.io/en/latest/>`_ is a `pytest <https://docs.pytest.org/en/latest/contents.html>`_ plugin. It facilitates testing of code that uses the `asyncio <https://docs.python.org/3/library/asyncio.html>`_ library.\n\nSpecifically, pytest-asyncio provides support for coroutines as test functions. This allows users to *await* code inside their tests. For example, the following code is executed as a test item by pytest:\n\n.. code-block:: python\n\n    @pytest.mark.asyncio\n    async def test_some_asyncio_code():\n        res = await library.do_something()\n        assert b\"expected result\" == res\n\nMore details can be found in the `documentation <https://pytest-asyncio.readthedocs.io/en/latest/>`_.\n\nNote that test classes subclassing the standard `unittest <https://docs.python.org/3/library/unittest.html>`__ library are not supported. Users\nare advised to use `unittest.IsolatedAsyncioTestCase <https://docs.python.org/3/library/unittest.html#unittest.IsolatedAsyncioTestCase>`__\nor an async framework such as `asynctest <https://asynctest.readthedocs.io/en/latest>`__.\n\n\npytest-asyncio is available under the `Apache License 2.0 <https://github.com/pytest-dev/pytest-asyncio/blob/main/LICENSE>`_.\n\n\nInstallation\n------------\n\nTo install pytest-asyncio, simply:\n\n.. code-block:: bash\n\n    $ pip install pytest-asyncio\n\nThis is enough for pytest to pick up pytest-asyncio.\n\n\nContributing\n------------\nContributions are very welcome. Tests can be run with ``tox``, please ensure\nthe coverage at least stays the same before you submit a pull request.\n",
        "description_content_type": "text/x-rst",
        "author_email": "Tin Tvrtković <tinchester@gmail.com>",
        "maintainer_email": "Michael Seifert <m.seifert@digitalernachschub.de>",
        "license_expression": "Apache-2.0",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Framework :: AsyncIO",
          "Framework :: Pytest",
          "Intended Audience :: Developers",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Topic :: Software Development :: Testing",
          "Typing :: Typed"
        ],
        "requires_dist": [
          "backports-asyncio-runner<2,>=1.1; python_version < \"3.11\"",
          "pytest<10,>=8.2",
          "typing-extensions>=4.12; python_version < \"3.13\"",
          "sphinx>=5.3; extra == \"docs\"",
          "sphinx-rtd-theme>=1; extra == \"docs\"",
          "coverage>=6.2; extra == \"testing\"",
          "hypothesis>=5.7.1; extra == \"testing\""
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Bug Tracker, https://github.com/pytest-dev/pytest-asyncio/issues",
          "Changelog, https://pytest-asyncio.readthedocs.io/en/latest/reference/changelog.html",
          "Documentation, https://pytest-asyncio.readthedocs.io",
          "Homepage, https://github.com/pytest-dev/pytest-asyncio",
          "Source Code, https://github.com/pytest-dev/pytest-asyncio"
        ],
        "provides_extra": [
          "docs",
          "testing"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/pytest_asyncio-1.3.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "pydantic_core",
        "version": "2.46.4",
        "summary": "Core functionality for Pydantic validation and serialization",
        "description": "# pydantic-core\n\n[![CI](https://github.com/pydantic/pydantic-core/workflows/ci/badge.svg?event=push)](https://github.com/pydantic/pydantic-core/actions?query=event%3Apush+branch%3Amain+workflow%3Aci)\n[![Coverage](https://codecov.io/gh/pydantic/pydantic-core/branch/main/graph/badge.svg)](https://codecov.io/gh/pydantic/pydantic-core)\n[![pypi](https://img.shields.io/pypi/v/pydantic-core.svg)](https://pypi.python.org/pypi/pydantic-core)\n[![versions](https://img.shields.io/pypi/pyversions/pydantic-core.svg)](https://github.com/pydantic/pydantic-core)\n[![license](https://img.shields.io/github/license/pydantic/pydantic-core.svg)](https://github.com/pydantic/pydantic-core/blob/main/LICENSE)\n\nThis package provides the core functionality for [pydantic](https://docs.pydantic.dev) validation and serialization.\n\nPydantic-core is currently around 17x faster than pydantic V1.\nSee [`tests/benchmarks/`](./tests/benchmarks/) for details.\n\n## Example of direct usage\n\n*NOTE: You should not need to use pydantic-core directly; instead, use pydantic, which in turn uses pydantic-core.*\n\n```py\nfrom pydantic_core import SchemaValidator, ValidationError\n\n\nv = SchemaValidator(\n    {\n        'type': 'typed-dict',\n        'fields': {\n            'name': {\n                'type': 'typed-dict-field',\n                'schema': {\n                    'type': 'str',\n                },\n            },\n            'age': {\n                'type': 'typed-dict-field',\n                'schema': {\n                    'type': 'int',\n                    'ge': 18,\n                },\n            },\n            'is_developer': {\n                'type': 'typed-dict-field',\n                'schema': {\n                    'type': 'default',\n                    'schema': {'type': 'bool'},\n                    'default': True,\n                },\n            },\n        },\n    }\n)\n\nr1 = v.validate_python({'name': 'Samuel', 'age': 35})\nassert r1 == {'name': 'Samuel', 'age': 35, 'is_developer': True}\n\n# pydantic-core can also validate JSON directly\nr2 = v.validate_json('{\"name\": \"Samuel\", \"age\": 35}')\nassert r1 == r2\n\ntry:\n    v.validate_python({'name': 'Samuel', 'age': 11})\nexcept ValidationError as e:\n    print(e)\n    \"\"\"\n    1 validation error for model\n    age\n      Input should be greater than or equal to 18\n      [type=greater_than_equal, context={ge: 18}, input_value=11, input_type=int]\n    \"\"\"\n```\n\n## Getting Started\n\n### Prerequisites\n\nYou'll need:\n\n1. **[Rust](https://rustup.rs/)** - Rust stable (or nightly for coverage)\n2. **[uv](https://docs.astral.sh/uv/getting-started/installation/)** - Fast Python package manager (will install Python 3.9+ automatically)\n3. **[git](https://git-scm.com/)** - For version control\n4. **[make](https://www.gnu.org/software/make/)** - For running development commands (or use `nmake` on Windows)\n\n### Quick Start\n\n```bash\n# Clone the repository (or from your fork)\ngit clone git@github.com:pydantic/pydantic-core.git\ncd pydantic-core\n\n# Install all dependencies using uv, setup pre-commit hooks, and build the development version\nmake install\n```\n\nVerify your installation by running:\n\n```bash\nmake\n```\n\nThis runs a full development cycle: formatting, building, linting, and testing\n\n### Development Commands\n\nRun `make help` to see all available commands, or use these common ones:\n\n```bash\nmake build-dev    # to build the package during development\nmake build-prod   # to perform an optimised build for benchmarking\nmake test         # to run the tests\nmake testcov      # to run the tests and generate a coverage report\nmake lint         # to run the linter\nmake format       # to format python and rust code\nmake all          # to run to run build-dev + format + lint + test\n```\n\n### Useful Resources\n\n* [`python/pydantic_core/_pydantic_core.pyi`](./python/pydantic_core/_pydantic_core.pyi) - Python API types\n* [`python/pydantic_core/core_schema.py`](./python/pydantic_core/core_schema.py) - Core schema definitions\n* [`tests/`](./tests) - Comprehensive usage examples\n\n## Profiling\n\nIt's possible to profile the code using the [`flamegraph` utility from `flamegraph-rs`](https://github.com/flamegraph-rs/flamegraph). (Tested on Linux.) You can install this with `cargo install flamegraph`.\n\nRun `make build-profiling` to install a release build with debugging symbols included (needed for profiling).\n\nOnce that is built, you can profile pytest benchmarks with (e.g.):\n\n```bash\nflamegraph -- pytest tests/benchmarks/test_micro_benchmarks.py -k test_list_of_ints_core_py --benchmark-enable\n```\n\nThe `flamegraph` command will produce an interactive SVG at `flamegraph.svg`.\n\n## Releasing\n\nTBC (needs to be integrated into `pydantic` repository release process).\n\n",
        "description_content_type": "text/markdown; charset=UTF-8; variant=GFM",
        "home_page": "https://github.com/pydantic/pydantic",
        "author_email": "Samuel Colvin <s@muelcolvin.com>, Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, David Montague <david@pydantic.dev>, David Hewitt <mail@davidhewitt.dev>, Sydney Runkle <sydneymarierunkle@gmail.com>, Victorien Plot <contact@vctrn.dev>",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 3 - Alpha",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Programming Language :: Python :: Implementation :: GraalPy",
          "Programming Language :: Rust",
          "Framework :: Pydantic",
          "Intended Audience :: Developers",
          "Intended Audience :: Information Technology",
          "Operating System :: POSIX :: Linux",
          "Operating System :: Microsoft :: Windows",
          "Operating System :: MacOS",
          "Typing :: Typed"
        ],
        "requires_dist": [
          "typing-extensions>=4.14.1"
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Funding, https://github.com/sponsors/samuelcolvin",
          "Homepage, https://github.com/pydantic",
          "Source, https://github.com/pydantic/pydantic/tree/main/pydantic-core"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/pydantic_core-2.46.4.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.1",
        "name": "shellingham",
        "version": "1.5.4",
        "summary": "Tool to Detect Surrounding Shell",
        "description": "=============================================\nShellingham: Tool to Detect Surrounding Shell\n=============================================\n\n.. image:: https://img.shields.io/pypi/v/shellingham.svg\n    :target: https://pypi.org/project/shellingham/\n\nShellingham detects what shell the current Python executable is running in.\n\n\nUsage\n=====\n\n.. code-block:: python\n\n    >>> import shellingham\n    >>> shellingham.detect_shell()\n    ('bash', '/bin/bash')\n\n``detect_shell`` pokes around the process's running environment to determine\nwhat shell it is run in. It returns a 2-tuple:\n\n* The shell name, always lowercased.\n* The command used to run the shell.\n\n``ShellDetectionFailure`` is raised if ``detect_shell`` fails to detect the\nsurrounding shell.\n\n\nNotes\n=====\n\n* The shell name is always lowercased.\n* On Windows, the shell name is the name of the executable, minus the file\n  extension.\n\n\nNotes for Application Developers\n================================\n\nRemember, your application's user is not necessarily using a shell.\nShellingham raises ``ShellDetectionFailure`` if there is no shell to detect,\nbut *your application should almost never do this to your user*.\n\nA practical approach to this is to wrap ``detect_shell`` in a try block, and\nprovide a sane default on failure\n\n.. code-block:: python\n\n    try:\n        shell = shellingham.detect_shell()\n    except shellingham.ShellDetectionFailure:\n        shell = provide_default()\n\n\nThere are a few choices for you to choose from.\n\n* The POSIX standard mandates the environment variable ``SHELL`` to refer to\n  \"the user's preferred command language interpreter\". This is always available\n  (even if the user is not in an interactive session), and likely the correct\n  choice to launch an interactive sub-shell with.\n* A command ``sh`` is almost guaranteed to exist, likely at ``/bin/sh``, since\n  several POSIX tools rely on it. This should be suitable if you want to run a\n  (possibly non-interactive) script.\n* All versions of DOS and Windows have an environment variable ``COMSPEC``.\n  This can always be used to launch a usable command prompt (e.g. `cmd.exe` on\n  Windows).\n\nHere's a simple implementation to provide a default shell\n\n.. code-block:: python\n\n    import os\n\n    def provide_default():\n        if os.name == 'posix':\n            return os.environ['SHELL']\n        elif os.name == 'nt':\n            return os.environ['COMSPEC']\n        raise NotImplementedError(f'OS {os.name!r} support not available')\n",
        "description_content_type": "text/x-rst",
        "keywords": [
          "shell"
        ],
        "home_page": "https://github.com/sarugaku/shellingham",
        "author": "Tzu-ping Chung",
        "author_email": "uranusjr@gmail.com",
        "license": "ISC License",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 3 - Alpha",
          "Environment :: Console",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: ISC License (ISCL)",
          "Operating System :: OS Independent",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.7",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Topic :: Software Development :: Libraries :: Python Modules"
        ],
        "requires_python": ">=3.7"
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/shellingham-1.5.4.dist-info",
      "installer": "pip",
      "requested": false
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "httpcore",
        "version": "1.0.9",
        "summary": "A minimal low-level HTTP client.",
        "description": "# HTTP Core\n\n[![Test Suite](https://github.com/encode/httpcore/workflows/Test%20Suite/badge.svg)](https://github.com/encode/httpcore/actions)\n[![Package version](https://badge.fury.io/py/httpcore.svg)](https://pypi.org/project/httpcore/)\n\n> *Do one thing, and do it well.*\n\nThe HTTP Core package provides a minimal low-level HTTP client, which does\none thing only. Sending HTTP requests.\n\nIt does not provide any high level model abstractions over the API,\ndoes not handle redirects, multipart uploads, building authentication headers,\ntransparent HTTP caching, URL parsing, session cookie handling,\ncontent or charset decoding, handling JSON, environment based configuration\ndefaults, or any of that Jazz.\n\nSome things HTTP Core does do:\n\n* Sending HTTP requests.\n* Thread-safe / task-safe connection pooling.\n* HTTP(S) proxy & SOCKS proxy support.\n* Supports HTTP/1.1 and HTTP/2.\n* Provides both sync and async interfaces.\n* Async backend support for `asyncio` and `trio`.\n\n## Requirements\n\nPython 3.8+\n\n## Installation\n\nFor HTTP/1.1 only support, install with:\n\n```shell\n$ pip install httpcore\n```\n\nThere are also a number of optional extras available...\n\n```shell\n$ pip install httpcore['asyncio,trio,http2,socks']\n```\n\n## Sending requests\n\nSend an HTTP request:\n\n```python\nimport httpcore\n\nresponse = httpcore.request(\"GET\", \"https://www.example.com/\")\n\nprint(response)\n# <Response [200]>\nprint(response.status)\n# 200\nprint(response.headers)\n# [(b'Accept-Ranges', b'bytes'), (b'Age', b'557328'), (b'Cache-Control', b'max-age=604800'), ...]\nprint(response.content)\n# b'<!doctype html>\\n<html>\\n<head>\\n<title>Example Domain</title>\\n\\n<meta charset=\"utf-8\"/>\\n ...'\n```\n\nThe top-level `httpcore.request()` function is provided for convenience. In practice whenever you're working with `httpcore` you'll want to use the connection pooling functionality that it provides.\n\n```python\nimport httpcore\n\nhttp = httpcore.ConnectionPool()\nresponse = http.request(\"GET\", \"https://www.example.com/\")\n```\n\nOnce you're ready to get going, [head over to the documentation](https://www.encode.io/httpcore/).\n\n## Motivation\n\nYou *probably* don't want to be using HTTP Core directly. It might make sense if\nyou're writing something like a proxy service in Python, and you just want\nsomething at the lowest possible level, but more typically you'll want to use\na higher level client library, such as `httpx`.\n\nThe motivation for `httpcore` is:\n\n* To provide a reusable low-level client library, that other packages can then build on top of.\n* To provide a *really clear interface split* between the networking code and client logic,\n  so that each is easier to understand and reason about in isolation.\n\n## Dependencies\n\nThe `httpcore` package has the following dependencies...\n\n* `h11`\n* `certifi`\n\nAnd the following optional extras...\n\n* `anyio` - Required by `pip install httpcore['asyncio']`.\n* `trio` - Required by `pip install httpcore['trio']`.\n* `h2` - Required by `pip install httpcore['http2']`.\n* `socksio` - Required by `pip install httpcore['socks']`.\n\n## Versioning\n\nWe use [SEMVER for our versioning policy](https://semver.org/).\n\nFor changes between package versions please see our [project changelog](CHANGELOG.md).\n\nWe recommend pinning your requirements either the most current major version, or a more specific version range:\n\n```python\npip install 'httpcore==1.*'\n```\n# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).\n\n## Version 1.0.9 (April 24th, 2025)\n\n- Resolve https://github.com/advisories/GHSA-vqfr-h8mv-ghfj with h11 dependency update. (#1008)\n\n## Version 1.0.8 (April 11th, 2025)\n\n- Fix `AttributeError` when importing on Python 3.14. (#1005)\n\n## Version 1.0.7 (November 15th, 2024)\n\n- Support `proxy=…` configuration on `ConnectionPool()`. (#974)\n\n## Version 1.0.6 (October 1st, 2024)\n\n- Relax `trio` dependency pinning. (#956)\n- Handle `trio` raising `NotImplementedError` on unsupported platforms. (#955)\n- Handle mapping `ssl.SSLError` to `httpcore.ConnectError`. (#918)\n\n## 1.0.5 (March 27th, 2024)\n\n- Handle `EndOfStream` exception for anyio backend. (#899)\n- Allow trio `0.25.*` series in package dependancies. (#903)\n\n## 1.0.4 (February 21st, 2024)\n\n- Add `target` request extension. (#888)\n- Fix support for connection `Upgrade` and `CONNECT` when some data in the stream has been read. (#882)\n\n## 1.0.3 (February 13th, 2024)\n\n- Fix support for async cancellations. (#880)\n- Fix trace extension when used with socks proxy. (#849)\n- Fix SSL context for connections using the \"wss\" scheme (#869)\n\n## 1.0.2 (November 10th, 2023)\n\n- Fix `float(\"inf\")` timeouts in `Event.wait` function. (#846)\n\n## 1.0.1 (November 3rd, 2023)\n\n- Fix pool timeout to account for the total time spent retrying. (#823)\n- Raise a neater RuntimeError when the correct async deps are not installed. (#826)\n- Add support for synchronous TLS-in-TLS streams. (#840)\n\n## 1.0.0 (October 6th, 2023)\n\nFrom version 1.0 our async support is now optional, as the package has minimal dependencies by default.\n\nFor async support use either `pip install 'httpcore[asyncio]'` or `pip install 'httpcore[trio]'`.\n\nThe project versioning policy is now explicitly governed by SEMVER. See https://semver.org/.\n\n- Async support becomes fully optional. (#809)\n- Add support for Python 3.12. (#807)\n\n## 0.18.0 (September 8th, 2023)\n\n- Add support for HTTPS proxies. (#745, #786)\n- Drop Python 3.7 support. (#727)\n- Handle `sni_hostname` extension with SOCKS proxy. (#774)\n- Handle HTTP/1.1 half-closed connections gracefully. (#641)\n- Change the type of `Extensions` from `Mapping[Str, Any]` to `MutableMapping[Str, Any]`. (#762)\n\n## 0.17.3 (July 5th, 2023)\n\n- Support async cancellations, ensuring that the connection pool is left in a clean state when cancellations occur. (#726)\n- The networking backend interface has [been added to the public API](https://www.encode.io/httpcore/network-backends). Some classes which were previously private implementation detail are now part of the top-level public API. (#699)\n- Graceful handling of HTTP/2 GoAway frames, with requests being transparently retried on a new connection. (#730)\n- Add exceptions when a synchronous `trace callback` is passed to an asynchronous request or an asynchronous `trace callback` is passed to a synchronous request. (#717)\n- Drop Python 3.7 support. (#727)\n\n## 0.17.2 (May 23th, 2023)\n\n- Add `socket_options` argument to `ConnectionPool` and `HTTProxy` classes. (#668)\n- Improve logging with per-module logger names. (#690)\n- Add `sni_hostname` request extension. (#696)\n- Resolve race condition during import of `anyio` package. (#692)\n- Enable TCP_NODELAY for all synchronous sockets. (#651)\n\n## 0.17.1 (May 17th, 2023)\n\n- If 'retries' is set, then allow retries if an SSL handshake error occurs. (#669)\n- Improve correctness of tracebacks on network exceptions, by raising properly chained exceptions. (#678)\n- Prevent connection-hanging behaviour when HTTP/2 connections are closed by a server-sent 'GoAway' frame. (#679)\n- Fix edge-case exception when removing requests from the connection pool. (#680)\n- Fix pool timeout edge-case. (#688)\n\n## 0.17.0 (March 16th, 2023)\n\n- Add DEBUG level logging. (#648)\n- Respect HTTP/2 max concurrent streams when settings updates are sent by server. (#652)\n- Increase the allowable HTTP header size to 100kB. (#647)\n- Add `retries` option to SOCKS proxy classes. (#643)\n\n## 0.16.3 (December 20th, 2022)\n\n- Allow `ws` and `wss` schemes. Allows us to properly support websocket upgrade connections. (#625)\n- Forwarding HTTP proxies use a connection-per-remote-host. Required by some proxy implementations. (#637)\n- Don't raise `RuntimeError` when closing a connection pool with active connections. Removes some error cases when cancellations are used. (#631)\n- Lazy import `anyio`, so that it's no longer a hard dependancy, and isn't imported if unused. (#639)\n\n## 0.16.2 (November 25th, 2022)\n\n- Revert 'Fix async cancellation behaviour', which introduced race conditions. (#627)\n- Raise `RuntimeError` if attempting to us UNIX domain sockets on Windows. (#619)\n\n## 0.16.1 (November 17th, 2022)\n\n- Fix HTTP/1.1 interim informational responses, such as \"100 Continue\". (#605)\n\n## 0.16.0 (October 11th, 2022)\n\n- Support HTTP/1.1 informational responses. (#581)\n- Fix async cancellation behaviour. (#580)\n- Support `h11` 0.14. (#579)\n\n## 0.15.0 (May 17th, 2022)\n\n- Drop Python 3.6 support (#535)\n- Ensure HTTP proxy CONNECT requests include `timeout` configuration. (#506)\n- Switch to explicit `typing.Optional` for type hints. (#513)\n- For `trio` map OSError exceptions to `ConnectError`. (#543)\n\n## 0.14.7 (February 4th, 2022)\n\n- Requests which raise a PoolTimeout need to be removed from the pool queue. (#502)\n- Fix AttributeError that happened when Socks5Connection were terminated. (#501)\n\n## 0.14.6 (February 1st, 2022)\n\n- Fix SOCKS support for `http://` URLs. (#492)\n- Resolve race condition around exceptions during streaming a response. (#491)\n\n## 0.14.5 (January 18th, 2022)\n\n- SOCKS proxy support. (#478)\n- Add proxy_auth argument to HTTPProxy. (#481)\n- Improve error message on 'RemoteProtocolError' exception when server disconnects without sending a response. (#479)\n\n## 0.14.4 (January 5th, 2022)\n\n- Support HTTP/2 on HTTPS tunnelling proxies. (#468)\n- Fix proxy headers missing on HTTP forwarding. (#456)\n- Only instantiate SSL context if required. (#457)\n- More robust HTTP/2 handling. (#253, #439, #440, #441)\n\n## 0.14.3 (November 17th, 2021)\n\n- Fix race condition when removing closed connections from the pool. (#437)\n\n## 0.14.2 (November 16th, 2021)\n\n- Failed connections no longer remain in the pool. (Pull #433)\n\n## 0.14.1 (November 12th, 2021)\n\n- `max_connections` becomes optional. (Pull #429)\n- `certifi` is now included in the install dependancies. (Pull #428)\n- `h2` is now strictly optional. (Pull #428)\n\n## 0.14.0 (November 11th, 2021)\n\nThe 0.14 release is a complete reworking of `httpcore`, comprehensively addressing some underlying issues in the connection pooling, as well as substantially redesigning the API to be more user friendly.\n\nSome of the lower-level API design also makes the components more easily testable in isolation, and the package now has 100% test coverage.\n\nSee [discussion #419](https://github.com/encode/httpcore/discussions/419) for a little more background.\n\nThere's some other neat bits in there too, such as the \"trace\" extension, which gives a hook into inspecting the internal events that occur during the request/response cycle. This extension is needed for the HTTPX cli, in order to...\n\n* Log the point at which the connection is established, and the IP/port on which it is made.\n* Determine if the outgoing request should log as HTTP/1.1 or HTTP/2, rather than having to assume it's HTTP/2 if the --http2 flag was passed. (Which may not actually be true.)\n* Log SSL version info / certificate info.\n\nNote that `curio` support is not currently available in 0.14.0. If you're using `httpcore` with `curio` please get in touch, so we can assess if we ought to prioritize it as a feature or not.\n\n## 0.13.7 (September 13th, 2021)\n\n- Fix broken error messaging when URL scheme is missing, or a non HTTP(S) scheme is used. (Pull #403)\n\n## 0.13.6 (June 15th, 2021)\n\n### Fixed\n\n- Close sockets when read or write timeouts occur. (Pull #365)\n\n## 0.13.5 (June 14th, 2021)\n\n### Fixed\n\n- Resolved niggles with AnyIO EOF behaviours. (Pull #358, #362)\n\n## 0.13.4 (June 9th, 2021)\n\n### Added\n\n- Improved error messaging when URL scheme is missing, or a non HTTP(S) scheme is used. (Pull #354)\n\n### Fixed\n\n- Switched to `anyio` as the default backend implementation when running with `asyncio`. Resolves some awkward [TLS timeout issues](https://github.com/encode/httpx/discussions/1511).\n\n## 0.13.3 (May 6th, 2021)\n\n### Added\n\n- Support HTTP/2 prior knowledge, using `httpcore.SyncConnectionPool(http1=False)`. (Pull #333)\n\n### Fixed\n\n- Handle cases where environment does not provide `select.poll` support. (Pull #331)\n\n## 0.13.2 (April 29th, 2021)\n\n### Added\n\n- Improve error message for specific case of `RemoteProtocolError` where server disconnects without sending a response. (Pull #313)\n\n## 0.13.1 (April 28th, 2021)\n\n### Fixed\n\n- More resiliant testing for closed connections. (Pull #311)\n- Don't raise exceptions on ungraceful connection closes. (Pull #310)\n\n## 0.13.0 (April 21st, 2021)\n\nThe 0.13 release updates the core API in order to match the HTTPX Transport API,\nintroduced in HTTPX 0.18 onwards.\n\nAn example of making requests with the new interface is:\n\n```python\nwith httpcore.SyncConnectionPool() as http:\n    status_code, headers, stream, extensions = http.handle_request(\n        method=b'GET',\n        url=(b'https', b'example.org', 443, b'/'),\n        headers=[(b'host', b'example.org'), (b'user-agent', b'httpcore')]\n        stream=httpcore.ByteStream(b''),\n        extensions={}\n    )\n    body = stream.read()\n    print(status_code, body)\n```\n\n### Changed\n\n- The `.request()` method is now `handle_request()`. (Pull #296)\n- The `.arequest()` method is now `.handle_async_request()`. (Pull #296)\n- The `headers` argument is no longer optional. (Pull #296)\n- The `stream` argument is no longer optional. (Pull #296)\n- The `ext` argument is now named `extensions`, and is no longer optional. (Pull #296)\n- The `\"reason\"` extension keyword is now named `\"reason_phrase\"`. (Pull #296)\n- The `\"reason_phrase\"` and `\"http_version\"` extensions now use byte strings for their values. (Pull #296)\n- The `httpcore.PlainByteStream()` class becomes `httpcore.ByteStream()`. (Pull #296)\n\n### Added\n\n- Streams now support a `.read()` interface. (Pull #296)\n\n### Fixed\n\n- Task cancellation no longer leaks connections from the connection pool. (Pull #305)\n\n## 0.12.3 (December 7th, 2020)\n\n### Fixed\n\n- Abort SSL connections on close rather than waiting for remote EOF when using `asyncio`.  (Pull #167)\n- Fix exception raised in case of connect timeouts when using the `anyio` backend. (Pull #236)\n- Fix `Host` header precedence for `:authority` in HTTP/2. (Pull #241, #243)\n- Handle extra edge case when detecting for socket readability when using `asyncio`. (Pull #242, #244)\n- Fix `asyncio` SSL warning when using proxy tunneling. (Pull #249)\n\n## 0.12.2 (November 20th, 2020)\n\n### Fixed\n\n- Properly wrap connect errors on the asyncio backend. (Pull #235)\n- Fix `ImportError` occurring on Python 3.9 when using the HTTP/1.1 sync client in a multithreaded context. (Pull #237)\n\n## 0.12.1 (November 7th, 2020)\n\n### Added\n\n- Add connect retries. (Pull #221)\n\n### Fixed\n\n- Tweak detection of dropped connections, resolving an issue with open files limits on Linux. (Pull #185)\n- Avoid leaking connections when establishing an HTTP tunnel to a proxy has failed. (Pull #223)\n- Properly wrap OS errors when using `trio`. (Pull #225)\n\n## 0.12.0 (October 6th, 2020)\n\n### Changed\n\n- HTTP header casing is now preserved, rather than always sent in lowercase. (#216 and python-hyper/h11#104)\n\n### Added\n\n- Add Python 3.9 to officially supported versions.\n\n### Fixed\n\n- Gracefully handle a stdlib asyncio bug when a connection is closed while it is in a paused-for-reading state. (#201)\n\n## 0.11.1 (September 28nd, 2020)\n\n### Fixed\n\n- Add await to async semaphore release() coroutine (#197)\n- Drop incorrect curio classifier (#192)\n\n## 0.11.0 (September 22nd, 2020)\n\nThe Transport API with 0.11.0 has a couple of significant changes.\n\nFirstly we've moved changed the request interface in order to allow extensions, which will later enable us to support features\nsuch as trailing headers, HTTP/2 server push, and CONNECT/Upgrade connections.\n\nThe interface changes from:\n\n```python\ndef request(method, url, headers, stream, timeout):\n    return (http_version, status_code, reason, headers, stream)\n```\n\nTo instead including an optional dictionary of extensions on the request and response:\n\n```python\ndef request(method, url, headers, stream, ext):\n    return (status_code, headers, stream, ext)\n```\n\nHaving an open-ended extensions point will allow us to add later support for various optional features, that wouldn't otherwise be supported without these API changes.\n\nIn particular:\n\n* Trailing headers support.\n* HTTP/2 Server Push\n* sendfile.\n* Exposing raw connection on CONNECT, Upgrade, HTTP/2 bi-di streaming.\n* Exposing debug information out of the API, including template name, template context.\n\nCurrently extensions are limited to:\n\n* request: `timeout` - Optional. Timeout dictionary.\n* response: `http_version` - Optional. Include the HTTP version used on the response.\n* response: `reason` - Optional. Include the reason phrase used on the response. Only valid with HTTP/1.*.\n\nSee https://github.com/encode/httpx/issues/1274#issuecomment-694884553 for the history behind this.\n\nSecondly, the async version of `request` is now namespaced as `arequest`.\n\nThis allows concrete transports to support both sync and async implementations on the same class.\n\n### Added\n\n- Add curio support. (Pull #168)\n- Add anyio support, with `backend=\"anyio\"`. (Pull #169)\n\n### Changed\n\n- Update the Transport API to use 'ext' for optional extensions. (Pull #190)\n- Update the Transport API to use `.request` and `.arequest` so implementations can support both sync and async. (Pull #189)\n\n## 0.10.2 (August 20th, 2020)\n\n### Added\n\n- Added Unix Domain Socket support. (Pull #139)\n\n### Fixed\n\n- Always include the port on proxy CONNECT requests. (Pull #154)\n- Fix `max_keepalive_connections` configuration. (Pull #153)\n- Fixes behaviour in HTTP/1.1 where server disconnects can be used to signal the end of the response body. (Pull #164)\n\n## 0.10.1 (August 7th, 2020)\n\n- Include `max_keepalive_connections` on `AsyncHTTPProxy`/`SyncHTTPProxy` classes.\n\n## 0.10.0 (August 7th, 2020)\n\nThe most notable change in the 0.10.0 release is that HTTP/2 support is now fully optional.\n\nUse either `pip install httpcore` for HTTP/1.1 support only, or `pip install httpcore[http2]` for HTTP/1.1 and HTTP/2 support.\n\n### Added\n\n- HTTP/2 support becomes optional. (Pull #121, #130)\n- Add `local_address=...` support. (Pull #100, #134)\n- Add `PlainByteStream`, `IteratorByteStream`, `AsyncIteratorByteStream`. The `AsyncByteSteam` and `SyncByteStream` classes are now pure interface classes. (#133)\n- Add `LocalProtocolError`, `RemoteProtocolError` exceptions. (Pull #129)\n- Add `UnsupportedProtocol` exception. (Pull #128)\n- Add `.get_connection_info()` method. (Pull #102, #137)\n- Add better TRACE logs. (Pull #101)\n\n### Changed\n\n- `max_keepalive` is deprecated in favour of `max_keepalive_connections`. (Pull #140)\n\n### Fixed\n\n- Improve handling of server disconnects. (Pull #112)\n\n## 0.9.1 (May 27th, 2020)\n\n### Fixed\n\n- Proper host resolution for sync case, including IPv6 support. (Pull #97)\n- Close outstanding connections when connection pool is closed. (Pull #98)\n\n## 0.9.0 (May 21th, 2020)\n\n### Changed\n\n- URL port becomes an `Optional[int]` instead of `int`. (Pull #92)\n\n### Fixed\n\n- Honor HTTP/2 max concurrent streams settings. (Pull #89, #90)\n- Remove incorrect debug log. (Pull #83)\n\n## 0.8.4 (May 11th, 2020)\n\n### Added\n\n- Logging via HTTPCORE_LOG_LEVEL and HTTPX_LOG_LEVEL environment variables\nand TRACE level logging. (Pull #79)\n\n### Fixed\n\n- Reuse of connections on HTTP/2 in close concurrency situations. (Pull #81)\n\n## 0.8.3 (May 6rd, 2020)\n\n### Fixed\n\n- Include `Host` and `Accept` headers on proxy \"CONNECT\" requests.\n- De-duplicate any headers also contained in proxy_headers.\n- HTTP/2 flag not being passed down to proxy connections.\n\n## 0.8.2 (May 3rd, 2020)\n\n### Fixed\n\n- Fix connections using proxy forwarding requests not being added to the\nconnection pool properly. (Pull #70)\n\n## 0.8.1 (April 30th, 2020)\n\n### Changed\n\n- Allow inherintance of both `httpcore.AsyncByteStream`, `httpcore.SyncByteStream` without type conflicts.\n\n## 0.8.0 (April 30th, 2020)\n\n### Fixed\n\n- Fixed tunnel proxy support.\n\n### Added\n\n- New `TimeoutException` base class.\n\n## 0.7.0 (March 5th, 2020)\n\n- First integration with HTTPX.\n",
        "description_content_type": "text/markdown",
        "author_email": "Tom Christie <tom@tomchristie.com>",
        "license_expression": "BSD-3-Clause",
        "license_file": [
          "LICENSE.md"
        ],
        "classifier": [
          "Development Status :: 3 - Alpha",
          "Environment :: Web Environment",
          "Framework :: AsyncIO",
          "Framework :: Trio",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: BSD License",
          "Operating System :: OS Independent",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Topic :: Internet :: WWW/HTTP"
        ],
        "requires_dist": [
          "certifi",
          "h11>=0.16",
          "anyio<5.0,>=4.0; extra == 'asyncio'",
          "h2<5,>=3; extra == 'http2'",
          "socksio==1.*; extra == 'socks'",
          "trio<1.0,>=0.22.0; extra == 'trio'"
        ],
        "requires_python": ">=3.8",
        "project_url": [
          "Documentation, https://www.encode.io/httpcore",
          "Homepage, https://www.encode.io/httpcore/",
          "Source, https://github.com/encode/httpcore"
        ],
        "provides_extra": [
          "asyncio",
          "http2",
          "socks",
          "trio"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.1",
        "name": "python-dateutil",
        "version": "2.9.0.post0",
        "summary": "Extensions to the standard Python datetime module",
        "description": "dateutil - powerful extensions to datetime\n==========================================\n\n|pypi| |support| |licence|\n\n|gitter| |readthedocs|\n\n|travis| |appveyor| |pipelines| |coverage|\n\n.. |pypi| image:: https://img.shields.io/pypi/v/python-dateutil.svg?style=flat-square\n    :target: https://pypi.org/project/python-dateutil/\n    :alt: pypi version\n\n.. |support| image:: https://img.shields.io/pypi/pyversions/python-dateutil.svg?style=flat-square\n    :target: https://pypi.org/project/python-dateutil/\n    :alt: supported Python version\n\n.. |travis| image:: https://img.shields.io/travis/dateutil/dateutil/master.svg?style=flat-square&label=Travis%20Build\n    :target: https://travis-ci.org/dateutil/dateutil\n    :alt: travis build status\n\n.. |appveyor| image:: https://img.shields.io/appveyor/ci/dateutil/dateutil/master.svg?style=flat-square&logo=appveyor\n    :target: https://ci.appveyor.com/project/dateutil/dateutil\n    :alt: appveyor build status\n\n.. |pipelines| image:: https://dev.azure.com/pythondateutilazure/dateutil/_apis/build/status/dateutil.dateutil?branchName=master\n    :target: https://dev.azure.com/pythondateutilazure/dateutil/_build/latest?definitionId=1&branchName=master\n    :alt: azure pipelines build status\n\n.. |coverage| image:: https://codecov.io/gh/dateutil/dateutil/branch/master/graphs/badge.svg?branch=master\n    :target: https://codecov.io/gh/dateutil/dateutil?branch=master\n    :alt: Code coverage\n\n.. |gitter| image:: https://badges.gitter.im/dateutil/dateutil.svg\n   :alt: Join the chat at https://gitter.im/dateutil/dateutil\n   :target: https://gitter.im/dateutil/dateutil\n\n.. |licence| image:: https://img.shields.io/pypi/l/python-dateutil.svg?style=flat-square\n    :target: https://pypi.org/project/python-dateutil/\n    :alt: licence\n\n.. |readthedocs| image:: https://img.shields.io/readthedocs/dateutil/latest.svg?style=flat-square&label=Read%20the%20Docs\n   :alt: Read the documentation at https://dateutil.readthedocs.io/en/latest/\n   :target: https://dateutil.readthedocs.io/en/latest/\n\nThe `dateutil` module provides powerful extensions to\nthe standard `datetime` module, available in Python.\n\nInstallation\n============\n`dateutil` can be installed from PyPI using `pip` (note that the package name is\ndifferent from the importable name)::\n\n    pip install python-dateutil\n\nDownload\n========\ndateutil is available on PyPI\nhttps://pypi.org/project/python-dateutil/\n\nThe documentation is hosted at:\nhttps://dateutil.readthedocs.io/en/stable/\n\nCode\n====\nThe code and issue tracker are hosted on GitHub:\nhttps://github.com/dateutil/dateutil/\n\nFeatures\n========\n\n* Computing of relative deltas (next month, next year,\n  next Monday, last week of month, etc);\n* Computing of relative deltas between two given\n  date and/or datetime objects;\n* Computing of dates based on very flexible recurrence rules,\n  using a superset of the `iCalendar <https://www.ietf.org/rfc/rfc2445.txt>`_\n  specification. Parsing of RFC strings is supported as well.\n* Generic parsing of dates in almost any string format;\n* Timezone (tzinfo) implementations for tzfile(5) format\n  files (/etc/localtime, /usr/share/zoneinfo, etc), TZ\n  environment string (in all known formats), iCalendar\n  format files, given ranges (with help from relative deltas),\n  local machine timezone, fixed offset timezone, UTC timezone,\n  and Windows registry-based time zones.\n* Internal up-to-date world timezone information based on\n  Olson's database.\n* Computing of Easter Sunday dates for any given year,\n  using Western, Orthodox or Julian algorithms;\n* A comprehensive test suite.\n\nQuick example\n=============\nHere's a snapshot, just to give an idea about the power of the\npackage. For more examples, look at the documentation.\n\nSuppose you want to know how much time is left, in\nyears/months/days/etc, before the next easter happening on a\nyear with a Friday 13th in August, and you want to get today's\ndate out of the \"date\" unix system command. Here is the code:\n\n.. code-block:: python3\n\n    >>> from dateutil.relativedelta import *\n    >>> from dateutil.easter import *\n    >>> from dateutil.rrule import *\n    >>> from dateutil.parser import *\n    >>> from datetime import *\n    >>> now = parse(\"Sat Oct 11 17:13:46 UTC 2003\")\n    >>> today = now.date()\n    >>> year = rrule(YEARLY,dtstart=now,bymonth=8,bymonthday=13,byweekday=FR)[0].year\n    >>> rdelta = relativedelta(easter(year), today)\n    >>> print(\"Today is: %s\" % today)\n    Today is: 2003-10-11\n    >>> print(\"Year with next Aug 13th on a Friday is: %s\" % year)\n    Year with next Aug 13th on a Friday is: 2004\n    >>> print(\"How far is the Easter of that year: %s\" % rdelta)\n    How far is the Easter of that year: relativedelta(months=+6)\n    >>> print(\"And the Easter of that year is: %s\" % (today+rdelta))\n    And the Easter of that year is: 2004-04-11\n\nBeing exactly 6 months ahead was **really** a coincidence :)\n\nContributing\n============\n\nWe welcome many types of contributions - bug reports, pull requests (code, infrastructure or documentation fixes). For more information about how to contribute to the project, see the ``CONTRIBUTING.md`` file in the repository.\n\n\nAuthor\n======\nThe dateutil module was written by Gustavo Niemeyer <gustavo@niemeyer.net>\nin 2003.\n\nIt is maintained by:\n\n* Gustavo Niemeyer <gustavo@niemeyer.net> 2003-2011\n* Tomi Pieviläinen <tomi.pievilainen@iki.fi> 2012-2014\n* Yaron de Leeuw <me@jarondl.net> 2014-2016\n* Paul Ganssle <paul@ganssle.io> 2015-\n\nStarting with version 2.4.1 and running until 2.8.2, all source and binary\ndistributions will be signed by a PGP key that has, at the very least, been\nsigned by the key which made the previous release. A table of release signing\nkeys can be found below:\n\n===========  ============================\nReleases     Signing key fingerprint\n===========  ============================\n2.4.1-2.8.2  `6B49 ACBA DCF6 BD1C A206 67AB CD54 FCE3 D964 BEFB`_\n===========  ============================\n\nNew releases *may* have signed tags, but binary and source distributions\nuploaded to PyPI will no longer have GPG signatures attached.\n\nContact\n=======\nOur mailing list is available at `dateutil@python.org <https://mail.python.org/mailman/listinfo/dateutil>`_. As it is hosted by the PSF, it is subject to the `PSF code of\nconduct <https://www.python.org/psf/conduct/>`_.\n\nLicense\n=======\n\nAll contributions after December 1, 2017 released under dual license - either `Apache 2.0 License <https://www.apache.org/licenses/LICENSE-2.0>`_ or the `BSD 3-Clause License <https://opensource.org/licenses/BSD-3-Clause>`_. Contributions before December 1, 2017 - except those those explicitly relicensed - are released only under the BSD 3-Clause License.\n\n\n.. _6B49 ACBA DCF6 BD1C A206 67AB CD54 FCE3 D964 BEFB:\n   https://pgp.mit.edu/pks/lookup?op=vindex&search=0xCD54FCE3D964BEFB\n",
        "description_content_type": "text/x-rst",
        "home_page": "https://github.com/dateutil/dateutil",
        "author": "Gustavo Niemeyer",
        "author_email": "gustavo@niemeyer.net",
        "maintainer": "Paul Ganssle",
        "maintainer_email": "dateutil@python.org",
        "license": "Dual License",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: BSD License",
          "License :: OSI Approved :: Apache Software License",
          "Programming Language :: Python",
          "Programming Language :: Python :: 2",
          "Programming Language :: Python :: 2.7",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.3",
          "Programming Language :: Python :: 3.4",
          "Programming Language :: Python :: 3.5",
          "Programming Language :: Python :: 3.6",
          "Programming Language :: Python :: 3.7",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Topic :: Software Development :: Libraries"
        ],
        "requires_dist": [
          "six >=1.5"
        ],
        "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7",
        "project_url": [
          "Documentation, https://dateutil.readthedocs.io/en/stable/",
          "Source, https://github.com/dateutil/dateutil"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/python_dateutil-2.9.0.post0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.1",
        "name": "six",
        "version": "1.17.0",
        "summary": "Python 2 and 3 compatibility utilities",
        "description": ".. image:: https://img.shields.io/pypi/v/six.svg\n   :target: https://pypi.org/project/six/\n   :alt: six on PyPI\n\n.. image:: https://readthedocs.org/projects/six/badge/?version=latest\n   :target: https://six.readthedocs.io/\n   :alt: six's documentation on Read the Docs\n\n.. image:: https://img.shields.io/badge/license-MIT-green.svg\n   :target: https://github.com/benjaminp/six/blob/master/LICENSE\n   :alt: MIT License badge\n\nSix is a Python 2 and 3 compatibility library.  It provides utility functions\nfor smoothing over the differences between the Python versions with the goal of\nwriting Python code that is compatible on both Python versions.  See the\ndocumentation for more information on what is provided.\n\nSix supports Python 2.7 and 3.3+.  It is contained in only one Python\nfile, so it can be easily copied into your project. (The copyright and license\nnotice must be retained.)\n\nOnline documentation is at https://six.readthedocs.io/.\n\nBugs can be reported to https://github.com/benjaminp/six.  The code can also\nbe found there.\n",
        "home_page": "https://github.com/benjaminp/six",
        "author": "Benjamin Peterson",
        "author_email": "benjamin@python.org",
        "license": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Programming Language :: Python :: 2",
          "Programming Language :: Python :: 3",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: MIT License",
          "Topic :: Software Development :: Libraries",
          "Topic :: Utilities"
        ],
        "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/six-1.17.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "physique-checkin-cli",
        "version": "0.1.0",
        "summary": "Append-only, local check-in event store for the physique coach.",
        "requires_dist": [
          "jsonschema>=4.23",
          "pydantic>=2",
          "typer>=0.12",
          "pytest>=8; extra == \"test\""
        ],
        "requires_python": ">=3.12",
        "provides_extra": [
          "test"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/physique_checkin_cli-0.1.0.dist-info",
      "direct_url": {
        "url": "file:///home/cube/projects/richard/traning%20coach/.omo/evidence/task26/task26-clarification-root-final-st_01a013d9/artifacts/physique_checkin_cli-0.1.0-py3-none-any.whl",
        "archive_info": {
          "hashes": {
            "sha256": "aba7b92da1de6b9f9e071f8734026683c7bcdfd1abaa754ab2c8b6b4d5825fd7"
          },
          "hash": "sha256=aba7b92da1de6b9f9e071f8734026683c7bcdfd1abaa754ab2c8b6b4d5825fd7"
        }
      },
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.1",
        "name": "mdurl",
        "version": "0.1.2",
        "summary": "Markdown URL utilities",
        "description": "# mdurl\n\n[![Build Status](https://github.com/executablebooks/mdurl/workflows/Tests/badge.svg?branch=master)](https://github.com/executablebooks/mdurl/actions?query=workflow%3ATests+branch%3Amaster+event%3Apush)\n[![codecov.io](https://codecov.io/gh/executablebooks/mdurl/branch/master/graph/badge.svg)](https://codecov.io/gh/executablebooks/mdurl)\n[![PyPI version](https://img.shields.io/pypi/v/mdurl)](https://pypi.org/project/mdurl)\n\nThis is a Python port of the JavaScript [mdurl](https://www.npmjs.com/package/mdurl) package.\nSee the [upstream README.md file](https://github.com/markdown-it/mdurl/blob/master/README.md) for API documentation.\n\n",
        "description_content_type": "text/markdown",
        "keywords": [
          "markdown",
          "commonmark"
        ],
        "author_email": "Taneli Hukkinen <hukkin@users.noreply.github.com>",
        "classifier": [
          "License :: OSI Approved :: MIT License",
          "Operating System :: MacOS",
          "Operating System :: Microsoft :: Windows",
          "Operating System :: POSIX :: Linux",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.7",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Typing :: Typed"
        ],
        "requires_python": ">=3.7",
        "project_url": [
          "Homepage, https://github.com/executablebooks/mdurl"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "rpds-py",
        "version": "0.30.0",
        "summary": "Python bindings to Rust's persistent data structures (rpds)",
        "description": "===========\n``rpds.py``\n===========\n\n|PyPI| |Pythons| |CI|\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/rpds-py.svg\n  :alt: PyPI version\n  :target: https://pypi.org/project/rpds-py/\n\n.. |Pythons| image:: https://img.shields.io/pypi/pyversions/rpds-py.svg\n  :alt: Supported Python versions\n  :target: https://pypi.org/project/rpds-py/\n\n.. |CI| image:: https://github.com/crate-py/rpds/workflows/CI/badge.svg\n  :alt: Build status\n  :target: https://github.com/crate-py/rpds/actions?query=workflow%3ACI\n\n.. |ReadTheDocs| image:: https://readthedocs.org/projects/referencing/badge/?version=stable&style=flat\n   :alt: ReadTheDocs status\n   :target: https://referencing.readthedocs.io/en/stable/\n\n\nPython bindings to the `Rust rpds crate <https://docs.rs/rpds/>`_ for persistent data structures.\n\nWhat's here is quite minimal (in transparency, it was written initially to support replacing ``pyrsistent`` in the `referencing library <https://github.com/python-jsonschema/referencing>`_).\nIf you see something missing (which is very likely), a PR is definitely welcome to add it.\n\nInstallation\n------------\n\nThe distribution on PyPI is named ``rpds.py`` (equivalently ``rpds-py``), and thus can be installed via e.g.:\n\n.. code:: sh\n\n    $ pip install rpds-py\n\nNote that if you install ``rpds-py`` from source, you will need a Rust toolchain installed, as it is a build-time dependency.\nAn example of how to do so in a ``Dockerfile`` can be found `here <https://github.com/bowtie-json-schema/bowtie/blob/e77fd93598cb6e7dc1b8b1f53c00e5aa410c201a/implementations/python-jsonschema/Dockerfile#L1-L8>`_.\n\nIf you believe you are on a common platform which should have wheels built (i.e. and not need to compile from source), feel free to file an issue or pull request modifying the GitHub action used here to build wheels via ``maturin``.\n\nUsage\n-----\n\nMethods in general are named similarly to their ``rpds`` counterparts (rather than ``pyrsistent``\\ 's conventions, though probably a full drop-in ``pyrsistent``\\ -compatible wrapper module is a good addition at some point).\n\n.. code:: python\n\n    >>> from rpds import HashTrieMap, HashTrieSet, List\n\n    >>> m = HashTrieMap({\"foo\": \"bar\", \"baz\": \"quux\"})\n    >>> m.insert(\"spam\", 37) == HashTrieMap({\"foo\": \"bar\", \"baz\": \"quux\", \"spam\": 37})\n    True\n    >>> m.remove(\"foo\") == HashTrieMap({\"baz\": \"quux\"})\n    True\n\n    >>> s = HashTrieSet({\"foo\", \"bar\", \"baz\", \"quux\"})\n    >>> s.insert(\"spam\") == HashTrieSet({\"foo\", \"bar\", \"baz\", \"quux\", \"spam\"})\n    True\n    >>> s.remove(\"foo\") == HashTrieSet({\"bar\", \"baz\", \"quux\"})\n    True\n\n    >>> L = List([1, 3, 5])\n    >>> L.push_front(-1) == List([-1, 1, 3, 5])\n    True\n    >>> L.rest == List([3, 5])\n    True\n\n",
        "description_content_type": "text/x-rst; charset=UTF-8",
        "keywords": [
          "data structures",
          "rust",
          "persistent"
        ],
        "author_email": "Julian Berman <Julian+rpds@GrayVines.com>",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 3 - Alpha",
          "Intended Audience :: Developers",
          "Operating System :: OS Independent",
          "Programming Language :: Rust",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy"
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Documentation, https://rpds.readthedocs.io/",
          "Homepage, https://github.com/crate-py/rpds",
          "Issues, https://github.com/crate-py/rpds/issues/",
          "Funding, https://github.com/sponsors/Julian",
          "Tidelift, https://tidelift.com/subscription/pkg/pypi-rpds-py?utm_source=pypi-rpds-py&utm_medium=referral&utm_campaign=pypi-link",
          "Source, https://github.com/crate-py/rpds",
          "Upstream, https://github.com/orium/rpds"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/rpds_py-0.30.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.1",
        "name": "socksio",
        "version": "1.0.0",
        "summary": "Sans-I/O implementation of SOCKS4, SOCKS4A, and SOCKS5.",
        "description": "# SOCKSIO\n\n[![Build Status](https://travis-ci.org/sethmlarson/socksio.svg?branch=master)](https://travis-ci.org/sethmlarson/socksio)\n[![codecov](https://codecov.io/gh/sethmlarson/socksio/branch/master/graph/badge.svg)](https://codecov.io/gh/sethmlarson/socksio)\n[![Supported Python Versions](https://img.shields.io/pypi/pyversions/socksio.svg)](https://pypi.org/project/socksio)\n[![PyPI](https://img.shields.io/pypi/v/socksio.svg)](https://pypi.org/project/socksio)\n\nClient-side sans-I/O SOCKS proxy implementation.\nSupports SOCKS4, SOCKS4A, and SOCKS5.\n\n`socksio` is a sans-I/O library similar to\n[`h11`](https://github.com/python-hyper/h11) or\n[`h2`](https://github.com/python-hyper/hyper-h2/), this means the library itself\ndoes not handle the actual sending of the bytes through the network, it only\ndeals with the implementation details of the SOCKS protocols so you can use\nit in any I/O library you want.\n\n## Current status: stable\n\nFeatures not yet implemented:\n\n- SOCKS5 GSS-API authentication.\n- SOCKS5 UDP associate requests.\n\n## Usage\n\nTL;DR check the [examples directory](examples/).\n\nBeing sans-I/O means that in order to test `socksio` you need an I/O library.\nAnd the most basic I/O is, of course, the standard library's `socket` module.\n\nYou'll need to know ahead of time the type of SOCKS proxy you want to connect\nto. Assuming we have a SOCKS4 proxy running in our machine on port 8080, we\nwill first create a connection to it:\n\n```python\nimport socket\n\nsock = socket.create_connection((\"localhost\", 8080))\n```\n\n`socksio` exposes modules for SOCKS4, SOCKS4A and SOCKS5, each of them includes\na `Connection` class:\n\n```python\nfrom socksio import socks4\n\n# The SOCKS4 protocol requires a `user_id` to be supplied.\nconn = socks4.SOCKS4Connection(user_id=b\"socksio\")\n```\n\nSince `socksio` is a sans-I/O library, we will use the socket to send and\nreceive data to our SOCKS4 proxy. The raw data, however, will be created and\nparsed by our `SOCKS4Connection`.\n\nWe need to tell our connection we want to make a request to the proxy. We do\nthat by first creating a request object.\n\nIn SOCKS4 we only need to send a command along with an IP address and port.\n`socksio` exposes the different types of commands as enumerables and a\nconvenience `from_address` class method in the request classes to create a\nvalid request object:\n\n```python\n# SOCKS4 does not allow domain names, below is an IP for google.com\nrequest = socks4.SOCKS4Request.from_address(\n    socks4.SOCKS4Command.CONNECT, (\"216.58.204.78\", 80))\n```\n\n`from_address` methods are available on all request classes in `socksio`, they\naccept addresses as tuples of `(address, port)` as well as string `address:port`.\n\nNow we ask the connection to send our request:\n\n```python\nconn.send(request)\n```\n\nThe `SOCKS4Connection` will then compose the necessary `bytes` in the proper\nformat for us to send to our proxy:\n\n```python\ndata = conn.data_to_send()\nsock.sendall(data)\n```\n\nIf all goes well the proxy will have sent reply, we just need to read from the\nsocket and pass the data to the `SOCKS4Connection`:\n\n```python\ndata = sock.recv(1024)\nevent = conn.receive_data(data)\n```\n\nThe connection will parse the data and return an event from it, in this case, a\n`SOCKS4Reply` that includes attributes for the fields in the SOCKS reply:\n\n```python\nif event.reply_code != socks4.SOCKS4ReplyCode.REQUEST_GRANTED:\n    raise Exception(\n        \"Server could not connect to remote host: {}\".format(event.reply_code)\n    )\n```\n\nIf all went well the connection has been established correctly and we can\nstart sending our request directly to the proxy:\n\n```python\nsock.sendall(b\"GET / HTTP/1.1\\r\\nhost: google.com\\r\\n\\r\\n\")\ndata = receive_data(sock)\nprint(data)\n# b'HTTP/1.1 301 Moved Permanently\\r\\nLocation: http://www.google.com/...`\n```\n\nThe same methodology is used for all protocols, check out the\n[examples directory](https://github.com/sethmlarson/socksio/tree/master/examples/)\nfor more information.\n\n## Development\n\nInstall the test requirements with `pip install -r test-requirements.txt`.\n\nInstall the project in pseudo-editable mode with `flit install -s`.\n\nTests can be ran directly invoking `pytest`.\n\nThis project uses [`nox`](https://nox.thea.codes/en/stable/) to automate\ntesting and linting tasks. `nox` is installed as part of the test requirements.\nInvoking `nox` will run all sessions, but you may also run only some them, for\nexample `nox -s lint` will only run the linting session.\n\nIn order to test against a live proxy server a Docker setup is provided based\non the [`Dante`](https://www.inet.no/dante/) SOCKS server.\n\nA container will start `danted` listening on port 1080. The docker-compose.yml\nwill start the container and map the ports appropriately. To start the container\nin the background:\n\n```\ndocker-compose -f docker/docker-compose.yml up -d\n```\n\nTo stop it:\n\n```\ndocker-compose -f docker/docker-compose.yml down\n```\n\nAlternatively, remove the `-d` flag to run the containers in the foreground.\n\n## Reference documents\n\nEach implementation follows the documents as listed below:\n\n- SOCKS4: https://www.openssh.com/txt/socks4.protocol\n- SOCKS4A: https://www.openssh.com/txt/socks4a.protocol\n- SOCKS5: https://www.ietf.org/rfc/rfc1928.txt\n- SOCKS5 username/password authentication: https://www.ietf.org/rfc/rfc1929.txt\n- SOCKS5 GSS-API authentication: https://www.ietf.org/rfc/rfc1961.txt\n\n## License\n\nMIT\n\n",
        "description_content_type": "text/markdown",
        "home_page": "https://github.com/sethmlarson/socksio",
        "author": "Seth Michael Larson",
        "author_email": "sethmichaellarson@gmail.com",
        "license": "UNKNOWN",
        "classifier": [
          "License :: OSI Approved :: MIT License",
          "Programming Language :: Python :: 3.6",
          "Programming Language :: Python :: 3.7",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3 :: Only",
          "Topic :: Internet :: Proxy Servers"
        ],
        "requires_python": ">=3.6"
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/socksio-1.0.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "aiosignal",
        "version": "1.4.0",
        "dynamic": [
          "license-file"
        ],
        "summary": "aiosignal: a list of registered asynchronous callbacks",
        "description": "=========\naiosignal\n=========\n\n.. image:: https://github.com/aio-libs/aiosignal/workflows/CI/badge.svg\n   :target: https://github.com/aio-libs/aiosignal/actions?query=workflow%3ACI\n   :alt: GitHub status for master branch\n\n.. image:: https://codecov.io/gh/aio-libs/aiosignal/branch/master/graph/badge.svg?flag=pytest\n   :target: https://codecov.io/gh/aio-libs/aiosignal?flags[0]=pytest\n   :alt: codecov.io status for master branch\n\n.. image:: https://badge.fury.io/py/aiosignal.svg\n   :target: https://pypi.org/project/aiosignal\n   :alt: Latest PyPI package version\n\n.. image:: https://readthedocs.org/projects/aiosignal/badge/?version=latest\n   :target: https://aiosignal.readthedocs.io/\n   :alt: Latest Read The Docs\n\n.. image:: https://img.shields.io/discourse/topics?server=https%3A%2F%2Faio-libs.discourse.group%2F\n   :target: https://aio-libs.discourse.group/\n   :alt: Discourse group for io-libs\n\n.. image:: https://badges.gitter.im/Join%20Chat.svg\n   :target: https://gitter.im/aio-libs/Lobby\n   :alt: Chat on Gitter\n\nIntroduction\n============\n\nA project to manage callbacks in `asyncio` projects.\n\n``Signal`` is a list of registered asynchronous callbacks.\n\nThe signal's life-cycle has two stages: after creation its content\ncould be filled by using standard list operations: ``sig.append()``\netc.\n\nAfter you call ``sig.freeze()`` the signal is *frozen*: adding, removing\nand dropping callbacks is forbidden.\n\nThe only available operation is calling the previously registered\ncallbacks by using ``await sig.send(data)``.\n\nFor concrete usage examples see the `Signals\n<https://docs.aiohttp.org/en/stable/web_advanced.html#aiohttp-web-signals>\nsection of the `Web Server Advanced\n<https://docs.aiohttp.org/en/stable/web_advanced.html>` chapter of the `aiohttp\ndocumentation`_.\n\n\nInstallation\n------------\n\n::\n\n   $ pip install aiosignal\n\n\nDocumentation\n=============\n\nhttps://aiosignal.readthedocs.io/\n\nLicense\n=======\n\n``aiosignal`` is offered under the Apache 2 license.\n\nSource code\n===========\n\nThe project is hosted on GitHub_\n\nPlease file an issue in the `bug tracker\n<https://github.com/aio-libs/aiosignal/issues>`_ if you have found a bug\nor have some suggestions to improve the library.\n\n.. _GitHub: https://github.com/aio-libs/aiosignal\n.. _aiohttp documentation: https://docs.aiohttp.org/\n",
        "description_content_type": "text/x-rst",
        "home_page": "https://github.com/aio-libs/aiosignal",
        "maintainer": "aiohttp team <team@aiohttp.org>",
        "maintainer_email": "team@aiohttp.org",
        "license": "Apache 2.0",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "License :: OSI Approved :: Apache Software License",
          "Intended Audience :: Developers",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Development Status :: 5 - Production/Stable",
          "Operating System :: POSIX",
          "Operating System :: MacOS :: MacOS X",
          "Operating System :: Microsoft :: Windows",
          "Framework :: AsyncIO"
        ],
        "requires_dist": [
          "frozenlist>=1.1.0",
          "typing-extensions>=4.2; python_version < \"3.13\""
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Chat: Gitter, https://gitter.im/aio-libs/Lobby",
          "CI: GitHub Actions, https://github.com/aio-libs/aiosignal/actions",
          "Coverage: codecov, https://codecov.io/github/aio-libs/aiosignal",
          "Docs: RTD, https://docs.aiosignal.org",
          "GitHub: issues, https://github.com/aio-libs/aiosignal/issues",
          "GitHub: repo, https://github.com/aio-libs/aiosignal"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/aiosignal-1.4.0.dist-info",
      "installer": "pip",
      "requested": false
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "frozenlist",
        "version": "1.8.0",
        "dynamic": [
          "license-file"
        ],
        "summary": "A list-like structure which implements collections.abc.MutableSequence",
        "description": "frozenlist\n==========\n\n.. image:: https://github.com/aio-libs/frozenlist/workflows/CI/badge.svg\n   :target: https://github.com/aio-libs/frozenlist/actions\n   :alt: GitHub status for master branch\n\n.. image:: https://codecov.io/gh/aio-libs/frozenlist/branch/master/graph/badge.svg?flag=pytest\n   :target: https://codecov.io/gh/aio-libs/frozenlist?flags[]=pytest\n   :alt: codecov.io status for master branch\n\n.. image:: https://img.shields.io/pypi/v/frozenlist.svg?logo=Python&logoColor=white\n   :target: https://pypi.org/project/frozenlist\n   :alt: frozenlist @ PyPI\n\n.. image:: https://readthedocs.org/projects/frozenlist/badge/?version=latest\n   :target: https://frozenlist.aio-libs.org\n   :alt: Read The Docs build status badge\n\n.. image:: https://img.shields.io/matrix/aio-libs:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat\n   :target: https://matrix.to/#/%23aio-libs:matrix.org\n   :alt: Matrix Room — #aio-libs:matrix.org\n\n.. image:: https://img.shields.io/matrix/aio-libs-space:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs-space%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat\n   :target: https://matrix.to/#/%23aio-libs-space:matrix.org\n   :alt: Matrix Space — #aio-libs-space:matrix.org\n\nIntroduction\n------------\n\n``frozenlist.FrozenList`` is a list-like structure which implements\n``collections.abc.MutableSequence``. The list is *mutable* until ``FrozenList.freeze``\nis called, after which list modifications raise ``RuntimeError``:\n\n\n>>> from frozenlist import FrozenList\n>>> fl = FrozenList([17, 42])\n>>> fl.append('spam')\n>>> fl.append('Vikings')\n>>> fl\n<FrozenList(frozen=False, [17, 42, 'spam', 'Vikings'])>\n>>> fl.freeze()\n>>> fl\n<FrozenList(frozen=True, [17, 42, 'spam', 'Vikings'])>\n>>> fl.frozen\nTrue\n>>> fl.append(\"Monty\")\nTraceback (most recent call last):\n  File \"<stdin>\", line 1, in <module>\n  File \"frozenlist/_frozenlist.pyx\", line 97, in frozenlist._frozenlist.FrozenList.append\n    self._check_frozen()\n  File \"frozenlist/_frozenlist.pyx\", line 19, in frozenlist._frozenlist.FrozenList._check_frozen\n    raise RuntimeError(\"Cannot modify frozen list.\")\nRuntimeError: Cannot modify frozen list.\n\n\nFrozenList is also hashable, but only when frozen. Otherwise it also throws a RuntimeError:\n\n\n>>> fl = FrozenList([17, 42, 'spam'])\n>>> hash(fl)\nTraceback (most recent call last):\n  File \"<stdin>\", line 1, in <module>\n  File \"frozenlist/_frozenlist.pyx\", line 111, in frozenlist._frozenlist.FrozenList.__hash__\n    raise RuntimeError(\"Cannot hash unfrozen list.\")\nRuntimeError: Cannot hash unfrozen list.\n>>> fl.freeze()\n>>> hash(fl)\n3713081631934410656\n>>> dictionary = {fl: 'Vikings'} # frozen fl can be a dict key\n>>> dictionary\n{<FrozenList(frozen=True, [1, 2])>: 'Vikings'}\n\n\nInstallation\n------------\n\n::\n\n   $ pip install frozenlist\n\n\nDocumentation\n-------------\n\nhttps://frozenlist.aio-libs.org\n\nCommunication channels\n----------------------\n\nWe have a *Matrix Space* `#aio-libs-space:matrix.org\n<https://matrix.to/#/%23aio-libs-space:matrix.org>`_ which is\nalso accessible via Gitter.\n\nLicense\n-------\n\n``frozenlist`` is offered under the Apache 2 license.\n\nSource code\n-----------\n\nThe project is hosted on GitHub_\n\nPlease file an issue in the `bug tracker\n<https://github.com/aio-libs/frozenlist/issues>`_ if you have found a bug\nor have some suggestions to improve the library.\n\n.. _GitHub: https://github.com/aio-libs/frozenlist\n\n=========\nChangelog\n=========\n\n..\n    You should *NOT* be adding new change log entries to this file, this\n    file is managed by towncrier. You *may* edit previous change logs to\n    fix problems like typo corrections or such.\n    To add a new change log entry, please see\n    https://pip.pypa.io/en/latest/development/contributing/#news-entries\n    we named the news folder \"changes\".\n\n    WARNING: Don't drop the next directive!\n\n.. towncrier release notes start\n\nv1.8.0\n======\n\n*(2025-10-05)*\n\n\nContributor-facing changes\n--------------------------\n\n- The ``reusable-cibuildwheel.yml`` workflow has been refactored to\n  be more generic and ``ci-cd.yml`` now holds all the configuration\n  toggles -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#668 <https://github.com/aio-libs/frozenlist/issues/668>`__.\n\n- When building wheels, the source distribution is now passed directly\n  to the ``cibuildwheel`` invocation -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#669 <https://github.com/aio-libs/frozenlist/issues/669>`__.\n\n- Builds and tests have been added to\n  ``ci-cd.yml`` for arm64 Windows wheels -- by `@finnagin <https://github.com/sponsors/finnagin>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#677 <https://github.com/aio-libs/frozenlist/issues/677>`__.\n\n- Started building wheels for CPython 3.14 -- by `@kumaraditya303 <https://github.com/sponsors/kumaraditya303>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#681 <https://github.com/aio-libs/frozenlist/issues/681>`__, `#682 <https://github.com/aio-libs/frozenlist/issues/682>`__.\n\n- Removed ``--config-settings=pure-python=false`` from ``requirements/dev.txt``.\n  Developers on CPython still get accelerated builds by default. To explicitly build\n  a pure Python wheel, use ``pip install -e . --config-settings=pure-python=true``\n  -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#687 <https://github.com/aio-libs/frozenlist/issues/687>`__.\n\n\n----\n\n\nv1.7.0\n======\n\n*(2025-06-09)*\n\n\nFeatures\n--------\n\n- Added deepcopy support to FrozenList -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#659 <https://github.com/aio-libs/frozenlist/issues/659>`__.\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- Fixed an issue where ``frozenlist`` binary wheels would be built with debugging symbols and line tracing enabled, which significantly impacted performance. Line tracing is now disabled by default and can only be enabled explicitly -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  This change ensures that production builds are optimized for performance. Developers who need line tracing for debugging purposes can still enable it by:\n\n  1. Setting the ``FROZENLIST_CYTHON_TRACING`` environment variable\n  2. Using the ``--config-setting=with-cython-tracing=true`` option with pip\n\n  *Related issues and pull requests on GitHub:*\n  `#660 <https://github.com/aio-libs/frozenlist/issues/660>`__.\n\n- Enabled ``PIP_CONSTRAINT`` environment variable in the build configuration to ensure the pinned Cython version from ``requirements/cython.txt`` is used during wheel builds.\n\n  *Related issues and pull requests on GitHub:*\n  `#661 <https://github.com/aio-libs/frozenlist/issues/661>`__.\n\n\n----\n\n\nv1.6.2\n======\n\n*(2025-06-03)*\n\n\nNo significant changes.\n\n\n----\n\n\nv1.6.1\n======\n\n*(2025-06-02)*\n\n\nBug fixes\n---------\n\n- Correctly use ``cimport`` for including ``PyBool_FromLong`` -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#653 <https://github.com/aio-libs/frozenlist/issues/653>`__.\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- Exclude ``_frozenlist.cpp`` from bdists/wheels -- by `@musicinmybrain <https://github.com/sponsors/musicinmybrain>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#649 <https://github.com/aio-libs/frozenlist/issues/649>`__.\n\n- Updated to use Cython 3.1 universally across the build path -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#654 <https://github.com/aio-libs/frozenlist/issues/654>`__.\n\n\n----\n\n\nv1.6.0\n======\n\n*(2025-04-17)*\n\n\nBug fixes\n---------\n\n- Stopped implicitly allowing the use of Cython pre-release versions when\n  building the distribution package -- by `@ajsanchezsanz <https://github.com/sponsors/ajsanchezsanz>`__ and\n  `@markgreene74 <https://github.com/sponsors/markgreene74>`__.\n\n  *Related commits on GitHub:*\n  `41591f2 <https://github.com/aio-libs/frozenlist/commit/41591f2>`__.\n\n\nFeatures\n--------\n\n- Implemented support for the free-threaded build of CPython 3.13 -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#618 <https://github.com/aio-libs/frozenlist/issues/618>`__.\n\n- Started building armv7l wheels -- by `@bdraco <https://github.com/sponsors/bdraco>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#642 <https://github.com/aio-libs/frozenlist/issues/642>`__.\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- Stopped implicitly allowing the use of Cython pre-release versions when\n  building the distribution package -- by `@ajsanchezsanz <https://github.com/sponsors/ajsanchezsanz>`__ and\n  `@markgreene74 <https://github.com/sponsors/markgreene74>`__.\n\n  *Related commits on GitHub:*\n  `41591f2 <https://github.com/aio-libs/frozenlist/commit/41591f2>`__.\n\n- Started building wheels for the free-threaded build of CPython 3.13 -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#618 <https://github.com/aio-libs/frozenlist/issues/618>`__.\n\n- The packaging metadata switched to including an SPDX license identifier introduced in `PEP 639 <https://peps.python.org/pep-639>`__ -- by `@cdce8p <https://github.com/sponsors/cdce8p>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#639 <https://github.com/aio-libs/frozenlist/issues/639>`__.\n\n\nContributor-facing changes\n--------------------------\n\n- GitHub Actions CI/CD is now configured to manage caching pip-ecosystem\n  dependencies using `re-actors/cache-python-deps`_ -- an action by\n  `@webknjaz <https://github.com/sponsors/webknjaz>`__ that takes into account ABI stability and the exact\n  version of Python runtime.\n\n  .. _`re-actors/cache-python-deps`:\n     https://github.com/marketplace/actions/cache-python-deps\n\n  *Related issues and pull requests on GitHub:*\n  `#633 <https://github.com/aio-libs/frozenlist/issues/633>`__.\n\n- Organized dependencies into test and lint dependencies so that no\n  unnecessary ones are installed during CI runs -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#636 <https://github.com/aio-libs/frozenlist/issues/636>`__.\n\n\n----\n\n\n1.5.0 (2024-10-22)\n==================\n\nBug fixes\n---------\n\n- An incorrect signature of the ``__class_getitem__`` class method\n  has been fixed, adding a missing ``class_item`` argument under\n  Python 3.8 and older.\n\n  This change also improves the code coverage of this method that\n  was previously missing -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n\n  *Related issues and pull requests on GitHub:*\n  `#567 <https://github.com/aio-libs/frozenlist/issues/567>`__, `#571 <https://github.com/aio-libs/frozenlist/issues/571>`__.\n\n\nImproved documentation\n----------------------\n\n- Rendered issue, PR, and commit links now lead to\n  ``frozenlist``'s repo instead of ``yarl``'s repo.\n\n\n  *Related issues and pull requests on GitHub:*\n  `#573 <https://github.com/aio-libs/frozenlist/issues/573>`__.\n\n- On the ``Contributing docs`` page,\n  a link to the ``Towncrier philosophy`` has been fixed.\n\n\n  *Related issues and pull requests on GitHub:*\n  `#574 <https://github.com/aio-libs/frozenlist/issues/574>`__.\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- A name of a temporary building directory now reflects\n  that it's related to ``frozenlist``, not ``yarl``.\n\n\n  *Related issues and pull requests on GitHub:*\n  `#573 <https://github.com/aio-libs/frozenlist/issues/573>`__.\n\n- Declared Python 3.13 supported officially in the distribution package metadata.\n\n\n  *Related issues and pull requests on GitHub:*\n  `#595 <https://github.com/aio-libs/frozenlist/issues/595>`__.\n\n\n----\n\n\n1.4.1 (2023-12-15)\n==================\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- Declared Python 3.12 and PyPy 3.8-3.10 supported officially\n  in the distribution package metadata.\n\n\n  *Related issues and pull requests on GitHub:*\n  `#553 <https://github.com/aio-libs/frozenlist/issues/553>`__.\n\n- Replaced the packaging is replaced from an old-fashioned ``setup.py`` to an\n  in-tree `PEP 517 <https://peps.python.org/pep-517>`__ build backend -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  Whenever the end-users or downstream packagers need to build ``frozenlist``\n  from source (a Git checkout or an sdist), they may pass a ``config_settings``\n  flag ``pure-python``. If this flag is not set, a C-extension will be built\n  and included into the distribution.\n\n  Here is how this can be done with ``pip``:\n\n  .. code-block:: console\n\n      $ python3 -m pip install . --config-settings=pure-python=\n\n  This will also work with ``-e | --editable``.\n\n  The same can be achieved via ``pypa/build``:\n\n  .. code-block:: console\n\n      $ python3 -m build --config-setting=pure-python=\n\n  Adding ``-w | --wheel`` can force ``pypa/build`` produce a wheel from source\n  directly, as opposed to building an ``sdist`` and then building from it.\n\n\n  *Related issues and pull requests on GitHub:*\n  `#560 <https://github.com/aio-libs/frozenlist/issues/560>`__.\n\n\nContributor-facing changes\n--------------------------\n\n- It is now possible to request line tracing in Cython builds using the\n  ``with-cython-tracing`` `PEP 517 <https://peps.python.org/pep-517>`__ config setting\n  -- `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  This can be used in CI and development environment to measure coverage\n  on Cython modules, but is not normally useful to the end-users or\n  downstream packagers.\n\n  Here's a usage example:\n\n  .. code-block:: console\n\n      $ python3 -Im pip install . --config-settings=with-cython-tracing=true\n\n  For editable installs, this setting is on by default. Otherwise, it's\n  off unless requested explicitly.\n\n  The following produces C-files required for the Cython coverage\n  plugin to map the measurements back to the PYX-files:\n\n  .. code-block:: console\n\n      $ python -Im pip install -e .\n\n  Alternatively, the ``FROZENLIST_CYTHON_TRACING=1`` environment variable\n  can be set to do the same as the `PEP 517 <https://peps.python.org/pep-517>`__ config setting.\n\n\n  *Related issues and pull requests on GitHub:*\n  `#560 <https://github.com/aio-libs/frozenlist/issues/560>`__.\n\n- Coverage collection has been implemented for the Cython modules\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  It will also be reported to Codecov from any non-release CI jobs.\n\n\n  *Related issues and pull requests on GitHub:*\n  `#561 <https://github.com/aio-libs/frozenlist/issues/561>`__.\n\n- A step-by-step ``Release Guide`` guide has\n  been added, describing how to release *frozenlist* -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  This is primarily targeting the maintainers.\n\n\n  *Related issues and pull requests on GitHub:*\n  `#563 <https://github.com/aio-libs/frozenlist/issues/563>`__.\n\n- Detailed ``Contributing Guidelines`` on\n  authoring the changelog fragments have been published in the\n  documentation -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n\n  *Related issues and pull requests on GitHub:*\n  `#564 <https://github.com/aio-libs/frozenlist/issues/564>`__.\n\n\n----\n\n\n1.4.0 (2023-07-12)\n==================\n\nThe published source distribution package became buildable\nunder Python 3.12.\n\n\n----\n\n\nBugfixes\n--------\n\n- Removed an unused ``typing.Tuple`` import\n  `#411 <https://github.com/aio-libs/frozenlist/issues/411>`_\n\n\nDeprecations and Removals\n-------------------------\n\n- Dropped Python 3.7 support.\n  `#413 <https://github.com/aio-libs/frozenlist/issues/413>`_\n\n\nMisc\n----\n\n- `#410 <https://github.com/aio-libs/frozenlist/issues/410>`_, `#433 <https://github.com/aio-libs/frozenlist/issues/433>`_\n\n\n----\n\n\n1.3.3 (2022-11-08)\n==================\n\n- Fixed CI runs when creating a new release, where new towncrier versions\n  fail when the current version section is already present.\n\n\n----\n\n\n1.3.2 (2022-11-08)\n==================\n\nMisc\n----\n\n- Updated the CI runs to better check for test results and to avoid deprecated syntax. `#327 <https://github.com/aio-libs/frozenlist/issues/327>`_\n\n\n----\n\n\n1.3.1 (2022-08-02)\n==================\n\nThe published source distribution package became buildable\nunder Python 3.11.\n\n\n----\n\n\n1.3.0 (2022-01-18)\n==================\n\nBugfixes\n--------\n\n- Do not install C sources with binary distributions.\n  `#250 <https://github.com/aio-libs/frozenlist/issues/250>`_\n\n\nDeprecations and Removals\n-------------------------\n\n- Dropped Python 3.6 support\n  `#274 <https://github.com/aio-libs/frozenlist/issues/274>`_\n\n\n----\n\n\n1.2.0 (2021-10-16)\n==================\n\nFeatures\n--------\n\n- ``FrozenList`` now supports being used as a generic type as per PEP 585, e.g. ``frozen_int_list: FrozenList[int]`` (requires Python 3.9 or newer).\n  `#172 <https://github.com/aio-libs/frozenlist/issues/172>`_\n- Added support for Python 3.10.\n  `#227 <https://github.com/aio-libs/frozenlist/issues/227>`_\n- Started shipping platform-specific wheels with the ``musl`` tag targeting typical Alpine Linux runtimes.\n  `#227 <https://github.com/aio-libs/frozenlist/issues/227>`_\n- Started shipping platform-specific arm64 wheels for Apple Silicon.\n  `#227 <https://github.com/aio-libs/frozenlist/issues/227>`_\n\n\n----\n\n\n1.1.1 (2020-11-14)\n==================\n\nBugfixes\n--------\n\n- Provide x86 Windows wheels.\n  `#169 <https://github.com/aio-libs/frozenlist/issues/169>`_\n\n\n----\n\n\n1.1.0 (2020-10-13)\n==================\n\nFeatures\n--------\n\n- Add support for hashing of a frozen list.\n  `#136 <https://github.com/aio-libs/frozenlist/issues/136>`_\n\n- Support Python 3.8 and 3.9.\n\n- Provide wheels for ``aarch64``, ``i686``, ``ppc64le``, ``s390x`` architectures on\n  Linux as well as ``x86_64``.\n\n\n----\n\n\n1.0.0 (2019-11-09)\n==================\n\nDeprecations and Removals\n-------------------------\n\n- Dropped support for Python 3.5; only 3.6, 3.7 and 3.8 are supported going forward.\n  `#24 <https://github.com/aio-libs/frozenlist/issues/24>`_\n",
        "description_content_type": "text/x-rst",
        "home_page": "https://github.com/aio-libs/frozenlist",
        "maintainer": "aiohttp team <team@aiohttp.org>",
        "maintainer_email": "team@aiohttp.org",
        "license": "Apache-2.0",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "Operating System :: POSIX",
          "Operating System :: MacOS :: MacOS X",
          "Operating System :: Microsoft :: Windows",
          "Programming Language :: Cython",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy"
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org",
          "Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org",
          "CI: Github Actions, https://github.com/aio-libs/frozenlist/actions",
          "Code of Conduct, https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md",
          "Coverage: codecov, https://codecov.io/github/aio-libs/frozenlist",
          "Docs: Changelog, https://github.com/aio-libs/frozenlist/blob/master/CHANGES.rst#changelog",
          "Docs: RTD, https://frozenlist.aio-libs.org",
          "GitHub: issues, https://github.com/aio-libs/frozenlist/issues",
          "GitHub: repo, https://github.com/aio-libs/frozenlist"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/frozenlist-1.8.0.dist-info",
      "installer": "pip",
      "requested": false
    },
    {
      "metadata": {
        "metadata_version": "2.1",
        "name": "brotlicffi",
        "version": "1.2.0.1",
        "summary": "Python CFFI bindings to the Brotli library",
        "description": "BrotliCFFI\n==========\n\n.. image:: https://img.shields.io/pypi/v/brotlicffi\n    :alt: Version\n    :target: https://pypi.org/project/brotlicffi\n\n.. image:: https://img.shields.io/conda/vn/conda-forge/brotlicffi\n    :alt: Version-Conda\n    :target: https://anaconda.org/conda-forge/brotlicffi\n\n.. image:: https://pepy.tech/badge/brotlicffi\n    :alt: Downloads\n    :target: https://pepy.tech/project/brotlicffi\n\n.. image:: https://img.shields.io/github/workflow/status/python-hyper/brotlicffi/CI/master\n    :alt: CI Status\n    :target: https://github.com/python-hyper/brotlicffi/actions\n\nThis library contains Python CFFI bindings for the reference Brotli encoder/decoder,\n`available here`_. This allows Python software to use the Brotli compression\nalgorithm directly from Python code.\n\nInstall from PyPI:\n\n.. code-block::\n\n    $ python -m pip install brotlicffi\n\nInstall from Conda:\n\n.. code-block::\n\n    $ conda install -c conda-forge brotlicffi\n\nTo use it simply, try this:\n\n.. code-block:: python\n\n    import brotlicffi\n    data = brotlicffi.decompress(compressed_data)\n\nMore information can be found `in the documentation`_.\n\n.. _available here: https://github.com/google/brotli\n.. _in the documentation: https://brotlipy.readthedocs.org\n\nUsing BrotliCFFI in Projects\n----------------------------\n\nThe API is 100% compatible with the `Brotli Python C bindings`_.\nWe recommend installing the C bindings on CPython and the CFFI\nbindings everywhere else (PyPy, etc)\n\nEssentially you use requirements like this:\n\n .. code-block:: python\n\n    install_requires=[\n        \"brotli; platform_python_implementation == 'CPython'\",\n        \"brotlicffi; platform_python_implementation != 'CPython'\"\n    ]\n\nand then import the correct Brotli library like so:\n\n .. code-block:: python\n\n    try:\n        import brotlicffi as brotli\n    except ImportError:\n        import brotli\n\nWe provide an `example project`_ that shows how to use both\nlibraries together to support Brotli with multiple Python implementations.\n\n.. _Brotli Python C bindings: https://pypi.org/project/Brotli\n.. _example project: https://github.com/python-hyper/brotlipy/tree/master/example\n\nLicense\n-------\n\nThe source code of BrotliCFFI is available under the MIT license. Brotli itself\nis made available under the Version 2.0 of the Apache Software License. See the\nLICENSE and libbrotli/LICENSE files for more information.\n\nAuthors\n-------\n\nBrotliCFFI/brotlipy was authored by Cory Benfield and\nis currently maintained by Seth Michael Larson.\n\n\nChangelog\n=========\n\n1.2.0.1 (2025-03-05)\n--------------------\n\n- Added support for the free-threaded build of Python 3.14.\n- Concurrent sharing of Compressor or Decompressor objects\n  now raises an exception.\n\n1.2.0.0 (2025-11-21)\n--------------------\n\n- Upgraded libbrotli to v1.2.0.\n- Added ``output_buffer_limit`` parameter to ``Decompressor.decompress()`` and\n  ``Decompressor.process()`` methods to allow mitigation of unexpectedly large\n  output. This addresses potential security concerns where maliciously crafted\n  compressed data could result in excessive memory usage during decompression.\n\n\n1.1.0.0 (2023-09-14)\n--------------------\n\n- Upgraded libbrotli to v1.1.0\n- Added explicit support for Python 3.10, 3.11, and 3.12\n- Removed support for Python 2.7, 3.5, and 3.6\n\n\n1.0.9.2 (2021-04-06)\n--------------------\n\n- Added ``manylinux_aarch64`` wheels\n\n\n1.0.9.1 (2021-01-27)\n--------------------\n\n- Avoid byte/string comparison warning in error message construction\n\n\n1.0.9.0 (2021-01-20)\n--------------------\n\n- Updated to v1.0.9 of the Brotli library\n- Library version now follows Brotli version\n- Removed the ``dictionary`` parameter from ``compress`` and ``Compressor``\n- **NOTE:** Python 2.7 wheels for Windows likely won't work until\n  `google/brotli#848`_ is resolved\n\n.. _google/brotli#848: https://github.com/google/brotli/issues/848\n\n0.8.0 (2020-11-30)\n------------------\n\n- Renamed the package on PyPI to ``brotlicffi``, all further updates will be\n  published to the new package. Using the ``brotlipy`` is deprecated.\n- Changed the importable namespace from ``brotli`` to ``brotlicffi`` to no longer\n  conflict with the ``Brotli`` PyPI package.\n- Added ``process()`` method to ``Compressor`` and ``Decompressor``.\n- Added ``is_finished()`` method to ``Decompressor``.\n\n0.7.0 (2017-05-30)\n------------------\n\n- Update to v0.6.0 of the Brotli library.\n\n0.6.0 (2016-09-08)\n------------------\n\n- Resolved a bug where ``decompress()`` would return an empty bytestring\n  instead of erroring if the provided bytestring was small enough.\n- Added the ``finish()`` method to the streaming decompressor.\n\n0.5.1 (2016-08-17)\n------------------\n\n- Update to v0.5.2 of the Brotli library.\n- Add new exception type (``Error``).\n- Add compatibility with C++ brotli library by aliasing ``Error`` to ``error``.\n- Extra error checking of input parameters to the compressor.\n\n0.5.0 (2016-08-16)\n------------------\n\n- Update to v0.5.0 of the Brotli library.\n- Extend one-shot compression API to include all control parameters.\n- Added streaming/incremental compression API.\n- Added flags to control compression mode.\n\n0.4.0 (2016-08-01)\n------------------\n\nUpdate to v0.4.0 of the Brotli library.\n\n0.3.0 (2016-05-11)\n------------------\n\nUpdate to v0.3.0 of the Brotli library.\n\n0.2.0 (2015-10-05)\n------------------\n\nFix broken ``brotli.compress`` support on Windows.\n\n0.1.3 (2015-10-05)\n------------------\n\n- Added basic for ``brotli.compress`` through a C wrapper included in this\n  library.\n",
        "home_page": "https://github.com/python-hyper/brotlicffi",
        "author": "Cory Benfield",
        "author_email": "cory@lukasa.co.uk",
        "license": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Free Threading :: 2 - Beta"
        ],
        "requires_dist": [
          "cffi >=1.0.0 ; python_version < \"3.13\"",
          "cffi >=1.17.0 ; python_version >= \"3.13\""
        ],
        "requires_python": ">=3.8"
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/brotlicffi-1.2.0.1.dist-info",
      "installer": "uv",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "charset-normalizer",
        "version": "3.4.4",
        "dynamic": [
          "license-file"
        ],
        "summary": "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet.",
        "description": "<h1 align=\"center\">Charset Detection, for Everyone 👋</h1>\n\n<p align=\"center\">\n  <sup>The Real First Universal Charset Detector</sup><br>\n  <a href=\"https://pypi.org/project/charset-normalizer\">\n    <img src=\"https://img.shields.io/pypi/pyversions/charset_normalizer.svg?orange=blue\" />\n  </a>\n  <a href=\"https://pepy.tech/project/charset-normalizer/\">\n    <img alt=\"Download Count Total\" src=\"https://static.pepy.tech/badge/charset-normalizer/month\" />\n  </a>\n  <a href=\"https://bestpractices.coreinfrastructure.org/projects/7297\">\n    <img src=\"https://bestpractices.coreinfrastructure.org/projects/7297/badge\">\n  </a>\n</p>\n<p align=\"center\">\n  <sup><i>Featured Packages</i></sup><br>\n  <a href=\"https://github.com/jawah/niquests\">\n   <img alt=\"Static Badge\" src=\"https://img.shields.io/badge/Niquests-Most_Advanced_HTTP_Client-cyan\">\n  </a>\n  <a href=\"https://github.com/jawah/wassima\">\n   <img alt=\"Static Badge\" src=\"https://img.shields.io/badge/Wassima-Certifi_Replacement-cyan\">\n  </a>\n</p>\n<p align=\"center\">\n  <sup><i>In other language (unofficial port - by the community)</i></sup><br>\n  <a href=\"https://github.com/nickspring/charset-normalizer-rs\">\n   <img alt=\"Static Badge\" src=\"https://img.shields.io/badge/Rust-red\">\n  </a>\n</p>\n\n> A library that helps you read text from an unknown charset encoding.<br /> Motivated by `chardet`,\n> I'm trying to resolve the issue by taking a new approach.\n> All IANA character set names for which the Python core library provides codecs are supported.\n\n<p align=\"center\">\n  >>>>> <a href=\"https://charsetnormalizerweb.ousret.now.sh\" target=\"_blank\">👉 Try Me Online Now, Then Adopt Me 👈 </a> <<<<<\n</p>\n\nThis project offers you an alternative to **Universal Charset Encoding Detector**, also known as **Chardet**.\n\n| Feature                                          | [Chardet](https://github.com/chardet/chardet) |                                         Charset Normalizer                                         | [cChardet](https://github.com/PyYoshi/cChardet) |\n|--------------------------------------------------|:---------------------------------------------:|:--------------------------------------------------------------------------------------------------:|:-----------------------------------------------:|\n| `Fast`                                           |                       ❌                       |                                                 ✅                                                  |                        ✅                        |\n| `Universal**`                                    |                       ❌                       |                                                 ✅                                                  |                        ❌                        |\n| `Reliable` **without** distinguishable standards |                       ❌                       |                                                 ✅                                                  |                        ✅                        |\n| `Reliable` **with** distinguishable standards    |                       ✅                       |                                                 ✅                                                  |                        ✅                        |\n| `License`                                        |           LGPL-2.1<br>_restrictive_           |                                                MIT                                                 |            MPL-1.1<br>_restrictive_             |\n| `Native Python`                                  |                       ✅                       |                                                 ✅                                                  |                        ❌                        |\n| `Detect spoken language`                         |                       ❌                       |                                                 ✅                                                  |                       N/A                       |\n| `UnicodeDecodeError Safety`                      |                       ❌                       |                                                 ✅                                                  |                        ❌                        |\n| `Whl Size (min)`                                 |                   193.6 kB                    |                                               42 kB                                                |                     ~200 kB                     |\n| `Supported Encoding`                             |                      33                       | 🎉 [99](https://charset-normalizer.readthedocs.io/en/latest/user/support.html#supported-encodings) |                       40                        |\n\n<p align=\"center\">\n<img src=\"https://i.imgflip.com/373iay.gif\" alt=\"Reading Normalized Text\" width=\"226\"/><img src=\"https://media.tenor.com/images/c0180f70732a18b4965448d33adba3d0/tenor.gif\" alt=\"Cat Reading Text\" width=\"200\"/>\n</p>\n\n*\\*\\* : They are clearly using specific code for a specific encoding even if covering most of used one*<br>\n\n## ⚡ Performance\n\nThis package offer better performance than its counterpart Chardet. Here are some numbers.\n\n| Package                                       | Accuracy | Mean per file (ms) | File per sec (est) |\n|-----------------------------------------------|:--------:|:------------------:|:------------------:|\n| [chardet](https://github.com/chardet/chardet) |   86 %   |       63 ms        |    16 file/sec     |\n| charset-normalizer                            | **98 %** |     **10 ms**      |    100 file/sec    |\n\n| Package                                       | 99th percentile | 95th percentile | 50th percentile |\n|-----------------------------------------------|:---------------:|:---------------:|:---------------:|\n| [chardet](https://github.com/chardet/chardet) |     265 ms      |      71 ms      |      7 ms       |\n| charset-normalizer                            |     100 ms      |      50 ms      |      5 ms       |\n\n_updated as of december 2024 using CPython 3.12_\n\nChardet's performance on larger file (1MB+) are very poor. Expect huge difference on large payload.\n\n> Stats are generated using 400+ files using default parameters. More details on used files, see GHA workflows.\n> And yes, these results might change at any time. The dataset can be updated to include more files.\n> The actual delays heavily depends on your CPU capabilities. The factors should remain the same.\n> Keep in mind that the stats are generous and that Chardet accuracy vs our is measured using Chardet initial capability\n> (e.g. Supported Encoding) Challenge-them if you want.\n\n## ✨ Installation\n\nUsing pip:\n\n```sh\npip install charset-normalizer -U\n```\n\n## 🚀 Basic Usage\n\n### CLI\nThis package comes with a CLI.\n\n```\nusage: normalizer [-h] [-v] [-a] [-n] [-m] [-r] [-f] [-t THRESHOLD]\n                  file [file ...]\n\nThe Real First Universal Charset Detector. Discover originating encoding used\non text file. Normalize text to unicode.\n\npositional arguments:\n  files                 File(s) to be analysed\n\noptional arguments:\n  -h, --help            show this help message and exit\n  -v, --verbose         Display complementary information about file if any.\n                        Stdout will contain logs about the detection process.\n  -a, --with-alternative\n                        Output complementary possibilities if any. Top-level\n                        JSON WILL be a list.\n  -n, --normalize       Permit to normalize input file. If not set, program\n                        does not write anything.\n  -m, --minimal         Only output the charset detected to STDOUT. Disabling\n                        JSON output.\n  -r, --replace         Replace file when trying to normalize it instead of\n                        creating a new one.\n  -f, --force           Replace file without asking if you are sure, use this\n                        flag with caution.\n  -t THRESHOLD, --threshold THRESHOLD\n                        Define a custom maximum amount of chaos allowed in\n                        decoded content. 0. <= chaos <= 1.\n  --version             Show version information and exit.\n```\n\n```bash\nnormalizer ./data/sample.1.fr.srt\n```\n\nor\n\n```bash\npython -m charset_normalizer ./data/sample.1.fr.srt\n```\n\n🎉 Since version 1.4.0 the CLI produce easily usable stdout result in JSON format.\n\n```json\n{\n    \"path\": \"/home/default/projects/charset_normalizer/data/sample.1.fr.srt\",\n    \"encoding\": \"cp1252\",\n    \"encoding_aliases\": [\n        \"1252\",\n        \"windows_1252\"\n    ],\n    \"alternative_encodings\": [\n        \"cp1254\",\n        \"cp1256\",\n        \"cp1258\",\n        \"iso8859_14\",\n        \"iso8859_15\",\n        \"iso8859_16\",\n        \"iso8859_3\",\n        \"iso8859_9\",\n        \"latin_1\",\n        \"mbcs\"\n    ],\n    \"language\": \"French\",\n    \"alphabets\": [\n        \"Basic Latin\",\n        \"Latin-1 Supplement\"\n    ],\n    \"has_sig_or_bom\": false,\n    \"chaos\": 0.149,\n    \"coherence\": 97.152,\n    \"unicode_path\": null,\n    \"is_preferred\": true\n}\n```\n\n### Python\n*Just print out normalized text*\n```python\nfrom charset_normalizer import from_path\n\nresults = from_path('./my_subtitle.srt')\n\nprint(str(results.best()))\n```\n\n*Upgrade your code without effort*\n```python\nfrom charset_normalizer import detect\n```\n\nThe above code will behave the same as **chardet**. We ensure that we offer the best (reasonable) BC result possible.\n\nSee the docs for advanced usage : [readthedocs.io](https://charset-normalizer.readthedocs.io/en/latest/)\n\n## 😇 Why\n\nWhen I started using Chardet, I noticed that it was not suited to my expectations, and I wanted to propose a\nreliable alternative using a completely different method. Also! I never back down on a good challenge!\n\nI **don't care** about the **originating charset** encoding, because **two different tables** can\nproduce **two identical rendered string.**\nWhat I want is to get readable text, the best I can.\n\nIn a way, **I'm brute forcing text decoding.** How cool is that ? 😎\n\nDon't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair Unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode.\n\n## 🍰 How\n\n  - Discard all charset encoding table that could not fit the binary content.\n  - Measure noise, or the mess once opened (by chunks) with a corresponding charset encoding.\n  - Extract matches with the lowest mess detected.\n  - Additionally, we measure coherence / probe for a language.\n\n**Wait a minute**, what is noise/mess and coherence according to **YOU ?**\n\n*Noise :* I opened hundred of text files, **written by humans**, with the wrong encoding table. **I observed**, then\n**I established** some ground rules about **what is obvious** when **it seems like** a mess (aka. defining noise in rendered text).\n I know that my interpretation of what is noise is probably incomplete, feel free to contribute in order to\n improve or rewrite it.\n\n*Coherence :* For each language there is on earth, we have computed ranked letter appearance occurrences (the best we can). So I thought\nthat intel is worth something here. So I use those records against decoded text to check if I can detect intelligent design.\n\n## ⚡ Known limitations\n\n  - Language detection is unreliable when text contains two or more languages sharing identical letters. (eg. HTML (english tags) + Turkish content (Sharing Latin characters))\n  - Every charset detector heavily depends on sufficient content. In common cases, do not bother run detection on very tiny content.\n\n## ⚠️ About Python EOLs\n\n**If you are running:**\n\n- Python >=2.7,<3.5: Unsupported\n- Python 3.5: charset-normalizer < 2.1\n- Python 3.6: charset-normalizer < 3.1\n- Python 3.7: charset-normalizer < 4.0\n\nUpgrade your Python interpreter as soon as possible.\n\n## 👤 Contributing\n\nContributions, issues and feature requests are very much welcome.<br />\nFeel free to check [issues page](https://github.com/ousret/charset_normalizer/issues) if you want to contribute.\n\n## 📝 License\n\nCopyright © [Ahmed TAHRI @Ousret](https://github.com/Ousret).<br />\nThis project is [MIT](https://github.com/Ousret/charset_normalizer/blob/master/LICENSE) licensed.\n\nCharacters frequencies used in this project © 2012 [Denny Vrandečić](http://simia.net/letters/)\n\n## 💼 For Enterprise\n\nProfessional support for charset-normalizer is available as part of the [Tidelift\nSubscription][1]. Tidelift gives software development teams a single source for\npurchasing and maintaining their software, with professional grade assurances\nfrom the experts who know it best, while seamlessly integrating with existing\ntools.\n\n[1]: https://tidelift.com/subscription/pkg/pypi-charset-normalizer?utm_source=pypi-charset-normalizer&utm_medium=readme\n\n[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/7297/badge)](https://www.bestpractices.dev/projects/7297)\n\n# Changelog\nAll notable changes to charset-normalizer will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).\n\n## [3.4.4](https://github.com/Ousret/charset_normalizer/compare/3.4.2...3.4.4) (2025-10-13)\n\n### Changed\n- Bound `setuptools` to a specific constraint `setuptools>=68,<=81`.\n- Raised upper bound of mypyc for the optional pre-built extension to v1.18.2\n\n### Removed\n- `setuptools-scm` as a build dependency.\n\n### Misc\n- Enforced hashes in `dev-requirements.txt` and created `ci-requirements.txt` for security purposes.\n- Additional pre-built wheels for riscv64, s390x, and armv7l architectures.\n- Restore ` multiple.intoto.jsonl` in GitHub releases in addition to individual attestation file per wheel.\n\n## [3.4.3](https://github.com/Ousret/charset_normalizer/compare/3.4.2...3.4.3) (2025-08-09)\n\n### Changed\n- mypy(c) is no longer a required dependency at build time if `CHARSET_NORMALIZER_USE_MYPYC` isn't set to `1`. (#595) (#583)\n- automatically lower confidence on small bytes samples that are not Unicode in `detect` output legacy function. (#391)\n\n### Added\n- Custom build backend to overcome inability to mark mypy as an optional dependency in the build phase.\n- Support for Python 3.14\n\n### Fixed\n- sdist archive contained useless directories.\n- automatically fallback on valid UTF-16 or UTF-32 even if the md says it's noisy. (#633)\n\n### Misc\n- SBOM are automatically published to the relevant GitHub release to comply with regulatory changes.\n  Each published wheel comes with its SBOM. We choose CycloneDX as the format.\n- Prebuilt optimized wheel are no longer distributed by default for CPython 3.7 due to a change in cibuildwheel.\n\n## [3.4.2](https://github.com/Ousret/charset_normalizer/compare/3.4.1...3.4.2) (2025-05-02)\n\n### Fixed\n- Addressed the DeprecationWarning in our CLI regarding `argparse.FileType` by backporting the target class into the package. (#591)\n- Improved the overall reliability of the detector with CJK Ideographs. (#605) (#587)\n\n### Changed\n- Optional mypyc compilation upgraded to version 1.15 for Python >= 3.8\n\n## [3.4.1](https://github.com/Ousret/charset_normalizer/compare/3.4.0...3.4.1) (2024-12-24)\n\n### Changed\n- Project metadata are now stored using `pyproject.toml` instead of `setup.cfg` using setuptools as the build backend.\n- Enforce annotation delayed loading for a simpler and consistent types in the project.\n- Optional mypyc compilation upgraded to version 1.14 for Python >= 3.8\n\n### Added\n- pre-commit configuration.\n- noxfile.\n\n### Removed\n- `build-requirements.txt` as per using `pyproject.toml` native build configuration.\n- `bin/integration.py` and `bin/serve.py` in favor of downstream integration test (see noxfile).\n- `setup.cfg` in favor of `pyproject.toml` metadata configuration.\n- Unused `utils.range_scan` function.\n\n### Fixed\n- Converting content to Unicode bytes may insert `utf_8` instead of preferred `utf-8`. (#572)\n- Deprecation warning \"'count' is passed as positional argument\" when converting to Unicode bytes on Python 3.13+\n\n## [3.4.0](https://github.com/Ousret/charset_normalizer/compare/3.3.2...3.4.0) (2024-10-08)\n\n### Added\n- Argument `--no-preemptive` in the CLI to prevent the detector to search for hints.\n- Support for Python 3.13 (#512)\n\n### Fixed\n- Relax the TypeError exception thrown when trying to compare a CharsetMatch with anything else than a CharsetMatch.\n- Improved the general reliability of the detector based on user feedbacks. (#520) (#509) (#498) (#407) (#537)\n- Declared charset in content (preemptive detection) not changed when converting to utf-8 bytes. (#381)\n\n## [3.3.2](https://github.com/Ousret/charset_normalizer/compare/3.3.1...3.3.2) (2023-10-31)\n\n### Fixed\n- Unintentional memory usage regression when using large payload that match several encoding (#376)\n- Regression on some detection case showcased in the documentation (#371)\n\n### Added\n- Noise (md) probe that identify malformed arabic representation due to the presence of letters in isolated form (credit to my wife)\n\n## [3.3.1](https://github.com/Ousret/charset_normalizer/compare/3.3.0...3.3.1) (2023-10-22)\n\n### Changed\n- Optional mypyc compilation upgraded to version 1.6.1 for Python >= 3.8\n- Improved the general detection reliability based on reports from the community\n\n## [3.3.0](https://github.com/Ousret/charset_normalizer/compare/3.2.0...3.3.0) (2023-09-30)\n\n### Added\n- Allow to execute the CLI (e.g. normalizer) through `python -m charset_normalizer.cli` or `python -m charset_normalizer`\n- Support for 9 forgotten encoding that are supported by Python but unlisted in `encoding.aliases` as they have no alias (#323)\n\n### Removed\n- (internal) Redundant utils.is_ascii function and unused function is_private_use_only\n- (internal) charset_normalizer.assets is moved inside charset_normalizer.constant\n\n### Changed\n- (internal) Unicode code blocks in constants are updated using the latest v15.0.0 definition to improve detection\n- Optional mypyc compilation upgraded to version 1.5.1 for Python >= 3.8\n\n### Fixed\n- Unable to properly sort CharsetMatch when both chaos/noise and coherence were close due to an unreachable condition in \\_\\_lt\\_\\_ (#350)\n\n## [3.2.0](https://github.com/Ousret/charset_normalizer/compare/3.1.0...3.2.0) (2023-06-07)\n\n### Changed\n- Typehint for function `from_path` no longer enforce `PathLike` as its first argument\n- Minor improvement over the global detection reliability\n\n### Added\n- Introduce function `is_binary` that relies on main capabilities, and optimized to detect binaries\n- Propagate `enable_fallback` argument throughout `from_bytes`, `from_path`, and `from_fp` that allow a deeper control over the detection (default True)\n- Explicit support for Python 3.12\n\n### Fixed\n- Edge case detection failure where a file would contain 'very-long' camel cased word (Issue #289)\n\n## [3.1.0](https://github.com/Ousret/charset_normalizer/compare/3.0.1...3.1.0) (2023-03-06)\n\n### Added\n- Argument `should_rename_legacy` for legacy function `detect` and disregard any new arguments without errors (PR #262)\n\n### Removed\n- Support for Python 3.6 (PR #260)\n\n### Changed\n- Optional speedup provided by mypy/c 1.0.1\n\n## [3.0.1](https://github.com/Ousret/charset_normalizer/compare/3.0.0...3.0.1) (2022-11-18)\n\n### Fixed\n- Multi-bytes cutter/chunk generator did not always cut correctly (PR #233)\n\n### Changed\n- Speedup provided by mypy/c 0.990 on Python >= 3.7\n\n## [3.0.0](https://github.com/Ousret/charset_normalizer/compare/2.1.1...3.0.0) (2022-10-20)\n\n### Added\n- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results\n- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES\n- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio\n- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl)\n\n### Changed\n- Build with static metadata using 'build' frontend\n- Make the language detection stricter\n- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1\n\n### Fixed\n- CLI with opt --normalize fail when using full path for files\n- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it\n- Sphinx warnings when generating the documentation\n\n### Removed\n- Coherence detector no longer return 'Simple English' instead return 'English'\n- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese'\n- Breaking: Method `first()` and `best()` from CharsetMatch\n- UTF-7 will no longer appear as \"detected\" without a recognized SIG/mark (is unreliable/conflict with ASCII)\n- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches\n- Breaking: Top-level function `normalize`\n- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch\n- Support for the backport `unicodedata2`\n\n## [3.0.0rc1](https://github.com/Ousret/charset_normalizer/compare/3.0.0b2...3.0.0rc1) (2022-10-18)\n\n### Added\n- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results\n- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES\n- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio\n\n### Changed\n- Build with static metadata using 'build' frontend\n- Make the language detection stricter\n\n### Fixed\n- CLI with opt --normalize fail when using full path for files\n- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it\n\n### Removed\n- Coherence detector no longer return 'Simple English' instead return 'English'\n- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese'\n\n## [3.0.0b2](https://github.com/Ousret/charset_normalizer/compare/3.0.0b1...3.0.0b2) (2022-08-21)\n\n### Added\n- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl)\n\n### Removed\n- Breaking: Method `first()` and `best()` from CharsetMatch\n- UTF-7 will no longer appear as \"detected\" without a recognized SIG/mark (is unreliable/conflict with ASCII)\n\n### Fixed\n- Sphinx warnings when generating the documentation\n\n## [3.0.0b1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...3.0.0b1) (2022-08-15)\n\n### Changed\n- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1\n\n### Removed\n- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches\n- Breaking: Top-level function `normalize`\n- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch\n- Support for the backport `unicodedata2`\n\n## [2.1.1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...2.1.1) (2022-08-19)\n\n### Deprecated\n- Function `normalize` scheduled for removal in 3.0\n\n### Changed\n- Removed useless call to decode in fn is_unprintable (#206)\n\n### Fixed\n- Third-party library (i18n xgettext) crashing not recognizing utf_8 (PEP 263) with underscore from [@aleksandernovikov](https://github.com/aleksandernovikov) (#204)\n\n## [2.1.0](https://github.com/Ousret/charset_normalizer/compare/2.0.12...2.1.0) (2022-06-19)\n\n### Added\n- Output the Unicode table version when running the CLI with `--version` (PR #194)\n\n### Changed\n- Re-use decoded buffer for single byte character sets from [@nijel](https://github.com/nijel) (PR #175)\n- Fixing some performance bottlenecks from [@deedy5](https://github.com/deedy5) (PR #183)\n\n### Fixed\n- Workaround potential bug in cpython with Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space (PR #175)\n- CLI default threshold aligned with the API threshold from [@oleksandr-kuzmenko](https://github.com/oleksandr-kuzmenko) (PR #181)\n\n### Removed\n- Support for Python 3.5 (PR #192)\n\n### Deprecated\n- Use of backport unicodedata from `unicodedata2` as Python is quickly catching up, scheduled for removal in 3.0 (PR #194)\n\n## [2.0.12](https://github.com/Ousret/charset_normalizer/compare/2.0.11...2.0.12) (2022-02-12)\n\n### Fixed\n- ASCII miss-detection on rare cases (PR #170)\n\n## [2.0.11](https://github.com/Ousret/charset_normalizer/compare/2.0.10...2.0.11) (2022-01-30)\n\n### Added\n- Explicit support for Python 3.11 (PR #164)\n\n### Changed\n- The logging behavior have been completely reviewed, now using only TRACE and DEBUG levels (PR #163 #165)\n\n## [2.0.10](https://github.com/Ousret/charset_normalizer/compare/2.0.9...2.0.10) (2022-01-04)\n\n### Fixed\n- Fallback match entries might lead to UnicodeDecodeError for large bytes sequence (PR #154)\n\n### Changed\n- Skipping the language-detection (CD) on ASCII (PR #155)\n\n## [2.0.9](https://github.com/Ousret/charset_normalizer/compare/2.0.8...2.0.9) (2021-12-03)\n\n### Changed\n- Moderating the logging impact (since 2.0.8) for specific environments (PR #147)\n\n### Fixed\n- Wrong logging level applied when setting kwarg `explain` to True (PR #146)\n\n## [2.0.8](https://github.com/Ousret/charset_normalizer/compare/2.0.7...2.0.8) (2021-11-24)\n### Changed\n- Improvement over Vietnamese detection (PR #126)\n- MD improvement on trailing data and long foreign (non-pure latin) data (PR #124)\n- Efficiency improvements in cd/alphabet_languages from [@adbar](https://github.com/adbar) (PR #122)\n- call sum() without an intermediary list following PEP 289 recommendations from [@adbar](https://github.com/adbar) (PR #129)\n- Code style as refactored by Sourcery-AI (PR #131)\n- Minor adjustment on the MD around european words (PR #133)\n- Remove and replace SRTs from assets / tests (PR #139)\n- Initialize the library logger with a `NullHandler` by default from [@nmaynes](https://github.com/nmaynes) (PR #135)\n- Setting kwarg `explain` to True will add provisionally (bounded to function lifespan) a specific stream handler (PR #135)\n\n### Fixed\n- Fix large (misleading) sequence giving UnicodeDecodeError (PR #137)\n- Avoid using too insignificant chunk (PR #137)\n\n### Added\n- Add and expose function `set_logging_handler` to configure a specific StreamHandler from [@nmaynes](https://github.com/nmaynes) (PR #135)\n- Add `CHANGELOG.md` entries, format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) (PR #141)\n\n## [2.0.7](https://github.com/Ousret/charset_normalizer/compare/2.0.6...2.0.7) (2021-10-11)\n### Added\n- Add support for Kazakh (Cyrillic) language detection (PR #109)\n\n### Changed\n- Further, improve inferring the language from a given single-byte code page (PR #112)\n- Vainly trying to leverage PEP263 when PEP3120 is not supported (PR #116)\n- Refactoring for potential performance improvements in loops from [@adbar](https://github.com/adbar) (PR #113)\n- Various detection improvement (MD+CD) (PR #117)\n\n### Removed\n- Remove redundant logging entry about detected language(s) (PR #115)\n\n### Fixed\n- Fix a minor inconsistency between Python 3.5 and other versions regarding language detection (PR #117 #102)\n\n## [2.0.6](https://github.com/Ousret/charset_normalizer/compare/2.0.5...2.0.6) (2021-09-18)\n### Fixed\n- Unforeseen regression with the loss of the backward-compatibility with some older minor of Python 3.5.x (PR #100)\n- Fix CLI crash when using --minimal output in certain cases (PR #103)\n\n### Changed\n- Minor improvement to the detection efficiency (less than 1%) (PR #106 #101)\n\n## [2.0.5](https://github.com/Ousret/charset_normalizer/compare/2.0.4...2.0.5) (2021-09-14)\n### Changed\n- The project now comply with: flake8, mypy, isort and black to ensure a better overall quality (PR #81)\n- The BC-support with v1.x was improved, the old staticmethods are restored (PR #82)\n- The Unicode detection is slightly improved (PR #93)\n- Add syntax sugar \\_\\_bool\\_\\_ for results CharsetMatches list-container (PR #91)\n\n### Removed\n- The project no longer raise warning on tiny content given for detection, will be simply logged as warning instead (PR #92)\n\n### Fixed\n- In some rare case, the chunks extractor could cut in the middle of a multi-byte character and could mislead the mess detection (PR #95)\n- Some rare 'space' characters could trip up the UnprintablePlugin/Mess detection (PR #96)\n- The MANIFEST.in was not exhaustive (PR #78)\n\n## [2.0.4](https://github.com/Ousret/charset_normalizer/compare/2.0.3...2.0.4) (2021-07-30)\n### Fixed\n- The CLI no longer raise an unexpected exception when no encoding has been found (PR #70)\n- Fix accessing the 'alphabets' property when the payload contains surrogate characters (PR #68)\n- The logger could mislead (explain=True) on detected languages and the impact of one MBCS match (PR #72)\n- Submatch factoring could be wrong in rare edge cases (PR #72)\n- Multiple files given to the CLI were ignored when publishing results to STDOUT. (After the first path) (PR #72)\n- Fix line endings from CRLF to LF for certain project files (PR #67)\n\n### Changed\n- Adjust the MD to lower the sensitivity, thus improving the global detection reliability (PR #69 #76)\n- Allow fallback on specified encoding if any (PR #71)\n\n## [2.0.3](https://github.com/Ousret/charset_normalizer/compare/2.0.2...2.0.3) (2021-07-16)\n### Changed\n- Part of the detection mechanism has been improved to be less sensitive, resulting in more accurate detection results. Especially ASCII. (PR #63)\n- According to the community wishes, the detection will fall back on ASCII or UTF-8 in a last-resort case. (PR #64)\n\n## [2.0.2](https://github.com/Ousret/charset_normalizer/compare/2.0.1...2.0.2) (2021-07-15)\n### Fixed\n- Empty/Too small JSON payload miss-detection fixed. Report from [@tseaver](https://github.com/tseaver) (PR #59)\n\n### Changed\n- Don't inject unicodedata2 into sys.modules from [@akx](https://github.com/akx) (PR #57)\n\n## [2.0.1](https://github.com/Ousret/charset_normalizer/compare/2.0.0...2.0.1) (2021-07-13)\n### Fixed\n- Make it work where there isn't a filesystem available, dropping assets frequencies.json. Report from [@sethmlarson](https://github.com/sethmlarson). (PR #55)\n- Using explain=False permanently disable the verbose output in the current runtime (PR #47)\n- One log entry (language target preemptive) was not show in logs when using explain=True (PR #47)\n- Fix undesired exception (ValueError) on getitem of instance CharsetMatches (PR #52)\n\n### Changed\n- Public function normalize default args values were not aligned with from_bytes (PR #53)\n\n### Added\n- You may now use charset aliases in cp_isolation and cp_exclusion arguments (PR #47)\n\n## [2.0.0](https://github.com/Ousret/charset_normalizer/compare/1.4.1...2.0.0) (2021-07-02)\n### Changed\n- 4x to 5 times faster than the previous 1.4.0 release. At least 2x faster than Chardet.\n- Accent has been made on UTF-8 detection, should perform rather instantaneous.\n- The backward compatibility with Chardet has been greatly improved. The legacy detect function returns an identical charset name whenever possible.\n- The detection mechanism has been slightly improved, now Turkish content is detected correctly (most of the time)\n- The program has been rewritten to ease the readability and maintainability. (+Using static typing)+\n- utf_7 detection has been reinstated.\n\n### Removed\n- This package no longer require anything when used with Python 3.5 (Dropped cached_property)\n- Removed support for these languages: Catalan, Esperanto, Kazakh, Baque, Volapük, Azeri, Galician, Nynorsk, Macedonian, and Serbocroatian.\n- The exception hook on UnicodeDecodeError has been removed.\n\n### Deprecated\n- Methods coherence_non_latin, w_counter, chaos_secondary_pass of the class CharsetMatch are now deprecated and scheduled for removal in v3.0\n\n### Fixed\n- The CLI output used the relative path of the file(s). Should be absolute.\n\n## [1.4.1](https://github.com/Ousret/charset_normalizer/compare/1.4.0...1.4.1) (2021-05-28)\n### Fixed\n- Logger configuration/usage no longer conflict with others (PR #44)\n\n## [1.4.0](https://github.com/Ousret/charset_normalizer/compare/1.3.9...1.4.0) (2021-05-21)\n### Removed\n- Using standard logging instead of using the package loguru.\n- Dropping nose test framework in favor of the maintained pytest.\n- Choose to not use dragonmapper package to help with gibberish Chinese/CJK text.\n- Require cached_property only for Python 3.5 due to constraint. Dropping for every other interpreter version.\n- Stop support for UTF-7 that does not contain a SIG.\n- Dropping PrettyTable, replaced with pure JSON output in CLI.\n\n### Fixed\n- BOM marker in a CharsetNormalizerMatch instance could be False in rare cases even if obviously present. Due to the sub-match factoring process.\n- Not searching properly for the BOM when trying utf32/16 parent codec.\n\n### Changed\n- Improving the package final size by compressing frequencies.json.\n- Huge improvement over the larges payload.\n\n### Added\n- CLI now produces JSON consumable output.\n- Return ASCII if given sequences fit. Given reasonable confidence.\n\n## [1.3.9](https://github.com/Ousret/charset_normalizer/compare/1.3.8...1.3.9) (2021-05-13)\n\n### Fixed\n- In some very rare cases, you may end up getting encode/decode errors due to a bad bytes payload (PR #40)\n\n## [1.3.8](https://github.com/Ousret/charset_normalizer/compare/1.3.7...1.3.8) (2021-05-12)\n\n### Fixed\n- Empty given payload for detection may cause an exception if trying to access the `alphabets` property. (PR #39)\n\n## [1.3.7](https://github.com/Ousret/charset_normalizer/compare/1.3.6...1.3.7) (2021-05-12)\n\n### Fixed\n- The legacy detect function should return UTF-8-SIG if sig is present in the payload. (PR #38)\n\n## [1.3.6](https://github.com/Ousret/charset_normalizer/compare/1.3.5...1.3.6) (2021-02-09)\n\n### Changed\n- Amend the previous release to allow prettytable 2.0 (PR #35)\n\n## [1.3.5](https://github.com/Ousret/charset_normalizer/compare/1.3.4...1.3.5) (2021-02-08)\n\n### Fixed\n- Fix error while using the package with a python pre-release interpreter (PR #33)\n\n### Changed\n- Dependencies refactoring, constraints revised.\n\n### Added\n- Add python 3.9 and 3.10 to the supported interpreters\n\nMIT License\n\nCopyright (c) 2025 TAHRI Ahmed R.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n",
        "description_content_type": "text/markdown",
        "keywords": [
          "encoding",
          "charset",
          "charset-detector",
          "detector",
          "normalization",
          "unicode",
          "chardet",
          "detect"
        ],
        "author_email": "\"Ahmed R. TAHRI\" <tahri.ahmed@proton.me>",
        "maintainer_email": "\"Ahmed R. TAHRI\" <tahri.ahmed@proton.me>",
        "license": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.7",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Topic :: Text Processing :: Linguistic",
          "Topic :: Utilities",
          "Typing :: Typed"
        ],
        "requires_python": ">=3.7",
        "project_url": [
          "Changelog, https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md",
          "Documentation, https://charset-normalizer.readthedocs.io/",
          "Code, https://github.com/jawah/charset_normalizer",
          "Issue tracker, https://github.com/jawah/charset_normalizer/issues"
        ],
        "provides_extra": [
          "unicode-backport"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/charset_normalizer-3.4.4.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "tabulate",
        "version": "0.10.0",
        "dynamic": [
          "license-file"
        ],
        "summary": "Pretty-print tabular data",
        "description": "python-tabulate\n===============\n\nPretty-print tabular data in Python, a library and a command-line\nutility.\n\nThe main use cases of the library are:\n\n-   printing small tables without hassle: just one function call,\n    formatting is guided by the data itself\n-   authoring tabular data for lightweight plain-text markup: multiple\n    output formats suitable for further editing or transformation\n-   readable presentation of mixed textual and numeric data: smart\n    column alignment, configurable number formatting, alignment by a\n    decimal point\n\nInstallation\n------------\n\nTo install the Python library and the command line utility, run:\n\n```shell\npip install tabulate\n```\n\nThe command line utility will be installed as `tabulate` to `bin` on\nLinux (e.g. `/usr/bin`); or as `tabulate.exe` to `Scripts` in your\nPython installation on Windows (e.g. `C:\\Python39\\Scripts\\tabulate.exe`).\n\nYou may consider installing the library only for the current user:\n\n```shell\npip install tabulate --user\n```\n\nIn this case the command line utility will be installed to\n`~/.local/bin/tabulate` on Linux and to\n`%APPDATA%\\Python\\Scripts\\tabulate.exe` on Windows.\n\nTo install just the library on Unix-like operating systems:\n\n```shell\nTABULATE_INSTALL=lib-only pip install tabulate\n```\n\nOn Windows:\n\n```shell\nset TABULATE_INSTALL=lib-only\npip install tabulate\n```\n\nBuild status\n------------\n\n[![python-tabulate](https://github.com/astanin/python-tabulate/actions/workflows/tabulate.yml/badge.svg)](https://github.com/astanin/python-tabulate/actions/workflows/tabulate.yml)\n\nLibrary usage\n-------------\n\nThe module provides just one function, `tabulate`, which takes a list of\nlists or another tabular data type as the first argument, and outputs a\nnicely formatted plain-text table:\n\n```pycon\n>>> from tabulate import tabulate\n\n>>> table = [[\"Sun\",696000,1989100000],[\"Earth\",6371,5973.6],\n...          [\"Moon\",1737,73.5],[\"Mars\",3390,641.85]]\n>>> print(tabulate(table))\n-----  ------  -------------\nSun    696000     1.9891e+09\nEarth    6371  5973.6\nMoon     1737    73.5\nMars     3390   641.85\n-----  ------  -------------\n\n```\n\nThe following tabular data types are supported:\n\n-   list of lists or another iterable of iterables\n-   list or another iterable of dicts (keys as columns)\n-   dict of iterables (keys as columns)\n-   list of dataclasses (field names as columns)\n-   two-dimensional NumPy array\n-   NumPy record arrays (names as columns)\n-   pandas.DataFrame\n\nTabulate is a Python3 library.\n\n### Headers\n\nThe second optional argument named `headers` defines a list of column\nheaders to be used:\n\n```pycon\n>>> print(tabulate(table, headers=[\"Planet\",\"R (km)\", \"mass (x 10^29 kg)\"]))\nPlanet      R (km)    mass (x 10^29 kg)\n--------  --------  -------------------\nSun         696000           1.9891e+09\nEarth         6371        5973.6\nMoon          1737          73.5\nMars          3390         641.85\n\n```\n\nIf `headers=\"firstrow\"`, then the first row of data is used:\n\n```pycon\n>>> print(tabulate([[\"Name\",\"Age\"],[\"Alice\",24],[\"Bob\",19]],\n...                headers=\"firstrow\"))\nName      Age\n------  -----\nAlice      24\nBob        19\n\n```\n\nIf `headers=\"keys\"`, then the keys of a dictionary/dataframe, or column\nindices are used. It also works for NumPy record arrays and lists of\ndictionaries or named tuples:\n\n```pycon\n>>> print(tabulate({\"Name\": [\"Alice\", \"Bob\"],\n...                 \"Age\": [24, 19]}, headers=\"keys\"))\nName      Age\n------  -----\nAlice      24\nBob        19\n\n```\n\nWhen data is a list of dictionaries, a dictionary can be passed as `headers`\nto replace the keys with other column labels:\n\n```pycon\n>>> print(tabulate([{1: \"Alice\", 2: 24}, {1: \"Bob\", 2: 19}],\n...                headers={1: \"Name\", 2: \"Age\"}))\nName      Age\n------  -----\nAlice      24\nBob        19\n\n```\n\n### Row Indices\n\nBy default, only pandas.DataFrame tables have an additional column\ncalled row index. To add a similar column to any other type of table,\npass `showindex=\"always\"` or `showindex=True` argument to `tabulate()`.\nTo suppress row indices for all types of data, pass `showindex=\"never\"`\nor `showindex=False`. To add a custom row index column, pass\n`showindex=rowIDs`, where `rowIDs` is some iterable:\n\n```pycon\n>>> print(tabulate([[\"F\",24],[\"M\",19]], showindex=\"always\"))\n-  -  --\n0  F  24\n1  M  19\n-  -  --\n\n```\n\n### Table format\n\nThere is more than one way to format a table in plain text. The third\noptional argument named `tablefmt` defines how the table is formatted.\n\nSupported table formats are:\n\n-   \"plain\"\n-   \"simple\"\n-   \"github\"\n-   \"grid\"\n-   \"simple\\_grid\"\n-   \"rounded\\_grid\"\n-   \"heavy\\_grid\"\n-   \"mixed\\_grid\"\n-   \"double\\_grid\"\n-   \"fancy\\_grid\"\n-   \"outline\"\n-   \"simple\\_outline\"\n-   \"rounded\\_outline\"\n-   \"heavy\\_outline\"\n-   \"mixed\\_outline\"\n-   \"double\\_outline\"\n-   \"fancy\\_outline\"\n-   \"pipe\"\n-   \"orgtbl\"\n-   \"asciidoc\"\n-   \"jira\"\n-   \"presto\"\n-   \"pretty\"\n-   \"psql\"\n-   \"rst\"\n-   \"mediawiki\"\n-   \"moinmoin\"\n-   \"youtrack\"\n-   \"html\"\n-   \"unsafehtml\"\n-   \"latex\"\n-   \"latex\\_raw\"\n-   \"latex\\_booktabs\"\n-   \"latex\\_longtable\"\n-   \"textile\"\n-   \"tsv\"\n\n`plain` tables do not use any pseudo-graphics to draw lines:\n\n```pycon\n>>> table = [[\"spam\",42],[\"eggs\",451],[\"bacon\",0]]\n>>> headers = [\"item\", \"qty\"]\n>>> print(tabulate(table, headers, tablefmt=\"plain\"))\nitem      qty\nspam       42\neggs      451\nbacon       0\n\n```\n\n`simple` is the default format (the default may change in future\nversions). It corresponds to `simple_tables` in [Pandoc Markdown\nextensions](http://johnmacfarlane.net/pandoc/README.html#tables):\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"simple\"))\nitem      qty\n------  -----\nspam       42\neggs      451\nbacon       0\n\n```\n\n`github` follows the conventions of GitHub flavored Markdown. It\ncorresponds to the `pipe` format without alignment colons:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"github\"))\n| item   |   qty |\n|--------|-------|\n| spam   |    42 |\n| eggs   |   451 |\n| bacon  |     0 |\n\n```\n\n`grid` is like tables formatted by Emacs'\n[table.el](http://table.sourceforge.net/) package. It corresponds to\n`grid_tables` in Pandoc Markdown extensions:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"grid\"))\n+--------+-------+\n| item   |   qty |\n+========+=======+\n| spam   |    42 |\n+--------+-------+\n| eggs   |   451 |\n+--------+-------+\n| bacon  |     0 |\n+--------+-------+\n\n```\n\n`simple_grid` draws a grid using single-line box-drawing characters:\n\n    >>> print(tabulate(table, headers, tablefmt=\"simple_grid\"))\n    ┌────────┬───────┐\n    │ item   │   qty │\n    ├────────┼───────┤\n    │ spam   │    42 │\n    ├────────┼───────┤\n    │ eggs   │   451 │\n    ├────────┼───────┤\n    │ bacon  │     0 │\n    └────────┴───────┘\n\n`rounded_grid` draws a grid using single-line box-drawing characters with rounded corners:\n\n    >>> print(tabulate(table, headers, tablefmt=\"rounded_grid\"))\n    ╭────────┬───────╮\n    │ item   │   qty │\n    ├────────┼───────┤\n    │ spam   │    42 │\n    ├────────┼───────┤\n    │ eggs   │   451 │\n    ├────────┼───────┤\n    │ bacon  │     0 │\n    ╰────────┴───────╯\n\n`heavy_grid` draws a grid using bold (thick) single-line box-drawing characters:\n\n    >>> print(tabulate(table, headers, tablefmt=\"heavy_grid\"))\n    ┏━━━━━━━━┳━━━━━━━┓\n    ┃ item   ┃   qty ┃\n    ┣━━━━━━━━╋━━━━━━━┫\n    ┃ spam   ┃    42 ┃\n    ┣━━━━━━━━╋━━━━━━━┫\n    ┃ eggs   ┃   451 ┃\n    ┣━━━━━━━━╋━━━━━━━┫\n    ┃ bacon  ┃     0 ┃\n    ┗━━━━━━━━┻━━━━━━━┛\n\n`mixed_grid` draws a grid using a mix of light (thin) and heavy (thick) lines box-drawing characters:\n\n    >>> print(tabulate(table, headers, tablefmt=\"mixed_grid\"))\n    ┍━━━━━━━━┯━━━━━━━┑\n    │ item   │   qty │\n    ┝━━━━━━━━┿━━━━━━━┥\n    │ spam   │    42 │\n    ├────────┼───────┤\n    │ eggs   │   451 │\n    ├────────┼───────┤\n    │ bacon  │     0 │\n    ┕━━━━━━━━┷━━━━━━━┙\n\n`double_grid` draws a grid using double-line box-drawing characters:\n\n    >>> print(tabulate(table, headers, tablefmt=\"double_grid\"))\n    ╔════════╦═══════╗\n    ║ item   ║   qty ║\n    ╠════════╬═══════╣\n    ║ spam   ║    42 ║\n    ╠════════╬═══════╣\n    ║ eggs   ║   451 ║\n    ╠════════╬═══════╣\n    ║ bacon  ║     0 ║\n    ╚════════╩═══════╝\n\n`fancy_grid` draws a grid using a mix of single and\n    double-line box-drawing characters:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"fancy_grid\"))\n╒════════╤═══════╕\n│ item   │   qty │\n╞════════╪═══════╡\n│ spam   │    42 │\n├────────┼───────┤\n│ eggs   │   451 │\n├────────┼───────┤\n│ bacon  │     0 │\n╘════════╧═══════╛\n\n```\n\n`colon_grid` is similar to `grid` but uses colons only to define\ncolumnwise content alignment , without whitespace padding,\nsimilar the alignment specification of Pandoc `grid_tables`:\n\n    >>> print(tabulate([[\"spam\", 41.9999], [\"eggs\", \"451.0\"]],\n    ...                [\"strings\", \"numbers\"], \"colon_grid\",\n    ...                colalign=[\"right\", \"left\"]))\n    +-----------+-----------+\n    | strings   | numbers   |\n    +==========:+:==========+\n    | spam      | 41.9999   |\n    +-----------+-----------+\n    | eggs      | 451       |\n    +-----------+-----------+\n\n\n`outline` is the same as the `grid` format but doesn't draw lines between rows:\n\n    >>> print(tabulate(table, headers, tablefmt=\"outline\"))\n    +--------+-------+\n    | item   |   qty |\n    +========+=======+\n    | spam   |    42 |\n    | eggs   |   451 |\n    | bacon  |     0 |\n    +--------+-------+\n\n`simple_outline` is the same as the `simple_grid` format but doesn't draw lines between rows:\n\n    >>> print(tabulate(table, headers, tablefmt=\"simple_outline\"))\n    ┌────────┬───────┐\n    │ item   │   qty │\n    ├────────┼───────┤\n    │ spam   │    42 │\n    │ eggs   │   451 │\n    │ bacon  │     0 │\n    └────────┴───────┘\n\n`rounded_outline` is the same as the `rounded_grid` format but doesn't draw lines between rows:\n\n    >>> print(tabulate(table, headers, tablefmt=\"rounded_outline\"))\n    ╭────────┬───────╮\n    │ item   │   qty │\n    ├────────┼───────┤\n    │ spam   │    42 │\n    │ eggs   │   451 │\n    │ bacon  │     0 │\n    ╰────────┴───────╯\n\n`heavy_outline` is the same as the `heavy_grid` format but doesn't draw lines between rows:\n\n    >>> print(tabulate(table, headers, tablefmt=\"heavy_outline\"))\n    ┏━━━━━━━━┳━━━━━━━┓\n    ┃ item   ┃   qty ┃\n    ┣━━━━━━━━╋━━━━━━━┫\n    ┃ spam   ┃    42 ┃\n    ┃ eggs   ┃   451 ┃\n    ┃ bacon  ┃     0 ┃\n    ┗━━━━━━━━┻━━━━━━━┛\n\n`mixed_outline` is the same as the `mixed_grid` format but doesn't draw lines between rows:\n\n    >>> print(tabulate(table, headers, tablefmt=\"mixed_outline\"))\n    ┍━━━━━━━━┯━━━━━━━┑\n    │ item   │   qty │\n    ┝━━━━━━━━┿━━━━━━━┥\n    │ spam   │    42 │\n    │ eggs   │   451 │\n    │ bacon  │     0 │\n    ┕━━━━━━━━┷━━━━━━━┙\n\n`double_outline` is the same as the `double_grid` format but doesn't draw lines between rows:\n\n    >>> print(tabulate(table, headers, tablefmt=\"double_outline\"))\n    ╔════════╦═══════╗\n    ║ item   ║   qty ║\n    ╠════════╬═══════╣\n    ║ spam   ║    42 ║\n    ║ eggs   ║   451 ║\n    ║ bacon  ║     0 ║\n    ╚════════╩═══════╝\n\n`fancy_outline` is the same as the `fancy_grid` format but doesn't draw lines between rows:\n\n    >>> print(tabulate(table, headers, tablefmt=\"fancy_outline\"))\n    ╒════════╤═══════╕\n    │ item   │   qty │\n    ╞════════╪═══════╡\n    │ spam   │    42 │\n    │ eggs   │   451 │\n    │ bacon  │     0 │\n    ╘════════╧═══════╛\n\n`presto` is like tables formatted by Presto cli:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"presto\"))\n item   |   qty\n--------+-------\n spam   |    42\n eggs   |   451\n bacon  |     0\n\n```\n\n`pretty` attempts to be close to the format emitted by the PrettyTables\nlibrary:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"pretty\"))\n+-------+-----+\n| item  | qty |\n+-------+-----+\n| spam  | 42  |\n| eggs  | 451 |\n| bacon |  0  |\n+-------+-----+\n\n```\n\n`psql` is like tables formatted by Postgres' psql cli:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"psql\"))\n+--------+-------+\n| item   |   qty |\n|--------+-------|\n| spam   |    42 |\n| eggs   |   451 |\n| bacon  |     0 |\n+--------+-------+\n\n```\n\n`pipe` follows the conventions of [PHP Markdown\nExtra](http://michelf.ca/projects/php-markdown/extra/#table) extension.\nIt corresponds to `pipe_tables` in Pandoc. This format uses colons to\nindicate column alignment:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"pipe\"))\n| item   |   qty |\n|:-------|------:|\n| spam   |    42 |\n| eggs   |   451 |\n| bacon  |     0 |\n\n```\n\n`asciidoc` formats data like a simple table of the\n[AsciiDoctor](https://docs.asciidoctor.org/asciidoc/latest/syntax-quick-reference/#tables)\nformat:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"asciidoc\"))\n[cols=\"<8,>7\",options=\"header\"]\n|====\n| item   |   qty\n| spam   |    42\n| eggs   |   451\n| bacon  |     0\n|====\n\n```\n\n`orgtbl` follows the conventions of Emacs\n[org-mode](http://orgmode.org/manual/Tables.html), and is editable also\nin the minor orgtbl-mode. Hence its name:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"orgtbl\"))\n| item   |   qty |\n|--------+-------|\n| spam   |    42 |\n| eggs   |   451 |\n| bacon  |     0 |\n\n```\n\n`jira` follows the conventions of Atlassian Jira markup language:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"jira\"))\n|| item   ||   qty ||\n| spam   |    42 |\n| eggs   |   451 |\n| bacon  |     0 |\n\n```\n\n`rst` formats data like a simple table of the\n[reStructuredText](http://docutils.sourceforge.net/docs/user/rst/quickref.html#tables)\nformat:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"rst\"))\n======  =====\nitem      qty\n======  =====\nspam       42\neggs      451\nbacon       0\n======  =====\n\n```\n\n`mediawiki` format produces a table markup used in\n[Wikipedia](http://www.mediawiki.org/wiki/Help:Tables) and on other\nMediaWiki-based sites:\n\n ```pycon\n>>> print(tabulate(table, headers, tablefmt=\"mediawiki\"))\n{| class=\"wikitable\" style=\"text-align: left;\"\n|+ <!-- caption -->\n|-\n! item   !! style=\"text-align: right;\"|   qty\n|-\n| spam   || style=\"text-align: right;\"|    42\n|-\n| eggs   || style=\"text-align: right;\"|   451\n|-\n| bacon  || style=\"text-align: right;\"|     0\n|}\n\n```\n\n`moinmoin` format produces a table markup used in\n[MoinMoin](https://moinmo.in/) wikis:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"moinmoin\"))\n|| ''' item   ''' ||<style=\"text-align: right;\"> '''   qty ''' ||\n||  spam    ||<style=\"text-align: right;\">     42  ||\n||  eggs    ||<style=\"text-align: right;\">    451  ||\n||  bacon   ||<style=\"text-align: right;\">      0  ||\n\n```\n\n`youtrack` format produces a table markup used in Youtrack tickets:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"youtrack\"))\n||  item    ||    qty  ||\n|  spam    |     42  |\n|  eggs    |    451  |\n|  bacon   |      0  |\n\n```\n\n`textile` format produces a table markup used in\n[Textile](http://redcloth.org/hobix.com/textile/) format:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"textile\"))\n|_.  item   |_.   qty |\n|<. spam    |>.    42 |\n|<. eggs    |>.   451 |\n|<. bacon   |>.     0 |\n\n```\n\n`html` produces standard HTML markup as an html.escape'd str\nwith a ._repr_html_ method so that Jupyter Lab and Notebook display the HTML\nand a .str property so that the raw HTML remains accessible.\n`unsafehtml` table format can be used if an unescaped HTML is required:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"html\"))\n<table>\n<thead>\n<tr><th>item  </th><th style=\"text-align: right;\">  qty</th></tr>\n</thead>\n<tbody>\n<tr><td>spam  </td><td style=\"text-align: right;\">   42</td></tr>\n<tr><td>eggs  </td><td style=\"text-align: right;\">  451</td></tr>\n<tr><td>bacon </td><td style=\"text-align: right;\">    0</td></tr>\n</tbody>\n</table>\n\n```\n\n`latex` format creates a `tabular` environment for LaTeX markup,\nreplacing special characters like `_` or `\\` to their LaTeX\ncorrespondents:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"latex\"))\n\\begin{tabular}{lr}\n\\hline\n item   &   qty \\\\\n\\hline\n spam   &    42 \\\\\n eggs   &   451 \\\\\n bacon  &     0 \\\\\n\\hline\n\\end{tabular}\n\n```\n\n`latex_raw` behaves like `latex` but does not escape LaTeX commands and\nspecial characters.\n\n`latex_booktabs` creates a `tabular` environment for LaTeX markup using\nspacing and style from the `booktabs` package.\n\n`latex_longtable` creates a table that can stretch along multiple pages,\nusing the `longtable` package.\n\n### Column alignment\n\n`tabulate` is smart about column alignment. It detects columns which\ncontain only numbers, and aligns them by a decimal point (or flushes\nthem to the right if they appear to be integers). Text columns are\nflushed to the left.\n\nYou can override the default alignment with `numalign` and `stralign`\nnamed arguments. Possible column alignments are: `right`, `center`,\n`left`, `decimal` (only for numbers), and `None` (to disable alignment).\n\nAligning by a decimal point works best when you need to compare numbers\nat a glance:\n\n```pycon\n>>> print(tabulate([[1.2345],[123.45],[12.345],[12345],[1234.5]]))\n----------\n    1.2345\n  123.45\n   12.345\n12345\n 1234.5\n----------\n\n```\n\nCompare this with a more common right alignment:\n\n```pycon\n>>> print(tabulate([[1.2345],[123.45],[12.345],[12345],[1234.5]], numalign=\"right\"))\n------\n1.2345\n123.45\n12.345\n 12345\n1234.5\n------\n\n```\n\nFor `tabulate`, anything which can be parsed as a number is a number.\nEven numbers represented as strings are aligned properly. This feature\ncomes in handy when reading a mixed table of text and numbers from a\nfile:\n\n```pycon\n>>> import csv; from io import StringIO\n>>> table = list(csv.reader(StringIO(\"spam, 42\\neggs, 451\\n\")))\n>>> table\n[['spam', ' 42'], ['eggs', ' 451']]\n>>> print(tabulate(table))\n----  ----\nspam    42\neggs   451\n----  ----\n\n```\n\nTo disable this feature use `disable_numparse=True`.\n\n```pycon\n>>> print(tabulate([[\"Ver1\", \"18.0\"], [\"Ver2\",\"19.2\"]], tablefmt=\"simple\", disable_numparse=True))\n----  ----\nVer1  18.0\nVer2  19.2\n----  ----\n\n```\n\n### Custom column alignment\n\n`tabulate` allows a custom column alignment to override the smart alignment described above.\nUse `colglobalalign` to define a global setting. Possible alignments are: `right`, `center`, `left`, `decimal` (only for numbers).\nFurthermore, you can define `colalign` for column-specific alignment as a list or a tuple. Possible values are `global` (keeps global setting), `right`, `center`, `left`, `decimal` (only for numbers), `None` (to disable alignment). Missing alignments are treated as `global`.\n\n```pycon\n>>> print(tabulate([[1,2,3,4],[111,222,333,444]], colglobalalign='center', colalign = ('global','left','right')))\n---  ---  ---  ---\n 1   2      3   4\n111  222  333  444\n---  ---  ---  ---\n\n```\n\n### Custom header alignment\n\nHeaders' alignment can be defined separately from columns'. Like for columns, you can use:\n- `headersglobalalign` to define a header-specific global alignment setting. Possible values are `right`, `center`, `left`, `None` (to follow column alignment),\n- `headersalign` list or tuple to further specify header-wise alignment. Possible values are `global` (keeps global setting), `same` (follow column alignment), `right`, `center`, `left`, `None` (to disable alignment). Missing alignments are treated as `global`.\n\n```pycon\n>>> print(tabulate([[1,2,3,4,5,6],[111,222,333,444,555,666]], colglobalalign = 'center', colalign = ('left',), headers = ['h','e','a','d','e','r'], headersglobalalign = 'right', headersalign = ('same','same','left','global','center')))\nh     e   a      d   e     r\n---  ---  ---  ---  ---  ---\n1     2    3    4    5    6\n111  222  333  444  555  666\n\n```\n\n### Number formatting\n\n`tabulate` allows to define custom number formatting applied to all\ncolumns of decimal numbers. Use `floatfmt` named argument:\n\n```pycon\n>>> print(tabulate([[\"pi\",3.141593],[\"e\",2.718282]], floatfmt=\".4f\"))\n--  ------\npi  3.1416\ne   2.7183\n--  ------\n\n```\n\n`floatfmt` argument can be a list or a tuple of format strings, one per\ncolumn, in which case every column may have different number formatting:\n\n```pycon\n>>> print(tabulate([[0.12345, 0.12345, 0.12345]], floatfmt=(\".1f\", \".3f\")))\n---  -----  -------\n0.1  0.123  0.12345\n---  -----  -------\n\n```\n\n`intfmt` works similarly for integers\n\n    >>> print(tabulate([[\"a\",1000],[\"b\",90000]], intfmt=\",\"))\n    -  ------\n    a   1,000\n    b  90,000\n    -  ------\n\n\n### Type Deduction and Missing Values\n\nWhen `tabulate` sees numerical data (with our without comma separators), it\nattempts to align the column on the decimal point.  However, if it observes\nnon-numerical data in the column, it aligns it to the left by default.  If\ndata is missing in a column (either None or empty values), the remaining\ndata in the column is used to infer the type:\n\n```pycon\n>>> from fractions import Fraction\n>>> test_table = [\n...    [None, \"1.23423515351\", Fraction(1, 3)],\n...    [Fraction(56789, 1000000), 12345.1, b\"abc\"],\n...    [\"\", b\"\", None],\n...    [Fraction(10000, 3), None, \"\"],\n... ]\n>>> print(tabulate(test_table, floatfmt=\",.5g\", missingval=\"?\"))\n------------  -----------  ---\n    ?              1.2342  1/3\n    0.056789  12,345       abc\n                           ?\n3,333.3            ?\n------------  -----------  ---\n\n```\n\nThe deduced type (eg. str, float) influences the rendering of any types\nthat have alternative representations.  For example, since `Fraction` has\nmethods `__str__` and `__float__` defined (and hence is convertible to a\n`float` and also has a `str` representation), the appropriate\nrepresentation is selected for the column's deduced type.  In order to not\nlose precision accidentally, types having both an `__int__` and\n`__float__` representation will be considered a `float`.\n\nTherefore, if your table contains types convertible to int/float but you'd\n*prefer* they be represented as strings, or your strings *might* all look\nlike numbers such as \"1e23\": either convert them to the desired\nrepresentation before you `tabulate`, or ensure that the column always\ncontains at least one other `str`.\n\n### Text formatting\n\nBy default, `tabulate` removes leading and trailing whitespace from text\ncolumns. To disable whitespace removal, pass `preserve_whitespace=True`.\nOlder versions of the library used a global module-level flag PRESERVE_WHITESPACE.\n\n### Wide (fullwidth CJK) symbols\n\nTo properly align tables which contain wide characters (typically\nfullwidth glyphs from Chinese, Japanese or Korean languages), the user\nshould install `wcwidth` library. To install it together with\n`tabulate`:\n\n```shell\npip install tabulate[widechars]\n```\n\nWide character support is enabled automatically if `wcwidth` library is\nalready installed. To disable wide characters support without\nuninstalling `wcwidth`, set the global module-level flag\n`WIDE_CHARS_MODE`:\n\n```python\nimport tabulate\ntabulate.WIDE_CHARS_MODE = False\n```\n\n### Multiline cells\n\nMost table formats support multiline cell text (text containing newline\ncharacters). The newline characters are honored as line break\ncharacters.\n\nMultiline cells are supported for data rows and for header rows.\n\nFurther automatic line breaks are not inserted. Of course, some output\nformats such as latex or html handle automatic formatting of the cell\ncontent on their own, but for those that don't, the newline characters\nin the input cell text are the only means to break a line in cell text.\n\nNote that some output formats (e.g. simple, or plain) do not represent\nrow delimiters, so that the representation of multiline cells in such\nformats may be ambiguous to the reader.\n\nThe following examples of formatted output use the following table with\na multiline cell, and headers with a multiline cell:\n\n```pycon\n>>> table = [[\"eggs\",451],[\"more\\nspam\",42]]\n>>> headers = [\"item\\nname\", \"qty\"]\n\n```\n\n`plain` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"plain\"))\nitem      qty\nname\neggs      451\nmore       42\nspam\n\n```\n\n`simple` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"simple\"))\nitem      qty\nname\n------  -----\neggs      451\nmore       42\nspam\n\n```\n\n`grid` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"grid\"))\n+--------+-------+\n| item   |   qty |\n| name   |       |\n+========+=======+\n| eggs   |   451 |\n+--------+-------+\n| more   |    42 |\n| spam   |       |\n+--------+-------+\n\n```\n\n`fancy_grid` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"fancy_grid\"))\n╒════════╤═══════╕\n│ item   │   qty │\n│ name   │       │\n╞════════╪═══════╡\n│ eggs   │   451 │\n├────────┼───────┤\n│ more   │    42 │\n│ spam   │       │\n╘════════╧═══════╛\n\n```\n\n`pipe` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"pipe\"))\n| item   |   qty |\n| name   |       |\n|:-------|------:|\n| eggs   |   451 |\n| more   |    42 |\n| spam   |       |\n\n```\n\n`orgtbl` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"orgtbl\"))\n| item   |   qty |\n| name   |       |\n|--------+-------|\n| eggs   |   451 |\n| more   |    42 |\n| spam   |       |\n\n```\n\n`jira` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"jira\"))\n|| item   ||   qty ||\n|| name   ||       ||\n| eggs   |   451 |\n| more   |    42 |\n| spam   |       |\n\n```\n\n`presto` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"presto\"))\n item   |   qty\n name   |\n--------+-------\n eggs   |   451\n more   |    42\n spam   |\n\n```\n\n`pretty` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"pretty\"))\n+------+-----+\n| item | qty |\n| name |     |\n+------+-----+\n| eggs | 451 |\n| more | 42  |\n| spam |     |\n+------+-----+\n\n```\n\n`psql` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"psql\"))\n+--------+-------+\n| item   |   qty |\n| name   |       |\n|--------+-------|\n| eggs   |   451 |\n| more   |    42 |\n| spam   |       |\n+--------+-------+\n\n```\n\n`rst` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"rst\"))\n======  =====\nitem      qty\nname\n======  =====\neggs      451\nmore       42\nspam\n======  =====\n\n```\n\nMultiline cells are not well-supported for the other table formats.\n\n### Automating Multilines\nWhile tabulate supports data passed in with multilines entries explicitly provided,\nit also provides some support to help manage this work internally.\n\nThe `maxcolwidths` argument is a list where each entry specifies the max width for\nit's respective column. Any cell that will exceed this will automatically wrap the content.\nTo assign the same max width for all columns, a singular int scaler can be used.\n\nUse `None` for any columns where an explicit maximum does not need to be provided,\nand thus no automate multiline wrapping will take place.\n\nThe wrapping uses the python standard [textwrap.wrap](https://docs.python.org/3/library/textwrap.html#textwrap.wrap)\nfunction with default parameters - aside from width.\n\nThis example demonstrates usage of automatic multiline wrapping, though typically\nthe lines being wrapped would probably be significantly longer than this.\n\n```pycon\n>>> print(tabulate([[\"John Smith\", \"Middle Manager\"]], headers=[\"Name\", \"Title\"], tablefmt=\"grid\", maxcolwidths=[None, 8]))\n+------------+---------+\n| Name       | Title   |\n+============+=========+\n| John Smith | Middle  |\n|            | Manager |\n+------------+---------+\n\n```\n\nText is preferably wrapped on whitespaces and right after the hyphens in hyphenated words.\n\nbreak_long_words (default: True)  If true, then words longer than width will be broken in order to ensure that no lines are longer than width.\nIf it is false, long words will not be broken, and some lines may be longer than width.\n(Long words will be put on a line by themselves, in order to minimize the amount by which width is exceeded.)\n\nbreak_on_hyphens (default: True) If true, wrapping will occur preferably on whitespaces and right after hyphens in compound words, as it is customary in English.\nIf false, only whitespaces will be considered as potentially good places for line breaks.\n\n```pycon\n>>> print(tabulate([[\"John Smith\", \"Middle-Manager\"]], headers=[\"Name\", \"Title\"], tablefmt=\"grid\", maxcolwidths=[None, 5], break_long_words=False))\n+------------+---------+\n| Name       | Title   |\n+============+=========+\n| John Smith | Middle- |\n|            | Manager |\n+------------+---------+\n>>> print(tabulate([[\"John Smith\", \"Middle-Manager\"]], headers=[\"Name\", \"Title\"], tablefmt=\"grid\", maxcolwidths=[None, 5], break_long_words=False, break_on_hyphens=False))\n+------------+----------------+\n| Name       | Title          |\n+============+================+\n| John Smith | Middle-Manager |\n+------------+----------------+\n```\n\n### Adding Separating lines\nOne might want to add one or more separating lines to highlight different sections in a table.\n\nThe separating lines will be of the same type as the one defined by the specified formatter as either the\nlinebetweenrows, linebelowheader, linebelow, lineabove or just a simple empty line when none is defined for the formatter\n\n\n    >>> from tabulate import tabulate, SEPARATING_LINE\n\n    table = [[\"Earth\",6371],\n             [\"Mars\",3390],\n             SEPARATING_LINE,\n             [\"Moon\",1737]]\n    print(tabulate(table, tablefmt=\"simple\"))\n    -----  ----\n    Earth  6371\n    Mars   3390\n    -----  ----\n    Moon   1737\n    -----  ----\n\n### ANSI support\nANSI escape codes are non-printable byte sequences usually used for terminal operations like setting\ncolor output or modifying cursor positions. Because multi-byte ANSI sequences are inherently non-printable,\nthey can still introduce unwanted extra length to strings. For example:\n\n    >>> len('\\033[31mthis text is red\\033[0m')  # printable length is 16\n    25\n\nTo deal with this, string lengths are calculated after first removing all ANSI escape sequences. This ensures\nthat the actual printable length is used for column widths, rather than the byte length. In the final, printable\ntable, however, ANSI escape sequences are not removed so the original styling is preserved.\n\nSome terminals support a special grouping of ANSI escape sequences that are intended to display hyperlinks\nmuch in the same way they are shown in browsers. These are handled just as mentioned before: non-printable\nANSI escape sequences are removed prior to string length calculation. The only difference with escaped\nhyperlinks is that column width will be based on the length of the URL _text_ rather than the URL\nitself (terminals would show this text). For example:\n\n    >>> len('\\x1b]8;;https://example.com\\x1b\\\\example\\x1b]8;;\\x1b\\\\')  # display length is 7, showing 'example'\n    40\n\n\nUsage of the command line utility\n---------------------------------\n\n    Usage: tabulate [options] [FILE ...]\n\n    FILE                      a filename of the file with tabular data;\n                              if \"-\" or missing, read data from stdin.\n\n    Options:\n\n    -h, --help                show this message\n    -1, --header              use the first row of data as a table header\n    -o FILE, --output FILE    print table to FILE (default: stdout)\n    -s REGEXP, --sep REGEXP   use a custom column separator (default: whitespace)\n    -F FPFMT, --float FPFMT   floating point number format (default: g)\n    -I INTFMT, --int INTFMT   integer point number format (default: \"\")\n    -f FMT, --format FMT      set output table format; supported formats:\n                              plain, simple, github, grid, fancy_grid, pipe,\n                              orgtbl, rst, mediawiki, html, latex, latex_raw,\n                              latex_booktabs, latex_longtable, tsv\n                              (default: simple)\n\nPerformance considerations\n--------------------------\n\nSuch features as decimal point alignment and trying to parse everything\nas a number imply that `tabulate`:\n\n-   has to \"guess\" how to print a particular tabular data type\n-   needs to keep the entire table in-memory\n-   has to \"transpose\" the table twice\n-   does much more work than it may appear\n\nIt may not be suitable for serializing really big tables (but who's\ngoing to do that, anyway?) or printing tables in performance sensitive\napplications. `tabulate` is about two orders of magnitude slower than\nsimply joining lists of values with a tab, comma, or other separator.\n\nAt the same time, `tabulate` is comparable to other table\npretty-printers. Given a 10x10 table (a list of lists) of mixed text and\nnumeric data, `tabulate` appears to be faster than `PrettyTable` and `texttable`.\nThe following mini-benchmark was run in Python 3.13.7 on Windows 11 (x64):\n\n    ==================================  ==========  ===========\n    Table formatter                       time, μs    rel. time\n    ==================================  ==========  ===========\n    csv to StringIO                           11.9          1.0\n    join with tabs and newlines               12.1          1.0\n    PrettyTable (3.17.0)                     468.0         39.3\n    tabulate (0.10.0)                        553.4         46.5\n    tabulate (0.10.0, WIDE_CHARS_MODE)       612.2         51.4\n    texttable (1.7.0)                       1071.4         90.0\n    ==================================  ==========  ===========\n\n\nVersion history\n---------------\n\nThe full version history can be found at the [changelog](https://github.com/astanin/python-tabulate/blob/master/CHANGELOG).\n\nHow to contribute\n-----------------\n\nContributions should include tests and an explanation for the changes\nthey propose. Documentation (examples, docstrings, README.md) should be\nupdated accordingly.\n\nThis project uses [pytest](https://docs.pytest.org/) testing\nframework and [tox](https://tox.readthedocs.io/) to automate testing in\ndifferent environments. Add tests to one of the files in the `test/`\nfolder.\n\nTo run tests on all supported Python versions, make sure all Python\ninterpreters, `pytest` and `tox` are installed, then run `tox` in the root\nof the project source tree.\n\nOn Linux `tox` expects to find executables like `python3.11`, `python3.12` etc.\nOn Windows it looks for `C:\\Python311\\python.exe`, `C:\\Python312\\python.exe` etc. respectively.\n\nOne way to install all the required versions of the Python interpreter is to use [pyenv](https://github.com/pyenv/pyenv).\nAll versions can then be easily installed with something like:\n\n     pyenv install 3.11.7\n     pyenv install 3.12.1\n     ...\n\nDon't forget to change your `PATH` so that `tox` knows how to find all the installed versions. Something like\n\n     export PATH=\"${PATH}:${HOME}/.pyenv/shims\"\n\nTo test only some Python environments, use `-e` option. For example, to\ntest only against Python 3.11 and Python 3.12, run:\n\n```shell\ntox -e py311,py312\n```\n\nin the root of the project source tree.\n\nTo enable NumPy and Pandas tests, run:\n\n```shell\ntox -e py311-extra,py312-extra\n```\n\n(this may take a long time the first time, because NumPy and Pandas will\nhave to be installed in the new virtual environments)\n\nTo fix code formatting:\n\n```shell\ntox -e lint\n```\n\nSee `tox.ini` file to learn how to use to test\nindividual Python versions.\n\nTo test the \"doctest\" examples and their outputs in `README.md`:\n\n```shell\npython3 -m pip install pytest-doctestplus[md]\npython3 -m doctest README.md\n```\n\nContributors\n------------\n\nSergey Astanin, Pau Tallada Crespí, Erwin Marsi, Mik Kocikowski, Bill\nRyder, Zach Dwiel, Frederik Rietdijk, Philipp Bogensberger, Greg\n(anonymous), Stefan Tatschner, Emiel van Miltenburg, Brandon Bennett,\nAmjith Ramanujam, Jan Schulz, Simon Percivall, Javier Santacruz\nLópez-Cepero, Sam Denton, Alexey Ziyangirov, acaird, Cesar Sanchez,\nnaught101, John Vandenberg, Zack Dever, Christian Clauss, Benjamin\nMaier, Andy MacKinlay, Thomas Roten, Jue Wang, Joe King, Samuel Phan,\nNick Satterly, Daniel Robbins, Dmitry B, Lars Butler, Andreas Maier,\nDick Marinus, Sébastien Celles, Yago González, Andrew Gaul, Wim Glenn,\nJean Michel Rouly, Tim Gates, John Vandenberg, Sorin Sbarnea,\nWes Turner, Andrew Tija, Marco Gorelli, Sean McGinnis, danja100,\nendolith, Dominic Davis-Foster, pavlocat, Daniel Aslau, paulc,\nFelix Yan, Shane Loretz, Frank Busse, Harsh Singh, Derek Weitzel,\nVladimir Vrzić, 서승우 (chrd5273), Georgy Frolov, Christian Cwienk,\nBart Broere, Vilhelm Prytz, Alexander Gažo, Hugo van Kemenade,\njamescooke, Matt Warner, Jérôme Provensal, Michał Górny, Kevin Deldycke,\nKian-Meng Ang, Kevin Patterson, Shodhan Save, cleoold, KOLANICH,\nVijaya Krishna Kasula, Furcy Pin, Christian Fibich, Shaun Duncan,\nDimitri Papadopoulos, Élie Goudout, Racerroar888, Phill Zarfos,\nKeyacom, Andrew Coffey, Arpit Jain, Israel Roldan, ilya112358,\nDan Nicholson, Frederik Scheerer, cdar07 (cdar), Racerroar888,\nPerry Kundert.\n",
        "description_content_type": "text/markdown",
        "author_email": "Sergey Astanin <s.astanin@gmail.com>",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 4 - Beta",
          "Operating System :: OS Independent",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Topic :: Software Development :: Libraries"
        ],
        "requires_dist": [
          "wcwidth; extra == \"widechars\""
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Homepage, https://github.com/astanin/python-tabulate"
        ],
        "provides_extra": [
          "widechars"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/tabulate-0.10.0.dist-info",
      "installer": "uv",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "rich",
        "version": "14.3.3",
        "summary": "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal",
        "description": "[![Supported Python Versions](https://img.shields.io/pypi/pyversions/rich)](https://pypi.org/project/rich/) [![PyPI version](https://badge.fury.io/py/rich.svg)](https://badge.fury.io/py/rich)\n\n[![Downloads](https://pepy.tech/badge/rich/month)](https://pepy.tech/project/rich)\n[![codecov](https://img.shields.io/codecov/c/github/Textualize/rich?label=codecov&logo=codecov)](https://codecov.io/gh/Textualize/rich)\n[![Rich blog](https://img.shields.io/badge/blog-rich%20news-yellowgreen)](https://www.willmcgugan.com/tag/rich/)\n[![Twitter Follow](https://img.shields.io/twitter/follow/willmcgugan.svg?style=social)](https://twitter.com/willmcgugan)\n\n![Logo](https://github.com/textualize/rich/raw/master/imgs/logo.svg)\n\n[English readme](https://github.com/textualize/rich/blob/master/README.md)\n • [简体中文 readme](https://github.com/textualize/rich/blob/master/README.cn.md)\n • [正體中文 readme](https://github.com/textualize/rich/blob/master/README.zh-tw.md)\n • [Lengua española readme](https://github.com/textualize/rich/blob/master/README.es.md)\n • [Deutsche readme](https://github.com/textualize/rich/blob/master/README.de.md)\n • [Läs på svenska](https://github.com/textualize/rich/blob/master/README.sv.md)\n • [日本語 readme](https://github.com/textualize/rich/blob/master/README.ja.md)\n • [한국어 readme](https://github.com/textualize/rich/blob/master/README.kr.md)\n • [Français readme](https://github.com/textualize/rich/blob/master/README.fr.md)\n • [Schwizerdütsch readme](https://github.com/textualize/rich/blob/master/README.de-ch.md)\n • [हिन्दी readme](https://github.com/textualize/rich/blob/master/README.hi.md)\n • [Português brasileiro readme](https://github.com/textualize/rich/blob/master/README.pt-br.md)\n • [Italian readme](https://github.com/textualize/rich/blob/master/README.it.md)\n • [Русский readme](https://github.com/textualize/rich/blob/master/README.ru.md)\n • [Indonesian readme](https://github.com/textualize/rich/blob/master/README.id.md)\n • [فارسی readme](https://github.com/textualize/rich/blob/master/README.fa.md)\n • [Türkçe readme](https://github.com/textualize/rich/blob/master/README.tr.md)\n • [Polskie readme](https://github.com/textualize/rich/blob/master/README.pl.md)\n\n\nRich is a Python library for _rich_ text and beautiful formatting in the terminal.\n\nThe [Rich API](https://rich.readthedocs.io/en/latest/) makes it easy to add color and style to terminal output. Rich can also render pretty tables, progress bars, markdown, syntax highlighted source code, tracebacks, and more — out of the box.\n\n![Features](https://github.com/textualize/rich/raw/master/imgs/features.png)\n\nFor a video introduction to Rich see [calmcode.io](https://calmcode.io/rich/introduction.html) by [@fishnets88](https://twitter.com/fishnets88).\n\nSee what [people are saying about Rich](https://www.willmcgugan.com/blog/pages/post/rich-tweets/).\n\n## Compatibility\n\nRich works with Linux, macOS and Windows. True color / emoji works with new Windows Terminal, classic terminal is limited to 16 colors. Rich requires Python 3.8 or later.\n\nRich works with [Jupyter notebooks](https://jupyter.org/) with no additional configuration required.\n\n## Installing\n\nInstall with `pip` or your favorite PyPI package manager.\n\n```sh\npython -m pip install rich\n```\n\nRun the following to test Rich output on your terminal:\n\n```sh\npython -m rich\n```\n\n## Rich Print\n\nTo effortlessly add rich output to your application, you can import the [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start) method, which has the same signature as the builtin Python function. Try this:\n\n```python\nfrom rich import print\n\nprint(\"Hello, [bold magenta]World[/bold magenta]!\", \":vampire:\", locals())\n```\n\n![Hello World](https://github.com/textualize/rich/raw/master/imgs/print.png)\n\n## Rich REPL\n\nRich can be installed in the Python REPL, so that any data structures will be pretty printed and highlighted.\n\n```python\n>>> from rich import pretty\n>>> pretty.install()\n```\n\n![REPL](https://github.com/textualize/rich/raw/master/imgs/repl.png)\n\n## Using the Console\n\nFor more control over rich terminal content, import and construct a [Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console) object.\n\n```python\nfrom rich.console import Console\n\nconsole = Console()\n```\n\nThe Console object has a `print` method which has an intentionally similar interface to the builtin `print` function. Here's an example of use:\n\n```python\nconsole.print(\"Hello\", \"World!\")\n```\n\nAs you might expect, this will print `\"Hello World!\"` to the terminal. Note that unlike the builtin `print` function, Rich will word-wrap your text to fit within the terminal width.\n\nThere are a few ways of adding color and style to your output. You can set a style for the entire output by adding a `style` keyword argument. Here's an example:\n\n```python\nconsole.print(\"Hello\", \"World!\", style=\"bold red\")\n```\n\nThe output will be something like the following:\n\n![Hello World](https://github.com/textualize/rich/raw/master/imgs/hello_world.png)\n\nThat's fine for styling a line of text at a time. For more finely grained styling, Rich renders a special markup which is similar in syntax to [bbcode](https://en.wikipedia.org/wiki/BBCode). Here's an example:\n\n```python\nconsole.print(\"Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].\")\n```\n\n![Console Markup](https://github.com/textualize/rich/raw/master/imgs/where_there_is_a_will.png)\n\nYou can use a Console object to generate sophisticated output with minimal effort. See the [Console API](https://rich.readthedocs.io/en/latest/console.html) docs for details.\n\n## Rich Inspect\n\nRich has an [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) function which can produce a report on any Python object, such as class, instance, or builtin.\n\n```python\n>>> my_list = [\"foo\", \"bar\"]\n>>> from rich import inspect\n>>> inspect(my_list, methods=True)\n```\n\n![Log](https://github.com/textualize/rich/raw/master/imgs/inspect.png)\n\nSee the [inspect docs](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) for details.\n\n# Rich Library\n\nRich contains a number of builtin _renderables_ you can use to create elegant output in your CLI and help you debug your code.\n\nClick the following headings for details:\n\n<details>\n<summary>Log</summary>\n\nThe Console object has a `log()` method which has a similar interface to `print()`, but also renders a column for the current time and the file and line which made the call. By default Rich will do syntax highlighting for Python structures and for repr strings. If you log a collection (i.e. a dict or a list) Rich will pretty print it so that it fits in the available space. Here's an example of some of these features.\n\n```python\nfrom rich.console import Console\nconsole = Console()\n\ntest_data = [\n    {\"jsonrpc\": \"2.0\", \"method\": \"sum\", \"params\": [None, 1, 2, 4, False, True], \"id\": \"1\",},\n    {\"jsonrpc\": \"2.0\", \"method\": \"notify_hello\", \"params\": [7]},\n    {\"jsonrpc\": \"2.0\", \"method\": \"subtract\", \"params\": [42, 23], \"id\": \"2\"},\n]\n\ndef test_log():\n    enabled = False\n    context = {\n        \"foo\": \"bar\",\n    }\n    movies = [\"Deadpool\", \"Rise of the Skywalker\"]\n    console.log(\"Hello from\", console, \"!\")\n    console.log(test_data, log_locals=True)\n\n\ntest_log()\n```\n\nThe above produces the following output:\n\n![Log](https://github.com/textualize/rich/raw/master/imgs/log.png)\n\nNote the `log_locals` argument, which outputs a table containing the local variables where the log method was called.\n\nThe log method could be used for logging to the terminal for long running applications such as servers, but is also a very nice debugging aid.\n\n</details>\n<details>\n<summary>Logging Handler</summary>\n\nYou can also use the builtin [Handler class](https://rich.readthedocs.io/en/latest/logging.html) to format and colorize output from Python's logging module. Here's an example of the output:\n\n![Logging](https://github.com/textualize/rich/raw/master/imgs/logging.png)\n\n</details>\n\n<details>\n<summary>Emoji</summary>\n\nTo insert an emoji in to console output place the name between two colons. Here's an example:\n\n```python\n>>> console.print(\":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:\")\n😃 🧛 💩 👍 🦝\n```\n\nPlease use this feature wisely.\n\n</details>\n\n<details>\n<summary>Tables</summary>\n\nRich can render flexible [tables](https://rich.readthedocs.io/en/latest/tables.html) with unicode box characters. There is a large variety of formatting options for borders, styles, cell alignment etc.\n\n![table movie](https://github.com/textualize/rich/raw/master/imgs/table_movie.gif)\n\nThe animation above was generated with [table_movie.py](https://github.com/textualize/rich/blob/master/examples/table_movie.py) in the examples directory.\n\nHere's a simpler table example:\n\n```python\nfrom rich.console import Console\nfrom rich.table import Table\n\nconsole = Console()\n\ntable = Table(show_header=True, header_style=\"bold magenta\")\ntable.add_column(\"Date\", style=\"dim\", width=12)\ntable.add_column(\"Title\")\ntable.add_column(\"Production Budget\", justify=\"right\")\ntable.add_column(\"Box Office\", justify=\"right\")\ntable.add_row(\n    \"Dec 20, 2019\", \"Star Wars: The Rise of Skywalker\", \"$275,000,000\", \"$375,126,118\"\n)\ntable.add_row(\n    \"May 25, 2018\",\n    \"[red]Solo[/red]: A Star Wars Story\",\n    \"$275,000,000\",\n    \"$393,151,347\",\n)\ntable.add_row(\n    \"Dec 15, 2017\",\n    \"Star Wars Ep. VIII: The Last Jedi\",\n    \"$262,000,000\",\n    \"[bold]$1,332,539,889[/bold]\",\n)\n\nconsole.print(table)\n```\n\nThis produces the following output:\n\n![table](https://github.com/textualize/rich/raw/master/imgs/table.png)\n\nNote that console markup is rendered in the same way as `print()` and `log()`. In fact, anything that is renderable by Rich may be included in the headers / rows (even other tables).\n\nThe `Table` class is smart enough to resize columns to fit the available width of the terminal, wrapping text as required. Here's the same example, with the terminal made smaller than the table above:\n\n![table2](https://github.com/textualize/rich/raw/master/imgs/table2.png)\n\n</details>\n\n<details>\n<summary>Progress Bars</summary>\n\nRich can render multiple flicker-free [progress](https://rich.readthedocs.io/en/latest/progress.html) bars to track long-running tasks.\n\nFor basic usage, wrap any sequence in the `track` function and iterate over the result. Here's an example:\n\n```python\nfrom rich.progress import track\n\nfor step in track(range(100)):\n    do_step(step)\n```\n\nIt's not much harder to add multiple progress bars. Here's an example taken from the docs:\n\n![progress](https://github.com/textualize/rich/raw/master/imgs/progress.gif)\n\nThe columns may be configured to show any details you want. Built-in columns include percentage complete, file size, file speed, and time remaining. Here's another example showing a download in progress:\n\n![progress](https://github.com/textualize/rich/raw/master/imgs/downloader.gif)\n\nTo try this out yourself, see [examples/downloader.py](https://github.com/textualize/rich/blob/master/examples/downloader.py) which can download multiple URLs simultaneously while displaying progress.\n\n</details>\n\n<details>\n<summary>Status</summary>\n\nFor situations where it is hard to calculate progress, you can use the [status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) method which will display a 'spinner' animation and message. The animation won't prevent you from using the console as normal. Here's an example:\n\n```python\nfrom time import sleep\nfrom rich.console import Console\n\nconsole = Console()\ntasks = [f\"task {n}\" for n in range(1, 11)]\n\nwith console.status(\"[bold green]Working on tasks...\") as status:\n    while tasks:\n        task = tasks.pop(0)\n        sleep(1)\n        console.log(f\"{task} complete\")\n```\n\nThis generates the following output in the terminal.\n\n![status](https://github.com/textualize/rich/raw/master/imgs/status.gif)\n\nThe spinner animations were borrowed from [cli-spinners](https://www.npmjs.com/package/cli-spinners). You can select a spinner by specifying the `spinner` parameter. Run the following command to see the available values:\n\n```\npython -m rich.spinner\n```\n\nThe above command generates the following output in the terminal:\n\n![spinners](https://github.com/textualize/rich/raw/master/imgs/spinners.gif)\n\n</details>\n\n<details>\n<summary>Tree</summary>\n\nRich can render a [tree](https://rich.readthedocs.io/en/latest/tree.html) with guide lines. A tree is ideal for displaying a file structure, or any other hierarchical data.\n\nThe labels of the tree can be simple text or anything else Rich can render. Run the following for a demonstration:\n\n```\npython -m rich.tree\n```\n\nThis generates the following output:\n\n![markdown](https://github.com/textualize/rich/raw/master/imgs/tree.png)\n\nSee the [tree.py](https://github.com/textualize/rich/blob/master/examples/tree.py) example for a script that displays a tree view of any directory, similar to the linux `tree` command.\n\n</details>\n\n<details>\n<summary>Columns</summary>\n\nRich can render content in neat [columns](https://rich.readthedocs.io/en/latest/columns.html) with equal or optimal width. Here's a very basic clone of the (MacOS / Linux) `ls` command which displays a directory listing in columns:\n\n```python\nimport os\nimport sys\n\nfrom rich import print\nfrom rich.columns import Columns\n\ndirectory = os.listdir(sys.argv[1])\nprint(Columns(directory))\n```\n\nThe following screenshot is the output from the [columns example](https://github.com/textualize/rich/blob/master/examples/columns.py) which displays data pulled from an API in columns:\n\n![columns](https://github.com/textualize/rich/raw/master/imgs/columns.png)\n\n</details>\n\n<details>\n<summary>Markdown</summary>\n\nRich can render [markdown](https://rich.readthedocs.io/en/latest/markdown.html) and does a reasonable job of translating the formatting to the terminal.\n\nTo render markdown import the `Markdown` class and construct it with a string containing markdown code. Then print it to the console. Here's an example:\n\n```python\nfrom rich.console import Console\nfrom rich.markdown import Markdown\n\nconsole = Console()\nwith open(\"README.md\") as readme:\n    markdown = Markdown(readme.read())\nconsole.print(markdown)\n```\n\nThis will produce output something like the following:\n\n![markdown](https://github.com/textualize/rich/raw/master/imgs/markdown.png)\n\n</details>\n\n<details>\n<summary>Syntax Highlighting</summary>\n\nRich uses the [pygments](https://pygments.org/) library to implement [syntax highlighting](https://rich.readthedocs.io/en/latest/syntax.html). Usage is similar to rendering markdown; construct a `Syntax` object and print it to the console. Here's an example:\n\n```python\nfrom rich.console import Console\nfrom rich.syntax import Syntax\n\nmy_code = '''\ndef iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]:\n    \"\"\"Iterate and generate a tuple with a flag for first and last value.\"\"\"\n    iter_values = iter(values)\n    try:\n        previous_value = next(iter_values)\n    except StopIteration:\n        return\n    first = True\n    for value in iter_values:\n        yield first, False, previous_value\n        first = False\n        previous_value = value\n    yield first, True, previous_value\n'''\nsyntax = Syntax(my_code, \"python\", theme=\"monokai\", line_numbers=True)\nconsole = Console()\nconsole.print(syntax)\n```\n\nThis will produce the following output:\n\n![syntax](https://github.com/textualize/rich/raw/master/imgs/syntax.png)\n\n</details>\n\n<details>\n<summary>Tracebacks</summary>\n\nRich can render [beautiful tracebacks](https://rich.readthedocs.io/en/latest/traceback.html) which are easier to read and show more code than standard Python tracebacks. You can set Rich as the default traceback handler so all uncaught exceptions will be rendered by Rich.\n\nHere's what it looks like on OSX (similar on Linux):\n\n![traceback](https://github.com/textualize/rich/raw/master/imgs/traceback.png)\n\n</details>\n\nAll Rich renderables make use of the [Console Protocol](https://rich.readthedocs.io/en/latest/protocol.html), which you can also use to implement your own Rich content.\n\n# Rich CLI\n\n\nSee also [Rich CLI](https://github.com/textualize/rich-cli) for a command line application powered by Rich. Syntax highlight code, render markdown, display CSVs in tables, and more, directly from the command prompt.\n\n\n![Rich CLI](https://raw.githubusercontent.com/Textualize/rich-cli/main/imgs/rich-cli-splash.jpg)\n\n# Textual\n\nSee also Rich's sister project, [Textual](https://github.com/Textualize/textual), which you can use to build sophisticated User Interfaces in the terminal.\n\n![textual-splash](https://github.com/user-attachments/assets/4caeb77e-48c0-4cf7-b14d-c53ded855ffd)\n\n# Toad\n\n[Toad](https://github.com/batrachianai/toad) is a unified interface for agentic coding. Built with Rich and Textual.\n\n![toad](https://github.com/user-attachments/assets/6678b707-1aeb-420f-99ad-abfcd4356771)\n\n",
        "description_content_type": "text/markdown",
        "author": "Will McGugan",
        "author_email": "willmcgugan@gmail.com",
        "license": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Environment :: Console",
          "Framework :: IPython",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: MIT License",
          "Operating System :: MacOS",
          "Operating System :: Microsoft :: Windows",
          "Operating System :: POSIX :: Linux",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Typing :: Typed"
        ],
        "requires_dist": [
          "ipywidgets (>=7.5.1,<9) ; extra == \"jupyter\"",
          "markdown-it-py (>=2.2.0)",
          "pygments (>=2.13.0,<3.0.0)"
        ],
        "requires_python": ">=3.8.0",
        "project_url": [
          "Documentation, https://rich.readthedocs.io/en/latest/",
          "Homepage, https://github.com/Textualize/rich"
        ],
        "provides_extra": [
          "jupyter"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/rich-14.3.3.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.3",
        "name": "openai",
        "version": "2.24.0",
        "summary": "The official Python library for the openai API",
        "description": "# OpenAI Python API library\n\n<!-- prettier-ignore -->\n[![PyPI version](https://img.shields.io/pypi/v/openai.svg?label=pypi%20(stable))](https://pypi.org/project/openai/)\n\nThe OpenAI Python library provides convenient access to the OpenAI REST API from any Python 3.9+\napplication. The library includes type definitions for all request params and response fields,\nand offers both synchronous and asynchronous clients powered by [httpx](https://github.com/encode/httpx).\n\nIt is generated from our [OpenAPI specification](https://github.com/openai/openai-openapi) with [Stainless](https://stainlessapi.com/).\n\n## Documentation\n\nThe REST API documentation can be found on [platform.openai.com](https://platform.openai.com/docs/api-reference). The full API of this library can be found in [api.md](https://github.com/openai/openai-python/tree/main/api.md).\n\n## Installation\n\n```sh\n# install from PyPI\npip install openai\n```\n\n## Usage\n\nThe full API of this library can be found in [api.md](https://github.com/openai/openai-python/tree/main/api.md).\n\nThe primary API for interacting with OpenAI models is the [Responses API](https://platform.openai.com/docs/api-reference/responses). You can generate text from the model with the code below.\n\n```python\nimport os\nfrom openai import OpenAI\n\nclient = OpenAI(\n    # This is the default and can be omitted\n    api_key=os.environ.get(\"OPENAI_API_KEY\"),\n)\n\nresponse = client.responses.create(\n    model=\"gpt-5.2\",\n    instructions=\"You are a coding assistant that talks like a pirate.\",\n    input=\"How do I check if a Python object is an instance of a class?\",\n)\n\nprint(response.output_text)\n```\n\nThe previous standard (supported indefinitely) for generating text is the [Chat Completions API](https://platform.openai.com/docs/api-reference/chat). You can use that API to generate text from the model with the code below.\n\n```python\nfrom openai import OpenAI\n\nclient = OpenAI()\n\ncompletion = client.chat.completions.create(\n    model=\"gpt-5.2\",\n    messages=[\n        {\"role\": \"developer\", \"content\": \"Talk like a pirate.\"},\n        {\n            \"role\": \"user\",\n            \"content\": \"How do I check if a Python object is an instance of a class?\",\n        },\n    ],\n)\n\nprint(completion.choices[0].message.content)\n```\n\nWhile you can provide an `api_key` keyword argument,\nwe recommend using [python-dotenv](https://pypi.org/project/python-dotenv/)\nto add `OPENAI_API_KEY=\"My API Key\"` to your `.env` file\nso that your API key is not stored in source control.\n[Get an API key here](https://platform.openai.com/settings/organization/api-keys).\n\n### Vision\n\nWith an image URL:\n\n```python\nprompt = \"What is in this image?\"\nimg_url = \"https://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/2023_06_08_Raccoon1.jpg/1599px-2023_06_08_Raccoon1.jpg\"\n\nresponse = client.responses.create(\n    model=\"gpt-5.2\",\n    input=[\n        {\n            \"role\": \"user\",\n            \"content\": [\n                {\"type\": \"input_text\", \"text\": prompt},\n                {\"type\": \"input_image\", \"image_url\": f\"{img_url}\"},\n            ],\n        }\n    ],\n)\n```\n\nWith the image as a base64 encoded string:\n\n```python\nimport base64\nfrom openai import OpenAI\n\nclient = OpenAI()\n\nprompt = \"What is in this image?\"\nwith open(\"path/to/image.png\", \"rb\") as image_file:\n    b64_image = base64.b64encode(image_file.read()).decode(\"utf-8\")\n\nresponse = client.responses.create(\n    model=\"gpt-5.2\",\n    input=[\n        {\n            \"role\": \"user\",\n            \"content\": [\n                {\"type\": \"input_text\", \"text\": prompt},\n                {\"type\": \"input_image\", \"image_url\": f\"data:image/png;base64,{b64_image}\"},\n            ],\n        }\n    ],\n)\n```\n\n## Async usage\n\nSimply import `AsyncOpenAI` instead of `OpenAI` and use `await` with each API call:\n\n```python\nimport os\nimport asyncio\nfrom openai import AsyncOpenAI\n\nclient = AsyncOpenAI(\n    # This is the default and can be omitted\n    api_key=os.environ.get(\"OPENAI_API_KEY\"),\n)\n\n\nasync def main() -> None:\n    response = await client.responses.create(\n        model=\"gpt-5.2\", input=\"Explain disestablishmentarianism to a smart five year old.\"\n    )\n    print(response.output_text)\n\n\nasyncio.run(main())\n```\n\nFunctionality between the synchronous and asynchronous clients is otherwise identical.\n\n### With aiohttp\n\nBy default, the async client uses `httpx` for HTTP requests. However, for improved concurrency performance you may also use `aiohttp` as the HTTP backend.\n\nYou can enable this by installing `aiohttp`:\n\n```sh\n# install from PyPI\npip install openai[aiohttp]\n```\n\nThen you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:\n\n```python\nimport os\nimport asyncio\nfrom openai import DefaultAioHttpClient\nfrom openai import AsyncOpenAI\n\n\nasync def main() -> None:\n    async with AsyncOpenAI(\n        api_key=os.environ.get(\"OPENAI_API_KEY\"),  # This is the default and can be omitted\n        http_client=DefaultAioHttpClient(),\n    ) as client:\n        chat_completion = await client.chat.completions.create(\n            messages=[\n                {\n                    \"role\": \"user\",\n                    \"content\": \"Say this is a test\",\n                }\n            ],\n            model=\"gpt-5.2\",\n        )\n\n\nasyncio.run(main())\n```\n\n## Streaming responses\n\nWe provide support for streaming responses using Server Side Events (SSE).\n\n```python\nfrom openai import OpenAI\n\nclient = OpenAI()\n\nstream = client.responses.create(\n    model=\"gpt-5.2\",\n    input=\"Write a one-sentence bedtime story about a unicorn.\",\n    stream=True,\n)\n\nfor event in stream:\n    print(event)\n```\n\nThe async client uses the exact same interface.\n\n```python\nimport asyncio\nfrom openai import AsyncOpenAI\n\nclient = AsyncOpenAI()\n\n\nasync def main():\n    stream = await client.responses.create(\n        model=\"gpt-5.2\",\n        input=\"Write a one-sentence bedtime story about a unicorn.\",\n        stream=True,\n    )\n\n    async for event in stream:\n        print(event)\n\n\nasyncio.run(main())\n```\n\n## Realtime API\n\nThe Realtime API enables you to build low-latency, multi-modal conversational experiences. It currently supports text and audio as both input and output, as well as [function calling](https://platform.openai.com/docs/guides/function-calling) through a WebSocket connection.\n\nUnder the hood the SDK uses the [`websockets`](https://websockets.readthedocs.io/en/stable/) library to manage connections.\n\nThe Realtime API works through a combination of client-sent events and server-sent events. Clients can send events to do things like update session configuration or send text and audio inputs. Server events confirm when audio responses have completed, or when a text response from the model has been received. A full event reference can be found [here](https://platform.openai.com/docs/api-reference/realtime-client-events) and a guide can be found [here](https://platform.openai.com/docs/guides/realtime).\n\nBasic text based example:\n\n```py\nimport asyncio\nfrom openai import AsyncOpenAI\n\nasync def main():\n    client = AsyncOpenAI()\n\n    async with client.realtime.connect(model=\"gpt-realtime\") as connection:\n        await connection.session.update(\n            session={\"type\": \"realtime\", \"output_modalities\": [\"text\"]}\n        )\n\n        await connection.conversation.item.create(\n            item={\n                \"type\": \"message\",\n                \"role\": \"user\",\n                \"content\": [{\"type\": \"input_text\", \"text\": \"Say hello!\"}],\n            }\n        )\n        await connection.response.create()\n\n        async for event in connection:\n            if event.type == \"response.output_text.delta\":\n                print(event.delta, flush=True, end=\"\")\n\n            elif event.type == \"response.output_text.done\":\n                print()\n\n            elif event.type == \"response.done\":\n                break\n\nasyncio.run(main())\n```\n\nHowever the real magic of the Realtime API is handling audio inputs / outputs, see this example [TUI script](https://github.com/openai/openai-python/blob/main/examples/realtime/push_to_talk_app.py) for a fully fledged example.\n\n### Realtime error handling\n\nWhenever an error occurs, the Realtime API will send an [`error` event](https://platform.openai.com/docs/guides/realtime-model-capabilities#error-handling) and the connection will stay open and remain usable. This means you need to handle it yourself, as _no errors are raised directly_ by the SDK when an `error` event comes in.\n\n```py\nclient = AsyncOpenAI()\n\nasync with client.realtime.connect(model=\"gpt-realtime\") as connection:\n    ...\n    async for event in connection:\n        if event.type == 'error':\n            print(event.error.type)\n            print(event.error.code)\n            print(event.error.event_id)\n            print(event.error.message)\n```\n\n## Using types\n\nNested request parameters are [TypedDicts](https://docs.python.org/3/library/typing.html#typing.TypedDict). Responses are [Pydantic models](https://docs.pydantic.dev) which also provide helper methods for things like:\n\n- Serializing back into JSON, `model.to_json()`\n- Converting to a dictionary, `model.to_dict()`\n\nTyped requests and responses provide autocomplete and documentation within your editor. If you would like to see type errors in VS Code to help catch bugs earlier, set `python.analysis.typeCheckingMode` to `basic`.\n\n## Pagination\n\nList methods in the OpenAI API are paginated.\n\nThis library provides auto-paginating iterators with each list response, so you do not have to request successive pages manually:\n\n```python\nfrom openai import OpenAI\n\nclient = OpenAI()\n\nall_jobs = []\n# Automatically fetches more pages as needed.\nfor job in client.fine_tuning.jobs.list(\n    limit=20,\n):\n    # Do something with job here\n    all_jobs.append(job)\nprint(all_jobs)\n```\n\nOr, asynchronously:\n\n```python\nimport asyncio\nfrom openai import AsyncOpenAI\n\nclient = AsyncOpenAI()\n\n\nasync def main() -> None:\n    all_jobs = []\n    # Iterate through items across all pages, issuing requests as needed.\n    async for job in client.fine_tuning.jobs.list(\n        limit=20,\n    ):\n        all_jobs.append(job)\n    print(all_jobs)\n\n\nasyncio.run(main())\n```\n\nAlternatively, you can use the `.has_next_page()`, `.next_page_info()`, or `.get_next_page()` methods for more granular control working with pages:\n\n```python\nfirst_page = await client.fine_tuning.jobs.list(\n    limit=20,\n)\nif first_page.has_next_page():\n    print(f\"will fetch next page using these details: {first_page.next_page_info()}\")\n    next_page = await first_page.get_next_page()\n    print(f\"number of items we just fetched: {len(next_page.data)}\")\n\n# Remove `await` for non-async usage.\n```\n\nOr just work directly with the returned data:\n\n```python\nfirst_page = await client.fine_tuning.jobs.list(\n    limit=20,\n)\n\nprint(f\"next page cursor: {first_page.after}\")  # => \"next page cursor: ...\"\nfor job in first_page.data:\n    print(job.id)\n\n# Remove `await` for non-async usage.\n```\n\n## Nested params\n\nNested parameters are dictionaries, typed using `TypedDict`, for example:\n\n```python\nfrom openai import OpenAI\n\nclient = OpenAI()\n\nresponse = client.chat.responses.create(\n    input=[\n        {\n            \"role\": \"user\",\n            \"content\": \"How much ?\",\n        }\n    ],\n    model=\"gpt-5.2\",\n    response_format={\"type\": \"json_object\"},\n)\n```\n\n## File uploads\n\nRequest parameters that correspond to file uploads can be passed as `bytes`, or a [`PathLike`](https://docs.python.org/3/library/os.html#os.PathLike) instance or a tuple of `(filename, contents, media type)`.\n\n```python\nfrom pathlib import Path\nfrom openai import OpenAI\n\nclient = OpenAI()\n\nclient.files.create(\n    file=Path(\"input.jsonl\"),\n    purpose=\"fine-tune\",\n)\n```\n\nThe async client uses the exact same interface. If you pass a [`PathLike`](https://docs.python.org/3/library/os.html#os.PathLike) instance, the file contents will be read asynchronously automatically.\n\n## Webhook Verification\n\nVerifying webhook signatures is _optional but encouraged_.\n\nFor more information about webhooks, see [the API docs](https://platform.openai.com/docs/guides/webhooks).\n\n### Parsing webhook payloads\n\nFor most use cases, you will likely want to verify the webhook and parse the payload at the same time. To achieve this, we provide the method `client.webhooks.unwrap()`, which parses a webhook request and verifies that it was sent by OpenAI. This method will raise an error if the signature is invalid.\n\nNote that the `body` parameter must be the raw JSON string sent from the server (do not parse it first). The `.unwrap()` method will parse this JSON for you into an event object after verifying the webhook was sent from OpenAI.\n\n```python\nfrom openai import OpenAI\nfrom flask import Flask, request\n\napp = Flask(__name__)\nclient = OpenAI()  # OPENAI_WEBHOOK_SECRET environment variable is used by default\n\n\n@app.route(\"/webhook\", methods=[\"POST\"])\ndef webhook():\n    request_body = request.get_data(as_text=True)\n\n    try:\n        event = client.webhooks.unwrap(request_body, request.headers)\n\n        if event.type == \"response.completed\":\n            print(\"Response completed:\", event.data)\n        elif event.type == \"response.failed\":\n            print(\"Response failed:\", event.data)\n        else:\n            print(\"Unhandled event type:\", event.type)\n\n        return \"ok\"\n    except Exception as e:\n        print(\"Invalid signature:\", e)\n        return \"Invalid signature\", 400\n\n\nif __name__ == \"__main__\":\n    app.run(port=8000)\n```\n\n### Verifying webhook payloads directly\n\nIn some cases, you may want to verify the webhook separately from parsing the payload. If you prefer to handle these steps separately, we provide the method `client.webhooks.verify_signature()` to _only verify_ the signature of a webhook request. Like `.unwrap()`, this method will raise an error if the signature is invalid.\n\nNote that the `body` parameter must be the raw JSON string sent from the server (do not parse it first). You will then need to parse the body after verifying the signature.\n\n```python\nimport json\nfrom openai import OpenAI\nfrom flask import Flask, request\n\napp = Flask(__name__)\nclient = OpenAI()  # OPENAI_WEBHOOK_SECRET environment variable is used by default\n\n\n@app.route(\"/webhook\", methods=[\"POST\"])\ndef webhook():\n    request_body = request.get_data(as_text=True)\n\n    try:\n        client.webhooks.verify_signature(request_body, request.headers)\n\n        # Parse the body after verification\n        event = json.loads(request_body)\n        print(\"Verified event:\", event)\n\n        return \"ok\"\n    except Exception as e:\n        print(\"Invalid signature:\", e)\n        return \"Invalid signature\", 400\n\n\nif __name__ == \"__main__\":\n    app.run(port=8000)\n```\n\n## Handling errors\n\nWhen the library is unable to connect to the API (for example, due to network connection problems or a timeout), a subclass of `openai.APIConnectionError` is raised.\n\nWhen the API returns a non-success status code (that is, 4xx or 5xx\nresponse), a subclass of `openai.APIStatusError` is raised, containing `status_code` and `response` properties.\n\nAll errors inherit from `openai.APIError`.\n\n```python\nimport openai\nfrom openai import OpenAI\n\nclient = OpenAI()\n\ntry:\n    client.fine_tuning.jobs.create(\n        model=\"gpt-4o\",\n        training_file=\"file-abc123\",\n    )\nexcept openai.APIConnectionError as e:\n    print(\"The server could not be reached\")\n    print(e.__cause__)  # an underlying Exception, likely raised within httpx.\nexcept openai.RateLimitError as e:\n    print(\"A 429 status code was received; we should back off a bit.\")\nexcept openai.APIStatusError as e:\n    print(\"Another non-200-range status code was received\")\n    print(e.status_code)\n    print(e.response)\n```\n\nError codes are as follows:\n\n| Status Code | Error Type                 |\n| ----------- | -------------------------- |\n| 400         | `BadRequestError`          |\n| 401         | `AuthenticationError`      |\n| 403         | `PermissionDeniedError`    |\n| 404         | `NotFoundError`            |\n| 422         | `UnprocessableEntityError` |\n| 429         | `RateLimitError`           |\n| >=500       | `InternalServerError`      |\n| N/A         | `APIConnectionError`       |\n\n## Request IDs\n\n> For more information on debugging requests, see [these docs](https://platform.openai.com/docs/api-reference/debugging-requests)\n\nAll object responses in the SDK provide a `_request_id` property which is added from the `x-request-id` response header so that you can quickly log failing requests and report them back to OpenAI.\n\n```python\nresponse = await client.responses.create(\n    model=\"gpt-5.2\",\n    input=\"Say 'this is a test'.\",\n)\nprint(response._request_id)  # req_123\n```\n\nNote that unlike other properties that use an `_` prefix, the `_request_id` property\n_is_ public. Unless documented otherwise, _all_ other `_` prefix properties,\nmethods and modules are _private_.\n\n> [!IMPORTANT]  \n> If you need to access request IDs for failed requests you must catch the `APIStatusError` exception\n\n```python\nimport openai\n\ntry:\n    completion = await client.chat.completions.create(\n        messages=[{\"role\": \"user\", \"content\": \"Say this is a test\"}], model=\"gpt-5.2\"\n    )\nexcept openai.APIStatusError as exc:\n    print(exc.request_id)  # req_123\n    raise exc\n```\n\n## Retries\n\nCertain errors are automatically retried 2 times by default, with a short exponential backoff.\nConnection errors (for example, due to a network connectivity problem), 408 Request Timeout, 409 Conflict,\n429 Rate Limit, and >=500 Internal errors are all retried by default.\n\nYou can use the `max_retries` option to configure or disable retry settings:\n\n```python\nfrom openai import OpenAI\n\n# Configure the default for all requests:\nclient = OpenAI(\n    # default is 2\n    max_retries=0,\n)\n\n# Or, configure per-request:\nclient.with_options(max_retries=5).chat.completions.create(\n    messages=[\n        {\n            \"role\": \"user\",\n            \"content\": \"How can I get the name of the current day in JavaScript?\",\n        }\n    ],\n    model=\"gpt-5.2\",\n)\n```\n\n## Timeouts\n\nBy default requests time out after 10 minutes. You can configure this with a `timeout` option,\nwhich accepts a float or an [`httpx.Timeout`](https://www.python-httpx.org/advanced/timeouts/#fine-tuning-the-configuration) object:\n\n```python\nfrom openai import OpenAI\n\n# Configure the default for all requests:\nclient = OpenAI(\n    # 20 seconds (default is 10 minutes)\n    timeout=20.0,\n)\n\n# More granular control:\nclient = OpenAI(\n    timeout=httpx.Timeout(60.0, read=5.0, write=10.0, connect=2.0),\n)\n\n# Override per-request:\nclient.with_options(timeout=5.0).chat.completions.create(\n    messages=[\n        {\n            \"role\": \"user\",\n            \"content\": \"How can I list all files in a directory using Python?\",\n        }\n    ],\n    model=\"gpt-5.2\",\n)\n```\n\nOn timeout, an `APITimeoutError` is thrown.\n\nNote that requests that time out are [retried twice by default](https://github.com/openai/openai-python/tree/main/#retries).\n\n## Advanced\n\n### Logging\n\nWe use the standard library [`logging`](https://docs.python.org/3/library/logging.html) module.\n\nYou can enable logging by setting the environment variable `OPENAI_LOG` to `info`.\n\n```shell\n$ export OPENAI_LOG=info\n```\n\nOr to `debug` for more verbose logging.\n\n### How to tell whether `None` means `null` or missing\n\nIn an API response, a field may be explicitly `null`, or missing entirely; in either case, its value is `None` in this library. You can differentiate the two cases with `.model_fields_set`:\n\n```py\nif response.my_field is None:\n  if 'my_field' not in response.model_fields_set:\n    print('Got json like {}, without a \"my_field\" key present at all.')\n  else:\n    print('Got json like {\"my_field\": null}.')\n```\n\n### Accessing raw response data (e.g. headers)\n\nThe \"raw\" Response object can be accessed by prefixing `.with_raw_response.` to any HTTP method call, e.g.,\n\n```py\nfrom openai import OpenAI\n\nclient = OpenAI()\nresponse = client.chat.completions.with_raw_response.create(\n    messages=[{\n        \"role\": \"user\",\n        \"content\": \"Say this is a test\",\n    }],\n    model=\"gpt-5.2\",\n)\nprint(response.headers.get('X-My-Header'))\n\ncompletion = response.parse()  # get the object that `chat.completions.create()` would have returned\nprint(completion)\n```\n\nThese methods return a [`LegacyAPIResponse`](https://github.com/openai/openai-python/tree/main/src/openai/_legacy_response.py) object. This is a legacy class as we're changing it slightly in the next major version.\n\nFor the sync client this will mostly be the same with the exception\nof `content` & `text` will be methods instead of properties. In the\nasync client, all methods will be async.\n\nA migration script will be provided & the migration in general should\nbe smooth.\n\n#### `.with_streaming_response`\n\nThe above interface eagerly reads the full response body when you make the request, which may not always be what you want.\n\nTo stream the response body, use `.with_streaming_response` instead, which requires a context manager and only reads the response body once you call `.read()`, `.text()`, `.json()`, `.iter_bytes()`, `.iter_text()`, `.iter_lines()` or `.parse()`. In the async client, these are async methods.\n\nAs such, `.with_streaming_response` methods return a different [`APIResponse`](https://github.com/openai/openai-python/tree/main/src/openai/_response.py) object, and the async client returns an [`AsyncAPIResponse`](https://github.com/openai/openai-python/tree/main/src/openai/_response.py) object.\n\n```python\nwith client.chat.completions.with_streaming_response.create(\n    messages=[\n        {\n            \"role\": \"user\",\n            \"content\": \"Say this is a test\",\n        }\n    ],\n    model=\"gpt-5.2\",\n) as response:\n    print(response.headers.get(\"X-My-Header\"))\n\n    for line in response.iter_lines():\n        print(line)\n```\n\nThe context manager is required so that the response will reliably be closed.\n\n### Making custom/undocumented requests\n\nThis library is typed for convenient access to the documented API.\n\nIf you need to access undocumented endpoints, params, or response properties, the library can still be used.\n\n#### Undocumented endpoints\n\nTo make requests to undocumented endpoints, you can make requests using `client.get`, `client.post`, and other\nhttp verbs. Options on the client will be respected (such as retries) when making this request.\n\n```py\nimport httpx\n\nresponse = client.post(\n    \"/foo\",\n    cast_to=httpx.Response,\n    body={\"my_param\": True},\n)\n\nprint(response.headers.get(\"x-foo\"))\n```\n\n#### Undocumented request params\n\nIf you want to explicitly send an extra param, you can do so with the `extra_query`, `extra_body`, and `extra_headers` request\noptions.\n\n#### Undocumented response properties\n\nTo access undocumented response properties, you can access the extra fields like `response.unknown_prop`. You\ncan also get all the extra fields on the Pydantic model as a dict with\n[`response.model_extra`](https://docs.pydantic.dev/latest/api/base_model/#pydantic.BaseModel.model_extra).\n\n### Configuring the HTTP client\n\nYou can directly override the [httpx client](https://www.python-httpx.org/api/#client) to customize it for your use case, including:\n\n- Support for [proxies](https://www.python-httpx.org/advanced/proxies/)\n- Custom [transports](https://www.python-httpx.org/advanced/transports/)\n- Additional [advanced](https://www.python-httpx.org/advanced/clients/) functionality\n\n```python\nimport httpx\nfrom openai import OpenAI, DefaultHttpxClient\n\nclient = OpenAI(\n    # Or use the `OPENAI_BASE_URL` env var\n    base_url=\"http://my.test.server.example.com:8083/v1\",\n    http_client=DefaultHttpxClient(\n        proxy=\"http://my.test.proxy.example.com\",\n        transport=httpx.HTTPTransport(local_address=\"0.0.0.0\"),\n    ),\n)\n```\n\nYou can also customize the client on a per-request basis by using `with_options()`:\n\n```python\nclient.with_options(http_client=DefaultHttpxClient(...))\n```\n\n### Managing HTTP resources\n\nBy default the library closes underlying HTTP connections whenever the client is [garbage collected](https://docs.python.org/3/reference/datamodel.html#object.__del__). You can manually close the client using the `.close()` method if desired, or with a context manager that closes when exiting.\n\n```py\nfrom openai import OpenAI\n\nwith OpenAI() as client:\n  # make requests here\n  ...\n\n# HTTP client is now closed\n```\n\n## Microsoft Azure OpenAI\n\nTo use this library with [Azure OpenAI](https://learn.microsoft.com/azure/ai-services/openai/overview), use the `AzureOpenAI`\nclass instead of the `OpenAI` class.\n\n> [!IMPORTANT]\n> The Azure API shape differs from the core API shape which means that the static types for responses / params\n> won't always be correct.\n\n```py\nfrom openai import AzureOpenAI\n\n# gets the API Key from environment variable AZURE_OPENAI_API_KEY\nclient = AzureOpenAI(\n    # https://learn.microsoft.com/azure/ai-services/openai/reference#rest-api-versioning\n    api_version=\"2023-07-01-preview\",\n    # https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource?pivots=web-portal#create-a-resource\n    azure_endpoint=\"https://example-endpoint.openai.azure.com\",\n)\n\ncompletion = client.chat.completions.create(\n    model=\"deployment-name\",  # e.g. gpt-35-instant\n    messages=[\n        {\n            \"role\": \"user\",\n            \"content\": \"How do I output all files in a directory using Python?\",\n        },\n    ],\n)\nprint(completion.to_json())\n```\n\nIn addition to the options provided in the base `OpenAI` client, the following options are provided:\n\n- `azure_endpoint` (or the `AZURE_OPENAI_ENDPOINT` environment variable)\n- `azure_deployment`\n- `api_version` (or the `OPENAI_API_VERSION` environment variable)\n- `azure_ad_token` (or the `AZURE_OPENAI_AD_TOKEN` environment variable)\n- `azure_ad_token_provider`\n\nAn example of using the client with Microsoft Entra ID (formerly known as Azure Active Directory) can be found [here](https://github.com/openai/openai-python/blob/main/examples/azure_ad.py).\n\n## Versioning\n\nThis package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions, though certain backwards-incompatible changes may be released as minor versions:\n\n1. Changes that only affect static types, without breaking runtime behavior.\n2. Changes to library internals which are technically public but not intended or documented for external use. _(Please open a GitHub issue to let us know if you are relying on such internals.)_\n3. Changes that we do not expect to impact the vast majority of users in practice.\n\nWe take backwards-compatibility seriously and work hard to ensure you can rely on a smooth upgrade experience.\n\nWe are keen for your feedback; please open an [issue](https://www.github.com/openai/openai-python/issues) with questions, bugs, or suggestions.\n\n### Determining the installed version\n\nIf you've upgraded to the latest version but aren't seeing any new features you were expecting then your python environment is likely still using an older version.\n\nYou can determine the version that is being used at runtime with:\n\n```py\nimport openai\nprint(openai.__version__)\n```\n\n## Requirements\n\nPython 3.9 or higher.\n\n## Contributing\n\nSee [the contributing documentation](https://github.com/openai/openai-python/tree/main/./CONTRIBUTING.md).\n",
        "description_content_type": "text/markdown",
        "author_email": "OpenAI <support@openai.com>",
        "license": "Apache-2.0",
        "classifier": [
          "Intended Audience :: Developers",
          "License :: OSI Approved :: Apache Software License",
          "Operating System :: MacOS",
          "Operating System :: Microsoft :: Windows",
          "Operating System :: OS Independent",
          "Operating System :: POSIX",
          "Operating System :: POSIX :: Linux",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Typing :: Typed"
        ],
        "requires_dist": [
          "anyio<5,>=3.5.0",
          "distro<2,>=1.7.0",
          "httpx<1,>=0.23.0",
          "jiter<1,>=0.10.0",
          "pydantic<3,>=1.9.0",
          "sniffio",
          "tqdm>4",
          "typing-extensions<5,>=4.11",
          "aiohttp; extra == 'aiohttp'",
          "httpx-aiohttp>=0.1.9; extra == 'aiohttp'",
          "numpy>=1; extra == 'datalib'",
          "pandas-stubs>=1.1.0.11; extra == 'datalib'",
          "pandas>=1.2.3; extra == 'datalib'",
          "websockets<16,>=13; extra == 'realtime'",
          "numpy>=2.0.2; extra == 'voice-helpers'",
          "sounddevice>=0.5.1; extra == 'voice-helpers'"
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Homepage, https://github.com/openai/openai-python",
          "Repository, https://github.com/openai/openai-python"
        ],
        "provides_extra": [
          "aiohttp",
          "datalib",
          "realtime",
          "voice-helpers"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/openai-2.24.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "python-telegram-bot",
        "version": "22.6",
        "summary": "We have made you a wrapper you can't refuse",
        "description": ".. image:: https://raw.githubusercontent.com/python-telegram-bot/logos/master/logo-text/png/ptb-logo-text_768.png\n   :align: center\n   :target: https://python-telegram-bot.org\n   :alt: python-telegram-bot Logo\n\n.. image:: https://img.shields.io/pypi/v/python-telegram-bot.svg\n   :target: https://pypi.org/project/python-telegram-bot/\n   :alt: PyPi Package Version\n\n.. image:: https://img.shields.io/pypi/pyversions/python-telegram-bot.svg\n   :target: https://pypi.org/project/python-telegram-bot/\n   :alt: Supported Python versions\n\n.. image:: https://img.shields.io/badge/Bot%20API-9.3-blue?logo=telegram\n   :target: https://core.telegram.org/bots/api-changelog\n   :alt: Supported Bot API version\n\n.. image:: https://img.shields.io/pypi/dm/python-telegram-bot\n   :target: https://pypistats.org/packages/python-telegram-bot\n   :alt: PyPi Package Monthly Download\n\n.. image:: https://app.readthedocs.org/projects/python-telegram-bot/badge/?version=stable\n   :target: https://docs.python-telegram-bot.org/en/stable/\n   :alt: Documentation Status\n\n.. image:: https://img.shields.io/pypi/l/python-telegram-bot.svg\n   :target: https://www.gnu.org/licenses/lgpl-3.0.html\n   :alt: LGPLv3 License\n\n.. image:: https://github.com/python-telegram-bot/python-telegram-bot/actions/workflows/unit_tests.yml/badge.svg?branch=master\n   :target: https://github.com/python-telegram-bot/python-telegram-bot/\n   :alt: Github Actions workflow\n\n.. image:: https://codecov.io/gh/python-telegram-bot/python-telegram-bot/branch/master/graph/badge.svg\n   :target: https://app.codecov.io/gh/python-telegram-bot/python-telegram-bot\n   :alt: Code coverage\n\n.. image:: https://isitmaintained.com/badge/resolution/python-telegram-bot/python-telegram-bot.svg\n   :target: https://isitmaintained.com/project/python-telegram-bot/python-telegram-bot\n   :alt: Median time to resolve an issue\n\n.. image:: https://api.codacy.com/project/badge/Grade/99d901eaa09b44b4819aec05c330c968\n   :target: https://app.codacy.com/gh/python-telegram-bot/python-telegram-bot/dashboard\n   :alt: Code quality: Codacy\n\n.. image:: https://results.pre-commit.ci/badge/github/python-telegram-bot/python-telegram-bot/master.svg\n   :target: https://results.pre-commit.ci/latest/github/python-telegram-bot/python-telegram-bot/master\n   :alt: pre-commit.ci status\n\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n   :target: https://github.com/psf/black\n   :alt: Code Style: Black\n\n.. image:: https://img.shields.io/badge/Telegram-Channel-blue.svg?logo=telegram\n   :target: https://t.me/pythontelegrambotchannel\n   :alt: Telegram Channel\n\n.. image:: https://img.shields.io/badge/Telegram-Group-blue.svg?logo=telegram\n   :target: https://telegram.me/pythontelegrambotgroup\n   :alt: Telegram Group\n\nWe have made you a wrapper you can't refuse\n\nWe have a vibrant community of developers helping each other in our `Telegram group <https://telegram.me/pythontelegrambotgroup>`_. Join us!\n\n*Stay tuned for library updates and new releases on our* `Telegram Channel <https://telegram.me/pythontelegrambotchannel>`_.\n\nIntroduction\n------------\n\nThis library provides a pure Python, asynchronous interface for the\n`Telegram Bot API <https://core.telegram.org/bots/api>`_.\nIt's compatible with Python versions **3.10+**.\n\nIn addition to the pure API implementation, this library features several convenience methods and shortcuts as well as a number of high-level classes to\nmake the development of bots easy and straightforward. These classes are contained in the\n``telegram.ext`` submodule.\n\nAfter installing_ the library, be sure to check out the section on `working with PTB`_.\n\nTelegram API support\n~~~~~~~~~~~~~~~~~~~~\n\nAll types and methods of the Telegram Bot API **9.3** are natively supported by this library.\nIn addition, Bot API functionality not yet natively included can still be used as described `in our wiki <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Bot-API-Forward-Compatibility>`_.\n\nNotable Features\n~~~~~~~~~~~~~~~~\n\n- `Fully asynchronous <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Concurrency>`_\n- Convenient shortcut methods, e.g. `Message.reply_text <https://docs.python-telegram-bot.org/en/stable/telegram.message.html#telegram.Message.reply_text>`_\n- `Fully annotated with static type hints <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Type-Checking>`_\n- `Customizable and extendable interface <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Architecture>`_\n- Seamless integration with `webhooks <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Webhooks>`_ and `polling <https://docs.python-telegram-bot.org/en/stable/telegram.ext.application.html#telegram.ext.Application.run_polling>`_\n- `Comprehensive documentation and examples <#working-with-ptb>`_\n\nInstalling\n----------\n\nYou can install or upgrade ``python-telegram-bot`` via\n\n.. code:: shell\n\n    $ pip install python-telegram-bot --upgrade\n\nTo install a pre-release, use the ``--pre`` `flag <https://pip.pypa.io/en/stable/cli/pip_install/#cmdoption-pre>`_ in addition.\n\nYou can also install ``python-telegram-bot`` from source, though this is usually not necessary.\n\n.. code:: shell\n\n    $ git clone https://github.com/python-telegram-bot/python-telegram-bot\n    $ cd python-telegram-bot\n    $ pip install build\n    $ python -m build\n\nYou can also use your favored package manager (such as ``uv``, ``hatch``, ``poetry``, etc.) instead of ``pip``.\n\nVerifying Releases\n~~~~~~~~~~~~~~~~~~\n\nTo enable you to verify that a release file that you downloaded was indeed provided by the ``python-telegram-bot`` team, we have taken the following measures.\n\nStarting with v21.4, all releases are signed via `sigstore <https://www.sigstore.dev>`_.\nThe corresponding signature files are uploaded to the `GitHub releases page`_.\nTo verify the signature, please install the `sigstore Python client <https://pypi.org/project/sigstore/>`_ and follow the instructions for `verifying signatures from GitHub Actions <https://github.com/sigstore/sigstore-python?tab=readme-ov-file>`_. As input for the ``--repository`` parameter, please use the value ``python-telegram-bot/python-telegram-bot``.\n\nEarlier releases are signed with a GPG key.\nThe signatures are uploaded to both the `GitHub releases page`_ and the `PyPI project <https://pypi.org/project/python-telegram-bot/>`_ and end with a suffix ``.asc``.\nPlease find the public keys `here <https://github.com/python-telegram-bot/python-telegram-bot/tree/master/public_keys>`_.\nThe keys are named in the format ``<first_version>-<last_version>.gpg``.\n\nIn addition, the GitHub release page also contains the sha1 hashes of the release files in the files with the suffix ``.sha1``.\n\nDependencies & Their Versions\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n``python-telegram-bot`` tries to use as few 3rd party dependencies as possible.\nHowever, for some features using a 3rd party library is more sane than implementing the functionality again.\nAs these features are *optional*, the corresponding 3rd party dependencies are not installed by default.\nInstead, they are listed as optional dependencies.\nThis allows to avoid unnecessary dependency conflicts for users who don't need the optional features.\n\nThe only required dependency is `httpx >=0.27,<0.29 <https://www.python-httpx.org>`_ for\n``telegram.request.HTTPXRequest``, the default networking backend.\n\n``python-telegram-bot`` is most useful when used along with additional libraries.\nTo minimize dependency conflicts, we try to be liberal in terms of version requirements on the (optional) dependencies.\nOn the other hand, we have to ensure stability of ``python-telegram-bot``, which is why we do apply version bounds.\nIf you encounter dependency conflicts due to these bounds, feel free to reach out.\n\nOptional Dependencies\n#####################\n\nPTB can be installed with optional dependencies:\n\n* ``pip install \"python-telegram-bot[passport]\"`` installs the `cryptography>=39.0.1 <https://cryptography.io/en/stable>`_ library. Use this, if you want to use Telegram Passport related functionality.\n* ``pip install \"python-telegram-bot[socks]\"`` installs `httpx[socks] <https://www.python-httpx.org/#dependencies>`_. Use this, if you want to work behind a Socks5 server.\n* ``pip install \"python-telegram-bot[http2]\"`` installs `httpx[http2] <https://www.python-httpx.org/#dependencies>`_. Use this, if you want to use HTTP/2.\n* ``pip install \"python-telegram-bot[rate-limiter]\"`` installs `aiolimiter~=1.1,<1.3 <https://aiolimiter.readthedocs.io/en/stable/>`_. Use this, if you want to use ``telegram.ext.AIORateLimiter``.\n* ``pip install \"python-telegram-bot[webhooks]\"`` installs the `tornado~=6.4 <https://www.tornadoweb.org/en/stable/>`_ library. Use this, if you want to use ``telegram.ext.Updater.start_webhook``/``telegram.ext.Application.run_webhook``.\n* ``pip install \"python-telegram-bot[callback-data]\"`` installs the `cachetools>=5.3.3,<6.3.0 <https://cachetools.readthedocs.io/en/latest/>`_ library. Use this, if you want to use `arbitrary callback_data <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Arbitrary-callback_data>`_.\n* ``pip install \"python-telegram-bot[job-queue]\"`` installs the `APScheduler>=3.10.4,<3.12.0 <https://apscheduler.readthedocs.io/en/3.x/>`_ library. Use this, if you want to use the ``telegram.ext.JobQueue``.\n\nTo install multiple optional dependencies, separate them by commas, e.g. ``pip install \"python-telegram-bot[socks,webhooks]\"``.\n\nAdditionally, two shortcuts are provided:\n\n* ``pip install \"python-telegram-bot[all]\"`` installs all optional dependencies.\n* ``pip install \"python-telegram-bot[ext]\"`` installs all optional dependencies that are related to ``telegram.ext``, i.e. ``[rate-limiter, webhooks, callback-data, job-queue]``.\n\nWorking with PTB\n----------------\n\nOnce you have installed the library, you can begin working with it - so let's get started!\n\nQuick Start\n~~~~~~~~~~~\n\nOur Wiki contains an `Introduction to the API <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Introduction-to-the-API>`_ explaining how the pure Bot API can be accessed via ``python-telegram-bot``.\nMoreover, the `Tutorial: Your first Bot <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Extensions---Your-first-Bot>`_ gives an introduction on how chatbots can be easily programmed with the help of the ``telegram.ext`` module.\n\nResources\n~~~~~~~~~\n\n- The `package documentation <https://docs.python-telegram-bot.org/>`_ is the technical reference for ``python-telegram-bot``.\n  It contains descriptions of all available classes, modules, methods and arguments as well as the `changelog <https://docs.python-telegram-bot.org/changelog.html>`_.\n- The `wiki <https://github.com/python-telegram-bot/python-telegram-bot/wiki/>`_ is home to number of more elaborate introductions of the different features of ``python-telegram-bot`` and other useful resources that go beyond the technical documentation.\n- Our `examples section <https://docs.python-telegram-bot.org/examples.html>`_ contains several examples that showcase the different features of both the Bot API and ``python-telegram-bot``.\n  Even if it is not your approach for learning, please take a look at ``echobot.py``. It is the de facto base for most of the bots out there.\n  The code for these examples is released to the public domain, so you can start by grabbing the code and building on top of it.\n- The `official Telegram Bot API documentation <https://core.telegram.org/bots/api>`_ is of course always worth a read.\n\nGetting help\n~~~~~~~~~~~~\n\nIf the resources mentioned above don't answer your questions or simply overwhelm you, there are several ways of getting help.\n\n1. We have a vibrant community of developers helping each other in our `Telegram group <https://telegram.me/pythontelegrambotgroup>`_. Join us! Asking a question here is often the quickest way to get a pointer in the right direction.\n\n2. Ask questions by opening `a discussion <https://github.com/python-telegram-bot/python-telegram-bot/discussions/new>`_.\n\n3. You can even ask for help on Stack Overflow using the `python-telegram-bot tag <https://stackoverflow.com/questions/tagged/python-telegram-bot>`_.\n\nConcurrency\n~~~~~~~~~~~\n\nSince v20.0, ``python-telegram-bot`` is built on top of Pythons ``asyncio`` module.\nBecause ``asyncio`` is in general single-threaded, ``python-telegram-bot`` currently does not aim to be thread-safe.\nNoteworthy parts of ``python-telegram-bots`` API that are likely to cause issues (e.g. race conditions) when used in a multi-threaded setting include:\n\n* ``telegram.ext.Application/Updater.update_queue``\n* ``telegram.ext.ConversationHandler.check/handle_update``\n* ``telegram.ext.CallbackDataCache``\n* ``telegram.ext.BasePersistence``\n* all classes in the ``telegram.ext.filters`` module that allow to add/remove allowed users/chats at runtime\n\nFree threading\n~~~~~~~~~~~~~~\n\nWhile ``python-telegram-bot`` is tested to work with Python 3.14 free threading, we do not guarantee that\nPTB is thread-safe for all use cases. Please see issue `#4873 <https://github.com/python-telegram-bot/python-telegram-bot/issues/4873>`_ for more information.\n\nContributing\n------------\n\nContributions of all sizes are welcome.\nPlease review our `contribution guidelines <https://github.com/python-telegram-bot/python-telegram-bot/blob/master/.github/CONTRIBUTING.rst>`_ to get started.\nYou can also help by `reporting bugs or feature requests <https://github.com/python-telegram-bot/python-telegram-bot/issues/new/choose>`_.\n\nDonating\n--------\nOccasionally we are asked if we accept donations to support the development.\nWhile we appreciate the thought, maintaining PTB is our hobby, and we have almost no running costs for it. We therefore have nothing set up to accept donations.\nIf you still want to donate, we kindly ask you to donate to another open source project/initiative of your choice instead.\n\nLicense\n-------\n\nYou may copy, distribute and modify the software provided that modifications are described and licensed for free under `LGPL-3 <https://www.gnu.org/licenses/lgpl-3.0.html>`_.\nDerivative works (including modifications or anything statically linked to the library) can only be redistributed under LGPL-3, but applications that use the library don't have to be.\n\n.. _`GitHub releases page`: https://github.com/python-telegram-bot/python-telegram-bot/releases\n",
        "description_content_type": "text/x-rst",
        "keywords": [
          "api",
          "bot",
          "python",
          "telegram",
          "wrapper"
        ],
        "author_email": "Leandro Toledo <devs@python-telegram-bot.org>",
        "license_expression": "LGPL-3.0-only",
        "license_file": [
          "LICENSE",
          "LICENSE.dual",
          "LICENSE.lesser"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Topic :: Communications :: Chat",
          "Topic :: Internet",
          "Topic :: Software Development :: Libraries :: Python Modules"
        ],
        "requires_dist": [
          "httpcore>=1.0.9; python_version >= '3.14'",
          "httpx<0.29,>=0.27",
          "aiolimiter<1.3,>=1.1; extra == 'all'",
          "apscheduler<3.12.0,>=3.10.4; extra == 'all'",
          "cachetools<6.3.0,>=5.3.3; extra == 'all'",
          "cffi>=1.17.0rc1; (python_version > '3.12') and extra == 'all'",
          "cryptography!=3.4,!=3.4.1,!=3.4.2,!=3.4.3,>=39.0.1; extra == 'all'",
          "httpx[http2]; extra == 'all'",
          "httpx[socks]; extra == 'all'",
          "tornado~=6.5; extra == 'all'",
          "cachetools<6.3.0,>=5.3.3; extra == 'callback-data'",
          "aiolimiter<1.3,>=1.1; extra == 'ext'",
          "apscheduler<3.12.0,>=3.10.4; extra == 'ext'",
          "cachetools<6.3.0,>=5.3.3; extra == 'ext'",
          "tornado~=6.5; extra == 'ext'",
          "httpx[http2]; extra == 'http2'",
          "apscheduler<3.12.0,>=3.10.4; extra == 'job-queue'",
          "cffi>=1.17.0rc1; (python_version > '3.12') and extra == 'passport'",
          "cryptography!=3.4,!=3.4.1,!=3.4.2,!=3.4.3,>=39.0.1; extra == 'passport'",
          "aiolimiter<1.3,>=1.1; extra == 'rate-limiter'",
          "httpx[socks]; extra == 'socks'",
          "tornado~=6.5; extra == 'webhooks'"
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Homepage, https://python-telegram-bot.org",
          "Documentation, https://docs.python-telegram-bot.org",
          "Bug Tracker, https://github.com/python-telegram-bot/python-telegram-bot/issues",
          "Source Code, https://github.com/python-telegram-bot/python-telegram-bot",
          "News, https://t.me/pythontelegrambotchannel",
          "Changelog, https://docs.python-telegram-bot.org/en/stable/changelog.html",
          "Support, https://t.me/pythontelegrambotgroup"
        ],
        "provides_extra": [
          "all",
          "callback-data",
          "ext",
          "http2",
          "job-queue",
          "passport",
          "rate-limiter",
          "socks",
          "webhooks"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/python_telegram_bot-22.6.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "click",
        "version": "8.3.1",
        "summary": "Composable command line interface toolkit",
        "description": "<div align=\"center\"><img src=\"https://raw.githubusercontent.com/pallets/click/refs/heads/stable/docs/_static/click-name.svg\" alt=\"\" height=\"150\"></div>\n\n# Click\n\nClick is a Python package for creating beautiful command line interfaces\nin a composable way with as little code as necessary. It's the \"Command\nLine Interface Creation Kit\". It's highly configurable but comes with\nsensible defaults out of the box.\n\nIt aims to make the process of writing command line tools quick and fun\nwhile also preventing any frustration caused by the inability to\nimplement an intended CLI API.\n\nClick in three points:\n\n-   Arbitrary nesting of commands\n-   Automatic help page generation\n-   Supports lazy loading of subcommands at runtime\n\n\n## A Simple Example\n\n```python\nimport click\n\n@click.command()\n@click.option(\"--count\", default=1, help=\"Number of greetings.\")\n@click.option(\"--name\", prompt=\"Your name\", help=\"The person to greet.\")\ndef hello(count, name):\n    \"\"\"Simple program that greets NAME for a total of COUNT times.\"\"\"\n    for _ in range(count):\n        click.echo(f\"Hello, {name}!\")\n\nif __name__ == '__main__':\n    hello()\n```\n\n```\n$ python hello.py --count=3\nYour name: Click\nHello, Click!\nHello, Click!\nHello, Click!\n```\n\n\n## Donate\n\nThe Pallets organization develops and supports Click and other popular\npackages. In order to grow the community of contributors and users, and\nallow the maintainers to devote more time to the projects, [please\ndonate today][].\n\n[please donate today]: https://palletsprojects.com/donate\n\n## Contributing\n\nSee our [detailed contributing documentation][contrib] for many ways to\ncontribute, including reporting issues, requesting features, asking or answering\nquestions, and making PRs.\n\n[contrib]: https://palletsprojects.com/contributing/\n\n",
        "description_content_type": "text/markdown",
        "maintainer_email": "Pallets <contact@palletsprojects.com>",
        "license_expression": "BSD-3-Clause",
        "license_file": [
          "LICENSE.txt"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Typing :: Typed"
        ],
        "requires_dist": [
          "colorama; platform_system == 'Windows'"
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Changes, https://click.palletsprojects.com/page/changes/",
          "Chat, https://discord.gg/pallets",
          "Documentation, https://click.palletsprojects.com/",
          "Donate, https://palletsprojects.com/donate",
          "Source, https://github.com/pallets/click/"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/click-8.3.1.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "cryptography",
        "version": "46.0.7",
        "summary": "cryptography is a package which provides cryptographic recipes and primitives to Python developers.",
        "description": "pyca/cryptography\n=================\n\n.. image:: https://img.shields.io/pypi/v/cryptography.svg\n    :target: https://pypi.org/project/cryptography/\n    :alt: Latest Version\n\n.. image:: https://readthedocs.org/projects/cryptography/badge/?version=latest\n    :target: https://cryptography.io\n    :alt: Latest Docs\n\n.. image:: https://github.com/pyca/cryptography/actions/workflows/ci.yml/badge.svg\n    :target: https://github.com/pyca/cryptography/actions/workflows/ci.yml?query=branch%3Amain\n\n``cryptography`` is a package which provides cryptographic recipes and\nprimitives to Python developers. Our goal is for it to be your \"cryptographic\nstandard library\". It supports Python 3.8+ and PyPy3 7.3.11+.\n\n``cryptography`` includes both high level recipes and low level interfaces to\ncommon cryptographic algorithms such as symmetric ciphers, message digests, and\nkey derivation functions. For example, to encrypt something with\n``cryptography``'s high level symmetric encryption recipe:\n\n.. code-block:: pycon\n\n    >>> from cryptography.fernet import Fernet\n    >>> # Put this somewhere safe!\n    >>> key = Fernet.generate_key()\n    >>> f = Fernet(key)\n    >>> token = f.encrypt(b\"A really secret message. Not for prying eyes.\")\n    >>> token\n    b'...'\n    >>> f.decrypt(token)\n    b'A really secret message. Not for prying eyes.'\n\nYou can find more information in the `documentation`_.\n\nYou can install ``cryptography`` with:\n\n.. code-block:: console\n\n    $ pip install cryptography\n\nFor full details see `the installation documentation`_.\n\nDiscussion\n~~~~~~~~~~\n\nIf you run into bugs, you can file them in our `issue tracker`_.\n\nWe maintain a `cryptography-dev`_ mailing list for development discussion.\n\nYou can also join ``#pyca`` on ``irc.libera.chat`` to ask questions or get\ninvolved.\n\nSecurity\n~~~~~~~~\n\nNeed to report a security issue? Please consult our `security reporting`_\ndocumentation.\n\n\n.. _`documentation`: https://cryptography.io/\n.. _`the installation documentation`: https://cryptography.io/en/latest/installation/\n.. _`issue tracker`: https://github.com/pyca/cryptography/issues\n.. _`cryptography-dev`: https://mail.python.org/mailman/listinfo/cryptography-dev\n.. _`security reporting`: https://cryptography.io/en/latest/security/\n\n",
        "description_content_type": "text/x-rst; charset=UTF-8",
        "author_email": "The Python Cryptographic Authority and individual contributors <cryptography-dev@python.org>",
        "license_expression": "Apache-2.0 OR BSD-3-Clause",
        "license_file": [
          "LICENSE",
          "LICENSE.APACHE",
          "LICENSE.BSD"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "Natural Language :: English",
          "Operating System :: MacOS :: MacOS X",
          "Operating System :: POSIX",
          "Operating System :: POSIX :: BSD",
          "Operating System :: POSIX :: Linux",
          "Operating System :: Microsoft :: Windows",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Programming Language :: Python :: Free Threading :: 3 - Stable",
          "Topic :: Security :: Cryptography"
        ],
        "requires_dist": [
          "cffi>=1.14 ; python_full_version == '3.8.*' and platform_python_implementation != 'PyPy'",
          "cffi>=2.0.0 ; python_full_version >= '3.9' and platform_python_implementation != 'PyPy'",
          "typing-extensions>=4.13.2 ; python_full_version < '3.11'",
          "bcrypt>=3.1.5 ; extra == 'ssh'",
          "nox[uv]>=2024.4.15 ; extra == 'nox'",
          "cryptography-vectors==46.0.7 ; extra == 'test'",
          "pytest>=7.4.0 ; extra == 'test'",
          "pytest-benchmark>=4.0 ; extra == 'test'",
          "pytest-cov>=2.10.1 ; extra == 'test'",
          "pytest-xdist>=3.5.0 ; extra == 'test'",
          "pretend>=0.7 ; extra == 'test'",
          "certifi>=2024 ; extra == 'test'",
          "pytest-randomly ; extra == 'test-randomorder'",
          "sphinx>=5.3.0 ; extra == 'docs'",
          "sphinx-rtd-theme>=3.0.0 ; extra == 'docs'",
          "sphinx-inline-tabs ; extra == 'docs'",
          "pyenchant>=3 ; extra == 'docstest'",
          "readme-renderer>=30.0 ; extra == 'docstest'",
          "sphinxcontrib-spelling>=7.3.1 ; extra == 'docstest'",
          "build>=1.0.0 ; extra == 'sdist'",
          "ruff>=0.11.11 ; extra == 'pep8test'",
          "mypy>=1.14 ; extra == 'pep8test'",
          "check-sdist ; extra == 'pep8test'",
          "click>=8.0.1 ; extra == 'pep8test'"
        ],
        "requires_python": ">=3.8, !=3.9.0, !=3.9.1",
        "project_url": [
          "homepage, https://github.com/pyca/cryptography",
          "documentation, https://cryptography.io/",
          "source, https://github.com/pyca/cryptography/",
          "issues, https://github.com/pyca/cryptography/issues",
          "changelog, https://cryptography.io/en/latest/changelog/"
        ],
        "provides_extra": [
          "ssh",
          "nox",
          "test",
          "test-randomorder",
          "docs",
          "docstest",
          "sdist",
          "pep8test"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/cryptography-46.0.7.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "ruamel.yaml",
        "version": "0.18.17",
        "dynamic": [
          "author",
          "author-email",
          "classifier",
          "description",
          "description-content-type",
          "keywords",
          "license",
          "license-file",
          "project-url",
          "provides-extra",
          "requires-python",
          "summary"
        ],
        "summary": "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order",
        "description": "# ruamel.yaml\n\n`ruamel.yaml` is a YAML 1.2 loader/dumper package for Python.\n\n| | |\n| - | - |\n| version |0.18.17 |\n| updated |2025-12-17 |\n| documentation |https://yaml.dev/doc/ruamel.yaml |\n| repository |https://sourceforge.net/projects/ruamel-yaml |\n| pypi |https://pypi.org/project/ruamel.yaml |\n\n\n## breaking changes, that may make future uploads to PyPI impossible\n\n*If you are interested in future upgrades of `ruamel.yaml`\nplease check the [documentation on installing](https://yaml.dev/doc/ruamel.yaml/install/),\nsince at some point I might not be able to upload a new version to PyPI with updated information.*\n\n`ruamel.yaml` was intentionally named as `yaml` in a namespace `ruamel`. The namespace allows the installation\nname to correspond unchanged to how the package is imported, reduces the number of links I have to create\nin site-packages of a Python install during development, as well as providing a recognisable set of packages\nmy company releases to the public. \n\nHowever, after uploading version 0.18.7, I got an email from PyPI, about having to change the project name\nto `ruamel_yaml` to comply with PEP 625, sometime in the future. The email doesn't say if namespace packages are\nno longer allowed, or how to deal with the very real clash with the pre-existing package `ruamel_yaml`.\n\nI might not be able to adapt `ruamel.yaml`, in\na way that does not negatively affect the 0.5 million daily downloads (and my own usage of the package) in time. \nMy experience with other such service downgrades (Bitbucket, Readthedocs), has not been entirely positive. \n\n-----\n\n\n\nThis is probably the last patch version of `ruamel.yaml` that installs pre-compiled\n`ruamel.yaml.clib`. This version already supports loading of the C extension\ncompiled using the Zig toolchain\n(i.e. without you having to have a compiler environment pre-installed).\n\nYou can test this by invoking (note the final z):\n```\npython -m pip install --no-deps ruamel.yaml ruamel.yaml.clibz\n\n```\nYou can however install both `ruamel.yaml.clib` and `ruamel.yaml.clibz`, in\nwhich case the latter is taken (e.g. by dropping `--no-deps` from the invocation)\n\nThe move to using zig eliminates having to generate the 60 or so .whl files\n(partly on unreliable services like AppVeyor and Github). Apart from that\nthe compilation on the target machine can fully optimize for that\narchitecture and its OS.\n\nBut the test matrix still has many dimensions:\n```\n    Python versions: 3.9 - 3.14\n    OS-es:           Linux, Alpine (musl), macOS, Windows\n    Architectures:   Intel/AMD, Arm (and others), in 64 and some also in 32 bit versions\n    Zig version:     ziglang < 0.16 is taken from PyPI\n```\nI try to test as much as possible, multiple Python versions were macOS-Arm and Ubuntu Linux-Intel.\nAnd at least one Python version along each of the indicated positions of the\ndimensions above (e.g. Windows10 64bit was tested, but not the RISC-V architecture).\n\nIn 0.19 the loading mechanism will be reversed: defaulting to installing and using\n`ruamel.yaml.clibz` unless `ruamel.yaml.clib` is installed. This backwards\ncompatibility will be dropped at the end of the 0.19 series.\n*Pin the version that you are relying on, until you can test the changes to work for you.*\n\n-------\n\n\nAs announced, in 0.18.0, the old PyYAML functions have been deprecated.\n(`scan`, `parse`, `compose`, `load`, `emit`, `serialize`, `dump` and their variants\n(`_all`, `safe_`, `round_trip_`, etc)). If you only read this after your program has \nstopped working: I am sorry to hear that, but that also means you, or the person \ndeveloping your program, has not tested with warnings on (which is the recommendation \nin PEP 565, and e.g. defaulting when using `pytest`). If you have troubles, explicitly use\n```\npip install \"ruamel.yaml<0.18.0\"\n```\nor put something to that effects in your requirments, to give yourself\nsome time to solve the issue.\n\nThere will be at least one more potentially breaking change in the 0.18 series: `YAML(typ='unsafe')`\nnow has a pending deprecation warning and is going to be deprecated, probably before the end of 2023.\nIf you only use it to dump, please use the new `YAML(typ='full')`, the result of that can be *safely*\nloaded with a default  instance `YAML()`, as that will get you inspectable, tagged, scalars, instead of\nexecuted Python functions/classes. (You should probably add constructors for what you actually need, \nbut I do consider adding a `ruamel.yaml.unsafe` package that will re-add the `typ='unsafe'` option.\n*Please adjust/pin your dependencies accordingly if necessary.*\n\n\nThere seems to be a CVE on `ruamel.yaml`, stating that the `load()` function could be abused \nbecause of unchecked input. `load()` was never the default function (that was `round_trip_load()`\nbefore the new API came into existence. So the creator of that CVE was ill informed and\nprobably lazily assumed that since `ruamel.yaml` is a derivative of PyYAML (for which\na similar CVE exists), the same problem would still exist, without checking. \nSo the CVE was always inappropriate,  now just more so, as the call\nto the function `load()` with any input will terminate your program with an error message. If you \n(have to) care about such things as this CVE, my recommendation is to stop using Python\ncompletely, as `pickle.load()` can be abused in the same way as `load()` (and like unlike `load()` \nis only documented to be unsafe, without development-time warning. \n\nVersion 0.18.9 was the last one tested to be working with Python 3.7\nVersion 0.17.21 was the last one tested to be working on Python 3.5 and 3.6<BR>\nThe 0.16.13 release was the last that was tested to be working on Python 2.7.\n\n\nThere are two extra plug-in packages\n(`ruamel.yaml.bytes` and `ruamel.yaml.string`)\nfor those not wanting to do the streaming to a\n`io.BytesIO/StringIO` buffer themselves.\n\nIf your package uses `ruamel.yaml` and is not listed on PyPI, drop me an\nemail, preferably with some information on how you use the package (or a\nlink to the repository) and I'll keep you informed when the status of\nthe API is stable enough to make the transition.\n\nFor packaging purposes you can use a download of the [tar balls of tagged source](https://yaml.dev/ruamel-dl-tagged-releases)\n\n\n<a href=\"https://bestpractices.coreinfrastructure.org/projects/1128\"><img src=\"https://bestpractices.coreinfrastructure.org/projects/1128/badge\"></a>\n<a href=\"https://opensource.org/licenses/MIT\"><img src=\"https://sourceforge.net/p/ruamel-yaml/code/ci/default/tree/_doc/_static/license.svg?format=raw\"></a>\n<a href=\"https://pypi.org/project/ruamel.yaml/\"><img src=\"https://sourceforge.net/p/ruamel-yaml/code/ci/default/tree/_doc/_static/pypi.svg?format=raw\"></a>\n<a href=\"https://pypi.org/project/oitnb/\"><img src=\"https://sourceforge.net/p/oitnb/code/ci/default/tree/_doc/_static/oitnb.svg?format=raw\"></a>\n<a href=\"http://mypy-lang.org/\"><img src=\"http://www.mypy-lang.org/static/mypy_badge.svg\"></a>\n<a href=\"https://www.pepy.tech/projects/ruamel.yaml\"><img src=\"https://img.shields.io/pepy/dt/ruamel.yaml.svg\"></a>\n\n0.18.17 (2025-12-17):\n\n- try to load C functions from `_ruamel_yaml_clibz` first.\n\n0.18.16 (2025-10-22):\n\n- root level block style scalars that started with a directives-end marker or a document-end marker, are now indented 2 spaces.\n- merged fix for accessing end_marks on Tokens provided by [Toknak](https://sourceforge.net/u/taknok/)\n\n0.18.15 (2025-08-19):\n\n- duplicate merge keys are never allowed (not even with .allow_duplicate_keys = True\n- merge keys now keep there position if a key before the merge key gets deleted (previously a key after the merge key would move before it)\n\n0.18.14 (2025-06-09):\n\n- Fix issue with constructing dataclasses that have a default factoryi attribute, but were missing a mapping value for that attribute. Reported by [Victor Prieto](https://sourceforge.net/u/vsprieto/profile/)\n- the tagged release tar files can now also be downloaded from https://yaml.dev/ruamel-dl-tagged-releases/ please adjust if you use https://sourceforge.net/projects/ruamel-dl-tagged-releases/files/ as that repository in sourceforge will no longer be updated from some later date.\n\n0.18.13 (2025-06-06):\n\n- Fix line wrapping on plain scalars not observing width correctly. Issue 529, reported by [Sebastien Vermeille](https://sourceforge.net/u/svermeille/profile/)\n- Fix sha256 and length in RECORD files. Reported by [Evan](https://sourceforge.net/u/bempelise/profile/)\n\n0.18.12 (2025-05-30):\n\n- fix additional issue with extra space in double quoted string. Reported by [Saugat Pachhai](https://sourceforge.net/u/skshetry/profile/)\n- fix duplicate key url, now pointing to yaml.dev. Reported by [Hugo](https://sourceforge.net/u/hugovk/profile/)\n- fix broken RECORD file, which was a problem for uv, not pip. Reported by [konstin](https://sourceforge.net/u/konstin/profile/)\n\n0.18.11 (2025-05-19):\n\n- function `load_yaml_guess_indent` now takes an option `yaml` argument so you can provide an already created/configured `YAML` instance\n- Sequence item indicator with both comment/empty line before indicator **and** comment before sequence item, could not move comment and raise `NotImplementedError`. Reported by [Karsten Tessarzik](https://sourceforge.net/u/kars10/profile/).\n- missing f for f-string (reported by π, via email)\n- fixed issue with extra space in double quoted dump (reported by [Jan Möller](https://sourceforge.net/u/redfiredragon/profile/))\n\n0.18.10 (2025-01-06):\n\n- implemented changes to the setup.py for Python 3.14 as suggested by [Miro Hrončok](https://sourceforge.net/u/hroncok/profile/) in merge requests (MR not merged as those files are copied in from `develop` config)\n\n0.18.9 (2025-01-05):\n\n- fix issue with roundtripping 0 in YAML 1.1 reported by [Peter Law](https://sourceforge.net/u/peterjclaw/profile/)\n\n0.18.8 (2025-01-02):\n\n- added warning to README.md that PyPI might block updates due to breaking changes\n\n0.18.7 (2024-12-30):\n\n- fixes for README (reported by [Kees Bakker](https://sourceforge.net/u/keesb/profile/))\n- fixes preserving anchor on scalar integer `0` (issue reported by (Mor Peled)[https://sourceforge.net/u/morp/profile/] and also in a question by [Ravi](https://stackoverflow.com/users/6550398/ravi) on [Stackoverflow](https://stackoverflow.com/a/79306830/1307905))\n- fix for formatting of README suggested by [Michael R. Crusoe](https://sourceforge.net/u/crusoe/profile/)\n\n0.18.6 (2024-02-07):\n\n- fixed an issue with dataclass loading when the fields were collections (bug found as a result of a question by [FibroMyAlgebra](https://stackoverflow.com/users/6855070/fibromyalgebra) on [StackOverflow](https://stackoverflow.com/a/77485786/1307905))\n- fixed an issue loading dataclasses with `InitVar` fields when `from __future__ import annotations` was used to delay evaluation of typing.\n\n0.18.5 (2023-11-03):\n\n- there is some indication that dependent packages have been pinned to use specific (tested) and just install the latest even in Python versions that have end-of-life\n\n0.18.4 (2023-11-01):\n\n- YAML() instance has a `doc_infos` attribute which is a cumulative list of DocInfo instances (one for `load()`, one per document for `load_all()`). DocInfo instances contain version information (requested, directive) and tag directive information\n- fix issue that the YAML instance tags attribute was not reset between documents, resulting in mixing of tag directives of multiple documents. Now only provides tag directive information on latest document after loading. This means tags for dumping must be set **again** after a document is loaded with the same instance. (because of this tags will be removed in a favour of a different mechanism in the future)\n- fix issue with multiple document intermixing YAML 1.2 and YAML 1.1, the VersionedResolver now resets\n- fix issue with disappearing comment when next token was Tag (still can't have both a comment before a tag and after a tag, before node)\n\n0.18.3 (2023-10-29):\n\n- fix issue with spurious newline on first item after comment + nested block sequence\n- additional links in the metadata on PyPI (Reported, with pointers how to fix, by [Sorin](https://sourceforge.net/u/ssbarnea/profile/)).\n\n0.18.2 (2023-10-24):\n\n- calling the deprecated functions now raises an `AttributeError` with the, somewhat more informative, orginal warning message. Instead of calling `sys.exit(1)`\n\n0.18.1 (2023-10-24):\n\n- calling the deprecated functions now always displays the warning message. (reported by [Trend Lloyd](https://sourceforge.net/u/lathiat2/profile/))\n\n0.18.0 (2023-10-23):\n\n- the **functions** `scan`, `parse`, `compose`, `load`, `emit`, `serialize`, `dump` and their variants (`_all`, `safe_`, `round_trip_`, etc) have been deprecated (the same named **methods** on `YAML()` instances are, of course, still there.\n- `YAML(typ='unsafe')` now issues a `PendingDeprecationWarning`. This will become deprecated in the 0.18 series\n(probably before the end of 2023).\nYou can use `YAML(typ='full')` to dump unregistered Python classes/functions. \nFor loading you'll have to register your classes/functions\nif you want the old, unsafe, functionality. You can still load any tag, like `!!python/name:posix.system', **safely** \nwith the (default) round-trip parser.\n- fix for `bytes-like object is required not 'str' while dumping binary streams`. This was reported, analysed and a fix provided by [Vit Zikmund](https://sourceforge.net/u/tlwhitec/profile/)\n\n0.17.40 (2023-10-20):\n\n- flow style sets are now preserved ( `!!set {a, b, c} )`. Any values specified when loading are dropped, including `!!null \"\"`.\n- potential workaround for issue 484: the long_description_content_type including the variant specification `CommonMark`\ncan result in problems on Azure. If you can install from `.tar.gz` using\n`RUAMEL_NO_LONG_DESCRIPTION=1 pip install ruamel.yaml --no-binary :all:` then the long description, and its\noffending type, are nog included (in the METADATA). \n(Reported by [Coury Ditch](https://sourceforge.net/u/cmditch/profile/))\n- links in documentation update (reported by [David Hoese](https://sourceforge.net/u/daveydave400/profile/))\n- Added some `__repr__` for internally used classes\n\n0.17.39 (2023-10-19):\n\n- update README generation, no code changes\n\n0.17.36 (2023-10-19):\n\n- fixed issue 480, dumping of a loaded empty flow-style mapping with comment failed (Reported by [Stéphane Brunner](https://sourceforge.net/u/stbrunner/profile/))\n- fixed issue 482, caused by DEFAULT_MAPPING_TAG having changes to being a `Tag()` instance, not a string (reported by [yan12125](https://sourceforge.net/u/yan12125/profile/))\n- updated documentation to use mkdocs\n\n0.17.35 (2023-10-04):\n\n- support for loading dataclasses with `InitVar` variables (some special coding was necessary to get the, unexecpected, default value in the corresponding instance attribute ( example of usage in [this question](https://stackoverflow.com/q/77228378/1307905))\n\n0.17.34 (2023-10-03):\n\n- Python 3.12 also loads C version when using `typ='safe'`\n- initial support for loading invoking\n`__post_init__()` on dataclasses that have that\nmethod after loading a registered dataclass.\n(Originally\n[asked](https://stackoverflow.com/q/51529458/1307905) on\nStackoverflow by\n[nyanpasu64](https://stackoverflow.com/users/2683842/nyanpasu64)\nand as\n[ticket](https://sourceforge.net/p/ruamel-yaml/tickets/355/) by\n[Patrick Lehmann](https://sourceforge.net/u/paebbels/profile/))\n\n```\n@yaml.register_class\n@dataclass\nclass ...\n```\n\n0.17.33 (2023-09-28):\n\n- added `flow_seq_start`, `flow_seq_end`, `flow_seq_separator`, `flow_map_start`, `flow_map_end`, `flow_map_separator` **class** attributes to the `Emitter` class so flow style output can more easily be influenced (based on [this answer](https://stackoverflow.com/a/76547814/1307905) on a StackOverflow question by [Huw Walters](https://stackoverflow.com/users/291033/huw-walters)).\n\n0.17.32 (2023-06-17):\n\n- fix issue with scanner getting stuck in infinite loop\n\n0.17.31 (2023-05-31):\n\n- added tag.setter on `ScalarEvent` and on `Node`, that takes either a `Tag` instance, or a str (reported by [Sorin Sbarnea](https://sourceforge.net/u/ssbarnea/profile/))\n\n0.17.30 (2023-05-30):\n\n- fix issue 467, caused by Tag instances not being hashable (reported by [Douglas Raillard](https://bitbucket.org/%7Bcf052d92-a278-4339-9aa8-de41923bb556%7D/))\n\n0.17.29 (2023-05-30):\n\n- changed the internals of the tag property from a string to a class which allows for preservation of the original handle and suffix. This should result in better results using documents with %TAG directives, as well as preserving URI escapes in tag suffixes.\n\n0.17.28 (2023-05-26):\n\n- fix for issue 464: documents ending with document end marker\nwithout final newline fail to load (reported by [Mariusz\nRusiniak](https://sourceforge.net/u/r2dan/profile/))\n\n0.17.27 (2023-05-25):\n\n- fix issue with inline mappings as value for merge keys (reported by Sirish on [StackOverflow](https://stackoverflow.com/q/76331049/1307905))\n- fix for 468, error inserting after accessing merge attribute on `CommentedMap` (reported by [Bastien gerard](https://sourceforge.net/u/bagerard/))\n- fix for issue 461 pop + insert on same `CommentedMap` key throwing error (reported by [John Thorvald Wodder II](https://sourceforge.net/u/jwodder/profile/))\n\n0.17.26 (2023-05-09):\n\n- fix for error on edge cage for issue 459\n\n0.17.25 (2023-05-09):\n\n- fix for regression while dumping wrapped strings with too many backslashes removed (issue 459, reported by [Lele Gaifax](https://sourceforge.net/u/lele/profile/))\n\n0.17.24 (2023-05-06):\n\n- rewrite of `CommentedMap.insert()`. If you have a merge key in the YAML document for the mapping you insert to, the position value should be the one as you look at the YAML input. This fixes issue 453 where other keys of a merged in mapping would show up after an insert (reported by [Alex Miller](https://sourceforge.net/u/millerdevel/profile/)). It also fixes a call to `.insert()` resulting into the merge key to move to be the first key if it wasn't already and it is also now possible to insert a key before a merge key (even if the fist key in the mapping).\n- fix (in the pure Python implementation including default) for issue 447. (reported by [Jack Cherng](https://sourceforge.net/u/jfcherng/profile/), also brought up by brent on [StackOverflow](https://stackoverflow.com/q/40072485/1307905))\n\n0.17.23 (2023-05-05):\n\n- fix 458, error on plain scalars starting with word longer than width. (reported by [Kyle Larose](https://sourceforge.net/u/klarose/profile/))\n- fix for `.update()` no longer correctly handling keyword arguments (reported by John Lin on [StackOverflow]( https://stackoverflow.com/q/76089100/1307905))\n- fix issue 454: high Unicode (emojis) in quoted strings always\nescaped (reported by [Michal\nČihař](https://sourceforge.net/u/nijel/profile/) based on a\nquestion on StackOverflow).\n- fix issue with emitter conservatively inserting extra backslashes in wrapped quoted strings (reported by thebenman on [StackOverflow](https://stackoverflow.com/q/75631454/1307905))\n\n0.17.22 (2023-05-02):\n\n- fix issue 449 where the second exclamation marks got URL encoded (reported and fixing PR provided by [John Stark](https://sourceforge.net/u/jods/profile/))\n- fix issue with indent != 2 and literal scalars with empty first line (reported by wrdis on [StackOverflow](https://stackoverflow.com/q/75584262/1307905))\n- updated `__repr__` of CommentedMap, now that Python's dict is ordered -> no more `ordereddict(list-of-tuples)`\n- merge MR 4, handling OctalInt in YAML 1.1 (provided by [Jacob Floyd](https://sourceforge.net/u/cognifloyd/profile/))\n- fix loading of `!!float 42` (reported by Eric on [Stack overflow](https://stackoverflow.com/a/71555107/1307905))\n- line numbers are now set on `CommentedKeySeq` and `CommentedKeyMap` (which are created if you have a sequence resp. mapping as the key in a mapping)\n- plain scalars: put single words longer than width on a line of\ntheir own, instead of after the previous line (issue 427, reported\nby [Antoine\nCotten](https://sourceforge.net/u/antoineco/profile/)). Caveat:\nthis currently results in a space ending the previous line.\n- fix for folded scalar part of 421: comments after \">\" on first\nline of folded scalars are now preserved (as were those in the\nsame position on literal scalars). Issue reported by Jacob Floyd.\n- added stacklevel to warnings\n- typing changed from Py2 compatible comments to Py3, removed various Py2-isms\n\n0.17.21 (2022-02-12):\n\n- fix bug in calling `.compose()` method with `pathlib.Path` instance.\n\n0.17.20 (2022-01-03):\n\n- fix error in microseconds while rounding datetime fractions >= 9999995 (reported by [Luis Ferreira](https://sourceforge.net/u/ljmf00/))\n\n0.17.19 (2021-12-26):\n\n- fix mypy problems (reported by [Arun](https://sourceforge.net/u/arunppsg/profile/))\n\n0.17.18 (2021-12-24):\n\n- copy-paste error in folded scalar comment attachment (reported by [Stephan Geulette](https://sourceforge.net/u/sgeulette/profile/))\n- fix 411, indent error comment between key empty seq value (reported by [Guillermo Julián](https://sourceforge.net/u/gjulianm/profile/))\n\n0.17.17 (2021-10-31):\n\n- extract timestamp matching/creation to util\n\n0.17.16 (2021-08-28):\n\n- 398 also handle issue 397 when comment is newline\n\n0.17.15 (2021-08-28):\n\n- fix issue 397, insert comment before key when a comment between key and value exists (reported by [Bastien gerard](https://sourceforge.net/u/bagerard/))\n\n0.17.14 (2021-08-25):\n\n- fix issue 396, inserting key/val in merged-in dictionary (reported by [Bastien gerard](https://sourceforge.net/u/bagerard/))\n\n0.17.13 (2021-08-21):\n\n- minor fix in attr handling\n\n0.17.12 (2021-08-21):\n\n- fix issue with anchor on registered class not preserved and those classes using package attrs with `@attr.s()` (both reported by [ssph](https://sourceforge.net/u/sph/))\n\n0.17.11 (2021-08-19):\n\n- fix error baseclass for `DuplicateKeyError` (reported by [Łukasz Rogalski](https://sourceforge.net/u/lrogalski/))\n- fix typo in reader error message, causing `KeyError` during reader error (reported by [MTU](https://sourceforge.net/u/mtu/))\n\n0.17.10 (2021-06-24):\n\n- fix issue 388, token with old comment structure != two elements (reported by [Dimitrios Bariamis](https://sourceforge.net/u/dbdbc/))\n\n0.17.9 (2021-06-10):\n\n- fix issue with updating CommentedMap (reported by sri on [StackOverflow](https://stackoverflow.com/q/67911659/1307905))\n\n0.17.8 (2021-06-09):\n\n- fix for issue 387 where templated anchors on tagged object did get set resulting in potential id reuse. (reported by [Artem Ploujnikov](https://sourceforge.net/u/flexthink/))\n\n0.17.7 (2021-05-31):\n\n- issue 385 also affected other deprecated loaders (reported via email by Oren Watson)\n\n0.17.6 (2021-05-31):\n\n- merged type annotations update provided by [Jochen Sprickerhof](https://sourceforge.net/u/jspricke/)\n- fix for issue 385: deprecated round_trip_loader function not\nworking (reported by [Mike\nGouline](https://sourceforge.net/u/gouline/))\n- wasted a few hours getting rid of mypy warnings/errors\n\n0.17.5 (2021-05-30):\n\n- fix for issue 384 `!!set` with aliased entry resulting in broken YAML on rt reported by [William Kimball](https://sourceforge.net/u/william303/))\n\n0.17.4 (2021-04-07):\n\n- prevent (empty) comments from throwing assertion error (issue 351 reported by [William Kimball](https://sourceforge.net/u/william303/)) comments (or empty line) will be dropped\n\n0.17.3 (2021-04-07):\n\n- fix for issue 382 caused by an error in a format string (reported by [William Kimball](https://sourceforge.net/u/william303/))\n- allow expansion of aliases by setting `yaml.composer.return_alias = lambda s: copy.deepcopy(s)`\n(as per [Stackoverflow answer](https://stackoverflow.com/a/66983530/1307905))\n\n0.17.2 (2021-03-29):\n\n- change -py2.py3-none-any.whl to -py3-none-any.whl, and remove 0.17.1\n\n0.17.1 (2021-03-29):\n\n- added 'Programming Language :: Python :: 3 :: Only', and\nremoving 0.17.0 from PyPI (reported by [Alasdair\nNicol](https://sourceforge.net/u/alasdairnicol/))\n\n0.17.0 (2021-03-26):\n\n- removed because of incomplete classifiers\n- this release no longer supports Python 2.7, most if not all Python 2 specific code is removed. The 0.17.x series is the last to support Python 3.5 (this also allowed for removal of the dependency on `ruamel.std.pathlib`)\n- remove Python2 specific code branches and adaptations (u-strings)\n- prepare % code for f-strings using `_F`\n- allow PyOxidisation ([issue 324](https://sourceforge.net/p/ruamel-yaml/tickets/324/) resp. [issue 171](https://github.com/indygreg/PyOxidizer/issues/171))\n- replaced Python 2 compatible enforcement of keyword arguments with '*'\n- the old top level *functions* `load`, `safe_load`, `round_trip_load`, `dump`, `safe_dump`, `round_trip_dump`, `scan`, `parse`, `compose`, `emit`, `serialize` as well as their `_all` variants for multi-document streams, now issue a `PendingDeprecationning` (e.g. when run from pytest, but also Python is started with `-Wd`). Use the methods on `YAML()`, which have been extended.\n- fix for issue 376: indentation changes could put literal/folded\nscalar to start before the `#` column of a following comment.\nEffectively making the comment part of the scalar in the output.\n(reported by [Bence Nagy](https://sourceforge.net/u/underyx/))\n\n\n------------------------------------------------------------------------\n\nFor older changes see the file\n[CHANGES](https://sourceforge.net/p/ruamel-yaml/code/ci/default/tree/CHANGES)\n",
        "description_content_type": "text/markdown; charset=UTF-8; variant=CommonMark",
        "keywords": [
          "yaml",
          "1.2",
          "parser",
          "round-trip",
          "preserve",
          "quotes",
          "order",
          "config"
        ],
        "author": "Anthon van der Neut",
        "author_email": "a.van.der.neut@ruamel.eu",
        "license": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 4 - Beta",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: MIT License",
          "Operating System :: OS Independent",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Implementation :: CPython",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Topic :: Text Processing :: Markup",
          "Typing :: Typed"
        ],
        "requires_dist": [
          "ruamel.yaml.clib>=0.2.15; platform_python_implementation == \"CPython\" and python_version < \"3.15\"",
          "ruamel.yaml.jinja2>=0.2; extra == \"jinja2\"",
          "ryd; extra == \"docs\"",
          "mercurial>5.7; extra == \"docs\""
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Home, https://sourceforge.net/p/ruamel-yaml/",
          "Source, https://sourceforge.net/p/ruamel-yaml/code/ci/default/tree/",
          "Tracker, https://sourceforge.net/p/ruamel-yaml/tickets/",
          "Documentation, https://yaml.dev/doc/ruamel.yaml"
        ],
        "provides_extra": [
          "jinja2",
          "docs"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/ruamel_yaml-0.18.17.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "h11",
        "version": "0.16.0",
        "dynamic": [
          "author",
          "author-email",
          "classifier",
          "description",
          "home-page",
          "license",
          "license-file",
          "requires-python",
          "summary"
        ],
        "summary": "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1",
        "description": "h11\n===\n\n.. image:: https://travis-ci.org/python-hyper/h11.svg?branch=master\n   :target: https://travis-ci.org/python-hyper/h11\n   :alt: Automated test status\n\n.. image:: https://codecov.io/gh/python-hyper/h11/branch/master/graph/badge.svg\n   :target: https://codecov.io/gh/python-hyper/h11\n   :alt: Test coverage\n\n.. image:: https://readthedocs.org/projects/h11/badge/?version=latest\n   :target: http://h11.readthedocs.io/en/latest/?badge=latest\n   :alt: Documentation Status\n\nThis is a little HTTP/1.1 library written from scratch in Python,\nheavily inspired by `hyper-h2 <https://hyper-h2.readthedocs.io/>`_.\n\nIt's a \"bring-your-own-I/O\" library; h11 contains no IO code\nwhatsoever. This means you can hook h11 up to your favorite network\nAPI, and that could be anything you want: synchronous, threaded,\nasynchronous, or your own implementation of `RFC 6214\n<https://tools.ietf.org/html/rfc6214>`_ -- h11 won't judge you.\n(Compare this to the current state of the art, where every time a `new\nnetwork API <https://trio.readthedocs.io/>`_ comes along then someone\ngets to start over reimplementing the entire HTTP protocol from\nscratch.) Cory Benfield made an `excellent blog post describing the\nbenefits of this approach\n<https://lukasa.co.uk/2015/10/The_New_Hyper/>`_, or if you like video\nthen here's his `PyCon 2016 talk on the same theme\n<https://www.youtube.com/watch?v=7cC3_jGwl_U>`_.\n\nThis also means that h11 is not immediately useful out of the box:\nit's a toolkit for building programs that speak HTTP, not something\nthat could directly replace ``requests`` or ``twisted.web`` or\nwhatever. But h11 makes it much easier to implement something like\n``requests`` or ``twisted.web``.\n\nAt a high level, working with h11 goes like this:\n\n1) First, create an ``h11.Connection`` object to track the state of a\n   single HTTP/1.1 connection.\n\n2) When you read data off the network, pass it to\n   ``conn.receive_data(...)``; you'll get back a list of objects\n   representing high-level HTTP \"events\".\n\n3) When you want to send a high-level HTTP event, create the\n   corresponding \"event\" object and pass it to ``conn.send(...)``;\n   this will give you back some bytes that you can then push out\n   through the network.\n\nFor example, a client might instantiate and then send a\n``h11.Request`` object, then zero or more ``h11.Data`` objects for the\nrequest body (e.g., if this is a POST), and then a\n``h11.EndOfMessage`` to indicate the end of the message. Then the\nserver would then send back a ``h11.Response``, some ``h11.Data``, and\nits own ``h11.EndOfMessage``. If either side violates the protocol,\nyou'll get a ``h11.ProtocolError`` exception.\n\nh11 is suitable for implementing both servers and clients, and has a\npleasantly symmetric API: the events you send as a client are exactly\nthe ones that you receive as a server and vice-versa.\n\n`Here's an example of a tiny HTTP client\n<https://github.com/python-hyper/h11/blob/master/examples/basic-client.py>`_\n\nIt also has `a fine manual <https://h11.readthedocs.io/>`_.\n\nFAQ\n---\n\n*Whyyyyy?*\n\nI wanted to play with HTTP in `Curio\n<https://curio.readthedocs.io/en/latest/tutorial.html>`__ and `Trio\n<https://trio.readthedocs.io>`__, which at the time didn't have any\nHTTP libraries. So I thought, no big deal, Python has, like, a dozen\ndifferent implementations of HTTP, surely I can find one that's\nreusable. I didn't find one, but I did find Cory's call-to-arms\nblog-post. So I figured, well, fine, if I have to implement HTTP from\nscratch, at least I can make sure no-one *else* has to ever again.\n\n*Should I use it?*\n\nMaybe. You should be aware that it's a very young project. But, it's\nfeature complete and has an exhaustive test-suite and complete docs,\nso the next step is for people to try using it and see how it goes\n:-). If you do then please let us know -- if nothing else we'll want\nto talk to you before making any incompatible changes!\n\n*What are the features/limitations?*\n\nRoughly speaking, it's trying to be a robust, complete, and non-hacky\nimplementation of the first \"chapter\" of the HTTP/1.1 spec: `RFC 7230:\nHTTP/1.1 Message Syntax and Routing\n<https://tools.ietf.org/html/rfc7230>`_. That is, it mostly focuses on\nimplementing HTTP at the level of taking bytes on and off the wire,\nand the headers related to that, and tries to be anal about spec\nconformance. It doesn't know about higher-level concerns like URL\nrouting, conditional GETs, cross-origin cookie policies, or content\nnegotiation. But it does know how to take care of framing,\ncross-version differences in keep-alive handling, and the \"obsolete\nline folding\" rule, so you can focus your energies on the hard /\ninteresting parts for your application, and it tries to support the\nfull specification in the sense that any useful HTTP/1.1 conformant\napplication should be able to use h11.\n\nIt's pure Python, and has no dependencies outside of the standard\nlibrary.\n\nIt has a test suite with 100.0% coverage for both statements and\nbranches.\n\nCurrently it supports Python 3 (testing on 3.8-3.12) and PyPy 3.\nThe last Python 2-compatible version was h11 0.11.x.\n(Originally it had a Cython wrapper for `http-parser\n<https://github.com/nodejs/http-parser>`_ and a beautiful nested state\nmachine implemented with ``yield from`` to postprocess the output. But\nI had to take these out -- the new *parser* needs fewer lines-of-code\nthan the old *parser wrapper*, is written in pure Python, uses no\nexotic language syntax, and has more features. It's sad, really; that\nold state machine was really slick. I just need a few sentences here\nto mourn that.)\n\nI don't know how fast it is. I haven't benchmarked or profiled it yet,\nso it's probably got a few pointless hot spots, and I've been trying\nto err on the side of simplicity and robustness instead of\nmicro-optimization. But at the architectural level I tried hard to\navoid fundamentally bad decisions, e.g., I believe that all the\nparsing algorithms remain linear-time even in the face of pathological\ninput like slowloris, and there are no byte-by-byte loops. (I also\nbelieve that it maintains bounded memory usage in the face of\narbitrary/pathological input.)\n\nThe whole library is ~800 lines-of-code. You can read and understand\nthe whole thing in less than an hour. Most of the energy invested in\nthis so far has been spent on trying to keep things simple by\nminimizing special-cases and ad hoc state manipulation; even though it\nis now quite small and simple, I'm still annoyed that I haven't\nfigured out how to make it even smaller and simpler. (Unfortunately,\nHTTP does not lend itself to simplicity.)\n\nThe API is ~feature complete and I don't expect the general outlines\nto change much, but you can't judge an API's ergonomics until you\nactually document and use it, so I'd expect some changes in the\ndetails.\n\n*How do I try it?*\n\n.. code-block:: sh\n\n  $ pip install h11\n  $ git clone git@github.com:python-hyper/h11\n  $ cd h11/examples\n  $ python basic-client.py\n\nand go from there.\n\n*License?*\n\nMIT\n\n*Code of conduct?*\n\nContributors are requested to follow our `code of conduct\n<https://github.com/python-hyper/h11/blob/master/CODE_OF_CONDUCT.md>`_ in\nall project spaces.\n",
        "home_page": "https://github.com/python-hyper/h11",
        "author": "Nathaniel J. Smith",
        "author_email": "njs@pobox.com",
        "license": "MIT",
        "license_file": [
          "LICENSE.txt"
        ],
        "classifier": [
          "Development Status :: 3 - Alpha",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: MIT License",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Topic :: Internet :: WWW/HTTP",
          "Topic :: System :: Networking"
        ],
        "requires_python": ">=3.8"
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/h11-0.16.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "cffi",
        "version": "2.0.0",
        "dynamic": [
          "license-file"
        ],
        "summary": "Foreign Function Interface for Python calling C code.",
        "description": "[![GitHub Actions Status](https://github.com/python-cffi/cffi/actions/workflows/ci.yaml/badge.svg?branch=main)](https://github.com/python-cffi/cffi/actions/workflows/ci.yaml?query=branch%3Amain++)\n[![PyPI version](https://img.shields.io/pypi/v/cffi.svg)](https://pypi.org/project/cffi)\n[![Read the Docs](https://img.shields.io/badge/docs-latest-blue.svg)][Documentation]\n\n\nCFFI\n====\n\nForeign Function Interface for Python calling C code.\n\nPlease see the [Documentation] or uncompiled in the `doc/` subdirectory.\n\nDownload\n--------\n\n[Download page](https://github.com/python-cffi/cffi/releases)\n\nSource Code\n-----------\n\nSource code is publicly available on\n[GitHub](https://github.com/python-cffi/cffi).\n\nContact\n-------\n\n[Mailing list](https://groups.google.com/forum/#!forum/python-cffi)\n\nTesting/development tips\n------------------------\n\nAfter `git clone` or `wget && tar`, we will get a directory called `cffi` or `cffi-x.x.x`. we call it `repo-directory`. To run tests under CPython, run the following in the `repo-directory`:\n\n    pip install pytest\n    pip install -e .  # editable install of CFFI for local development\n    pytest src/c/ testing/\n\n[Documentation]: http://cffi.readthedocs.org/\n",
        "description_content_type": "text/markdown",
        "author": "Armin Rigo, Maciej Fijalkowski",
        "maintainer": "Matt Davis, Matt Clay, Matti Picus",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE",
          "AUTHORS"
        ],
        "classifier": [
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Programming Language :: Python :: Free Threading :: 2 - Beta",
          "Programming Language :: Python :: Implementation :: CPython"
        ],
        "requires_dist": [
          "pycparser; implementation_name != \"PyPy\""
        ],
        "requires_python": ">=3.9",
        "project_url": [
          "Documentation, https://cffi.readthedocs.io/",
          "Changelog, https://cffi.readthedocs.io/en/latest/whatsnew.html",
          "Downloads, https://github.com/python-cffi/cffi/releases",
          "Contact, https://groups.google.com/forum/#!forum/python-cffi",
          "Source Code, https://github.com/python-cffi/cffi",
          "Issue Tracker, https://github.com/python-cffi/cffi/issues"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/cffi-2.0.0.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.1",
        "name": "psutil",
        "version": "7.2.2",
        "platform": [
          "Platform Independent"
        ],
        "summary": "Cross-platform lib for process and system monitoring.",
        "description": "|  |downloads| |stars| |forks| |contributors| |packages|\n|  |version| |license| |stackoverflow| |twitter| |tidelift|\n|  |github-actions-wheels| |github-actions-bsd|\n\n.. |downloads| image:: https://img.shields.io/pypi/dm/psutil.svg\n    :target: https://clickpy.clickhouse.com/dashboard/psutil\n    :alt: Downloads\n\n.. |stars| image:: https://img.shields.io/github/stars/giampaolo/psutil.svg\n    :target: https://github.com/giampaolo/psutil/stargazers\n    :alt: Github stars\n\n.. |forks| image:: https://img.shields.io/github/forks/giampaolo/psutil.svg\n    :target: https://github.com/giampaolo/psutil/network/members\n    :alt: Github forks\n\n.. |contributors| image:: https://img.shields.io/github/contributors/giampaolo/psutil.svg\n    :target: https://github.com/giampaolo/psutil/graphs/contributors\n    :alt: Contributors\n\n.. |stackoverflow| image:: https://img.shields.io/badge/stackoverflow-Ask%20questions-blue.svg\n    :target: https://stackoverflow.com/questions/tagged/psutil\n    :alt: Stackoverflow\n\n.. |github-actions-wheels| image:: https://img.shields.io/github/actions/workflow/status/giampaolo/psutil/.github/workflows/build.yml.svg?label=Linux%2C%20macOS%2C%20Windows\n    :target: https://github.com/giampaolo/psutil/actions?query=workflow%3Abuild\n    :alt: Linux, macOS, Windows\n\n.. |github-actions-bsd| image:: https://img.shields.io/github/actions/workflow/status/giampaolo/psutil/.github/workflows/bsd.yml.svg?label=FreeBSD,%20NetBSD,%20OpenBSD\n    :target: https://github.com/giampaolo/psutil/actions?query=workflow%3Absd-tests\n    :alt: FreeBSD, NetBSD, OpenBSD\n\n.. |version| image:: https://img.shields.io/pypi/v/psutil.svg?label=pypi\n    :target: https://pypi.org/project/psutil\n    :alt: Latest version\n\n.. |packages| image:: https://repology.org/badge/tiny-repos/python:psutil.svg\n    :target: https://repology.org/metapackage/python:psutil/versions\n    :alt: Binary packages\n\n.. |license| image:: https://img.shields.io/pypi/l/psutil.svg\n    :target: https://github.com/giampaolo/psutil/blob/master/LICENSE\n    :alt: License\n\n.. |twitter| image:: https://img.shields.io/twitter/follow/grodola?style=flat\n    :target: https://twitter.com/grodola\n    :alt: Twitter Follow\n\n.. |tidelift| image:: https://tidelift.com/badges/github/giampaolo/psutil?style=flat\n    :target: https://tidelift.com/subscription/pkg/pypi-psutil?utm_source=pypi-psutil&utm_medium=referral&utm_campaign=readme\n    :alt: Tidelift\n\n-----\n\nQuick links\n===========\n\n- `Home page <https://github.com/giampaolo/psutil>`_\n- `Install <https://github.com/giampaolo/psutil/blob/master/INSTALL.rst>`_\n- `Documentation <http://psutil.readthedocs.io>`_\n- `Download <https://pypi.org/project/psutil/#files>`_\n- `Forum <http://groups.google.com/group/psutil/topics>`_\n- `StackOverflow <https://stackoverflow.com/questions/tagged/psutil>`_\n- `Blog <https://gmpy.dev/tags/psutil>`_\n- `What's new <https://github.com/giampaolo/psutil/blob/master/HISTORY.rst>`_\n\n\nSummary\n=======\n\npsutil (process and system utilities) is a cross-platform library for\nretrieving information on **running processes** and **system utilization**\n(CPU, memory, disks, network, sensors) in Python.\nIt is useful mainly for **system monitoring**, **profiling and limiting process\nresources** and **management of running processes**.\nIt implements many functionalities offered by classic UNIX command line tools\nsuch as *ps, top, iotop, lsof, netstat, ifconfig, free* and others.\npsutil currently supports the following platforms:\n\n- **Linux**\n- **Windows**\n- **macOS**\n- **FreeBSD, OpenBSD**, **NetBSD**\n- **Sun Solaris**\n- **AIX**\n\nSupported Python versions are cPython 3.6+ and `PyPy <https://pypy.org/>`__.\nLatest psutil version supporting Python 2.7 is\n`psutil 6.1.1 <https://pypi.org/project/psutil/6.1.1/>`__.\n\nExample usages\n==============\n\nThis represents pretty much the whole psutil API.\n\nCPU\n---\n\n.. code-block:: python\n\n    >>> import psutil\n    >>>\n    >>> psutil.cpu_times()\n    scputimes(user=3961.46, nice=169.729, system=2150.659, idle=16900.540, iowait=629.59, irq=0.0, softirq=19.42, steal=0.0, guest=0, guest_nice=0.0)\n    >>>\n    >>> for x in range(3):\n    ...     psutil.cpu_percent(interval=1)\n    ...\n    4.0\n    5.9\n    3.8\n    >>>\n    >>> for x in range(3):\n    ...     psutil.cpu_percent(interval=1, percpu=True)\n    ...\n    [4.0, 6.9, 3.7, 9.2]\n    [7.0, 8.5, 2.4, 2.1]\n    [1.2, 9.0, 9.9, 7.2]\n    >>>\n    >>> for x in range(3):\n    ...     psutil.cpu_times_percent(interval=1, percpu=False)\n    ...\n    scputimes(user=1.5, nice=0.0, system=0.5, idle=96.5, iowait=1.5, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)\n    scputimes(user=1.0, nice=0.0, system=0.0, idle=99.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)\n    scputimes(user=2.0, nice=0.0, system=0.0, idle=98.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)\n    >>>\n    >>> psutil.cpu_count()\n    4\n    >>> psutil.cpu_count(logical=False)\n    2\n    >>>\n    >>> psutil.cpu_stats()\n    scpustats(ctx_switches=20455687, interrupts=6598984, soft_interrupts=2134212, syscalls=0)\n    >>>\n    >>> psutil.cpu_freq()\n    scpufreq(current=931.42925, min=800.0, max=3500.0)\n    >>>\n    >>> psutil.getloadavg()  # also on Windows (emulated)\n    (3.14, 3.89, 4.67)\n\nMemory\n------\n\n.. code-block:: python\n\n    >>> psutil.virtual_memory()\n    svmem(total=10367352832, available=6472179712, percent=37.6, used=8186245120, free=2181107712, active=4748992512, inactive=2758115328, buffers=790724608, cached=3500347392, shared=787554304)\n    >>> psutil.swap_memory()\n    sswap(total=2097147904, used=296128512, free=1801019392, percent=14.1, sin=304193536, sout=677842944)\n    >>>\n\nDisks\n-----\n\n.. code-block:: python\n\n    >>> psutil.disk_partitions()\n    [sdiskpart(device='/dev/sda1', mountpoint='/', fstype='ext4', opts='rw,nosuid'),\n     sdiskpart(device='/dev/sda2', mountpoint='/home', fstype='ext', opts='rw')]\n    >>>\n    >>> psutil.disk_usage('/')\n    sdiskusage(total=21378641920, used=4809781248, free=15482871808, percent=22.5)\n    >>>\n    >>> psutil.disk_io_counters(perdisk=False)\n    sdiskio(read_count=719566, write_count=1082197, read_bytes=18626220032, write_bytes=24081764352, read_time=5023392, write_time=63199568, read_merged_count=619166, write_merged_count=812396, busy_time=4523412)\n    >>>\n\nNetwork\n-------\n\n.. code-block:: python\n\n    >>> psutil.net_io_counters(pernic=True)\n    {'eth0': netio(bytes_sent=485291293, bytes_recv=6004858642, packets_sent=3251564, packets_recv=4787798, errin=0, errout=0, dropin=0, dropout=0),\n     'lo': netio(bytes_sent=2838627, bytes_recv=2838627, packets_sent=30567, packets_recv=30567, errin=0, errout=0, dropin=0, dropout=0)}\n    >>>\n    >>> psutil.net_connections(kind='tcp')\n    [sconn(fd=115, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED', pid=1254),\n     sconn(fd=117, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING', pid=2987),\n     ...]\n    >>>\n    >>> psutil.net_if_addrs()\n    {'lo': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast='127.0.0.1', ptp=None),\n            snicaddr(family=<AddressFamily.AF_INET6: 10>, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None),\n            snicaddr(family=<AddressFamily.AF_LINK: 17>, address='00:00:00:00:00:00', netmask=None, broadcast='00:00:00:00:00:00', ptp=None)],\n     'wlan0': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.1.3', netmask='255.255.255.0', broadcast='192.168.1.255', ptp=None),\n               snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::c685:8ff:fe45:641%wlan0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None),\n               snicaddr(family=<AddressFamily.AF_LINK: 17>, address='c4:85:08:45:06:41', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}\n    >>>\n    >>> psutil.net_if_stats()\n    {'lo': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=65536, flags='up,loopback,running'),\n     'wlan0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=100, mtu=1500, flags='up,broadcast,running,multicast')}\n    >>>\n\nSensors\n-------\n\n.. code-block:: python\n\n    >>> import psutil\n    >>> psutil.sensors_temperatures()\n    {'acpitz': [shwtemp(label='', current=47.0, high=103.0, critical=103.0)],\n     'asus': [shwtemp(label='', current=47.0, high=None, critical=None)],\n     'coretemp': [shwtemp(label='Physical id 0', current=52.0, high=100.0, critical=100.0),\n                  shwtemp(label='Core 0', current=45.0, high=100.0, critical=100.0)]}\n    >>>\n    >>> psutil.sensors_fans()\n    {'asus': [sfan(label='cpu_fan', current=3200)]}\n    >>>\n    >>> psutil.sensors_battery()\n    sbattery(percent=93, secsleft=16628, power_plugged=False)\n    >>>\n\nOther system info\n-----------------\n\n.. code-block:: python\n\n    >>> import psutil\n    >>> psutil.users()\n    [suser(name='giampaolo', terminal='pts/2', host='localhost', started=1340737536.0, pid=1352),\n     suser(name='giampaolo', terminal='pts/3', host='localhost', started=1340737792.0, pid=1788)]\n    >>>\n    >>> psutil.boot_time()\n    1365519115.0\n    >>>\n\nProcess management\n------------------\n\n.. code-block:: python\n\n    >>> import psutil\n    >>> psutil.pids()\n    [1, 2, 3, 4, 5, 6, 7, 46, 48, 50, 51, 178, 182, 222, 223, 224, 268, 1215,\n     1216, 1220, 1221, 1243, 1244, 1301, 1601, 2237, 2355, 2637, 2774, 3932,\n     4176, 4177, 4185, 4187, 4189, 4225, 4243, 4245, 4263, 4282, 4306, 4311,\n     4312, 4313, 4314, 4337, 4339, 4357, 4358, 4363, 4383, 4395, 4408, 4433,\n     4443, 4445, 4446, 5167, 5234, 5235, 5252, 5318, 5424, 5644, 6987, 7054,\n     7055, 7071]\n    >>>\n    >>> p = psutil.Process(7055)\n    >>> p\n    psutil.Process(pid=7055, name='python3', status='running', started='09:04:44')\n    >>> p.pid\n    7055\n    >>> p.name()\n    'python3'\n    >>> p.exe()\n    '/usr/bin/python3'\n    >>> p.cwd()\n    '/home/giampaolo'\n    >>> p.cmdline()\n    ['/usr/bin/python3', 'main.py']\n    >>>\n    >>> p.ppid()\n    7054\n    >>> p.parent()\n    psutil.Process(pid=4699, name='bash', status='sleeping', started='09:06:44')\n    >>> p.parents()\n    [psutil.Process(pid=4699, name='bash', started='09:06:44'),\n     psutil.Process(pid=4689, name='gnome-terminal-server', status='sleeping', started='0:06:44'),\n     psutil.Process(pid=1, name='systemd', status='sleeping', started='05:56:55')]\n    >>> p.children(recursive=True)\n    [psutil.Process(pid=29835, name='python3', status='sleeping', started='11:45:38'),\n     psutil.Process(pid=29836, name='python3', status='waking', started='11:43:39')]\n    >>>\n    >>> p.status()\n    'running'\n    >>> p.create_time()\n    1267551141.5019531\n    >>> p.terminal()\n    '/dev/pts/0'\n    >>>\n    >>> p.username()\n    'giampaolo'\n    >>> p.uids()\n    puids(real=1000, effective=1000, saved=1000)\n    >>> p.gids()\n    pgids(real=1000, effective=1000, saved=1000)\n    >>>\n    >>> p.cpu_times()\n    pcputimes(user=1.02, system=0.31, children_user=0.32, children_system=0.1, iowait=0.0)\n    >>> p.cpu_percent(interval=1.0)\n    12.1\n    >>> p.cpu_affinity()\n    [0, 1, 2, 3]\n    >>> p.cpu_affinity([0, 1])  # set\n    >>> p.cpu_num()\n    1\n    >>>\n    >>> p.memory_info()\n    pmem(rss=10915840, vms=67608576, shared=3313664, text=2310144, lib=0, data=7262208, dirty=0)\n    >>> p.memory_full_info()  # \"real\" USS memory usage (Linux, macOS, Win only)\n    pfullmem(rss=10199040, vms=52133888, shared=3887104, text=2867200, lib=0, data=5967872, dirty=0, uss=6545408, pss=6872064, swap=0)\n    >>> p.memory_percent()\n    0.7823\n    >>> p.memory_maps()\n    [pmmap_grouped(path='/lib/x8664-linux-gnu/libutil-2.15.so', rss=32768, size=2125824, pss=32768, shared_clean=0, shared_dirty=0, private_clean=20480, private_dirty=12288, referenced=32768, anonymous=12288, swap=0),\n     pmmap_grouped(path='/lib/x8664-linux-gnu/libc-2.15.so', rss=3821568, size=3842048, pss=3821568, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=3821568, referenced=3575808, anonymous=3821568, swap=0),\n     pmmap_grouped(path='[heap]',  rss=32768, size=139264, pss=32768, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=32768, referenced=32768, anonymous=32768, swap=0),\n     pmmap_grouped(path='[stack]', rss=2465792, size=2494464, pss=2465792, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=2465792, referenced=2277376, anonymous=2465792, swap=0),\n     ...]\n    >>>\n    >>> p.io_counters()\n    pio(read_count=478001, write_count=59371, read_bytes=700416, write_bytes=69632, read_chars=456232, write_chars=517543)\n    >>>\n    >>> p.open_files()\n    [popenfile(path='/home/giampaolo/monit.py', fd=3, position=0, mode='r', flags=32768),\n     popenfile(path='/var/log/monit.log', fd=4, position=235542, mode='a', flags=33793)]\n    >>>\n    >>> p.net_connections(kind='tcp')\n    [pconn(fd=115, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED'),\n     pconn(fd=117, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING')]\n    >>>\n    >>> p.threads()\n    [pthread(id=5234, user_time=22.5, system_time=9.2891),\n     pthread(id=5237, user_time=0.0707, system_time=1.1)]\n    >>>\n    >>> p.num_threads()\n    4\n    >>> p.num_fds()\n    8\n    >>> p.num_ctx_switches()\n    pctxsw(voluntary=78, involuntary=19)\n    >>>\n    >>> p.nice()\n    0\n    >>> p.nice(10)  # set\n    >>>\n    >>> p.ionice(psutil.IOPRIO_CLASS_IDLE)  # IO priority (Win and Linux only)\n    >>> p.ionice()\n    pionice(ioclass=<IOPriority.IOPRIO_CLASS_IDLE: 3>, value=0)\n    >>>\n    >>> p.rlimit(psutil.RLIMIT_NOFILE, (5, 5))  # set resource limits (Linux only)\n    >>> p.rlimit(psutil.RLIMIT_NOFILE)\n    (5, 5)\n    >>>\n    >>> p.environ()\n    {'LC_PAPER': 'it_IT.UTF-8', 'SHELL': '/bin/bash', 'GREP_OPTIONS': '--color=auto',\n    'XDG_CONFIG_DIRS': '/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg',\n     ...}\n    >>>\n    >>> p.as_dict()\n    {'status': 'running', 'num_ctx_switches': pctxsw(voluntary=63, involuntary=1), 'pid': 5457, ...}\n    >>> p.is_running()\n    True\n    >>> p.suspend()\n    >>> p.resume()\n    >>>\n    >>> p.terminate()\n    >>> p.kill()\n    >>> p.wait(timeout=3)\n    <Exitcode.EX_OK: 0>\n    >>>\n    >>> psutil.test()\n    USER         PID %CPU %MEM     VSZ     RSS TTY        START    TIME  COMMAND\n    root           1  0.0  0.0   24584    2240            Jun17   00:00  init\n    root           2  0.0  0.0       0       0            Jun17   00:00  kthreadd\n    ...\n    giampaolo  31475  0.0  0.0   20760    3024 /dev/pts/0 Jun19   00:00  python2.4\n    giampaolo  31721  0.0  2.2  773060  181896            00:04   10:30  chrome\n    root       31763  0.0  0.0       0       0            00:05   00:00  kworker/0:1\n    >>>\n\nFurther process APIs\n--------------------\n\n.. code-block:: python\n\n    >>> import psutil\n    >>> for proc in psutil.process_iter(['pid', 'name']):\n    ...     print(proc.info)\n    ...\n    {'pid': 1, 'name': 'systemd'}\n    {'pid': 2, 'name': 'kthreadd'}\n    {'pid': 3, 'name': 'ksoftirqd/0'}\n    ...\n    >>>\n    >>> psutil.pid_exists(3)\n    True\n    >>>\n    >>> def on_terminate(proc):\n    ...     print(\"process {} terminated\".format(proc))\n    ...\n    >>> # waits for multiple processes to terminate\n    >>> gone, alive = psutil.wait_procs(procs_list, timeout=3, callback=on_terminate)\n    >>>\n\nHeap info\n---------\n\n.. code-block:: python\n\n    >>> import psutil\n    >>> psutil.heap_info()\n    pheap(heap_used=5177792, mmap_used=819200)\n    >>> psutil.heap_trim()\n\nSee also `psleak <https://github.com/giampaolo/psleak>`__\n\nWindows services\n----------------\n\n.. code-block:: python\n\n    >>> list(psutil.win_service_iter())\n    [<WindowsService(name='AeLookupSvc', display_name='Application Experience') at 38850096>,\n     <WindowsService(name='ALG', display_name='Application Layer Gateway Service') at 38850128>,\n     <WindowsService(name='APNMCP', display_name='Ask Update Service') at 38850160>,\n     <WindowsService(name='AppIDSvc', display_name='Application Identity') at 38850192>,\n     ...]\n    >>> s = psutil.win_service_get('alg')\n    >>> s.as_dict()\n    {'binpath': 'C:\\\\Windows\\\\System32\\\\alg.exe',\n     'description': 'Provides support for 3rd party protocol plug-ins for Internet Connection Sharing',\n     'display_name': 'Application Layer Gateway Service',\n     'name': 'alg',\n     'pid': None,\n     'start_type': 'manual',\n     'status': 'stopped',\n     'username': 'NT AUTHORITY\\\\LocalService'}\n\nProjects using psutil\n=====================\n\nHere's some I find particularly interesting:\n\n- https://github.com/giampaolo/psleak\n- https://github.com/google/grr\n- https://github.com/facebook/osquery/\n- https://github.com/nicolargo/glances\n- https://github.com/aristocratos/bpytop\n- https://github.com/Jahaja/psdash\n- https://github.com/ajenti/ajenti\n- https://github.com/home-assistant/home-assistant/\n\nPortings\n========\n\n- Go: https://github.com/shirou/gopsutil\n- C: https://github.com/hamon-in/cpslib\n- Rust: https://github.com/rust-psutil/rust-psutil\n- Nim: https://github.com/johnscillieri/psutil-nim\n\n\n\n",
        "description_content_type": "text/x-rst",
        "keywords": [
          "ps",
          "top",
          "kill",
          "free",
          "lsof",
          "netstat",
          "nice",
          "tty",
          "ionice",
          "uptime",
          "taskmgr",
          "process",
          "df",
          "iotop",
          "iostat",
          "ifconfig",
          "taskset",
          "who",
          "pidof",
          "pmap",
          "smem",
          "pstree",
          "monitoring",
          "ulimit",
          "prlimit",
          "smem",
          "performance",
          "metrics",
          "agent",
          "observability"
        ],
        "home_page": "https://github.com/giampaolo/psutil",
        "author": "Giampaolo Rodola",
        "author_email": "g.rodola@gmail.com",
        "license": "BSD-3-Clause",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Environment :: Console",
          "Intended Audience :: Developers",
          "Intended Audience :: Information Technology",
          "Intended Audience :: System Administrators",
          "Operating System :: MacOS :: MacOS X",
          "Operating System :: Microsoft :: Windows :: Windows 10",
          "Operating System :: Microsoft :: Windows :: Windows 11",
          "Operating System :: Microsoft :: Windows :: Windows 7",
          "Operating System :: Microsoft :: Windows :: Windows 8",
          "Operating System :: Microsoft :: Windows :: Windows 8.1",
          "Operating System :: Microsoft :: Windows :: Windows Server 2003",
          "Operating System :: Microsoft :: Windows :: Windows Server 2008",
          "Operating System :: Microsoft :: Windows :: Windows Vista",
          "Operating System :: Microsoft :: Windows",
          "Operating System :: Microsoft",
          "Operating System :: OS Independent",
          "Operating System :: POSIX :: AIX",
          "Operating System :: POSIX :: BSD :: FreeBSD",
          "Operating System :: POSIX :: BSD :: NetBSD",
          "Operating System :: POSIX :: BSD :: OpenBSD",
          "Operating System :: POSIX :: BSD",
          "Operating System :: POSIX :: Linux",
          "Operating System :: POSIX :: SunOS/Solaris",
          "Operating System :: POSIX",
          "Programming Language :: C",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: Implementation :: CPython",
          "Programming Language :: Python :: Implementation :: PyPy",
          "Programming Language :: Python",
          "Topic :: Software Development :: Libraries :: Python Modules",
          "Topic :: Software Development :: Libraries",
          "Topic :: System :: Benchmark",
          "Topic :: System :: Hardware",
          "Topic :: System :: Monitoring",
          "Topic :: System :: Networking :: Monitoring :: Hardware Watchdog",
          "Topic :: System :: Networking :: Monitoring",
          "Topic :: System :: Networking",
          "Topic :: System :: Operating System",
          "Topic :: System :: Systems Administration",
          "Topic :: Utilities"
        ],
        "requires_dist": [
          "psleak ; extra == 'dev'",
          "pytest ; extra == 'dev'",
          "pytest-instafail ; extra == 'dev'",
          "pytest-xdist ; extra == 'dev'",
          "setuptools ; extra == 'dev'",
          "abi3audit ; extra == 'dev'",
          "black ; extra == 'dev'",
          "check-manifest ; extra == 'dev'",
          "coverage ; extra == 'dev'",
          "packaging ; extra == 'dev'",
          "pylint ; extra == 'dev'",
          "pyperf ; extra == 'dev'",
          "pypinfo ; extra == 'dev'",
          "pytest-cov ; extra == 'dev'",
          "requests ; extra == 'dev'",
          "rstcheck ; extra == 'dev'",
          "ruff ; extra == 'dev'",
          "sphinx ; extra == 'dev'",
          "sphinx-rtd-theme ; extra == 'dev'",
          "toml-sort ; extra == 'dev'",
          "twine ; extra == 'dev'",
          "validate-pyproject[all] ; extra == 'dev'",
          "virtualenv ; extra == 'dev'",
          "vulture ; extra == 'dev'",
          "wheel ; extra == 'dev'",
          "colorama ; (os_name == \"nt\") and extra == 'dev'",
          "pyreadline3 ; (os_name == \"nt\") and extra == 'dev'",
          "pywin32 ; (os_name == \"nt\" and implementation_name != \"pypy\") and extra == 'dev'",
          "wheel ; (os_name == \"nt\" and implementation_name != \"pypy\") and extra == 'dev'",
          "wmi ; (os_name == \"nt\" and implementation_name != \"pypy\") and extra == 'dev'",
          "psleak ; extra == 'test'",
          "pytest ; extra == 'test'",
          "pytest-instafail ; extra == 'test'",
          "pytest-xdist ; extra == 'test'",
          "setuptools ; extra == 'test'",
          "pywin32 ; (os_name == \"nt\" and implementation_name != \"pypy\") and extra == 'test'",
          "wheel ; (os_name == \"nt\" and implementation_name != \"pypy\") and extra == 'test'",
          "wmi ; (os_name == \"nt\" and implementation_name != \"pypy\") and extra == 'test'"
        ],
        "requires_python": ">=3.6",
        "provides_extra": [
          "dev",
          "test"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/psutil-7.2.2.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "hermes-agent",
        "version": "0.17.0",
        "dynamic": [
          "license-file"
        ],
        "summary": "The self-improving AI agent — creates skills from experience, improves them during use, and runs anywhere",
        "description": "<p align=\"center\">\n  <img src=\"assets/banner.png\" alt=\"Hermes Agent\" width=\"100%\">\n</p>\n\n# Hermes Agent ☤\n<p align=\"center\">\n  <a href=\"https://hermes-agent.nousresearch.com/\">Hermes Agent</a> | <a href=\"https://hermes-agent.nousresearch.com/\">Hermes Desktop</a>\n</p>\n<p align=\"center\">\n  <a href=\"https://hermes-agent.nousresearch.com/docs/\"><img src=\"https://img.shields.io/badge/Docs-hermes--agent.nousresearch.com-FFD700?style=for-the-badge\" alt=\"Documentation\"></a>\n  <a href=\"https://discord.gg/NousResearch\"><img src=\"https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white\" alt=\"Discord\"></a>\n  <a href=\"https://github.com/NousResearch/hermes-agent/blob/main/LICENSE\"><img src=\"https://img.shields.io/badge/License-MIT-green?style=for-the-badge\" alt=\"License: MIT\"></a>\n  <a href=\"https://nousresearch.com\"><img src=\"https://img.shields.io/badge/Built%20by-Nous%20Research-blueviolet?style=for-the-badge\" alt=\"Built by Nous Research\"></a>\n  <a href=\"README.zh-CN.md\"><img src=\"https://img.shields.io/badge/Lang-中文-red?style=for-the-badge\" alt=\"中文\"></a>\n  <a href=\"README.ur-pk.md\"><img src=\"https://img.shields.io/badge/Lang-اردو-green?style=for-the-badge\" alt=\"اردو\"></a>\n</p>\n\n**The self-improving AI agent built by [Nous Research](https://nousresearch.com).** It's the only agent with a built-in learning loop — it creates skills from experience, improves them during use, nudges itself to persist knowledge, searches its own past conversations, and builds a deepening model of who you are across sessions. Run it on a $5 VPS, a GPU cluster, or serverless infrastructure that costs nearly nothing when idle. It's not tied to your laptop — talk to it from Telegram while it works on a cloud VM.\n\nUse any model you want — [Nous Portal](https://portal.nousresearch.com), [OpenRouter](https://openrouter.ai) (200+ models), [NovitaAI](https://novita.ai) (AI-native cloud for Model API, Agent Sandbox, and GPU Cloud), [NVIDIA NIM](https://build.nvidia.com) (Nemotron), [Xiaomi MiMo](https://platform.xiaomimimo.com), [z.ai/GLM](https://z.ai), [Kimi/Moonshot](https://platform.moonshot.ai), [MiniMax](https://www.minimax.io), [Hugging Face](https://huggingface.co), OpenAI, or your own endpoint. Switch with `hermes model` — no code changes, no lock-in.\n\n<table>\n<tr><td><b>A real terminal interface</b></td><td>Full TUI with multiline editing, slash-command autocomplete, conversation history, interrupt-and-redirect, and streaming tool output.</td></tr>\n<tr><td><b>Lives where you do</b></td><td>Telegram, Discord, Slack, WhatsApp, Signal, and CLI — all from a single gateway process. Voice memo transcription, cross-platform conversation continuity.</td></tr>\n<tr><td><b>A closed learning loop</b></td><td>Agent-curated memory with periodic nudges. Autonomous skill creation after complex tasks. Skills self-improve during use. FTS5 session search with LLM summarization for cross-session recall. <a href=\"https://github.com/plastic-labs/honcho\">Honcho</a> dialectic user modeling. Compatible with the <a href=\"https://agentskills.io\">agentskills.io</a> open standard.</td></tr>\n<tr><td><b>Scheduled automations</b></td><td>Built-in cron scheduler with delivery to any platform. Daily reports, nightly backups, weekly audits — all in natural language, running unattended.</td></tr>\n<tr><td><b>Delegates and parallelizes</b></td><td>Spawn isolated subagents for parallel workstreams. Write Python scripts that call tools via RPC, collapsing multi-step pipelines into zero-context-cost turns.</td></tr>\n<tr><td><b>Runs anywhere, not just your laptop</b></td><td>Six terminal backends — local, Docker, SSH, Singularity, Modal, and Daytona. Daytona and Modal offer serverless persistence — your agent's environment hibernates when idle and wakes on demand, costing nearly nothing between sessions. Run it on a $5 VPS or a GPU cluster.</td></tr>\n<tr><td><b>Research-ready</b></td><td>Batch trajectory generation, trajectory compression for training the next generation of tool-calling models.</td></tr>\n</table>\n\n---\n\n## Quick Install\n\n### Linux, macOS, WSL2, Termux\n\n```bash\ncurl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash\n```\n\n### Windows (native, PowerShell)\n\n> **Heads up:** Native Windows runs Hermes without WSL — CLI, gateway, TUI, and tools all work natively. If you'd rather use WSL2, the Linux/macOS one-liner above works there too. Found a bug? Please [file issues](https://github.com/NousResearch/hermes-agent/issues).\n\nRun this in PowerShell:\n\n```powershell\niex (irm https://hermes-agent.nousresearch.com/install.ps1)\n```\n\nThe installer handles everything: uv, Python 3.11, Node.js, ripgrep, ffmpeg, **and a portable Git Bash** (MinGit, unpacked to `%LOCALAPPDATA%\\hermes\\git` — no admin required, completely isolated from any system Git install). Hermes uses this bundled Git Bash to run shell commands.\n\nIf you already have Git installed, the installer detects it and uses that instead. Otherwise a ~45MB MinGit download is all you need — it won't touch or interfere with any system Git.\n\n> **Android / Termux:** The tested manual path is documented in the [Termux guide](https://hermes-agent.nousresearch.com/docs/getting-started/termux). On Termux, Hermes installs a curated `.[termux]` extra because the full `.[all]` extra currently pulls Android-incompatible voice dependencies.\n>\n> **Windows:** Native Windows is fully supported — the PowerShell one-liner above installs everything. If you'd rather use WSL2, the Linux command works there too. Native Windows install lives under `%LOCALAPPDATA%\\hermes`; WSL2 installs under `~/.hermes` as on Linux.\n\nAfter installation:\n\n```bash\nsource ~/.bashrc    # reload shell (or: source ~/.zshrc)\nhermes              # start chatting!\n```\n\n---\n\n## Getting Started\n\n```bash\nhermes              # Interactive CLI — start a conversation\nhermes model        # Choose your LLM provider and model\nhermes tools        # Configure which tools are enabled\nhermes config set   # Set individual config values\nhermes gateway      # Start the messaging gateway (Telegram, Discord, etc.)\nhermes setup        # Run the full setup wizard (configures everything at once)\nhermes claw migrate # Migrate from OpenClaw (if coming from OpenClaw)\nhermes update       # Update to the latest version\nhermes doctor       # Diagnose any issues\n```\n\n📖 **[Full documentation →](https://hermes-agent.nousresearch.com/docs/)**\n\n---\n\n## Skip the API-key collection — Nous Portal\n\nHermes works with whatever provider you want — that's not changing. But if you'd rather not collect five separate API keys for the model, web search, image generation, TTS, and a cloud browser, **[Nous Portal](https://portal.nousresearch.com)** covers all of them under one subscription:\n\n- **300+ models** — pick any of them with `/model <name>`\n- **Tool Gateway** — web search (Firecrawl), image generation (FAL), text-to-speech (OpenAI), cloud browser (Browser Use), all routed through your sub. No extra accounts.\n\nOne command from a fresh install:\n\n```bash\nhermes setup --portal\n```\n\nThat logs you in via OAuth, sets Nous as your provider, and turns on the Tool Gateway. Check what's wired up any time with `hermes portal info`. Full details on the [Tool Gateway docs page](https://hermes-agent.nousresearch.com/docs/user-guide/features/tool-gateway).\n\nYou can still bring your own keys per-tool whenever you want — the gateway is per-backend, not all-or-nothing.\n\n---\n\n## CLI vs Messaging Quick Reference\n\nHermes has two entry points: start the terminal UI with `hermes`, or run the gateway and talk to it from Telegram, Discord, Slack, WhatsApp, Signal, or Email. Once you're in a conversation, many slash commands are shared across both interfaces.\n\n| Action                         | CLI                                           | Messaging platforms                                                              |\n| ------------------------------ | --------------------------------------------- | -------------------------------------------------------------------------------- |\n| Start chatting                 | `hermes`                                      | Run `hermes gateway setup` + `hermes gateway start`, then send the bot a message |\n| Start fresh conversation       | `/new` or `/reset`                            | `/new` or `/reset`                                                               |\n| Change model                   | `/model [provider:model]`                     | `/model [provider:model]`                                                        |\n| Set a personality              | `/personality [name]`                         | `/personality [name]`                                                            |\n| Retry or undo the last turn    | `/retry`, `/undo`                             | `/retry`, `/undo`                                                                |\n| Compress context / check usage | `/compress`, `/usage`, `/insights [--days N]` | `/compress`, `/usage`, `/insights [days]`                                        |\n| Browse skills                  | `/skills` or `/<skill-name>`                  | `/<skill-name>`                                                                  |\n| Interrupt current work         | `Ctrl+C` or send a new message                | `/stop` or send a new message                                                    |\n| Platform-specific status       | `/platforms`                                  | `/status`, `/sethome`                                                            |\n\nFor the full command lists, see the [CLI guide](https://hermes-agent.nousresearch.com/docs/user-guide/cli) and the [Messaging Gateway guide](https://hermes-agent.nousresearch.com/docs/user-guide/messaging).\n\n---\n\n## Documentation\n\nAll documentation lives at **[hermes-agent.nousresearch.com/docs](https://hermes-agent.nousresearch.com/docs/)**:\n\n| Section                                                                                             | What's Covered                                             |\n| --------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- |\n| [Quickstart](https://hermes-agent.nousresearch.com/docs/getting-started/quickstart)                 | Install → setup → first conversation in 2 minutes          |\n| [CLI Usage](https://hermes-agent.nousresearch.com/docs/user-guide/cli)                              | Commands, keybindings, personalities, sessions             |\n| [Configuration](https://hermes-agent.nousresearch.com/docs/user-guide/configuration)                | Config file, providers, models, all options                |\n| [Messaging Gateway](https://hermes-agent.nousresearch.com/docs/user-guide/messaging)                | Telegram, Discord, Slack, WhatsApp, Signal, Home Assistant |\n| [Security](https://hermes-agent.nousresearch.com/docs/user-guide/security)                          | Command approval, DM pairing, container isolation          |\n| [Tools & Toolsets](https://hermes-agent.nousresearch.com/docs/user-guide/features/tools)            | 40+ tools, toolset system, terminal backends               |\n| [Skills System](https://hermes-agent.nousresearch.com/docs/user-guide/features/skills)              | Procedural memory, Skills Hub, creating skills             |\n| [Memory](https://hermes-agent.nousresearch.com/docs/user-guide/features/memory)                     | Persistent memory, user profiles, best practices           |\n| [MCP Integration](https://hermes-agent.nousresearch.com/docs/user-guide/features/mcp)               | Connect any MCP server for extended capabilities           |\n| [Cron Scheduling](https://hermes-agent.nousresearch.com/docs/user-guide/features/cron)              | Scheduled tasks with platform delivery                     |\n| [Context Files](https://hermes-agent.nousresearch.com/docs/user-guide/features/context-files)       | Project context that shapes every conversation             |\n| [Architecture](https://hermes-agent.nousresearch.com/docs/developer-guide/architecture)             | Project structure, agent loop, key classes                 |\n| [Contributing](https://hermes-agent.nousresearch.com/docs/developer-guide/contributing)             | Development setup, PR process, code style                  |\n| [CLI Reference](https://hermes-agent.nousresearch.com/docs/reference/cli-commands)                  | All commands and flags                                     |\n| [Environment Variables](https://hermes-agent.nousresearch.com/docs/reference/environment-variables) | Complete env var reference                                 |\n\n---\n\n## Migrating from OpenClaw\n\nIf you're coming from OpenClaw, Hermes can automatically import your settings, memories, skills, and API keys.\n\n**During first-time setup:** The setup wizard (`hermes setup`) automatically detects `~/.openclaw` and offers to migrate before configuration begins.\n\n**Anytime after install:**\n\n```bash\nhermes claw migrate              # Interactive migration (full preset)\nhermes claw migrate --dry-run    # Preview what would be migrated\nhermes claw migrate --preset user-data   # Migrate without secrets\nhermes claw migrate --overwrite  # Overwrite existing conflicts\n```\n\nWhat gets imported:\n\n- **SOUL.md** — persona file\n- **Memories** — MEMORY.md and USER.md entries\n- **Skills** — user-created skills → `~/.hermes/skills/openclaw-imports/`\n- **Command allowlist** — approval patterns\n- **Messaging settings** — platform configs, allowed users, working directory\n- **API keys** — allowlisted secrets (Telegram, OpenRouter, OpenAI, Anthropic, ElevenLabs)\n- **TTS assets** — workspace audio files\n- **Workspace instructions** — AGENTS.md (with `--workspace-target`)\n\nSee `hermes claw migrate --help` for all options, or use the `openclaw-migration` skill for an interactive agent-guided migration with dry-run previews.\n\n---\n\n## Contributing\n\nWe welcome contributions! See the [Contributing Guide](https://hermes-agent.nousresearch.com/docs/developer-guide/contributing) for development setup, code style, and PR process.\n\nQuick start for contributors — use the standard installer, then work from the\nfull git checkout it creates at `$HERMES_HOME/hermes-agent` (usually\n`~/.hermes/hermes-agent`). This matches the layout used by `hermes update`, the\nmanaged venv, lazy dependencies, gateway, and docs tooling.\n\n```bash\ncurl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash\ncd \"${HERMES_HOME:-$HOME/.hermes}/hermes-agent\"\nuv pip install -e \".[all,dev]\"\nscripts/run_tests.sh\n```\n\nManual clone fallback (for throwaway clones/CI where you intentionally do not\nwant the managed install layout):\n\n```bash\ncurl -LsSf https://astral.sh/uv/install.sh | sh\nuv venv .venv --python 3.11\nsource .venv/bin/activate\nuv pip install -e \".[all,dev]\"\nscripts/run_tests.sh\n```\n\n---\n\n## Community\n\n- 💬 [Discord](https://discord.gg/NousResearch)\n- 📚 [Skills Hub](https://agentskills.io)\n- 🐛 [Issues](https://github.com/NousResearch/hermes-agent/issues)\n- 🔌 [computer-use-linux](https://github.com/avifenesh/computer-use-linux) — Linux desktop-control MCP server for Hermes and other MCP hosts, with AT-SPI accessibility trees, Wayland/X11 input, screenshots, and compositor window targeting.\n- 🔌 [HermesClaw](https://github.com/AaronWong1999/hermesclaw) — Community WeChat bridge: Run Hermes Agent and OpenClaw on the same WeChat account.\n\n---\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\nBuilt by [Nous Research](https://nousresearch.com).\n",
        "description_content_type": "text/markdown",
        "author": "Nous Research",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "requires_dist": [
          "openai==2.24.0",
          "certifi==2026.5.20",
          "python-dotenv==1.2.2",
          "fire==0.7.1",
          "httpx[socks]==0.28.1",
          "rich==14.3.3",
          "tenacity==9.1.4",
          "pyyaml==6.0.3",
          "ruamel.yaml==0.18.17",
          "requests==2.33.0",
          "jinja2==3.1.6",
          "pydantic==2.13.4",
          "prompt_toolkit==3.0.52",
          "croniter==6.0.0",
          "packaging==26.0",
          "Markdown==3.10.2",
          "PyJWT[crypto]==2.13.0",
          "urllib3<3,>=2.7.0",
          "tzdata==2025.3; sys_platform == \"win32\"",
          "psutil==7.2.2",
          "websockets==15.0.1",
          "pathspec==1.1.1",
          "fastapi<1,>=0.104.0",
          "uvicorn[standard]<1,>=0.24.0",
          "python-multipart<1,>=0.0.9",
          "ptyprocess<1,>=0.7.0; sys_platform != \"win32\"",
          "pywinpty<3,>=2.0.0; sys_platform == \"win32\"",
          "Pillow==12.2.0",
          "concurrent-log-handler==0.9.29; sys_platform == \"win32\"",
          "anthropic==0.87.0; extra == \"anthropic\"",
          "exa-py==2.10.2; extra == \"exa\"",
          "firecrawl-py==4.17.0; extra == \"firecrawl\"",
          "parallel-web==0.4.2; extra == \"parallel-web\"",
          "fal-client==0.13.1; extra == \"fal\"",
          "edge-tts==7.2.7; extra == \"edge-tts\"",
          "modal==1.3.4; extra == \"modal\"",
          "daytona==0.155.0; extra == \"daytona\"",
          "hindsight-client==0.6.1; extra == \"hindsight\"",
          "debugpy==1.8.20; extra == \"dev\"",
          "pytest==9.0.2; extra == \"dev\"",
          "pytest-asyncio==1.3.0; extra == \"dev\"",
          "mcp==1.26.0; extra == \"dev\"",
          "starlette==1.0.1; extra == \"dev\"",
          "ty==0.0.21; extra == \"dev\"",
          "ruff==0.15.10; extra == \"dev\"",
          "setuptools==81.0.0; extra == \"dev\"",
          "python-telegram-bot[webhooks]==22.6; extra == \"messaging\"",
          "discord.py[voice]==2.7.1; extra == \"messaging\"",
          "aiohttp==3.13.4; extra == \"messaging\"",
          "brotlicffi==1.2.0.1; extra == \"messaging\"",
          "slack-bolt==1.27.0; extra == \"messaging\"",
          "slack-sdk==3.40.1; extra == \"messaging\"",
          "qrcode==7.4.2; extra == \"messaging\"",
          "slack-bolt==1.27.0; extra == \"slack\"",
          "slack-sdk==3.40.1; extra == \"slack\"",
          "aiohttp==3.13.4; extra == \"slack\"",
          "mautrix[encryption]==0.21.0; extra == \"matrix\"",
          "aiosqlite==0.22.1; extra == \"matrix\"",
          "asyncpg==0.31.0; extra == \"matrix\"",
          "aiohttp-socks==0.11.0; extra == \"matrix\"",
          "defusedxml==0.7.1; extra == \"wecom\"",
          "simple-term-menu==1.6.6; extra == \"cli\"",
          "elevenlabs==1.59.0; extra == \"tts-premium\"",
          "faster-whisper==1.2.1; extra == \"voice\"",
          "sounddevice==0.5.5; extra == \"voice\"",
          "numpy==2.4.3; extra == \"voice\"",
          "honcho-ai==2.0.1; extra == \"honcho\"",
          "mcp==1.26.0; extra == \"mcp\"",
          "starlette==1.0.1; extra == \"mcp\"",
          "nemo-relay==0.3; extra == \"nemo-relay\"",
          "aiohttp==3.13.4; extra == \"homeassistant\"",
          "aiohttp==3.13.4; extra == \"sms\"",
          "microsoft-teams-apps==2.0.13.4; extra == \"teams\"",
          "aiohttp==3.13.4; extra == \"teams\"",
          "mcp==1.26.0; extra == \"computer-use\"",
          "starlette==1.0.1; extra == \"computer-use\"",
          "agent-client-protocol==0.9.0; extra == \"acp\"",
          "mistralai==2.4.8; extra == \"mistral\"",
          "boto3==1.42.89; extra == \"bedrock\"",
          "azure-identity==1.25.3; extra == \"azure-identity\"",
          "python-telegram-bot[webhooks]==22.6; extra == \"termux\"",
          "hermes-agent[cron]; extra == \"termux\"",
          "hermes-agent[cli]; extra == \"termux\"",
          "hermes-agent[pty]; extra == \"termux\"",
          "hermes-agent[mcp]; extra == \"termux\"",
          "hermes-agent[honcho]; extra == \"termux\"",
          "hermes-agent[acp]; extra == \"termux\"",
          "hermes-agent[termux]; extra == \"termux-all\"",
          "hermes-agent[google]; extra == \"termux-all\"",
          "hermes-agent[homeassistant]; extra == \"termux-all\"",
          "hermes-agent[sms]; extra == \"termux-all\"",
          "hermes-agent[web]; extra == \"termux-all\"",
          "dingtalk-stream==0.24.3; extra == \"dingtalk\"",
          "alibabacloud-dingtalk==2.2.42; extra == \"dingtalk\"",
          "qrcode==7.4.2; extra == \"dingtalk\"",
          "lark-oapi==1.5.3; extra == \"feishu\"",
          "qrcode==7.4.2; extra == \"feishu\"",
          "google-api-python-client==2.194.0; extra == \"google\"",
          "google-auth-oauthlib==1.3.1; extra == \"google\"",
          "google-auth-httplib2==0.3.1; extra == \"google\"",
          "youtube-transcript-api==1.2.4; extra == \"youtube\"",
          "fastapi==0.133.1; extra == \"web\"",
          "uvicorn[standard]==0.41.0; extra == \"web\"",
          "starlette==1.0.1; extra == \"web\"",
          "python-multipart==0.0.27; extra == \"web\"",
          "hermes-agent[cron]; extra == \"all\"",
          "hermes-agent[cli]; extra == \"all\"",
          "hermes-agent[pty]; extra == \"all\"",
          "hermes-agent[mcp]; extra == \"all\"",
          "hermes-agent[homeassistant]; extra == \"all\"",
          "hermes-agent[sms]; extra == \"all\"",
          "hermes-agent[acp]; extra == \"all\"",
          "hermes-agent[google]; extra == \"all\"",
          "hermes-agent[web]; extra == \"all\"",
          "hermes-agent[youtube]; extra == \"all\""
        ],
        "requires_python": "<3.14,>=3.11",
        "provides_extra": [
          "anthropic",
          "exa",
          "firecrawl",
          "parallel-web",
          "fal",
          "edge-tts",
          "modal",
          "daytona",
          "hindsight",
          "dev",
          "messaging",
          "cron",
          "slack",
          "matrix",
          "wecom",
          "cli",
          "tts-premium",
          "voice",
          "pty",
          "honcho",
          "vision",
          "mcp",
          "nemo-relay",
          "homeassistant",
          "sms",
          "teams",
          "computer-use",
          "acp",
          "mistral",
          "bedrock",
          "azure-identity",
          "termux",
          "termux-all",
          "dingtalk",
          "feishu",
          "google",
          "youtube",
          "web",
          "all"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/hermes_agent-0.17.0.dist-info",
      "direct_url": {
        "url": "file:///home/cube/projects/richard/traning%20coach/.omo/evidence/task26/task26-clarification-root-final-st_01a013d9/artifacts/hermes_agent-0.17.0-py3-none-any.whl",
        "archive_info": {
          "hashes": {
            "sha256": "c673e7b04c564e6ebbf5010e6e0ad321af3abde7565d6d3ca66d238c9248877b"
          },
          "hash": "sha256=c673e7b04c564e6ebbf5010e6e0ad321af3abde7565d6d3ca66d238c9248877b"
        }
      },
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "prompt_toolkit",
        "version": "3.0.52",
        "dynamic": [
          "license-file"
        ],
        "summary": "Library for building powerful interactive command lines in Python",
        "description": "Python Prompt Toolkit\n=====================\n\n|AppVeyor|  |PyPI|  |RTD|  |License|  |Codecov|\n\n.. image :: /docs/images/logo_400px.png\n\n``prompt_toolkit`` *is a library for building powerful interactive command line applications in Python.*\n\nRead the `documentation on readthedocs\n<http://python-prompt-toolkit.readthedocs.io/en/stable/>`_.\n\n\nGallery\n*******\n\n`ptpython <http://github.com/prompt-toolkit/ptpython/>`_ is an interactive\nPython Shell, build on top of ``prompt_toolkit``.\n\n.. image :: /docs/images/ptpython.png\n\n`More examples <https://python-prompt-toolkit.readthedocs.io/en/stable/pages/gallery.html>`_\n\n\nprompt_toolkit features\n***********************\n\n``prompt_toolkit`` could be a replacement for `GNU readline\n<https://tiswww.case.edu/php/chet/readline/rltop.html>`_, but it can be much\nmore than that.\n\nSome features:\n\n- **Pure Python**.\n- Syntax highlighting of the input while typing. (For instance, with a Pygments lexer.)\n- Multi-line input editing.\n- Advanced code completion.\n- Both Emacs and Vi key bindings. (Similar to readline.)\n- Even some advanced Vi functionality, like named registers and digraphs.\n- Reverse and forward incremental search.\n- Works well with Unicode double width characters. (Chinese input.)\n- Selecting text for copy/paste. (Both Emacs and Vi style.)\n- Support for `bracketed paste <https://cirw.in/blog/bracketed-paste>`_.\n- Mouse support for cursor positioning and scrolling.\n- Auto suggestions. (Like `fish shell <http://fishshell.com/>`_.)\n- Multiple input buffers.\n- No global state.\n- Lightweight, the only dependencies are Pygments and wcwidth.\n- Runs on Linux, OS X, FreeBSD, OpenBSD and Windows systems.\n- And much more...\n\nFeel free to create tickets for bugs and feature requests, and create pull\nrequests if you have nice patches that you would like to share with others.\n\n\nInstallation\n************\n\n::\n\n    pip install prompt_toolkit\n\nFor Conda, do:\n\n::\n\n    conda install -c https://conda.anaconda.org/conda-forge prompt_toolkit\n\n\nAbout Windows support\n*********************\n\n``prompt_toolkit`` is cross platform, and everything that you build on top\nshould run fine on both Unix and Windows systems. Windows support is best on\nrecent Windows 10 builds, for which the command line window supports vt100\nescape sequences. (If not supported, we fall back to using Win32 APIs for color\nand cursor movements).\n\nIt's worth noting that the implementation is a \"best effort of what is\npossible\". Both Unix and Windows terminals have their limitations. But in\ngeneral, the Unix experience will still be a little better.\n\n\nGetting started\n***************\n\nThe most simple example of the library would look like this:\n\n.. code:: python\n\n    from prompt_toolkit import prompt\n\n    if __name__ == '__main__':\n        answer = prompt('Give me some input: ')\n        print('You said: %s' % answer)\n\nFor more complex examples, have a look in the ``examples`` directory. All\nexamples are chosen to demonstrate only one thing. Also, don't be afraid to\nlook at the source code. The implementation of the ``prompt`` function could be\na good start.\n\nPhilosophy\n**********\n\nThe source code of ``prompt_toolkit`` should be **readable**, **concise** and\n**efficient**. We prefer short functions focusing each on one task and for which\nthe input and output types are clearly specified. We mostly prefer composition\nover inheritance, because inheritance can result in too much functionality in\nthe same object. We prefer immutable objects where possible (objects don't\nchange after initialization). Reusability is important. We absolutely refrain\nfrom having a changing global state, it should be possible to have multiple\nindependent instances of the same code in the same process. The architecture\nshould be layered: the lower levels operate on primitive operations and data\nstructures giving -- when correctly combined -- all the possible flexibility;\nwhile at the higher level, there should be a simpler API, ready-to-use and\nsufficient for most use cases. Thinking about algorithms and efficiency is\nimportant, but avoid premature optimization.\n\n\n`Projects using prompt_toolkit <PROJECTS.rst>`_\n***********************************************\n\nSpecial thanks to\n*****************\n\n- `Pygments <http://pygments.org/>`_: Syntax highlighter.\n- `wcwidth <https://github.com/jquast/wcwidth>`_: Determine columns needed for a wide characters.\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/prompt_toolkit.svg\n    :target: https://pypi.python.org/pypi/prompt-toolkit/\n    :alt: Latest Version\n\n.. |AppVeyor| image:: https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva?svg=true\n    :target: https://ci.appveyor.com/project/prompt-toolkit/python-prompt-toolkit/\n\n.. |RTD| image:: https://readthedocs.org/projects/python-prompt-toolkit/badge/\n    :target: https://python-prompt-toolkit.readthedocs.io/en/master/\n\n.. |License| image:: https://img.shields.io/github/license/prompt-toolkit/python-prompt-toolkit.svg\n    :target: https://github.com/prompt-toolkit/python-prompt-toolkit/blob/master/LICENSE\n\n.. |Codecov| image:: https://codecov.io/gh/prompt-toolkit/python-prompt-toolkit/branch/master/graphs/badge.svg?style=flat\n    :target: https://codecov.io/gh/prompt-toolkit/python-prompt-toolkit/\n\n",
        "description_content_type": "text/x-rst",
        "author": "Jonathan Slenders",
        "license_file": [
          "LICENSE",
          "AUTHORS.rst"
        ],
        "classifier": [
          "Development Status :: 5 - Production/Stable",
          "Intended Audience :: Developers",
          "License :: OSI Approved :: BSD License",
          "Operating System :: OS Independent",
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python",
          "Topic :: Software Development"
        ],
        "requires_dist": [
          "wcwidth"
        ],
        "requires_python": ">=3.8",
        "project_url": [
          "Homepage, https://github.com/prompt-toolkit/python-prompt-toolkit",
          "Documentation, https://python-prompt-toolkit.readthedocs.io/en/stable/"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/prompt_toolkit-3.0.52.dist-info",
      "installer": "pip",
      "requested": true
    },
    {
      "metadata": {
        "metadata_version": "2.4",
        "name": "pytest",
        "version": "9.0.2",
        "dynamic": [
          "license-file"
        ],
        "summary": "pytest: simple powerful testing with Python",
        "description": ".. image:: https://github.com/pytest-dev/pytest/raw/main/doc/en/img/pytest_logo_curves.svg\n   :target: https://docs.pytest.org/en/stable/\n   :align: center\n   :height: 200\n   :alt: pytest\n\n\n------\n\n.. image:: https://img.shields.io/pypi/v/pytest.svg\n    :target: https://pypi.org/project/pytest/\n\n.. image:: https://img.shields.io/conda/vn/conda-forge/pytest.svg\n    :target: https://anaconda.org/conda-forge/pytest\n\n.. image:: https://img.shields.io/pypi/pyversions/pytest.svg\n    :target: https://pypi.org/project/pytest/\n\n.. image:: https://codecov.io/gh/pytest-dev/pytest/branch/main/graph/badge.svg\n    :target: https://codecov.io/gh/pytest-dev/pytest\n    :alt: Code coverage Status\n\n.. image:: https://github.com/pytest-dev/pytest/actions/workflows/test.yml/badge.svg\n    :target: https://github.com/pytest-dev/pytest/actions?query=workflow%3Atest\n\n.. image:: https://results.pre-commit.ci/badge/github/pytest-dev/pytest/main.svg\n   :target: https://results.pre-commit.ci/latest/github/pytest-dev/pytest/main\n   :alt: pre-commit.ci status\n\n.. image:: https://www.codetriage.com/pytest-dev/pytest/badges/users.svg\n    :target: https://www.codetriage.com/pytest-dev/pytest\n\n.. image:: https://readthedocs.org/projects/pytest/badge/?version=latest\n    :target: https://pytest.readthedocs.io/en/latest/?badge=latest\n    :alt: Documentation Status\n\n.. image:: https://img.shields.io/badge/Discord-pytest--dev-blue\n    :target: https://discord.com/invite/pytest-dev\n    :alt: Discord\n\n.. image:: https://img.shields.io/badge/Libera%20chat-%23pytest-orange\n    :target: https://web.libera.chat/#pytest\n    :alt: Libera chat\n\n\nThe ``pytest`` framework makes it easy to write small tests, yet\nscales to support complex functional testing for applications and libraries.\n\nAn example of a simple test:\n\n.. code-block:: python\n\n    # content of test_sample.py\n    def inc(x):\n        return x + 1\n\n\n    def test_answer():\n        assert inc(3) == 5\n\n\nTo execute it::\n\n    $ pytest\n    ============================= test session starts =============================\n    collected 1 items\n\n    test_sample.py F\n\n    ================================== FAILURES ===================================\n    _________________________________ test_answer _________________________________\n\n        def test_answer():\n    >       assert inc(3) == 5\n    E       assert 4 == 5\n    E        +  where 4 = inc(3)\n\n    test_sample.py:5: AssertionError\n    ========================== 1 failed in 0.04 seconds ===========================\n\n\nThanks to ``pytest``'s detailed assertion introspection, you can simply use plain ``assert`` statements. See `getting-started <https://docs.pytest.org/en/stable/getting-started.html#our-first-test-run>`_ for more examples.\n\n\nFeatures\n--------\n\n- Detailed info on failing `assert statements <https://docs.pytest.org/en/stable/how-to/assert.html>`_ (no need to remember ``self.assert*`` names)\n\n- `Auto-discovery\n  <https://docs.pytest.org/en/stable/explanation/goodpractices.html#python-test-discovery>`_\n  of test modules and functions\n\n- `Modular fixtures <https://docs.pytest.org/en/stable/explanation/fixtures.html>`_ for\n  managing small or parametrized long-lived test resources\n\n- Can run `unittest <https://docs.pytest.org/en/stable/how-to/unittest.html>`_ (or trial)\n  test suites out of the box\n\n- Python 3.10+ or PyPy3\n\n- Rich plugin architecture, with over 1300+ `external plugins <https://docs.pytest.org/en/latest/reference/plugin_list.html>`_ and thriving community\n\n\nDocumentation\n-------------\n\nFor full documentation, including installation, tutorials and PDF documents, please see https://docs.pytest.org/en/stable/.\n\n\nBugs/Requests\n-------------\n\nPlease use the `GitHub issue tracker <https://github.com/pytest-dev/pytest/issues>`_ to submit bugs or request features.\n\n\nChangelog\n---------\n\nConsult the `Changelog <https://docs.pytest.org/en/stable/changelog.html>`__ page for fixes and enhancements of each version.\n\n\nSupport pytest\n--------------\n\n`Open Collective`_ is an online funding platform for open and transparent communities.\nIt provides tools to raise money and share your finances in full transparency.\n\nIt is the platform of choice for individuals and companies that want to make one-time or\nmonthly donations directly to the project.\n\nSee more details in the `pytest collective`_.\n\n.. _Open Collective: https://opencollective.com\n.. _pytest collective: https://opencollective.com/pytest\n\n\npytest for enterprise\n---------------------\n\nAvailable as part of the Tidelift Subscription.\n\nThe maintainers of pytest and thousands of other packages are working with Tidelift to deliver commercial support and\nmaintenance for the open source dependencies you use to build your applications.\nSave time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use.\n\n`Learn more. <https://tidelift.com/subscription/pkg/pypi-pytest?utm_source=pypi-pytest&utm_medium=referral&utm_campaign=enterprise&utm_term=repo>`_\n\nSecurity\n^^^^^^^^\n\npytest has never been associated with a security vulnerability, but in any case, to report a\nsecurity vulnerability please use the `Tidelift security contact <https://tidelift.com/security>`_.\nTidelift will coordinate the fix and disclosure.\n\n\nLicense\n-------\n\nCopyright Holger Krekel and others, 2004.\n\nDistributed under the terms of the `MIT`_ license, pytest is free and open source software.\n\n.. _`MIT`: https://github.com/pytest-dev/pytest/blob/main/LICENSE\n",
        "description_content_type": "text/x-rst",
        "keywords": [
          "test",
          "unittest"
        ],
        "author": "Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Florian Bruhin, Others (See AUTHORS)",
        "license_expression": "MIT",
        "license_file": [
          "LICENSE"
        ],
        "classifier": [
          "Development Status :: 6 - Mature",
          "Intended Audience :: Developers",
          "Operating System :: MacOS",
          "Operating System :: Microsoft :: Windows",
          "Operating System :: POSIX",
          "Operating System :: Unix",
          "Programming Language :: Python :: 3 :: Only",
          "Programming Language :: Python :: 3.10",
          "Programming Language :: Python :: 3.11",
          "Programming Language :: Python :: 3.12",
          "Programming Language :: Python :: 3.13",
          "Programming Language :: Python :: 3.14",
          "Topic :: Software Development :: Libraries",
          "Topic :: Software Development :: Testing",
          "Topic :: Utilities"
        ],
        "requires_dist": [
          "colorama>=0.4; sys_platform == \"win32\"",
          "exceptiongroup>=1; python_version < \"3.11\"",
          "iniconfig>=1.0.1",
          "packaging>=22",
          "pluggy<2,>=1.5",
          "pygments>=2.7.2",
          "tomli>=1; python_version < \"3.11\"",
          "argcomplete; extra == \"dev\"",
          "attrs>=19.2; extra == \"dev\"",
          "hypothesis>=3.56; extra == \"dev\"",
          "mock; extra == \"dev\"",
          "requests; extra == \"dev\"",
          "setuptools; extra == \"dev\"",
          "xmlschema; extra == \"dev\""
        ],
        "requires_python": ">=3.10",
        "project_url": [
          "Changelog, https://docs.pytest.org/en/stable/changelog.html",
          "Contact, https://docs.pytest.org/en/stable/contact.html",
          "Funding, https://docs.pytest.org/en/stable/sponsor.html",
          "Homepage, https://docs.pytest.org/en/latest/",
          "Source, https://github.com/pytest-dev/pytest",
          "Tracker, https://github.com/pytest-dev/pytest/issues"
        ],
        "provides_extra": [
          "dev"
        ]
      },
      "metadata_location": "/home/cube/.cache/task26-clarification-root-runtime-st_01a013d9/venv/lib/python3.12/site-packages/pytest-9.0.2.dist-info",
      "installer": "pip",
      "requested": true
    }
  ],
  "environment": {
    "implementation_name": "cpython",
    "implementation_version": "3.12.9",
    "os_name": "posix",
    "platform_machine": "x86_64",
    "platform_release": "6.17.0-22-generic",
    "platform_system": "Linux",
    "platform_version": "#22-Ubuntu SMP PREEMPT_DYNAMIC Fri Mar 13 12:04:44 UTC 2026",
    "python_full_version": "3.12.9",
    "platform_python_implementation": "CPython",
    "python_version": "3.12",
    "sys_platform": "linux"
  }
}
