Adding all files
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,72 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: typing_extensions
|
||||
Version: 4.15.0
|
||||
Summary: Backported and Experimental Type Hints for Python 3.9+
|
||||
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>
|
||||
Requires-Python: >=3.9
|
||||
Description-Content-Type: text/markdown
|
||||
License-Expression: PSF-2.0
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Environment :: Console
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3 :: Only
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Programming Language :: Python :: 3.14
|
||||
Classifier: Topic :: Software Development
|
||||
License-File: LICENSE
|
||||
Project-URL: Bug Tracker, https://github.com/python/typing_extensions/issues
|
||||
Project-URL: Changes, https://github.com/python/typing_extensions/blob/main/CHANGELOG.md
|
||||
Project-URL: Documentation, https://typing-extensions.readthedocs.io/
|
||||
Project-URL: Home, https://github.com/python/typing_extensions
|
||||
Project-URL: Q & A, https://github.com/python/typing/discussions
|
||||
Project-URL: Repository, https://github.com/python/typing_extensions
|
||||
|
||||
# Typing Extensions
|
||||
|
||||
[](https://gitter.im/python/typing)
|
||||
|
||||
[Documentation](https://typing-extensions.readthedocs.io/en/latest/#) –
|
||||
[PyPI](https://pypi.org/project/typing-extensions/)
|
||||
|
||||
## Overview
|
||||
|
||||
The `typing_extensions` module serves two related purposes:
|
||||
|
||||
- Enable use of new type system features on older Python versions. For example,
|
||||
`typing.TypeGuard` is new in Python 3.10, but `typing_extensions` allows
|
||||
users on previous Python versions to use it too.
|
||||
- Enable experimentation with new type system PEPs before they are accepted and
|
||||
added to the `typing` module.
|
||||
|
||||
`typing_extensions` is treated specially by static type checkers such as
|
||||
mypy and pyright. Objects defined in `typing_extensions` are treated the same
|
||||
way as equivalent forms in `typing`.
|
||||
|
||||
`typing_extensions` uses
|
||||
[Semantic Versioning](https://semver.org/). The
|
||||
major version will be incremented only for backwards-incompatible changes.
|
||||
Therefore, it's safe to depend
|
||||
on `typing_extensions` like this: `typing_extensions ~=x.y`,
|
||||
where `x.y` is the first version that includes all features you need.
|
||||
[This](https://packaging.python.org/en/latest/specifications/version-specifiers/#compatible-release)
|
||||
is equivalent to `typing_extensions >=x.y, <(x+1)`. Do not depend on `~= x.y.z`
|
||||
unless you really know what you're doing; that defeats the purpose of
|
||||
semantic versioning.
|
||||
|
||||
## Included items
|
||||
|
||||
See [the documentation](https://typing-extensions.readthedocs.io/en/latest/#) for a
|
||||
complete listing of module contents.
|
||||
|
||||
## Contributing
|
||||
|
||||
See [CONTRIBUTING.md](https://github.com/python/typing_extensions/blob/main/CONTRIBUTING.md)
|
||||
for how to contribute to `typing_extensions`.
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -0,0 +1,262 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: aiohttp
|
||||
Version: 3.13.2
|
||||
Summary: Async http client/server framework (asyncio)
|
||||
Maintainer-email: aiohttp team <team@aiohttp.org>
|
||||
License: Apache-2.0 AND MIT
|
||||
Project-URL: Homepage, https://github.com/aio-libs/aiohttp
|
||||
Project-URL: Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org
|
||||
Project-URL: Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org
|
||||
Project-URL: CI: GitHub Actions, https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI
|
||||
Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/aiohttp
|
||||
Project-URL: Docs: Changelog, https://docs.aiohttp.org/en/stable/changes.html
|
||||
Project-URL: Docs: RTD, https://docs.aiohttp.org
|
||||
Project-URL: GitHub: issues, https://github.com/aio-libs/aiohttp/issues
|
||||
Project-URL: GitHub: repo, https://github.com/aio-libs/aiohttp
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Framework :: AsyncIO
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: Operating System :: POSIX
|
||||
Classifier: Operating System :: MacOS :: MacOS X
|
||||
Classifier: Operating System :: Microsoft :: Windows
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Programming Language :: Python :: 3.14
|
||||
Classifier: Topic :: Internet :: WWW/HTTP
|
||||
Requires-Python: >=3.9
|
||||
Description-Content-Type: text/x-rst
|
||||
License-File: LICENSE.txt
|
||||
License-File: vendor/llhttp/LICENSE
|
||||
Requires-Dist: aiohappyeyeballs>=2.5.0
|
||||
Requires-Dist: aiosignal>=1.4.0
|
||||
Requires-Dist: async-timeout<6.0,>=4.0; python_version < "3.11"
|
||||
Requires-Dist: attrs>=17.3.0
|
||||
Requires-Dist: frozenlist>=1.1.1
|
||||
Requires-Dist: multidict<7.0,>=4.5
|
||||
Requires-Dist: propcache>=0.2.0
|
||||
Requires-Dist: yarl<2.0,>=1.17.0
|
||||
Provides-Extra: speedups
|
||||
Requires-Dist: aiodns>=3.3.0; extra == "speedups"
|
||||
Requires-Dist: Brotli; platform_python_implementation == "CPython" and extra == "speedups"
|
||||
Requires-Dist: brotlicffi; platform_python_implementation != "CPython" and extra == "speedups"
|
||||
Requires-Dist: backports.zstd; (platform_python_implementation == "CPython" and python_version < "3.14") and extra == "speedups"
|
||||
Dynamic: license-file
|
||||
|
||||
==================================
|
||||
Async http client/server framework
|
||||
==================================
|
||||
|
||||
.. image:: https://raw.githubusercontent.com/aio-libs/aiohttp/master/docs/aiohttp-plain.svg
|
||||
:height: 64px
|
||||
:width: 64px
|
||||
:alt: aiohttp logo
|
||||
|
||||
|
|
||||
|
||||
.. image:: https://github.com/aio-libs/aiohttp/workflows/CI/badge.svg
|
||||
:target: https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI
|
||||
:alt: GitHub Actions status for master branch
|
||||
|
||||
.. image:: https://codecov.io/gh/aio-libs/aiohttp/branch/master/graph/badge.svg
|
||||
:target: https://codecov.io/gh/aio-libs/aiohttp
|
||||
:alt: codecov.io status for master branch
|
||||
|
||||
.. image:: https://badge.fury.io/py/aiohttp.svg
|
||||
:target: https://pypi.org/project/aiohttp
|
||||
:alt: Latest PyPI package version
|
||||
|
||||
.. image:: https://img.shields.io/pypi/dm/aiohttp
|
||||
:target: https://pypistats.org/packages/aiohttp
|
||||
:alt: Downloads count
|
||||
|
||||
.. image:: https://readthedocs.org/projects/aiohttp/badge/?version=latest
|
||||
:target: https://docs.aiohttp.org/
|
||||
:alt: Latest Read The Docs
|
||||
|
||||
.. image:: https://img.shields.io/endpoint?url=https://codspeed.io/badge.json
|
||||
:target: https://codspeed.io/aio-libs/aiohttp
|
||||
:alt: Codspeed.io status for aiohttp
|
||||
|
||||
|
||||
Key Features
|
||||
============
|
||||
|
||||
- Supports both client and server side of HTTP protocol.
|
||||
- Supports both client and server Web-Sockets out-of-the-box and avoids
|
||||
Callback Hell.
|
||||
- Provides Web-server with middleware and pluggable routing.
|
||||
|
||||
|
||||
Getting started
|
||||
===============
|
||||
|
||||
Client
|
||||
------
|
||||
|
||||
To get something from the web:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import aiohttp
|
||||
import asyncio
|
||||
|
||||
async def main():
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get('http://python.org') as response:
|
||||
|
||||
print("Status:", response.status)
|
||||
print("Content-type:", response.headers['content-type'])
|
||||
|
||||
html = await response.text()
|
||||
print("Body:", html[:15], "...")
|
||||
|
||||
asyncio.run(main())
|
||||
|
||||
This prints:
|
||||
|
||||
.. code-block::
|
||||
|
||||
Status: 200
|
||||
Content-type: text/html; charset=utf-8
|
||||
Body: <!doctype html> ...
|
||||
|
||||
Coming from `requests <https://requests.readthedocs.io/>`_ ? Read `why we need so many lines <https://aiohttp.readthedocs.io/en/latest/http_request_lifecycle.html>`_.
|
||||
|
||||
Server
|
||||
------
|
||||
|
||||
An example using a simple server:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
# examples/server_simple.py
|
||||
from aiohttp import web
|
||||
|
||||
async def handle(request):
|
||||
name = request.match_info.get('name', "Anonymous")
|
||||
text = "Hello, " + name
|
||||
return web.Response(text=text)
|
||||
|
||||
async def wshandle(request):
|
||||
ws = web.WebSocketResponse()
|
||||
await ws.prepare(request)
|
||||
|
||||
async for msg in ws:
|
||||
if msg.type == web.WSMsgType.text:
|
||||
await ws.send_str("Hello, {}".format(msg.data))
|
||||
elif msg.type == web.WSMsgType.binary:
|
||||
await ws.send_bytes(msg.data)
|
||||
elif msg.type == web.WSMsgType.close:
|
||||
break
|
||||
|
||||
return ws
|
||||
|
||||
|
||||
app = web.Application()
|
||||
app.add_routes([web.get('/', handle),
|
||||
web.get('/echo', wshandle),
|
||||
web.get('/{name}', handle)])
|
||||
|
||||
if __name__ == '__main__':
|
||||
web.run_app(app)
|
||||
|
||||
|
||||
Documentation
|
||||
=============
|
||||
|
||||
https://aiohttp.readthedocs.io/
|
||||
|
||||
|
||||
Demos
|
||||
=====
|
||||
|
||||
https://github.com/aio-libs/aiohttp-demos
|
||||
|
||||
|
||||
External links
|
||||
==============
|
||||
|
||||
* `Third party libraries
|
||||
<http://aiohttp.readthedocs.io/en/latest/third_party.html>`_
|
||||
* `Built with aiohttp
|
||||
<http://aiohttp.readthedocs.io/en/latest/built_with.html>`_
|
||||
* `Powered by aiohttp
|
||||
<http://aiohttp.readthedocs.io/en/latest/powered_by.html>`_
|
||||
|
||||
Feel free to make a Pull Request for adding your link to these pages!
|
||||
|
||||
|
||||
Communication channels
|
||||
======================
|
||||
|
||||
*aio-libs Discussions*: https://github.com/aio-libs/aiohttp/discussions
|
||||
|
||||
*Matrix*: `#aio-libs:matrix.org <https://matrix.to/#/#aio-libs:matrix.org>`_
|
||||
|
||||
We support `Stack Overflow
|
||||
<https://stackoverflow.com/questions/tagged/aiohttp>`_.
|
||||
Please add *aiohttp* tag to your question there.
|
||||
|
||||
Requirements
|
||||
============
|
||||
|
||||
- attrs_
|
||||
- multidict_
|
||||
- yarl_
|
||||
- frozenlist_
|
||||
|
||||
Optionally you may install the aiodns_ library (highly recommended for sake of speed).
|
||||
|
||||
.. _aiodns: https://pypi.python.org/pypi/aiodns
|
||||
.. _attrs: https://github.com/python-attrs/attrs
|
||||
.. _multidict: https://pypi.python.org/pypi/multidict
|
||||
.. _frozenlist: https://pypi.org/project/frozenlist/
|
||||
.. _yarl: https://pypi.python.org/pypi/yarl
|
||||
.. _async-timeout: https://pypi.python.org/pypi/async_timeout
|
||||
|
||||
License
|
||||
=======
|
||||
|
||||
``aiohttp`` is offered under the Apache 2 license.
|
||||
|
||||
|
||||
Keepsafe
|
||||
========
|
||||
|
||||
The aiohttp community would like to thank Keepsafe
|
||||
(https://www.getkeepsafe.com) for its support in the early days of
|
||||
the project.
|
||||
|
||||
|
||||
Source code
|
||||
===========
|
||||
|
||||
The latest developer version is available in a GitHub repository:
|
||||
https://github.com/aio-libs/aiohttp
|
||||
|
||||
Benchmarks
|
||||
==========
|
||||
|
||||
If you are interested in efficiency, the AsyncIO community maintains a
|
||||
list of benchmarks on the official wiki:
|
||||
https://github.com/python/asyncio/wiki/Benchmarks
|
||||
|
||||
--------
|
||||
|
||||
.. 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
|
||||
:target: https://matrix.to/#/%23aio-libs:matrix.org
|
||||
:alt: Matrix Room — #aio-libs:matrix.org
|
||||
|
||||
.. 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
|
||||
:target: https://matrix.to/#/%23aio-libs-space:matrix.org
|
||||
:alt: Matrix Space — #aio-libs-space:matrix.org
|
||||
|
||||
.. image:: https://insights.linuxfoundation.org/api/badge/health-score?project=aiohttp
|
||||
:target: https://insights.linuxfoundation.org/project/aiohttp
|
||||
:alt: LFX Health Score
|
||||
Binary file not shown.
@@ -0,0 +1,149 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: multidict
|
||||
Version: 6.7.0
|
||||
Summary: multidict implementation
|
||||
Home-page: https://github.com/aio-libs/multidict
|
||||
Author: Andrew Svetlov
|
||||
Author-email: andrew.svetlov@gmail.com
|
||||
License: Apache License 2.0
|
||||
Project-URL: Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org
|
||||
Project-URL: Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org
|
||||
Project-URL: CI: GitHub, https://github.com/aio-libs/multidict/actions
|
||||
Project-URL: Code of Conduct, https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md
|
||||
Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/multidict
|
||||
Project-URL: Docs: Changelog, https://multidict.aio-libs.org/en/latest/changes/
|
||||
Project-URL: Docs: RTD, https://multidict.aio-libs.org
|
||||
Project-URL: GitHub: issues, https://github.com/aio-libs/multidict/issues
|
||||
Project-URL: GitHub: repo, https://github.com/aio-libs/multidict
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Programming Language :: Python :: 3.14
|
||||
Requires-Python: >=3.9
|
||||
Description-Content-Type: text/x-rst
|
||||
License-File: LICENSE
|
||||
Requires-Dist: typing-extensions>=4.1.0; python_version < "3.11"
|
||||
Dynamic: license-file
|
||||
|
||||
=========
|
||||
multidict
|
||||
=========
|
||||
|
||||
.. image:: https://github.com/aio-libs/multidict/actions/workflows/ci-cd.yml/badge.svg
|
||||
:target: https://github.com/aio-libs/multidict/actions
|
||||
:alt: GitHub status for master branch
|
||||
|
||||
.. image:: https://codecov.io/gh/aio-libs/multidict/branch/master/graph/badge.svg?flag=pytest
|
||||
:target: https://codecov.io/gh/aio-libs/multidict?flags[]=pytest
|
||||
:alt: Coverage metrics
|
||||
|
||||
.. image:: https://img.shields.io/pypi/v/multidict.svg
|
||||
:target: https://pypi.org/project/multidict
|
||||
:alt: PyPI
|
||||
|
||||
.. image:: https://readthedocs.org/projects/multidict/badge/?version=latest
|
||||
:target: https://multidict.aio-libs.org
|
||||
:alt: Read The Docs build status badge
|
||||
|
||||
.. image:: https://img.shields.io/endpoint?url=https://codspeed.io/badge.json
|
||||
:target: https://codspeed.io/aio-libs/multidict
|
||||
:alt: CodSpeed
|
||||
|
||||
.. image:: https://img.shields.io/pypi/pyversions/multidict.svg
|
||||
:target: https://pypi.org/project/multidict
|
||||
:alt: Python versions
|
||||
|
||||
.. 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
|
||||
:target: https://matrix.to/#/%23aio-libs:matrix.org
|
||||
:alt: Matrix Room — #aio-libs:matrix.org
|
||||
|
||||
.. 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
|
||||
:target: https://matrix.to/#/%23aio-libs-space:matrix.org
|
||||
:alt: Matrix Space — #aio-libs-space:matrix.org
|
||||
|
||||
Multidict is dict-like collection of *key-value pairs* where key
|
||||
might occur more than once in the container.
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
*HTTP Headers* and *URL query string* require specific data structure:
|
||||
*multidict*. It behaves mostly like a regular ``dict`` but it may have
|
||||
several *values* for the same *key* and *preserves insertion ordering*.
|
||||
|
||||
The *key* is ``str`` (or ``istr`` for case-insensitive dictionaries).
|
||||
|
||||
``multidict`` has four multidict classes:
|
||||
``MultiDict``, ``MultiDictProxy``, ``CIMultiDict``
|
||||
and ``CIMultiDictProxy``.
|
||||
|
||||
Immutable proxies (``MultiDictProxy`` and
|
||||
``CIMultiDictProxy``) provide a dynamic view for the
|
||||
proxied multidict, the view reflects underlying collection changes. They
|
||||
implement the ``collections.abc.Mapping`` interface.
|
||||
|
||||
Regular mutable (``MultiDict`` and ``CIMultiDict``) classes
|
||||
implement ``collections.abc.MutableMapping`` and allows them to change
|
||||
their own content.
|
||||
|
||||
|
||||
*Case insensitive* (``CIMultiDict`` and
|
||||
``CIMultiDictProxy``) assume the *keys* are case
|
||||
insensitive, e.g.::
|
||||
|
||||
>>> dct = CIMultiDict(key='val')
|
||||
>>> 'Key' in dct
|
||||
True
|
||||
>>> dct['Key']
|
||||
'val'
|
||||
|
||||
*Keys* should be ``str`` or ``istr`` instances.
|
||||
|
||||
The library has optional C Extensions for speed.
|
||||
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
Apache 2
|
||||
|
||||
Library Installation
|
||||
--------------------
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ pip install multidict
|
||||
|
||||
The library is Python 3 only!
|
||||
|
||||
PyPI contains binary wheels for Linux, Windows and MacOS. If you want to install
|
||||
``multidict`` on another operating system (or *Alpine Linux* inside a Docker) the
|
||||
tarball will be used to compile the library from source. It requires a C compiler and
|
||||
Python headers to be installed.
|
||||
|
||||
To skip the compilation, please use the `MULTIDICT_NO_EXTENSIONS` environment variable,
|
||||
e.g.:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ MULTIDICT_NO_EXTENSIONS=1 pip install multidict
|
||||
|
||||
Please note, the pure Python (uncompiled) version is about 20-50 times slower depending on
|
||||
the usage scenario!!!
|
||||
|
||||
For extension development, set the ``MULTIDICT_DEBUG_BUILD`` environment variable to compile
|
||||
the extensions in debug mode:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ MULTIDICT_DEBUG_BUILD=1 pip install multidict
|
||||
|
||||
Changelog
|
||||
---------
|
||||
See `RTD page <http://multidict.aio-libs.org/en/latest/changes>`_.
|
||||
Binary file not shown.
@@ -0,0 +1,672 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: frozenlist
|
||||
Version: 1.8.0
|
||||
Summary: A list-like structure which implements collections.abc.MutableSequence
|
||||
Home-page: https://github.com/aio-libs/frozenlist
|
||||
Maintainer: aiohttp team <team@aiohttp.org>
|
||||
Maintainer-email: team@aiohttp.org
|
||||
License: Apache-2.0
|
||||
Project-URL: Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org
|
||||
Project-URL: Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org
|
||||
Project-URL: CI: Github Actions, https://github.com/aio-libs/frozenlist/actions
|
||||
Project-URL: Code of Conduct, https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md
|
||||
Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/frozenlist
|
||||
Project-URL: Docs: Changelog, https://github.com/aio-libs/frozenlist/blob/master/CHANGES.rst#changelog
|
||||
Project-URL: Docs: RTD, https://frozenlist.aio-libs.org
|
||||
Project-URL: GitHub: issues, https://github.com/aio-libs/frozenlist/issues
|
||||
Project-URL: GitHub: repo, https://github.com/aio-libs/frozenlist
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: Operating System :: POSIX
|
||||
Classifier: Operating System :: MacOS :: MacOS X
|
||||
Classifier: Operating System :: Microsoft :: Windows
|
||||
Classifier: Programming Language :: Cython
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Programming Language :: Python :: 3.14
|
||||
Classifier: Programming Language :: Python :: Implementation :: CPython
|
||||
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
||||
Requires-Python: >=3.9
|
||||
Description-Content-Type: text/x-rst
|
||||
License-File: LICENSE
|
||||
Dynamic: license-file
|
||||
|
||||
frozenlist
|
||||
==========
|
||||
|
||||
.. image:: https://github.com/aio-libs/frozenlist/workflows/CI/badge.svg
|
||||
:target: https://github.com/aio-libs/frozenlist/actions
|
||||
:alt: GitHub status for master branch
|
||||
|
||||
.. image:: https://codecov.io/gh/aio-libs/frozenlist/branch/master/graph/badge.svg?flag=pytest
|
||||
:target: https://codecov.io/gh/aio-libs/frozenlist?flags[]=pytest
|
||||
:alt: codecov.io status for master branch
|
||||
|
||||
.. image:: https://img.shields.io/pypi/v/frozenlist.svg?logo=Python&logoColor=white
|
||||
:target: https://pypi.org/project/frozenlist
|
||||
:alt: frozenlist @ PyPI
|
||||
|
||||
.. image:: https://readthedocs.org/projects/frozenlist/badge/?version=latest
|
||||
:target: https://frozenlist.aio-libs.org
|
||||
:alt: Read The Docs build status badge
|
||||
|
||||
.. 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
|
||||
:target: https://matrix.to/#/%23aio-libs:matrix.org
|
||||
:alt: Matrix Room — #aio-libs:matrix.org
|
||||
|
||||
.. 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
|
||||
:target: https://matrix.to/#/%23aio-libs-space:matrix.org
|
||||
:alt: Matrix Space — #aio-libs-space:matrix.org
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
``frozenlist.FrozenList`` is a list-like structure which implements
|
||||
``collections.abc.MutableSequence``. The list is *mutable* until ``FrozenList.freeze``
|
||||
is called, after which list modifications raise ``RuntimeError``:
|
||||
|
||||
|
||||
>>> from frozenlist import FrozenList
|
||||
>>> fl = FrozenList([17, 42])
|
||||
>>> fl.append('spam')
|
||||
>>> fl.append('Vikings')
|
||||
>>> fl
|
||||
<FrozenList(frozen=False, [17, 42, 'spam', 'Vikings'])>
|
||||
>>> fl.freeze()
|
||||
>>> fl
|
||||
<FrozenList(frozen=True, [17, 42, 'spam', 'Vikings'])>
|
||||
>>> fl.frozen
|
||||
True
|
||||
>>> fl.append("Monty")
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 1, in <module>
|
||||
File "frozenlist/_frozenlist.pyx", line 97, in frozenlist._frozenlist.FrozenList.append
|
||||
self._check_frozen()
|
||||
File "frozenlist/_frozenlist.pyx", line 19, in frozenlist._frozenlist.FrozenList._check_frozen
|
||||
raise RuntimeError("Cannot modify frozen list.")
|
||||
RuntimeError: Cannot modify frozen list.
|
||||
|
||||
|
||||
FrozenList is also hashable, but only when frozen. Otherwise it also throws a RuntimeError:
|
||||
|
||||
|
||||
>>> fl = FrozenList([17, 42, 'spam'])
|
||||
>>> hash(fl)
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 1, in <module>
|
||||
File "frozenlist/_frozenlist.pyx", line 111, in frozenlist._frozenlist.FrozenList.__hash__
|
||||
raise RuntimeError("Cannot hash unfrozen list.")
|
||||
RuntimeError: Cannot hash unfrozen list.
|
||||
>>> fl.freeze()
|
||||
>>> hash(fl)
|
||||
3713081631934410656
|
||||
>>> dictionary = {fl: 'Vikings'} # frozen fl can be a dict key
|
||||
>>> dictionary
|
||||
{<FrozenList(frozen=True, [1, 2])>: 'Vikings'}
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
::
|
||||
|
||||
$ pip install frozenlist
|
||||
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
https://frozenlist.aio-libs.org
|
||||
|
||||
Communication channels
|
||||
----------------------
|
||||
|
||||
We have a *Matrix Space* `#aio-libs-space:matrix.org
|
||||
<https://matrix.to/#/%23aio-libs-space:matrix.org>`_ which is
|
||||
also accessible via Gitter.
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
``frozenlist`` is offered under the Apache 2 license.
|
||||
|
||||
Source code
|
||||
-----------
|
||||
|
||||
The project is hosted on GitHub_
|
||||
|
||||
Please file an issue in the `bug tracker
|
||||
<https://github.com/aio-libs/frozenlist/issues>`_ if you have found a bug
|
||||
or have some suggestions to improve the library.
|
||||
|
||||
.. _GitHub: https://github.com/aio-libs/frozenlist
|
||||
|
||||
=========
|
||||
Changelog
|
||||
=========
|
||||
|
||||
..
|
||||
You should *NOT* be adding new change log entries to this file, this
|
||||
file is managed by towncrier. You *may* edit previous change logs to
|
||||
fix problems like typo corrections or such.
|
||||
To add a new change log entry, please see
|
||||
https://pip.pypa.io/en/latest/development/contributing/#news-entries
|
||||
we named the news folder "changes".
|
||||
|
||||
WARNING: Don't drop the next directive!
|
||||
|
||||
.. towncrier release notes start
|
||||
|
||||
v1.8.0
|
||||
======
|
||||
|
||||
*(2025-10-05)*
|
||||
|
||||
|
||||
Contributor-facing changes
|
||||
--------------------------
|
||||
|
||||
- The ``reusable-cibuildwheel.yml`` workflow has been refactored to
|
||||
be more generic and ``ci-cd.yml`` now holds all the configuration
|
||||
toggles -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#668 <https://github.com/aio-libs/frozenlist/issues/668>`__.
|
||||
|
||||
- When building wheels, the source distribution is now passed directly
|
||||
to the ``cibuildwheel`` invocation -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#669 <https://github.com/aio-libs/frozenlist/issues/669>`__.
|
||||
|
||||
- Builds and tests have been added to
|
||||
``ci-cd.yml`` for arm64 Windows wheels -- by `@finnagin <https://github.com/sponsors/finnagin>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#677 <https://github.com/aio-libs/frozenlist/issues/677>`__.
|
||||
|
||||
- Started building wheels for CPython 3.14 -- by `@kumaraditya303 <https://github.com/sponsors/kumaraditya303>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#681 <https://github.com/aio-libs/frozenlist/issues/681>`__, `#682 <https://github.com/aio-libs/frozenlist/issues/682>`__.
|
||||
|
||||
- Removed ``--config-settings=pure-python=false`` from ``requirements/dev.txt``.
|
||||
Developers on CPython still get accelerated builds by default. To explicitly build
|
||||
a pure Python wheel, use ``pip install -e . --config-settings=pure-python=true``
|
||||
-- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#687 <https://github.com/aio-libs/frozenlist/issues/687>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
v1.7.0
|
||||
======
|
||||
|
||||
*(2025-06-09)*
|
||||
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
- Added deepcopy support to FrozenList -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#659 <https://github.com/aio-libs/frozenlist/issues/659>`__.
|
||||
|
||||
|
||||
Packaging updates and notes for downstreams
|
||||
-------------------------------------------
|
||||
|
||||
- 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>`__.
|
||||
|
||||
This change ensures that production builds are optimized for performance. Developers who need line tracing for debugging purposes can still enable it by:
|
||||
|
||||
1. Setting the ``FROZENLIST_CYTHON_TRACING`` environment variable
|
||||
2. Using the ``--config-setting=with-cython-tracing=true`` option with pip
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#660 <https://github.com/aio-libs/frozenlist/issues/660>`__.
|
||||
|
||||
- Enabled ``PIP_CONSTRAINT`` environment variable in the build configuration to ensure the pinned Cython version from ``requirements/cython.txt`` is used during wheel builds.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#661 <https://github.com/aio-libs/frozenlist/issues/661>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
v1.6.2
|
||||
======
|
||||
|
||||
*(2025-06-03)*
|
||||
|
||||
|
||||
No significant changes.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
v1.6.1
|
||||
======
|
||||
|
||||
*(2025-06-02)*
|
||||
|
||||
|
||||
Bug fixes
|
||||
---------
|
||||
|
||||
- Correctly use ``cimport`` for including ``PyBool_FromLong`` -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#653 <https://github.com/aio-libs/frozenlist/issues/653>`__.
|
||||
|
||||
|
||||
Packaging updates and notes for downstreams
|
||||
-------------------------------------------
|
||||
|
||||
- Exclude ``_frozenlist.cpp`` from bdists/wheels -- by `@musicinmybrain <https://github.com/sponsors/musicinmybrain>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#649 <https://github.com/aio-libs/frozenlist/issues/649>`__.
|
||||
|
||||
- Updated to use Cython 3.1 universally across the build path -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#654 <https://github.com/aio-libs/frozenlist/issues/654>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
v1.6.0
|
||||
======
|
||||
|
||||
*(2025-04-17)*
|
||||
|
||||
|
||||
Bug fixes
|
||||
---------
|
||||
|
||||
- Stopped implicitly allowing the use of Cython pre-release versions when
|
||||
building the distribution package -- by `@ajsanchezsanz <https://github.com/sponsors/ajsanchezsanz>`__ and
|
||||
`@markgreene74 <https://github.com/sponsors/markgreene74>`__.
|
||||
|
||||
*Related commits on GitHub:*
|
||||
`41591f2 <https://github.com/aio-libs/frozenlist/commit/41591f2>`__.
|
||||
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
- Implemented support for the free-threaded build of CPython 3.13 -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#618 <https://github.com/aio-libs/frozenlist/issues/618>`__.
|
||||
|
||||
- Started building armv7l wheels -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#642 <https://github.com/aio-libs/frozenlist/issues/642>`__.
|
||||
|
||||
|
||||
Packaging updates and notes for downstreams
|
||||
-------------------------------------------
|
||||
|
||||
- Stopped implicitly allowing the use of Cython pre-release versions when
|
||||
building the distribution package -- by `@ajsanchezsanz <https://github.com/sponsors/ajsanchezsanz>`__ and
|
||||
`@markgreene74 <https://github.com/sponsors/markgreene74>`__.
|
||||
|
||||
*Related commits on GitHub:*
|
||||
`41591f2 <https://github.com/aio-libs/frozenlist/commit/41591f2>`__.
|
||||
|
||||
- Started building wheels for the free-threaded build of CPython 3.13 -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#618 <https://github.com/aio-libs/frozenlist/issues/618>`__.
|
||||
|
||||
- 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>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#639 <https://github.com/aio-libs/frozenlist/issues/639>`__.
|
||||
|
||||
|
||||
Contributor-facing changes
|
||||
--------------------------
|
||||
|
||||
- GitHub Actions CI/CD is now configured to manage caching pip-ecosystem
|
||||
dependencies using `re-actors/cache-python-deps`_ -- an action by
|
||||
`@webknjaz <https://github.com/sponsors/webknjaz>`__ that takes into account ABI stability and the exact
|
||||
version of Python runtime.
|
||||
|
||||
.. _`re-actors/cache-python-deps`:
|
||||
https://github.com/marketplace/actions/cache-python-deps
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#633 <https://github.com/aio-libs/frozenlist/issues/633>`__.
|
||||
|
||||
- Organized dependencies into test and lint dependencies so that no
|
||||
unnecessary ones are installed during CI runs -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#636 <https://github.com/aio-libs/frozenlist/issues/636>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
1.5.0 (2024-10-22)
|
||||
==================
|
||||
|
||||
Bug fixes
|
||||
---------
|
||||
|
||||
- An incorrect signature of the ``__class_getitem__`` class method
|
||||
has been fixed, adding a missing ``class_item`` argument under
|
||||
Python 3.8 and older.
|
||||
|
||||
This change also improves the code coverage of this method that
|
||||
was previously missing -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.
|
||||
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#567 <https://github.com/aio-libs/frozenlist/issues/567>`__, `#571 <https://github.com/aio-libs/frozenlist/issues/571>`__.
|
||||
|
||||
|
||||
Improved documentation
|
||||
----------------------
|
||||
|
||||
- Rendered issue, PR, and commit links now lead to
|
||||
``frozenlist``'s repo instead of ``yarl``'s repo.
|
||||
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#573 <https://github.com/aio-libs/frozenlist/issues/573>`__.
|
||||
|
||||
- On the ``Contributing docs`` page,
|
||||
a link to the ``Towncrier philosophy`` has been fixed.
|
||||
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#574 <https://github.com/aio-libs/frozenlist/issues/574>`__.
|
||||
|
||||
|
||||
Packaging updates and notes for downstreams
|
||||
-------------------------------------------
|
||||
|
||||
- A name of a temporary building directory now reflects
|
||||
that it's related to ``frozenlist``, not ``yarl``.
|
||||
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#573 <https://github.com/aio-libs/frozenlist/issues/573>`__.
|
||||
|
||||
- Declared Python 3.13 supported officially in the distribution package metadata.
|
||||
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#595 <https://github.com/aio-libs/frozenlist/issues/595>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
1.4.1 (2023-12-15)
|
||||
==================
|
||||
|
||||
Packaging updates and notes for downstreams
|
||||
-------------------------------------------
|
||||
|
||||
- Declared Python 3.12 and PyPy 3.8-3.10 supported officially
|
||||
in the distribution package metadata.
|
||||
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#553 <https://github.com/aio-libs/frozenlist/issues/553>`__.
|
||||
|
||||
- Replaced the packaging is replaced from an old-fashioned ``setup.py`` to an
|
||||
in-tree `PEP 517 <https://peps.python.org/pep-517>`__ build backend -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.
|
||||
|
||||
Whenever the end-users or downstream packagers need to build ``frozenlist``
|
||||
from source (a Git checkout or an sdist), they may pass a ``config_settings``
|
||||
flag ``pure-python``. If this flag is not set, a C-extension will be built
|
||||
and included into the distribution.
|
||||
|
||||
Here is how this can be done with ``pip``:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ python3 -m pip install . --config-settings=pure-python=
|
||||
|
||||
This will also work with ``-e | --editable``.
|
||||
|
||||
The same can be achieved via ``pypa/build``:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ python3 -m build --config-setting=pure-python=
|
||||
|
||||
Adding ``-w | --wheel`` can force ``pypa/build`` produce a wheel from source
|
||||
directly, as opposed to building an ``sdist`` and then building from it.
|
||||
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#560 <https://github.com/aio-libs/frozenlist/issues/560>`__.
|
||||
|
||||
|
||||
Contributor-facing changes
|
||||
--------------------------
|
||||
|
||||
- It is now possible to request line tracing in Cython builds using the
|
||||
``with-cython-tracing`` `PEP 517 <https://peps.python.org/pep-517>`__ config setting
|
||||
-- `@webknjaz <https://github.com/sponsors/webknjaz>`__.
|
||||
|
||||
This can be used in CI and development environment to measure coverage
|
||||
on Cython modules, but is not normally useful to the end-users or
|
||||
downstream packagers.
|
||||
|
||||
Here's a usage example:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ python3 -Im pip install . --config-settings=with-cython-tracing=true
|
||||
|
||||
For editable installs, this setting is on by default. Otherwise, it's
|
||||
off unless requested explicitly.
|
||||
|
||||
The following produces C-files required for the Cython coverage
|
||||
plugin to map the measurements back to the PYX-files:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ python -Im pip install -e .
|
||||
|
||||
Alternatively, the ``FROZENLIST_CYTHON_TRACING=1`` environment variable
|
||||
can be set to do the same as the `PEP 517 <https://peps.python.org/pep-517>`__ config setting.
|
||||
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#560 <https://github.com/aio-libs/frozenlist/issues/560>`__.
|
||||
|
||||
- Coverage collection has been implemented for the Cython modules
|
||||
-- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.
|
||||
|
||||
It will also be reported to Codecov from any non-release CI jobs.
|
||||
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#561 <https://github.com/aio-libs/frozenlist/issues/561>`__.
|
||||
|
||||
- A step-by-step ``Release Guide`` guide has
|
||||
been added, describing how to release *frozenlist* -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.
|
||||
|
||||
This is primarily targeting the maintainers.
|
||||
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#563 <https://github.com/aio-libs/frozenlist/issues/563>`__.
|
||||
|
||||
- Detailed ``Contributing Guidelines`` on
|
||||
authoring the changelog fragments have been published in the
|
||||
documentation -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.
|
||||
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#564 <https://github.com/aio-libs/frozenlist/issues/564>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
1.4.0 (2023-07-12)
|
||||
==================
|
||||
|
||||
The published source distribution package became buildable
|
||||
under Python 3.12.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
Bugfixes
|
||||
--------
|
||||
|
||||
- Removed an unused ``typing.Tuple`` import
|
||||
`#411 <https://github.com/aio-libs/frozenlist/issues/411>`_
|
||||
|
||||
|
||||
Deprecations and Removals
|
||||
-------------------------
|
||||
|
||||
- Dropped Python 3.7 support.
|
||||
`#413 <https://github.com/aio-libs/frozenlist/issues/413>`_
|
||||
|
||||
|
||||
Misc
|
||||
----
|
||||
|
||||
- `#410 <https://github.com/aio-libs/frozenlist/issues/410>`_, `#433 <https://github.com/aio-libs/frozenlist/issues/433>`_
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
1.3.3 (2022-11-08)
|
||||
==================
|
||||
|
||||
- Fixed CI runs when creating a new release, where new towncrier versions
|
||||
fail when the current version section is already present.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
1.3.2 (2022-11-08)
|
||||
==================
|
||||
|
||||
Misc
|
||||
----
|
||||
|
||||
- Updated the CI runs to better check for test results and to avoid deprecated syntax. `#327 <https://github.com/aio-libs/frozenlist/issues/327>`_
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
1.3.1 (2022-08-02)
|
||||
==================
|
||||
|
||||
The published source distribution package became buildable
|
||||
under Python 3.11.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
1.3.0 (2022-01-18)
|
||||
==================
|
||||
|
||||
Bugfixes
|
||||
--------
|
||||
|
||||
- Do not install C sources with binary distributions.
|
||||
`#250 <https://github.com/aio-libs/frozenlist/issues/250>`_
|
||||
|
||||
|
||||
Deprecations and Removals
|
||||
-------------------------
|
||||
|
||||
- Dropped Python 3.6 support
|
||||
`#274 <https://github.com/aio-libs/frozenlist/issues/274>`_
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
1.2.0 (2021-10-16)
|
||||
==================
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
- ``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).
|
||||
`#172 <https://github.com/aio-libs/frozenlist/issues/172>`_
|
||||
- Added support for Python 3.10.
|
||||
`#227 <https://github.com/aio-libs/frozenlist/issues/227>`_
|
||||
- Started shipping platform-specific wheels with the ``musl`` tag targeting typical Alpine Linux runtimes.
|
||||
`#227 <https://github.com/aio-libs/frozenlist/issues/227>`_
|
||||
- Started shipping platform-specific arm64 wheels for Apple Silicon.
|
||||
`#227 <https://github.com/aio-libs/frozenlist/issues/227>`_
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
1.1.1 (2020-11-14)
|
||||
==================
|
||||
|
||||
Bugfixes
|
||||
--------
|
||||
|
||||
- Provide x86 Windows wheels.
|
||||
`#169 <https://github.com/aio-libs/frozenlist/issues/169>`_
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
1.1.0 (2020-10-13)
|
||||
==================
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
- Add support for hashing of a frozen list.
|
||||
`#136 <https://github.com/aio-libs/frozenlist/issues/136>`_
|
||||
|
||||
- Support Python 3.8 and 3.9.
|
||||
|
||||
- Provide wheels for ``aarch64``, ``i686``, ``ppc64le``, ``s390x`` architectures on
|
||||
Linux as well as ``x86_64``.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
1.0.0 (2019-11-09)
|
||||
==================
|
||||
|
||||
Deprecations and Removals
|
||||
-------------------------
|
||||
|
||||
- Dropped support for Python 3.5; only 3.6, 3.7 and 3.8 are supported going forward.
|
||||
`#24 <https://github.com/aio-libs/frozenlist/issues/24>`_
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,141 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: setuptools
|
||||
Version: 80.9.0
|
||||
Summary: Easily download, build, install, upgrade, and uninstall Python packages
|
||||
Author-email: Python Packaging Authority <distutils-sig@python.org>
|
||||
License-Expression: MIT
|
||||
Project-URL: Source, https://github.com/pypa/setuptools
|
||||
Project-URL: Documentation, https://setuptools.pypa.io/
|
||||
Project-URL: Changelog, https://setuptools.pypa.io/en/stable/history.html
|
||||
Keywords: CPAN PyPI distutils eggs package management
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3 :: Only
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Classifier: Topic :: System :: Archiving :: Packaging
|
||||
Classifier: Topic :: System :: Systems Administration
|
||||
Classifier: Topic :: Utilities
|
||||
Requires-Python: >=3.9
|
||||
Description-Content-Type: text/x-rst
|
||||
License-File: LICENSE
|
||||
Provides-Extra: test
|
||||
Requires-Dist: pytest!=8.1.*,>=6; extra == "test"
|
||||
Requires-Dist: virtualenv>=13.0.0; extra == "test"
|
||||
Requires-Dist: wheel>=0.44.0; extra == "test"
|
||||
Requires-Dist: pip>=19.1; extra == "test"
|
||||
Requires-Dist: packaging>=24.2; extra == "test"
|
||||
Requires-Dist: jaraco.envs>=2.2; extra == "test"
|
||||
Requires-Dist: pytest-xdist>=3; extra == "test"
|
||||
Requires-Dist: jaraco.path>=3.7.2; extra == "test"
|
||||
Requires-Dist: build[virtualenv]>=1.0.3; extra == "test"
|
||||
Requires-Dist: filelock>=3.4.0; extra == "test"
|
||||
Requires-Dist: ini2toml[lite]>=0.14; extra == "test"
|
||||
Requires-Dist: tomli-w>=1.0.0; extra == "test"
|
||||
Requires-Dist: pytest-timeout; extra == "test"
|
||||
Requires-Dist: pytest-perf; sys_platform != "cygwin" and extra == "test"
|
||||
Requires-Dist: jaraco.develop>=7.21; (python_version >= "3.9" and sys_platform != "cygwin") and extra == "test"
|
||||
Requires-Dist: pytest-home>=0.5; extra == "test"
|
||||
Requires-Dist: pytest-subprocess; extra == "test"
|
||||
Requires-Dist: pyproject-hooks!=1.1; extra == "test"
|
||||
Requires-Dist: jaraco.test>=5.5; extra == "test"
|
||||
Provides-Extra: doc
|
||||
Requires-Dist: sphinx>=3.5; extra == "doc"
|
||||
Requires-Dist: jaraco.packaging>=9.3; extra == "doc"
|
||||
Requires-Dist: rst.linker>=1.9; extra == "doc"
|
||||
Requires-Dist: furo; extra == "doc"
|
||||
Requires-Dist: sphinx-lint; extra == "doc"
|
||||
Requires-Dist: jaraco.tidelift>=1.4; extra == "doc"
|
||||
Requires-Dist: pygments-github-lexers==0.0.5; extra == "doc"
|
||||
Requires-Dist: sphinx-favicon; extra == "doc"
|
||||
Requires-Dist: sphinx-inline-tabs; extra == "doc"
|
||||
Requires-Dist: sphinx-reredirects; extra == "doc"
|
||||
Requires-Dist: sphinxcontrib-towncrier; extra == "doc"
|
||||
Requires-Dist: sphinx-notfound-page<2,>=1; extra == "doc"
|
||||
Requires-Dist: pyproject-hooks!=1.1; extra == "doc"
|
||||
Requires-Dist: towncrier<24.7; extra == "doc"
|
||||
Provides-Extra: ssl
|
||||
Provides-Extra: certs
|
||||
Provides-Extra: core
|
||||
Requires-Dist: packaging>=24.2; extra == "core"
|
||||
Requires-Dist: more_itertools>=8.8; extra == "core"
|
||||
Requires-Dist: jaraco.text>=3.7; extra == "core"
|
||||
Requires-Dist: importlib_metadata>=6; python_version < "3.10" and extra == "core"
|
||||
Requires-Dist: tomli>=2.0.1; python_version < "3.11" and extra == "core"
|
||||
Requires-Dist: wheel>=0.43.0; extra == "core"
|
||||
Requires-Dist: platformdirs>=4.2.2; extra == "core"
|
||||
Requires-Dist: jaraco.functools>=4; extra == "core"
|
||||
Requires-Dist: more_itertools; extra == "core"
|
||||
Provides-Extra: check
|
||||
Requires-Dist: pytest-checkdocs>=2.4; extra == "check"
|
||||
Requires-Dist: pytest-ruff>=0.2.1; sys_platform != "cygwin" and extra == "check"
|
||||
Requires-Dist: ruff>=0.8.0; sys_platform != "cygwin" and extra == "check"
|
||||
Provides-Extra: cover
|
||||
Requires-Dist: pytest-cov; extra == "cover"
|
||||
Provides-Extra: enabler
|
||||
Requires-Dist: pytest-enabler>=2.2; extra == "enabler"
|
||||
Provides-Extra: type
|
||||
Requires-Dist: pytest-mypy; extra == "type"
|
||||
Requires-Dist: mypy==1.14.*; extra == "type"
|
||||
Requires-Dist: importlib_metadata>=7.0.2; python_version < "3.10" and extra == "type"
|
||||
Requires-Dist: jaraco.develop>=7.21; sys_platform != "cygwin" and extra == "type"
|
||||
Dynamic: license-file
|
||||
|
||||
.. |pypi-version| image:: https://img.shields.io/pypi/v/setuptools.svg
|
||||
:target: https://pypi.org/project/setuptools
|
||||
|
||||
.. |py-version| image:: https://img.shields.io/pypi/pyversions/setuptools.svg
|
||||
|
||||
.. |test-badge| image:: https://github.com/pypa/setuptools/actions/workflows/main.yml/badge.svg
|
||||
:target: https://github.com/pypa/setuptools/actions?query=workflow%3A%22tests%22
|
||||
:alt: tests
|
||||
|
||||
.. |ruff-badge| image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json
|
||||
:target: https://github.com/astral-sh/ruff
|
||||
:alt: Ruff
|
||||
|
||||
.. |docs-badge| image:: https://img.shields.io/readthedocs/setuptools/latest.svg
|
||||
:target: https://setuptools.pypa.io
|
||||
|
||||
.. |skeleton-badge| image:: https://img.shields.io/badge/skeleton-2025-informational
|
||||
:target: https://blog.jaraco.com/skeleton
|
||||
|
||||
.. |codecov-badge| image:: https://img.shields.io/codecov/c/github/pypa/setuptools/master.svg?logo=codecov&logoColor=white
|
||||
:target: https://codecov.io/gh/pypa/setuptools
|
||||
|
||||
.. |tidelift-badge| image:: https://tidelift.com/badges/github/pypa/setuptools?style=flat
|
||||
:target: https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=readme
|
||||
|
||||
.. |discord-badge| image:: https://img.shields.io/discord/803025117553754132
|
||||
:target: https://discord.com/channels/803025117553754132/815945031150993468
|
||||
:alt: Discord
|
||||
|
||||
|pypi-version| |py-version| |test-badge| |ruff-badge| |docs-badge| |skeleton-badge| |codecov-badge| |discord-badge|
|
||||
|
||||
See the `Quickstart <https://setuptools.pypa.io/en/latest/userguide/quickstart.html>`_
|
||||
and the `User's Guide <https://setuptools.pypa.io/en/latest/userguide/>`_ for
|
||||
instructions on how to use Setuptools.
|
||||
|
||||
Questions and comments should be directed to `GitHub Discussions
|
||||
<https://github.com/pypa/setuptools/discussions>`_.
|
||||
Bug reports and especially tested patches may be
|
||||
submitted directly to the `bug tracker
|
||||
<https://github.com/pypa/setuptools/issues>`_.
|
||||
|
||||
|
||||
Code of Conduct
|
||||
===============
|
||||
|
||||
Everyone interacting in the setuptools project's codebases, issue trackers,
|
||||
chat rooms, and fora is expected to follow the
|
||||
`PSF Code of Conduct <https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md>`_.
|
||||
|
||||
|
||||
For Enterprise
|
||||
==============
|
||||
|
||||
Available as part of the Tidelift Subscription.
|
||||
|
||||
Setuptools and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use.
|
||||
|
||||
`Learn more <https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=referral&utm_campaign=github>`_.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,648 @@
|
||||
Metadata-Version: 2.1
|
||||
Name: pytz
|
||||
Version: 2025.2
|
||||
Summary: World timezone definitions, modern and historical
|
||||
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
|
||||
Keywords: timezone,tzinfo,datetime,olson,time
|
||||
Platform: Independent
|
||||
Classifier: Development Status :: 6 - Mature
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: MIT License
|
||||
Classifier: Natural Language :: English
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 2
|
||||
Classifier: Programming Language :: Python :: 2.4
|
||||
Classifier: Programming Language :: Python :: 2.5
|
||||
Classifier: Programming Language :: Python :: 2.6
|
||||
Classifier: Programming Language :: Python :: 2.7
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.1
|
||||
Classifier: Programming Language :: Python :: 3.2
|
||||
Classifier: Programming Language :: Python :: 3.3
|
||||
Classifier: Programming Language :: Python :: 3.4
|
||||
Classifier: Programming Language :: Python :: 3.5
|
||||
Classifier: Programming Language :: Python :: 3.6
|
||||
Classifier: Programming Language :: Python :: 3.7
|
||||
Classifier: Programming Language :: Python :: 3.8
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
License-File: LICENSE.txt
|
||||
|
||||
pytz - World Timezone Definitions for Python
|
||||
============================================
|
||||
|
||||
:Author: Stuart Bishop <stuart@stuartbishop.net>
|
||||
|
||||
Introduction
|
||||
~~~~~~~~~~~~
|
||||
|
||||
pytz brings the Olson tz database into Python. This library allows
|
||||
accurate and cross platform timezone calculations using Python 2.4
|
||||
or higher. It also solves the issue of ambiguous times at the end
|
||||
of daylight saving time, which you can read more about in the Python
|
||||
Library Reference (``datetime.tzinfo``).
|
||||
|
||||
Almost all of the Olson timezones are supported.
|
||||
|
||||
.. note::
|
||||
|
||||
Projects using Python 3.9 or later should be using the support
|
||||
now included as part of the standard library, and third party
|
||||
packages work with it such as `tzdata <https://pypi.org/project/tzdata/>`_.
|
||||
pytz offers no advantages beyond backwards compatibility with
|
||||
code written for earlier versions of Python.
|
||||
|
||||
.. note::
|
||||
|
||||
This library differs from the documented Python API for
|
||||
tzinfo implementations; if you want to create local wallclock
|
||||
times you need to use the ``localize()`` method documented in this
|
||||
document. In addition, if you perform date arithmetic on local
|
||||
times that cross DST boundaries, the result may be in an incorrect
|
||||
timezone (ie. subtract 1 minute from 2002-10-27 1:00 EST and you get
|
||||
2002-10-27 0:59 EST instead of the correct 2002-10-27 1:59 EDT). A
|
||||
``normalize()`` method is provided to correct this. Unfortunately these
|
||||
issues cannot be resolved without modifying the Python datetime
|
||||
implementation (see PEP-431).
|
||||
|
||||
|
||||
Installation
|
||||
~~~~~~~~~~~~
|
||||
|
||||
This package can either be installed using ``pip`` or from a tarball using the
|
||||
standard Python distutils.
|
||||
|
||||
If you are installing using ``pip``, you don't need to download anything as the
|
||||
latest version will be downloaded for you from PyPI::
|
||||
|
||||
pip install pytz
|
||||
|
||||
If you are installing from a tarball, run the following command as an
|
||||
administrative user::
|
||||
|
||||
python setup.py install
|
||||
|
||||
|
||||
pytz for Enterprise
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Available as part of the Tidelift Subscription.
|
||||
|
||||
The 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>`_.
|
||||
|
||||
|
||||
Example & Usage
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
Localized times and date arithmetic
|
||||
-----------------------------------
|
||||
|
||||
>>> from datetime import datetime, timedelta
|
||||
>>> from pytz import timezone
|
||||
>>> import pytz
|
||||
>>> utc = pytz.utc
|
||||
>>> utc.zone
|
||||
'UTC'
|
||||
>>> eastern = timezone('US/Eastern')
|
||||
>>> eastern.zone
|
||||
'US/Eastern'
|
||||
>>> amsterdam = timezone('Europe/Amsterdam')
|
||||
>>> fmt = '%Y-%m-%d %H:%M:%S %Z%z'
|
||||
|
||||
This library only supports two ways of building a localized time. The
|
||||
first is to use the ``localize()`` method provided by the pytz library.
|
||||
This is used to localize a naive datetime (datetime with no timezone
|
||||
information):
|
||||
|
||||
>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))
|
||||
>>> print(loc_dt.strftime(fmt))
|
||||
2002-10-27 06:00:00 EST-0500
|
||||
|
||||
The second way of building a localized time is by converting an existing
|
||||
localized time using the standard ``astimezone()`` method:
|
||||
|
||||
>>> ams_dt = loc_dt.astimezone(amsterdam)
|
||||
>>> ams_dt.strftime(fmt)
|
||||
'2002-10-27 12:00:00 CET+0100'
|
||||
|
||||
Unfortunately using the tzinfo argument of the standard datetime
|
||||
constructors ''does not work'' with pytz for many timezones.
|
||||
|
||||
>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=amsterdam).strftime(fmt) # /!\ Does not work this way!
|
||||
'2002-10-27 12:00:00 LMT+0018'
|
||||
|
||||
It is safe for timezones without daylight saving transitions though, such
|
||||
as UTC:
|
||||
|
||||
>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=pytz.utc).strftime(fmt) # /!\ Not recommended except for UTC
|
||||
'2002-10-27 12:00:00 UTC+0000'
|
||||
|
||||
The preferred way of dealing with times is to always work in UTC,
|
||||
converting to localtime only when generating output to be read
|
||||
by humans.
|
||||
|
||||
>>> utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc)
|
||||
>>> loc_dt = utc_dt.astimezone(eastern)
|
||||
>>> loc_dt.strftime(fmt)
|
||||
'2002-10-27 01:00:00 EST-0500'
|
||||
|
||||
This library also allows you to do date arithmetic using local
|
||||
times, although it is more complicated than working in UTC as you
|
||||
need to use the ``normalize()`` method to handle daylight saving time
|
||||
and other timezone transitions. In this example, ``loc_dt`` is set
|
||||
to the instant when daylight saving time ends in the US/Eastern
|
||||
timezone.
|
||||
|
||||
>>> before = loc_dt - timedelta(minutes=10)
|
||||
>>> before.strftime(fmt)
|
||||
'2002-10-27 00:50:00 EST-0500'
|
||||
>>> eastern.normalize(before).strftime(fmt)
|
||||
'2002-10-27 01:50:00 EDT-0400'
|
||||
>>> after = eastern.normalize(before + timedelta(minutes=20))
|
||||
>>> after.strftime(fmt)
|
||||
'2002-10-27 01:10:00 EST-0500'
|
||||
|
||||
Creating local times is also tricky, and the reason why working with
|
||||
local times is not recommended. Unfortunately, you cannot just pass
|
||||
a ``tzinfo`` argument when constructing a datetime (see the next
|
||||
section for more details)
|
||||
|
||||
>>> dt = datetime(2002, 10, 27, 1, 30, 0)
|
||||
>>> dt1 = eastern.localize(dt, is_dst=True)
|
||||
>>> dt1.strftime(fmt)
|
||||
'2002-10-27 01:30:00 EDT-0400'
|
||||
>>> dt2 = eastern.localize(dt, is_dst=False)
|
||||
>>> dt2.strftime(fmt)
|
||||
'2002-10-27 01:30:00 EST-0500'
|
||||
|
||||
Converting between timezones is more easily done, using the
|
||||
standard astimezone method.
|
||||
|
||||
>>> utc_dt = datetime.fromtimestamp(1143408899, tz=utc)
|
||||
>>> utc_dt.strftime(fmt)
|
||||
'2006-03-26 21:34:59 UTC+0000'
|
||||
>>> au_tz = timezone('Australia/Sydney')
|
||||
>>> au_dt = utc_dt.astimezone(au_tz)
|
||||
>>> au_dt.strftime(fmt)
|
||||
'2006-03-27 08:34:59 AEDT+1100'
|
||||
>>> utc_dt2 = au_dt.astimezone(utc)
|
||||
>>> utc_dt2.strftime(fmt)
|
||||
'2006-03-26 21:34:59 UTC+0000'
|
||||
>>> utc_dt == utc_dt2
|
||||
True
|
||||
|
||||
You can take shortcuts when dealing with the UTC side of timezone
|
||||
conversions. ``normalize()`` and ``localize()`` are not really
|
||||
necessary when there are no daylight saving time transitions to
|
||||
deal with.
|
||||
|
||||
>>> utc_dt = datetime.fromtimestamp(1143408899, tz=utc)
|
||||
>>> utc_dt.strftime(fmt)
|
||||
'2006-03-26 21:34:59 UTC+0000'
|
||||
>>> au_tz = timezone('Australia/Sydney')
|
||||
>>> au_dt = au_tz.normalize(utc_dt.astimezone(au_tz))
|
||||
>>> au_dt.strftime(fmt)
|
||||
'2006-03-27 08:34:59 AEDT+1100'
|
||||
>>> utc_dt2 = au_dt.astimezone(utc)
|
||||
>>> utc_dt2.strftime(fmt)
|
||||
'2006-03-26 21:34:59 UTC+0000'
|
||||
|
||||
|
||||
``tzinfo`` API
|
||||
--------------
|
||||
|
||||
The ``tzinfo`` instances returned by the ``timezone()`` function have
|
||||
been extended to cope with ambiguous times by adding an ``is_dst``
|
||||
parameter to the ``utcoffset()``, ``dst()`` && ``tzname()`` methods.
|
||||
|
||||
>>> tz = timezone('America/St_Johns')
|
||||
|
||||
>>> normal = datetime(2009, 9, 1)
|
||||
>>> ambiguous = datetime(2009, 10, 31, 23, 30)
|
||||
|
||||
The ``is_dst`` parameter is ignored for most timestamps. It is only used
|
||||
during DST transition ambiguous periods to resolve that ambiguity.
|
||||
|
||||
>>> print(tz.utcoffset(normal, is_dst=True))
|
||||
-1 day, 21:30:00
|
||||
>>> print(tz.dst(normal, is_dst=True))
|
||||
1:00:00
|
||||
>>> tz.tzname(normal, is_dst=True)
|
||||
'NDT'
|
||||
|
||||
>>> print(tz.utcoffset(ambiguous, is_dst=True))
|
||||
-1 day, 21:30:00
|
||||
>>> print(tz.dst(ambiguous, is_dst=True))
|
||||
1:00:00
|
||||
>>> tz.tzname(ambiguous, is_dst=True)
|
||||
'NDT'
|
||||
|
||||
>>> print(tz.utcoffset(normal, is_dst=False))
|
||||
-1 day, 21:30:00
|
||||
>>> tz.dst(normal, is_dst=False).seconds
|
||||
3600
|
||||
>>> tz.tzname(normal, is_dst=False)
|
||||
'NDT'
|
||||
|
||||
>>> print(tz.utcoffset(ambiguous, is_dst=False))
|
||||
-1 day, 20:30:00
|
||||
>>> tz.dst(ambiguous, is_dst=False)
|
||||
datetime.timedelta(0)
|
||||
>>> tz.tzname(ambiguous, is_dst=False)
|
||||
'NST'
|
||||
|
||||
If ``is_dst`` is not specified, ambiguous timestamps will raise
|
||||
an ``pytz.exceptions.AmbiguousTimeError`` exception.
|
||||
|
||||
>>> print(tz.utcoffset(normal))
|
||||
-1 day, 21:30:00
|
||||
>>> print(tz.dst(normal))
|
||||
1:00:00
|
||||
>>> tz.tzname(normal)
|
||||
'NDT'
|
||||
|
||||
>>> import pytz.exceptions
|
||||
>>> try:
|
||||
... tz.utcoffset(ambiguous)
|
||||
... except pytz.exceptions.AmbiguousTimeError:
|
||||
... print('pytz.exceptions.AmbiguousTimeError: %s' % ambiguous)
|
||||
pytz.exceptions.AmbiguousTimeError: 2009-10-31 23:30:00
|
||||
>>> try:
|
||||
... tz.dst(ambiguous)
|
||||
... except pytz.exceptions.AmbiguousTimeError:
|
||||
... print('pytz.exceptions.AmbiguousTimeError: %s' % ambiguous)
|
||||
pytz.exceptions.AmbiguousTimeError: 2009-10-31 23:30:00
|
||||
>>> try:
|
||||
... tz.tzname(ambiguous)
|
||||
... except pytz.exceptions.AmbiguousTimeError:
|
||||
... print('pytz.exceptions.AmbiguousTimeError: %s' % ambiguous)
|
||||
pytz.exceptions.AmbiguousTimeError: 2009-10-31 23:30:00
|
||||
|
||||
|
||||
Problems with Localtime
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The major problem we have to deal with is that certain datetimes
|
||||
may occur twice in a year. For example, in the US/Eastern timezone
|
||||
on the last Sunday morning in October, the following sequence
|
||||
happens:
|
||||
|
||||
- 01:00 EDT occurs
|
||||
- 1 hour later, instead of 2:00am the clock is turned back 1 hour
|
||||
and 01:00 happens again (this time 01:00 EST)
|
||||
|
||||
In fact, every instant between 01:00 and 02:00 occurs twice. This means
|
||||
that if you try and create a time in the 'US/Eastern' timezone
|
||||
the standard datetime syntax, there is no way to specify if you meant
|
||||
before of after the end-of-daylight-saving-time transition. Using the
|
||||
pytz custom syntax, the best you can do is make an educated guess:
|
||||
|
||||
>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 1, 30, 00))
|
||||
>>> loc_dt.strftime(fmt)
|
||||
'2002-10-27 01:30:00 EST-0500'
|
||||
|
||||
As you can see, the system has chosen one for you and there is a 50%
|
||||
chance of it being out by one hour. For some applications, this does
|
||||
not matter. However, if you are trying to schedule meetings with people
|
||||
in different timezones or analyze log files it is not acceptable.
|
||||
|
||||
The best and simplest solution is to stick with using UTC. The pytz
|
||||
package encourages using UTC for internal timezone representation by
|
||||
including a special UTC implementation based on the standard Python
|
||||
reference implementation in the Python documentation.
|
||||
|
||||
The UTC timezone unpickles to be the same instance, and pickles to a
|
||||
smaller size than other pytz tzinfo instances. The UTC implementation
|
||||
can be obtained as pytz.utc, pytz.UTC, or pytz.timezone('UTC').
|
||||
|
||||
>>> import pickle, pytz
|
||||
>>> dt = datetime(2005, 3, 1, 14, 13, 21, tzinfo=utc)
|
||||
>>> naive = dt.replace(tzinfo=None)
|
||||
>>> p = pickle.dumps(dt, 1)
|
||||
>>> naive_p = pickle.dumps(naive, 1)
|
||||
>>> len(p) - len(naive_p)
|
||||
17
|
||||
>>> new = pickle.loads(p)
|
||||
>>> new == dt
|
||||
True
|
||||
>>> new is dt
|
||||
False
|
||||
>>> new.tzinfo is dt.tzinfo
|
||||
True
|
||||
>>> pytz.utc is pytz.UTC is pytz.timezone('UTC')
|
||||
True
|
||||
|
||||
Note that some other timezones are commonly thought of as the same (GMT,
|
||||
Greenwich, Universal, etc.). The definition of UTC is distinct from these
|
||||
other timezones, and they are not equivalent. For this reason, they will
|
||||
not compare the same in Python.
|
||||
|
||||
>>> utc == pytz.timezone('GMT')
|
||||
False
|
||||
|
||||
See the section `What is UTC`_, below.
|
||||
|
||||
If you insist on working with local times, this library provides a
|
||||
facility for constructing them unambiguously:
|
||||
|
||||
>>> loc_dt = datetime(2002, 10, 27, 1, 30, 00)
|
||||
>>> est_dt = eastern.localize(loc_dt, is_dst=True)
|
||||
>>> edt_dt = eastern.localize(loc_dt, is_dst=False)
|
||||
>>> print(est_dt.strftime(fmt) + ' / ' + edt_dt.strftime(fmt))
|
||||
2002-10-27 01:30:00 EDT-0400 / 2002-10-27 01:30:00 EST-0500
|
||||
|
||||
If you pass None as the is_dst flag to localize(), pytz will refuse to
|
||||
guess and raise exceptions if you try to build ambiguous or non-existent
|
||||
times.
|
||||
|
||||
For example, 1:30am on 27th Oct 2002 happened twice in the US/Eastern
|
||||
timezone when the clocks where put back at the end of Daylight Saving
|
||||
Time:
|
||||
|
||||
>>> dt = datetime(2002, 10, 27, 1, 30, 00)
|
||||
>>> try:
|
||||
... eastern.localize(dt, is_dst=None)
|
||||
... except pytz.exceptions.AmbiguousTimeError:
|
||||
... print('pytz.exceptions.AmbiguousTimeError: %s' % dt)
|
||||
pytz.exceptions.AmbiguousTimeError: 2002-10-27 01:30:00
|
||||
|
||||
Similarly, 2:30am on 7th April 2002 never happened at all in the
|
||||
US/Eastern timezone, as the clocks where put forward at 2:00am skipping
|
||||
the entire hour:
|
||||
|
||||
>>> dt = datetime(2002, 4, 7, 2, 30, 00)
|
||||
>>> try:
|
||||
... eastern.localize(dt, is_dst=None)
|
||||
... except pytz.exceptions.NonExistentTimeError:
|
||||
... print('pytz.exceptions.NonExistentTimeError: %s' % dt)
|
||||
pytz.exceptions.NonExistentTimeError: 2002-04-07 02:30:00
|
||||
|
||||
Both of these exceptions share a common base class to make error handling
|
||||
easier:
|
||||
|
||||
>>> isinstance(pytz.AmbiguousTimeError(), pytz.InvalidTimeError)
|
||||
True
|
||||
>>> isinstance(pytz.NonExistentTimeError(), pytz.InvalidTimeError)
|
||||
True
|
||||
|
||||
|
||||
A special case is where countries change their timezone definitions
|
||||
with no daylight savings time switch. For example, in 1915 Warsaw
|
||||
switched from Warsaw time to Central European time with no daylight savings
|
||||
transition. So at the stroke of midnight on August 5th 1915 the clocks
|
||||
were wound back 24 minutes creating an ambiguous time period that cannot
|
||||
be specified without referring to the timezone abbreviation or the
|
||||
actual UTC offset. In this case midnight happened twice, neither time
|
||||
during a daylight saving time period. pytz handles this transition by
|
||||
treating the ambiguous period before the switch as daylight savings
|
||||
time, and the ambiguous period after as standard time.
|
||||
|
||||
|
||||
>>> warsaw = pytz.timezone('Europe/Warsaw')
|
||||
>>> amb_dt1 = warsaw.localize(datetime(1915, 8, 4, 23, 59, 59), is_dst=True)
|
||||
>>> amb_dt1.strftime(fmt)
|
||||
'1915-08-04 23:59:59 WMT+0124'
|
||||
>>> amb_dt2 = warsaw.localize(datetime(1915, 8, 4, 23, 59, 59), is_dst=False)
|
||||
>>> amb_dt2.strftime(fmt)
|
||||
'1915-08-04 23:59:59 CET+0100'
|
||||
>>> switch_dt = warsaw.localize(datetime(1915, 8, 5, 00, 00, 00), is_dst=False)
|
||||
>>> switch_dt.strftime(fmt)
|
||||
'1915-08-05 00:00:00 CET+0100'
|
||||
>>> str(switch_dt - amb_dt1)
|
||||
'0:24:01'
|
||||
>>> str(switch_dt - amb_dt2)
|
||||
'0:00:01'
|
||||
|
||||
The best way of creating a time during an ambiguous time period is
|
||||
by converting from another timezone such as UTC:
|
||||
|
||||
>>> utc_dt = datetime(1915, 8, 4, 22, 36, tzinfo=pytz.utc)
|
||||
>>> utc_dt.astimezone(warsaw).strftime(fmt)
|
||||
'1915-08-04 23:36:00 CET+0100'
|
||||
|
||||
The standard Python way of handling all these ambiguities is not to
|
||||
handle them, such as demonstrated in this example using the US/Eastern
|
||||
timezone definition from the Python documentation (Note that this
|
||||
implementation only works for dates between 1987 and 2006 - it is
|
||||
included for tests only!):
|
||||
|
||||
>>> from pytz.reference import Eastern # pytz.reference only for tests
|
||||
>>> dt = datetime(2002, 10, 27, 0, 30, tzinfo=Eastern)
|
||||
>>> str(dt)
|
||||
'2002-10-27 00:30:00-04:00'
|
||||
>>> str(dt + timedelta(hours=1))
|
||||
'2002-10-27 01:30:00-05:00'
|
||||
>>> str(dt + timedelta(hours=2))
|
||||
'2002-10-27 02:30:00-05:00'
|
||||
>>> str(dt + timedelta(hours=3))
|
||||
'2002-10-27 03:30:00-05:00'
|
||||
|
||||
Notice the first two results? At first glance you might think they are
|
||||
correct, but taking the UTC offset into account you find that they are
|
||||
actually two hours appart instead of the 1 hour we asked for.
|
||||
|
||||
>>> from pytz.reference import UTC # pytz.reference only for tests
|
||||
>>> str(dt.astimezone(UTC))
|
||||
'2002-10-27 04:30:00+00:00'
|
||||
>>> str((dt + timedelta(hours=1)).astimezone(UTC))
|
||||
'2002-10-27 06:30:00+00:00'
|
||||
|
||||
|
||||
Country Information
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
A mechanism is provided to access the timezones commonly in use
|
||||
for a particular country, looked up using the ISO 3166 country code.
|
||||
It returns a list of strings that can be used to retrieve the relevant
|
||||
tzinfo instance using ``pytz.timezone()``:
|
||||
|
||||
>>> print(' '.join(pytz.country_timezones['nz']))
|
||||
Pacific/Auckland Pacific/Chatham
|
||||
|
||||
The Olson database comes with a ISO 3166 country code to English country
|
||||
name mapping that pytz exposes as a dictionary:
|
||||
|
||||
>>> print(pytz.country_names['nz'])
|
||||
New Zealand
|
||||
|
||||
|
||||
What is UTC
|
||||
~~~~~~~~~~~
|
||||
|
||||
'UTC' is `Coordinated Universal Time`_. It is a successor to, but distinct
|
||||
from, Greenwich Mean Time (GMT) and the various definitions of Universal
|
||||
Time. UTC is now the worldwide standard for regulating clocks and time
|
||||
measurement.
|
||||
|
||||
All other timezones are defined relative to UTC, and include offsets like
|
||||
UTC+0800 - hours to add or subtract from UTC to derive the local time. No
|
||||
daylight saving time occurs in UTC, making it a useful timezone to perform
|
||||
date arithmetic without worrying about the confusion and ambiguities caused
|
||||
by daylight saving time transitions, your country changing its timezone, or
|
||||
mobile computers that roam through multiple timezones.
|
||||
|
||||
.. _Coordinated Universal Time: https://en.wikipedia.org/wiki/Coordinated_Universal_Time
|
||||
|
||||
|
||||
Helpers
|
||||
~~~~~~~
|
||||
|
||||
There are two lists of timezones provided.
|
||||
|
||||
``all_timezones`` is the exhaustive list of the timezone names that can
|
||||
be used.
|
||||
|
||||
>>> from pytz import all_timezones
|
||||
>>> len(all_timezones) >= 500
|
||||
True
|
||||
>>> 'Etc/Greenwich' in all_timezones
|
||||
True
|
||||
|
||||
``common_timezones`` is a list of useful, current timezones. It doesn't
|
||||
contain deprecated zones or historical zones, except for a few I've
|
||||
deemed in common usage, such as US/Eastern (open a bug report if you
|
||||
think other timezones are deserving of being included here). It is also
|
||||
a sequence of strings.
|
||||
|
||||
>>> from pytz import common_timezones
|
||||
>>> len(common_timezones) < len(all_timezones)
|
||||
True
|
||||
>>> 'Etc/Greenwich' in common_timezones
|
||||
False
|
||||
>>> 'Australia/Melbourne' in common_timezones
|
||||
True
|
||||
>>> 'US/Eastern' in common_timezones
|
||||
True
|
||||
>>> 'Canada/Eastern' in common_timezones
|
||||
True
|
||||
>>> 'Australia/Yancowinna' in all_timezones
|
||||
True
|
||||
>>> 'Australia/Yancowinna' in common_timezones
|
||||
False
|
||||
|
||||
Both ``common_timezones`` and ``all_timezones`` are alphabetically
|
||||
sorted:
|
||||
|
||||
>>> common_timezones_dupe = common_timezones[:]
|
||||
>>> common_timezones_dupe.sort()
|
||||
>>> common_timezones == common_timezones_dupe
|
||||
True
|
||||
>>> all_timezones_dupe = all_timezones[:]
|
||||
>>> all_timezones_dupe.sort()
|
||||
>>> all_timezones == all_timezones_dupe
|
||||
True
|
||||
|
||||
``all_timezones`` and ``common_timezones`` are also available as sets.
|
||||
|
||||
>>> from pytz import all_timezones_set, common_timezones_set
|
||||
>>> 'US/Eastern' in all_timezones_set
|
||||
True
|
||||
>>> 'US/Eastern' in common_timezones_set
|
||||
True
|
||||
>>> 'Australia/Victoria' in common_timezones_set
|
||||
False
|
||||
|
||||
You can also retrieve lists of timezones used by particular countries
|
||||
using the ``country_timezones()`` function. It requires an ISO-3166
|
||||
two letter country code.
|
||||
|
||||
>>> from pytz import country_timezones
|
||||
>>> print(' '.join(country_timezones('ch')))
|
||||
Europe/Zurich
|
||||
>>> print(' '.join(country_timezones('CH')))
|
||||
Europe/Zurich
|
||||
|
||||
|
||||
Internationalization - i18n/l10n
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Pytz is an interface to the IANA database, which uses ASCII names. The `Unicode Consortium's Unicode Locales (CLDR) <http://cldr.unicode.org>`_
|
||||
project provides translations. Python packages such as
|
||||
`Babel <https://babel.pocoo.org/en/latest/api/dates.html#timezone-functionality>`_
|
||||
and Thomas Khyn's `l18n <https://pypi.org/project/l18n/>`_ package can be used
|
||||
to access these translations from Python.
|
||||
|
||||
|
||||
License
|
||||
~~~~~~~
|
||||
|
||||
MIT license.
|
||||
|
||||
This code is also available as part of Zope 3 under the Zope Public
|
||||
License, Version 2.1 (ZPL).
|
||||
|
||||
I'm happy to relicense this code if necessary for inclusion in other
|
||||
open source projects.
|
||||
|
||||
|
||||
Latest Versions
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
This package will be updated after releases of the Olson timezone
|
||||
database. The latest version can be downloaded from the `Python Package
|
||||
Index <https://pypi.org/project/pytz/>`_. The code that is used
|
||||
to generate this distribution is hosted on Github and available
|
||||
using git::
|
||||
|
||||
git clone https://github.com/stub42/pytz.git
|
||||
|
||||
Announcements of new releases are made on
|
||||
`Launchpad <https://launchpad.net/pytz>`_, and the
|
||||
`Atom feed <http://feeds.launchpad.net/pytz/announcements.atom>`_
|
||||
hosted there.
|
||||
|
||||
|
||||
Bugs, Feature Requests & Patches
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Bugs should be reported on `Github <https://github.com/stub42/pytz/issues>`_.
|
||||
Feature requests are unlikely to be considered, and efforts instead directed
|
||||
to timezone support now built into Python or packages that work with it.
|
||||
|
||||
|
||||
Security Issues
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
Reports about security issues can be made via `Tidelift <https://tidelift.com/security>`_.
|
||||
|
||||
|
||||
Issues & Limitations
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- This project is in maintenance mode. Projects using Python 3.9 or later
|
||||
are best served by using the timezone functionaly now included in core
|
||||
Python and packages that work with it such as `tzdata <https://pypi.org/project/tzdata/>`_.
|
||||
|
||||
- Offsets from UTC are rounded to the nearest whole minute, so timezones
|
||||
such as Europe/Amsterdam pre 1937 will be up to 30 seconds out. This
|
||||
was a limitation of the Python datetime library.
|
||||
|
||||
- If you think a timezone definition is incorrect, I probably can't fix
|
||||
it. pytz is a direct translation of the Olson timezone database, and
|
||||
changes to the timezone definitions need to be made to this source.
|
||||
If you find errors they should be reported to the time zone mailing
|
||||
list, linked from http://www.iana.org/time-zones.
|
||||
|
||||
|
||||
Further Reading
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
More info than you want to know about timezones:
|
||||
https://data.iana.org/time-zones/tz-link.html
|
||||
|
||||
|
||||
Contact
|
||||
~~~~~~~
|
||||
|
||||
Stuart Bishop <stuart@stuartbishop.net>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,123 @@
|
||||
Metadata-Version: 2.3
|
||||
Name: aiohappyeyeballs
|
||||
Version: 2.6.1
|
||||
Summary: Happy Eyeballs for asyncio
|
||||
License: PSF-2.0
|
||||
Author: J. Nick Koston
|
||||
Author-email: nick@koston.org
|
||||
Requires-Python: >=3.9
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: Natural Language :: English
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Topic :: Software Development :: Libraries
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: License :: OSI Approved :: Python Software Foundation License
|
||||
Project-URL: Bug Tracker, https://github.com/aio-libs/aiohappyeyeballs/issues
|
||||
Project-URL: Changelog, https://github.com/aio-libs/aiohappyeyeballs/blob/main/CHANGELOG.md
|
||||
Project-URL: Documentation, https://aiohappyeyeballs.readthedocs.io
|
||||
Project-URL: Repository, https://github.com/aio-libs/aiohappyeyeballs
|
||||
Description-Content-Type: text/markdown
|
||||
|
||||
# aiohappyeyeballs
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/aio-libs/aiohappyeyeballs/actions/workflows/ci.yml?query=branch%3Amain">
|
||||
<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" >
|
||||
</a>
|
||||
<a href="https://aiohappyeyeballs.readthedocs.io">
|
||||
<img src="https://img.shields.io/readthedocs/aiohappyeyeballs.svg?logo=read-the-docs&logoColor=fff&style=flat-square" alt="Documentation Status">
|
||||
</a>
|
||||
<a href="https://codecov.io/gh/aio-libs/aiohappyeyeballs">
|
||||
<img src="https://img.shields.io/codecov/c/github/aio-libs/aiohappyeyeballs.svg?logo=codecov&logoColor=fff&style=flat-square" alt="Test coverage percentage">
|
||||
</a>
|
||||
</p>
|
||||
<p align="center">
|
||||
<a href="https://python-poetry.org/">
|
||||
<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">
|
||||
</a>
|
||||
<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">
|
||||
</a>
|
||||
<a href="https://github.com/pre-commit/pre-commit">
|
||||
<img src="https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=flat-square" alt="pre-commit">
|
||||
</a>
|
||||
</p>
|
||||
<p align="center">
|
||||
<a href="https://pypi.org/project/aiohappyeyeballs/">
|
||||
<img src="https://img.shields.io/pypi/v/aiohappyeyeballs.svg?logo=python&logoColor=fff&style=flat-square" alt="PyPI Version">
|
||||
</a>
|
||||
<img src="https://img.shields.io/pypi/pyversions/aiohappyeyeballs.svg?style=flat-square&logo=python&logoColor=fff" alt="Supported Python versions">
|
||||
<img src="https://img.shields.io/pypi/l/aiohappyeyeballs.svg?style=flat-square" alt="License">
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
**Documentation**: <a href="https://aiohappyeyeballs.readthedocs.io" target="_blank">https://aiohappyeyeballs.readthedocs.io </a>
|
||||
|
||||
**Source Code**: <a href="https://github.com/aio-libs/aiohappyeyeballs" target="_blank">https://github.com/aio-libs/aiohappyeyeballs </a>
|
||||
|
||||
---
|
||||
|
||||
[Happy Eyeballs](https://en.wikipedia.org/wiki/Happy_Eyeballs)
|
||||
([RFC 8305](https://www.rfc-editor.org/rfc/rfc8305.html))
|
||||
|
||||
## Use case
|
||||
|
||||
This library exists to allow connecting with
|
||||
[Happy Eyeballs](https://en.wikipedia.org/wiki/Happy_Eyeballs)
|
||||
([RFC 8305](https://www.rfc-editor.org/rfc/rfc8305.html))
|
||||
when you
|
||||
already have a list of addrinfo and not a DNS name.
|
||||
|
||||
The stdlib version of `loop.create_connection()`
|
||||
will only work when you pass in an unresolved name which
|
||||
is not a good fit when using DNS caching or resolving
|
||||
names via another method such as `zeroconf`.
|
||||
|
||||
## Installation
|
||||
|
||||
Install this via pip (or your favourite package manager):
|
||||
|
||||
`pip install aiohappyeyeballs`
|
||||
|
||||
## License
|
||||
|
||||
[aiohappyeyeballs is licensed under the same terms as cpython itself.](https://github.com/python/cpython/blob/main/LICENSE)
|
||||
|
||||
## Example usage
|
||||
|
||||
```python
|
||||
|
||||
addr_infos = await loop.getaddrinfo("example.org", 80)
|
||||
|
||||
socket = await start_connection(addr_infos)
|
||||
socket = await start_connection(addr_infos, local_addr_infos=local_addr_infos, happy_eyeballs_delay=0.2)
|
||||
|
||||
transport, protocol = await loop.create_connection(
|
||||
MyProtocol, sock=socket, ...)
|
||||
|
||||
# Remove the first address for each family from addr_info
|
||||
pop_addr_infos_interleave(addr_info, 1)
|
||||
|
||||
# Remove all matching address from addr_info
|
||||
remove_addr_infos(addr_info, "dead::beef::")
|
||||
|
||||
# Convert a local_addr to local_addr_infos
|
||||
local_addr_infos = addr_to_addr_infos(("127.0.0.1",0))
|
||||
```
|
||||
|
||||
## Credits
|
||||
|
||||
This package contains code from cpython and is licensed under the same terms as cpython itself.
|
||||
|
||||
This package was created with
|
||||
[Copier](https://copier.readthedocs.io/) and the
|
||||
[browniebroke/pypackage-template](https://github.com/browniebroke/pypackage-template)
|
||||
project template.
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,112 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: aiosignal
|
||||
Version: 1.4.0
|
||||
Summary: aiosignal: a list of registered asynchronous callbacks
|
||||
Home-page: https://github.com/aio-libs/aiosignal
|
||||
Maintainer: aiohttp team <team@aiohttp.org>
|
||||
Maintainer-email: team@aiohttp.org
|
||||
License: Apache 2.0
|
||||
Project-URL: Chat: Gitter, https://gitter.im/aio-libs/Lobby
|
||||
Project-URL: CI: GitHub Actions, https://github.com/aio-libs/aiosignal/actions
|
||||
Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/aiosignal
|
||||
Project-URL: Docs: RTD, https://docs.aiosignal.org
|
||||
Project-URL: GitHub: issues, https://github.com/aio-libs/aiosignal/issues
|
||||
Project-URL: GitHub: repo, https://github.com/aio-libs/aiosignal
|
||||
Classifier: License :: OSI Approved :: Apache Software License
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3 :: Only
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Operating System :: POSIX
|
||||
Classifier: Operating System :: MacOS :: MacOS X
|
||||
Classifier: Operating System :: Microsoft :: Windows
|
||||
Classifier: Framework :: AsyncIO
|
||||
Requires-Python: >=3.9
|
||||
Description-Content-Type: text/x-rst
|
||||
License-File: LICENSE
|
||||
Requires-Dist: frozenlist>=1.1.0
|
||||
Requires-Dist: typing-extensions>=4.2; python_version < "3.13"
|
||||
Dynamic: license-file
|
||||
|
||||
=========
|
||||
aiosignal
|
||||
=========
|
||||
|
||||
.. image:: https://github.com/aio-libs/aiosignal/workflows/CI/badge.svg
|
||||
:target: https://github.com/aio-libs/aiosignal/actions?query=workflow%3ACI
|
||||
:alt: GitHub status for master branch
|
||||
|
||||
.. image:: https://codecov.io/gh/aio-libs/aiosignal/branch/master/graph/badge.svg?flag=pytest
|
||||
:target: https://codecov.io/gh/aio-libs/aiosignal?flags[0]=pytest
|
||||
:alt: codecov.io status for master branch
|
||||
|
||||
.. image:: https://badge.fury.io/py/aiosignal.svg
|
||||
:target: https://pypi.org/project/aiosignal
|
||||
:alt: Latest PyPI package version
|
||||
|
||||
.. image:: https://readthedocs.org/projects/aiosignal/badge/?version=latest
|
||||
:target: https://aiosignal.readthedocs.io/
|
||||
:alt: Latest Read The Docs
|
||||
|
||||
.. image:: https://img.shields.io/discourse/topics?server=https%3A%2F%2Faio-libs.discourse.group%2F
|
||||
:target: https://aio-libs.discourse.group/
|
||||
:alt: Discourse group for io-libs
|
||||
|
||||
.. image:: https://badges.gitter.im/Join%20Chat.svg
|
||||
:target: https://gitter.im/aio-libs/Lobby
|
||||
:alt: Chat on Gitter
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
A project to manage callbacks in `asyncio` projects.
|
||||
|
||||
``Signal`` is a list of registered asynchronous callbacks.
|
||||
|
||||
The signal's life-cycle has two stages: after creation its content
|
||||
could be filled by using standard list operations: ``sig.append()``
|
||||
etc.
|
||||
|
||||
After you call ``sig.freeze()`` the signal is *frozen*: adding, removing
|
||||
and dropping callbacks is forbidden.
|
||||
|
||||
The only available operation is calling the previously registered
|
||||
callbacks by using ``await sig.send(data)``.
|
||||
|
||||
For concrete usage examples see the `Signals
|
||||
<https://docs.aiohttp.org/en/stable/web_advanced.html#aiohttp-web-signals>
|
||||
section of the `Web Server Advanced
|
||||
<https://docs.aiohttp.org/en/stable/web_advanced.html>` chapter of the `aiohttp
|
||||
documentation`_.
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
::
|
||||
|
||||
$ pip install aiosignal
|
||||
|
||||
|
||||
Documentation
|
||||
=============
|
||||
|
||||
https://aiosignal.readthedocs.io/
|
||||
|
||||
License
|
||||
=======
|
||||
|
||||
``aiosignal`` is offered under the Apache 2 license.
|
||||
|
||||
Source code
|
||||
===========
|
||||
|
||||
The project is hosted on GitHub_
|
||||
|
||||
Please file an issue in the `bug tracker
|
||||
<https://github.com/aio-libs/aiosignal/issues>`_ if you have found a bug
|
||||
or have some suggestions to improve the library.
|
||||
|
||||
.. _GitHub: https://github.com/aio-libs/aiosignal
|
||||
.. _aiohttp documentation: https://docs.aiohttp.org/
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,102 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: feedparser
|
||||
Version: 6.0.12
|
||||
Summary: Universal feed parser, handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds
|
||||
Home-page: https://github.com/kurtmckee/feedparser
|
||||
Download-URL: https://pypi.python.org/pypi/feedparser
|
||||
Author: Kurt McKee
|
||||
Author-email: contactme@kurtmckee.org
|
||||
License: BSD-2-Clause
|
||||
Keywords: atom,cdf,feed,parser,rdf,rss
|
||||
Platform: POSIX
|
||||
Platform: Windows
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: BSD License
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 3.6
|
||||
Classifier: Programming Language :: Python :: 3.7
|
||||
Classifier: Programming Language :: Python :: 3.8
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Classifier: Topic :: Text Processing :: Markup :: XML
|
||||
Requires-Python: >=3.6
|
||||
Description-Content-Type: text/x-rst
|
||||
License-File: LICENSE
|
||||
Requires-Dist: sgmllib3k
|
||||
Dynamic: author
|
||||
Dynamic: author-email
|
||||
Dynamic: classifier
|
||||
Dynamic: description
|
||||
Dynamic: description-content-type
|
||||
Dynamic: download-url
|
||||
Dynamic: home-page
|
||||
Dynamic: keywords
|
||||
Dynamic: license
|
||||
Dynamic: license-file
|
||||
Dynamic: platform
|
||||
Dynamic: requires-dist
|
||||
Dynamic: requires-python
|
||||
Dynamic: summary
|
||||
|
||||
..
|
||||
This file is part of feedparser.
|
||||
Copyright 2010-2025 Kurt McKee <contactme@kurtmckee.org>
|
||||
Copyright 2002-2008 Mark Pilgrim
|
||||
Released under the BSD 2-clause license.
|
||||
|
||||
|
||||
feedparser
|
||||
##########
|
||||
|
||||
Parse Atom and RSS feeds in Python.
|
||||
|
||||
----
|
||||
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
feedparser can be installed by running pip:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ pip install feedparser
|
||||
|
||||
|
||||
Documentation
|
||||
=============
|
||||
|
||||
The feedparser documentation is available on the web at:
|
||||
|
||||
https://feedparser.readthedocs.io/en/latest/
|
||||
|
||||
It is also included in its source format, ReST, in the ``docs/`` directory.
|
||||
To build the documentation you'll need the Sphinx package, which is available at:
|
||||
|
||||
https://www.sphinx-doc.org/
|
||||
|
||||
You can then build HTML pages using a command similar to:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ sphinx-build -b html docs/ fpdocs
|
||||
|
||||
This will produce HTML documentation in the ``fpdocs/`` directory.
|
||||
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
Feedparser has an extensive test suite, powered by tox. To run it, type this:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ python -m venv venv
|
||||
$ source venv/bin/activate # or "venv\bin\activate.ps1" on Windows
|
||||
(venv) $ pip install -r requirements-dev.txt
|
||||
(venv) $ tox
|
||||
|
||||
This will spawn an HTTP server that will listen on port 8097. The tests will
|
||||
fail if that port is in use.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,209 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: idna
|
||||
Version: 3.11
|
||||
Summary: Internationalized Domain Names in Applications (IDNA)
|
||||
Author-email: Kim Davies <kim+pypi@gumleaf.org>
|
||||
Requires-Python: >=3.8
|
||||
Description-Content-Type: text/x-rst
|
||||
License-Expression: BSD-3-Clause
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: Intended Audience :: System Administrators
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3 :: Only
|
||||
Classifier: Programming Language :: Python :: 3.8
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Programming Language :: Python :: 3.14
|
||||
Classifier: Programming Language :: Python :: Implementation :: CPython
|
||||
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
||||
Classifier: Topic :: Internet :: Name Service (DNS)
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Classifier: Topic :: Utilities
|
||||
License-File: LICENSE.md
|
||||
Requires-Dist: ruff >= 0.6.2 ; extra == "all"
|
||||
Requires-Dist: mypy >= 1.11.2 ; extra == "all"
|
||||
Requires-Dist: pytest >= 8.3.2 ; extra == "all"
|
||||
Requires-Dist: flake8 >= 7.1.1 ; extra == "all"
|
||||
Project-URL: Changelog, https://github.com/kjd/idna/blob/master/HISTORY.rst
|
||||
Project-URL: Issue tracker, https://github.com/kjd/idna/issues
|
||||
Project-URL: Source, https://github.com/kjd/idna
|
||||
Provides-Extra: all
|
||||
|
||||
Internationalized Domain Names in Applications (IDNA)
|
||||
=====================================================
|
||||
|
||||
Support for `Internationalized Domain Names in
|
||||
Applications (IDNA) <https://tools.ietf.org/html/rfc5891>`_
|
||||
and `Unicode IDNA Compatibility Processing
|
||||
<https://unicode.org/reports/tr46/>`_.
|
||||
|
||||
The latest versions of these standards supplied here provide
|
||||
more comprehensive language coverage and reduce the potential of
|
||||
allowing domains with known security vulnerabilities. This library
|
||||
is a suitable replacement for the “encodings.idna”
|
||||
module that comes with the Python standard library, but which
|
||||
only supports an older superseded IDNA specification from 2003.
|
||||
|
||||
Basic functions are simply executed:
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> import idna
|
||||
>>> idna.encode('ドメイン.テスト')
|
||||
b'xn--eckwd4c7c.xn--zckzah'
|
||||
>>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
|
||||
ドメイン.テスト
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
This package is available for installation from PyPI via the
|
||||
typical mechanisms, such as:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ python3 -m pip install idna
|
||||
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
For typical usage, the ``encode`` and ``decode`` functions will take a
|
||||
domain name argument and perform a conversion to ASCII compatible encoding
|
||||
(known as A-labels), or to Unicode strings (known as U-labels)
|
||||
respectively.
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> import idna
|
||||
>>> idna.encode('ドメイン.テスト')
|
||||
b'xn--eckwd4c7c.xn--zckzah'
|
||||
>>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
|
||||
ドメイン.テスト
|
||||
|
||||
Conversions can be applied at a per-label basis using the ``ulabel`` or
|
||||
``alabel`` functions if necessary:
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> idna.alabel('测试')
|
||||
b'xn--0zwm56d'
|
||||
|
||||
|
||||
Compatibility Mapping (UTS #46)
|
||||
+++++++++++++++++++++++++++++++
|
||||
|
||||
This library provides support for `Unicode IDNA Compatibility
|
||||
Processing <https://unicode.org/reports/tr46/>`_ which normalizes input from
|
||||
different potential ways a user may input a domain prior to performing the IDNA
|
||||
conversion operations. This functionality, known as a
|
||||
`mapping <https://tools.ietf.org/html/rfc5895>`_, is considered by the
|
||||
specification to be a local user-interface issue distinct from IDNA
|
||||
conversion functionality.
|
||||
|
||||
For example, “Königsgäßchen” is not a permissible label as *LATIN
|
||||
CAPITAL LETTER K* is not allowed (nor are capital letters in general).
|
||||
UTS 46 will convert this into lower case prior to applying the IDNA
|
||||
conversion.
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> import idna
|
||||
>>> idna.encode('Königsgäßchen')
|
||||
...
|
||||
idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed
|
||||
>>> idna.encode('Königsgäßchen', uts46=True)
|
||||
b'xn--knigsgchen-b4a3dun'
|
||||
>>> print(idna.decode('xn--knigsgchen-b4a3dun'))
|
||||
königsgäßchen
|
||||
|
||||
|
||||
Exceptions
|
||||
----------
|
||||
|
||||
All errors raised during the conversion following the specification
|
||||
should raise an exception derived from the ``idna.IDNAError`` base
|
||||
class.
|
||||
|
||||
More specific exceptions that may be generated as ``idna.IDNABidiError``
|
||||
when the error reflects an illegal combination of left-to-right and
|
||||
right-to-left characters in a label; ``idna.InvalidCodepoint`` when
|
||||
a specific codepoint is an illegal character in an IDN label (i.e.
|
||||
INVALID); and ``idna.InvalidCodepointContext`` when the codepoint is
|
||||
illegal based on its position in the string (i.e. it is CONTEXTO or CONTEXTJ
|
||||
but the contextual requirements are not satisfied.)
|
||||
|
||||
Building and Diagnostics
|
||||
------------------------
|
||||
|
||||
The IDNA and UTS 46 functionality relies upon pre-calculated lookup
|
||||
tables for performance. These tables are derived from computing against
|
||||
eligibility criteria in the respective standards using the command-line
|
||||
script ``tools/idna-data``.
|
||||
|
||||
This tool will fetch relevant codepoint data from the Unicode repository
|
||||
and perform the required calculations to identify eligibility. There are
|
||||
three main modes:
|
||||
|
||||
* ``idna-data make-libdata``. Generates ``idnadata.py`` and
|
||||
``uts46data.py``, the pre-calculated lookup tables used for IDNA and
|
||||
UTS 46 conversions. Implementers who wish to track this library against
|
||||
a different Unicode version may use this tool to manually generate a
|
||||
different version of the ``idnadata.py`` and ``uts46data.py`` files.
|
||||
|
||||
* ``idna-data make-table``. Generate a table of the IDNA disposition
|
||||
(e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix
|
||||
B.1 of RFC 5892 and the pre-computed tables published by `IANA
|
||||
<https://www.iana.org/>`_.
|
||||
|
||||
* ``idna-data U+0061``. Prints debugging output on the various
|
||||
properties associated with an individual Unicode codepoint (in this
|
||||
case, U+0061), that are used to assess the IDNA and UTS 46 status of a
|
||||
codepoint. This is helpful in debugging or analysis.
|
||||
|
||||
The tool accepts a number of arguments, described using ``idna-data
|
||||
-h``. Most notably, the ``--version`` argument allows the specification
|
||||
of the version of Unicode to be used in computing the table data. For
|
||||
example, ``idna-data --version 9.0.0 make-libdata`` will generate
|
||||
library data against Unicode 9.0.0.
|
||||
|
||||
|
||||
Additional Notes
|
||||
----------------
|
||||
|
||||
* **Packages**. The latest tagged release version is published in the
|
||||
`Python Package Index <https://pypi.org/project/idna/>`_.
|
||||
|
||||
* **Version support**. This library supports Python 3.8 and higher.
|
||||
As this library serves as a low-level toolkit for a variety of
|
||||
applications, many of which strive for broad compatibility with older
|
||||
Python versions, there is no rush to remove older interpreter support.
|
||||
Support for older versions are likely to be removed from new releases
|
||||
as automated tests can no longer easily be run, i.e. once the Python
|
||||
version is officially end-of-life.
|
||||
|
||||
* **Testing**. The library has a test suite based on each rule of the
|
||||
IDNA specification, as well as tests that are provided as part of the
|
||||
Unicode Technical Standard 46, `Unicode IDNA Compatibility Processing
|
||||
<https://unicode.org/reports/tr46/>`_.
|
||||
|
||||
* **Emoji**. It is an occasional request to support emoji domains in
|
||||
this library. Encoding of symbols like emoji is expressly prohibited by
|
||||
the technical standard IDNA 2008 and emoji domains are broadly phased
|
||||
out across the domain industry due to associated security risks. For
|
||||
now, applications that need to support these non-compliant labels
|
||||
may wish to consider trying the encode/decode operation in this library
|
||||
first, and then falling back to using `encodings.idna`. See `the Github
|
||||
project <https://github.com/kjd/idna/issues/18>`_ for more discussion.
|
||||
|
||||
* **Transitional processing**. Unicode 16.0.0 removed transitional
|
||||
processing so the `transitional` argument for the encode() method
|
||||
no longer has any effect and will be removed at a later date.
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,166 @@
|
||||
Metadata-Version: 2.1
|
||||
Name: disnake
|
||||
Version: 2.11.0
|
||||
Summary: A Python wrapper for the Discord API
|
||||
Author: Disnake Development
|
||||
License: MIT
|
||||
Project-URL: Changelog, https://docs.disnake.dev/page/whats_new.html
|
||||
Project-URL: Documentation, https://docs.disnake.dev/
|
||||
Project-URL: Repository, https://github.com/DisnakeDev/disnake
|
||||
Keywords: disnake,discord,discord api
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: License :: OSI Approved :: MIT License
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: Natural Language :: English
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python :: 3.8
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Topic :: Internet
|
||||
Classifier: Topic :: Software Development :: Libraries
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Classifier: Topic :: Utilities
|
||||
Classifier: Typing :: Typed
|
||||
Requires-Python: >=3.8
|
||||
Description-Content-Type: text/markdown
|
||||
License-File: LICENSE
|
||||
Requires-Dist: aiohttp <4.0,>=3.7.0
|
||||
Requires-Dist: typing-extensions >=4.1
|
||||
Provides-Extra: docs
|
||||
Requires-Dist: sphinx ==7.0.1 ; extra == 'docs'
|
||||
Requires-Dist: sphinxcontrib-trio ~=1.1.2 ; extra == 'docs'
|
||||
Requires-Dist: sphinx-hoverxref ==1.3.0 ; extra == 'docs'
|
||||
Requires-Dist: sphinx-autobuild ~=2021.3 ; extra == 'docs'
|
||||
Requires-Dist: sphinxcontrib-towncrier ==0.3.2a0 ; extra == 'docs'
|
||||
Requires-Dist: towncrier ==23.6.0 ; extra == 'docs'
|
||||
Requires-Dist: sphinx-notfound-page ==0.8.3 ; extra == 'docs'
|
||||
Requires-Dist: sphinxext-opengraph ==0.9.1 ; extra == 'docs'
|
||||
Provides-Extra: speed
|
||||
Requires-Dist: orjson ~=3.6 ; extra == 'speed'
|
||||
Requires-Dist: aiodns >=1.1 ; extra == 'speed'
|
||||
Requires-Dist: Brotli ; extra == 'speed'
|
||||
Requires-Dist: cchardet ; (python_version < "3.10") and extra == 'speed'
|
||||
Provides-Extra: voice
|
||||
Requires-Dist: PyNaCl <1.6,>=1.5.0 ; extra == 'voice'
|
||||
Requires-Dist: audioop-lts ==0.2.1 ; (python_version >= "3.13") and extra == 'voice'
|
||||
|
||||
<!-- SPDX-License-Identifier: MIT -->
|
||||
|
||||
[](https://disnake.dev/)
|
||||
|
||||
disnake
|
||||
=======
|
||||
<p align="center">
|
||||
<img src="https://img.shields.io/github/actions/workflow/status/DisnakeDev/disnake/lint-test.yml?branch=master&style=flat-square"></img>
|
||||
<a href="https://discord.gg/disnake"><img src="https://img.shields.io/discord/808030843078836254?style=flat-square&color=5865f2&logo=discord&logoColor=ffffff&label=discord" alt="Discord server invite" /></a>
|
||||
<a href="https://pypi.org/project/disnake/"><img src="https://img.shields.io/pypi/v/disnake.svg?style=flat-square" alt="PyPI version info" /></a>
|
||||
<a href="https://pypi.org/project/disnake/"><img src="https://img.shields.io/pypi/pyversions/disnake.svg?style=flat-square" alt="PyPI supported Python versions" /></a>
|
||||
<a href="https://github.com/DisnakeDev/disnake/commits"><img src="https://img.shields.io/github/commit-activity/w/DisnakeDev/disnake.svg?style=flat-square" alt="Commit activity" /></a>
|
||||
</p>
|
||||
|
||||
A modern, easy to use, feature-rich, and async-ready API wrapper for Discord written in Python.
|
||||
|
||||
Key Features
|
||||
------------
|
||||
|
||||
- Proper rate limit handling.
|
||||
- Type-safety measures.
|
||||
- [FastAPI](https://fastapi.tiangolo.com/)-like slash command syntax.
|
||||
|
||||
<sup>The syntax and structure of `discord.py 2.0` is preserved.</sup>
|
||||
|
||||
Installing
|
||||
----------
|
||||
|
||||
**Python 3.8 or higher is required.**
|
||||
|
||||
To install the library without full voice support, you can just run the
|
||||
following command:
|
||||
|
||||
``` sh
|
||||
# Linux/macOS
|
||||
python3 -m pip install -U disnake
|
||||
|
||||
# Windows
|
||||
py -3 -m pip install -U disnake
|
||||
```
|
||||
|
||||
Installing `disnake` with full voice support requires you to replace `disnake` here, with `disnake[voice]`. To learn more about voice support (or installing the development version), please visit [this section of our guide](https://guide.disnake.dev/prerequisites/installing-disnake/).
|
||||
|
||||
(You can optionally install [PyNaCl](https://pypi.org/project/PyNaCl/) for voice support.)
|
||||
|
||||
Note that voice support on Linux requires installation of `libffi-dev` and `python-dev` packages, via your preferred package manager (e.g. `apt`, `dnf`, etc.) before running the following commands.
|
||||
|
||||
Versioning
|
||||
----------
|
||||
|
||||
This project does **not** quite follow semantic versioning; for more details, see [version guarantees](https://docs.disnake.dev/en/latest/version_guarantees.html).
|
||||
|
||||
To be on the safe side and avoid unexpected breaking changes, pin the dependency to a minor version (e.g. `disnake==a.b.*` or `disnake~=a.b.c`) or an exact version (e.g. `disnake==a.b.c`).
|
||||
|
||||
Quick Example
|
||||
-------------
|
||||
|
||||
### Slash Commands Example
|
||||
|
||||
``` py
|
||||
import disnake
|
||||
from disnake.ext import commands
|
||||
|
||||
bot = commands.InteractionBot(test_guilds=[12345])
|
||||
|
||||
@bot.slash_command()
|
||||
async def ping(inter):
|
||||
await inter.response.send_message("Pong!")
|
||||
|
||||
bot.run("BOT_TOKEN")
|
||||
```
|
||||
|
||||
### Context Menus Example
|
||||
|
||||
``` py
|
||||
import disnake
|
||||
from disnake.ext import commands
|
||||
|
||||
bot = commands.InteractionBot(test_guilds=[12345])
|
||||
|
||||
@bot.user_command()
|
||||
async def avatar(inter, user):
|
||||
embed = disnake.Embed(title=str(user))
|
||||
embed.set_image(url=user.display_avatar.url)
|
||||
await inter.response.send_message(embed=embed)
|
||||
|
||||
bot.run("BOT_TOKEN")
|
||||
```
|
||||
|
||||
### Prefix Commands Example
|
||||
|
||||
``` py
|
||||
import disnake
|
||||
from disnake.ext import commands
|
||||
|
||||
bot = commands.Bot(command_prefix=commands.when_mentioned)
|
||||
|
||||
@bot.command()
|
||||
async def ping(ctx):
|
||||
await ctx.send("Pong!")
|
||||
|
||||
bot.run("BOT_TOKEN")
|
||||
```
|
||||
|
||||
You can find more examples in the [examples directory](https://github.com/DisnakeDev/disnake/tree/master/examples).
|
||||
|
||||
<br>
|
||||
<p align="center">
|
||||
<a href="https://docs.disnake.dev/">Documentation</a>
|
||||
⁕
|
||||
<a href="https://guide.disnake.dev/">Guide</a>
|
||||
⁕
|
||||
<a href="https://discord.gg/disnake">Discord Server</a>
|
||||
⁕
|
||||
<a href="https://discord.gg/discord-developers">Discord Developers</a>
|
||||
</p>
|
||||
<br>
|
||||
Binary file not shown.
@@ -0,0 +1,443 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: propcache
|
||||
Version: 0.4.1
|
||||
Summary: Accelerated property cache
|
||||
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
|
||||
Project-URL: Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org
|
||||
Project-URL: Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org
|
||||
Project-URL: CI: GitHub Workflows, https://github.com/aio-libs/propcache/actions?query=branch:master
|
||||
Project-URL: Code of Conduct, https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md
|
||||
Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/propcache
|
||||
Project-URL: Docs: Changelog, https://propcache.readthedocs.io/en/latest/changes/
|
||||
Project-URL: Docs: RTD, https://propcache.readthedocs.io
|
||||
Project-URL: GitHub: issues, https://github.com/aio-libs/propcache/issues
|
||||
Project-URL: GitHub: repo, https://github.com/aio-libs/propcache
|
||||
Keywords: cython,cext,propcache
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: Apache Software License
|
||||
Classifier: Programming Language :: Cython
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Programming Language :: Python :: 3.14
|
||||
Classifier: Topic :: Internet :: WWW/HTTP
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Requires-Python: >=3.9
|
||||
Description-Content-Type: text/x-rst
|
||||
License-File: LICENSE
|
||||
License-File: NOTICE
|
||||
Dynamic: license-file
|
||||
|
||||
propcache
|
||||
=========
|
||||
|
||||
The module provides a fast implementation of cached properties for Python 3.9+.
|
||||
|
||||
.. image:: https://github.com/aio-libs/propcache/actions/workflows/ci-cd.yml/badge.svg
|
||||
:target: https://github.com/aio-libs/propcache/actions?query=workflow%3ACI
|
||||
:align: right
|
||||
|
||||
.. image:: https://codecov.io/gh/aio-libs/propcache/branch/master/graph/badge.svg
|
||||
:target: https://codecov.io/gh/aio-libs/propcache
|
||||
|
||||
.. image:: https://badge.fury.io/py/propcache.svg
|
||||
:target: https://badge.fury.io/py/propcache
|
||||
|
||||
|
||||
.. image:: https://readthedocs.org/projects/propcache/badge/?version=latest
|
||||
:target: https://propcache.readthedocs.io
|
||||
|
||||
|
||||
.. image:: https://img.shields.io/pypi/pyversions/propcache.svg
|
||||
:target: https://pypi.python.org/pypi/propcache
|
||||
|
||||
.. 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
|
||||
:target: https://matrix.to/#/%23aio-libs:matrix.org
|
||||
:alt: Matrix Room — #aio-libs:matrix.org
|
||||
|
||||
.. 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
|
||||
:target: https://matrix.to/#/%23aio-libs-space:matrix.org
|
||||
:alt: Matrix Space — #aio-libs-space:matrix.org
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
The API is designed to be nearly identical to the built-in ``functools.cached_property`` class,
|
||||
except for the additional ``under_cached_property`` class which uses ``self._cache``
|
||||
instead of ``self.__dict__`` to store the cached values and prevents ``__set__`` from being called.
|
||||
|
||||
For full documentation please read https://propcache.readthedocs.io.
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
::
|
||||
|
||||
$ pip install propcache
|
||||
|
||||
The library is Python 3 only!
|
||||
|
||||
PyPI contains binary wheels for Linux, Windows and MacOS. If you want to install
|
||||
``propcache`` on another operating system where wheels are not provided,
|
||||
the the tarball will be used to compile the library from
|
||||
the source code. It requires a C compiler and and Python headers installed.
|
||||
|
||||
To skip the compilation you must explicitly opt-in by using a PEP 517
|
||||
configuration setting ``pure-python``, or setting the ``PROPCACHE_NO_EXTENSIONS``
|
||||
environment variable to a non-empty value, e.g.:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ pip install propcache --config-settings=pure-python=false
|
||||
|
||||
Please note that the pure-Python (uncompiled) version is much slower. However,
|
||||
PyPy always uses a pure-Python implementation, and, as such, it is unaffected
|
||||
by this variable.
|
||||
|
||||
|
||||
API documentation
|
||||
------------------
|
||||
|
||||
The documentation is located at https://propcache.readthedocs.io.
|
||||
|
||||
Source code
|
||||
-----------
|
||||
|
||||
The project is hosted on GitHub_
|
||||
|
||||
Please file an issue on the `bug tracker
|
||||
<https://github.com/aio-libs/propcache/issues>`_ if you have found a bug
|
||||
or have some suggestion in order to improve the library.
|
||||
|
||||
Discussion list
|
||||
---------------
|
||||
|
||||
*aio-libs* google group: https://groups.google.com/forum/#!forum/aio-libs
|
||||
|
||||
Feel free to post your questions and ideas here.
|
||||
|
||||
|
||||
Authors and License
|
||||
-------------------
|
||||
|
||||
The ``propcache`` package is derived from ``yarl`` which is written by Andrew Svetlov.
|
||||
|
||||
It's *Apache 2* licensed and freely available.
|
||||
|
||||
|
||||
.. _GitHub: https://github.com/aio-libs/propcache
|
||||
|
||||
=========
|
||||
Changelog
|
||||
=========
|
||||
|
||||
..
|
||||
You should *NOT* be adding new change log entries to this file, this
|
||||
file is managed by towncrier. You *may* edit previous change logs to
|
||||
fix problems like typo corrections or such.
|
||||
To add a new change log entry, please see
|
||||
https://pip.pypa.io/en/latest/development/#adding-a-news-entry
|
||||
we named the news folder "changes".
|
||||
|
||||
WARNING: Don't drop the next directive!
|
||||
|
||||
.. towncrier release notes start
|
||||
|
||||
0.4.1
|
||||
=====
|
||||
|
||||
*(2025-10-08)*
|
||||
|
||||
|
||||
Bug fixes
|
||||
---------
|
||||
|
||||
- Fixed reference leak caused by ``Py_INCREF`` because Cython has its own reference counter systems -- by `@Vizonex <https://github.com/sponsors/Vizonex>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#162 <https://github.com/aio-libs/propcache/issues/162>`__.
|
||||
|
||||
|
||||
Contributor-facing changes
|
||||
--------------------------
|
||||
|
||||
- Fixes the default value for the ``os``
|
||||
parameter in ``reusable-build-wheel.yml``
|
||||
to be ``ubuntu-latest`` instead of
|
||||
``ubuntu``.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#155 <https://github.com/aio-libs/propcache/issues/155>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
0.4.0
|
||||
=====
|
||||
|
||||
*(2025-10-04)*
|
||||
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
- Optimized propcache by replacing sentinel ``object`` for checking if
|
||||
the ``object`` is ``NULL`` and changed ``dict`` API for
|
||||
Python C-API -- by `@Vizonex <https://github.com/sponsors/Vizonex>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#121 <https://github.com/aio-libs/propcache/issues/121>`__.
|
||||
|
||||
|
||||
Contributor-facing changes
|
||||
--------------------------
|
||||
|
||||
- Builds have been added for arm64 Windows
|
||||
wheels and the ``reusable-build-wheel.yml``
|
||||
workflow has been modified to allow for
|
||||
an OS value (``windows-11-arm``) which
|
||||
does not include the ``-latest`` postfix
|
||||
-- by `@finnagin <https://github.com/sponsors/finnagin>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#133 <https://github.com/aio-libs/propcache/issues/133>`__.
|
||||
|
||||
- Added CI for CPython 3.14 -- by `@kumaraditya303 <https://github.com/sponsors/kumaraditya303>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#140 <https://github.com/aio-libs/propcache/issues/140>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
0.3.2
|
||||
=====
|
||||
|
||||
*(2025-06-09)*
|
||||
|
||||
|
||||
Improved documentation
|
||||
----------------------
|
||||
|
||||
- Fixed incorrect decorator usage in the ``~propcache.api.under_cached_property`` example code -- by `@meanmail <https://github.com/sponsors/meanmail>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#109 <https://github.com/aio-libs/propcache/issues/109>`__.
|
||||
|
||||
|
||||
Packaging updates and notes for downstreams
|
||||
-------------------------------------------
|
||||
|
||||
- Updated to use Cython 3.1 universally across the build path -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#117 <https://github.com/aio-libs/propcache/issues/117>`__.
|
||||
|
||||
- Made Cython line tracing opt-in via the ``with-cython-tracing`` build config setting -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
Previously, line tracing was enabled by default in ``pyproject.toml``, which caused build issues for some users and made wheels nearly twice as slow.
|
||||
|
||||
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.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#118 <https://github.com/aio-libs/propcache/issues/118>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
0.3.1
|
||||
=====
|
||||
|
||||
*(2025-03-25)*
|
||||
|
||||
|
||||
Bug fixes
|
||||
---------
|
||||
|
||||
- Improved typing annotations, fixing some type errors under correct usage
|
||||
and improving typing robustness generally -- by `@Dreamsorcerer <https://github.com/sponsors/Dreamsorcerer>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#103 <https://github.com/aio-libs/propcache/issues/103>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
0.3.0
|
||||
=====
|
||||
|
||||
*(2025-02-20)*
|
||||
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
- Implemented support for the free-threaded build of CPython 3.13 -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#84 <https://github.com/aio-libs/propcache/issues/84>`__.
|
||||
|
||||
|
||||
Packaging updates and notes for downstreams
|
||||
-------------------------------------------
|
||||
|
||||
- Started building wheels for the free-threaded build of CPython 3.13 -- by `@lysnikolaou <https://github.com/sponsors/lysnikolaou>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#84 <https://github.com/aio-libs/propcache/issues/84>`__.
|
||||
|
||||
|
||||
Contributor-facing changes
|
||||
--------------------------
|
||||
|
||||
- GitHub Actions CI/CD is now configured to manage caching pip-ecosystem
|
||||
dependencies using `re-actors/cache-python-deps`_ -- an action by
|
||||
`@webknjaz <https://github.com/sponsors/webknjaz>`__ that takes into account ABI stability and the exact
|
||||
version of Python runtime.
|
||||
|
||||
.. _`re-actors/cache-python-deps`:
|
||||
https://github.com/marketplace/actions/cache-python-deps
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#93 <https://github.com/aio-libs/propcache/issues/93>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
0.2.1
|
||||
=====
|
||||
|
||||
*(2024-12-01)*
|
||||
|
||||
|
||||
Bug fixes
|
||||
---------
|
||||
|
||||
- Stopped implicitly allowing the use of Cython pre-release versions when
|
||||
building the distribution package -- by `@ajsanchezsanz <https://github.com/sponsors/ajsanchezsanz>`__ and
|
||||
`@markgreene74 <https://github.com/sponsors/markgreene74>`__.
|
||||
|
||||
*Related commits on GitHub:*
|
||||
`64df0a6 <https://github.com/aio-libs/propcache/commit/64df0a6>`__.
|
||||
|
||||
- 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>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#72 <https://github.com/aio-libs/propcache/issues/72>`__.
|
||||
|
||||
|
||||
Removals and backward incompatible breaking changes
|
||||
---------------------------------------------------
|
||||
|
||||
- Removed support for Python 3.8 as it has reached end of life -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#57 <https://github.com/aio-libs/propcache/issues/57>`__.
|
||||
|
||||
|
||||
Packaging updates and notes for downstreams
|
||||
-------------------------------------------
|
||||
|
||||
- Stopped implicitly allowing the use of Cython pre-release versions when
|
||||
building the distribution package -- by `@ajsanchezsanz <https://github.com/sponsors/ajsanchezsanz>`__ and
|
||||
`@markgreene74 <https://github.com/sponsors/markgreene74>`__.
|
||||
|
||||
*Related commits on GitHub:*
|
||||
`64df0a6 <https://github.com/aio-libs/propcache/commit/64df0a6>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
0.2.0
|
||||
=====
|
||||
|
||||
*(2024-10-07)*
|
||||
|
||||
|
||||
Bug fixes
|
||||
---------
|
||||
|
||||
- Fixed loading the C-extensions on Python 3.8 -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#26 <https://github.com/aio-libs/propcache/issues/26>`__.
|
||||
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
- Improved typing for the ``propcache.api.under_cached_property`` decorator -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#38 <https://github.com/aio-libs/propcache/issues/38>`__.
|
||||
|
||||
|
||||
Improved documentation
|
||||
----------------------
|
||||
|
||||
- Added API documentation for the ``propcache.api.cached_property`` and ``propcache.api.under_cached_property`` decorators -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#16 <https://github.com/aio-libs/propcache/issues/16>`__.
|
||||
|
||||
|
||||
Packaging updates and notes for downstreams
|
||||
-------------------------------------------
|
||||
|
||||
- Moved ``propcache.api.under_cached_property`` and ``propcache.api.cached_property`` to `propcache.api` -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
Both decorators remain importable from the top-level package, however importing from `propcache.api` is now the recommended way to use them.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#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>`__.
|
||||
|
||||
- Converted project to use a src layout -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#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>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
0.1.0
|
||||
=====
|
||||
|
||||
*(2024-10-03)*
|
||||
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
- Added ``armv7l`` wheels -- by `@bdraco <https://github.com/sponsors/bdraco>`__.
|
||||
|
||||
*Related issues and pull requests on GitHub:*
|
||||
`#5 <https://github.com/aio-libs/propcache/issues/5>`__.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
0.0.0
|
||||
=====
|
||||
|
||||
*(2024-10-02)*
|
||||
|
||||
|
||||
- Initial release.
|
||||
Binary file not shown.
@@ -0,0 +1,235 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: attrs
|
||||
Version: 25.4.0
|
||||
Summary: Classes Without Boilerplate
|
||||
Project-URL: Documentation, https://www.attrs.org/
|
||||
Project-URL: Changelog, https://www.attrs.org/en/stable/changelog.html
|
||||
Project-URL: GitHub, https://github.com/python-attrs/attrs
|
||||
Project-URL: Funding, https://github.com/sponsors/hynek
|
||||
Project-URL: Tidelift, https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=pypi
|
||||
Author-email: Hynek Schlawack <hs@ox.cx>
|
||||
License-Expression: MIT
|
||||
License-File: LICENSE
|
||||
Keywords: attribute,boilerplate,class
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Programming Language :: Python :: 3.14
|
||||
Classifier: Programming Language :: Python :: Implementation :: CPython
|
||||
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
||||
Classifier: Typing :: Typed
|
||||
Requires-Python: >=3.9
|
||||
Description-Content-Type: text/markdown
|
||||
|
||||
<p align="center">
|
||||
<a href="https://www.attrs.org/">
|
||||
<img src="https://raw.githubusercontent.com/python-attrs/attrs/main/docs/_static/attrs_logo.svg" width="35%" alt="attrs" />
|
||||
</a>
|
||||
</p>
|
||||
|
||||
|
||||
*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)).
|
||||
Trusted by NASA for [Mars missions since 2020](https://github.com/readme/featured/nasa-ingenuity-helicopter)!
|
||||
|
||||
Its main goal is to help you to write **concise** and **correct** software without slowing down your code.
|
||||
|
||||
|
||||
## Sponsors
|
||||
|
||||
*attrs* would not be possible without our [amazing sponsors](https://github.com/sponsors/hynek).
|
||||
Especially those generously supporting us at the *The Organization* tier and higher:
|
||||
|
||||
<!-- sponsor-break-begin -->
|
||||
|
||||
<p align="center">
|
||||
|
||||
<!-- [[[cog
|
||||
import pathlib, tomllib
|
||||
|
||||
for sponsor in tomllib.loads(pathlib.Path("pyproject.toml").read_text())["tool"]["sponcon"]["sponsors"]:
|
||||
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>')
|
||||
]]] -->
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<a href="https://filepreviews.io/"><img title="FilePreviews" src="https://www.attrs.org/en/25.4.0/_static/sponsors/FilePreviews.svg" width="190" /></a>
|
||||
<a href="https://polar.sh/"><img title="Polar" src="https://www.attrs.org/en/25.4.0/_static/sponsors/Polar.svg" width="190" /></a>
|
||||
<!-- [[[end]]] -->
|
||||
|
||||
</p>
|
||||
|
||||
<!-- sponsor-break-end -->
|
||||
|
||||
<p align="center">
|
||||
<strong>Please consider <a href="https://github.com/sponsors/hynek">joining them</a> to help make <em>attrs</em>’s maintenance more sustainable!</strong>
|
||||
</p>
|
||||
|
||||
<!-- teaser-end -->
|
||||
|
||||
## Example
|
||||
|
||||
*attrs* gives you a class decorator and a way to declaratively define the attributes on that class:
|
||||
|
||||
<!-- code-begin -->
|
||||
|
||||
```pycon
|
||||
>>> from attrs import asdict, define, make_class, Factory
|
||||
|
||||
>>> @define
|
||||
... class SomeClass:
|
||||
... a_number: int = 42
|
||||
... list_of_numbers: list[int] = Factory(list)
|
||||
...
|
||||
... def hard_math(self, another_number):
|
||||
... return self.a_number + sum(self.list_of_numbers) * another_number
|
||||
|
||||
|
||||
>>> sc = SomeClass(1, [1, 2, 3])
|
||||
>>> sc
|
||||
SomeClass(a_number=1, list_of_numbers=[1, 2, 3])
|
||||
|
||||
>>> sc.hard_math(3)
|
||||
19
|
||||
>>> sc == SomeClass(1, [1, 2, 3])
|
||||
True
|
||||
>>> sc != SomeClass(2, [3, 2, 1])
|
||||
True
|
||||
|
||||
>>> asdict(sc)
|
||||
{'a_number': 1, 'list_of_numbers': [1, 2, 3]}
|
||||
|
||||
>>> SomeClass()
|
||||
SomeClass(a_number=42, list_of_numbers=[])
|
||||
|
||||
>>> C = make_class("C", ["a", "b"])
|
||||
>>> C("foo", "bar")
|
||||
C(a='foo', b='bar')
|
||||
```
|
||||
|
||||
After *declaring* your attributes, *attrs* gives you:
|
||||
|
||||
- a concise and explicit overview of the class's attributes,
|
||||
- a nice human-readable `__repr__`,
|
||||
- equality-checking methods,
|
||||
- an initializer,
|
||||
- and much more,
|
||||
|
||||
*without* writing dull boilerplate code again and again and *without* runtime performance penalties.
|
||||
|
||||
---
|
||||
|
||||
This 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.
|
||||
The classic APIs (`@attr.s`, `attr.ib`, plus their serious-business aliases) and the `attr` package import name will remain **indefinitely**.
|
||||
|
||||
Check out [*On The Core API Names*](https://www.attrs.org/en/latest/names.html) for an in-depth explanation!
|
||||
|
||||
|
||||
### Hate Type Annotations!?
|
||||
|
||||
No problem!
|
||||
Types are entirely **optional** with *attrs*.
|
||||
Simply assign `attrs.field()` to the attributes instead of annotating them with types:
|
||||
|
||||
```python
|
||||
from attrs import define, field
|
||||
|
||||
@define
|
||||
class SomeClass:
|
||||
a_number = field(default=42)
|
||||
list_of_numbers = field(factory=list)
|
||||
```
|
||||
|
||||
|
||||
## Data Classes
|
||||
|
||||
On the tin, *attrs* might remind you of `dataclasses` (and indeed, `dataclasses` [are a descendant](https://hynek.me/articles/import-attrs/) of *attrs*).
|
||||
In practice it does a lot more and is more flexible.
|
||||
For 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.
|
||||
|
||||
For 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.
|
||||
|
||||
|
||||
## Project Information
|
||||
|
||||
- [**Changelog**](https://www.attrs.org/en/stable/changelog.html)
|
||||
- [**Documentation**](https://www.attrs.org/)
|
||||
- [**PyPI**](https://pypi.org/project/attrs/)
|
||||
- [**Source Code**](https://github.com/python-attrs/attrs)
|
||||
- [**Contributing**](https://github.com/python-attrs/attrs/blob/main/.github/CONTRIBUTING.md)
|
||||
- [**Third-party Extensions**](https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs)
|
||||
- **Get Help**: use the `python-attrs` tag on [Stack Overflow](https://stackoverflow.com/questions/tagged/python-attrs)
|
||||
|
||||
|
||||
### *attrs* for Enterprise
|
||||
|
||||
Available as part of the [Tidelift Subscription](https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek).
|
||||
|
||||
The 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.
|
||||
Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.
|
||||
|
||||
## Release Information
|
||||
|
||||
### Backwards-incompatible Changes
|
||||
|
||||
- Class-level `kw_only=True` behavior is now consistent with `dataclasses`.
|
||||
|
||||
Previously, a class that sets `kw_only=True` makes all attributes keyword-only, including those from base classes.
|
||||
If an attribute sets `kw_only=False`, that setting is ignored, and it is still made keyword-only.
|
||||
|
||||
Now, only the attributes defined in that class that doesn't explicitly set `kw_only=False` are made keyword-only.
|
||||
|
||||
This shouldn't be a problem for most users, unless you have a pattern like this:
|
||||
|
||||
```python
|
||||
@attrs.define(kw_only=True)
|
||||
class Base:
|
||||
a: int
|
||||
b: int = attrs.field(default=1, kw_only=False)
|
||||
|
||||
@attrs.define
|
||||
class Subclass(Base):
|
||||
c: int
|
||||
```
|
||||
|
||||
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`).
|
||||
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.
|
||||
[#1457](https://github.com/python-attrs/attrs/issues/1457)
|
||||
|
||||
|
||||
### Changes
|
||||
|
||||
- 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).
|
||||
[#1427](https://github.com/python-attrs/attrs/issues/1427)
|
||||
- Added support for Python 3.14 and [PEP 749](https://peps.python.org/pep-0749/).
|
||||
[#1446](https://github.com/python-attrs/attrs/issues/1446),
|
||||
[#1451](https://github.com/python-attrs/attrs/issues/1451)
|
||||
- `attrs.validators.deep_mapping()` now allows to leave out either *key_validator* xor *value_validator*.
|
||||
[#1448](https://github.com/python-attrs/attrs/issues/1448)
|
||||
- `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_()`.
|
||||
[#1449](https://github.com/python-attrs/attrs/issues/1449)
|
||||
- Added a new **experimental** way to inspect classes:
|
||||
|
||||
`attrs.inspect(cls)` returns the _effective_ class-wide parameters that were used by *attrs* to construct the class.
|
||||
|
||||
The returned class is the same data structure that *attrs* uses internally to decide how to construct the final class.
|
||||
[#1454](https://github.com/python-attrs/attrs/issues/1454)
|
||||
- Fixed annotations for `attrs.field(converter=...)`.
|
||||
Previously, a `tuple` of converters was only accepted if it had exactly one element.
|
||||
[#1461](https://github.com/python-attrs/attrs/issues/1461)
|
||||
- The performance of `attrs.asdict()` has been improved by 45–260%.
|
||||
[#1463](https://github.com/python-attrs/attrs/issues/1463)
|
||||
- The performance of `attrs.astuple()` has been improved by 49–270%.
|
||||
[#1469](https://github.com/python-attrs/attrs/issues/1469)
|
||||
- The type annotation for `attrs.validators.or_()` now allows for different types of validators.
|
||||
|
||||
This was only an issue on Pyright.
|
||||
[#1474](https://github.com/python-attrs/attrs/issues/1474)
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
[Full changelog →](https://www.attrs.org/en/stable/changelog.html)
|
||||
Reference in New Issue
Block a user