mirror of
https://gitlab.com/MoonTestUse1/AdministrationItDepartmens.git
synced 2025-08-14 00:25:46 +02:00
Проверка 09.02.2025
This commit is contained in:
Binary file not shown.
@@ -1 +0,0 @@
|
||||
pip
|
@@ -1,19 +0,0 @@
|
||||
Copyright 2005-2024 SQLAlchemy authors and contributors <see AUTHORS file>.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
@@ -1,242 +0,0 @@
|
||||
Metadata-Version: 2.1
|
||||
Name: SQLAlchemy
|
||||
Version: 2.0.27
|
||||
Summary: Database Abstraction Library
|
||||
Home-page: https://www.sqlalchemy.org
|
||||
Author: Mike Bayer
|
||||
Author-email: mike_mp@zzzcomputing.com
|
||||
License: MIT
|
||||
Project-URL: Documentation, https://docs.sqlalchemy.org
|
||||
Project-URL: Issue Tracker, https://github.com/sqlalchemy/sqlalchemy/
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: MIT License
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
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 :: Implementation :: CPython
|
||||
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
||||
Classifier: Topic :: Database :: Front-Ends
|
||||
Requires-Python: >=3.7
|
||||
Description-Content-Type: text/x-rst
|
||||
License-File: LICENSE
|
||||
Requires-Dist: typing-extensions >=4.6.0
|
||||
Requires-Dist: greenlet !=0.4.17 ; platform_machine == "aarch64" or (platform_machine == "ppc64le" or (platform_machine == "x86_64" or (platform_machine == "amd64" or (platform_machine == "AMD64" or (platform_machine == "win32" or platform_machine == "WIN32")))))
|
||||
Requires-Dist: importlib-metadata ; python_version < "3.8"
|
||||
Provides-Extra: aiomysql
|
||||
Requires-Dist: greenlet !=0.4.17 ; extra == 'aiomysql'
|
||||
Requires-Dist: aiomysql >=0.2.0 ; extra == 'aiomysql'
|
||||
Provides-Extra: aioodbc
|
||||
Requires-Dist: greenlet !=0.4.17 ; extra == 'aioodbc'
|
||||
Requires-Dist: aioodbc ; extra == 'aioodbc'
|
||||
Provides-Extra: aiosqlite
|
||||
Requires-Dist: greenlet !=0.4.17 ; extra == 'aiosqlite'
|
||||
Requires-Dist: aiosqlite ; extra == 'aiosqlite'
|
||||
Requires-Dist: typing-extensions !=3.10.0.1 ; extra == 'aiosqlite'
|
||||
Provides-Extra: asyncio
|
||||
Requires-Dist: greenlet !=0.4.17 ; extra == 'asyncio'
|
||||
Provides-Extra: asyncmy
|
||||
Requires-Dist: greenlet !=0.4.17 ; extra == 'asyncmy'
|
||||
Requires-Dist: asyncmy !=0.2.4,!=0.2.6,>=0.2.3 ; extra == 'asyncmy'
|
||||
Provides-Extra: mariadb_connector
|
||||
Requires-Dist: mariadb !=1.1.2,!=1.1.5,>=1.0.1 ; extra == 'mariadb_connector'
|
||||
Provides-Extra: mssql
|
||||
Requires-Dist: pyodbc ; extra == 'mssql'
|
||||
Provides-Extra: mssql_pymssql
|
||||
Requires-Dist: pymssql ; extra == 'mssql_pymssql'
|
||||
Provides-Extra: mssql_pyodbc
|
||||
Requires-Dist: pyodbc ; extra == 'mssql_pyodbc'
|
||||
Provides-Extra: mypy
|
||||
Requires-Dist: mypy >=0.910 ; extra == 'mypy'
|
||||
Provides-Extra: mysql
|
||||
Requires-Dist: mysqlclient >=1.4.0 ; extra == 'mysql'
|
||||
Provides-Extra: mysql_connector
|
||||
Requires-Dist: mysql-connector-python ; extra == 'mysql_connector'
|
||||
Provides-Extra: oracle
|
||||
Requires-Dist: cx-oracle >=8 ; extra == 'oracle'
|
||||
Provides-Extra: oracle_oracledb
|
||||
Requires-Dist: oracledb >=1.0.1 ; extra == 'oracle_oracledb'
|
||||
Provides-Extra: postgresql
|
||||
Requires-Dist: psycopg2 >=2.7 ; extra == 'postgresql'
|
||||
Provides-Extra: postgresql_asyncpg
|
||||
Requires-Dist: greenlet !=0.4.17 ; extra == 'postgresql_asyncpg'
|
||||
Requires-Dist: asyncpg ; extra == 'postgresql_asyncpg'
|
||||
Provides-Extra: postgresql_pg8000
|
||||
Requires-Dist: pg8000 >=1.29.1 ; extra == 'postgresql_pg8000'
|
||||
Provides-Extra: postgresql_psycopg
|
||||
Requires-Dist: psycopg >=3.0.7 ; extra == 'postgresql_psycopg'
|
||||
Provides-Extra: postgresql_psycopg2binary
|
||||
Requires-Dist: psycopg2-binary ; extra == 'postgresql_psycopg2binary'
|
||||
Provides-Extra: postgresql_psycopg2cffi
|
||||
Requires-Dist: psycopg2cffi ; extra == 'postgresql_psycopg2cffi'
|
||||
Provides-Extra: postgresql_psycopgbinary
|
||||
Requires-Dist: psycopg[binary] >=3.0.7 ; extra == 'postgresql_psycopgbinary'
|
||||
Provides-Extra: pymysql
|
||||
Requires-Dist: pymysql ; extra == 'pymysql'
|
||||
Provides-Extra: sqlcipher
|
||||
Requires-Dist: sqlcipher3-binary ; extra == 'sqlcipher'
|
||||
|
||||
SQLAlchemy
|
||||
==========
|
||||
|
||||
|PyPI| |Python| |Downloads|
|
||||
|
||||
.. |PyPI| image:: https://img.shields.io/pypi/v/sqlalchemy
|
||||
:target: https://pypi.org/project/sqlalchemy
|
||||
:alt: PyPI
|
||||
|
||||
.. |Python| image:: https://img.shields.io/pypi/pyversions/sqlalchemy
|
||||
:target: https://pypi.org/project/sqlalchemy
|
||||
:alt: PyPI - Python Version
|
||||
|
||||
.. |Downloads| image:: https://static.pepy.tech/badge/sqlalchemy/month
|
||||
:target: https://pepy.tech/project/sqlalchemy
|
||||
:alt: PyPI - Downloads
|
||||
|
||||
|
||||
The Python SQL Toolkit and Object Relational Mapper
|
||||
|
||||
Introduction
|
||||
-------------
|
||||
|
||||
SQLAlchemy is the Python SQL toolkit and Object Relational Mapper
|
||||
that gives application developers the full power and
|
||||
flexibility of SQL. SQLAlchemy provides a full suite
|
||||
of well known enterprise-level persistence patterns,
|
||||
designed for efficient and high-performing database
|
||||
access, adapted into a simple and Pythonic domain
|
||||
language.
|
||||
|
||||
Major SQLAlchemy features include:
|
||||
|
||||
* An industrial strength ORM, built
|
||||
from the core on the identity map, unit of work,
|
||||
and data mapper patterns. These patterns
|
||||
allow transparent persistence of objects
|
||||
using a declarative configuration system.
|
||||
Domain models
|
||||
can be constructed and manipulated naturally,
|
||||
and changes are synchronized with the
|
||||
current transaction automatically.
|
||||
* A relationally-oriented query system, exposing
|
||||
the full range of SQL's capabilities
|
||||
explicitly, including joins, subqueries,
|
||||
correlation, and most everything else,
|
||||
in terms of the object model.
|
||||
Writing queries with the ORM uses the same
|
||||
techniques of relational composition you use
|
||||
when writing SQL. While you can drop into
|
||||
literal SQL at any time, it's virtually never
|
||||
needed.
|
||||
* A comprehensive and flexible system
|
||||
of eager loading for related collections and objects.
|
||||
Collections are cached within a session,
|
||||
and can be loaded on individual access, all
|
||||
at once using joins, or by query per collection
|
||||
across the full result set.
|
||||
* A Core SQL construction system and DBAPI
|
||||
interaction layer. The SQLAlchemy Core is
|
||||
separate from the ORM and is a full database
|
||||
abstraction layer in its own right, and includes
|
||||
an extensible Python-based SQL expression
|
||||
language, schema metadata, connection pooling,
|
||||
type coercion, and custom types.
|
||||
* All primary and foreign key constraints are
|
||||
assumed to be composite and natural. Surrogate
|
||||
integer primary keys are of course still the
|
||||
norm, but SQLAlchemy never assumes or hardcodes
|
||||
to this model.
|
||||
* Database introspection and generation. Database
|
||||
schemas can be "reflected" in one step into
|
||||
Python structures representing database metadata;
|
||||
those same structures can then generate
|
||||
CREATE statements right back out - all within
|
||||
the Core, independent of the ORM.
|
||||
|
||||
SQLAlchemy's philosophy:
|
||||
|
||||
* SQL databases behave less and less like object
|
||||
collections the more size and performance start to
|
||||
matter; object collections behave less and less like
|
||||
tables and rows the more abstraction starts to matter.
|
||||
SQLAlchemy aims to accommodate both of these
|
||||
principles.
|
||||
* An ORM doesn't need to hide the "R". A relational
|
||||
database provides rich, set-based functionality
|
||||
that should be fully exposed. SQLAlchemy's
|
||||
ORM provides an open-ended set of patterns
|
||||
that allow a developer to construct a custom
|
||||
mediation layer between a domain model and
|
||||
a relational schema, turning the so-called
|
||||
"object relational impedance" issue into
|
||||
a distant memory.
|
||||
* The developer, in all cases, makes all decisions
|
||||
regarding the design, structure, and naming conventions
|
||||
of both the object model as well as the relational
|
||||
schema. SQLAlchemy only provides the means
|
||||
to automate the execution of these decisions.
|
||||
* With SQLAlchemy, there's no such thing as
|
||||
"the ORM generated a bad query" - you
|
||||
retain full control over the structure of
|
||||
queries, including how joins are organized,
|
||||
how subqueries and correlation is used, what
|
||||
columns are requested. Everything SQLAlchemy
|
||||
does is ultimately the result of a developer-initiated
|
||||
decision.
|
||||
* Don't use an ORM if the problem doesn't need one.
|
||||
SQLAlchemy consists of a Core and separate ORM
|
||||
component. The Core offers a full SQL expression
|
||||
language that allows Pythonic construction
|
||||
of SQL constructs that render directly to SQL
|
||||
strings for a target database, returning
|
||||
result sets that are essentially enhanced DBAPI
|
||||
cursors.
|
||||
* Transactions should be the norm. With SQLAlchemy's
|
||||
ORM, nothing goes to permanent storage until
|
||||
commit() is called. SQLAlchemy encourages applications
|
||||
to create a consistent means of delineating
|
||||
the start and end of a series of operations.
|
||||
* Never render a literal value in a SQL statement.
|
||||
Bound parameters are used to the greatest degree
|
||||
possible, allowing query optimizers to cache
|
||||
query plans effectively and making SQL injection
|
||||
attacks a non-issue.
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
Latest documentation is at:
|
||||
|
||||
https://www.sqlalchemy.org/docs/
|
||||
|
||||
Installation / Requirements
|
||||
---------------------------
|
||||
|
||||
Full documentation for installation is at
|
||||
`Installation <https://www.sqlalchemy.org/docs/intro.html#installation>`_.
|
||||
|
||||
Getting Help / Development / Bug reporting
|
||||
------------------------------------------
|
||||
|
||||
Please refer to the `SQLAlchemy Community Guide <https://www.sqlalchemy.org/support.html>`_.
|
||||
|
||||
Code of Conduct
|
||||
---------------
|
||||
|
||||
Above all, SQLAlchemy places great emphasis on polite, thoughtful, and
|
||||
constructive communication between users and developers.
|
||||
Please see our current Code of Conduct at
|
||||
`Code of Conduct <https://www.sqlalchemy.org/codeofconduct.html>`_.
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
SQLAlchemy is distributed under the `MIT license
|
||||
<https://www.opensource.org/licenses/mit-license.php>`_.
|
||||
|
@@ -1,530 +0,0 @@
|
||||
SQLAlchemy-2.0.27.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
SQLAlchemy-2.0.27.dist-info/LICENSE,sha256=eYQKk6tEYK_iQW6ePf95YIdsg66dK-JwXoOhBNSXQOs,1119
|
||||
SQLAlchemy-2.0.27.dist-info/METADATA,sha256=ySjjHZ2y0chER0KC_8dWxR1tJNJ6ZFKSsKn5NpUGQ4c,9844
|
||||
SQLAlchemy-2.0.27.dist-info/RECORD,,
|
||||
SQLAlchemy-2.0.27.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
SQLAlchemy-2.0.27.dist-info/WHEEL,sha256=ircjsfhzblqgSzO8ow7-0pXK-RVqDqNRGQ8F650AUNM,102
|
||||
SQLAlchemy-2.0.27.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11
|
||||
sqlalchemy/__init__.py,sha256=hU_2Jtxg7KtVE1AdYJaSNwubWJozVVoKzMBzda_lewc,13327
|
||||
sqlalchemy/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/__pycache__/events.cpython-311.pyc,,
|
||||
sqlalchemy/__pycache__/exc.cpython-311.pyc,,
|
||||
sqlalchemy/__pycache__/inspection.cpython-311.pyc,,
|
||||
sqlalchemy/__pycache__/log.cpython-311.pyc,,
|
||||
sqlalchemy/__pycache__/schema.cpython-311.pyc,,
|
||||
sqlalchemy/__pycache__/types.cpython-311.pyc,,
|
||||
sqlalchemy/connectors/__init__.py,sha256=A2AI8p63aT0jT5CsVX33xlTfiGWliOcGahlK0RyTLXg,494
|
||||
sqlalchemy/connectors/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/connectors/__pycache__/aioodbc.cpython-311.pyc,,
|
||||
sqlalchemy/connectors/__pycache__/asyncio.cpython-311.pyc,,
|
||||
sqlalchemy/connectors/__pycache__/pyodbc.cpython-311.pyc,,
|
||||
sqlalchemy/connectors/aioodbc.py,sha256=fg3xfG-5gLsy-DSyVonNNKYhOf0_lzHmixRFa5edtWI,5462
|
||||
sqlalchemy/connectors/asyncio.py,sha256=DOy84rX4l0U5Nfn9dYLY8ETFE2tRiuSAZTJVPZpEl0E,6163
|
||||
sqlalchemy/connectors/pyodbc.py,sha256=IG5lLCyFbnv1wB85HQuMO3S5piWHaB660OBWvBIQhbg,8750
|
||||
sqlalchemy/cyextension/__init__.py,sha256=Hlfk91RinbOuNF_fybR5R2UtiIcTeUOXS66QOfSSCV0,250
|
||||
sqlalchemy/cyextension/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/cyextension/collections.cp311-win_amd64.pyd,sha256=sMUnGsAsxmktVQxumYz7FORlt4p0fkcXpNvtdQl0Bfw,175104
|
||||
sqlalchemy/cyextension/collections.pyx,sha256=GXPkr9cHRLW3Vcu-ik3dVBZMR-zf0Q5_K4J-_8yV-gk,12980
|
||||
sqlalchemy/cyextension/immutabledict.cp311-win_amd64.pyd,sha256=Md9KeQlBLAJ9k671YhqKNg0oxyY-gGH_izUWkMV0ciE,72704
|
||||
sqlalchemy/cyextension/immutabledict.pxd,sha256=5iGndSbJCgCkNmRbJ_z14RANs2dSSnAzyiRPUTBk58Y,299
|
||||
sqlalchemy/cyextension/immutabledict.pyx,sha256=IhB2pR49CrORXQ3LXMFpuCIRc6I08QNvIylE1cPQA5o,3668
|
||||
sqlalchemy/cyextension/processors.cp311-win_amd64.pyd,sha256=ocBdpnIueLk1-UrvAt1ieovUjd7c94wCy-eh5Bsd384,58368
|
||||
sqlalchemy/cyextension/processors.pyx,sha256=V9gzqXiNHWsa5DBgYl-3KzclFHY8kXGF_TD1xHFE7eM,1860
|
||||
sqlalchemy/cyextension/resultproxy.cp311-win_amd64.pyd,sha256=b8Sw6akLIwneSdTRYvga8VuWhc-zz7aX1pa3EACVuwE,60928
|
||||
sqlalchemy/cyextension/resultproxy.pyx,sha256=h_RrKasbLtKK3LqUh6UiWtkumBlKtcN5eeB_1bZROMA,2827
|
||||
sqlalchemy/cyextension/util.cp311-win_amd64.pyd,sha256=HZ220KIKcvLl-qn23YNUtRGL6kLMKMPOnKhtyRzR7qA,72192
|
||||
sqlalchemy/cyextension/util.pyx,sha256=50QYpSAKgLSUfhFEQgSN2e1qHWCMh_b6ZNlErDUS7ec,2621
|
||||
sqlalchemy/dialects/__init__.py,sha256=SJfQyxMhOL58EB-S6GQv_0jf2oP7MMfmVdlV2UxGWQo,1831
|
||||
sqlalchemy/dialects/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/__pycache__/_typing.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/_typing.py,sha256=mN2r8mU8z-mRh4YS3VeK8Nv_IKJmE0Mb1CrJ-ptILas,913
|
||||
sqlalchemy/dialects/mssql/__init__.py,sha256=r3oTfX2LLbJAGhM57wdPLWxaZBzunkcmyaTbW0FjLuY,1968
|
||||
sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mssql/__pycache__/aioodbc.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mssql/__pycache__/base.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mssql/__pycache__/json.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mssql/__pycache__/provision.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mssql/aioodbc.py,sha256=b9bhUKcVj4NzoqJIDfECeE_Rmt51sRy8OOUFz_R3vpg,2086
|
||||
sqlalchemy/dialects/mssql/base.py,sha256=ERGOPdJHLCF4n9L9-nBeiVQ3X-nl8ryt1FEFLxUwj1o,137336
|
||||
sqlalchemy/dialects/mssql/information_schema.py,sha256=A1UJAoFb3UtE8YCY3heBgeTMkzWq3j7C2caZ3gcMGZk,8338
|
||||
sqlalchemy/dialects/mssql/json.py,sha256=nZVVsgmR4Z4dNn9cv5Gucq596gsQ0MvASPuEEtz-Gek,4949
|
||||
sqlalchemy/dialects/mssql/provision.py,sha256=pa-b74Xr2qsto3BFG1O0I_B25TUT3TOecg6cAKuRcf8,5517
|
||||
sqlalchemy/dialects/mssql/pymssql.py,sha256=f7xqRif9Dp64de9G8yuC4OyWArwXy_oVq5X0oiwIX4E,4163
|
||||
sqlalchemy/dialects/mssql/pyodbc.py,sha256=YVI19AnrqxPCBwDqcjrO_rqUUWbV2re7E8iLuV1ilqE,27801
|
||||
sqlalchemy/dialects/mysql/__init__.py,sha256=PPQDwNqcpxWMt3nFQ66KefX9T9iz7d8lybEwKlfXB1U,2254
|
||||
sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/aiomysql.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/asyncmy.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/base.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/dml.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/expression.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/json.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/mariadb.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/provision.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/reserved_words.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/types.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/mysql/aiomysql.py,sha256=-YFqFQEx0M2pww3xvsOlaVKflTeoUfIsM8BgfhP1MP0,10296
|
||||
sqlalchemy/dialects/mysql/asyncmy.py,sha256=h9BBhGsqPG2LWdoh0lPieRLhaQ_BJrhxwsR_G5yPLDQ,10370
|
||||
sqlalchemy/dialects/mysql/base.py,sha256=LQ-nvj7HIQSntwAycof93th3kpMBatHl402HNQ8z9hc,124297
|
||||
sqlalchemy/dialects/mysql/cymysql.py,sha256=0mRP3gFe2t7iJYQqJz1Os_TztFwMAF34w2MmXe-4B_w,2384
|
||||
sqlalchemy/dialects/mysql/dml.py,sha256=n31-m4vfOIL0MdHpUdIfTLgaMzusfQ-yHYoJWO_ndEc,7864
|
||||
sqlalchemy/dialects/mysql/enumerated.py,sha256=Nz9Sv3ENX-1T18aEoOY8QfZlAcwRf65lIOse7vwjil8,8692
|
||||
sqlalchemy/dialects/mysql/expression.py,sha256=uxD1fICubfGh8BhAn6WoeS8AF6hAVEvreDShXqRZTqM,4238
|
||||
sqlalchemy/dialects/mysql/json.py,sha256=i0Lrd_7VKTd3fNm6kQKzrtPERuW0JeSw7XSUWnl1HQI,2350
|
||||
sqlalchemy/dialects/mysql/mariadb.py,sha256=WoNxkjiPfIbWAkrVEU9MTM7mePeLHZ2uiJsyfvcpv1s,885
|
||||
sqlalchemy/dialects/mysql/mariadbconnector.py,sha256=_XZ60dSn8-iQP-qyn1Utk-lswGciuoDgpW7m7GguSVA,9016
|
||||
sqlalchemy/dialects/mysql/mysqlconnector.py,sha256=1ga6IV7lVLH9BKsMh2M2wSz78l5a82BZnyRqJMaS5Qw,5854
|
||||
sqlalchemy/dialects/mysql/mysqldb.py,sha256=KdSkQXgCTHfOWzaM9dlQnmb77FR9X8Io6PVWTYRb1XQ,9966
|
||||
sqlalchemy/dialects/mysql/provision.py,sha256=2ecdVRnZSXy5GF3hpLtQp3T8QW-oFjtTSQgbEePDH1k,3581
|
||||
sqlalchemy/dialects/mysql/pymysql.py,sha256=Kxi_A34-nbQ5UEFSmy14TXc1v43-1SZ8gE628REGTFo,4220
|
||||
sqlalchemy/dialects/mysql/pyodbc.py,sha256=CZCEnhyLIgbuiAW32Cw7N1m1aiQv1eBB34pV-txOs70,4435
|
||||
sqlalchemy/dialects/mysql/reflection.py,sha256=wn8qKHxDb9Dnr8zC_uEgAVjk2lVuObvqPOEiad8568c,23499
|
||||
sqlalchemy/dialects/mysql/reserved_words.py,sha256=s59cfdGTmlXn3GFCnevugDsc3qiiZn8tL31lief0tvo,9721
|
||||
sqlalchemy/dialects/mysql/types.py,sha256=2du4p4PnuJgLHvdofFYP5dtkicIDJYeEdrFBhe7uotQ,25040
|
||||
sqlalchemy/dialects/oracle/__init__.py,sha256=_yFT_k0R6yc7MKQG-Al9QZt8wYZsiCtpkhNlba5xqn8,1560
|
||||
sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/oracle/__pycache__/base.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/oracle/__pycache__/dictionary.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/oracle/__pycache__/oracledb.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/oracle/__pycache__/provision.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/oracle/__pycache__/types.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/oracle/base.py,sha256=haztCHFbuhnhpcBUr8h1PDLXAavdwtpIjgOg_PSDI_A,121486
|
||||
sqlalchemy/dialects/oracle/cx_oracle.py,sha256=3Tx3DKvqcCKyXupBuCiCL4B8D5TDO934Q7LYsLJjlkk,57058
|
||||
sqlalchemy/dialects/oracle/dictionary.py,sha256=tmAZLEACqBAPBE0SEV2jr1R4aPcpNOrbomJl-UmgiR4,20026
|
||||
sqlalchemy/dialects/oracle/oracledb.py,sha256=kuw08rp-tXKPOtGGutqcs5o2gvRptQXAzNBqPVZoLxg,9798
|
||||
sqlalchemy/dialects/oracle/provision.py,sha256=KKlXDQnC8n6BjLJWA7AJg3lwXluH1OyStqfP2Uf9rq0,8524
|
||||
sqlalchemy/dialects/oracle/types.py,sha256=U9EReFRcr0PiwOxT9vg2cA7WOix8LQ2sVp0gRkMHcPo,8518
|
||||
sqlalchemy/dialects/postgresql/__init__.py,sha256=nfP-oId_1wzvRKo5TM6f2xrXry-IxoMkVd4Dga7LDg8,4062
|
||||
sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/_psycopg_common.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/array.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/asyncpg.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/base.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/json.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/named_types.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/operators.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/pg_catalog.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/provision.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/psycopg.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/types.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/postgresql/_psycopg_common.py,sha256=fYFqLVxNxAqh3nOvzGOv3Pfpm2BsclHrk71MJZrpJKo,5883
|
||||
sqlalchemy/dialects/postgresql/array.py,sha256=E69zMO2h7NQFjnWEeFX4fGYDymTbqHAI-laLfy7WrEA,14137
|
||||
sqlalchemy/dialects/postgresql/asyncpg.py,sha256=CpFNMxOqJUvviWxbEyMiJKnBXTMcvN0IFwaka2gH4R0,41445
|
||||
sqlalchemy/dialects/postgresql/base.py,sha256=x3xx5650ZKYAq9ShqDGQNCkj5nt3HNQXv0-Xq0ZT1Ro,181406
|
||||
sqlalchemy/dialects/postgresql/dml.py,sha256=uMiqxEkji-UXqk8gO1ramQEvEfCugYmy8Cv1cnG7DQs,11522
|
||||
sqlalchemy/dialects/postgresql/ext.py,sha256=ct6NQfMAfBnLYhybpF2wPEq-p8-U0tEpy-aq8NwqJLw,16758
|
||||
sqlalchemy/dialects/postgresql/hstore.py,sha256=4jAZQMPWl3VE4weDRZrgrbVDRZJTM3X0Xj4twr5znYQ,11938
|
||||
sqlalchemy/dialects/postgresql/json.py,sha256=TCw4qYTeLhxjDrF1sq3k-yk7UFEhryweKEj8AelBfRc,11537
|
||||
sqlalchemy/dialects/postgresql/named_types.py,sha256=aaH5fNMZp8ZdmLI1ag9g0UgDGVvX0dpE0PbTu3XVUYc,17595
|
||||
sqlalchemy/dialects/postgresql/operators.py,sha256=iyZuyx_daRyJjiS5rw-XnZlaWj1bmRiHdy5MXzBrFZw,2937
|
||||
sqlalchemy/dialects/postgresql/pg8000.py,sha256=TPJXX078vW0FSwZ-DlWNkEOXg7Z4xk8IFwi1droMhPw,19302
|
||||
sqlalchemy/dialects/postgresql/pg_catalog.py,sha256=rNWjbOOC3SB2jmFAwz5VkbdZub7BCTp60YUmJt3eeRI,9178
|
||||
sqlalchemy/dialects/postgresql/provision.py,sha256=Uo_6vxVzFryFjLqsrvesRO55VqHrnsAs_pBH_8JtFcA,5937
|
||||
sqlalchemy/dialects/postgresql/psycopg.py,sha256=zRoaG1ggAKnMBo6fxe6xJa52BxyU2OrOGX-_jDrH2Zk,23113
|
||||
sqlalchemy/dialects/postgresql/psycopg2.py,sha256=xau5nXatjvPNbzqTF8GF_wrwU4Q5T2zkIMGZkhHvrI0,32483
|
||||
sqlalchemy/dialects/postgresql/psycopg2cffi.py,sha256=hFg-9GH08ApPy3foVPUdJKwCEzNSv2zD5l4nH97AqgI,1817
|
||||
sqlalchemy/dialects/postgresql/ranges.py,sha256=oiTmnZ-hd5WqqGNsXbuOJfoNxpbso_M_49gky8dlCrE,33978
|
||||
sqlalchemy/dialects/postgresql/types.py,sha256=pd1QmuGwJFLqpY2tK-Ql3FNjtT1Ha-lVvfaR9dimvHc,7603
|
||||
sqlalchemy/dialects/sqlite/__init__.py,sha256=MmQfjHun1U_4q-Dq_yhs9RzAX0VLixSwWeY5xWiDwag,1239
|
||||
sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/sqlite/__pycache__/aiosqlite.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/sqlite/__pycache__/base.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/sqlite/__pycache__/dml.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/sqlite/__pycache__/json.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/sqlite/__pycache__/provision.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-311.pyc,,
|
||||
sqlalchemy/dialects/sqlite/aiosqlite.py,sha256=TgobCILLu2mjGvDgMTxX3-CPxkj_c5LDYRDJHo5W5qg,12701
|
||||
sqlalchemy/dialects/sqlite/base.py,sha256=8Ft5tZeT1lHiWliTwoJaNslf8PRITVKKWhjhhRCeVDk,99576
|
||||
sqlalchemy/dialects/sqlite/dml.py,sha256=8JV6Ise7WtmFniy590X5b19AYZcE51M6N5hef7d9JoA,8683
|
||||
sqlalchemy/dialects/sqlite/json.py,sha256=-9afZnBt07vInCX20CKzjlTG85wHTO5_cxhcYU4phDc,2869
|
||||
sqlalchemy/dialects/sqlite/provision.py,sha256=nAXZPEjXFrb6a1LxXZMqKmkQoXgl3MPsSHuMyBQ76NU,5830
|
||||
sqlalchemy/dialects/sqlite/pysqlcipher.py,sha256=p0KfzHBwANDMwKTKEJCjR5RxMYqQwS4E8KXjl3Bx6Fw,5511
|
||||
sqlalchemy/dialects/sqlite/pysqlite.py,sha256=s1eL04d6fqPeUNSTnpxXSjWR8OdCuYcy9ilk7716wzU,28653
|
||||
sqlalchemy/dialects/type_migration_guidelines.txt,sha256=gyh3JCauAIFi_9XEfqm3vYv_jb2Eqcz2HjpmC9ZEPMM,8384
|
||||
sqlalchemy/engine/__init__.py,sha256=93FWhb62dLCidc6e4FE65wq_P8GeoWQG1OG6RZMBqhM,2880
|
||||
sqlalchemy/engine/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/engine/__pycache__/_py_processors.cpython-311.pyc,,
|
||||
sqlalchemy/engine/__pycache__/_py_row.cpython-311.pyc,,
|
||||
sqlalchemy/engine/__pycache__/_py_util.cpython-311.pyc,,
|
||||
sqlalchemy/engine/__pycache__/base.cpython-311.pyc,,
|
||||
sqlalchemy/engine/__pycache__/characteristics.cpython-311.pyc,,
|
||||
sqlalchemy/engine/__pycache__/create.cpython-311.pyc,,
|
||||
sqlalchemy/engine/__pycache__/cursor.cpython-311.pyc,,
|
||||
sqlalchemy/engine/__pycache__/default.cpython-311.pyc,,
|
||||
sqlalchemy/engine/__pycache__/events.cpython-311.pyc,,
|
||||
sqlalchemy/engine/__pycache__/interfaces.cpython-311.pyc,,
|
||||
sqlalchemy/engine/__pycache__/mock.cpython-311.pyc,,
|
||||
sqlalchemy/engine/__pycache__/processors.cpython-311.pyc,,
|
||||
sqlalchemy/engine/__pycache__/reflection.cpython-311.pyc,,
|
||||
sqlalchemy/engine/__pycache__/result.cpython-311.pyc,,
|
||||
sqlalchemy/engine/__pycache__/row.cpython-311.pyc,,
|
||||
sqlalchemy/engine/__pycache__/strategies.cpython-311.pyc,,
|
||||
sqlalchemy/engine/__pycache__/url.cpython-311.pyc,,
|
||||
sqlalchemy/engine/__pycache__/util.cpython-311.pyc,,
|
||||
sqlalchemy/engine/_py_processors.py,sha256=-jlAYPM6etmuKeViiI7BD41kqY0Pr8nzaox22TPqCCQ,3880
|
||||
sqlalchemy/engine/_py_row.py,sha256=UEGCjAeRsggcUn0QB0PdFC82kuykrOiOZ1KGq_Gf_qQ,3915
|
||||
sqlalchemy/engine/_py_util.py,sha256=nh1XoVq1b-eGgkdzbqFqzje0RNSmVWotoa6yaB7J5Sw,2558
|
||||
sqlalchemy/engine/base.py,sha256=0VnqL5IK8rTjs7wanSKgOjuzbKdNjs_8TvzJgUqfNCw,125393
|
||||
sqlalchemy/engine/characteristics.py,sha256=q_l1-KybkM5Y-5hG74NuQBxHRkidBstqpRBlFLxJPqs,2671
|
||||
sqlalchemy/engine/create.py,sha256=IC_D9X-t-MN78Ro3shJl4RL0fP9eTvskl4j1bAjagco,33736
|
||||
sqlalchemy/engine/cursor.py,sha256=nCEzaLslgar67EDE4mqowuJsuiBaCbs5ix7sgD9iWTI,76593
|
||||
sqlalchemy/engine/default.py,sha256=oB9T6i1k7rMxat1HkDGCf-_i_3eAOymV1yPU4k0tBeU,87011
|
||||
sqlalchemy/engine/events.py,sha256=e0VHj69fH20sB7gocBhr5Rs2FjR8ioY4iE8VQt70oJg,38332
|
||||
sqlalchemy/engine/interfaces.py,sha256=G29dfsTCNayoIiRnCQ64y9y9w9wtrGwxnm5t102ApvA,116079
|
||||
sqlalchemy/engine/mock.py,sha256=wInBRiHwydTc5ELQLivdezDd1ikbSMVXgLVzZrSC0iQ,4310
|
||||
sqlalchemy/engine/processors.py,sha256=w4MiVMlU6VvfhIW49nygbHcwX8FteGpz7g3IGEqtZb8,2440
|
||||
sqlalchemy/engine/reflection.py,sha256=TO-tymk7BsfAzc6Fi0GmwtYyOWjfMGkyvytJyMVz_oY,77216
|
||||
sqlalchemy/engine/result.py,sha256=U245Q3kGUOugqjmv-qSkx8eyDn27fLYV5agIoBHXQCA,79985
|
||||
sqlalchemy/engine/row.py,sha256=g7ZqmsqX_BtRUzY-zfXoZZ4-5xZ_KJEVbvqKHUIlqRg,12433
|
||||
sqlalchemy/engine/strategies.py,sha256=fD4DJn0AD371wlUa7s5Sy4j7QtgGyP7gMy_kUyqCLDQ,461
|
||||
sqlalchemy/engine/url.py,sha256=tOCRmKkqrpsIfNeSDoy6KKTLtQAMtoIn9xa5kmJQebk,31694
|
||||
sqlalchemy/engine/util.py,sha256=GDoT1xzoCL_CaBvWpBigzXIpUsFAFtjHH8v2e_au7qo,5833
|
||||
sqlalchemy/event/__init__.py,sha256=09qZzHwt0PkIDsPwuPUVJvNakjtCBjuUJeY0AEJ9j7k,1022
|
||||
sqlalchemy/event/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/event/__pycache__/api.cpython-311.pyc,,
|
||||
sqlalchemy/event/__pycache__/attr.cpython-311.pyc,,
|
||||
sqlalchemy/event/__pycache__/base.cpython-311.pyc,,
|
||||
sqlalchemy/event/__pycache__/legacy.cpython-311.pyc,,
|
||||
sqlalchemy/event/__pycache__/registry.cpython-311.pyc,,
|
||||
sqlalchemy/event/api.py,sha256=74Z-EXtNsv8fvsf8m8bgCkVzJf7QzhMaVXJhCylegLo,8452
|
||||
sqlalchemy/event/attr.py,sha256=-SHjzXMOs7IICPSgNwpgRS3FIEeLIpB5PyvVlpw8Gp8,21406
|
||||
sqlalchemy/event/base.py,sha256=haAsH-KuvvY52A6OjwATfvCXy3hdYGgZxkDZiOqbMvI,15416
|
||||
sqlalchemy/event/legacy.py,sha256=a8VEvS83PvgbomNnaSa3okZmTkxl_buZ7Lfilechjh8,8473
|
||||
sqlalchemy/event/registry.py,sha256=f31k0FLqIlWpOK9tksiYXnv-yuZPPz9iLQqvKEYV7ko,11221
|
||||
sqlalchemy/events.py,sha256=OAy8TK21lWzSe8bDUnAbmsP82bsBYy0LL19hR6y3BrM,542
|
||||
sqlalchemy/exc.py,sha256=k01TD2xp2BM3DrXdo2U5r8yuRfsoqBND4kwvtD1SVN0,24806
|
||||
sqlalchemy/ext/__init__.py,sha256=YbMQmRS_9HxRyWM-KA_F76WOss1_Em1ZcrnQDIDXoOc,333
|
||||
sqlalchemy/ext/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/ext/__pycache__/associationproxy.cpython-311.pyc,,
|
||||
sqlalchemy/ext/__pycache__/automap.cpython-311.pyc,,
|
||||
sqlalchemy/ext/__pycache__/baked.cpython-311.pyc,,
|
||||
sqlalchemy/ext/__pycache__/compiler.cpython-311.pyc,,
|
||||
sqlalchemy/ext/__pycache__/horizontal_shard.cpython-311.pyc,,
|
||||
sqlalchemy/ext/__pycache__/hybrid.cpython-311.pyc,,
|
||||
sqlalchemy/ext/__pycache__/indexable.cpython-311.pyc,,
|
||||
sqlalchemy/ext/__pycache__/instrumentation.cpython-311.pyc,,
|
||||
sqlalchemy/ext/__pycache__/mutable.cpython-311.pyc,,
|
||||
sqlalchemy/ext/__pycache__/orderinglist.cpython-311.pyc,,
|
||||
sqlalchemy/ext/__pycache__/serializer.cpython-311.pyc,,
|
||||
sqlalchemy/ext/associationproxy.py,sha256=MBtGwISA4wwT9i6op8jfY6u9lCUYn_4JCqtxZpjggok,67776
|
||||
sqlalchemy/ext/asyncio/__init__.py,sha256=tKYIrERYf8hov9m8DuKWRO_53qhrvj2jRmIYjSGQ2Po,1342
|
||||
sqlalchemy/ext/asyncio/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/ext/asyncio/__pycache__/base.cpython-311.pyc,,
|
||||
sqlalchemy/ext/asyncio/__pycache__/engine.cpython-311.pyc,,
|
||||
sqlalchemy/ext/asyncio/__pycache__/exc.cpython-311.pyc,,
|
||||
sqlalchemy/ext/asyncio/__pycache__/result.cpython-311.pyc,,
|
||||
sqlalchemy/ext/asyncio/__pycache__/scoping.cpython-311.pyc,,
|
||||
sqlalchemy/ext/asyncio/__pycache__/session.cpython-311.pyc,,
|
||||
sqlalchemy/ext/asyncio/base.py,sha256=slWQTFdgQQlkzrnx3m5a9xT8IRg4iM0gkEbypXr_YXQ,9184
|
||||
sqlalchemy/ext/asyncio/engine.py,sha256=VKp3nRnmzl7cEIWSxJNJQMK8CbQbigmrvyqpIiVUdgY,49398
|
||||
sqlalchemy/ext/asyncio/exc.py,sha256=0awLfUB4PhEPVVTKYluyor1tW91GPZZnvdQ-GGSOmJY,660
|
||||
sqlalchemy/ext/asyncio/result.py,sha256=MtKAqA7hwYIdkpRxlCgHNYYzlB7dvqCtEp-aoDdFjDA,31370
|
||||
sqlalchemy/ext/asyncio/scoping.py,sha256=CiMQ7ewPNsyEtl9aGOiEZOrUaNYOTP_LrR0_xkdV3r8,54211
|
||||
sqlalchemy/ext/asyncio/session.py,sha256=gVdecaNFy8fo4YXhfhgwmMpezGaNKsIKL5kSI_j4GoI,64821
|
||||
sqlalchemy/ext/automap.py,sha256=8mu3_-s4DUnWfmOAZsWFFaADZALSIe1J3NQS2BvUGi8,63041
|
||||
sqlalchemy/ext/baked.py,sha256=jc6vPocoXXsvdZsOsqgT4kG6guWSZD1TdPjoRBmkbRU,18381
|
||||
sqlalchemy/ext/compiler.py,sha256=PbvelWqZdzL6y1C6rEc8ledF79t_04MtYV26RUwNhik,20946
|
||||
sqlalchemy/ext/declarative/__init__.py,sha256=MHSOffOS4MWcqshAuLNQv0vDXpK_Z3lpGXTm1riyLls,1883
|
||||
sqlalchemy/ext/declarative/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/ext/declarative/__pycache__/extensions.cpython-311.pyc,,
|
||||
sqlalchemy/ext/declarative/extensions.py,sha256=aPpW0PvTKH3CoSMhsOY5GcUMZOVq-OFsV1hflxmb3Lw,20095
|
||||
sqlalchemy/ext/horizontal_shard.py,sha256=V8vXEt5ZQb_PM39agZD2IyoQNGSqVI1MhY-6mNV5MRY,17231
|
||||
sqlalchemy/ext/hybrid.py,sha256=Fc73iUTCJuHcz3McvD3FBbjEvDag1Jw8THY6rL-phA8,53946
|
||||
sqlalchemy/ext/indexable.py,sha256=aDlVpN4rilRrer9qKg3kO7fqnqB5NX4M5qzYuYM8pvw,11373
|
||||
sqlalchemy/ext/instrumentation.py,sha256=lFsJECWlN1oc1E0r9TaQDZcxAx4VOz6PSHYrl5fLk9Y,16157
|
||||
sqlalchemy/ext/mutable.py,sha256=nAz3_lF2xkYSARt7GAWQh-OUMcnpe6s1ocjvQGxCPkc,38428
|
||||
sqlalchemy/ext/mypy/__init__.py,sha256=aqT8_9sNwzC8PIaEZ4zkCYGBvYPaDD3eCgJtJuk3g6A,247
|
||||
sqlalchemy/ext/mypy/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/ext/mypy/__pycache__/apply.cpython-311.pyc,,
|
||||
sqlalchemy/ext/mypy/__pycache__/decl_class.cpython-311.pyc,,
|
||||
sqlalchemy/ext/mypy/__pycache__/infer.cpython-311.pyc,,
|
||||
sqlalchemy/ext/mypy/__pycache__/names.cpython-311.pyc,,
|
||||
sqlalchemy/ext/mypy/__pycache__/plugin.cpython-311.pyc,,
|
||||
sqlalchemy/ext/mypy/__pycache__/util.cpython-311.pyc,,
|
||||
sqlalchemy/ext/mypy/apply.py,sha256=1Qb-_FpQ_0LVB2KFA5hVjfPv6DDMIcxXe86Ts1X9GBk,10870
|
||||
sqlalchemy/ext/mypy/decl_class.py,sha256=f2iWiFVlDFqGb_IoGGotI3IEOUErh25sLT7B_cMfx0g,17899
|
||||
sqlalchemy/ext/mypy/infer.py,sha256=O-3IjELDSBEAwGGxRM7lr0NWwGD0HMK4vda_iY6iwjs,19959
|
||||
sqlalchemy/ext/mypy/names.py,sha256=TWsrp5ftD5p0NeyAipgYIir9SUbA4U0BAk0W2FXA3VA,10972
|
||||
sqlalchemy/ext/mypy/plugin.py,sha256=TDTziLsYFRqyX8UcQMtBBa6TFR4z9N-XNO8wRkHlEOI,10053
|
||||
sqlalchemy/ext/mypy/util.py,sha256=3iQ1zVpXSUoj2aHa-Kkg4O83JOzqVd8TDEwpZj3SWWs,9786
|
||||
sqlalchemy/ext/orderinglist.py,sha256=r7La_3nZlGevIgsBL1IB30FvWO_tZHlTKo_FWwid-aY,14800
|
||||
sqlalchemy/ext/serializer.py,sha256=_7gottqRCI-qkW4Go4o2EnOSnieKDCQ8jQ6muHXw-RM,6363
|
||||
sqlalchemy/future/__init__.py,sha256=6-qPdjMHX-V-kAPjTQgNuHztmYiwKlJhKhhljuETvoQ,528
|
||||
sqlalchemy/future/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/future/__pycache__/engine.cpython-311.pyc,,
|
||||
sqlalchemy/future/engine.py,sha256=N_5W2ab5-ueedWzqNdgLPzTW9audT1IbxF6FCDLRZOc,510
|
||||
sqlalchemy/inspection.py,sha256=GpmMuSAZ53u4W__iGpvzQKCBMFnTxnHt4Lo7Nq1FSKM,5237
|
||||
sqlalchemy/log.py,sha256=Sg6PGR_wmseiCCpJfRDEkaMs08XTPPsf0X_iYJLvzS0,8895
|
||||
sqlalchemy/orm/__init__.py,sha256=I-XesvuyjkAAwnsiF5FnXRLNV6W2nW70EnGAIt2GAjU,8633
|
||||
sqlalchemy/orm/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/_orm_constructors.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/_typing.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/attributes.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/base.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/bulk_persistence.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/clsregistry.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/collections.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/context.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/decl_api.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/decl_base.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/dependency.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/descriptor_props.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/dynamic.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/evaluator.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/events.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/exc.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/identity.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/instrumentation.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/interfaces.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/loading.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/mapped_collection.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/mapper.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/path_registry.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/persistence.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/properties.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/query.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/relationships.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/scoping.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/session.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/state.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/state_changes.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/strategies.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/strategy_options.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/sync.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/unitofwork.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/util.cpython-311.pyc,,
|
||||
sqlalchemy/orm/__pycache__/writeonly.cpython-311.pyc,,
|
||||
sqlalchemy/orm/_orm_constructors.py,sha256=qOQLU_Rly-AYjGDotwZv65PCjjLgdAwqHGPUeZrTYfE,101822
|
||||
sqlalchemy/orm/_typing.py,sha256=Z9GZT8Vb-wFwvHeOeVE37dvmCWdItLZnqI_pLin4cMc,5152
|
||||
sqlalchemy/orm/attributes.py,sha256=devlqbjcICNLnG0HEg4wSP2sgm2m8sW9RpoQZuaU0KM,95355
|
||||
sqlalchemy/orm/base.py,sha256=JWzk2w1k-xT5BW8T7K0DRhMg7lDKFf4T6KrFey_6c4A,28394
|
||||
sqlalchemy/orm/bulk_persistence.py,sha256=z7yTdor_Nea7R0UMu8kloKvN-t0z2AZ-P-q5FE-oabc,72070
|
||||
sqlalchemy/orm/clsregistry.py,sha256=ZumBI7I2O-l93LbA4eyMKm0w6al-nNS2QV1VDcJxGko,18528
|
||||
sqlalchemy/orm/collections.py,sha256=lHjP6uDz0WdwedTqyh_8R2_nzRAK_5ONCIoisHrsb94,53797
|
||||
sqlalchemy/orm/context.py,sha256=bBieTIPsM10lt5z5Feq4tDjBqpznbsssaiXh7OrTh18,115244
|
||||
sqlalchemy/orm/decl_api.py,sha256=Xd9s8A7V_jlypP-u-tnpQ5o6Oq-v1A4H1f3hSEj4-Bc,65549
|
||||
sqlalchemy/orm/decl_base.py,sha256=g6bhTg5M9hsf3JVnMaqn1NS7MTdBJY--L-qf9aQabgs,83753
|
||||
sqlalchemy/orm/dependency.py,sha256=glstmbB4t-PIRA47u9NgTyyxbENfyQuG9Uzj2iezB_s,48935
|
||||
sqlalchemy/orm/descriptor_props.py,sha256=PpDt83EX72AhCbBjixQDpYG1P1MqWqGdA-bJpXMSxSw,38254
|
||||
sqlalchemy/orm/dynamic.py,sha256=m7V2GPS5__4y_hP7BQjD66b6BVEre1pzPwaj2bmRFRM,10084
|
||||
sqlalchemy/orm/evaluator.py,sha256=gQIDxuoB5Ut2hiFdN768U67JusVkbFt-Bdna_T8npPA,12293
|
||||
sqlalchemy/orm/events.py,sha256=EeIAGfdSQX0XQLZyURz94KYOlsjwI-ANWjPfyN_-jcQ,130956
|
||||
sqlalchemy/orm/exc.py,sha256=90xWOIIAmzPguaVH6mxr2xUSGW44aGIPz5WytJSwmR4,7583
|
||||
sqlalchemy/orm/identity.py,sha256=fOpANTf73r12F_w9DhVoyjkAdh8ldgJcNnwxx0GY8YM,9551
|
||||
sqlalchemy/orm/instrumentation.py,sha256=a8vi3qEAyO7Z9PYksLkFi_YzxqQhzB-anblegiAtsFw,25075
|
||||
sqlalchemy/orm/interfaces.py,sha256=IKCWZFHamXIkpBCaEh7YIYy-Jz2hV4-SQt6kGbfOuE8,49842
|
||||
sqlalchemy/orm/loading.py,sha256=sp7VaIoc9gzrtAOekU_2EWYN3L_9lKuiKkfn6f4VlQQ,59202
|
||||
sqlalchemy/orm/mapped_collection.py,sha256=AeSzQwj56cLr1tVMC0B-3JsC74IAP7_gbr-EPc4_2uw,20250
|
||||
sqlalchemy/orm/mapper.py,sha256=13goncHEJueS73Z7EWovVdp1W-xBKSWB5cjqtpyIk5s,175479
|
||||
sqlalchemy/orm/path_registry.py,sha256=KqS4yYe__beUSpdEjL8qxzL_z7V-FJkolm4AMCBHhGg,26658
|
||||
sqlalchemy/orm/persistence.py,sha256=MKb7TuSLJUQpyqnHxf6uNmGXSznmZgkkFTD04nHbNUQ,63483
|
||||
sqlalchemy/orm/properties.py,sha256=xtSDAAeUgDAmZF_OTBd4F18q9h3h7JWnPtQnWU0-aU4,30007
|
||||
sqlalchemy/orm/query.py,sha256=d2aENAsXkiZuXOxZ5WNKMqsrNHT7_d-_BgXqNa2BtsA,120948
|
||||
sqlalchemy/orm/relationships.py,sha256=jtIA6Y7jhlSzee-MGu_0YMmtH8Kr4lwanjCBfB_eV_I,131177
|
||||
sqlalchemy/orm/scoping.py,sha256=aAQMIAAZ-M_m6UGndmkUiDazcphE-klw6wZjFT2Az7E,80842
|
||||
sqlalchemy/orm/session.py,sha256=QRC0WQSjNFIhyInWnZD-picMoKWS79oIlQAVAcRon_4,198419
|
||||
sqlalchemy/orm/state.py,sha256=9opH8AR6LnbCRmW1lN2RxEQyxnEi1rcDXlySqrDeUiw,38656
|
||||
sqlalchemy/orm/state_changes.py,sha256=4i90vDgBGvVGUzhlonlBkZBAZFOWaAXij2X8OEA3-BA,7013
|
||||
sqlalchemy/orm/strategies.py,sha256=GFppPikNxZJdsi4DW1HcU6pv-EvIeFvTI8K_LDY5nmk,117550
|
||||
sqlalchemy/orm/strategy_options.py,sha256=cBzotMlredMZ8vM6T04mTnskiS0qSoRkHEQKSLZNARA,86734
|
||||
sqlalchemy/orm/sync.py,sha256=aMEMhYTj2rtJZJvjqm-cUx2CoQxYl8P6YddCLpLelhM,5943
|
||||
sqlalchemy/orm/unitofwork.py,sha256=THggzzAaqmYh5PBDob5dHTP_YyHXYdscs3fIxtRV-gE,27829
|
||||
sqlalchemy/orm/util.py,sha256=xIaltctFxy-u4xdLk1mqdHYsq_bvg4xsaTRQTev7I80,82756
|
||||
sqlalchemy/orm/writeonly.py,sha256=j5DcpZKOv1tLGQLhKfk-Uw-B0yEG7LezwJWNTq0FtWQ,22983
|
||||
sqlalchemy/pool/__init__.py,sha256=ZKUPMKdBU57mhu677UsvRs5Aq9s9BwIbMmSNRoTRPoY,1848
|
||||
sqlalchemy/pool/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/pool/__pycache__/base.cpython-311.pyc,,
|
||||
sqlalchemy/pool/__pycache__/events.cpython-311.pyc,,
|
||||
sqlalchemy/pool/__pycache__/impl.cpython-311.pyc,,
|
||||
sqlalchemy/pool/base.py,sha256=D0sKTRla6wpIFbELyGY2JEHUHR324rveIl93qjjmYr8,53751
|
||||
sqlalchemy/pool/events.py,sha256=ysyFh0mNDpL4N4rQ-o_BC6tpo_zt0_au_QLBgJqaKY8,13517
|
||||
sqlalchemy/pool/impl.py,sha256=8VcM4JSUnu4FcSrC5TUzTWT0FYFxfNouKyuXCKnD6KM,18264
|
||||
sqlalchemy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
sqlalchemy/schema.py,sha256=UFhZjGmYoqN3zkId7M4CbVCd8KaeZUfKUjdlk0sHQ_E,3264
|
||||
sqlalchemy/sql/__init__.py,sha256=T16ZB3Za0Tq1LQGXeJuuxDkyu2t-XHR2t-8QH1mE1Uw,5965
|
||||
sqlalchemy/sql/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/_dml_constructors.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/_elements_constructors.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/_orm_types.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/_py_util.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/_selectable_constructors.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/_typing.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/annotation.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/base.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/cache_key.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/coercions.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/compiler.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/crud.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/ddl.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/default_comparator.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/dml.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/elements.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/events.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/expression.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/functions.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/lambdas.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/naming.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/operators.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/roles.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/schema.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/selectable.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/sqltypes.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/traversals.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/type_api.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/util.cpython-311.pyc,,
|
||||
sqlalchemy/sql/__pycache__/visitors.cpython-311.pyc,,
|
||||
sqlalchemy/sql/_dml_constructors.py,sha256=1xMH5Kd6SLhlFwfIs_lOXGC8GTrqW8mQM7Kc3cKyLuw,4007
|
||||
sqlalchemy/sql/_elements_constructors.py,sha256=DN5B84YTp9K5cfp1qjEpg_2d5WpHujlNBJ-pG7bsKoI,64386
|
||||
sqlalchemy/sql/_orm_types.py,sha256=_bzlAh3-vTIZoLvAM2ry1SF7rsYRM3-jupfhGWZZn5Y,645
|
||||
sqlalchemy/sql/_py_util.py,sha256=VzThcXk7fKqT9_mZmXrkxePdwyyl_wIciCftzl2Z_-g,2248
|
||||
sqlalchemy/sql/_selectable_constructors.py,sha256=mRgtlGyctlb1LMBqFxgn0eGzIXMbyZtQafjUuJWhYjs,19415
|
||||
sqlalchemy/sql/_typing.py,sha256=i4COgky9Gv0ArXdOpp9xfxpvKqP3lj0I_vJqinvWEck,12940
|
||||
sqlalchemy/sql/annotation.py,sha256=PslN1KQV9hN8Ji4k8I3-W-cDuRMCCLwMmJcg-n86Yy4,18830
|
||||
sqlalchemy/sql/base.py,sha256=Twa1DYB1fBGGzU0kIVS0h30-0j67gfduuw9GU6RxGao,75935
|
||||
sqlalchemy/sql/cache_key.py,sha256=vUWB-pqAtgt8SBRMHEkzo8BQ_1yXjMeGt-aaDB1ieek,34605
|
||||
sqlalchemy/sql/coercions.py,sha256=O6PA7Gzhr9XQedJs3zIngCivN1vcrNyEhFueN5CqriI,41882
|
||||
sqlalchemy/sql/compiler.py,sha256=PslsNi8ND2FXVPcFIS3UBMpVthfM47MAu4c_rpBpMHE,278910
|
||||
sqlalchemy/sql/crud.py,sha256=I5nPPnujtNKHC5C2v1vW4A0mbyomwChT21IYOX3z5fw,58190
|
||||
sqlalchemy/sql/ddl.py,sha256=NbW8F3UT4BTnda5w5TNPGxXPtv0wHSNB51hhr4gBSJM,46980
|
||||
sqlalchemy/sql/default_comparator.py,sha256=lXmd8yAUzfyeP5w4vebrQG99oC0bTrmdGc0crBq1GKw,17259
|
||||
sqlalchemy/sql/dml.py,sha256=lt5FC6BbJNotE65U-fmvEovBxkADfKBnVcnkVYYQxUM,67431
|
||||
sqlalchemy/sql/elements.py,sha256=tIgio7vC-0gftEddMtUu35cXIWwPqqomat0ufAIFrMM,177377
|
||||
sqlalchemy/sql/events.py,sha256=pG3jqJbPX18N9Amp47aXiQYMYD_HL_lOXHk-0m8m7Hw,18745
|
||||
sqlalchemy/sql/expression.py,sha256=T-AgCPp30tgKQYLKeSyqQg_VoJFE69m2yDTz6fn-u1E,7748
|
||||
sqlalchemy/sql/functions.py,sha256=vxYsWwzQpYhfQ_EwfdA-lGlbh2pkQ30AXGjvHEvVBWo,65741
|
||||
sqlalchemy/sql/lambdas.py,sha256=i3F6TZEAHSPqTV704LAybfNOMyUJ52x2YE2eCHTlYi4,50738
|
||||
sqlalchemy/sql/naming.py,sha256=ERVjqo6fBHBw2BwNgpbb5cvsCkq1jjdztczP9BKzVt8,7070
|
||||
sqlalchemy/sql/operators.py,sha256=6rpSbuFon7iIUCT4SDowYctDyOmFpe2-FdLu2HIX3x8,78508
|
||||
sqlalchemy/sql/roles.py,sha256=8nO4y1hbP1cA8IzeOn6uPgNZNVILb3E-IMeJWOIScu8,7985
|
||||
sqlalchemy/sql/schema.py,sha256=iIurzYqmZNRi_wBN-tXFKIM-jt07DIvVuzV_IVsfsTo,234377
|
||||
sqlalchemy/sql/selectable.py,sha256=fWcddtd9UM3QMcS-3Pg6E98mK9uAZGkhmyOLWlNEigI,239761
|
||||
sqlalchemy/sql/sqltypes.py,sha256=AJvAe9Nt3Bweic9eC__NVnkVAbIgb_exoajEfTij1R4,130912
|
||||
sqlalchemy/sql/traversals.py,sha256=p2iXAQc0FvV-l1Q3NNMxIhRYTm8U3Ul630jG3Ys6qCI,34611
|
||||
sqlalchemy/sql/type_api.py,sha256=zRtzrf5sLjDWnSUvl_vAnG6X8fhY8vuln4jG_Jx4zKY,86164
|
||||
sqlalchemy/sql/util.py,sha256=ftTiyNGeJK0MIRMqWMV7Xf8iZuiRGocoJRp3MIO3F3Y,49563
|
||||
sqlalchemy/sql/visitors.py,sha256=oudlabsf9qleuC78GFe_iflRSAD8H-HjaM7T8Frc538,37482
|
||||
sqlalchemy/testing/__init__.py,sha256=8iT66v5k4J9RmquaH4GLI2DjEA7c_JZSTVig-uuBNw8,3221
|
||||
sqlalchemy/testing/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/testing/__pycache__/assertions.cpython-311.pyc,,
|
||||
sqlalchemy/testing/__pycache__/assertsql.cpython-311.pyc,,
|
||||
sqlalchemy/testing/__pycache__/asyncio.cpython-311.pyc,,
|
||||
sqlalchemy/testing/__pycache__/config.cpython-311.pyc,,
|
||||
sqlalchemy/testing/__pycache__/engines.cpython-311.pyc,,
|
||||
sqlalchemy/testing/__pycache__/entities.cpython-311.pyc,,
|
||||
sqlalchemy/testing/__pycache__/exclusions.cpython-311.pyc,,
|
||||
sqlalchemy/testing/__pycache__/pickleable.cpython-311.pyc,,
|
||||
sqlalchemy/testing/__pycache__/profiling.cpython-311.pyc,,
|
||||
sqlalchemy/testing/__pycache__/provision.cpython-311.pyc,,
|
||||
sqlalchemy/testing/__pycache__/requirements.cpython-311.pyc,,
|
||||
sqlalchemy/testing/__pycache__/schema.cpython-311.pyc,,
|
||||
sqlalchemy/testing/__pycache__/util.cpython-311.pyc,,
|
||||
sqlalchemy/testing/__pycache__/warnings.cpython-311.pyc,,
|
||||
sqlalchemy/testing/assertions.py,sha256=bBn2Ep89FF-WBmzh0VkvnJ9gNMKuqk8OXq7ALpUwar4,32428
|
||||
sqlalchemy/testing/assertsql.py,sha256=gj4YRBR9cjOtS1WgR3nsyIze1tmqctsNs1uCV8N2Q4w,17333
|
||||
sqlalchemy/testing/asyncio.py,sha256=GvWrQFrL3xz7rub61oGOS2PXVvw7D9Id3gtkXQjZJLY,3858
|
||||
sqlalchemy/testing/config.py,sha256=jfFVUiAOm8im6SlqyAdZVSaA51kmADgfBDqrHnngH7c,12517
|
||||
sqlalchemy/testing/engines.py,sha256=U3FkWECbghiK2_Yv5uKMjco377xoFsi75WZgRZroGWA,13814
|
||||
sqlalchemy/testing/entities.py,sha256=Um-DFSz81p06DhTK899ZRUOZRw3FtUDeNMVHcIg3eLc,3471
|
||||
sqlalchemy/testing/exclusions.py,sha256=8kjsaFfjCvPlLsQLD_LIDwuqvVlIVbD5qTWBlKdtNkM,12895
|
||||
sqlalchemy/testing/fixtures/__init__.py,sha256=B1IFCzEVdCqhEvFrLmgxZ_Fr08jDus5FddSA-lnnAAU,1226
|
||||
sqlalchemy/testing/fixtures/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/testing/fixtures/__pycache__/base.cpython-311.pyc,,
|
||||
sqlalchemy/testing/fixtures/__pycache__/mypy.cpython-311.pyc,,
|
||||
sqlalchemy/testing/fixtures/__pycache__/orm.cpython-311.pyc,,
|
||||
sqlalchemy/testing/fixtures/__pycache__/sql.cpython-311.pyc,,
|
||||
sqlalchemy/testing/fixtures/base.py,sha256=S0ODuph0jA2Za4GN3NNhYVIqN9jAa3Q9Vd1N4O4rcTc,12622
|
||||
sqlalchemy/testing/fixtures/mypy.py,sha256=2H8QxvGvwsb_Z3alRtvCvfXeqGjOb8aemfoYxQiuGMc,12285
|
||||
sqlalchemy/testing/fixtures/orm.py,sha256=6JvQpIfmgmSTH3Hie4nhmUFfvH0pseujIFA9Lup2Dzw,6322
|
||||
sqlalchemy/testing/fixtures/sql.py,sha256=Joqh4q1vE3wCaE3eDZUnSobeLNUE-pabIy58ZMURFto,16196
|
||||
sqlalchemy/testing/pickleable.py,sha256=uYLl557iNep6jSOVl0vK1GwaLHUKidALoPJc-QIrC08,2988
|
||||
sqlalchemy/testing/plugin/__init__.py,sha256=bbtVIt7LzVnUCcVxHWRH2owOQD067bQwwhyMf_whqHs,253
|
||||
sqlalchemy/testing/plugin/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-311.pyc,,
|
||||
sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-311.pyc,,
|
||||
sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-311.pyc,,
|
||||
sqlalchemy/testing/plugin/bootstrap.py,sha256=USn6pE-JcE5pSmnEd2wad3goKLx2hdJS3AUUFpXHm-I,1736
|
||||
sqlalchemy/testing/plugin/plugin_base.py,sha256=CgrNj2wj9KNALu9YfnGSaHX2fXfTtiim_cfx0CPVoy8,22357
|
||||
sqlalchemy/testing/plugin/pytestplugin.py,sha256=xFbgBkv92U7_nYSyq87MG6OZSg_NR2HOo7CG7IC1cpY,28416
|
||||
sqlalchemy/testing/profiling.py,sha256=o8_V3TpF_WytudMQQLm1UxlfNDrLCWxUvkH-Kd0unKU,10472
|
||||
sqlalchemy/testing/provision.py,sha256=ciWoXf3P9ql4hh1yBp0RNEtPr5vyvPbd8RD_DYxNG9U,15115
|
||||
sqlalchemy/testing/requirements.py,sha256=L_DKVqVxVMbB3JveC_6UhD5oVry2KjBHPxfQd35hrWQ,53600
|
||||
sqlalchemy/testing/schema.py,sha256=z2Z5rm3iJ1-vgifUxwzxEjt1qu7QOyr3TeDnQdCHlWE,6737
|
||||
sqlalchemy/testing/suite/__init__.py,sha256=YvTEqUNHaBlgLgWDAWn79mQrUR4VBGUHtprywJlmDT8,741
|
||||
sqlalchemy/testing/suite/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_cte.cpython-311.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-311.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_deprecations.cpython-311.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-311.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_insert.cpython-311.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-311.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_results.cpython-311.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_rowcount.cpython-311.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_select.cpython-311.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-311.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_types.cpython-311.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_unicode_ddl.cpython-311.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-311.pyc,,
|
||||
sqlalchemy/testing/suite/test_cte.py,sha256=C_viXJKClFAm91rtPb42tiAA7gYJwKkqGYVJYap0cLM,6662
|
||||
sqlalchemy/testing/suite/test_ddl.py,sha256=k6D6RreLkDSSpRUM2hQz-_CA48qV2PYx_2LNyUSoZzE,12420
|
||||
sqlalchemy/testing/suite/test_deprecations.py,sha256=SKRFZDteBO1rw9-BQjDic5nh7fdyw2ypVOewR2pj7-Q,5490
|
||||
sqlalchemy/testing/suite/test_dialect.py,sha256=ftOWRXWOotB2_jMJJqwoH9f3X2ucc1HwwOiXp573GwM,23663
|
||||
sqlalchemy/testing/suite/test_insert.py,sha256=v3zrUZaGlke3cI4vabHg7xaI4gNqcHhtMPgYuf0mOxc,19454
|
||||
sqlalchemy/testing/suite/test_reflection.py,sha256=C6P9ccG5Eog5uiIHO4s6M7ThnBbEUZKh83CmOMn-KSo,109594
|
||||
sqlalchemy/testing/suite/test_results.py,sha256=1SlvhdioM1_ZrkQX2IJbJgXNHuleizwAge6-XvHtA0s,16405
|
||||
sqlalchemy/testing/suite/test_rowcount.py,sha256=DCEGxorDcrT5JCLd3_SNQeZmxT6sKIcuKxX1r6vK4Mg,8158
|
||||
sqlalchemy/testing/suite/test_select.py,sha256=NwHUSVc4UptVYMGjp3QVLr0OpGxpz2qJG4cNWZW8vTo,60462
|
||||
sqlalchemy/testing/suite/test_sequence.py,sha256=sIqkfgVqPIgl4lm75EPdag9gK-rTHfUm3pWX-JijPy4,10240
|
||||
sqlalchemy/testing/suite/test_types.py,sha256=i1fCIXERdtGABdp_T3l1vaPH9AhQ80DJvbjOPbeng1c,67748
|
||||
sqlalchemy/testing/suite/test_unicode_ddl.py,sha256=juF_KTK1nGrSlsL8z0Ky0rFSNkPGheLB3e0Kq3yRqss,6330
|
||||
sqlalchemy/testing/suite/test_update_delete.py,sha256=TnJI5U_ZEuu3bni4sH-S6CENxvSZwDgZL-FKSV45bAo,4133
|
||||
sqlalchemy/testing/util.py,sha256=jX9jlUHSH-7_2OCypZUvitP8JkJbNdr5_ZxU6Aa8DPY,14599
|
||||
sqlalchemy/testing/warnings.py,sha256=3EhbTlPe4gJnoydj-OKueNOOtGwIRF2kV4XvlFwFYOA,1598
|
||||
sqlalchemy/types.py,sha256=unCm_O8qKxU3LjLbqeqSNQSsK5k5R5POsyEx2gH6CF4,3244
|
||||
sqlalchemy/util/__init__.py,sha256=3-O9j9qPk-gTx6hlyLsISc_JOW5MhjV0J_L5nV19qI8,8436
|
||||
sqlalchemy/util/__pycache__/__init__.cpython-311.pyc,,
|
||||
sqlalchemy/util/__pycache__/_collections.cpython-311.pyc,,
|
||||
sqlalchemy/util/__pycache__/_concurrency_py3k.cpython-311.pyc,,
|
||||
sqlalchemy/util/__pycache__/_has_cy.cpython-311.pyc,,
|
||||
sqlalchemy/util/__pycache__/_py_collections.cpython-311.pyc,,
|
||||
sqlalchemy/util/__pycache__/compat.cpython-311.pyc,,
|
||||
sqlalchemy/util/__pycache__/concurrency.cpython-311.pyc,,
|
||||
sqlalchemy/util/__pycache__/deprecations.cpython-311.pyc,,
|
||||
sqlalchemy/util/__pycache__/langhelpers.cpython-311.pyc,,
|
||||
sqlalchemy/util/__pycache__/preloaded.cpython-311.pyc,,
|
||||
sqlalchemy/util/__pycache__/queue.cpython-311.pyc,,
|
||||
sqlalchemy/util/__pycache__/tool_support.cpython-311.pyc,,
|
||||
sqlalchemy/util/__pycache__/topological.cpython-311.pyc,,
|
||||
sqlalchemy/util/__pycache__/typing.cpython-311.pyc,,
|
||||
sqlalchemy/util/_collections.py,sha256=O3iqq0R9TbcXNyFk8nG4QLwkUzdWkCFmqBYcDrajvl8,20778
|
||||
sqlalchemy/util/_concurrency_py3k.py,sha256=HQ5tLleQd5cR4BOoXKFWVTK7p4fCDW105QxRLW52_ko,8841
|
||||
sqlalchemy/util/_has_cy.py,sha256=IHGc5hUFbXQuv1a1z2P8yVwz0yGbCYXyQM2qsdcBTyg,1287
|
||||
sqlalchemy/util/_py_collections.py,sha256=2PUqiKIsF8d-gNDAAqYI8WE6XPyRf1flRLkVsJeXuOo,17255
|
||||
sqlalchemy/util/compat.py,sha256=ojCAtKHlkqNdYB33PXbAP0zTH1ZXYdTZkJl32cqGnMQ,9014
|
||||
sqlalchemy/util/concurrency.py,sha256=AOLQUBm9Hm4jDArP8vBYL39FzckyH9S4NsKRvWaYzEE,2500
|
||||
sqlalchemy/util/deprecations.py,sha256=AnHpDWHi7g2gv_QUTGStQTnr0J94lIF-3aFLOsv9yzg,12372
|
||||
sqlalchemy/util/langhelpers.py,sha256=1meF9IffDMmz50uxNdUO15FUL0TARzwFcPjwbpOQRX8,67115
|
||||
sqlalchemy/util/preloaded.py,sha256=78Sl7VjzTOPajbovvARxNeuZb-iYRpEvL5k8m5Bz4vQ,6054
|
||||
sqlalchemy/util/queue.py,sha256=4SbSbVamUECjCDpMPR035N1ooVHt9W5GjbqkxfZmH5k,10507
|
||||
sqlalchemy/util/tool_support.py,sha256=DuurikYgDUIIxk3gubUKl6rs-etXt3eeHaZ4ZkIyJXQ,6336
|
||||
sqlalchemy/util/topological.py,sha256=_NdtAghZjhZ4e2fwWHmn25erP5cvtGgOUMplsCa_VCE,3578
|
||||
sqlalchemy/util/typing.py,sha256=DG9V94Mh63cqObr_G5X19wH4H3hhWMqZXufVEZ2wtiw,17221
|
@@ -1,5 +0,0 @@
|
||||
Wheel-Version: 1.0
|
||||
Generator: bdist_wheel (0.42.0)
|
||||
Root-Is-Purelib: false
|
||||
Tag: cp311-cp311-win_amd64
|
||||
|
@@ -1 +0,0 @@
|
||||
sqlalchemy
|
@@ -1 +0,0 @@
|
||||
version = "24.10.0"
|
@@ -1 +0,0 @@
|
||||
pip
|
@@ -1,164 +0,0 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: aiogram
|
||||
Version: 3.16.0
|
||||
Summary: Modern and fully asynchronous framework for Telegram Bot API
|
||||
Project-URL: Homepage, https://aiogram.dev/
|
||||
Project-URL: Documentation, https://docs.aiogram.dev/
|
||||
Project-URL: Repository, https://github.com/aiogram/aiogram/
|
||||
Author-email: Alex Root Junior <jroot.junior@gmail.com>
|
||||
Maintainer-email: Alex Root Junior <jroot.junior@gmail.com>
|
||||
License-Expression: MIT
|
||||
License-File: LICENSE
|
||||
Keywords: api,asyncio,bot,framework,telegram,wrapper
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Environment :: Console
|
||||
Classifier: Framework :: AsyncIO
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: Intended Audience :: System Administrators
|
||||
Classifier: License :: OSI Approved :: MIT License
|
||||
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 :: Implementation :: PyPy
|
||||
Classifier: Topic :: Communications :: Chat
|
||||
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Classifier: Typing :: Typed
|
||||
Requires-Python: >=3.9
|
||||
Requires-Dist: aiofiles<24.2,>=23.2.1
|
||||
Requires-Dist: aiohttp<3.12,>=3.9.0
|
||||
Requires-Dist: certifi>=2023.7.22
|
||||
Requires-Dist: magic-filter<1.1,>=1.0.12
|
||||
Requires-Dist: pydantic<2.11,>=2.4.1
|
||||
Requires-Dist: typing-extensions<=5.0,>=4.7.0
|
||||
Provides-Extra: cli
|
||||
Requires-Dist: aiogram-cli<2.0.0,>=1.1.0; extra == 'cli'
|
||||
Provides-Extra: dev
|
||||
Requires-Dist: black~=24.4.2; extra == 'dev'
|
||||
Requires-Dist: isort~=5.13.2; extra == 'dev'
|
||||
Requires-Dist: motor-types~=1.0.0b4; extra == 'dev'
|
||||
Requires-Dist: mypy~=1.10.0; extra == 'dev'
|
||||
Requires-Dist: packaging~=24.1; extra == 'dev'
|
||||
Requires-Dist: pre-commit~=3.5; extra == 'dev'
|
||||
Requires-Dist: ruff~=0.5.1; extra == 'dev'
|
||||
Requires-Dist: toml~=0.10.2; extra == 'dev'
|
||||
Provides-Extra: docs
|
||||
Requires-Dist: furo~=2024.8.6; extra == 'docs'
|
||||
Requires-Dist: markdown-include~=0.8.1; extra == 'docs'
|
||||
Requires-Dist: pygments~=2.18.0; extra == 'docs'
|
||||
Requires-Dist: pymdown-extensions~=10.3; extra == 'docs'
|
||||
Requires-Dist: sphinx-autobuild~=2024.9.3; extra == 'docs'
|
||||
Requires-Dist: sphinx-copybutton~=0.5.2; extra == 'docs'
|
||||
Requires-Dist: sphinx-intl~=2.2.0; extra == 'docs'
|
||||
Requires-Dist: sphinx-substitution-extensions~=2024.8.6; extra == 'docs'
|
||||
Requires-Dist: sphinxcontrib-towncrier~=0.4.0a0; extra == 'docs'
|
||||
Requires-Dist: sphinx~=8.0.2; extra == 'docs'
|
||||
Requires-Dist: towncrier~=24.8.0; extra == 'docs'
|
||||
Provides-Extra: fast
|
||||
Requires-Dist: aiodns>=3.0.0; extra == 'fast'
|
||||
Requires-Dist: uvloop>=0.17.0; ((sys_platform == 'darwin' or sys_platform == 'linux') and platform_python_implementation != 'PyPy' and python_version < '3.13') and extra == 'fast'
|
||||
Requires-Dist: uvloop>=0.21.0; ((sys_platform == 'darwin' or sys_platform == 'linux') and platform_python_implementation != 'PyPy' and python_version >= '3.13') and extra == 'fast'
|
||||
Provides-Extra: i18n
|
||||
Requires-Dist: babel~=2.13.0; extra == 'i18n'
|
||||
Provides-Extra: mongo
|
||||
Requires-Dist: motor<3.7.0,>=3.3.2; extra == 'mongo'
|
||||
Provides-Extra: proxy
|
||||
Requires-Dist: aiohttp-socks~=0.8.3; extra == 'proxy'
|
||||
Provides-Extra: redis
|
||||
Requires-Dist: redis[hiredis]<5.1.0,>=5.0.1; extra == 'redis'
|
||||
Provides-Extra: test
|
||||
Requires-Dist: aresponses~=2.1.6; extra == 'test'
|
||||
Requires-Dist: pycryptodomex~=3.19.0; extra == 'test'
|
||||
Requires-Dist: pytest-aiohttp~=1.0.5; extra == 'test'
|
||||
Requires-Dist: pytest-asyncio~=0.21.1; extra == 'test'
|
||||
Requires-Dist: pytest-cov~=4.1.0; extra == 'test'
|
||||
Requires-Dist: pytest-html~=4.0.2; extra == 'test'
|
||||
Requires-Dist: pytest-lazy-fixture~=0.6.3; extra == 'test'
|
||||
Requires-Dist: pytest-mock~=3.12.0; extra == 'test'
|
||||
Requires-Dist: pytest-mypy~=0.10.3; extra == 'test'
|
||||
Requires-Dist: pytest~=7.4.2; extra == 'test'
|
||||
Requires-Dist: pytz~=2023.3; extra == 'test'
|
||||
Description-Content-Type: text/x-rst
|
||||
|
||||
#######
|
||||
aiogram
|
||||
#######
|
||||
|
||||
.. image:: https://img.shields.io/pypi/l/aiogram.svg?style=flat-square
|
||||
:target: https://opensource.org/licenses/MIT
|
||||
:alt: MIT License
|
||||
|
||||
.. image:: https://img.shields.io/pypi/status/aiogram.svg?style=flat-square
|
||||
:target: https://pypi.python.org/pypi/aiogram
|
||||
:alt: PyPi status
|
||||
|
||||
.. image:: https://img.shields.io/pypi/v/aiogram.svg?style=flat-square
|
||||
:target: https://pypi.python.org/pypi/aiogram
|
||||
:alt: PyPi Package Version
|
||||
|
||||
.. image:: https://img.shields.io/pypi/dm/aiogram.svg?style=flat-square
|
||||
:target: https://pypi.python.org/pypi/aiogram
|
||||
:alt: Downloads
|
||||
|
||||
.. image:: https://img.shields.io/pypi/pyversions/aiogram.svg?style=flat-square
|
||||
:target: https://pypi.python.org/pypi/aiogram
|
||||
:alt: Supported python versions
|
||||
|
||||
.. image:: https://img.shields.io/badge/dynamic/json?color=blue&logo=telegram&label=Telegram%20Bot%20API&query=%24.api.version&url=https%3A%2F%2Fraw.githubusercontent.com%2Faiogram%2Faiogram%2Fdev-3.x%2F.butcher%2Fschema%2Fschema.json&style=flat-square
|
||||
:target: https://core.telegram.org/bots/api
|
||||
:alt: Telegram Bot API
|
||||
|
||||
.. image:: https://img.shields.io/github/actions/workflow/status/aiogram/aiogram/tests.yml?branch=dev-3.x&style=flat-square
|
||||
:target: https://github.com/aiogram/aiogram/actions
|
||||
:alt: Tests
|
||||
|
||||
.. image:: https://img.shields.io/codecov/c/github/aiogram/aiogram?style=flat-square
|
||||
:target: https://app.codecov.io/gh/aiogram/aiogram
|
||||
:alt: Codecov
|
||||
|
||||
**aiogram** is a modern and fully asynchronous framework for
|
||||
`Telegram Bot API <https://core.telegram.org/bots/api>`_ written in Python 3.8+ using
|
||||
`asyncio <https://docs.python.org/3/library/asyncio.html>`_ and
|
||||
`aiohttp <https://github.com/aio-libs/aiohttp>`_.
|
||||
|
||||
Make your bots faster and more powerful!
|
||||
|
||||
Documentation:
|
||||
- 🇺🇸 `English <https://docs.aiogram.dev/en/dev-3.x/>`_
|
||||
- 🇺🇦 `Ukrainian <https://docs.aiogram.dev/uk_UA/dev-3.x/>`_
|
||||
|
||||
|
||||
Features
|
||||
========
|
||||
|
||||
- Asynchronous (`asyncio docs <https://docs.python.org/3/library/asyncio.html>`_, :pep:`492`)
|
||||
- Has type hints (:pep:`484`) and can be used with `mypy <http://mypy-lang.org/>`_
|
||||
- Supports `PyPy <https://www.pypy.org/>`_
|
||||
- Supports `Telegram Bot API 8.1 <https://core.telegram.org/bots/api>`_ and gets fast updates to the latest versions of the Bot API
|
||||
- Telegram Bot API integration code was `autogenerated <https://github.com/aiogram/tg-codegen>`_ and can be easily re-generated when API gets updated
|
||||
- Updates router (Blueprints)
|
||||
- Has Finite State Machine
|
||||
- Uses powerful `magic filters <https://docs.aiogram.dev/en/latest/dispatcher/filters/magic_filters.html#magic-filters>`_
|
||||
- Middlewares (incoming updates and API calls)
|
||||
- Provides `Replies into Webhook <https://core.telegram.org/bots/faq#how-can-i-make-requests-in-response-to-updates>`_
|
||||
- Integrated I18n/L10n support with GNU Gettext (or Fluent)
|
||||
|
||||
|
||||
.. warning::
|
||||
|
||||
It is strongly advised that you have prior experience working
|
||||
with `asyncio <https://docs.python.org/3/library/asyncio.html>`_
|
||||
before beginning to use **aiogram**.
|
||||
|
||||
If you have any questions, you can visit our community chats on Telegram:
|
||||
|
||||
- 🇺🇸 `@aiogram <https://t.me/aiogram>`_
|
||||
- 🇺🇦 `@aiogramua <https://t.me/aiogramua>`_
|
||||
- 🇺🇿 `@aiogram_uz <https://t.me/aiogram_uz>`_
|
||||
- 🇰🇿 `@aiogram_kz <https://t.me/aiogram_kz>`_
|
||||
- 🇷🇺 `@aiogram_ru <https://t.me/aiogram_ru>`_
|
||||
- 🇮🇷 `@aiogram_fa <https://t.me/aiogram_fa>`_
|
||||
- 🇮🇹 `@aiogram_it <https://t.me/aiogram_it>`_
|
||||
- 🇧🇷 `@aiogram_br <https://t.me/aiogram_br>`_
|
@@ -1,987 +0,0 @@
|
||||
aiogram-3.16.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
aiogram-3.16.0.dist-info/METADATA,sha256=9yhjeqn7Ttwig1G-VpDPSAoVDZ44yv117cYiu5Yxxdg,7579
|
||||
aiogram-3.16.0.dist-info/RECORD,,
|
||||
aiogram-3.16.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
aiogram-3.16.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
||||
aiogram-3.16.0.dist-info/licenses/LICENSE,sha256=kTEqDVZ6fYSuFKAER9NvxX60epaWBKI_h-xGsoiU6Iw,1070
|
||||
aiogram/__init__.py,sha256=hzEKX_gFXmp5n4GXZEU80SJep1_FAH9owAnFTqd9nK0,948
|
||||
aiogram/__meta__.py,sha256=IOnLqvH1y-1cyCqiC-TMyabydnglsahpB7IOfxwwMQE,47
|
||||
aiogram/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiogram/__pycache__/__meta__.cpython-311.pyc,,
|
||||
aiogram/__pycache__/exceptions.cpython-311.pyc,,
|
||||
aiogram/__pycache__/loggers.cpython-311.pyc,,
|
||||
aiogram/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
aiogram/client/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiogram/client/__pycache__/bot.cpython-311.pyc,,
|
||||
aiogram/client/__pycache__/context_controller.cpython-311.pyc,,
|
||||
aiogram/client/__pycache__/default.cpython-311.pyc,,
|
||||
aiogram/client/__pycache__/telegram.cpython-311.pyc,,
|
||||
aiogram/client/bot.py,sha256=P2mTS6-y1iDYFizmmLkRnxb73iW6H20TiPpd7CuPLPQ,279448
|
||||
aiogram/client/context_controller.py,sha256=rAminUBsB3K5FDyj-WQopkD1e94c7GrGVXNyaqPbXZ0,761
|
||||
aiogram/client/default.py,sha256=sqctTqHKsc69UBGh4sJeFbihGH5feDudb685CbMtdDU,2750
|
||||
aiogram/client/session/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
aiogram/client/session/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiogram/client/session/__pycache__/aiohttp.cpython-311.pyc,,
|
||||
aiogram/client/session/__pycache__/base.cpython-311.pyc,,
|
||||
aiogram/client/session/aiohttp.py,sha256=q2OZLVEdz3LghDlEC5KfDEJJLtwYEbfJMXEmsVNnRcQ,7197
|
||||
aiogram/client/session/base.py,sha256=e3n5NrwL6L-pFhLetTgBg76uLJDxDP6jQqyxPgjtI_0,8335
|
||||
aiogram/client/session/middlewares/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
aiogram/client/session/middlewares/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiogram/client/session/middlewares/__pycache__/base.cpython-311.pyc,,
|
||||
aiogram/client/session/middlewares/__pycache__/manager.cpython-311.pyc,,
|
||||
aiogram/client/session/middlewares/__pycache__/request_logging.cpython-311.pyc,,
|
||||
aiogram/client/session/middlewares/base.py,sha256=ck8-iOnaYO2FHb3Yjq6E_TZwiPMg8w8THOXqyHDLjro,1394
|
||||
aiogram/client/session/middlewares/manager.py,sha256=c1CS6S_UvxYVAfCq6MZ4Laet6sxReEmQ915XltTJR5o,1903
|
||||
aiogram/client/session/middlewares/request_logging.py,sha256=_nUsciMnQeTZ-_nJw3A3NNBlGWzGqKMqYw2oJqJw3s8,1183
|
||||
aiogram/client/telegram.py,sha256=cu0HUZqwPzvZp-tMI3yewmnNZ78aTpFfEF0ZZVf0qAw,3080
|
||||
aiogram/dispatcher/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
aiogram/dispatcher/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiogram/dispatcher/__pycache__/dispatcher.cpython-311.pyc,,
|
||||
aiogram/dispatcher/__pycache__/flags.cpython-311.pyc,,
|
||||
aiogram/dispatcher/__pycache__/router.cpython-311.pyc,,
|
||||
aiogram/dispatcher/dispatcher.py,sha256=j3V5oi-nBUT1CBSBAs8lbCRQNIveZ9sVOJmUHnuJEqE,23205
|
||||
aiogram/dispatcher/event/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
aiogram/dispatcher/event/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiogram/dispatcher/event/__pycache__/bases.cpython-311.pyc,,
|
||||
aiogram/dispatcher/event/__pycache__/event.cpython-311.pyc,,
|
||||
aiogram/dispatcher/event/__pycache__/handler.cpython-311.pyc,,
|
||||
aiogram/dispatcher/event/__pycache__/telegram.cpython-311.pyc,,
|
||||
aiogram/dispatcher/event/bases.py,sha256=Piod0CEyGvBOwEuE7e70JMQal4XFilFD3NMinR2bEyE,871
|
||||
aiogram/dispatcher/event/event.py,sha256=YXOroGX5Mj-5w6Jgl9oPf-muIp6ijeWjNJ3hEr2mA68,1352
|
||||
aiogram/dispatcher/event/handler.py,sha256=rgV8j1x2a8qpmWCue1-uQ3fRzrc8qDdhKNJBkBnFSYo,3631
|
||||
aiogram/dispatcher/event/telegram.py,sha256=hMY9TulAbD6nhNnoPOk1KhRa3SjzSP1xovNS6zT-bkU,4757
|
||||
aiogram/dispatcher/flags.py,sha256=vEevCfweZKDCEW2tA5E3UbqMH-TjDBI0ujf7ktzsx9o,3479
|
||||
aiogram/dispatcher/middlewares/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
aiogram/dispatcher/middlewares/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiogram/dispatcher/middlewares/__pycache__/base.cpython-311.pyc,,
|
||||
aiogram/dispatcher/middlewares/__pycache__/error.cpython-311.pyc,,
|
||||
aiogram/dispatcher/middlewares/__pycache__/manager.cpython-311.pyc,,
|
||||
aiogram/dispatcher/middlewares/__pycache__/user_context.cpython-311.pyc,,
|
||||
aiogram/dispatcher/middlewares/base.py,sha256=czbD9IDLoHb6pf6HisRGyG8pAQMLbC4R5k-iuTIWSNU,784
|
||||
aiogram/dispatcher/middlewares/error.py,sha256=xDfQxTo9PT1qXvE35OGesDi7WydeQeB4zgT07eXM5G4,1119
|
||||
aiogram/dispatcher/middlewares/manager.py,sha256=-ivUdff-Addpd_s_AlDA4RaVsMJmzgWwvt2DIqITnBw,2166
|
||||
aiogram/dispatcher/middlewares/user_context.py,sha256=QKD5eDq1MkQRU3mNeTwwdgc6KZo9Ik_P4x-tf9u_vvg,7260
|
||||
aiogram/dispatcher/router.py,sha256=mvFBRbleGea-TfZG496N1Fv33kg01HEG0v4pjrQbcUE,10703
|
||||
aiogram/enums/__init__.py,sha256=oQH8dIPtHKcgQwX6k6-EIda0PLM_HWyyPy5Oft1BSoY,2014
|
||||
aiogram/enums/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/bot_command_scope_type.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/chat_action.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/chat_boost_source_type.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/chat_member_status.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/chat_type.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/content_type.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/currency.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/dice_emoji.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/encrypted_passport_element.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/inline_query_result_type.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/input_media_type.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/input_paid_media_type.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/keyboard_button_poll_type_type.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/mask_position_point.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/menu_button_type.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/message_entity_type.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/message_origin_type.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/paid_media_type.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/parse_mode.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/passport_element_error_type.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/poll_type.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/reaction_type_type.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/revenue_withdrawal_state_type.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/sticker_format.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/sticker_type.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/topic_icon_color.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/transaction_partner_type.cpython-311.pyc,,
|
||||
aiogram/enums/__pycache__/update_type.cpython-311.pyc,,
|
||||
aiogram/enums/bot_command_scope_type.py,sha256=aPn5UKE6AN5BpK9kTH1ffJzG3qUOWFu5lyZOifMu5so,477
|
||||
aiogram/enums/chat_action.py,sha256=KKItRU_RQuNzFMrAtc67Pn0aT4rZuuynpH6-yXfBhRY,972
|
||||
aiogram/enums/chat_boost_source_type.py,sha256=80MfT0G_9-uv-7MsTs0lZjtJiA7EaUmqYd5b3vH6JtU,277
|
||||
aiogram/enums/chat_member_status.py,sha256=OLr5ZfkZocicy1t5i30g7ufR8kujBPHENzR5UHnsDpc,334
|
||||
aiogram/enums/chat_type.py,sha256=1Oi1TYITumT8jZritu1fgHNKDvK9otlAhPm4soyBKQQ,280
|
||||
aiogram/enums/content_type.py,sha256=sSTHtq4LqeYB4J3zFug1HkhVuORSdcT7g91ZQTjOZrE,2311
|
||||
aiogram/enums/currency.py,sha256=P5S_e7Y3wYmODiaK_8Fz0MHVwJXkt1P9Y3gd2SGo1iU,1563
|
||||
aiogram/enums/dice_emoji.py,sha256=9KlOPTQlgt-6d3myDEWWUTB9H8BrE_LRaOZvBM2ceWs,303
|
||||
aiogram/enums/encrypted_passport_element.py,sha256=m0-tAF9myf6FwPbsuJgj4AYvywzLMzzltUgrqWgGVws,704
|
||||
aiogram/enums/inline_query_result_type.py,sha256=HGNN5aOg_jZbE4NNfHs21M-xK5cj2rBar4-C77T73YI,465
|
||||
aiogram/enums/input_media_type.py,sha256=BfCDkzFOjrzJSo2syY2lq3E3JP8AdlGemp7qMnAupw0,291
|
||||
aiogram/enums/input_paid_media_type.py,sha256=KoqJo7AelAiY8pmS1mRBuQLz97hedWFImEEVFnEoMmY,247
|
||||
aiogram/enums/keyboard_button_poll_type_type.py,sha256=vPjequaOO5zySi7hiQjyVIfQl-jhtpgCGHYMR7DOYWY,324
|
||||
aiogram/enums/mask_position_point.py,sha256=lhlx8U-9gtGn_LPiSOHWBe1u8YTLZCERs5x8DRmUubM,290
|
||||
aiogram/enums/menu_button_type.py,sha256=4FDz7HKaVtfBlvXObCOVAUmyQQvRsyPi0Vu_Kc-HbDs,264
|
||||
aiogram/enums/message_entity_type.py,sha256=00ioN4bPLNUYvCL_nJzp7rNUPhIqNOqoWY3PjiC4ob8,703
|
||||
aiogram/enums/message_origin_type.py,sha256=qWHgXPzpuhsTcLx-huqNS1l36JSwqbsCY70_d20nreM,279
|
||||
aiogram/enums/paid_media_type.py,sha256=FrGQyXq9bimIb8_b0hpuqYG4mWVruoBYkSC6drd7hw4,261
|
||||
aiogram/enums/parse_mode.py,sha256=t5F3LaNLsUOaNQuYlQseWt36suA-oRgr_uScGEU8TKU,234
|
||||
aiogram/enums/passport_element_error_type.py,sha256=HCcvvc8DDUNRD-mdFgFqMEFlr_4pa5Us5_U6pO2wXsc,471
|
||||
aiogram/enums/poll_type.py,sha256=DluT-wQcOGqBgQimYLlO6OlTIIYnnbtHOmY9pjqVToo,200
|
||||
aiogram/enums/reaction_type_type.py,sha256=hNCHqf9dVAWkgRgNBH50KSFsc7h9OKOwTcuGy7yh42M,251
|
||||
aiogram/enums/revenue_withdrawal_state_type.py,sha256=ZVw59f9-RYG00TJdSHnZo_LTbdR_J8RmkhDCV4C8AFg,290
|
||||
aiogram/enums/sticker_format.py,sha256=UmbwulTvkG7TFwS2twsblqiBj89jeEWY-y7P7Ah2qgo,235
|
||||
aiogram/enums/sticker_type.py,sha256=XonGtnasf3tXwoD2DVRx5E16rHCE5VqgAFSfcFMIAGU,278
|
||||
aiogram/enums/topic_icon_color.py,sha256=q-DilvJsgVmz5VafMOxj1BKJcMoHzpRrbatTPE4inxk,399
|
||||
aiogram/enums/transaction_partner_type.py,sha256=zuEwp8BbEK69exgl3RecK5qLLAIWeJDAs-cZbCR5Dvg,383
|
||||
aiogram/enums/update_type.py,sha256=t0xz16mEz1FiX0mihM0pu6A9AQ252ZM8JxvhiBJsfuY,1136
|
||||
aiogram/exceptions.py,sha256=Y6wDVG2fyoczPn15U5epm_nnTx8eTC3CgX19SzyiqOE,5153
|
||||
aiogram/filters/__init__.py,sha256=w7mWuJOIpLDZyUt1eznzMeF-o1UrstHQ-OYbBHHG6ek,1031
|
||||
aiogram/filters/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiogram/filters/__pycache__/base.cpython-311.pyc,,
|
||||
aiogram/filters/__pycache__/callback_data.cpython-311.pyc,,
|
||||
aiogram/filters/__pycache__/chat_member_updated.cpython-311.pyc,,
|
||||
aiogram/filters/__pycache__/command.cpython-311.pyc,,
|
||||
aiogram/filters/__pycache__/exception.cpython-311.pyc,,
|
||||
aiogram/filters/__pycache__/logic.cpython-311.pyc,,
|
||||
aiogram/filters/__pycache__/magic_data.cpython-311.pyc,,
|
||||
aiogram/filters/__pycache__/state.cpython-311.pyc,,
|
||||
aiogram/filters/base.py,sha256=6mCB2nSjqskDDl9mKCZ3SghhwQ1jryaSTd5PvWii3bM,2005
|
||||
aiogram/filters/callback_data.py,sha256=WncwuvQ9vEITtPT7YNQj-29bgRJ3o2lKp8tytC_AeNo,6227
|
||||
aiogram/filters/chat_member_updated.py,sha256=3VsiMYLK6L7AfLS7RQRWwjXThWGN7gj4NAYnR0Wdr8I,7484
|
||||
aiogram/filters/command.py,sha256=IXb54dwKHLz-Jaq2_HHn2si7r5iAr9pYW3sSxD8szCk,9957
|
||||
aiogram/filters/exception.py,sha256=HbJIOVrXHh0_LkID6b-yn8Xow-llmLqKYmK0_tqB4YA,1488
|
||||
aiogram/filters/logic.py,sha256=2M-fYY8m1ybX00wFn_8toRHj5alTfy4T6zkIkYrQZbM,2174
|
||||
aiogram/filters/magic_data.py,sha256=Y07K9NLDXpXV0EuFR7GR7Yq4SzCYaD3XJsvDH-6JFkQ,718
|
||||
aiogram/filters/state.py,sha256=A4GuSAo5KPdSZMetCC9crrfbJ-yghLunJUVYkOdBPTI,1448
|
||||
aiogram/fsm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
aiogram/fsm/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiogram/fsm/__pycache__/context.cpython-311.pyc,,
|
||||
aiogram/fsm/__pycache__/middleware.cpython-311.pyc,,
|
||||
aiogram/fsm/__pycache__/scene.cpython-311.pyc,,
|
||||
aiogram/fsm/__pycache__/state.cpython-311.pyc,,
|
||||
aiogram/fsm/__pycache__/strategy.cpython-311.pyc,,
|
||||
aiogram/fsm/context.py,sha256=LC6KZoiVQNDmag9jTlCOoBQQ73pobx7E-ovcO_f9tjc,1427
|
||||
aiogram/fsm/middleware.py,sha256=4MsKWzr93tzLTmv3dph3pKhznuX9EGsrhBhCb6mhzPo,3755
|
||||
aiogram/fsm/scene.py,sha256=zXLdJDuIi7AMnILVc4dg-pHBUMkblLRSTVQZL2XiuRg,32622
|
||||
aiogram/fsm/state.py,sha256=T0sPq1_JV5Jq1jVKu67bUQ0-y9Kqsk3hGpj7PgjpacQ,5640
|
||||
aiogram/fsm/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
aiogram/fsm/storage/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiogram/fsm/storage/__pycache__/base.cpython-311.pyc,,
|
||||
aiogram/fsm/storage/__pycache__/memory.cpython-311.pyc,,
|
||||
aiogram/fsm/storage/__pycache__/mongo.cpython-311.pyc,,
|
||||
aiogram/fsm/storage/__pycache__/redis.cpython-311.pyc,,
|
||||
aiogram/fsm/storage/base.py,sha256=1duD0gW2ikXhFW_Ag3g4Bzr6O0h_lW0hcs1vjYy6hpI,5939
|
||||
aiogram/fsm/storage/memory.py,sha256=E-cSr5I5gLmE8tGmUd9RrghxOXKerlIPkb0izRjg8U0,2612
|
||||
aiogram/fsm/storage/mongo.py,sha256=xGvz9rLr6ji8BhumZb1FTvQ5RvmlGquhLAPe1-vi9ms,4880
|
||||
aiogram/fsm/storage/redis.py,sha256=7ZyaB-AMNEITjdYVn24Bha28_MIFRPX41mn5_0sEtiY,5322
|
||||
aiogram/fsm/strategy.py,sha256=RUDc6kMae9ZFbyC1bdbAIRz6GoeaIHFzXCXRu8p3Kn0,1147
|
||||
aiogram/handlers/__init__.py,sha256=XVErtJHhSmg4ytiDTP9J5pQY0RwBN1TsjT5v-Ls7RE4,800
|
||||
aiogram/handlers/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiogram/handlers/__pycache__/base.cpython-311.pyc,,
|
||||
aiogram/handlers/__pycache__/callback_query.cpython-311.pyc,,
|
||||
aiogram/handlers/__pycache__/chat_member.cpython-311.pyc,,
|
||||
aiogram/handlers/__pycache__/chosen_inline_result.cpython-311.pyc,,
|
||||
aiogram/handlers/__pycache__/error.cpython-311.pyc,,
|
||||
aiogram/handlers/__pycache__/inline_query.cpython-311.pyc,,
|
||||
aiogram/handlers/__pycache__/message.cpython-311.pyc,,
|
||||
aiogram/handlers/__pycache__/poll.cpython-311.pyc,,
|
||||
aiogram/handlers/__pycache__/pre_checkout_query.cpython-311.pyc,,
|
||||
aiogram/handlers/__pycache__/shipping_query.cpython-311.pyc,,
|
||||
aiogram/handlers/base.py,sha256=SKLNknDSxAItRHwPMJanOPFztWakJQCun4myH9TBNik,1097
|
||||
aiogram/handlers/callback_query.py,sha256=Ufz3dpue809iUWaXP_cBmaZLEvlI1l3JdjkqN3UoHOs,1027
|
||||
aiogram/handlers/chat_member.py,sha256=TCr1m47duHFUpL92W56ok0hF1k0NN3Yk88-1zzEsYmw,322
|
||||
aiogram/handlers/chosen_inline_result.py,sha256=NjAPc5EgBb8V4p3WVpcPNPd8b1OApymvBN-I75EYMQo,410
|
||||
aiogram/handlers/error.py,sha256=86pedHPBgYxXYwrW00s0cadf_lRP6TeHEG0goJ6zNJk,352
|
||||
aiogram/handlers/inline_query.py,sha256=sOkT3uMuvamMnSTxct-cdQFng6GBqaOlSNV4aHUbVPQ,381
|
||||
aiogram/handlers/message.py,sha256=I6R4TJ8V6bbGVppmxmGSxIkCzeN9JMn1CDojywWrt50,721
|
||||
aiogram/handlers/poll.py,sha256=Bn075JIux1lNPjKWH3woV_OzMcvPgPvtkgp4W22mUX8,396
|
||||
aiogram/handlers/pre_checkout_query.py,sha256=ZO0iZFVwRz4CtBWIVLds8JoHhMPqCahz6lwOfR4dEkg,321
|
||||
aiogram/handlers/shipping_query.py,sha256=ku14YRYvddTbHeKoIwb2oDpfrpsetFC1m2BwIsNwoAs,314
|
||||
aiogram/loggers.py,sha256=3MCGSmwgXXsWbgtSaTc6bPSwVOIe8FkQZglc0QLVvsY,257
|
||||
aiogram/methods/__init__.py,sha256=8_DZywxqZ1jw4j2qzHzLtaakG3ziLhg671HeEGrhqN4,9978
|
||||
aiogram/methods/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/add_sticker_to_set.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/answer_callback_query.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/answer_inline_query.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/answer_pre_checkout_query.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/answer_shipping_query.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/answer_web_app_query.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/approve_chat_join_request.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/ban_chat_member.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/ban_chat_sender_chat.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/base.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/close.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/close_forum_topic.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/close_general_forum_topic.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/copy_message.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/copy_messages.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/create_chat_invite_link.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/create_chat_subscription_invite_link.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/create_forum_topic.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/create_invoice_link.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/create_new_sticker_set.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/decline_chat_join_request.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/delete_chat_photo.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/delete_chat_sticker_set.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/delete_forum_topic.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/delete_message.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/delete_messages.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/delete_my_commands.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/delete_sticker_from_set.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/delete_sticker_set.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/delete_webhook.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/edit_chat_invite_link.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/edit_chat_subscription_invite_link.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/edit_forum_topic.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/edit_general_forum_topic.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/edit_message_caption.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/edit_message_live_location.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/edit_message_media.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/edit_message_reply_markup.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/edit_message_text.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/edit_user_star_subscription.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/export_chat_invite_link.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/forward_message.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/forward_messages.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_available_gifts.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_business_connection.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_chat.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_chat_administrators.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_chat_member.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_chat_member_count.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_chat_menu_button.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_custom_emoji_stickers.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_file.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_forum_topic_icon_stickers.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_game_high_scores.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_me.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_my_commands.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_my_default_administrator_rights.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_my_description.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_my_name.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_my_short_description.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_star_transactions.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_sticker_set.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_updates.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_user_chat_boosts.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_user_profile_photos.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/get_webhook_info.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/hide_general_forum_topic.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/leave_chat.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/log_out.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/pin_chat_message.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/promote_chat_member.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/refund_star_payment.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/reopen_forum_topic.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/reopen_general_forum_topic.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/replace_sticker_in_set.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/restrict_chat_member.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/revoke_chat_invite_link.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/save_prepared_inline_message.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_animation.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_audio.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_chat_action.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_contact.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_dice.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_document.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_game.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_gift.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_invoice.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_location.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_media_group.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_message.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_paid_media.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_photo.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_poll.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_sticker.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_venue.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_video.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_video_note.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/send_voice.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_chat_administrator_custom_title.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_chat_description.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_chat_menu_button.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_chat_permissions.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_chat_photo.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_chat_sticker_set.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_chat_title.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_custom_emoji_sticker_set_thumbnail.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_game_score.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_message_reaction.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_my_commands.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_my_default_administrator_rights.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_my_description.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_my_name.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_my_short_description.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_passport_data_errors.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_sticker_emoji_list.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_sticker_keywords.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_sticker_mask_position.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_sticker_position_in_set.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_sticker_set_thumbnail.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_sticker_set_title.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_user_emoji_status.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/set_webhook.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/stop_message_live_location.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/stop_poll.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/unban_chat_member.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/unban_chat_sender_chat.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/unhide_general_forum_topic.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/unpin_all_chat_messages.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/unpin_all_forum_topic_messages.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/unpin_all_general_forum_topic_messages.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/unpin_chat_message.cpython-311.pyc,,
|
||||
aiogram/methods/__pycache__/upload_sticker_file.cpython-311.pyc,,
|
||||
aiogram/methods/add_sticker_to_set.py,sha256=PR2B-SDNNYLaH70oevadRNAoiUjFQXLffGSIhQ7uah4,1443
|
||||
aiogram/methods/answer_callback_query.py,sha256=YVozC3bMDE8YoH6x5TipzWiXCwdWLAU96GWOJTxf1AE,2903
|
||||
aiogram/methods/answer_inline_query.py,sha256=J6j2jMm_Ag4mPQpygCiYmnwpQDpacJ1QJI98fQ8Ec6I,6011
|
||||
aiogram/methods/answer_pre_checkout_query.py,sha256=5peOULN2DO0VoK3nEAnsN-E9RWAH5ab64UUc-4apRHk,2172
|
||||
aiogram/methods/answer_shipping_query.py,sha256=o-yGoUslrd0TCOJTtLQXFMaJysyhknKoMz74eDJD_Cc,2248
|
||||
aiogram/methods/answer_web_app_query.py,sha256=AXM-hDf_xIarwburmGT27ZoKFoGsbcVbPNM_EHUHKVo,3676
|
||||
aiogram/methods/approve_chat_join_request.py,sha256=KUetMV7jHSB9_v702JlSI-CVlJMHUCNstvjUC0GU3i4,1281
|
||||
aiogram/methods/ban_chat_member.py,sha256=hfHkT_Ucg-26oVtvRQwGvijDMn7uaV84agEY7vIEp-E,2481
|
||||
aiogram/methods/ban_chat_sender_chat.py,sha256=rr77ixJufnD9bWevxTaSHCcJVh3lIf19JGLEctMMm7A,1569
|
||||
aiogram/methods/base.py,sha256=MJCjm1i9q6mm0gDvt_MErGojvaxkzOfPPyAhc3oWyrQ,2732
|
||||
aiogram/methods/close.py,sha256=Bnzle__tO6tCMMLHkN1E00ypkrdQ0RjhkBNxhjDOq3k,593
|
||||
aiogram/methods/close_forum_topic.py,sha256=njPMjFb7CkLYbjEuNWPrSDh2HSpqlmO76B9Xs_Xahco,1475
|
||||
aiogram/methods/close_general_forum_topic.py,sha256=lLWx-ZgE4eV15D2yLXg1wWVECfcN7_1y2XA5vqr1d84,1223
|
||||
aiogram/methods/copy_message.py,sha256=stDcUXFLuB2UJUOJv8UkSmHepYxg2d7cEwx4hgJ91Ro,6566
|
||||
aiogram/methods/copy_messages.py,sha256=RFANcFfHrKypebIvjPqRDFy_QL8s4csFeNvd66GpCEk,3287
|
||||
aiogram/methods/create_chat_invite_link.py,sha256=Snalw6e_zk5g5FI2wKB4Pr0qbGS1PbjIcq7567RC5YE,2545
|
||||
aiogram/methods/create_chat_subscription_invite_link.py,sha256=ulylrmNJXJa7hipKx7j_2wOeZSVgufPaW2h5JFO2OIw,2508
|
||||
aiogram/methods/create_forum_topic.py,sha256=FuJ8R-jkpfk7hPKe6pffiUQE21Hhh22G7cFMCFe5kok,2188
|
||||
aiogram/methods/create_invoice_link.py,sha256=w9lcW0IqeNNZn42dyEBFTpK8OCgBkeEnabzFuAcB6WE,7572
|
||||
aiogram/methods/create_new_sticker_set.py,sha256=GqZvQOMXgN1gf44dma_soOIQx1B1eOonyQX1OFaxFxQ,2922
|
||||
aiogram/methods/decline_chat_join_request.py,sha256=19Sj8OHe6erv3_E4p-Sw_y8XygNYOWrPI5S23CU5P1w,1281
|
||||
aiogram/methods/delete_chat_photo.py,sha256=0nrFbxWyO7R0pVMAWook7VRXAIU-AeEr_wpiFvyLssQ,1194
|
||||
aiogram/methods/delete_chat_sticker_set.py,sha256=KaRyvzLt1ystCbkptimtxqUM_4_RzpI7Sl91heSVlKc,1348
|
||||
aiogram/methods/delete_forum_topic.py,sha256=LrncMipGRW2Be4bYFzSYMjydvRijmPU5Owtmb61e374,1470
|
||||
aiogram/methods/delete_message.py,sha256=wCMd8oHwYETY1Nk2vP4DYhu-sdrm-LqhQBKPAgQQhSY,1956
|
||||
aiogram/methods/delete_messages.py,sha256=at3mIij12NykE2s8ABSfCf26CkNGEe_Zs5Am-I-0C84,1395
|
||||
aiogram/methods/delete_my_commands.py,sha256=LiYVWXeqBxs_hUbq6pQ1h3zSKUyzw7ahdaXb1esAH8Q,2608
|
||||
aiogram/methods/delete_sticker_from_set.py,sha256=J2PsBRRTBks5TDlp4mlmubem7MSWKh8jzJMmLJQV9CI,944
|
||||
aiogram/methods/delete_sticker_set.py,sha256=csUT6RkdqmOy0K7vT2QXXR_YJfpQ78S31WYttFqEPY8,908
|
||||
aiogram/methods/delete_webhook.py,sha256=7kfmOOSlujfXV5JZEozbuQQzNrX5YV0f6nMvUo5aw_k,1155
|
||||
aiogram/methods/edit_chat_invite_link.py,sha256=N2RqH2DHbRK-zF97jtHlhMV2YykBgHgpqw_iDz8KQRw,2564
|
||||
aiogram/methods/edit_chat_subscription_invite_link.py,sha256=AvDlMClqa00KJnf4sXZkdOYGBErGtuwLMeHEM0AND5E,1610
|
||||
aiogram/methods/edit_forum_topic.py,sha256=hELFkBuB_6I3_y2xencOolPXPUjEK3xXCgfzC4lAuCA,2195
|
||||
aiogram/methods/edit_general_forum_topic.py,sha256=PK37qgJRVISQWhYAWlg3LNGmgneVdQxpJCa1dMiq_uY,1306
|
||||
aiogram/methods/edit_message_caption.py,sha256=P4F2rg8DVZN5gxUeupY6UtoseQueoqosJqrwoUdsGLk,3971
|
||||
aiogram/methods/edit_message_live_location.py,sha256=akOy16TytMIR1ONYR8lu8W48HplUl9ugqW-tttrn2Zk,4205
|
||||
aiogram/methods/edit_message_media.py,sha256=1vAqyZI_oK_65k1hBHRKEMi4C1VMmYGXTec5jeBN7wk,3563
|
||||
aiogram/methods/edit_message_reply_markup.py,sha256=H5elelToPCzLoOsGDDfOa7nXRQ10AMhxP13quMGRt1k,2658
|
||||
aiogram/methods/edit_message_text.py,sha256=uoMX4ximNBtcovFBkGAvKIjulDlsdI6QAV7oMvyEtNk,4396
|
||||
aiogram/methods/edit_user_star_subscription.py,sha256=d1iE8CbFm-gDcG98xFfPbW8oaXDPtuD65FfwofTr20g,1678
|
||||
aiogram/methods/export_chat_invite_link.py,sha256=oC00_UAsmJ7icNtjmnCbQ9sYyJLoOujNJsLIRMyx9qg,1792
|
||||
aiogram/methods/forward_message.py,sha256=LS52l47_L5G2TvVZ3WfckJhxVcl_qFhJqR9mpwA-9AU,2608
|
||||
aiogram/methods/forward_messages.py,sha256=wZhYypMBmtAGA-Ecq6UkSd3wFqFvDsilZGPgE0SxLoE,2768
|
||||
aiogram/methods/get_available_gifts.py,sha256=7I7-5hS5MoRnlPbkp8kjxo50mdRQDBY3BT6lRRGEAro,446
|
||||
aiogram/methods/get_business_connection.py,sha256=wJhKMcBoLcOXTxK1_xG8SR2h85e1sW1C4sWD6L6bTTM,1200
|
||||
aiogram/methods/get_chat.py,sha256=yOPjLV12HVZOk6ch2bUOfyrZBPIhyAXhhHEhiZKEdro,1145
|
||||
aiogram/methods/get_chat_administrators.py,sha256=7g9dt3fKyJxaFSIaCOTDeE43yQIllAFBmQ9GyohUygI,1809
|
||||
aiogram/methods/get_chat_member.py,sha256=pltcJQL_aSljObA_XAVa9chzyC5saahC-jCA85U0Z_E,1857
|
||||
aiogram/methods/get_chat_member_count.py,sha256=phZ05LJUn3EAXBuH_7HqMFOuTg99nyVNjNEVWry1sto,1067
|
||||
aiogram/methods/get_chat_menu_button.py,sha256=Ko5U5PMvTP08x8SkCUddFASaGr-LbtP_4GhvbM-TP7c,1362
|
||||
aiogram/methods/get_custom_emoji_stickers.py,sha256=mj0agT_CquoIu48YeAiy0JWb6ZdGXKiWGT5dnu5xwls,1195
|
||||
aiogram/methods/get_file.py,sha256=FutkpYaOz_xjdU_1FwGY75ZYZ-uqBCZapZBiE5K9sC0,1571
|
||||
aiogram/methods/get_forum_topic_icon_stickers.py,sha256=KbkTvUq447TgRKJ2ak8fkZrNpiDs9f4DFcGy0Yjs7YM,532
|
||||
aiogram/methods/get_game_high_scores.py,sha256=seFMcDr_LE0lDUoJ2nPLfzO-5ZjPyF6gyOfxVcDEOhk,2150
|
||||
aiogram/methods/get_me.py,sha256=gA4vD-v3WYPpZaSTy6mpGZmsV5WXdSHv06EymV9ZQnU,439
|
||||
aiogram/methods/get_my_commands.py,sha256=uvb8iJUUifDO9o953ilIUVFielX9zPgDhF8mBIRgWFs,2458
|
||||
aiogram/methods/get_my_default_administrator_rights.py,sha256=dw1MnQACVfVsQeYs5ikZG1jThB15HR8Trv1xHg_oSLY,1359
|
||||
aiogram/methods/get_my_description.py,sha256=UzgJhr6sl4i4RD9LIYxvTx4z4V3cZMGQavCFucWwv1I,1156
|
||||
aiogram/methods/get_my_name.py,sha256=GGY2ZnZ_uXL5GqRKHJ2uXs5v_LUBqg6yx0NdrBLZoy8,1057
|
||||
aiogram/methods/get_my_short_description.py,sha256=yRQ0ertSdcbEy32FC07FAo12q7eyLEN04h0gkxzpmGE,1203
|
||||
aiogram/methods/get_star_transactions.py,sha256=kCp-vAuYCbogKN6PQ4_ulx4ByBatWbMwuXUTsMib22M,1374
|
||||
aiogram/methods/get_sticker_set.py,sha256=oh9jEInEgKDfOhAu58ex4rUYRCJCk-BTsOAvNa7GPMg,965
|
||||
aiogram/methods/get_updates.py,sha256=LvWmTo059jtv0kVKLUw284FqoelqmVbzJ0weMTJrlcs,3018
|
||||
aiogram/methods/get_user_chat_boosts.py,sha256=2HYUsuZMxrP-YdZO7S4rX0QItzjUN8H01mmwvm2SSkc,1255
|
||||
aiogram/methods/get_user_profile_photos.py,sha256=URseFqr69kRj4-gqNkSl4TsiEaAK78iAyjYrTv4tCpA,1507
|
||||
aiogram/methods/get_webhook_info.py,sha256=8h38GW1au2fAZau2qmXuOnmu-H6kIjXQEms3VKLJf5c,576
|
||||
aiogram/methods/hide_general_forum_topic.py,sha256=dKPkMB4okbduRG9K-Mah5hf6OsKzGg8NrtnTQdcVu78,1270
|
||||
aiogram/methods/leave_chat.py,sha256=m3F4mKwOmJaxk958rbBZqGIRcM7007JMce1S2zpEvPY,1063
|
||||
aiogram/methods/log_out.py,sha256=yBkCbabI7CRBkTHwhJ61KmqazMxiUuGRMhxlzl7BWB4,660
|
||||
aiogram/methods/pin_chat_message.py,sha256=njAbF_yEAZobt9b-0CqxblQpJ2M-jAgZHDpKdw_THAI,2143
|
||||
aiogram/methods/promote_chat_member.py,sha256=BDT9L1MIVTwWrmph-HUe0Rh7kKMPQt4bkMkICPiDfgE,5568
|
||||
aiogram/methods/refund_star_payment.py,sha256=s-eELWhpYoE8ubWNvlYc0dmPGCcBiATS0fU50IXXZ5g,1264
|
||||
aiogram/methods/reopen_forum_topic.py,sha256=TfJtX4zGVNYjjhivHRwBFV9sbWINhr8k_q5lXoLtITw,1480
|
||||
aiogram/methods/reopen_general_forum_topic.py,sha256=kxJtoOauJNWYxqesoT6qeDvXAJujUZvK-3QO5lnFEw8,1287
|
||||
aiogram/methods/replace_sticker_in_set.py,sha256=df80oQuwZsYrbmUixIPxtQ75iUqIMZXsiIyoMZHious,1858
|
||||
aiogram/methods/restrict_chat_member.py,sha256=KFAtkHVDqA4Ny4quy1jCnqH1mxf_5kSo8kDlA_ben4Q,2751
|
||||
aiogram/methods/revoke_chat_invite_link.py,sha256=RrIN4jcxTHaoThF0Dru3d4z7RGEQk0u0cTkNx13Do-s,1526
|
||||
aiogram/methods/save_prepared_inline_message.py,sha256=y4LJCL3T5DR9s9IhBmc3dePVMB5zTtMibs5HLse0wwg,5447
|
||||
aiogram/methods/send_animation.py,sha256=eHPbpRE3KlKpjiP-Yw3Eb1EvL9wT-iX1uejZlj6fPr8,8135
|
||||
aiogram/methods/send_audio.py,sha256=-eNzLTi4zUWwWGN-zQM8ds7mC6_2b65Bjq7orC7AKoA,7591
|
||||
aiogram/methods/send_chat_action.py,sha256=sOrGWv2bA9Przot-gPT1ksZ8UEhPpJeEsd7tPd-06gg,3187
|
||||
aiogram/methods/send_contact.py,sha256=eIOOegKWknSn6JLFLP2YvmGb8QZEBfzGaSkPIH8he_o,5516
|
||||
aiogram/methods/send_dice.py,sha256=-CpttmcZKVBUWealLfPaN1NPdrgJRmMnPP5rxmLkDK0,5286
|
||||
aiogram/methods/send_document.py,sha256=qnxEsi7FDUq0inpZzrcIEWljlJYr55oQ7pJee6ZL2U4,7343
|
||||
aiogram/methods/send_game.py,sha256=JH6trpdVW0Z_9y3QXDuy16TUzjswgQOLx5YWrXoPa9E,4706
|
||||
aiogram/methods/send_gift.py,sha256=OJoKwSaDZVWUGP6Kia3F3VE6wUWKSwonUPY-zkRfZu8,2221
|
||||
aiogram/methods/send_invoice.py,sha256=Zmx_jOYodnRXKSF72DhXNdeRRLEd2_3JXT6nQloEc7o,10595
|
||||
aiogram/methods/send_location.py,sha256=lKr-LIi7STxe17Aj6firxAEuhx0PUn4MVkwj-Hl-Um8,6314
|
||||
aiogram/methods/send_media_group.py,sha256=8U9jpASibib1zjO1oazUgSJp8PW4KXQr7TJu4q5NKf4,4795
|
||||
aiogram/methods/send_message.py,sha256=L2-Q2VmLDA7056Usbd15MfsKHpQ-HJnqQ44l1WP7SNE,6569
|
||||
aiogram/methods/send_paid_media.py,sha256=D0g98FF2EuHEnYkNZpC2d70t3zradPhmSDBHxJHkfYI,5364
|
||||
aiogram/methods/send_photo.py,sha256=7ROPItBh4kiJQX-P6bxXbl1nkKdegfzh0OGi7go5rcM,6949
|
||||
aiogram/methods/send_poll.py,sha256=seHWxfLgBrOYybsLnb_q3Owjfth52Kxlue5rmO2QrmA,8844
|
||||
aiogram/methods/send_sticker.py,sha256=IV5Piwr93mKvOYniUnwR39UkYraW2vkmEQtxoMzo39s,5747
|
||||
aiogram/methods/send_venue.py,sha256=bpAEscX-0BkoUUXqqQyhbei5q-3The4xqLncEGIUUns,6283
|
||||
aiogram/methods/send_video.py,sha256=5HpObStieg1HXVK48eakvjS2Njk98PhfZNLt5BhuyuQ,8351
|
||||
aiogram/methods/send_video_note.py,sha256=ONmBp07CbWQ1K3aAve92bCMg5qSq-3hzjFMCe3zJ15E,6501
|
||||
aiogram/methods/send_voice.py,sha256=I_ZoBjg8i-n3xXkEZpWrdgsiC5x7tT2E6Ftw4aP_-dM,6739
|
||||
aiogram/methods/set_chat_administrator_custom_title.py,sha256=lOizk5Z8-tUh6EOiZ2hRyVSUrP2qQzDHlcKIbJCKgSg,1490
|
||||
aiogram/methods/set_chat_description.py,sha256=AvzTU_XRaTuI9s9iKX_hihCLpsH4F8du3dBQ-wrNZnU,1407
|
||||
aiogram/methods/set_chat_menu_button.py,sha256=5y8sOvgs6cH4sWBa_NuBnsRH7sE8ch0_s4YygG1PbZY,1622
|
||||
aiogram/methods/set_chat_permissions.py,sha256=x42Gmf910ycY0Nf5lCnM1Xe6z5bhjNqUMHA673X1J_A,2159
|
||||
aiogram/methods/set_chat_photo.py,sha256=kHjTl8U-i5B03KaFIEKxQnT8Sgl8CAa_F9kQeFUW_9M,1394
|
||||
aiogram/methods/set_chat_sticker_set.py,sha256=RFNtIcj8Lq8It6L6qoJLCk247RYVgGROdJM5UoF0HSQ,1571
|
||||
aiogram/methods/set_chat_title.py,sha256=X21F3pX37t3z13-4o6WJfQHKVfLPr8c_HGO-vNqI3k0,1275
|
||||
aiogram/methods/set_custom_emoji_sticker_set_thumbnail.py,sha256=E8zURRFNnJnjzxVnYchBta807eCrarjMzpKWp0R5Ypg,1309
|
||||
aiogram/methods/set_game_score.py,sha256=RDiYH61W1aN6WZoRLKI_vDQJz8-7V1I8tP__UbZLw1s,2626
|
||||
aiogram/methods/set_message_reaction.py,sha256=QZv0CHqM8UKe7_lKz5g2CQG4QBSQPtRJB2M9fXALCEw,2451
|
||||
aiogram/methods/set_my_commands.py,sha256=zecvxR_yBdwdLmTL-y8-eYL0X8MGGYA6zIzf7gDcwTs,2797
|
||||
aiogram/methods/set_my_default_administrator_rights.py,sha256=DKX3KXLXbfv-heE5uJfPbcFXQRvNG6ps3ih1bQNa5RY,1750
|
||||
aiogram/methods/set_my_description.py,sha256=ww9IAjtC4X6Ti9cFlnE3dleZ_FKE6byjblGUYn2EqwI,1489
|
||||
aiogram/methods/set_my_name.py,sha256=xqSgEYS3Rgr2ETQlvBuD_VopBsuDX_DZY_MnbsOoJgs,1274
|
||||
aiogram/methods/set_my_short_description.py,sha256=ONiD6HfZxxnHRjPstEmuBqedjQVjZ-lSJPY14sTRPyc,1639
|
||||
aiogram/methods/set_passport_data_errors.py,sha256=vw5FhG7o1N0q8bdBGnp7xmt9lmC2M2qqM-kcRlPkolM,2916
|
||||
aiogram/methods/set_sticker_emoji_list.py,sha256=H4PY-fc-SABtoWZ7Vn4XjNYWEO5702xnt8jRpusU89E,1195
|
||||
aiogram/methods/set_sticker_keywords.py,sha256=mINPtlVYRMpD6nfDTP78wafUNt5LNhub1js78w6T848,1314
|
||||
aiogram/methods/set_sticker_mask_position.py,sha256=eoT5D9VmWuRNsUqyzrHlYWd_bVaK583o3hP_KsoevaI,1450
|
||||
aiogram/methods/set_sticker_position_in_set.py,sha256=QJI3x-tobyjpFoEThjcqGQLjXWdCZTd59ei49Gi2Mcg,1100
|
||||
aiogram/methods/set_sticker_set_thumbnail.py,sha256=l6hozWYpPQI-Y-QI2YxyXopG8ZXzGme-q2vdl4SUJvk,2891
|
||||
aiogram/methods/set_sticker_set_title.py,sha256=kf1H5K3capHR5wlu91DXmP6Q1G_TG_AEJeivppuM-58,1011
|
||||
aiogram/methods/set_user_emoji_status.py,sha256=vaItcEyVzfCwNB7Rr6OwBcUvkNcW1JplZRsyFFH42qA,1921
|
||||
aiogram/methods/set_webhook.py,sha256=NBp2lbCFqapLawqhVTKdMw-SWUHoKqauGhT12ASkP4w,4470
|
||||
aiogram/methods/stop_message_live_location.py,sha256=ZvsRZ_qADXt3Oxxk8-6nvOAHT5b-yL2v4isAxNChE7M,2539
|
||||
aiogram/methods/stop_poll.py,sha256=xs5Bhzdwrny9CueVr1qfe6lOWjPqKoS8te9PYvpTZs4,1933
|
||||
aiogram/methods/unban_chat_member.py,sha256=kCOiIN03O3RZG4esxneAnt87-iC24TKqW4FeAOcBPCY,1919
|
||||
aiogram/methods/unban_chat_sender_chat.py,sha256=JwiCTYpl797vXH1iKEmHdvngNgmN3N5MzTM6Bd5QI3o,1376
|
||||
aiogram/methods/unhide_general_forum_topic.py,sha256=vDxVKNhnBifPmhBxDtIgEGq9DLw5U0E-HUPoIVOEL_I,1223
|
||||
aiogram/methods/unpin_all_chat_messages.py,sha256=1eYhMh4IsLV4x94XEC7oJkkFeiwe1LSpr_sj2ywyvUY,1303
|
||||
aiogram/methods/unpin_all_forum_topic_messages.py,sha256=RDUz0D8kSuayzY0DU0DVo6ez2dUH8VdqBmTSthCECCc,1489
|
||||
aiogram/methods/unpin_all_general_forum_topic_messages.py,sha256=O_PhZuwarHW9I2iFIHggOqgc7QfXtF1GEqZYweOH5PA,1248
|
||||
aiogram/methods/unpin_chat_message.py,sha256=9iiJcGt8sU1vYKKeMGpk7KgMvTXnLysywExpsjWckgs,1978
|
||||
aiogram/methods/upload_sticker_file.py,sha256=TgGArcP8fVpAOM7GRmpbk7GO3sKn2PfBEV--WOo0NKo,1951
|
||||
aiogram/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
aiogram/types/__init__.py,sha256=PlphfdL3sP9HmBO_yeShU1y0UPDnNBWUzruwgjoO4qg,19114
|
||||
aiogram/types/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/affiliate_info.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/animation.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/audio.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/background_fill.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/background_fill_freeform_gradient.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/background_fill_gradient.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/background_fill_solid.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/background_type.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/background_type_chat_theme.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/background_type_fill.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/background_type_pattern.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/background_type_wallpaper.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/base.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/birthdate.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/bot_command.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/bot_command_scope.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/bot_command_scope_all_chat_administrators.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/bot_command_scope_all_group_chats.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/bot_command_scope_all_private_chats.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/bot_command_scope_chat.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/bot_command_scope_chat_administrators.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/bot_command_scope_chat_member.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/bot_command_scope_default.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/bot_description.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/bot_name.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/bot_short_description.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/business_connection.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/business_intro.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/business_location.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/business_messages_deleted.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/business_opening_hours.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/business_opening_hours_interval.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/callback_game.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/callback_query.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_administrator_rights.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_background.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_boost.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_boost_added.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_boost_removed.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_boost_source.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_boost_source_gift_code.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_boost_source_giveaway.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_boost_source_premium.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_boost_updated.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_full_info.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_invite_link.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_join_request.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_location.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_member.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_member_administrator.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_member_banned.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_member_left.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_member_member.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_member_owner.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_member_restricted.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_member_updated.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_permissions.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_photo.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chat_shared.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/chosen_inline_result.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/contact.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/copy_text_button.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/custom.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/dice.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/document.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/downloadable.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/encrypted_credentials.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/encrypted_passport_element.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/error_event.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/external_reply_info.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/file.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/force_reply.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/forum_topic.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/forum_topic_closed.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/forum_topic_created.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/forum_topic_edited.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/forum_topic_reopened.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/game.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/game_high_score.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/general_forum_topic_hidden.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/general_forum_topic_unhidden.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/gift.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/gifts.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/giveaway.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/giveaway_completed.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/giveaway_created.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/giveaway_winners.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inaccessible_message.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_keyboard_button.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_keyboard_markup.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_article.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_audio.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_cached_audio.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_cached_document.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_cached_gif.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_cached_mpeg4_gif.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_cached_photo.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_cached_sticker.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_cached_video.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_cached_voice.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_contact.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_document.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_game.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_gif.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_location.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_mpeg4_gif.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_photo.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_venue.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_video.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_result_voice.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/inline_query_results_button.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/input_contact_message_content.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/input_file.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/input_invoice_message_content.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/input_location_message_content.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/input_media.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/input_media_animation.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/input_media_audio.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/input_media_document.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/input_media_photo.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/input_media_video.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/input_message_content.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/input_paid_media.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/input_paid_media_photo.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/input_paid_media_video.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/input_poll_option.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/input_sticker.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/input_text_message_content.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/input_venue_message_content.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/invoice.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/keyboard_button.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/keyboard_button_poll_type.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/keyboard_button_request_chat.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/keyboard_button_request_user.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/keyboard_button_request_users.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/labeled_price.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/link_preview_options.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/location.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/login_url.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/mask_position.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/maybe_inaccessible_message.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/menu_button.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/menu_button_commands.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/menu_button_default.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/menu_button_web_app.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/message.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/message_auto_delete_timer_changed.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/message_entity.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/message_id.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/message_origin.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/message_origin_channel.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/message_origin_chat.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/message_origin_hidden_user.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/message_origin_user.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/message_reaction_count_updated.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/message_reaction_updated.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/order_info.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/paid_media.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/paid_media_info.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/paid_media_photo.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/paid_media_preview.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/paid_media_purchased.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/paid_media_video.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/passport_data.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/passport_element_error.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/passport_element_error_data_field.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/passport_element_error_file.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/passport_element_error_files.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/passport_element_error_front_side.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/passport_element_error_reverse_side.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/passport_element_error_selfie.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/passport_element_error_translation_file.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/passport_element_error_translation_files.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/passport_element_error_unspecified.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/passport_file.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/photo_size.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/poll.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/poll_answer.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/poll_option.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/pre_checkout_query.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/prepared_inline_message.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/proximity_alert_triggered.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/reaction_count.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/reaction_type.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/reaction_type_custom_emoji.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/reaction_type_emoji.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/reaction_type_paid.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/refunded_payment.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/reply_keyboard_markup.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/reply_keyboard_remove.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/reply_parameters.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/response_parameters.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/revenue_withdrawal_state.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/revenue_withdrawal_state_failed.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/revenue_withdrawal_state_pending.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/revenue_withdrawal_state_succeeded.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/sent_web_app_message.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/shared_user.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/shipping_address.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/shipping_option.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/shipping_query.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/star_transaction.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/star_transactions.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/sticker.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/sticker_set.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/story.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/successful_payment.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/switch_inline_query_chosen_chat.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/text_quote.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/transaction_partner.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/transaction_partner_affiliate_program.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/transaction_partner_fragment.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/transaction_partner_other.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/transaction_partner_telegram_ads.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/transaction_partner_telegram_api.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/transaction_partner_user.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/update.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/user.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/user_chat_boosts.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/user_profile_photos.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/user_shared.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/users_shared.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/venue.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/video.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/video_chat_ended.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/video_chat_participants_invited.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/video_chat_scheduled.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/video_chat_started.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/video_note.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/voice.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/web_app_data.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/web_app_info.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/webhook_info.cpython-311.pyc,,
|
||||
aiogram/types/__pycache__/write_access_allowed.cpython-311.pyc,,
|
||||
aiogram/types/affiliate_info.py,sha256=3pdlbpp2BMx69FQ9Oe2Fc0ME43H2eTvixrg4B0tSy9Q,2180
|
||||
aiogram/types/animation.py,sha256=W9LGC1-JeWGolCU3OI1a3dXjtD5pCnaOd_J7ulWhau8,2673
|
||||
aiogram/types/audio.py,sha256=2WPtZmAQfW6ewCb6ozlcfXXZACQEX7c1MYTEVMAy9Lw,2823
|
||||
aiogram/types/background_fill.py,sha256=sJj85JGxTXOJVd_dq0jpgH5TbBPlvRKFNjk2CNoM5Bw,513
|
||||
aiogram/types/background_fill_freeform_gradient.py,sha256=87YdL1Z7TDBNSJRuVFDNKL_5kHPoDxxdhTexN1Pqc5s,1201
|
||||
aiogram/types/background_fill_gradient.py,sha256=bSkNQPDrdWCrSIoCSBE3iFI3NaOAk2cktmLOFUbX2qA,1434
|
||||
aiogram/types/background_fill_solid.py,sha256=cL3N_tRhRdpM3rGYjHqh1c05Ys1_w5Sn5RVFX4Kzrhc,1022
|
||||
aiogram/types/background_type.py,sha256=_UKdw_LQfpR4z7W8wdtEmKV38EUlsSCheh0l4O0d90Y,540
|
||||
aiogram/types/background_type_chat_theme.py,sha256=1mylq_KCHfLYikVuv2FVNHTK-FivuOc3fIN16ThxGX0,1077
|
||||
aiogram/types/background_type_fill.py,sha256=P3mjIBc_oZspRCYLZvep1Tjx2F2r3Gz8QnK3ZhBRXr0,1656
|
||||
aiogram/types/background_type_pattern.py,sha256=7y5N7vxg4EauwCLqAf_7VjfYGcdDLWt5P2wieNZl9i4,2514
|
||||
aiogram/types/background_type_wallpaper.py,sha256=6uYeiZ4xQBTmJY0jCTeUFAj65Q872NZL7D2-WMeSLac,1868
|
||||
aiogram/types/base.py,sha256=ZAKfSk-DVyoBoYdyyZUTkoIKzuaj0kJS0ophsohsdI4,1762
|
||||
aiogram/types/birthdate.py,sha256=ev957uyU2tG4cRqQ838h8LHW0uIPFUu0TdC1YfL0mnY,1056
|
||||
aiogram/types/bot_command.py,sha256=rJuwZroECtHDZxhyv92K2vyTUlXdieXdCEhewEsIPk0,1017
|
||||
aiogram/types/bot_command_scope.py,sha256=rs7YoyRACVLm4tMMEQ01LM6ckWbF7o81edYEAnWXoyY,951
|
||||
aiogram/types/bot_command_scope_all_chat_administrators.py,sha256=3wvcWAh_yZADVbqPQD09kd1hyjmDL_KuoYR8us7A0jI,1311
|
||||
aiogram/types/bot_command_scope_all_group_chats.py,sha256=BElN12t3RwjYAFgo__K4PSUA5Mf0Vgzx6lzrhO1_kOY,1225
|
||||
aiogram/types/bot_command_scope_all_private_chats.py,sha256=1Ww3HUSSJINy4qNSqF5lybQJwWHpflhMM2So6EMplyg,1226
|
||||
aiogram/types/bot_command_scope_chat.py,sha256=chjf7klLRhCM8AB1xwkfkPfUXcw-_vnQekRVkiIB1Rs,1327
|
||||
aiogram/types/bot_command_scope_chat_administrators.py,sha256=ezkiv48UyMIlKyZXvmlmsLi9cop5pk6cZW6FLgFJr-E,1518
|
||||
aiogram/types/bot_command_scope_chat_member.py,sha256=IvFP2cemuZtMFdIn7T7hfo4o4-35_1ZBTOHV5pARCQI,1513
|
||||
aiogram/types/bot_command_scope_default.py,sha256=Aqa5eiFS2_2rd8S19i7qfBPIk8TNPVdOEOMR1oSPMuI,1270
|
||||
aiogram/types/bot_description.py,sha256=daKHDJ4d2c9j7wCTKwDLgbXy1HNrjbYkZkwC9D7FiPQ,781
|
||||
aiogram/types/bot_name.py,sha256=ut3sf9j5LYd2xki-_pZ1lnVvN7HOUr6v37llIi75j6w,717
|
||||
aiogram/types/bot_short_description.py,sha256=UdHLoRvp1hdhEg-W1XYUoDwPeCxvuU2H430JrNDiY4U,849
|
||||
aiogram/types/business_connection.py,sha256=B3LuYw0bZwli2E2d6L9CGE_Rm1IvnzpD0RyCmZWxljU,2056
|
||||
aiogram/types/business_intro.py,sha256=TTTNSlPX-bvzbDqKd-YzwXaUjgznpZxnBDGtAKpmSBc,1303
|
||||
aiogram/types/business_location.py,sha256=OHFm2V3jLoRWJdXS3ubflMjFGd2Wo6sMhMhvsHbJUUY,1103
|
||||
aiogram/types/business_messages_deleted.py,sha256=LYV9OC1fKsPN3t1TOhkLSJK7lyFSSLkgOuhbGU5O448,1472
|
||||
aiogram/types/business_opening_hours.py,sha256=D7Cn967ZUdDE-vwJHYLnIeFzxpeKGobQYdlMRl6t-gc,1276
|
||||
aiogram/types/business_opening_hours_interval.py,sha256=NFi-_QWLEN_0D1fPpqqp2TlrdWBJ71Rz7c4P-lSWj9Y,1329
|
||||
aiogram/types/callback_game.py,sha256=AF-WqkqFcC6nG_tKoNX1sRjRiKEstbEFJfLy4NPKtRQ,298
|
||||
aiogram/types/callback_query.py,sha256=JBnbrz0j0C6zK1eMeCgQ7l28ytKVxxkExVbwDsc2u4Y,6017
|
||||
aiogram/types/chat.py,sha256=TMTsaw9t5L6ohv1qDpj02FoZgud2LSPSgABr_2yhch0,64446
|
||||
aiogram/types/chat_administrator_rights.py,sha256=xwIgM6y2daN5FSYNJagmhBtgEy88S9GTSQk_OWgrykU,4578
|
||||
aiogram/types/chat_background.py,sha256=tGylRgxxa5pMDsuQFkG2XrY7mKQCsA9lc-BsaArwXEE,1400
|
||||
aiogram/types/chat_boost.py,sha256=iAbDstYKPATDpf9C0UTaeeipi1kcFedXhiTC6INxEuQ,1879
|
||||
aiogram/types/chat_boost_added.py,sha256=4WPPng6cqzhb0qpepGeu4mAoga2ieA2vmqIxWQR5n-A,811
|
||||
aiogram/types/chat_boost_removed.py,sha256=phu1WXsR6noLlEuiwyF1S0HzlwDmFsk2vwc9TRJ00K0,1768
|
||||
aiogram/types/chat_boost_source.py,sha256=-s9Um1lFg4ab2MiQpb1SpJlKM2hJHZkpM43TQE6GEMo,476
|
||||
aiogram/types/chat_boost_source_gift_code.py,sha256=VkPQktCIZdyI7wvhR-c7hgDs8lI2XySv_tCX1IJoFDc,1378
|
||||
aiogram/types/chat_boost_source_giveaway.py,sha256=4iH0fu4MWRf7HVyS1jUKioG5DVWjFhJ4ueqKzqGZEpQ,2407
|
||||
aiogram/types/chat_boost_source_premium.py,sha256=nN3o9Kvt5JHXcp1RpYq1WDX8Szzn9so1-FgGR1Olf38,1278
|
||||
aiogram/types/chat_boost_updated.py,sha256=L0LKL6jutsHYPbCDQoXHaZVjIS5y7uIDXlacKNIFvE0,1002
|
||||
aiogram/types/chat_full_info.py,sha256=Dhv4b3nh29etQNxdMrzgD7qhoqRSxWwc7FwxDVAUUZI,13707
|
||||
aiogram/types/chat_invite_link.py,sha256=FfaheNzGBuDsKaV08kR2vtDRowzhTbvFeU6NtKlaLRc,3219
|
||||
aiogram/types/chat_join_request.py,sha256=-8Ew8ym9tVzArQ9Pg38I_boSNu3sixIC4s_bKMNY2dk,185832
|
||||
aiogram/types/chat_location.py,sha256=qZUA9NnQBDCHRLvKDP1Oo0wDX5T5tw-j14-NX8tlXSM,1062
|
||||
aiogram/types/chat_member.py,sha256=sq0RhcwghiW4Gy9XJTskFA3dHxaol5EA5Oify1QJfz4,722
|
||||
aiogram/types/chat_member_administrator.py,sha256=d7se9Lm1AWDuZRNYGbK3ZLC2NkZVkSzegziJ0Lx66Qc,5453
|
||||
aiogram/types/chat_member_banned.py,sha256=bvvMSTPn4iNy6N5nGoPYoxR3pjqDZhFFqvGC_Jb1T3M,1500
|
||||
aiogram/types/chat_member_left.py,sha256=YhW1LjLUG5TDTARmj44DaJ0OyX2Gm8CW9-K6EA7LYgI,1254
|
||||
aiogram/types/chat_member_member.py,sha256=2AtZsJz3aICbn2eqCmG1p0UsBYSqlNLmN-wnqnC6uks,1482
|
||||
aiogram/types/chat_member_owner.py,sha256=2gV3f1ubns_eORZjJocWSuwH8IW_cv2j2I0MuHbVa68,1676
|
||||
aiogram/types/chat_member_restricted.py,sha256=7F40ERHf29ihfrB4tTc9JWL5w5xRBjqVLGoMWMgyWlg,4545
|
||||
aiogram/types/chat_member_updated.py,sha256=NuDg_rExv6hOZsNi0bjCwRwKlbnGzxOlESoDTrgtIQk,94922
|
||||
aiogram/types/chat_permissions.py,sha256=A6I6DuCQGRWBqhQuVe8xMnRkd9i0iD7gOZm6Qg7m0LY,4382
|
||||
aiogram/types/chat_photo.py,sha256=BouKO-6NIn5d17fB9acX9iAbv_gjYzbeKuTqN3BcFD4,1872
|
||||
aiogram/types/chat_shared.py,sha256=zGBx81dC3SpqbFwYtGIyKKad1QdeejmvdL-N7waJgfs,2254
|
||||
aiogram/types/chosen_inline_result.py,sha256=VFMo9FklvYjWrPbwrxeIyHrDwLlRvnFObUV5EhaannU,2399
|
||||
aiogram/types/contact.py,sha256=jWvv9gc-4LyFyBLeAeucyr7A8yjBk7-sJQH10NKoydU,1848
|
||||
aiogram/types/copy_text_button.py,sha256=wbr68I7ATgVXhbhSfzEpAsKqNiPjUY-AhKVZcnRl1MM,864
|
||||
aiogram/types/custom.py,sha256=3Xqsx2Llx47Hu1v4hGEFOjbMzkgkdQ9lmKW87Atulp4,819
|
||||
aiogram/types/dice.py,sha256=QOFOqUx3jqVtqU_nwuWhhSthy5CBR_mNTMuIpwiD2KY,1165
|
||||
aiogram/types/document.py,sha256=6tKzYSPyON6BoWLn3F3tiXHUxaQNG1YNl6kC6bO-0ZE,2425
|
||||
aiogram/types/downloadable.py,sha256=FbRdIM3Cpw3tcDzZvwy__u98aSKqMMJn2kKh9mK62B0,77
|
||||
aiogram/types/encrypted_credentials.py,sha256=1ZC-Q3c84mEVZGEK_cXTkqzX4FzBujn0_necxJ1uSPc,1521
|
||||
aiogram/types/encrypted_passport_element.py,sha256=MHZyzj2tEw7lOCELnp2Yo5qxgIZbT25_KUl-2G8XSjk,4727
|
||||
aiogram/types/error_event.py,sha256=m0QrLksRJ0-x0q5xpb6iyI4rqPfiz3XJom_Gh75CJ-8,714
|
||||
aiogram/types/external_reply_info.py,sha256=N-DmH6A9S_O5aue_9t1kQWxvAyxY1UAHxyq_SUgZXCM,7179
|
||||
aiogram/types/file.py,sha256=52bE-c7RjZmTdXk8ij8PJ5fsx2-1IfgedM763PmzGnQ,2166
|
||||
aiogram/types/force_reply.py,sha256=YkTteaPMOUH544hl9h6VDypMxyiLIKFd9KXryouTmVM,3024
|
||||
aiogram/types/forum_topic.py,sha256=CchPMME1NgB8WT9FWLgQ5mYZ7uXFG2yuTmDMaDZ6kcU,1422
|
||||
aiogram/types/forum_topic_closed.py,sha256=aw1K6fIadwJtSTZnyTQq3xtEf7920vodFjK5lHeKVgs,309
|
||||
aiogram/types/forum_topic_created.py,sha256=OPYpne_Zz5tdOpzjYOXGplCxLhF1aeKnHFzpn3qXIRg,1321
|
||||
aiogram/types/forum_topic_edited.py,sha256=Fq8QDirNBsymOKbAxBYnFqhmXL52XuqKAQrLxePRyA8,1230
|
||||
aiogram/types/forum_topic_reopened.py,sha256=MloV3nhDpHSLe5VoVgmC99u7ch3IYahIHH2EokGCWgY,315
|
||||
aiogram/types/game.py,sha256=iY-bnyCh7FH92LUpE4mL2sIP8RYnrEHS3YySkqi_odY,2359
|
||||
aiogram/types/game_high_score.py,sha256=rwCyO24y4BkcTJSmoLPA7pGEsgfA6-_3i40uvCgxp6k,1203
|
||||
aiogram/types/general_forum_topic_hidden.py,sha256=QC3u0Qpt3nptdhl3dxqgNXVrptwSAdnEzI-OWP8QMMw,301
|
||||
aiogram/types/general_forum_topic_unhidden.py,sha256=W8HRGyB81eyooaucgD0ojeAzywD8AjnMnUf2hf7r5Nk,307
|
||||
aiogram/types/gift.py,sha256=wkMRj3zG0OsykCNwzvSHjdo0-YHO_rr8974ADE9TQWQ,1718
|
||||
aiogram/types/gifts.py,sha256=xnMajTJ-MoODaiGp0xSF9W9n3vg8oww0aEl1i46umFU,816
|
||||
aiogram/types/giveaway.py,sha256=PXB4nsACiEbZCkCaXGhzbipX5VJb3Fh9EJEo7dW4b5A,3341
|
||||
aiogram/types/giveaway_completed.py,sha256=-yBzrJeMF8b5Vhs-PlyZQNl4nAuGmZit7qBnqNwwGyg,1811
|
||||
aiogram/types/giveaway_created.py,sha256=At22BaRdK_bueF4zp1cSO4QsY6idqSLhpUPkYwhMdWE,1026
|
||||
aiogram/types/giveaway_winners.py,sha256=wRhpWdD3pTvyOFBdD8qMD3XpvGX-o_tsGCaeX3gH_NQ,3624
|
||||
aiogram/types/inaccessible_message.py,sha256=3TsiwGGl_6wtQAo9fdCa7wz37-LyrIyTxBa3Lz5hEdk,191444
|
||||
aiogram/types/inline_keyboard_button.py,sha256=djbmGtYmMlmd7GwwotfEi5vjYmGeNXq7Vc7UoB2VqBY,5055
|
||||
aiogram/types/inline_keyboard_markup.py,sha256=trf-DSyapyYnNoXeO0qu8h1OcR8TokB2q697jMhN3dA,1267
|
||||
aiogram/types/inline_query.py,sha256=ji7soi2jhzODC0fgs_d0YFa_pNikYF4TQip3iR6s2BA,7404
|
||||
aiogram/types/inline_query_result.py,sha256=8Ve8Fe1Yf6O7NHWCYdTVIgnbawI6hIo5B0l2cV5ZN20,2189
|
||||
aiogram/types/inline_query_result_article.py,sha256=Keq9BuANquPGxWDw9D8Yra7_vNDSvYSRfqK5Ml9e9yE,3759
|
||||
aiogram/types/inline_query_result_audio.py,sha256=poecL3Exe1oq-r-qUr82pOTJ2jY6z2XKUc2SFi3Mb1k,4361
|
||||
aiogram/types/inline_query_result_cached_audio.py,sha256=jjdiTkTPVlqKYq-zJJDd6gWN3UgtjQzJW8ZI6cELvtg,4012
|
||||
aiogram/types/inline_query_result_cached_document.py,sha256=p7Sc5IR1c9RDqARgHtqrE9pQCXgqWHy0F7kThefAloE,4354
|
||||
aiogram/types/inline_query_result_cached_gif.py,sha256=32aECTB92-l5mEynM-CnGO6KGWUZw_bkYpVYLue94V0,4595
|
||||
aiogram/types/inline_query_result_cached_mpeg4_gif.py,sha256=GoPtnlrckRsnUKZYdvkEYh3E2mpQkvNRGh6TiSoyH1Q,4693
|
||||
aiogram/types/inline_query_result_cached_photo.py,sha256=wbRL5JDo0FP-kJ6UjXkQcjsiMVp2LpgJP3Hh-0lt_RU,4763
|
||||
aiogram/types/inline_query_result_cached_sticker.py,sha256=hqZ8ZvEv0jA0rf7WDVa4SVkaX5khDncpdSPoH5LWEcU,3100
|
||||
aiogram/types/inline_query_result_cached_video.py,sha256=5Vi8Q7vwnNPN-FAOI0Wh3Qb2iHL1vlMybojeDzOeIac,4733
|
||||
aiogram/types/inline_query_result_cached_voice.py,sha256=NECjz6Q_sWitYFUAAX6zZOxJcOWiFGxvYeIDcciDhLM,4138
|
||||
aiogram/types/inline_query_result_contact.py,sha256=vAmYCE49k7pWHNA-1-L0p7pD2TljNdzitFgsE_hrYDI,4111
|
||||
aiogram/types/inline_query_result_document.py,sha256=9rpiUiPpXiWUYIqIhUNkEehoe1WSPVME0V_Q59EMEDU,5041
|
||||
aiogram/types/inline_query_result_game.py,sha256=9t2HzFgVgHjPW_pQZ4YBTeGptSbn9KOHcGsbEPpUwzQ,1758
|
||||
aiogram/types/inline_query_result_gif.py,sha256=QI-T-ZjwLZGOytjkHt0MHL0xhJB1ZfgQBgab9_j6Z1k,5536
|
||||
aiogram/types/inline_query_result_location.py,sha256=FX_eYlVfcRkcTTxubrTu1m3jGFWbgLEyg0R0TFp3ybY,4961
|
||||
aiogram/types/inline_query_result_mpeg4_gif.py,sha256=wjaQJdqP9K5HxsKktXGwxe1k1QqtDBeRQ6E6vV6YOkg,5639
|
||||
aiogram/types/inline_query_result_photo.py,sha256=5pb1VBbyhsK7sr_6K4sQDEywkscDXmZxYylFhojE9NE,5239
|
||||
aiogram/types/inline_query_result_venue.py,sha256=pln1TVUl5cLvgxTxR1PEYLA7K69L9ZGAGxR_YQ0eQyY,4904
|
||||
aiogram/types/inline_query_result_video.py,sha256=wdt7J5iSd_dyiWVh53Tmr7z8zHCw9j5DJWz8Dv1rjLE,5836
|
||||
aiogram/types/inline_query_result_voice.py,sha256=z-gZt8g6V3M9yS1VvSKFAGaEyP9rwfZqHQaiAehus8c,4304
|
||||
aiogram/types/inline_query_results_button.py,sha256=mcDUu9wvU35tBvH1BhICorSlJ25XUVbpJlh9BWE3HNQ,1878
|
||||
aiogram/types/input_contact_message_content.py,sha256=GR2RDpizrX7rlxjf05CKzRT3zmLEO1yJSpqbmxCLwQA,1599
|
||||
aiogram/types/input_file.py,sha256=oCElYrCtJgfP5_ck0MQxvGppVZyXW5BnsHcmSg1Ds1o,4672
|
||||
aiogram/types/input_invoice_message_content.py,sha256=EJf4oo8a0alA1zACIfPb68VJxE3F0AvoCkuNjfiu1h0,6896
|
||||
aiogram/types/input_location_message_content.py,sha256=UmmTHtSm-0MbIp2pISbl6FoPo9rjKeBK0pKzKg66GvE,2374
|
||||
aiogram/types/input_media.py,sha256=2nTD1Wg9VX8x74KTAf2d6OjjGTwPTUXaQL5Ty5TxvYQ,619
|
||||
aiogram/types/input_media_animation.py,sha256=Lr47yzFVl7Jl0bMZVJc-KbkIV2l8bXlEFL0dXJn-ayM,4367
|
||||
aiogram/types/input_media_audio.py,sha256=6uuGDZqLjczTey2_PMwPPORlIyflIRoEL_GUowvHv2Q,3700
|
||||
aiogram/types/input_media_document.py,sha256=ucpg6iUarmGuJELdAz47HZXm3S5qmRewjpWya4D50R0,3622
|
||||
aiogram/types/input_media_photo.py,sha256=UaTLHv4kOXP6yvSKKcWKKsh0rxLKieRnnkfWaAYAFDI,3121
|
||||
aiogram/types/input_media_video.py,sha256=6WulgHcE2A6O6zfqhS7rvRmnisLTLR7t77oD7GRAuBc,4503
|
||||
aiogram/types/input_message_content.py,sha256=wj0C4RyiLpVP4yz0LmmO4qMNNIwRMihjnoMrjBSxjDE,793
|
||||
aiogram/types/input_paid_media.py,sha256=z-STAz_0G590-eFlOYNTv_HP1LOWbACXM0XMYbEBXrg,380
|
||||
aiogram/types/input_paid_media_photo.py,sha256=AHnkA6yvhhxdt_ffpCplgOxtqeh0YiDZ0WjVYj0boSA,1498
|
||||
aiogram/types/input_paid_media_video.py,sha256=nKQwP5BtYARot0LjkAr-EOa7UfbL8DwtFqexwoTNIY4,2977
|
||||
aiogram/types/input_poll_option.py,sha256=xvXNI_QLkU1UMHaFgHBAF7VKAY7JbZTjMYb0RYkfYVs,1785
|
||||
aiogram/types/input_sticker.py,sha256=inpy6H4A5UEs2uvrnCOdE4HaFUKncsa_e1KDJcL6foo,2432
|
||||
aiogram/types/input_text_message_content.py,sha256=i5edPai_FFJ-U7Rqh-PMdEwXI_ez-uFqOl7tzRTch0Y,2676
|
||||
aiogram/types/input_venue_message_content.py,sha256=CZsCPYQrFdP_BrYBzNJ_Ik39PlJ1VLOsvI5q9vRS0Ns,2411
|
||||
aiogram/types/invoice.py,sha256=gOiw5G9yXJ8ZkAVupt2ww-mcooYanTix6t7KarSni9Y,1932
|
||||
aiogram/types/keyboard_button.py,sha256=L0cHsJEsKQziqK3zJN6laQL9drC36AhbhMOG20vhzcE,4352
|
||||
aiogram/types/keyboard_button_poll_type.py,sha256=tPGlW_jRXaDxZML1_vK080sp6BO86DO5cbBP-TEOf4Q,1153
|
||||
aiogram/types/keyboard_button_request_chat.py,sha256=N8UBPPlrQ07OSCO-33mfP5lKJ744sugaS86dYWpxMRQ,4448
|
||||
aiogram/types/keyboard_button_request_user.py,sha256=89efkQPnTYrtpBozhTvXp00YE8uKqgJInVUafJV7nkI,1990
|
||||
aiogram/types/keyboard_button_request_users.py,sha256=bhj4_scIdCcKxWeuC8f8guU_tcWTvwrbISe_PycG-XE,2747
|
||||
aiogram/types/labeled_price.py,sha256=7kRZPTy8HgJG4FYrix21xGfhgT_u93fROUBOj1wB4Rk,1330
|
||||
aiogram/types/link_preview_options.py,sha256=xv8Z-qE_NBfojELQHSlgegmsXso661AL8562z8i0dls,2747
|
||||
aiogram/types/location.py,sha256=0X9SBlANNn_ODEByFE0oDiJxpKtGEQ6OI6fDXB_1loA,2115
|
||||
aiogram/types/login_url.py,sha256=VxZTVG1LbmKeon_spDg17HJiPh1l1buOI5eFBNLu1Rk,2771
|
||||
aiogram/types/mask_position.py,sha256=ZH0pNJ8u4Xlos2MwCtsnSzMNfhgGvacCGdJ42qFp9no,1627
|
||||
aiogram/types/maybe_inaccessible_message.py,sha256=TbxUHEoW88w4nWer6zhQhWaAjTqr2Xi3H9-ZJRfvA9Q,388
|
||||
aiogram/types/menu_button.py,sha256=4Q2I_AlbnRe2fQ0f1a-LNl0toGOHI73ehjhMQmLngV4,2103
|
||||
aiogram/types/menu_button_commands.py,sha256=NMmH1S0jcEivjXmzRfMTLJAO4UBKVhFuo8wS4ONgZwc,1038
|
||||
aiogram/types/menu_button_default.py,sha256=FnjUz1-aXR3-0oHPv0pNU5yi1M86wnzwCbNnzEMu094,1027
|
||||
aiogram/types/menu_button_web_app.py,sha256=G-yWLPg91mgaMP672VRj6xmB8_UqDpMeH2iePvY0rw0,1715
|
||||
aiogram/types/message.py,sha256=YfUVuYllvbgsza_nophh6keE48VDtb1weYtt3s_C_t4,256648
|
||||
aiogram/types/message_auto_delete_timer_changed.py,sha256=D9GoK5tOtxWTksB_yaIKthfiHWJhOI6SUBWWpW_PRTY,1020
|
||||
aiogram/types/message_entity.py,sha256=HFSk-rWsATvYBtVxGQFihPhiVNB1n3UusXiOIQNsbfg,3349
|
||||
aiogram/types/message_id.py,sha256=JGHbRBB4KbmtK0L4VTcWLrlttF3M4eukcUXkmDQF6T0,1072
|
||||
aiogram/types/message_origin.py,sha256=uSs6n9q5JhIzaV42ldMJJL_8nAx_aCQ3xNqrRVMJsWg,518
|
||||
aiogram/types/message_origin_channel.py,sha256=tgCfiuS81A0oWD9EY90F0P3B9s-Avsm0FJlw5ra8umA,1795
|
||||
aiogram/types/message_origin_chat.py,sha256=_EE8lVR8Kp745dHTlT1zHYXEDImbGhq_nuZgteu9lbc,1725
|
||||
aiogram/types/message_origin_hidden_user.py,sha256=N8WXMNcBlWSuDMRYUxsUiZubnOxsDFOr7GyYQKRrij4,1377
|
||||
aiogram/types/message_origin_user.py,sha256=FTu0wnkg8AElOQtMjy2Ee-ApL2eX57a5qMrudWMWf90,1349
|
||||
aiogram/types/message_reaction_count_updated.py,sha256=INsBfsf6UMzCeQraikugzPI9QPRBWH4SeycDKddJhEU,1515
|
||||
aiogram/types/message_reaction_updated.py,sha256=GCBHczu_2M39wr3PTLod2jAFgFi6IQgT-skLdt5eM4E,2610
|
||||
aiogram/types/order_info.py,sha256=ECWERhAIl3kkclMOwnNN9NHGQLUtW0B6oElkLubPPr4,1516
|
||||
aiogram/types/paid_media.py,sha256=gw3vvGNuZugsvlWpqxuZs1Q81ALL9MTZ6RVP5EFMbmk,399
|
||||
aiogram/types/paid_media_info.py,sha256=82TCrKrl0LUxgBmrR9DSPeOSvzLrxR96vrQfky8TsIU,1321
|
||||
aiogram/types/paid_media_photo.py,sha256=03xX-iveseL0dkiaHd0TY9q7MLM9qLO20_c8Yu810QY,1124
|
||||
aiogram/types/paid_media_preview.py,sha256=9ZIG6wR-De8VPU2y5Rn77czZFOdLcW_JxKXQeYsiycw,1522
|
||||
aiogram/types/paid_media_purchased.py,sha256=J_V6slEyAerISMyRxiiIFKjygHAlusJKCCJY7-LI9Mo,1171
|
||||
aiogram/types/paid_media_video.py,sha256=afHhTgBEXuyms9V1FaGqJutjveZeHjESmYvav3D3_ck,1095
|
||||
aiogram/types/passport_data.py,sha256=ByKi34EtxO4ipowiWzyzeZYdrIODBAZnzF8DRJ1hLlw,1312
|
||||
aiogram/types/passport_element_error.py,sha256=0MooyVK2Yoz-6MTnBDqbyiR9o-cYM5GoM6HC-p6X9jQ,1214
|
||||
aiogram/types/passport_element_error_data_field.py,sha256=NQXIJOOjXP56vbMTgKl2z9QqTs7FyHlxURO2xSOMQI0,1850
|
||||
aiogram/types/passport_element_error_file.py,sha256=tlUpJBAJFPUzHnCgd07gIS1c_HvFXFTpQWlB6Kipo_w,1619
|
||||
aiogram/types/passport_element_error_files.py,sha256=6tX9sDOVBez80HlGwWY2ypo3oKYVyrlDaqYMAqLWBio,1728
|
||||
aiogram/types/passport_element_error_front_side.py,sha256=669dn7UWwY4GnNnmaUBipHj8U22PahkJFmzLVerAGXk,1721
|
||||
aiogram/types/passport_element_error_reverse_side.py,sha256=ZVfTzKDmrZqzwcOBNuzsSwfEUip8hHCzeRk2jyiWDak,1704
|
||||
aiogram/types/passport_element_error_selfie.py,sha256=KR-TG1DguG1w9Kv1rIJRf7qkI_L7euSwr9h5IC8DAJU,1623
|
||||
aiogram/types/passport_element_error_translation_file.py,sha256=Zm4DzT7yQoHHdANCgq0uW6kmskULr56hwjv0GFPWTGI,1843
|
||||
aiogram/types/passport_element_error_translation_files.py,sha256=QZqQRIKd0qfVzmiKN9JHDVn32PFdNq6sIkKiZn6GScs,1946
|
||||
aiogram/types/passport_element_error_unspecified.py,sha256=KqvSPstDlkcEJRDA-JkFX5JK97uO9R4Nqx_Sbp5iW4Q,1651
|
||||
aiogram/types/passport_file.py,sha256=tN7IbA6M4Zk6WH4CpVeI0exfi_UKoKOUiz1iT1e1epo,1599
|
||||
aiogram/types/photo_size.py,sha256=J1rOX1QxScCjA0LPm4KgdLZBpsAQfscAaDfuocE4cC0,1664
|
||||
aiogram/types/poll.py,sha256=WHHT_JkYIBH7D70qk1IsCeR2914X8Uk8Ib78BZZvV74,3731
|
||||
aiogram/types/poll_answer.py,sha256=ujKTddKv7gCre2Uw4IQ0HT6bvuk2NTZuX1SMgYK4Efc,1608
|
||||
aiogram/types/poll_option.py,sha256=XfbZtlUS_Eo7yKn1Cy9auho6TY4M9kpqITwrMZYCObo,1439
|
||||
aiogram/types/pre_checkout_query.py,sha256=CaYsF1zvPb1k5cgka1GC12VMS3eZc3RWVba7VmRr6L4,4410
|
||||
aiogram/types/prepared_inline_message.py,sha256=u_OAM29FW7DVPIEBhNcoSzprLa-RxllJVBeM2E8o38g,1204
|
||||
aiogram/types/proximity_alert_triggered.py,sha256=b2zF9r0sjf-cp6Gj-pyTIJq9x5a_JBjdp-DseDGpM_0,1253
|
||||
aiogram/types/reaction_count.py,sha256=wmMH5iR_tOJ3ieSezjBzRCPQyt7RhH3Lbw8emodaxqE,1332
|
||||
aiogram/types/reaction_type.py,sha256=EBHvWnPblOe2T6ey0_V9m6vReAX8VcHX4wuzKLVMR0w,442
|
||||
aiogram/types/reaction_type_custom_emoji.py,sha256=dzZSLhEtBke35GtTgfSxrijMu9jQzob6drdFkYReR7w,1150
|
||||
aiogram/types/reaction_type_emoji.py,sha256=F5WoRrUm9tOV3YJVNh8quD4D2OfsU53Y-mbqggbnm-w,1682
|
||||
aiogram/types/reaction_type_paid.py,sha256=dazJsDfQEMF9mgQZ0So4t7S-QFKHGyr6HKyYyBsnPtU,951
|
||||
aiogram/types/refunded_payment.py,sha256=yaj69LD-j7ffwtTk69ozl0MXz3r2kUlBTgOuWEqvxto,2180
|
||||
aiogram/types/reply_keyboard_markup.py,sha256=fLfhKqj11SKDkuKrzDdHgGnpEIZhHsYKI7e5pCV9Frg,3367
|
||||
aiogram/types/reply_keyboard_remove.py,sha256=vt2LTPCyoNO1SzO7JLJAUTLxfcyVh5eVKTkFmjQVvag,2093
|
||||
aiogram/types/reply_parameters.py,sha256=Sx61q6izo5FGBrrYSCts_I-noEPjB-H-aYglx6lSAUc,3496
|
||||
aiogram/types/response_parameters.py,sha256=qPu3C079bJZRdUIQwr-r9WIcW6yYW7rdWJlraZQbw-M,1550
|
||||
aiogram/types/revenue_withdrawal_state.py,sha256=rUzcoQ2Nbmm-2EwkoD-g_xWUp9o3mIsthyE2ZWrg0ZY,585
|
||||
aiogram/types/revenue_withdrawal_state_failed.py,sha256=uhCBqAV8SpbCkL364ygkvGg7TzarISQ6NniBeHvn3HE,1133
|
||||
aiogram/types/revenue_withdrawal_state_pending.py,sha256=rVieabsj2ayXpzN7yW8uGN-8p6Qy_lQyrKYFSKH5qmw,1115
|
||||
aiogram/types/revenue_withdrawal_state_succeeded.py,sha256=d2cBJbxXEPhtSLWb-TzyDy-iumMWkG7G6LWNRBmH7oI,1409
|
||||
aiogram/types/sent_web_app_message.py,sha256=1p2Xr_3czwPbZd8PpylTSo31ZgeAEBLnlnlRcBY31xc,1168
|
||||
aiogram/types/shared_user.py,sha256=UPL2qcpYgtKEPL8v5_CTF6NPOZrvR0FCzegIYjJG3vk,2334
|
||||
aiogram/types/shipping_address.py,sha256=9JTEnZoNaPa-T1p_YolL1ErIGWJol8lAU4F8ycsQ8ZY,1550
|
||||
aiogram/types/shipping_option.py,sha256=S5Jd4zr-7xbI5uaCLO696jlURKCdgZHgZD9hOrCj-gQ,1092
|
||||
aiogram/types/shipping_query.py,sha256=ay5_jkVD8JedLvj_Zl6k1JXU7PruHtT7815K3-N7WwE,3452
|
||||
aiogram/types/star_transaction.py,sha256=kUhevoKZf_PhwJLKOfoSRL1P-05uK3OonNat7S7DjCQ,3947
|
||||
aiogram/types/star_transactions.py,sha256=QbV2EsfoupTvwfYyD_WFlaiqLBenA6ik6-dwoqbUGjk,948
|
||||
aiogram/types/sticker.py,sha256=Tcz8iqKzCbfvP7MdV3NVwUEt9u27EmB7_R-N_BxSd6M,5902
|
||||
aiogram/types/sticker_set.py,sha256=Z6heidYoOQUkfS2PijUSCEg3L_NjgD3hkhChCE6jwpw,2382
|
||||
aiogram/types/story.py,sha256=2Bm9ZHpfr4_yeBPWFgwnqTs-y4xFgKqW8NLRVWzMdqM,884
|
||||
aiogram/types/successful_payment.py,sha256=zcXeaVR81zMQm8d3rO0vJ_NV8pOfWRRgCT8t1dXOC6Q,3325
|
||||
aiogram/types/switch_inline_query_chosen_chat.py,sha256=KH9p_x5aY6XxQn71LRa92cVQMl8glZKdc2m2935i_Yo,2002
|
||||
aiogram/types/text_quote.py,sha256=u6Carp9C3dKz3-u35EIhnulAxpfGh0_BXsfAG5M4bHs,1857
|
||||
aiogram/types/transaction_partner.py,sha256=0bzMsto6iUvUO2s1PRdIBrwvh8cRigiBhxcfznb_NDM,821
|
||||
aiogram/types/transaction_partner_affiliate_program.py,sha256=3EvIelQf7fuzSrQZV8BjK5X5CQYXxehBwr7rTnNS2Xk,1869
|
||||
aiogram/types/transaction_partner_fragment.py,sha256=sHfiApYXz8E4Jr40pb0szs4b94aAp0UTE6UGQ1xFFdo,1962
|
||||
aiogram/types/transaction_partner_other.py,sha256=iHViDYZ62dQS3z6k1YkMOqFELyBM4wpAkGzRlif-_xw,1104
|
||||
aiogram/types/transaction_partner_telegram_ads.py,sha256=QmVjyRZUGNTpxRIFZF4F_pAPj9i4224E1PsnA9GS8YU,1185
|
||||
aiogram/types/transaction_partner_telegram_api.py,sha256=ntdhxePoaNtTFNKkwVN34VeX60VYkH0PxJnRI4_0z1E,1419
|
||||
aiogram/types/transaction_partner_user.py,sha256=W_T8f2Fu_4-ZDOQGpt6OrKCkz5p-m3zMhPfvxY7S2fs,2872
|
||||
aiogram/types/update.py,sha256=vRi2nszPAGjfYLgjVfxvROOrakObWp_hFtf3BS-AAvQ,11923
|
||||
aiogram/types/user.py,sha256=DW0Xg1Lld2oB5wwOZtBIJggt-WiNLKOY-4HHSpU_t1k,6001
|
||||
aiogram/types/user_chat_boosts.py,sha256=SLpS9r5MUTva6qyarE6wkGV8e1KTvUqM9ldfXAwHw-o,940
|
||||
aiogram/types/user_profile_photos.py,sha256=ET0y9iSQw7975QnIjsLzjZ-nWpvhDwMrZRJuxsSdfY8,1118
|
||||
aiogram/types/user_shared.py,sha256=1yGKAO67fshHSOCtVl3dO_oD1-VOyzPBC4Ak-hflMOQ,1534
|
||||
aiogram/types/users_shared.py,sha256=W8gUM4q8YZvLEFnvkQsLHV91iMRvC7TcXywXmMVe1Wc,1980
|
||||
aiogram/types/venue.py,sha256=wEmGfGAiqdhDhTskRoxOKiNVliUaPpPOxBmohfDlL5I,2147
|
||||
aiogram/types/video.py,sha256=e-uI5iQSKAdhPK-vVz5kiQCIV22kaxmylzN8gzmtwnk,2575
|
||||
aiogram/types/video_chat_ended.py,sha256=eL3ZSR0WfVcHEEpXrdLm1mvuogXS7RAoxLwX2AwMdeg,839
|
||||
aiogram/types/video_chat_participants_invited.py,sha256=FQAGFFuJkrkg7GwoYx0IxHebIV4ap1czpALPE7282N8,937
|
||||
aiogram/types/video_chat_scheduled.py,sha256=G-a24czeK7NVzJ88SKFNutPd_SGnRgTBLy85rHozNLo,990
|
||||
aiogram/types/video_chat_started.py,sha256=FYHVcH-a5knoXIYMmCQThFt8hjjPwAiZ8QvGLNVWgl4,309
|
||||
aiogram/types/video_note.py,sha256=Hwa8uTCnyb9yT9eGikFwyVfk6X779md3DNAPbav6VrM,2059
|
||||
aiogram/types/voice.py,sha256=AMyEJovxyDl2TRVpEfpHLMSmsXNjXIrNDH73HxQUxqg,1932
|
||||
aiogram/types/web_app_data.py,sha256=CzkuU2VwVYQ7WBkFA6Zh8BL-qUKQeB__mcmhmVZnT2A,1107
|
||||
aiogram/types/web_app_info.py,sha256=aPH4uLFFLKNLEF3RUm3uYCkg9Hk545kMoUvrkg4TUds,931
|
||||
aiogram/types/webhook_info.py,sha256=huNLXO-9PAFI8ti5a4TcYfbWCirITn6N-i2Lphc1Yak,2986
|
||||
aiogram/types/write_access_allowed.py,sha256=3GiPknn_fKHAJ53FROE4AK4MtpwluNlAuZvFuOP6diA,1912
|
||||
aiogram/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
aiogram/utils/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/auth_widget.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/backoff.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/callback_answer.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/chat_action.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/chat_member.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/deep_linking.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/formatting.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/keyboard.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/link.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/magic_filter.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/markdown.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/media_group.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/mixins.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/mypy_hacks.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/payload.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/serialization.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/text_decorations.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/token.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/warnings.cpython-311.pyc,,
|
||||
aiogram/utils/__pycache__/web_app.cpython-311.pyc,,
|
||||
aiogram/utils/auth_widget.py,sha256=kcNMXu7hA4kWHw_PeZsGFaeC0m0Sbtbd2-8Q9rWfkHg,981
|
||||
aiogram/utils/backoff.py,sha256=D_d7z94PyR5USzeoIednnCgW07qQgwQNgVdPGkgrmJM,2123
|
||||
aiogram/utils/callback_answer.py,sha256=_NHsLMjfZBKOXtyCSHBh4s9V3go-U8Wsk5JqpMh-O4c,6573
|
||||
aiogram/utils/chat_action.py,sha256=3GW2mDqQQ5fv6LMpeqB0j-J1d1blml2aF4q7vqlnMBQ,12201
|
||||
aiogram/utils/chat_member.py,sha256=WwMEi__6DYeF55TFuLxPS-OQaDdTa0I2f-yJkt3Dio0,942
|
||||
aiogram/utils/deep_linking.py,sha256=D89nv29pnL63_N_E_ZfLjiarTQZhg0oq6RnRdWRDSTE,2980
|
||||
aiogram/utils/formatting.py,sha256=7je7KplskUsRgo4DFVWwnN0g4C8JMBYC4tTVxw-3zr4,16902
|
||||
aiogram/utils/i18n/__init__.py,sha256=mwTwSL1cuXYi3a3LBICqoH66y4kHVML24YNPbGlZ55M,440
|
||||
aiogram/utils/i18n/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiogram/utils/i18n/__pycache__/context.cpython-311.pyc,,
|
||||
aiogram/utils/i18n/__pycache__/core.cpython-311.pyc,,
|
||||
aiogram/utils/i18n/__pycache__/lazy_proxy.cpython-311.pyc,,
|
||||
aiogram/utils/i18n/__pycache__/middleware.cpython-311.pyc,,
|
||||
aiogram/utils/i18n/context.py,sha256=fhLzDZvxqRMvPu2-lEUrH7n09oHl-H0qo2mLFyKzCJk,549
|
||||
aiogram/utils/i18n/core.py,sha256=XX_iuwylDTfrfCrafnqiFq28LDr-bvoO4Qnkhy81d_M,3542
|
||||
aiogram/utils/i18n/lazy_proxy.py,sha256=0yHtyrejG9wG4yzLl1cDEsFomww2nyR7KFSbFyp7_NA,472
|
||||
aiogram/utils/i18n/middleware.py,sha256=lqeui9-x7ztMQPI0IeQeRawe6orMjpsg2EtvXTzAQj4,5874
|
||||
aiogram/utils/keyboard.py,sha256=wxFEfjx8n3zPK1v6Sv6a7glKILbZFS-xw_8nfKPrz6U,13343
|
||||
aiogram/utils/link.py,sha256=z7Zp5uk5z3iNO26-wZrhoCDNLt1N0KjbPYhthOq-50o,2261
|
||||
aiogram/utils/magic_filter.py,sha256=WGHOC9k2acxrcpkFF-ViQv3LbzRAKtJj5MRv7IEi75c,666
|
||||
aiogram/utils/markdown.py,sha256=3T1UVSzaAwnYnTNNq6pklq-TTs6Y6zINp-LIWgwrAyU,4481
|
||||
aiogram/utils/media_group.py,sha256=E28oJhPoTQ4iKXr0QUx5W1nd7VPHAJf0PQz0MeqG46E,14804
|
||||
aiogram/utils/mixins.py,sha256=ox0Q6BlxcyTfAtzLVMEY9eUfXXhnXtkkLBQlUQ6uL4o,2923
|
||||
aiogram/utils/mypy_hacks.py,sha256=cm5_tBzfrkG5OOIs2m5U4JfQKohj1KkmCRXNLTJFDy0,433
|
||||
aiogram/utils/payload.py,sha256=mGJdQryRHL07VbSjdzGbN1NbYzd_mN2MGY1RiY3_KX4,2942
|
||||
aiogram/utils/serialization.py,sha256=SMiqv2TQed_GOhvhWoaABFM65jjIiXqBJTRRdMQ9nXY,2765
|
||||
aiogram/utils/text_decorations.py,sha256=eEUykrlq22MQuKrzayVBWpBPaXEZqI6j5PbJH2HyFNE,8256
|
||||
aiogram/utils/token.py,sha256=iFfmK-pHGyPsF4ekWWcOlfH4OR9xGNAyCIavND8Ykrc,936
|
||||
aiogram/utils/warnings.py,sha256=xGsQcxrMXtdZfLOGRCqKRIJbw80DA39COcctikBfYAE,89
|
||||
aiogram/utils/web_app.py,sha256=pYFAohjk8OW3qRQkJebMtKaFJ7vOL4OJivUEh171kkI,7105
|
||||
aiogram/webhook/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
aiogram/webhook/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiogram/webhook/__pycache__/aiohttp_server.cpython-311.pyc,,
|
||||
aiogram/webhook/__pycache__/security.cpython-311.pyc,,
|
||||
aiogram/webhook/aiohttp_server.py,sha256=3uto1_vwf6h73SXFNSoDxGt49gFHFYDI1wf4uRcxWUg,10454
|
||||
aiogram/webhook/security.py,sha256=ifd2TrPSOlXfutYyAmRh0LT3hJkB4o79XmEV1lo6fv0,1350
|
@@ -1,4 +0,0 @@
|
||||
Wheel-Version: 1.0
|
||||
Generator: hatchling 1.27.0
|
||||
Root-Is-Purelib: true
|
||||
Tag: py3-none-any
|
@@ -1,18 +0,0 @@
|
||||
Copyright (c) 2017 - present Alex Root Junior
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies
|
||||
or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
|
||||
OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -1,2 +1,2 @@
|
||||
__version__ = "3.16.0"
|
||||
__api_version__ = "8.1"
|
||||
__version__ = "3.17.0"
|
||||
__api_version__ = "8.2"
|
||||
|
@@ -93,6 +93,8 @@ from ..methods import (
|
||||
PinChatMessage,
|
||||
PromoteChatMember,
|
||||
RefundStarPayment,
|
||||
RemoveChatVerification,
|
||||
RemoveUserVerification,
|
||||
ReopenForumTopic,
|
||||
ReopenGeneralForumTopic,
|
||||
ReplaceStickerInSet,
|
||||
@@ -154,6 +156,8 @@ from ..methods import (
|
||||
UnpinAllGeneralForumTopicMessages,
|
||||
UnpinChatMessage,
|
||||
UploadStickerFile,
|
||||
VerifyChat,
|
||||
VerifyUser,
|
||||
)
|
||||
from ..types import (
|
||||
BotCommand,
|
||||
@@ -3816,7 +3820,7 @@ class Bot:
|
||||
request_timeout: Optional[int] = None,
|
||||
) -> bool:
|
||||
"""
|
||||
Use this method to specify a URL and receive incoming updates via an outgoing webhook. Whenever there is an update for the bot, we will send an HTTPS POST request to the specified URL, containing a JSON-serialized :class:`aiogram.types.update.Update`. In case of an unsuccessful request, we will give up after a reasonable amount of attempts. Returns :code:`True` on success.
|
||||
Use this method to specify a URL and receive incoming updates via an outgoing webhook. Whenever there is an update for the bot, we will send an HTTPS POST request to the specified URL, containing a JSON-serialized :class:`aiogram.types.update.Update`. In case of an unsuccessful request (a request with response `HTTP status code <https://en.wikipedia.org/wiki/List_of_HTTP_status_codes>`_ different from :code:`2XY`), we will repeat the request and give up after a reasonable amount of attempts. Returns :code:`True` on success.
|
||||
If you'd like to make sure that the webhook was set by you, you can specify secret data in the parameter *secret_token*. If specified, the request will contain a header 'X-Telegram-Bot-Api-Secret-Token' with the secret token as content.
|
||||
|
||||
**Notes**
|
||||
@@ -4373,8 +4377,8 @@ class Bot:
|
||||
|
||||
:param name: Sticker set name
|
||||
:param user_id: User identifier of the sticker set owner
|
||||
:param format: Format of the thumbnail, must be one of 'static' for a **.WEBP** or **.PNG** image, 'animated' for a **.TGS** animation, or 'video' for a **WEBM** video
|
||||
:param thumbnail: A **.WEBP** or **.PNG** image with the thumbnail, must be up to 128 kilobytes in size and have a width and height of exactly 100px, or a **.TGS** animation with a thumbnail up to 32 kilobytes in size (see `https://core.telegram.org/stickers#animation-requirements <https://core.telegram.org/stickers#animation-requirements>`_`https://core.telegram.org/stickers#animation-requirements <https://core.telegram.org/stickers#animation-requirements>`_ for animated sticker technical requirements), or a **WEBM** video with the thumbnail up to 32 kilobytes in size; see `https://core.telegram.org/stickers#video-requirements <https://core.telegram.org/stickers#video-requirements>`_`https://core.telegram.org/stickers#video-requirements <https://core.telegram.org/stickers#video-requirements>`_ for video sticker technical requirements. Pass a *file_id* as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » <sending-files>`. Animated and video sticker set thumbnails can't be uploaded via HTTP URL. If omitted, then the thumbnail is dropped and the first sticker is used as the thumbnail.
|
||||
:param format: Format of the thumbnail, must be one of 'static' for a **.WEBP** or **.PNG** image, 'animated' for a **.TGS** animation, or 'video' for a **.WEBM** video
|
||||
:param thumbnail: A **.WEBP** or **.PNG** image with the thumbnail, must be up to 128 kilobytes in size and have a width and height of exactly 100px, or a **.TGS** animation with a thumbnail up to 32 kilobytes in size (see `https://core.telegram.org/stickers#animation-requirements <https://core.telegram.org/stickers#animation-requirements>`_`https://core.telegram.org/stickers#animation-requirements <https://core.telegram.org/stickers#animation-requirements>`_ for animated sticker technical requirements), or a **.WEBM** video with the thumbnail up to 32 kilobytes in size; see `https://core.telegram.org/stickers#video-requirements <https://core.telegram.org/stickers#video-requirements>`_`https://core.telegram.org/stickers#video-requirements <https://core.telegram.org/stickers#video-requirements>`_ for video sticker technical requirements. Pass a *file_id* as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » <sending-files>`. Animated and video sticker set thumbnails can't be uploaded via HTTP URL. If omitted, then the thumbnail is dropped and the first sticker is used as the thumbnail.
|
||||
:param request_timeout: Request timeout
|
||||
:return: Returns :code:`True` on success.
|
||||
"""
|
||||
@@ -4936,6 +4940,7 @@ class Bot:
|
||||
self,
|
||||
user_id: int,
|
||||
gift_id: str,
|
||||
pay_for_upgrade: Optional[bool] = None,
|
||||
text: Optional[str] = None,
|
||||
text_parse_mode: Optional[str] = None,
|
||||
text_entities: Optional[list[MessageEntity]] = None,
|
||||
@@ -4948,6 +4953,7 @@ class Bot:
|
||||
|
||||
:param user_id: Unique identifier of the target user that will receive the gift
|
||||
:param gift_id: Identifier of the gift
|
||||
:param pay_for_upgrade: Pass :code:`True` to pay for the gift upgrade from the bot's balance, thereby making the upgrade free for the receiver
|
||||
:param text: Text that will be shown along with the gift; 0-255 characters
|
||||
:param text_parse_mode: Mode for parsing entities in the text. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', and 'custom_emoji' are ignored.
|
||||
:param text_entities: A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of *text_parse_mode*. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', and 'custom_emoji' are ignored.
|
||||
@@ -4958,6 +4964,7 @@ class Bot:
|
||||
call = SendGift(
|
||||
user_id=user_id,
|
||||
gift_id=gift_id,
|
||||
pay_for_upgrade=pay_for_upgrade,
|
||||
text=text,
|
||||
text_parse_mode=text_parse_mode,
|
||||
text_entities=text_entities,
|
||||
@@ -4991,3 +4998,89 @@ class Bot:
|
||||
emoji_status_expiration_date=emoji_status_expiration_date,
|
||||
)
|
||||
return await self(call, request_timeout=request_timeout)
|
||||
|
||||
async def remove_chat_verification(
|
||||
self,
|
||||
chat_id: Union[int, str],
|
||||
request_timeout: Optional[int] = None,
|
||||
) -> bool:
|
||||
"""
|
||||
Removes verification from a chat that is currently verified on behalf of the organization represented by the bot. Returns :code:`True` on success.
|
||||
|
||||
Source: https://core.telegram.org/bots/api#removechatverification
|
||||
|
||||
:param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)
|
||||
:param request_timeout: Request timeout
|
||||
:return: Returns :code:`True` on success.
|
||||
"""
|
||||
|
||||
call = RemoveChatVerification(
|
||||
chat_id=chat_id,
|
||||
)
|
||||
return await self(call, request_timeout=request_timeout)
|
||||
|
||||
async def remove_user_verification(
|
||||
self,
|
||||
user_id: int,
|
||||
request_timeout: Optional[int] = None,
|
||||
) -> bool:
|
||||
"""
|
||||
Removes verification from a user who is currently verified on behalf of the organization represented by the bot. Returns :code:`True` on success.
|
||||
|
||||
Source: https://core.telegram.org/bots/api#removeuserverification
|
||||
|
||||
:param user_id: Unique identifier of the target user
|
||||
:param request_timeout: Request timeout
|
||||
:return: Returns :code:`True` on success.
|
||||
"""
|
||||
|
||||
call = RemoveUserVerification(
|
||||
user_id=user_id,
|
||||
)
|
||||
return await self(call, request_timeout=request_timeout)
|
||||
|
||||
async def verify_chat(
|
||||
self,
|
||||
chat_id: Union[int, str],
|
||||
custom_description: Optional[str] = None,
|
||||
request_timeout: Optional[int] = None,
|
||||
) -> bool:
|
||||
"""
|
||||
Verifies a chat on behalf of the organization which is represented by the bot. Returns :code:`True` on success.
|
||||
|
||||
Source: https://core.telegram.org/bots/api#verifychat
|
||||
|
||||
:param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)
|
||||
:param custom_description: Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.
|
||||
:param request_timeout: Request timeout
|
||||
:return: Returns :code:`True` on success.
|
||||
"""
|
||||
|
||||
call = VerifyChat(
|
||||
chat_id=chat_id,
|
||||
custom_description=custom_description,
|
||||
)
|
||||
return await self(call, request_timeout=request_timeout)
|
||||
|
||||
async def verify_user(
|
||||
self,
|
||||
user_id: int,
|
||||
custom_description: Optional[str] = None,
|
||||
request_timeout: Optional[int] = None,
|
||||
) -> bool:
|
||||
"""
|
||||
Verifies a user on behalf of the organization which is represented by the bot. Returns :code:`True` on success.
|
||||
|
||||
Source: https://core.telegram.org/bots/api#verifyuser
|
||||
|
||||
:param user_id: Unique identifier of the target user
|
||||
:param custom_description: Custom description for the verification; 0-70 characters. Must be empty if the organization isn't allowed to provide a custom verification description.
|
||||
:param request_timeout: Request timeout
|
||||
:return: Returns :code:`True` on success.
|
||||
"""
|
||||
|
||||
call = VerifyUser(
|
||||
user_id=user_id,
|
||||
custom_description=custom_description,
|
||||
)
|
||||
return await self(call, request_timeout=request_timeout)
|
||||
|
@@ -70,6 +70,8 @@ from .log_out import LogOut
|
||||
from .pin_chat_message import PinChatMessage
|
||||
from .promote_chat_member import PromoteChatMember
|
||||
from .refund_star_payment import RefundStarPayment
|
||||
from .remove_chat_verification import RemoveChatVerification
|
||||
from .remove_user_verification import RemoveUserVerification
|
||||
from .reopen_forum_topic import ReopenForumTopic
|
||||
from .reopen_general_forum_topic import ReopenGeneralForumTopic
|
||||
from .replace_sticker_in_set import ReplaceStickerInSet
|
||||
@@ -130,6 +132,8 @@ from .unpin_all_forum_topic_messages import UnpinAllForumTopicMessages
|
||||
from .unpin_all_general_forum_topic_messages import UnpinAllGeneralForumTopicMessages
|
||||
from .unpin_chat_message import UnpinChatMessage
|
||||
from .upload_sticker_file import UploadStickerFile
|
||||
from .verify_chat import VerifyChat
|
||||
from .verify_user import VerifyUser
|
||||
|
||||
__all__ = (
|
||||
"AddStickerToSet",
|
||||
@@ -203,6 +207,8 @@ __all__ = (
|
||||
"PinChatMessage",
|
||||
"PromoteChatMember",
|
||||
"RefundStarPayment",
|
||||
"RemoveChatVerification",
|
||||
"RemoveUserVerification",
|
||||
"ReopenForumTopic",
|
||||
"ReopenGeneralForumTopic",
|
||||
"ReplaceStickerInSet",
|
||||
@@ -266,4 +272,6 @@ __all__ = (
|
||||
"UnpinAllGeneralForumTopicMessages",
|
||||
"UnpinChatMessage",
|
||||
"UploadStickerFile",
|
||||
"VerifyChat",
|
||||
"VerifyUser",
|
||||
)
|
||||
|
@@ -20,6 +20,8 @@ class SendGift(TelegramMethod[bool]):
|
||||
"""Unique identifier of the target user that will receive the gift"""
|
||||
gift_id: str
|
||||
"""Identifier of the gift"""
|
||||
pay_for_upgrade: Optional[bool] = None
|
||||
"""Pass :code:`True` to pay for the gift upgrade from the bot's balance, thereby making the upgrade free for the receiver"""
|
||||
text: Optional[str] = None
|
||||
"""Text that will be shown along with the gift; 0-255 characters"""
|
||||
text_parse_mode: Optional[str] = None
|
||||
@@ -36,6 +38,7 @@ class SendGift(TelegramMethod[bool]):
|
||||
*,
|
||||
user_id: int,
|
||||
gift_id: str,
|
||||
pay_for_upgrade: Optional[bool] = None,
|
||||
text: Optional[str] = None,
|
||||
text_parse_mode: Optional[str] = None,
|
||||
text_entities: Optional[list[MessageEntity]] = None,
|
||||
@@ -48,6 +51,7 @@ class SendGift(TelegramMethod[bool]):
|
||||
super().__init__(
|
||||
user_id=user_id,
|
||||
gift_id=gift_id,
|
||||
pay_for_upgrade=pay_for_upgrade,
|
||||
text=text,
|
||||
text_parse_mode=text_parse_mode,
|
||||
text_entities=text_entities,
|
||||
|
@@ -21,9 +21,9 @@ class SetStickerSetThumbnail(TelegramMethod[bool]):
|
||||
user_id: int
|
||||
"""User identifier of the sticker set owner"""
|
||||
format: str
|
||||
"""Format of the thumbnail, must be one of 'static' for a **.WEBP** or **.PNG** image, 'animated' for a **.TGS** animation, or 'video' for a **WEBM** video"""
|
||||
"""Format of the thumbnail, must be one of 'static' for a **.WEBP** or **.PNG** image, 'animated' for a **.TGS** animation, or 'video' for a **.WEBM** video"""
|
||||
thumbnail: Optional[Union[InputFile, str]] = None
|
||||
"""A **.WEBP** or **.PNG** image with the thumbnail, must be up to 128 kilobytes in size and have a width and height of exactly 100px, or a **.TGS** animation with a thumbnail up to 32 kilobytes in size (see `https://core.telegram.org/stickers#animation-requirements <https://core.telegram.org/stickers#animation-requirements>`_`https://core.telegram.org/stickers#animation-requirements <https://core.telegram.org/stickers#animation-requirements>`_ for animated sticker technical requirements), or a **WEBM** video with the thumbnail up to 32 kilobytes in size; see `https://core.telegram.org/stickers#video-requirements <https://core.telegram.org/stickers#video-requirements>`_`https://core.telegram.org/stickers#video-requirements <https://core.telegram.org/stickers#video-requirements>`_ for video sticker technical requirements. Pass a *file_id* as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » <sending-files>`. Animated and video sticker set thumbnails can't be uploaded via HTTP URL. If omitted, then the thumbnail is dropped and the first sticker is used as the thumbnail."""
|
||||
"""A **.WEBP** or **.PNG** image with the thumbnail, must be up to 128 kilobytes in size and have a width and height of exactly 100px, or a **.TGS** animation with a thumbnail up to 32 kilobytes in size (see `https://core.telegram.org/stickers#animation-requirements <https://core.telegram.org/stickers#animation-requirements>`_`https://core.telegram.org/stickers#animation-requirements <https://core.telegram.org/stickers#animation-requirements>`_ for animated sticker technical requirements), or a **.WEBM** video with the thumbnail up to 32 kilobytes in size; see `https://core.telegram.org/stickers#video-requirements <https://core.telegram.org/stickers#video-requirements>`_`https://core.telegram.org/stickers#video-requirements <https://core.telegram.org/stickers#video-requirements>`_ for video sticker technical requirements. Pass a *file_id* as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » <sending-files>`. Animated and video sticker set thumbnails can't be uploaded via HTTP URL. If omitted, then the thumbnail is dropped and the first sticker is used as the thumbnail."""
|
||||
|
||||
if TYPE_CHECKING:
|
||||
# DO NOT EDIT MANUALLY!!!
|
||||
|
@@ -8,7 +8,7 @@ from .base import TelegramMethod
|
||||
|
||||
class SetWebhook(TelegramMethod[bool]):
|
||||
"""
|
||||
Use this method to specify a URL and receive incoming updates via an outgoing webhook. Whenever there is an update for the bot, we will send an HTTPS POST request to the specified URL, containing a JSON-serialized :class:`aiogram.types.update.Update`. In case of an unsuccessful request, we will give up after a reasonable amount of attempts. Returns :code:`True` on success.
|
||||
Use this method to specify a URL and receive incoming updates via an outgoing webhook. Whenever there is an update for the bot, we will send an HTTPS POST request to the specified URL, containing a JSON-serialized :class:`aiogram.types.update.Update`. In case of an unsuccessful request (a request with response `HTTP status code <https://en.wikipedia.org/wiki/List_of_HTTP_status_codes>`_ different from :code:`2XY`), we will repeat the request and give up after a reasonable amount of attempts. Returns :code:`True` on success.
|
||||
If you'd like to make sure that the webhook was set by you, you can specify secret data in the parameter *secret_token*. If specified, the request will contain a header 'X-Telegram-Bot-Api-Secret-Token' with the secret token as content.
|
||||
|
||||
**Notes**
|
||||
|
@@ -13,7 +13,7 @@ if TYPE_CHECKING:
|
||||
|
||||
class BackgroundTypePattern(BackgroundType):
|
||||
"""
|
||||
The background is a PNG or TGV (gzipped subset of SVG with MIME type 'application/x-tgwallpattern') pattern to be combined with the background fill chosen by the user.
|
||||
The background is a .PNG or .TGV (gzipped subset of SVG with MIME type 'application/x-tgwallpattern') pattern to be combined with the background fill chosen by the user.
|
||||
|
||||
Source: https://core.telegram.org/bots/api#backgroundtypepattern
|
||||
"""
|
||||
|
@@ -21,6 +21,8 @@ class Gift(TelegramObject):
|
||||
"""The sticker that represents the gift"""
|
||||
star_count: int
|
||||
"""The number of Telegram Stars that must be paid to send the sticker"""
|
||||
upgrade_star_count: Optional[int] = None
|
||||
"""*Optional*. The number of Telegram Stars that must be paid to upgrade the gift to a unique one"""
|
||||
total_count: Optional[int] = None
|
||||
"""*Optional*. The total number of the gifts of this type that can be sent; for limited gifts only"""
|
||||
remaining_count: Optional[int] = None
|
||||
@@ -36,6 +38,7 @@ class Gift(TelegramObject):
|
||||
id: str,
|
||||
sticker: Sticker,
|
||||
star_count: int,
|
||||
upgrade_star_count: Optional[int] = None,
|
||||
total_count: Optional[int] = None,
|
||||
remaining_count: Optional[int] = None,
|
||||
**__pydantic_kwargs: Any,
|
||||
@@ -48,6 +51,7 @@ class Gift(TelegramObject):
|
||||
id=id,
|
||||
sticker=sticker,
|
||||
star_count=star_count,
|
||||
upgrade_star_count=upgrade_star_count,
|
||||
total_count=total_count,
|
||||
remaining_count=remaining_count,
|
||||
**__pydantic_kwargs,
|
||||
|
@@ -2,6 +2,8 @@ from __future__ import annotations
|
||||
|
||||
from typing import TYPE_CHECKING, Any, Literal, Optional, Union
|
||||
|
||||
from pydantic import Field
|
||||
|
||||
from ..enums import InlineQueryResultType
|
||||
from .inline_query_result import InlineQueryResult
|
||||
|
||||
@@ -39,8 +41,6 @@ class InlineQueryResultArticle(InlineQueryResult):
|
||||
"""*Optional*. `Inline keyboard <https://core.telegram.org/bots/features#inline-keyboards>`_ attached to the message"""
|
||||
url: Optional[str] = None
|
||||
"""*Optional*. URL of the result"""
|
||||
hide_url: Optional[bool] = None
|
||||
"""*Optional*. Pass :code:`True` if you don't want the URL to be shown in the message"""
|
||||
description: Optional[str] = None
|
||||
"""*Optional*. Short description of the result"""
|
||||
thumbnail_url: Optional[str] = None
|
||||
@@ -49,6 +49,11 @@ class InlineQueryResultArticle(InlineQueryResult):
|
||||
"""*Optional*. Thumbnail width"""
|
||||
thumbnail_height: Optional[int] = None
|
||||
"""*Optional*. Thumbnail height"""
|
||||
hide_url: Optional[bool] = Field(None, json_schema_extra={"deprecated": True})
|
||||
"""*Optional*. Pass :code:`True` if you don't want the URL to be shown in the message
|
||||
|
||||
.. deprecated:: API:8.2
|
||||
https://core.telegram.org/bots/api-changelog#january-1-2025"""
|
||||
|
||||
if TYPE_CHECKING:
|
||||
# DO NOT EDIT MANUALLY!!!
|
||||
@@ -69,11 +74,11 @@ class InlineQueryResultArticle(InlineQueryResult):
|
||||
],
|
||||
reply_markup: Optional[InlineKeyboardMarkup] = None,
|
||||
url: Optional[str] = None,
|
||||
hide_url: Optional[bool] = None,
|
||||
description: Optional[str] = None,
|
||||
thumbnail_url: Optional[str] = None,
|
||||
thumbnail_width: Optional[int] = None,
|
||||
thumbnail_height: Optional[int] = None,
|
||||
hide_url: Optional[bool] = None,
|
||||
**__pydantic_kwargs: Any,
|
||||
) -> None:
|
||||
# DO NOT EDIT MANUALLY!!!
|
||||
@@ -87,10 +92,10 @@ class InlineQueryResultArticle(InlineQueryResult):
|
||||
input_message_content=input_message_content,
|
||||
reply_markup=reply_markup,
|
||||
url=url,
|
||||
hide_url=hide_url,
|
||||
description=description,
|
||||
thumbnail_url=thumbnail_url,
|
||||
thumbnail_width=thumbnail_width,
|
||||
thumbnail_height=thumbnail_height,
|
||||
hide_url=hide_url,
|
||||
**__pydantic_kwargs,
|
||||
)
|
||||
|
@@ -28,7 +28,7 @@ class InlineQueryResultGif(InlineQueryResult):
|
||||
id: str
|
||||
"""Unique identifier for this result, 1-64 bytes"""
|
||||
gif_url: str
|
||||
"""A valid URL for the GIF file. File size must not exceed 1MB"""
|
||||
"""A valid URL for the GIF file"""
|
||||
thumbnail_url: str
|
||||
"""URL of the static (JPEG or GIF) or animated (MPEG4) thumbnail for the result"""
|
||||
gif_width: Optional[int] = None
|
||||
|
@@ -28,7 +28,7 @@ class InlineQueryResultMpeg4Gif(InlineQueryResult):
|
||||
id: str
|
||||
"""Unique identifier for this result, 1-64 bytes"""
|
||||
mpeg4_url: str
|
||||
"""A valid URL for the MPEG4 file. File size must not exceed 1MB"""
|
||||
"""A valid URL for the MPEG4 file"""
|
||||
thumbnail_url: str
|
||||
"""URL of the static (JPEG or GIF) or animated (MPEG4) thumbnail for the result"""
|
||||
mpeg4_width: Optional[int] = None
|
||||
|
@@ -19,7 +19,7 @@ class InputSticker(TelegramObject):
|
||||
sticker: Union[InputFile, str]
|
||||
"""The added sticker. Pass a *file_id* as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, upload a new one using multipart/form-data, or pass 'attach://<file_attach_name>' to upload a new one using multipart/form-data under <file_attach_name> name. Animated and video stickers can't be uploaded via HTTP URL. :ref:`More information on Sending Files » <sending-files>`"""
|
||||
format: str
|
||||
"""Format of the added sticker, must be one of 'static' for a **.WEBP** or **.PNG** image, 'animated' for a **.TGS** animation, 'video' for a **WEBM** video"""
|
||||
"""Format of the added sticker, must be one of 'static' for a **.WEBP** or **.PNG** image, 'animated' for a **.TGS** animation, 'video' for a **.WEBM** video"""
|
||||
emoji_list: list[str]
|
||||
"""List of 1-20 emoji associated with the sticker"""
|
||||
mask_position: Optional[MaskPosition] = None
|
||||
|
@@ -1 +0,0 @@
|
||||
pip
|
@@ -1,279 +0,0 @@
|
||||
A. HISTORY OF THE SOFTWARE
|
||||
==========================
|
||||
|
||||
Python was created in the early 1990s by Guido van Rossum at Stichting
|
||||
Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands
|
||||
as a successor of a language called ABC. Guido remains Python's
|
||||
principal author, although it includes many contributions from others.
|
||||
|
||||
In 1995, Guido continued his work on Python at the Corporation for
|
||||
National Research Initiatives (CNRI, see https://www.cnri.reston.va.us)
|
||||
in Reston, Virginia where he released several versions of the
|
||||
software.
|
||||
|
||||
In May 2000, Guido and the Python core development team moved to
|
||||
BeOpen.com to form the BeOpen PythonLabs team. In October of the same
|
||||
year, the PythonLabs team moved to Digital Creations, which became
|
||||
Zope Corporation. In 2001, the Python Software Foundation (PSF, see
|
||||
https://www.python.org/psf/) was formed, a non-profit organization
|
||||
created specifically to own Python-related Intellectual Property.
|
||||
Zope Corporation was a sponsoring member of the PSF.
|
||||
|
||||
All Python releases are Open Source (see https://opensource.org for
|
||||
the Open Source Definition). Historically, most, but not all, Python
|
||||
releases have also been GPL-compatible; the table below summarizes
|
||||
the various releases.
|
||||
|
||||
Release Derived Year Owner GPL-
|
||||
from compatible? (1)
|
||||
|
||||
0.9.0 thru 1.2 1991-1995 CWI yes
|
||||
1.3 thru 1.5.2 1.2 1995-1999 CNRI yes
|
||||
1.6 1.5.2 2000 CNRI no
|
||||
2.0 1.6 2000 BeOpen.com no
|
||||
1.6.1 1.6 2001 CNRI yes (2)
|
||||
2.1 2.0+1.6.1 2001 PSF no
|
||||
2.0.1 2.0+1.6.1 2001 PSF yes
|
||||
2.1.1 2.1+2.0.1 2001 PSF yes
|
||||
2.1.2 2.1.1 2002 PSF yes
|
||||
2.1.3 2.1.2 2002 PSF yes
|
||||
2.2 and above 2.1.1 2001-now PSF yes
|
||||
|
||||
Footnotes:
|
||||
|
||||
(1) GPL-compatible doesn't mean that we're distributing Python under
|
||||
the GPL. All Python licenses, unlike the GPL, let you distribute
|
||||
a modified version without making your changes open source. The
|
||||
GPL-compatible licenses make it possible to combine Python with
|
||||
other software that is released under the GPL; the others don't.
|
||||
|
||||
(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
|
||||
because its license has a choice of law clause. According to
|
||||
CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
|
||||
is "not incompatible" with the GPL.
|
||||
|
||||
Thanks to the many outside volunteers who have worked under Guido's
|
||||
direction to make these releases possible.
|
||||
|
||||
|
||||
B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
|
||||
===============================================================
|
||||
|
||||
Python software and documentation are licensed under the
|
||||
Python Software Foundation License Version 2.
|
||||
|
||||
Starting with Python 3.8.6, examples, recipes, and other code in
|
||||
the documentation are dual licensed under the PSF License Version 2
|
||||
and the Zero-Clause BSD license.
|
||||
|
||||
Some software incorporated into Python is under different licenses.
|
||||
The licenses are listed with code falling under that license.
|
||||
|
||||
|
||||
PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
|
||||
--------------------------------------------
|
||||
|
||||
1. This LICENSE AGREEMENT is between the Python Software Foundation
|
||||
("PSF"), and the Individual or Organization ("Licensee") accessing and
|
||||
otherwise using this software ("Python") in source or binary form and
|
||||
its associated documentation.
|
||||
|
||||
2. Subject to the terms and conditions of this License Agreement, PSF hereby
|
||||
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
|
||||
analyze, test, perform and/or display publicly, prepare derivative works,
|
||||
distribute, and otherwise use Python alone or in any derivative version,
|
||||
provided, however, that PSF's License Agreement and PSF's notice of copyright,
|
||||
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
|
||||
2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation;
|
||||
All Rights Reserved" are retained in Python alone or in any derivative version
|
||||
prepared by Licensee.
|
||||
|
||||
3. In the event Licensee prepares a derivative work that is based on
|
||||
or incorporates Python or any part thereof, and wants to make
|
||||
the derivative work available to others as provided herein, then
|
||||
Licensee hereby agrees to include in any such work a brief summary of
|
||||
the changes made to Python.
|
||||
|
||||
4. PSF is making Python available to Licensee on an "AS IS"
|
||||
basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
|
||||
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
|
||||
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
|
||||
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
|
||||
INFRINGE ANY THIRD PARTY RIGHTS.
|
||||
|
||||
5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
|
||||
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
|
||||
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
|
||||
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
|
||||
|
||||
6. This License Agreement will automatically terminate upon a material
|
||||
breach of its terms and conditions.
|
||||
|
||||
7. Nothing in this License Agreement shall be deemed to create any
|
||||
relationship of agency, partnership, or joint venture between PSF and
|
||||
Licensee. This License Agreement does not grant permission to use PSF
|
||||
trademarks or trade name in a trademark sense to endorse or promote
|
||||
products or services of Licensee, or any third party.
|
||||
|
||||
8. By copying, installing or otherwise using Python, Licensee
|
||||
agrees to be bound by the terms and conditions of this License
|
||||
Agreement.
|
||||
|
||||
|
||||
BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
|
||||
-------------------------------------------
|
||||
|
||||
BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
|
||||
|
||||
1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
|
||||
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
|
||||
Individual or Organization ("Licensee") accessing and otherwise using
|
||||
this software in source or binary form and its associated
|
||||
documentation ("the Software").
|
||||
|
||||
2. Subject to the terms and conditions of this BeOpen Python License
|
||||
Agreement, BeOpen hereby grants Licensee a non-exclusive,
|
||||
royalty-free, world-wide license to reproduce, analyze, test, perform
|
||||
and/or display publicly, prepare derivative works, distribute, and
|
||||
otherwise use the Software alone or in any derivative version,
|
||||
provided, however, that the BeOpen Python License is retained in the
|
||||
Software, alone or in any derivative version prepared by Licensee.
|
||||
|
||||
3. BeOpen is making the Software available to Licensee on an "AS IS"
|
||||
basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
|
||||
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
|
||||
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
|
||||
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
|
||||
INFRINGE ANY THIRD PARTY RIGHTS.
|
||||
|
||||
4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
|
||||
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
|
||||
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
|
||||
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
|
||||
|
||||
5. This License Agreement will automatically terminate upon a material
|
||||
breach of its terms and conditions.
|
||||
|
||||
6. This License Agreement shall be governed by and interpreted in all
|
||||
respects by the law of the State of California, excluding conflict of
|
||||
law provisions. Nothing in this License Agreement shall be deemed to
|
||||
create any relationship of agency, partnership, or joint venture
|
||||
between BeOpen and Licensee. This License Agreement does not grant
|
||||
permission to use BeOpen trademarks or trade names in a trademark
|
||||
sense to endorse or promote products or services of Licensee, or any
|
||||
third party. As an exception, the "BeOpen Python" logos available at
|
||||
http://www.pythonlabs.com/logos.html may be used according to the
|
||||
permissions granted on that web page.
|
||||
|
||||
7. By copying, installing or otherwise using the software, Licensee
|
||||
agrees to be bound by the terms and conditions of this License
|
||||
Agreement.
|
||||
|
||||
|
||||
CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
|
||||
---------------------------------------
|
||||
|
||||
1. This LICENSE AGREEMENT is between the Corporation for National
|
||||
Research Initiatives, having an office at 1895 Preston White Drive,
|
||||
Reston, VA 20191 ("CNRI"), and the Individual or Organization
|
||||
("Licensee") accessing and otherwise using Python 1.6.1 software in
|
||||
source or binary form and its associated documentation.
|
||||
|
||||
2. Subject to the terms and conditions of this License Agreement, CNRI
|
||||
hereby grants Licensee a nonexclusive, royalty-free, world-wide
|
||||
license to reproduce, analyze, test, perform and/or display publicly,
|
||||
prepare derivative works, distribute, and otherwise use Python 1.6.1
|
||||
alone or in any derivative version, provided, however, that CNRI's
|
||||
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
|
||||
1995-2001 Corporation for National Research Initiatives; All Rights
|
||||
Reserved" are retained in Python 1.6.1 alone or in any derivative
|
||||
version prepared by Licensee. Alternately, in lieu of CNRI's License
|
||||
Agreement, Licensee may substitute the following text (omitting the
|
||||
quotes): "Python 1.6.1 is made available subject to the terms and
|
||||
conditions in CNRI's License Agreement. This Agreement together with
|
||||
Python 1.6.1 may be located on the internet using the following
|
||||
unique, persistent identifier (known as a handle): 1895.22/1013. This
|
||||
Agreement may also be obtained from a proxy server on the internet
|
||||
using the following URL: http://hdl.handle.net/1895.22/1013".
|
||||
|
||||
3. In the event Licensee prepares a derivative work that is based on
|
||||
or incorporates Python 1.6.1 or any part thereof, and wants to make
|
||||
the derivative work available to others as provided herein, then
|
||||
Licensee hereby agrees to include in any such work a brief summary of
|
||||
the changes made to Python 1.6.1.
|
||||
|
||||
4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
|
||||
basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
|
||||
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
|
||||
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
|
||||
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
|
||||
INFRINGE ANY THIRD PARTY RIGHTS.
|
||||
|
||||
5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
|
||||
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
|
||||
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
|
||||
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
|
||||
|
||||
6. This License Agreement will automatically terminate upon a material
|
||||
breach of its terms and conditions.
|
||||
|
||||
7. This License Agreement shall be governed by the federal
|
||||
intellectual property law of the United States, including without
|
||||
limitation the federal copyright law, and, to the extent such
|
||||
U.S. federal law does not apply, by the law of the Commonwealth of
|
||||
Virginia, excluding Virginia's conflict of law provisions.
|
||||
Notwithstanding the foregoing, with regard to derivative works based
|
||||
on Python 1.6.1 that incorporate non-separable material that was
|
||||
previously distributed under the GNU General Public License (GPL), the
|
||||
law of the Commonwealth of Virginia shall govern this License
|
||||
Agreement only as to issues arising under or with respect to
|
||||
Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this
|
||||
License Agreement shall be deemed to create any relationship of
|
||||
agency, partnership, or joint venture between CNRI and Licensee. This
|
||||
License Agreement does not grant permission to use CNRI trademarks or
|
||||
trade name in a trademark sense to endorse or promote products or
|
||||
services of Licensee, or any third party.
|
||||
|
||||
8. By clicking on the "ACCEPT" button where indicated, or by copying,
|
||||
installing or otherwise using Python 1.6.1, Licensee agrees to be
|
||||
bound by the terms and conditions of this License Agreement.
|
||||
|
||||
ACCEPT
|
||||
|
||||
|
||||
CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
|
||||
--------------------------------------------------
|
||||
|
||||
Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
|
||||
The Netherlands. All rights reserved.
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Stichting Mathematisch
|
||||
Centrum or CWI not be used in advertising or publicity pertaining to
|
||||
distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
|
||||
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
|
||||
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
PERFORMANCE OF THIS SOFTWARE.
|
@@ -1,126 +0,0 @@
|
||||
Metadata-Version: 2.1
|
||||
Name: aiohappyeyeballs
|
||||
Version: 2.4.4
|
||||
Summary: Happy Eyeballs for asyncio
|
||||
Home-page: https://github.com/aio-libs/aiohappyeyeballs
|
||||
License: PSF-2.0
|
||||
Author: J. Nick Koston
|
||||
Author-email: nick@koston.org
|
||||
Requires-Python: >=3.8
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: Python Software Foundation License
|
||||
Classifier: License :: Other/Proprietary License
|
||||
Classifier: Natural Language :: English
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
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
|
||||
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.
|
||||
|
@@ -1,16 +0,0 @@
|
||||
aiohappyeyeballs-2.4.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
aiohappyeyeballs-2.4.4.dist-info/LICENSE,sha256=Oy-B_iHRgcSZxZolbI4ZaEVdZonSaaqFNzv7avQdo78,13936
|
||||
aiohappyeyeballs-2.4.4.dist-info/METADATA,sha256=CT9LuDMNOove0oCR6kFFKMoLkA-D_XuBVr_w4uCpcpY,6070
|
||||
aiohappyeyeballs-2.4.4.dist-info/RECORD,,
|
||||
aiohappyeyeballs-2.4.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
||||
aiohappyeyeballs/__init__.py,sha256=64CUKZ1vpW6MnkJIyy-CHBU7o6c_TbKO7f6WAViSl9s,317
|
||||
aiohappyeyeballs/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiohappyeyeballs/__pycache__/_staggered.cpython-311.pyc,,
|
||||
aiohappyeyeballs/__pycache__/impl.cpython-311.pyc,,
|
||||
aiohappyeyeballs/__pycache__/types.cpython-311.pyc,,
|
||||
aiohappyeyeballs/__pycache__/utils.cpython-311.pyc,,
|
||||
aiohappyeyeballs/_staggered.py,sha256=LbTGSjib2cb11QDE4RlSVQNUauK3X9p1avCR9YuJF7s,6723
|
||||
aiohappyeyeballs/impl.py,sha256=qrAnR-7xaxh6W7mg0i-9ozAJpzvCm7w-P3Yhy_LaTaM,8109
|
||||
aiohappyeyeballs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
aiohappyeyeballs/types.py,sha256=iYPiBTl5J7YEjnIqEOVUTRPzz2DwqSHBRhvbAlM0zv0,234
|
||||
aiohappyeyeballs/utils.py,sha256=on9GxIR0LhEfZu8P6Twi9hepX9zDanuZM20MWsb3xlQ,3028
|
@@ -1,4 +0,0 @@
|
||||
Wheel-Version: 1.0
|
||||
Generator: poetry-core 1.9.1
|
||||
Root-Is-Purelib: true
|
||||
Tag: py3-none-any
|
@@ -1,4 +1,4 @@
|
||||
__version__ = "2.4.4"
|
||||
__version__ = "2.4.6"
|
||||
|
||||
from .impl import start_connection
|
||||
from .types import AddrInfoType
|
||||
|
@@ -156,9 +156,9 @@ async def staggered_race(
|
||||
# so we have no winner and all coroutines failed.
|
||||
break
|
||||
|
||||
while tasks:
|
||||
while tasks or start_next:
|
||||
done = await _wait_one(
|
||||
[*tasks, start_next] if start_next else tasks, loop
|
||||
(*tasks, start_next) if start_next else tasks, loop
|
||||
)
|
||||
if done is start_next:
|
||||
# The current task has failed or the timer has expired
|
||||
|
@@ -5,22 +5,11 @@ import collections
|
||||
import functools
|
||||
import itertools
|
||||
import socket
|
||||
import sys
|
||||
from typing import List, Optional, Sequence, Union
|
||||
|
||||
from . import _staggered
|
||||
from .types import AddrInfoType
|
||||
|
||||
if sys.version_info < (3, 8, 2): # noqa: UP036
|
||||
# asyncio.staggered is broken in Python 3.8.0 and 3.8.1
|
||||
# so it must be patched:
|
||||
# https://github.com/aio-libs/aiohttp/issues/8556
|
||||
# https://bugs.python.org/issue39129
|
||||
# https://github.com/python/cpython/pull/17693
|
||||
import asyncio.futures
|
||||
|
||||
asyncio.futures.TimeoutError = asyncio.TimeoutError # type: ignore[attr-defined]
|
||||
|
||||
|
||||
async def start_connection(
|
||||
addr_infos: Sequence[AddrInfoType],
|
||||
@@ -162,7 +151,7 @@ async def _connect_sock(
|
||||
msg = (
|
||||
f"error while attempting to bind on "
|
||||
f"address {laddr!r}: "
|
||||
f"{exc.strerror.lower()}"
|
||||
f"{(exc.strerror or '').lower()}"
|
||||
)
|
||||
exc = OSError(exc.errno, msg)
|
||||
my_exceptions.append(exc)
|
||||
|
@@ -1 +0,0 @@
|
||||
pip
|
@@ -1,13 +0,0 @@
|
||||
Copyright aio-libs contributors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
@@ -1,250 +0,0 @@
|
||||
Metadata-Version: 2.1
|
||||
Name: aiohttp
|
||||
Version: 3.11.11
|
||||
Summary: Async http client/server framework (asyncio)
|
||||
Home-page: https://github.com/aio-libs/aiohttp
|
||||
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/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: License :: OSI Approved :: Apache Software License
|
||||
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: Topic :: Internet :: WWW/HTTP
|
||||
Requires-Python: >=3.9
|
||||
Description-Content-Type: text/x-rst
|
||||
License-File: LICENSE.txt
|
||||
Requires-Dist: aiohappyeyeballs>=2.3.0
|
||||
Requires-Dist: aiosignal>=1.1.2
|
||||
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.2.0; (sys_platform == "linux" or sys_platform == "darwin") and extra == "speedups"
|
||||
Requires-Dist: Brotli; platform_python_implementation == "CPython" and extra == "speedups"
|
||||
Requires-Dist: brotlicffi; platform_python_implementation != "CPython" and extra == "speedups"
|
||||
|
||||
==================================
|
||||
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://img.shields.io/endpoint?url=https://codspeed.io/badge.json
|
||||
:target: https://codspeed.io/aio-libs/aiohttp
|
||||
:alt: Codspeed.io status for aiohttp
|
||||
|
||||
.. image:: https://badge.fury.io/py/aiohttp.svg
|
||||
:target: https://pypi.org/project/aiohttp
|
||||
:alt: Latest PyPI package version
|
||||
|
||||
.. image:: https://readthedocs.org/projects/aiohttp/badge/?version=latest
|
||||
:target: https://docs.aiohttp.org/
|
||||
:alt: Latest Read The Docs
|
||||
|
||||
.. 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
|
||||
|
||||
|
||||
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
|
@@ -1,131 +0,0 @@
|
||||
aiohttp-3.11.11.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
aiohttp-3.11.11.dist-info/LICENSE.txt,sha256=wUk-nxDVnR-6n53ygAjhVX4zz5-6yM4SY6ozk5goA94,601
|
||||
aiohttp-3.11.11.dist-info/METADATA,sha256=tTbNwfk9PGYopBf9V1WlSg888cl-Fx3xBsN89ySxP-c,7962
|
||||
aiohttp-3.11.11.dist-info/RECORD,,
|
||||
aiohttp-3.11.11.dist-info/WHEEL,sha256=nkBcd8Ko0v5sEcSagm2-x_RVrb8gBSkTa8VFFZ0Mr1o,101
|
||||
aiohttp-3.11.11.dist-info/top_level.txt,sha256=iv-JIaacmTl-hSho3QmphcKnbRRYx1st47yjz_178Ro,8
|
||||
aiohttp/.hash/_cparser.pxd.hash,sha256=dVGMrCmyJM_owqoRLPezK095md0X5R319koTuhUN6DQ,64
|
||||
aiohttp/.hash/_find_header.pxd.hash,sha256=W5qRPWDc55gArGZkriI5tztmQHkrdwR6NdQfRQfTxIg,64
|
||||
aiohttp/.hash/_http_parser.pyx.hash,sha256=m0UnDTDnk7nJB7FCyyTKI3KoEK2YHyzGxv6dxR6cNEQ,64
|
||||
aiohttp/.hash/_http_writer.pyx.hash,sha256=RMl7dMb2_UWJpopvwvQRLp_SpY_m8EullJCN_ztHlb4,64
|
||||
aiohttp/.hash/hdrs.py.hash,sha256=GldJpkmfx93VdDz-6BEe9rXA7UKQL6vnL5dnJl_h7Ug,64
|
||||
aiohttp/__init__.py,sha256=BAszPb6A-fGC0n5u05dzpaKkWLMfxwMPRi_manIk0vM,8104
|
||||
aiohttp/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/abc.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/base_protocol.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/client.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/client_exceptions.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/client_proto.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/client_reqrep.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/client_ws.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/compression_utils.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/connector.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/cookiejar.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/formdata.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/hdrs.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/helpers.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/http.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/http_exceptions.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/http_parser.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/http_websocket.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/http_writer.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/log.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/multipart.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/payload.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/payload_streamer.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/pytest_plugin.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/resolver.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/streams.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/tcp_helpers.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/test_utils.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/tracing.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/typedefs.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/web.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/web_app.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/web_exceptions.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/web_fileresponse.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/web_log.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/web_middlewares.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/web_protocol.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/web_request.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/web_response.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/web_routedef.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/web_runner.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/web_server.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/web_urldispatcher.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/web_ws.cpython-311.pyc,,
|
||||
aiohttp/__pycache__/worker.cpython-311.pyc,,
|
||||
aiohttp/_cparser.pxd,sha256=W6-cu0SyHhOEPeb475NvxagQ1Jz9pWqyZJvwEqTLNs0,4476
|
||||
aiohttp/_find_header.pxd,sha256=BFUSmxhemBtblqxzjzH3x03FfxaWlTyuAIOz8YZ5_nM,70
|
||||
aiohttp/_headers.pxi,sha256=1MhCe6Un_KI1tpO85HnDfzVO94BhcirLanAOys5FIHA,2090
|
||||
aiohttp/_http_parser.cp311-win_amd64.pyd,sha256=Vs9Ugj-bUjPaAsl2U3nvK3cm3f5fsgjtEGT63FzIVsg,265216
|
||||
aiohttp/_http_parser.pyx,sha256=_F97Oagn-KQyd3WrXFCsbpj3PBJv3sYJTY6kTmvdJj4,29078
|
||||
aiohttp/_http_writer.cp311-win_amd64.pyd,sha256=QizQfEdNr8yTQcvoHSUjM_VzjiMdrZ5gPRGJ1B_icag,48128
|
||||
aiohttp/_http_writer.pyx,sha256=PkYB28WgXDwodwSi8zb2z6fWZuTJGpNZR5JmBfLG_qU,4759
|
||||
aiohttp/_websocket/.hash/mask.pxd.hash,sha256=MtKRHuamwsRzCTtELIaBcyklRCAFDonBlAPO_IRg3aY,64
|
||||
aiohttp/_websocket/.hash/mask.pyx.hash,sha256=eOyT813GYbX_MUjzLOpzr-vTu3J_gpUOy8EzNgE7ntQ,64
|
||||
aiohttp/_websocket/.hash/reader_c.pxd.hash,sha256=zqH07mpTGba2oQLVYFJFtPhDzrMbbVoX3ErJVExkypY,64
|
||||
aiohttp/_websocket/__init__.py,sha256=R51KWH5kkdtDLb7T-ilztksbfweKCy3t22SgxGtiY-4,45
|
||||
aiohttp/_websocket/__pycache__/__init__.cpython-311.pyc,,
|
||||
aiohttp/_websocket/__pycache__/helpers.cpython-311.pyc,,
|
||||
aiohttp/_websocket/__pycache__/models.cpython-311.pyc,,
|
||||
aiohttp/_websocket/__pycache__/reader.cpython-311.pyc,,
|
||||
aiohttp/_websocket/__pycache__/reader_c.cpython-311.pyc,,
|
||||
aiohttp/_websocket/__pycache__/reader_py.cpython-311.pyc,,
|
||||
aiohttp/_websocket/__pycache__/writer.cpython-311.pyc,,
|
||||
aiohttp/_websocket/helpers.py,sha256=amqvDhoAKAi8ptB4qUNuQhkaOn-4JxSh_VLAqytmEfw,5185
|
||||
aiohttp/_websocket/mask.cp311-win_amd64.pyd,sha256=sOBHLehMa0s8fmFe2DCZdDh8LCaMIJTxmagMX1aAWx4,35840
|
||||
aiohttp/_websocket/mask.pxd,sha256=41TdSZvhcbYSW_Vrw7bF4r_yoor2njtdaZ3bmvK6-jw,115
|
||||
aiohttp/_websocket/mask.pyx,sha256=Ro7dOOv43HAAqNMz3xyCA11ppcn-vARIvjycStTEYww,1445
|
||||
aiohttp/_websocket/models.py,sha256=Pz8qvnU43VUCNZcY4g03VwTsHOsb_jSN8iG69xMAc_A,2205
|
||||
aiohttp/_websocket/reader.py,sha256=1r0cJ-jdFgbSrC6-jI0zjEA1CppzoUn8u_wiebrVVO0,1061
|
||||
aiohttp/_websocket/reader_c.cp311-win_amd64.pyd,sha256=NRHwTnbNs0fqIbYPvBlNxqYLFenlR2tU1LXCnmhkp2I,164864
|
||||
aiohttp/_websocket/reader_c.pxd,sha256=Msmpiuyl-O0vC0RZ6dlEDLVV1wVGqfY1idgFI9A6q-Q,2546
|
||||
aiohttp/_websocket/reader_c.py,sha256=t2ek531Px_2q0NSW0DCy2CNPDc32PdFlC3C1rPvQVK4,18443
|
||||
aiohttp/_websocket/reader_py.py,sha256=t2ek531Px_2q0NSW0DCy2CNPDc32PdFlC3C1rPvQVK4,18443
|
||||
aiohttp/_websocket/writer.py,sha256=D_mfB5Qit--2P6Bp1Eti9OJY7Sl4oLCjKB2RDcOwWEs,7254
|
||||
aiohttp/abc.py,sha256=OINViQw0OsbiM_KrOs-9vzzR0l2WxLtrzvp5Wb4TIBI,6765
|
||||
aiohttp/base_protocol.py,sha256=8vNIv6QV_SDCW-8tfhlyxSwiBD7dAiMTqJI1GI8RG5s,3125
|
||||
aiohttp/client.py,sha256=zT1tcqM7vdlG9wY2_KF5_sC6ijTVTcPLxtzMDwqJRQ4,56582
|
||||
aiohttp/client_exceptions.py,sha256=sJcuvYKaB2nwuSdP7k18y3wc74aU0xAzdJikzzesrPE,11788
|
||||
aiohttp/client_proto.py,sha256=njIygKrQe9E7Reqh148Rc7Js5auvyLDYUWtvplE2Y04,10322
|
||||
aiohttp/client_reqrep.py,sha256=RY4JHBY8ED3V0q6spUnu6gc-gdDEl8Vtj0gQKG5idUQ,45240
|
||||
aiohttp/client_ws.py,sha256=oSnfL4txXUq6Ut-6al-veh9OpXm77OpsLKWc99wet98,15457
|
||||
aiohttp/compression_utils.py,sha256=EZ-3hTQ2tX-75l6Q_txvN0nTs8CBIBb0440beikNPIw,5854
|
||||
aiohttp/connector.py,sha256=uD8s1nh01Tvf8QvlA5DZr025VPPeTd_150xIJw2nm1c,61877
|
||||
aiohttp/cookiejar.py,sha256=n41nHmwNTMlg5172GblWKjRp9Tdalu0-14X02BOXr1E,18110
|
||||
aiohttp/formdata.py,sha256=PZmRnM9I5Kpg6wP_r7fc31zhBD0vplZ4UHYp0y56Akk,6734
|
||||
aiohttp/hdrs.py,sha256=7htmhgZyE9HqWbPpxHU0r7kAIdT2kpOXQa1AadDh2W8,5232
|
||||
aiohttp/helpers.py,sha256=76PRuebHzke8_Hfisls6uzyemYDIpvpCy5FkraOkBQk,30035
|
||||
aiohttp/http.py,sha256=DGKcwDbgIMpasv7s2jeKCRuixyj7W-RIrihRFjj0xcY,1914
|
||||
aiohttp/http_exceptions.py,sha256=4-y5Vc5pUqbBVcSyCPjANAWw0kv6bsBoijgNx3ZICcY,3073
|
||||
aiohttp/http_parser.py,sha256=S8RvdCJD1Mn7QsBJ_KvH2Q4Q0uv3LWUqrB5XaXMjsLg,37897
|
||||
aiohttp/http_websocket.py,sha256=b9kBmxPLPFQP_nu_sMhIMIeqDOm0ug8G4prbrhEMHZ0,878
|
||||
aiohttp/http_writer.py,sha256=wCFTUY7qHivLoit534oagZ-O3RiwCEBAfxIjpqjZXQM,7265
|
||||
aiohttp/log.py,sha256=zYUTvXsMQ9Sz1yNN8kXwd5Qxu49a1FzjZ_wQqriEc8M,333
|
||||
aiohttp/multipart.py,sha256=uNkEDqhX8Gr4TK8hrRoVVUSfC0_mQLVrO2W7fTouIaQ,38013
|
||||
aiohttp/payload.py,sha256=LqfJiBBbmT07_sSz4NfOvP_olrcLr5sdw8VLSuCJOs4,16312
|
||||
aiohttp/payload_streamer.py,sha256=K0iV85iW0vEG3rDkcopruidspynzQvrwW8mJvgPHisg,2289
|
||||
aiohttp/py.typed,sha256=3VVwXUAWVEVX7sDwyYDnW5ZdBC9_Z9AJAFfLCleUW0k,8
|
||||
aiohttp/pytest_plugin.py,sha256=1N_bzKVhxL-OqPlOxoFwTeidWLa7xL5jU2TAAntsPN4,13204
|
||||
aiohttp/resolver.py,sha256=q4SNK6i6o2V2jsunXpiM6SLL9mxBT_K8HcVFAFeYhlI,6562
|
||||
aiohttp/streams.py,sha256=5tRp9XNeTnnKu0_GcjN0HOl2jdZStD6OH9D8_jjXY-o,23026
|
||||
aiohttp/tcp_helpers.py,sha256=K-hhGh3jd6qCEnHJo8LvFyfJwBjh99UKI7A0aSRVhj4,998
|
||||
aiohttp/test_utils.py,sha256=NvA7M_4CpdU-TeKuqm-g6VM-zXnnRq7UAw7u9K2vBnI,23581
|
||||
aiohttp/tracing.py,sha256=c3C8lnLZ0G1Jj3Iv1GgV-Op8PwcM4m6d931w502hSgI,15607
|
||||
aiohttp/typedefs.py,sha256=Sx5v2yUyLu8nbabqtJRWj1M1_uW0IZACu78uYD7LBy0,1726
|
||||
aiohttp/web.py,sha256=qzYNfrwlh7SD4yHyzq7SC5hldTCX-xitRfx2IVJtajI,19027
|
||||
aiohttp/web_app.py,sha256=XRNsu1fhDBZayQSQKYOQbyLUNt-vLh7uxSpou-PCU38,20174
|
||||
aiohttp/web_exceptions.py,sha256=itNRhCMDJFhnMWftr5SyTsoqh-i0n9rzTj0sjcAEUjo,10812
|
||||
aiohttp/web_fileresponse.py,sha256=21KqwtCLQQ3SZldaW0DxNnZtLoSyUl0q3uSKq7Fj7nk,16922
|
||||
aiohttp/web_log.py,sha256=G5ugloW9noUxPft0SmVWOXw30MviL6rqZc3XrKN_T1U,8081
|
||||
aiohttp/web_middlewares.py,sha256=mM2-R8eaV2r6Mi9Zc2bDG8QnhE9h0IzPvtDX_fkKR5s,4286
|
||||
aiohttp/web_protocol.py,sha256=TSHexJ6_drhO5lYyjj0IACLsmQ_hmfqkSmsZ9Cr1S-c,26268
|
||||
aiohttp/web_request.py,sha256=t2prdCRIjVeabVvRBpFzJ6LjjIJe57r3A1dcSE__OlQ,30666
|
||||
aiohttp/web_response.py,sha256=DNZB-C7ILwMvaT5Ib5LVTYI_Sx4RaUG39EADw6_fQEs,29536
|
||||
aiohttp/web_routedef.py,sha256=XC10f57Q36JmYaaQqrecsyfIxHMepCKaKkBEB7hLzJI,6324
|
||||
aiohttp/web_runner.py,sha256=zyVYVzCgnopiGwnIhKlNZHtLV_IYQ9aC-Vm43j_HRoA,12185
|
||||
aiohttp/web_server.py,sha256=RZSWt_Mj-Lu89bFYsr_T3rjxW2VNN7PHNJ2mvv2qELs,2972
|
||||
aiohttp/web_urldispatcher.py,sha256=5j7wAdg8v7r-_uOlYyaUCF3Rz_NNYkbeWJ4js9JRjKU,45126
|
||||
aiohttp/web_ws.py,sha256=i55sj1SLxebqmrCNnStNFDFwnQjCcYKIMME9GluAM5U,23110
|
||||
aiohttp/worker.py,sha256=7SHAdzGhZxwPFE5kY7NFoFc9-_LrZHwECkVCVG3Zn5c,8292
|
@@ -1,5 +0,0 @@
|
||||
Wheel-Version: 1.0
|
||||
Generator: setuptools (75.6.0)
|
||||
Root-Is-Purelib: false
|
||||
Tag: cp311-cp311-win_amd64
|
||||
|
@@ -1 +0,0 @@
|
||||
aiohttp
|
@@ -1,4 +1,4 @@
|
||||
__version__ = "3.11.11"
|
||||
__version__ = "3.11.12"
|
||||
|
||||
from typing import TYPE_CHECKING, Tuple
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1471,106 +1471,80 @@ class _SessionRequestContextManager:
|
||||
await self._session.close()
|
||||
|
||||
|
||||
def request(
|
||||
method: str,
|
||||
url: StrOrURL,
|
||||
*,
|
||||
params: Query = None,
|
||||
data: Any = None,
|
||||
json: Any = None,
|
||||
headers: Optional[LooseHeaders] = None,
|
||||
skip_auto_headers: Optional[Iterable[str]] = None,
|
||||
auth: Optional[BasicAuth] = None,
|
||||
allow_redirects: bool = True,
|
||||
max_redirects: int = 10,
|
||||
compress: Optional[str] = None,
|
||||
chunked: Optional[bool] = None,
|
||||
expect100: bool = False,
|
||||
raise_for_status: Optional[bool] = None,
|
||||
read_until_eof: bool = True,
|
||||
proxy: Optional[StrOrURL] = None,
|
||||
proxy_auth: Optional[BasicAuth] = None,
|
||||
timeout: Union[ClientTimeout, object] = sentinel,
|
||||
cookies: Optional[LooseCookies] = None,
|
||||
version: HttpVersion = http.HttpVersion11,
|
||||
connector: Optional[BaseConnector] = None,
|
||||
read_bufsize: Optional[int] = None,
|
||||
loop: Optional[asyncio.AbstractEventLoop] = None,
|
||||
max_line_size: int = 8190,
|
||||
max_field_size: int = 8190,
|
||||
) -> _SessionRequestContextManager:
|
||||
"""Constructs and sends a request.
|
||||
if sys.version_info >= (3, 11) and TYPE_CHECKING:
|
||||
|
||||
Returns response object.
|
||||
method - HTTP method
|
||||
url - request url
|
||||
params - (optional) Dictionary or bytes to be sent in the query
|
||||
string of the new request
|
||||
data - (optional) Dictionary, bytes, or file-like object to
|
||||
send in the body of the request
|
||||
json - (optional) Any json compatible python object
|
||||
headers - (optional) Dictionary of HTTP Headers to send with
|
||||
the request
|
||||
cookies - (optional) Dict object to send with the request
|
||||
auth - (optional) BasicAuth named tuple represent HTTP Basic Auth
|
||||
auth - aiohttp.helpers.BasicAuth
|
||||
allow_redirects - (optional) If set to False, do not follow
|
||||
redirects
|
||||
version - Request HTTP version.
|
||||
compress - Set to True if request has to be compressed
|
||||
with deflate encoding.
|
||||
chunked - Set to chunk size for chunked transfer encoding.
|
||||
expect100 - Expect 100-continue response from server.
|
||||
connector - BaseConnector sub-class instance to support
|
||||
connection pooling.
|
||||
read_until_eof - Read response until eof if response
|
||||
does not have Content-Length header.
|
||||
loop - Optional event loop.
|
||||
timeout - Optional ClientTimeout settings structure, 5min
|
||||
total timeout by default.
|
||||
Usage::
|
||||
>>> import aiohttp
|
||||
>>> resp = await aiohttp.request('GET', 'http://python.org/')
|
||||
>>> resp
|
||||
<ClientResponse(python.org/) [200]>
|
||||
>>> data = await resp.read()
|
||||
"""
|
||||
connector_owner = False
|
||||
if connector is None:
|
||||
connector_owner = True
|
||||
connector = TCPConnector(loop=loop, force_close=True)
|
||||
def request(
|
||||
method: str,
|
||||
url: StrOrURL,
|
||||
*,
|
||||
version: HttpVersion = http.HttpVersion11,
|
||||
connector: Optional[BaseConnector] = None,
|
||||
loop: Optional[asyncio.AbstractEventLoop] = None,
|
||||
**kwargs: Unpack[_RequestOptions],
|
||||
) -> _SessionRequestContextManager: ...
|
||||
|
||||
session = ClientSession(
|
||||
loop=loop,
|
||||
cookies=cookies,
|
||||
version=version,
|
||||
timeout=timeout,
|
||||
connector=connector,
|
||||
connector_owner=connector_owner,
|
||||
)
|
||||
else:
|
||||
|
||||
return _SessionRequestContextManager(
|
||||
session._request(
|
||||
method,
|
||||
url,
|
||||
params=params,
|
||||
data=data,
|
||||
json=json,
|
||||
headers=headers,
|
||||
skip_auto_headers=skip_auto_headers,
|
||||
auth=auth,
|
||||
allow_redirects=allow_redirects,
|
||||
max_redirects=max_redirects,
|
||||
compress=compress,
|
||||
chunked=chunked,
|
||||
expect100=expect100,
|
||||
raise_for_status=raise_for_status,
|
||||
read_until_eof=read_until_eof,
|
||||
proxy=proxy,
|
||||
proxy_auth=proxy_auth,
|
||||
read_bufsize=read_bufsize,
|
||||
max_line_size=max_line_size,
|
||||
max_field_size=max_field_size,
|
||||
),
|
||||
session,
|
||||
)
|
||||
def request(
|
||||
method: str,
|
||||
url: StrOrURL,
|
||||
*,
|
||||
version: HttpVersion = http.HttpVersion11,
|
||||
connector: Optional[BaseConnector] = None,
|
||||
loop: Optional[asyncio.AbstractEventLoop] = None,
|
||||
**kwargs: Any,
|
||||
) -> _SessionRequestContextManager:
|
||||
"""Constructs and sends a request.
|
||||
|
||||
Returns response object.
|
||||
method - HTTP method
|
||||
url - request url
|
||||
params - (optional) Dictionary or bytes to be sent in the query
|
||||
string of the new request
|
||||
data - (optional) Dictionary, bytes, or file-like object to
|
||||
send in the body of the request
|
||||
json - (optional) Any json compatible python object
|
||||
headers - (optional) Dictionary of HTTP Headers to send with
|
||||
the request
|
||||
cookies - (optional) Dict object to send with the request
|
||||
auth - (optional) BasicAuth named tuple represent HTTP Basic Auth
|
||||
auth - aiohttp.helpers.BasicAuth
|
||||
allow_redirects - (optional) If set to False, do not follow
|
||||
redirects
|
||||
version - Request HTTP version.
|
||||
compress - Set to True if request has to be compressed
|
||||
with deflate encoding.
|
||||
chunked - Set to chunk size for chunked transfer encoding.
|
||||
expect100 - Expect 100-continue response from server.
|
||||
connector - BaseConnector sub-class instance to support
|
||||
connection pooling.
|
||||
read_until_eof - Read response until eof if response
|
||||
does not have Content-Length header.
|
||||
loop - Optional event loop.
|
||||
timeout - Optional ClientTimeout settings structure, 5min
|
||||
total timeout by default.
|
||||
Usage::
|
||||
>>> import aiohttp
|
||||
>>> async with aiohttp.request('GET', 'http://python.org/') as resp:
|
||||
... print(resp)
|
||||
... data = await resp.read()
|
||||
<ClientResponse(https://www.python.org/) [200 OK]>
|
||||
"""
|
||||
connector_owner = False
|
||||
if connector is None:
|
||||
connector_owner = True
|
||||
connector = TCPConnector(loop=loop, force_close=True)
|
||||
|
||||
session = ClientSession(
|
||||
loop=loop,
|
||||
cookies=kwargs.pop("cookies", None),
|
||||
version=version,
|
||||
timeout=kwargs.pop("timeout", sentinel),
|
||||
connector=connector,
|
||||
connector_owner=connector_owner,
|
||||
)
|
||||
|
||||
return _SessionRequestContextManager(
|
||||
session._request(method, url, **kwargs),
|
||||
session,
|
||||
)
|
||||
|
@@ -1,6 +1,7 @@
|
||||
"""Http related parsers and protocol."""
|
||||
|
||||
import asyncio
|
||||
import sys
|
||||
import zlib
|
||||
from typing import ( # noqa
|
||||
Any,
|
||||
@@ -24,6 +25,17 @@ from .helpers import NO_EXTENSIONS
|
||||
__all__ = ("StreamWriter", "HttpVersion", "HttpVersion10", "HttpVersion11")
|
||||
|
||||
|
||||
MIN_PAYLOAD_FOR_WRITELINES = 2048
|
||||
IS_PY313_BEFORE_313_2 = (3, 13, 0) <= sys.version_info < (3, 13, 2)
|
||||
IS_PY_BEFORE_312_9 = sys.version_info < (3, 12, 9)
|
||||
SKIP_WRITELINES = IS_PY313_BEFORE_313_2 or IS_PY_BEFORE_312_9
|
||||
# writelines is not safe for use
|
||||
# on Python 3.12+ until 3.12.9
|
||||
# on Python 3.13+ until 3.13.2
|
||||
# and on older versions it not any faster than write
|
||||
# CVE-2024-12254: https://github.com/python/cpython/pull/127656
|
||||
|
||||
|
||||
class HttpVersion(NamedTuple):
|
||||
major: int
|
||||
minor: int
|
||||
@@ -90,7 +102,10 @@ class StreamWriter(AbstractStreamWriter):
|
||||
transport = self._protocol.transport
|
||||
if transport is None or transport.is_closing():
|
||||
raise ClientConnectionResetError("Cannot write to closing transport")
|
||||
transport.write(b"".join(chunks))
|
||||
if SKIP_WRITELINES or size < MIN_PAYLOAD_FOR_WRITELINES:
|
||||
transport.write(b"".join(chunks))
|
||||
else:
|
||||
transport.writelines(chunks)
|
||||
|
||||
async def write(
|
||||
self,
|
||||
|
@@ -979,7 +979,7 @@ class MultipartWriter(Payload):
|
||||
return "".join(
|
||||
"--"
|
||||
+ self.boundary
|
||||
+ "\n"
|
||||
+ "\r\n"
|
||||
+ part._binary_headers.decode(encoding, errors)
|
||||
+ part.decode()
|
||||
for part, _e, _te in self._parts
|
||||
|
@@ -555,6 +555,7 @@ class EmptyStreamReader(StreamReader): # lgtm [py/missing-call-to-init]
|
||||
|
||||
def __init__(self) -> None:
|
||||
self._read_eof_chunk = False
|
||||
self.total_bytes = 0
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return "<%s>" % self.__class__.__name__
|
||||
|
@@ -694,9 +694,13 @@ class RequestHandler(BaseProtocol):
|
||||
# or encrypted traffic to an HTTP port. This is expected
|
||||
# to happen when connected to the public internet so we log
|
||||
# it at the debug level as to not fill logs with noise.
|
||||
self.logger.debug("Error handling request", exc_info=exc)
|
||||
self.logger.debug(
|
||||
"Error handling request from %s", request.remote, exc_info=exc
|
||||
)
|
||||
else:
|
||||
self.log_exception("Error handling request", exc_info=exc)
|
||||
self.log_exception(
|
||||
"Error handling request from %s", request.remote, exc_info=exc
|
||||
)
|
||||
|
||||
# some data already got sent, connection is broken
|
||||
if request.writer.output_size > 0:
|
||||
|
@@ -1 +0,0 @@
|
||||
pip
|
@@ -1,20 +0,0 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2018 Alex Grönholm
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -1,105 +0,0 @@
|
||||
Metadata-Version: 2.1
|
||||
Name: anyio
|
||||
Version: 4.7.0
|
||||
Summary: High level compatibility layer for multiple asynchronous event loop implementations
|
||||
Author-email: Alex Grönholm <alex.gronholm@nextday.fi>
|
||||
License: MIT
|
||||
Project-URL: Documentation, https://anyio.readthedocs.io/en/latest/
|
||||
Project-URL: Changelog, https://anyio.readthedocs.io/en/stable/versionhistory.html
|
||||
Project-URL: Source code, https://github.com/agronholm/anyio
|
||||
Project-URL: Issue tracker, https://github.com/agronholm/anyio/issues
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: MIT License
|
||||
Classifier: Framework :: AnyIO
|
||||
Classifier: Typing :: Typed
|
||||
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
|
||||
Requires-Python: >=3.9
|
||||
Description-Content-Type: text/x-rst
|
||||
License-File: LICENSE
|
||||
Requires-Dist: exceptiongroup>=1.0.2; python_version < "3.11"
|
||||
Requires-Dist: idna>=2.8
|
||||
Requires-Dist: sniffio>=1.1
|
||||
Requires-Dist: typing_extensions>=4.5; python_version < "3.13"
|
||||
Provides-Extra: trio
|
||||
Requires-Dist: trio>=0.26.1; extra == "trio"
|
||||
Provides-Extra: test
|
||||
Requires-Dist: anyio[trio]; extra == "test"
|
||||
Requires-Dist: coverage[toml]>=7; extra == "test"
|
||||
Requires-Dist: exceptiongroup>=1.2.0; extra == "test"
|
||||
Requires-Dist: hypothesis>=4.0; extra == "test"
|
||||
Requires-Dist: psutil>=5.9; extra == "test"
|
||||
Requires-Dist: pytest>=7.0; extra == "test"
|
||||
Requires-Dist: pytest-mock>=3.6.1; extra == "test"
|
||||
Requires-Dist: trustme; extra == "test"
|
||||
Requires-Dist: truststore>=0.9.1; python_version >= "3.10" and extra == "test"
|
||||
Requires-Dist: uvloop>=0.21; (platform_python_implementation == "CPython" and platform_system != "Windows") and extra == "test"
|
||||
Provides-Extra: doc
|
||||
Requires-Dist: packaging; extra == "doc"
|
||||
Requires-Dist: Sphinx~=7.4; extra == "doc"
|
||||
Requires-Dist: sphinx_rtd_theme; extra == "doc"
|
||||
Requires-Dist: sphinx-autodoc-typehints>=1.2.0; extra == "doc"
|
||||
|
||||
.. image:: https://github.com/agronholm/anyio/actions/workflows/test.yml/badge.svg
|
||||
:target: https://github.com/agronholm/anyio/actions/workflows/test.yml
|
||||
:alt: Build Status
|
||||
.. image:: https://coveralls.io/repos/github/agronholm/anyio/badge.svg?branch=master
|
||||
:target: https://coveralls.io/github/agronholm/anyio?branch=master
|
||||
:alt: Code Coverage
|
||||
.. image:: https://readthedocs.org/projects/anyio/badge/?version=latest
|
||||
:target: https://anyio.readthedocs.io/en/latest/?badge=latest
|
||||
:alt: Documentation
|
||||
.. image:: https://badges.gitter.im/gitterHQ/gitter.svg
|
||||
:target: https://gitter.im/python-trio/AnyIO
|
||||
:alt: Gitter chat
|
||||
|
||||
AnyIO is an asynchronous networking and concurrency library that works on top of either asyncio_ or
|
||||
trio_. It implements trio-like `structured concurrency`_ (SC) on top of asyncio and works in harmony
|
||||
with the native SC of trio itself.
|
||||
|
||||
Applications and libraries written against AnyIO's API will run unmodified on either asyncio_ or
|
||||
trio_. AnyIO can also be adopted into a library or application incrementally – bit by bit, no full
|
||||
refactoring necessary. It will blend in with the native libraries of your chosen backend.
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
View full documentation at: https://anyio.readthedocs.io/
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
AnyIO offers the following functionality:
|
||||
|
||||
* Task groups (nurseries_ in trio terminology)
|
||||
* High-level networking (TCP, UDP and UNIX sockets)
|
||||
|
||||
* `Happy eyeballs`_ algorithm for TCP connections (more robust than that of asyncio on Python
|
||||
3.8)
|
||||
* async/await style UDP sockets (unlike asyncio where you still have to use Transports and
|
||||
Protocols)
|
||||
|
||||
* A versatile API for byte streams and object streams
|
||||
* Inter-task synchronization and communication (locks, conditions, events, semaphores, object
|
||||
streams)
|
||||
* Worker threads
|
||||
* Subprocesses
|
||||
* Asynchronous file I/O (using worker threads)
|
||||
* Signal handling
|
||||
|
||||
AnyIO also comes with its own pytest_ plugin which also supports asynchronous fixtures.
|
||||
It even works with the popular Hypothesis_ library.
|
||||
|
||||
.. _asyncio: https://docs.python.org/3/library/asyncio.html
|
||||
.. _trio: https://github.com/python-trio/trio
|
||||
.. _structured concurrency: https://en.wikipedia.org/wiki/Structured_concurrency
|
||||
.. _nurseries: https://trio.readthedocs.io/en/stable/reference-core.html#nurseries-and-spawning
|
||||
.. _Happy eyeballs: https://en.wikipedia.org/wiki/Happy_Eyeballs
|
||||
.. _pytest: https://docs.pytest.org/en/latest/
|
||||
.. _Hypothesis: https://hypothesis.works/
|
@@ -1,84 +0,0 @@
|
||||
anyio-4.7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
anyio-4.7.0.dist-info/LICENSE,sha256=U2GsncWPLvX9LpsJxoKXwX8ElQkJu8gCO9uC6s8iwrA,1081
|
||||
anyio-4.7.0.dist-info/METADATA,sha256=A-A-n0m-esMw8lYv8a9kqsr84J2aFh8MvqcTq2Xx_so,4653
|
||||
anyio-4.7.0.dist-info/RECORD,,
|
||||
anyio-4.7.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
||||
anyio-4.7.0.dist-info/entry_points.txt,sha256=_d6Yu6uiaZmNe0CydowirE9Cmg7zUL2g08tQpoS3Qvc,39
|
||||
anyio-4.7.0.dist-info/top_level.txt,sha256=QglSMiWX8_5dpoVAEIHdEYzvqFMdSYWmCj6tYw2ITkQ,6
|
||||
anyio/__init__.py,sha256=5NCKQNJueCeIJqVbOpAQdho2HIQrQvcnfQjuEhAiZcc,4433
|
||||
anyio/__pycache__/__init__.cpython-311.pyc,,
|
||||
anyio/__pycache__/from_thread.cpython-311.pyc,,
|
||||
anyio/__pycache__/lowlevel.cpython-311.pyc,,
|
||||
anyio/__pycache__/pytest_plugin.cpython-311.pyc,,
|
||||
anyio/__pycache__/to_process.cpython-311.pyc,,
|
||||
anyio/__pycache__/to_thread.cpython-311.pyc,,
|
||||
anyio/_backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
anyio/_backends/__pycache__/__init__.cpython-311.pyc,,
|
||||
anyio/_backends/__pycache__/_asyncio.cpython-311.pyc,,
|
||||
anyio/_backends/__pycache__/_trio.cpython-311.pyc,,
|
||||
anyio/_backends/_asyncio.py,sha256=i5Qe4IBdiWRlww0qIUAVsF-K0z30bgZakuMePpNbdro,94051
|
||||
anyio/_backends/_trio.py,sha256=7oGxbqeveiesGm2pAnCRBydqy-Gbistn_xfsmKhSLLg,40371
|
||||
anyio/_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
anyio/_core/__pycache__/__init__.cpython-311.pyc,,
|
||||
anyio/_core/__pycache__/_asyncio_selector_thread.cpython-311.pyc,,
|
||||
anyio/_core/__pycache__/_eventloop.cpython-311.pyc,,
|
||||
anyio/_core/__pycache__/_exceptions.cpython-311.pyc,,
|
||||
anyio/_core/__pycache__/_fileio.cpython-311.pyc,,
|
||||
anyio/_core/__pycache__/_resources.cpython-311.pyc,,
|
||||
anyio/_core/__pycache__/_signals.cpython-311.pyc,,
|
||||
anyio/_core/__pycache__/_sockets.cpython-311.pyc,,
|
||||
anyio/_core/__pycache__/_streams.cpython-311.pyc,,
|
||||
anyio/_core/__pycache__/_subprocesses.cpython-311.pyc,,
|
||||
anyio/_core/__pycache__/_synchronization.cpython-311.pyc,,
|
||||
anyio/_core/__pycache__/_tasks.cpython-311.pyc,,
|
||||
anyio/_core/__pycache__/_testing.cpython-311.pyc,,
|
||||
anyio/_core/__pycache__/_typedattr.cpython-311.pyc,,
|
||||
anyio/_core/_asyncio_selector_thread.py,sha256=vTdZBWaxRgVcgUaRb5uBwQ_VGgY3qPKF7l91IJ5Mqzo,4773
|
||||
anyio/_core/_eventloop.py,sha256=t_tAwBFPjF8jrZGjlJ6bbYy6KA3bjsbZxV9mvh9t1i0,4695
|
||||
anyio/_core/_exceptions.py,sha256=bKPr2QbkYG7nIb425L5JePUie9bGc9XfkY0y4JKWvFM,2488
|
||||
anyio/_core/_fileio.py,sha256=DqnG_zvQFMqiIFaUeDRC1Ts3LT0FWHkWtGgm-684hvQ,20957
|
||||
anyio/_core/_resources.py,sha256=NbmU5O5UX3xEyACnkmYX28Fmwdl-f-ny0tHym26e0w0,435
|
||||
anyio/_core/_signals.py,sha256=vulT1M1xdLYtAR-eY5TamIgaf1WTlOwOrMGwswlTTr8,905
|
||||
anyio/_core/_sockets.py,sha256=vQ5GnSDLHjEhHhV2yvsdiPs5wmPxxb1kRsv3RM5lbQk,26951
|
||||
anyio/_core/_streams.py,sha256=OnaKgoDD-FcMSwLvkoAUGP51sG2ZdRvMpxt9q2w1gYA,1804
|
||||
anyio/_core/_subprocesses.py,sha256=WquR6sHrnaZofaeqnL8U4Yv___msVW_WqivleLHK4zI,7760
|
||||
anyio/_core/_synchronization.py,sha256=tct5FJFdgYjiEMtUeg5NGG15tf-2Qd7VaWuSgzS5dIU,20347
|
||||
anyio/_core/_tasks.py,sha256=pvVEX2Fw159sf0ypAPerukKsZgRRwvFFedVW52nR2Vk,4764
|
||||
anyio/_core/_testing.py,sha256=YUGwA5cgFFbUTv4WFd7cv_BSVr4ryTtPp8owQA3JdWE,2118
|
||||
anyio/_core/_typedattr.py,sha256=P4ozZikn3-DbpoYcvyghS_FOYAgbmUxeoU8-L_07pZM,2508
|
||||
anyio/abc/__init__.py,sha256=c2OQbTCS_fQowviMXanLPh8m29ccwkXmpDr7uyNZYOo,2652
|
||||
anyio/abc/__pycache__/__init__.cpython-311.pyc,,
|
||||
anyio/abc/__pycache__/_eventloop.cpython-311.pyc,,
|
||||
anyio/abc/__pycache__/_resources.cpython-311.pyc,,
|
||||
anyio/abc/__pycache__/_sockets.cpython-311.pyc,,
|
||||
anyio/abc/__pycache__/_streams.cpython-311.pyc,,
|
||||
anyio/abc/__pycache__/_subprocesses.cpython-311.pyc,,
|
||||
anyio/abc/__pycache__/_tasks.cpython-311.pyc,,
|
||||
anyio/abc/__pycache__/_testing.cpython-311.pyc,,
|
||||
anyio/abc/_eventloop.py,sha256=Wd_3C3hLm0ex5z_eHHWGqvLle2OKCSexJSZVnwQNGV4,9658
|
||||
anyio/abc/_resources.py,sha256=DrYvkNN1hH6Uvv5_5uKySvDsnknGVDe8FCKfko0VtN8,783
|
||||
anyio/abc/_sockets.py,sha256=KhWtJxan8jpBXKwPaFeQzI4iRXdFaOIn0HXtDZnaO7U,6262
|
||||
anyio/abc/_streams.py,sha256=GzST5Q2zQmxVzdrAqtbSyHNxkPlIC9AzeZJg_YyPAXw,6598
|
||||
anyio/abc/_subprocesses.py,sha256=cumAPJTktOQtw63IqG0lDpyZqu_l1EElvQHMiwJgL08,2067
|
||||
anyio/abc/_tasks.py,sha256=yJWbMwowvqjlAX4oJ3l9Is1w-zwynr2lX1Z02AWJqsY,3080
|
||||
anyio/abc/_testing.py,sha256=tBJUzkSfOXJw23fe8qSJ03kJlShOYjjaEyFB6k6MYT8,1821
|
||||
anyio/from_thread.py,sha256=dbi5TUH45_Sg_jZ8Vv1NJWVohe0WeQ_OaCvXIKveAGg,17478
|
||||
anyio/lowlevel.py,sha256=nkgmW--SdxGVp0cmLUYazjkigveRm5HY7-gW8Bpp9oY,4169
|
||||
anyio/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
anyio/pytest_plugin.py,sha256=vjGhGRHD31OyMgJRFQrMvExhx3Ea8KbyDqYKmiSDdXA,6712
|
||||
anyio/streams/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
anyio/streams/__pycache__/__init__.cpython-311.pyc,,
|
||||
anyio/streams/__pycache__/buffered.cpython-311.pyc,,
|
||||
anyio/streams/__pycache__/file.cpython-311.pyc,,
|
||||
anyio/streams/__pycache__/memory.cpython-311.pyc,,
|
||||
anyio/streams/__pycache__/stapled.cpython-311.pyc,,
|
||||
anyio/streams/__pycache__/text.cpython-311.pyc,,
|
||||
anyio/streams/__pycache__/tls.cpython-311.pyc,,
|
||||
anyio/streams/buffered.py,sha256=UCldKC168YuLvT7n3HtNPnQ2iWAMSTYQWbZvzLwMwkM,4500
|
||||
anyio/streams/file.py,sha256=6uoTNb5KbMoj-6gS3_xrrL8uZN8Q4iIvOS1WtGyFfKw,4383
|
||||
anyio/streams/memory.py,sha256=j8AyOExK4-UPaon_Xbhwax25Vqs0DwFg3ZXc-EIiHjY,10550
|
||||
anyio/streams/stapled.py,sha256=U09pCrmOw9kkNhe6tKopsm1QIMT1lFTFvtb-A7SIe4k,4302
|
||||
anyio/streams/text.py,sha256=6x8w8xlfCZKTUWQoJiMPoMhSSJFUBRKgoBNSBtbd9yg,5094
|
||||
anyio/streams/tls.py,sha256=m3AE2LVSpoRHSIwSoSCupiOVL54EvOFoY3CcwTxcZfg,12742
|
||||
anyio/to_process.py,sha256=cR4n7TssbbJowE_9cWme49zaeuoBuMzqgZ6cBIs0YIs,9571
|
||||
anyio/to_thread.py,sha256=WM2JQ2MbVsd5D5CM08bQiTwzZIvpsGjfH1Fy247KoDQ,2396
|
@@ -1,5 +0,0 @@
|
||||
Wheel-Version: 1.0
|
||||
Generator: setuptools (75.6.0)
|
||||
Root-Is-Purelib: true
|
||||
Tag: py3-none-any
|
||||
|
@@ -1,2 +0,0 @@
|
||||
[pytest11]
|
||||
anyio = anyio.pytest_plugin
|
@@ -1 +0,0 @@
|
||||
anyio
|
@@ -8,6 +8,7 @@ from ._core._eventloop import sleep as sleep
|
||||
from ._core._eventloop import sleep_forever as sleep_forever
|
||||
from ._core._eventloop import sleep_until as sleep_until
|
||||
from ._core._exceptions import BrokenResourceError as BrokenResourceError
|
||||
from ._core._exceptions import BrokenWorkerIntepreter as BrokenWorkerIntepreter
|
||||
from ._core._exceptions import BrokenWorkerProcess as BrokenWorkerProcess
|
||||
from ._core._exceptions import BusyResourceError as BusyResourceError
|
||||
from ._core._exceptions import ClosedResourceError as ClosedResourceError
|
||||
|
@@ -28,8 +28,6 @@ from collections.abc import (
|
||||
Collection,
|
||||
Coroutine,
|
||||
Iterable,
|
||||
Iterator,
|
||||
MutableMapping,
|
||||
Sequence,
|
||||
)
|
||||
from concurrent.futures import Future
|
||||
@@ -49,7 +47,7 @@ from queue import Queue
|
||||
from signal import Signals
|
||||
from socket import AddressFamily, SocketKind
|
||||
from threading import Thread
|
||||
from types import TracebackType
|
||||
from types import CodeType, TracebackType
|
||||
from typing import (
|
||||
IO,
|
||||
TYPE_CHECKING,
|
||||
@@ -449,7 +447,7 @@ class CancelScope(BaseCancelScope):
|
||||
exc_type: type[BaseException] | None,
|
||||
exc_val: BaseException | None,
|
||||
exc_tb: TracebackType | None,
|
||||
) -> bool | None:
|
||||
) -> bool:
|
||||
del exc_tb
|
||||
|
||||
if not self._active:
|
||||
@@ -677,45 +675,7 @@ class TaskState:
|
||||
self.cancel_scope = cancel_scope
|
||||
|
||||
|
||||
class TaskStateStore(MutableMapping["Awaitable[Any] | asyncio.Task", TaskState]):
|
||||
def __init__(self) -> None:
|
||||
self._task_states = WeakKeyDictionary[asyncio.Task, TaskState]()
|
||||
self._preliminary_task_states: dict[Awaitable[Any], TaskState] = {}
|
||||
|
||||
def __getitem__(self, key: Awaitable[Any] | asyncio.Task, /) -> TaskState:
|
||||
assert isinstance(key, asyncio.Task)
|
||||
try:
|
||||
return self._task_states[key]
|
||||
except KeyError:
|
||||
if coro := key.get_coro():
|
||||
if state := self._preliminary_task_states.get(coro):
|
||||
return state
|
||||
|
||||
raise KeyError(key)
|
||||
|
||||
def __setitem__(
|
||||
self, key: asyncio.Task | Awaitable[Any], value: TaskState, /
|
||||
) -> None:
|
||||
if isinstance(key, asyncio.Task):
|
||||
self._task_states[key] = value
|
||||
else:
|
||||
self._preliminary_task_states[key] = value
|
||||
|
||||
def __delitem__(self, key: asyncio.Task | Awaitable[Any], /) -> None:
|
||||
if isinstance(key, asyncio.Task):
|
||||
del self._task_states[key]
|
||||
else:
|
||||
del self._preliminary_task_states[key]
|
||||
|
||||
def __len__(self) -> int:
|
||||
return len(self._task_states) + len(self._preliminary_task_states)
|
||||
|
||||
def __iter__(self) -> Iterator[Awaitable[Any] | asyncio.Task]:
|
||||
yield from self._task_states
|
||||
yield from self._preliminary_task_states
|
||||
|
||||
|
||||
_task_states = TaskStateStore()
|
||||
_task_states: WeakKeyDictionary[asyncio.Task, TaskState] = WeakKeyDictionary()
|
||||
|
||||
|
||||
#
|
||||
@@ -741,24 +701,10 @@ class _AsyncioTaskStatus(abc.TaskStatus):
|
||||
_task_states[task].parent_id = self._parent_id
|
||||
|
||||
|
||||
async def _wait(tasks: Iterable[asyncio.Task[object]]) -> None:
|
||||
tasks = set(tasks)
|
||||
waiter = get_running_loop().create_future()
|
||||
|
||||
def on_completion(task: asyncio.Task[object]) -> None:
|
||||
tasks.discard(task)
|
||||
if not tasks and not waiter.done():
|
||||
waiter.set_result(None)
|
||||
|
||||
for task in tasks:
|
||||
task.add_done_callback(on_completion)
|
||||
del task
|
||||
|
||||
try:
|
||||
await waiter
|
||||
finally:
|
||||
while tasks:
|
||||
tasks.pop().remove_done_callback(on_completion)
|
||||
if sys.version_info >= (3, 12):
|
||||
_eager_task_factory_code: CodeType | None = asyncio.eager_task_factory.__code__
|
||||
else:
|
||||
_eager_task_factory_code = None
|
||||
|
||||
|
||||
class TaskGroup(abc.TaskGroup):
|
||||
@@ -767,6 +713,7 @@ class TaskGroup(abc.TaskGroup):
|
||||
self._active = False
|
||||
self._exceptions: list[BaseException] = []
|
||||
self._tasks: set[asyncio.Task] = set()
|
||||
self._on_completed_fut: asyncio.Future[None] | None = None
|
||||
|
||||
async def __aenter__(self) -> TaskGroup:
|
||||
self.cancel_scope.__enter__()
|
||||
@@ -785,12 +732,15 @@ class TaskGroup(abc.TaskGroup):
|
||||
if not isinstance(exc_val, CancelledError):
|
||||
self._exceptions.append(exc_val)
|
||||
|
||||
loop = get_running_loop()
|
||||
try:
|
||||
if self._tasks:
|
||||
with CancelScope() as wait_scope:
|
||||
while self._tasks:
|
||||
self._on_completed_fut = loop.create_future()
|
||||
|
||||
try:
|
||||
await _wait(self._tasks)
|
||||
await self._on_completed_fut
|
||||
except CancelledError as exc:
|
||||
# Shield the scope against further cancellation attempts,
|
||||
# as they're not productive (#695)
|
||||
@@ -805,6 +755,8 @@ class TaskGroup(abc.TaskGroup):
|
||||
and not is_anyio_cancellation(exc)
|
||||
):
|
||||
exc_val = exc
|
||||
|
||||
self._on_completed_fut = None
|
||||
else:
|
||||
# If there are no child tasks to wait on, run at least one checkpoint
|
||||
# anyway
|
||||
@@ -835,13 +787,19 @@ class TaskGroup(abc.TaskGroup):
|
||||
task_status_future: asyncio.Future | None = None,
|
||||
) -> asyncio.Task:
|
||||
def task_done(_task: asyncio.Task) -> None:
|
||||
# task_state = _task_states[_task]
|
||||
task_state = _task_states[_task]
|
||||
assert task_state.cancel_scope is not None
|
||||
assert _task in task_state.cancel_scope._tasks
|
||||
task_state.cancel_scope._tasks.remove(_task)
|
||||
self._tasks.remove(task)
|
||||
del _task_states[_task]
|
||||
|
||||
if self._on_completed_fut is not None and not self._tasks:
|
||||
try:
|
||||
self._on_completed_fut.set_result(None)
|
||||
except asyncio.InvalidStateError:
|
||||
pass
|
||||
|
||||
try:
|
||||
exc = _task.exception()
|
||||
except CancelledError as e:
|
||||
@@ -892,26 +850,25 @@ class TaskGroup(abc.TaskGroup):
|
||||
f"the return value ({coro!r}) is not a coroutine object"
|
||||
)
|
||||
|
||||
name = get_callable_name(func) if name is None else str(name)
|
||||
loop = asyncio.get_running_loop()
|
||||
if (
|
||||
(factory := loop.get_task_factory())
|
||||
and getattr(factory, "__code__", None) is _eager_task_factory_code
|
||||
and (closure := getattr(factory, "__closure__", None))
|
||||
):
|
||||
custom_task_constructor = closure[0].cell_contents
|
||||
task = custom_task_constructor(coro, loop=loop, name=name)
|
||||
else:
|
||||
task = create_task(coro, name=name)
|
||||
|
||||
# Make the spawned task inherit the task group's cancel scope
|
||||
_task_states[coro] = task_state = TaskState(
|
||||
_task_states[task] = TaskState(
|
||||
parent_id=parent_id, cancel_scope=self.cancel_scope
|
||||
)
|
||||
name = get_callable_name(func) if name is None else str(name)
|
||||
try:
|
||||
task = create_task(coro, name=name)
|
||||
finally:
|
||||
del _task_states[coro]
|
||||
|
||||
_task_states[task] = task_state
|
||||
self.cancel_scope._tasks.add(task)
|
||||
self._tasks.add(task)
|
||||
|
||||
if task.done():
|
||||
# This can happen with eager task factories
|
||||
task_done(task)
|
||||
else:
|
||||
task.add_done_callback(task_done)
|
||||
|
||||
task.add_done_callback(task_done)
|
||||
return task
|
||||
|
||||
def start_soon(
|
||||
@@ -2114,10 +2071,9 @@ class _SignalReceiver:
|
||||
exc_type: type[BaseException] | None,
|
||||
exc_val: BaseException | None,
|
||||
exc_tb: TracebackType | None,
|
||||
) -> bool | None:
|
||||
) -> None:
|
||||
for sig in self._handled_signals:
|
||||
self._loop.remove_signal_handler(sig)
|
||||
return None
|
||||
|
||||
def __aiter__(self) -> _SignalReceiver:
|
||||
return self
|
||||
@@ -2446,7 +2402,7 @@ class AsyncIOBackend(AsyncBackend):
|
||||
return CapacityLimiter(total_tokens)
|
||||
|
||||
@classmethod
|
||||
async def run_sync_in_worker_thread(
|
||||
async def run_sync_in_worker_thread( # type: ignore[return]
|
||||
cls,
|
||||
func: Callable[[Unpack[PosArgsT]], T_Retval],
|
||||
args: tuple[Unpack[PosArgsT]],
|
||||
@@ -2468,7 +2424,7 @@ class AsyncIOBackend(AsyncBackend):
|
||||
|
||||
async with limiter or cls.current_default_thread_limiter():
|
||||
with CancelScope(shield=not abandon_on_cancel) as scope:
|
||||
future: asyncio.Future = asyncio.Future()
|
||||
future = asyncio.Future[T_Retval]()
|
||||
root_task = find_root_task()
|
||||
if not idle_workers:
|
||||
worker = WorkerThread(root_task, workers, idle_workers)
|
||||
|
@@ -132,8 +132,7 @@ class CancelScope(BaseCancelScope):
|
||||
exc_type: type[BaseException] | None,
|
||||
exc_val: BaseException | None,
|
||||
exc_tb: TracebackType | None,
|
||||
) -> bool | None:
|
||||
# https://github.com/python-trio/trio-typing/pull/79
|
||||
) -> bool:
|
||||
return self.__original.__exit__(exc_type, exc_val, exc_tb)
|
||||
|
||||
def cancel(self) -> None:
|
||||
@@ -186,9 +185,10 @@ class TaskGroup(abc.TaskGroup):
|
||||
exc_type: type[BaseException] | None,
|
||||
exc_val: BaseException | None,
|
||||
exc_tb: TracebackType | None,
|
||||
) -> bool | None:
|
||||
) -> bool:
|
||||
try:
|
||||
return await self._nursery_manager.__aexit__(exc_type, exc_val, exc_tb)
|
||||
# trio.Nursery.__exit__ returns bool; .open_nursery has wrong type
|
||||
return await self._nursery_manager.__aexit__(exc_type, exc_val, exc_tb) # type: ignore[return-value]
|
||||
except BaseExceptionGroup as exc:
|
||||
if not exc.split(trio.Cancelled)[1]:
|
||||
raise trio.Cancelled._create() from exc
|
||||
|
@@ -21,6 +21,23 @@ class Selector:
|
||||
self._send, self._receive = socket.socketpair()
|
||||
self._send.setblocking(False)
|
||||
self._receive.setblocking(False)
|
||||
# This somewhat reduces the amount of memory wasted queueing up data
|
||||
# for wakeups. With these settings, maximum number of 1-byte sends
|
||||
# before getting BlockingIOError:
|
||||
# Linux 4.8: 6
|
||||
# macOS (darwin 15.5): 1
|
||||
# Windows 10: 525347
|
||||
# Windows you're weird. (And on Windows setting SNDBUF to 0 makes send
|
||||
# blocking, even on non-blocking sockets, so don't do that.)
|
||||
self._receive.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1)
|
||||
self._send.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1)
|
||||
# On Windows this is a TCP socket so this might matter. On other
|
||||
# platforms this fails b/c AF_UNIX sockets aren't actually TCP.
|
||||
try:
|
||||
self._send.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
self._selector.register(self._receive, EVENT_READ)
|
||||
self._closed = False
|
||||
|
||||
|
@@ -2,6 +2,8 @@ from __future__ import annotations
|
||||
|
||||
import sys
|
||||
from collections.abc import Generator
|
||||
from textwrap import dedent
|
||||
from typing import Any
|
||||
|
||||
if sys.version_info < (3, 11):
|
||||
from exceptiongroup import BaseExceptionGroup
|
||||
@@ -21,6 +23,41 @@ class BrokenWorkerProcess(Exception):
|
||||
"""
|
||||
|
||||
|
||||
class BrokenWorkerIntepreter(Exception):
|
||||
"""
|
||||
Raised by :meth:`~anyio.to_interpreter.run_sync` if an unexpected exception is
|
||||
raised in the subinterpreter.
|
||||
"""
|
||||
|
||||
def __init__(self, excinfo: Any):
|
||||
# This was adapted from concurrent.futures.interpreter.ExecutionFailed
|
||||
msg = excinfo.formatted
|
||||
if not msg:
|
||||
if excinfo.type and excinfo.msg:
|
||||
msg = f"{excinfo.type.__name__}: {excinfo.msg}"
|
||||
else:
|
||||
msg = excinfo.type.__name__ or excinfo.msg
|
||||
|
||||
super().__init__(msg)
|
||||
self.excinfo = excinfo
|
||||
|
||||
def __str__(self) -> str:
|
||||
try:
|
||||
formatted = self.excinfo.errdisplay
|
||||
except Exception:
|
||||
return super().__str__()
|
||||
else:
|
||||
return dedent(
|
||||
f"""
|
||||
{super().__str__()}
|
||||
|
||||
Uncaught in the interpreter:
|
||||
|
||||
{formatted}
|
||||
""".strip()
|
||||
)
|
||||
|
||||
|
||||
class BusyResourceError(Exception):
|
||||
"""
|
||||
Raised when two tasks are trying to read from or write to the same resource
|
||||
|
@@ -3,7 +3,13 @@ from __future__ import annotations
|
||||
import os
|
||||
import pathlib
|
||||
import sys
|
||||
from collections.abc import AsyncIterator, Callable, Iterable, Iterator, Sequence
|
||||
from collections.abc import (
|
||||
AsyncIterator,
|
||||
Callable,
|
||||
Iterable,
|
||||
Iterator,
|
||||
Sequence,
|
||||
)
|
||||
from dataclasses import dataclass
|
||||
from functools import partial
|
||||
from os import PathLike
|
||||
@@ -220,11 +226,15 @@ class Path:
|
||||
Some methods may be unavailable or have limited functionality, based on the Python
|
||||
version:
|
||||
|
||||
* :meth:`~pathlib.Path.copy` (available on Python 3.14 or later)
|
||||
* :meth:`~pathlib.Path.copy_into` (available on Python 3.14 or later)
|
||||
* :meth:`~pathlib.Path.from_uri` (available on Python 3.13 or later)
|
||||
* :meth:`~pathlib.Path.full_match` (available on Python 3.13 or later)
|
||||
* :meth:`~pathlib.Path.is_junction` (available on Python 3.12 or later)
|
||||
* :meth:`~pathlib.Path.match` (the ``case_sensitive`` paramater is only available on
|
||||
Python 3.13 or later)
|
||||
* :meth:`~pathlib.Path.move` (available on Python 3.14 or later)
|
||||
* :meth:`~pathlib.Path.move_into` (available on Python 3.14 or later)
|
||||
* :meth:`~pathlib.Path.relative_to` (the ``walk_up`` parameter is only available on
|
||||
Python 3.12 or later)
|
||||
* :meth:`~pathlib.Path.walk` (available on Python 3.12 or later)
|
||||
@@ -396,6 +406,51 @@ class Path:
|
||||
def match(self, path_pattern: str) -> bool:
|
||||
return self._path.match(path_pattern)
|
||||
|
||||
if sys.version_info >= (3, 14):
|
||||
|
||||
async def copy(
|
||||
self,
|
||||
target: str | os.PathLike[str],
|
||||
*,
|
||||
follow_symlinks: bool = True,
|
||||
dirs_exist_ok: bool = False,
|
||||
preserve_metadata: bool = False,
|
||||
) -> Path:
|
||||
func = partial(
|
||||
self._path.copy,
|
||||
follow_symlinks=follow_symlinks,
|
||||
dirs_exist_ok=dirs_exist_ok,
|
||||
preserve_metadata=preserve_metadata,
|
||||
)
|
||||
return Path(await to_thread.run_sync(func, target))
|
||||
|
||||
async def copy_into(
|
||||
self,
|
||||
target_dir: str | os.PathLike[str],
|
||||
*,
|
||||
follow_symlinks: bool = True,
|
||||
dirs_exist_ok: bool = False,
|
||||
preserve_metadata: bool = False,
|
||||
) -> Path:
|
||||
func = partial(
|
||||
self._path.copy_into,
|
||||
follow_symlinks=follow_symlinks,
|
||||
dirs_exist_ok=dirs_exist_ok,
|
||||
preserve_metadata=preserve_metadata,
|
||||
)
|
||||
return Path(await to_thread.run_sync(func, target_dir))
|
||||
|
||||
async def move(self, target: str | os.PathLike[str]) -> Path:
|
||||
# Upstream does not handle anyio.Path properly as a PathLike
|
||||
target = pathlib.Path(target)
|
||||
return Path(await to_thread.run_sync(self._path.move, target))
|
||||
|
||||
async def move_into(
|
||||
self,
|
||||
target_dir: str | os.PathLike[str],
|
||||
) -> Path:
|
||||
return Path(await to_thread.run_sync(self._path.move_into, target_dir))
|
||||
|
||||
def is_relative_to(self, other: str | PathLike[str]) -> bool:
|
||||
try:
|
||||
self.relative_to(other)
|
||||
|
@@ -728,6 +728,5 @@ class ResourceGuard:
|
||||
exc_type: type[BaseException] | None,
|
||||
exc_val: BaseException | None,
|
||||
exc_tb: TracebackType | None,
|
||||
) -> bool | None:
|
||||
) -> None:
|
||||
self._guarded = False
|
||||
return None
|
||||
|
@@ -88,7 +88,7 @@ class CancelScope:
|
||||
exc_type: type[BaseException] | None,
|
||||
exc_val: BaseException | None,
|
||||
exc_tb: TracebackType | None,
|
||||
) -> bool | None:
|
||||
) -> bool:
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
|
@@ -35,7 +35,7 @@ _process_pool_idle_workers: RunVar[deque[tuple[Process, float]]] = RunVar(
|
||||
_default_process_limiter: RunVar[CapacityLimiter] = RunVar("_default_process_limiter")
|
||||
|
||||
|
||||
async def run_sync(
|
||||
async def run_sync( # type: ignore[return]
|
||||
func: Callable[[Unpack[PosArgsT]], T_Retval],
|
||||
*args: Unpack[PosArgsT],
|
||||
cancellable: bool = False,
|
||||
|
@@ -2285,7 +2285,7 @@ def _attrs_to_init_script(
|
||||
NL = "\n "
|
||||
return (
|
||||
f"""def {method_name}(self, {args}):
|
||||
{NL.join(lines) if lines else 'pass'}
|
||||
{NL.join(lines) if lines else "pass"}
|
||||
""",
|
||||
names_for_globals,
|
||||
annotations,
|
||||
|
@@ -1 +0,0 @@
|
||||
pip
|
@@ -1,246 +0,0 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: attrs
|
||||
Version: 24.3.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.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 :: Implementation :: CPython
|
||||
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
||||
Classifier: Typing :: Typed
|
||||
Requires-Python: >=3.8
|
||||
Provides-Extra: benchmark
|
||||
Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'benchmark'
|
||||
Requires-Dist: hypothesis; extra == 'benchmark'
|
||||
Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'benchmark'
|
||||
Requires-Dist: pympler; extra == 'benchmark'
|
||||
Requires-Dist: pytest-codspeed; extra == 'benchmark'
|
||||
Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'benchmark'
|
||||
Requires-Dist: pytest-xdist[psutil]; extra == 'benchmark'
|
||||
Requires-Dist: pytest>=4.3.0; extra == 'benchmark'
|
||||
Provides-Extra: cov
|
||||
Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'cov'
|
||||
Requires-Dist: coverage[toml]>=5.3; extra == 'cov'
|
||||
Requires-Dist: hypothesis; extra == 'cov'
|
||||
Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'cov'
|
||||
Requires-Dist: pympler; extra == 'cov'
|
||||
Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'cov'
|
||||
Requires-Dist: pytest-xdist[psutil]; extra == 'cov'
|
||||
Requires-Dist: pytest>=4.3.0; extra == 'cov'
|
||||
Provides-Extra: dev
|
||||
Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'dev'
|
||||
Requires-Dist: hypothesis; extra == 'dev'
|
||||
Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'dev'
|
||||
Requires-Dist: pre-commit-uv; extra == 'dev'
|
||||
Requires-Dist: pympler; extra == 'dev'
|
||||
Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'dev'
|
||||
Requires-Dist: pytest-xdist[psutil]; extra == 'dev'
|
||||
Requires-Dist: pytest>=4.3.0; extra == 'dev'
|
||||
Provides-Extra: docs
|
||||
Requires-Dist: cogapp; extra == 'docs'
|
||||
Requires-Dist: furo; extra == 'docs'
|
||||
Requires-Dist: myst-parser; extra == 'docs'
|
||||
Requires-Dist: sphinx; extra == 'docs'
|
||||
Requires-Dist: sphinx-notfound-page; extra == 'docs'
|
||||
Requires-Dist: sphinxcontrib-towncrier; extra == 'docs'
|
||||
Requires-Dist: towncrier<24.7; extra == 'docs'
|
||||
Provides-Extra: tests
|
||||
Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'tests'
|
||||
Requires-Dist: hypothesis; extra == 'tests'
|
||||
Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests'
|
||||
Requires-Dist: pympler; extra == 'tests'
|
||||
Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests'
|
||||
Requires-Dist: pytest-xdist[psutil]; extra == 'tests'
|
||||
Requires-Dist: pytest>=4.3.0; extra == 'tests'
|
||||
Provides-Extra: tests-mypy
|
||||
Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests-mypy'
|
||||
Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests-mypy'
|
||||
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](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/personalizing-your-profile#list-of-qualifying-repositories-for-mars-2020-helicopter-contributor-achievement) for Mars missions since 2020!
|
||||
|
||||
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/24.3.0/_static/sponsors/{sponsor["img"]}" width="190" /></a>')
|
||||
]]] -->
|
||||
<a href="https://www.variomedia.de/"><img title="Variomedia AG" src="https://www.attrs.org/en/24.3.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/24.3.0/_static/sponsors/Tidelift.svg" width="190" /></a>
|
||||
<a href="https://klaviyo.com/"><img title="Klaviyo" src="https://www.attrs.org/en/24.3.0/_static/sponsors/Klaviyo.svg" width="190" /></a>
|
||||
<a href="https://www.emsys-renewables.com/"><img title="emsys renewables" src="https://www.attrs.org/en/24.3.0/_static/sponsors/emsys-renewables.svg" width="190" /></a>
|
||||
<a href="https://filepreviews.io/"><img title="FilePreviews" src="https://www.attrs.org/en/24.3.0/_static/sponsors/FilePreviews.svg" width="190" /></a>
|
||||
<a href="https://polar.sh/"><img title="Polar" src="https://www.attrs.org/en/24.3.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
|
||||
|
||||
- Python 3.7 has been dropped.
|
||||
[#1340](https://github.com/python-attrs/attrs/issues/1340)
|
||||
|
||||
|
||||
### Changes
|
||||
|
||||
- Introduce `attrs.NothingType`, for annotating types consistent with `attrs.NOTHING`.
|
||||
[#1358](https://github.com/python-attrs/attrs/issues/1358)
|
||||
- Allow mutating `__suppress_context__` and `__notes__` on frozen exceptions.
|
||||
[#1365](https://github.com/python-attrs/attrs/issues/1365)
|
||||
- `attrs.converters.optional()` works again when taking `attrs.converters.pipe()` or another Converter as its argument.
|
||||
[#1372](https://github.com/python-attrs/attrs/issues/1372)
|
||||
- *attrs* instances now support [`copy.replace()`](https://docs.python.org/3/library/copy.html#copy.replace).
|
||||
[#1383](https://github.com/python-attrs/attrs/issues/1383)
|
||||
- `attrs.validators.instance_of()`'s type hints now allow for union types.
|
||||
For example: `instance_of(str | int)`
|
||||
[#1385](https://github.com/python-attrs/attrs/issues/1385)
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
[Full changelog →](https://www.attrs.org/en/stable/changelog.html)
|
@@ -1,55 +0,0 @@
|
||||
attr/__init__.py,sha256=fOYIvt1eGSqQre4uCS3sJWKZ0mwAuC8UD6qba5OS9_U,2057
|
||||
attr/__init__.pyi,sha256=QIXnnHPoucmDWkbpNsWTP-cgJ1bn8le7DjyRa_wYdew,11281
|
||||
attr/__pycache__/__init__.cpython-311.pyc,,
|
||||
attr/__pycache__/_cmp.cpython-311.pyc,,
|
||||
attr/__pycache__/_compat.cpython-311.pyc,,
|
||||
attr/__pycache__/_config.cpython-311.pyc,,
|
||||
attr/__pycache__/_funcs.cpython-311.pyc,,
|
||||
attr/__pycache__/_make.cpython-311.pyc,,
|
||||
attr/__pycache__/_next_gen.cpython-311.pyc,,
|
||||
attr/__pycache__/_version_info.cpython-311.pyc,,
|
||||
attr/__pycache__/converters.cpython-311.pyc,,
|
||||
attr/__pycache__/exceptions.cpython-311.pyc,,
|
||||
attr/__pycache__/filters.cpython-311.pyc,,
|
||||
attr/__pycache__/setters.cpython-311.pyc,,
|
||||
attr/__pycache__/validators.cpython-311.pyc,,
|
||||
attr/_cmp.py,sha256=3umHiBtgsEYtvNP_8XrQwTCdFoZIX4DEur76N-2a3X8,4123
|
||||
attr/_cmp.pyi,sha256=U-_RU_UZOyPUEQzXE6RMYQQcjkZRY25wTH99sN0s7MM,368
|
||||
attr/_compat.py,sha256=4hlXbWhdDjQCDK6FKF1EgnZ3POiHgtpp54qE0nxaGHg,2704
|
||||
attr/_config.py,sha256=dGq3xR6fgZEF6UBt_L0T-eUHIB4i43kRmH0P28sJVw8,843
|
||||
attr/_funcs.py,sha256=5-tUKJtp3h5El55EcDl6GWXFp68fT8D8U7uCRN6497I,15854
|
||||
attr/_make.py,sha256=orKSf6C-B1eZfpat4lbAtxvmSyE_yxlG8zY9115ufWk,94157
|
||||
attr/_next_gen.py,sha256=7FRkbtl_N017SuBhf_Vw3mw2c2pGZhtCGOzadgz7tp4,24395
|
||||
attr/_typing_compat.pyi,sha256=XDP54TUn-ZKhD62TOQebmzrwFyomhUCoGRpclb6alRA,469
|
||||
attr/_version_info.py,sha256=exSqb3b5E-fMSsgZAlEw9XcLpEgobPORCZpcaEglAM4,2121
|
||||
attr/_version_info.pyi,sha256=x_M3L3WuB7r_ULXAWjx959udKQ4HLB8l-hsc1FDGNvk,209
|
||||
attr/converters.py,sha256=GlDeOzPeTFgeBBLbj9G57Ez5lAk68uhSALRYJ_exe84,3861
|
||||
attr/converters.pyi,sha256=orU2bff-VjQa2kMDyvnMQV73oJT2WRyQuw4ZR1ym1bE,643
|
||||
attr/exceptions.py,sha256=HRFq4iybmv7-DcZwyjl6M1euM2YeJVK_hFxuaBGAngI,1977
|
||||
attr/exceptions.pyi,sha256=zZq8bCUnKAy9mDtBEw42ZhPhAUIHoTKedDQInJD883M,539
|
||||
attr/filters.py,sha256=ZBiKWLp3R0LfCZsq7X11pn9WX8NslS2wXM4jsnLOGc8,1795
|
||||
attr/filters.pyi,sha256=3J5BG-dTxltBk1_-RuNRUHrv2qu1v8v4aDNAQ7_mifA,208
|
||||
attr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
attr/setters.py,sha256=5-dcT63GQK35ONEzSgfXCkbB7pPkaR-qv15mm4PVSzQ,1617
|
||||
attr/setters.pyi,sha256=NnVkaFU1BB4JB8E4JuXyrzTUgvtMpj8p3wBdJY7uix4,584
|
||||
attr/validators.py,sha256=WaB1HLAHHqRHWsrv_K9H-sJ7ESil3H3Cmv2d8TtVZx4,20046
|
||||
attr/validators.pyi,sha256=s2WhKPqskxbsckJfKk8zOuuB088GfgpyxcCYSNFLqNU,2603
|
||||
attrs-24.3.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
attrs-24.3.0.dist-info/METADATA,sha256=f9hhECeAUyS7iewHPRuMLDy1tpJ6vyy8R_TKUnCmiA8,11654
|
||||
attrs-24.3.0.dist-info/RECORD,,
|
||||
attrs-24.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
||||
attrs-24.3.0.dist-info/licenses/LICENSE,sha256=iCEVyV38KvHutnFPjsbVy8q_Znyv-HKfQkINpj9xTp8,1109
|
||||
attrs/__init__.py,sha256=qeQJZ4O08yczSn840v9bYOaZyRE81WsVi-QCrY3krCU,1107
|
||||
attrs/__init__.pyi,sha256=nZmInocjM7tHV4AQw0vxO_fo6oJjL_PonlV9zKKW8DY,7931
|
||||
attrs/__pycache__/__init__.cpython-311.pyc,,
|
||||
attrs/__pycache__/converters.cpython-311.pyc,,
|
||||
attrs/__pycache__/exceptions.cpython-311.pyc,,
|
||||
attrs/__pycache__/filters.cpython-311.pyc,,
|
||||
attrs/__pycache__/setters.cpython-311.pyc,,
|
||||
attrs/__pycache__/validators.cpython-311.pyc,,
|
||||
attrs/converters.py,sha256=8kQljrVwfSTRu8INwEk8SI0eGrzmWftsT7rM0EqyohM,76
|
||||
attrs/exceptions.py,sha256=ACCCmg19-vDFaDPY9vFl199SPXCQMN_bENs4DALjzms,76
|
||||
attrs/filters.py,sha256=VOUMZug9uEU6dUuA0dF1jInUK0PL3fLgP0VBS5d-CDE,73
|
||||
attrs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
attrs/setters.py,sha256=eL1YidYQV3T2h9_SYIZSZR1FAcHGb1TuCTy0E0Lv2SU,73
|
||||
attrs/validators.py,sha256=xcy6wD5TtTkdCG1f4XWbocPSO0faBjk5IfVJfP6SUj0,76
|
@@ -1,4 +0,0 @@
|
||||
Wheel-Version: 1.0
|
||||
Generator: hatchling 1.27.0
|
||||
Root-Is-Purelib: true
|
||||
Tag: py3-none-any
|
@@ -1,21 +0,0 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 Hynek Schlawack and the attrs contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
@@ -1 +0,0 @@
|
||||
pip
|
File diff suppressed because it is too large
Load Diff
@@ -1,128 +0,0 @@
|
||||
../../Scripts/black.exe,sha256=lvqjHsUGHanPnkYV102NLrkA30IhoKLMgmymvjg2oBA,108421
|
||||
../../Scripts/blackd.exe,sha256=WNDslobtvps69fdAdpFd_Y0fUFughfcEl_JZHQYQDFw,108422
|
||||
30fcd23745efe32ce681__mypyc.cp311-win_amd64.pyd,sha256=yiEVCjvW4KAfGdMQlLXpKOYFVmNLjhTLQY3R8B_mLJs,2801152
|
||||
__pycache__/_black_version.cpython-311.pyc,,
|
||||
_black_version.py,sha256=5BFa31TCqurPPV_QWhgs8XidJUkKU96zSRJ6iwOYX-E,21
|
||||
black-24.10.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
black-24.10.0.dist-info/METADATA,sha256=BQ4CSMD8vj4B2AiMuROK4ke3SFjIZJuaRm5cWxidFlc,79162
|
||||
black-24.10.0.dist-info/RECORD,,
|
||||
black-24.10.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
black-24.10.0.dist-info/WHEEL,sha256=tUtJ5bXThObXzu3Mmtrhn2LpWmyDlL72mq7DuHq3018,97
|
||||
black-24.10.0.dist-info/entry_points.txt,sha256=XTCA4X2yVA0tMiV7l96Gv9TyxhVhoCaznLN2XThqYSA,144
|
||||
black-24.10.0.dist-info/licenses/AUTHORS.md,sha256=8VXXHT-tf5BISiIINq3QMJ3KqPaRpHg906dLihpZrm0,8346
|
||||
black-24.10.0.dist-info/licenses/LICENSE,sha256=XQJSBb4crFXeCOvZ-WHsfXTQ-Zj2XxeFbd0ien078zM,1101
|
||||
black/__init__.cp311-win_amd64.pyd,sha256=UeCCeX-UcuT395uvUQvFgDG_LvOz3YktNYFYfg8y568,10752
|
||||
black/__init__.py,sha256=wWpqZw03hVfTI7UnR_1L9ujIG2PY9Gew2puUUiqA5bo,52954
|
||||
black/__main__.py,sha256=6V0pV9Zeh8940mbQbVTCPdTX4Gjq1HGrFCA6E4HLGaM,50
|
||||
black/__pycache__/__init__.cpython-311.pyc,,
|
||||
black/__pycache__/__main__.cpython-311.pyc,,
|
||||
black/__pycache__/_width_table.cpython-311.pyc,,
|
||||
black/__pycache__/brackets.cpython-311.pyc,,
|
||||
black/__pycache__/cache.cpython-311.pyc,,
|
||||
black/__pycache__/comments.cpython-311.pyc,,
|
||||
black/__pycache__/concurrency.cpython-311.pyc,,
|
||||
black/__pycache__/const.cpython-311.pyc,,
|
||||
black/__pycache__/debug.cpython-311.pyc,,
|
||||
black/__pycache__/files.cpython-311.pyc,,
|
||||
black/__pycache__/handle_ipynb_magics.cpython-311.pyc,,
|
||||
black/__pycache__/linegen.cpython-311.pyc,,
|
||||
black/__pycache__/lines.cpython-311.pyc,,
|
||||
black/__pycache__/mode.cpython-311.pyc,,
|
||||
black/__pycache__/nodes.cpython-311.pyc,,
|
||||
black/__pycache__/numerics.cpython-311.pyc,,
|
||||
black/__pycache__/output.cpython-311.pyc,,
|
||||
black/__pycache__/parsing.cpython-311.pyc,,
|
||||
black/__pycache__/ranges.cpython-311.pyc,,
|
||||
black/__pycache__/report.cpython-311.pyc,,
|
||||
black/__pycache__/rusty.cpython-311.pyc,,
|
||||
black/__pycache__/schema.cpython-311.pyc,,
|
||||
black/__pycache__/strings.cpython-311.pyc,,
|
||||
black/__pycache__/trans.cpython-311.pyc,,
|
||||
black/_width_table.cp311-win_amd64.pyd,sha256=Fl3xvnheDh-OwUdhici45Fp_3AMU1PQUVpmhhUPKs24,10752
|
||||
black/_width_table.py,sha256=NoZXxuTMETwvieHJ1ytcx8kv6Lmoyb1BUchBgUQbxRU,11226
|
||||
black/brackets.cp311-win_amd64.pyd,sha256=CvSJj7MyKksFI2PsaKM4Oz5MnqgcuTh-IDjogOy04SY,10752
|
||||
black/brackets.py,sha256=EY8MWJfMxCkKBLswJwixg1twlM8W72LB56li3hmp9VU,12784
|
||||
black/cache.cp311-win_amd64.pyd,sha256=Kfh1OCXOQ5U2AT8lT6WigTJ9ZmC7gyWnfh4EJId5tA8,10752
|
||||
black/cache.py,sha256=uSYYYXogZPzJ6Kz5UyHBBD6rDJlwaJX9Lak0V1TwjIg,4876
|
||||
black/comments.cp311-win_amd64.pyd,sha256=tET8mXFCkj_AUyrnZoaAYDu2GSO3zGC-t4_q989o-pI,10752
|
||||
black/comments.py,sha256=zKRE_SxxxhbcFC9lYUvESJlFFd18hgNkE5V8KIENwm8,16357
|
||||
black/concurrency.py,sha256=w96WWp16jg3tRj-TOCcw0ab1tYzfMJN9hZ0aAkMKlzE,6595
|
||||
black/const.cp311-win_amd64.pyd,sha256=ZBggp4gNBMOgqBscTFuogFllb_XrVpj6j7O7KAf49DY,10752
|
||||
black/const.py,sha256=FP5YcSxH6Cb0jqSkwF0nI4dHxPyQtL34hoWBfAqnAhI,325
|
||||
black/debug.py,sha256=liXI7duYzFG0ZxGx9g48dawKthbhn_zJXHuEqt-hPFc,1954
|
||||
black/files.py,sha256=ZddpY9IrnjfENlg0jl6b2ArDAzeRnaDU5xUNDm23Sj0,15151
|
||||
black/handle_ipynb_magics.cp311-win_amd64.pyd,sha256=h29V7eKvMdoLNHfbdxbHkn_X-03aXyZg85Bym-8KSyY,10752
|
||||
black/handle_ipynb_magics.py,sha256=rWmS_zGb9Ymng9UDnI5RdQ16a_6wJTduSMFPhES9kFk,15561
|
||||
black/linegen.cp311-win_amd64.pyd,sha256=eVGY-zGj8mDHtHnXw2QqHuV4a6tFF9UYhdxfXAMALrE,10752
|
||||
black/linegen.py,sha256=ws4uPxtCBeslAr4HrAa1aUg89XrfU6PHUw54mR4mCs8,71343
|
||||
black/lines.cp311-win_amd64.pyd,sha256=ZjORpDIBQ7DRu9qvPjKuxC23nmhvAgWG-UgmZ3iNc3g,10752
|
||||
black/lines.py,sha256=eIzXw3yGosKjUJoymSR5tnami4HXp2UE85yz8QXJYRU,40495
|
||||
black/mode.cp311-win_amd64.pyd,sha256=0F2kh1Sqco3Z_6EYNJatsJYR5NgEjDTiJA3uE0IoL88,10752
|
||||
black/mode.py,sha256=Ygd-18W815UDKfPQciIUirofYbiZAgNickBCOos1QOo,9808
|
||||
black/nodes.cp311-win_amd64.pyd,sha256=bl7hk58CByJGnUmHzPeq-Iy5DHcFfZbz5j-HOgtbG3Y,10752
|
||||
black/nodes.py,sha256=YnO3UHCzWzf5PL0TPs0WDPDscRdNyTOiL2xFQ5dBLEc,30978
|
||||
black/numerics.cp311-win_amd64.pyd,sha256=aQhrZrzlWx0lTr8wieowHOZBi_MzVupzGSCqTp9tOlc,10752
|
||||
black/numerics.py,sha256=gB1T1-npxj44Vhex63ov-oGsoIPwx_PZlT-n_qUcwO4,1716
|
||||
black/output.py,sha256=wFSuzLb76q56uo55jM34usVqfag9bozjv7IIxF8LNz0,4055
|
||||
black/parsing.cp311-win_amd64.pyd,sha256=_lYSPM54eRlLfV8uG7_fq6UFOHTA6Qf7mca-uIOGlQg,10752
|
||||
black/parsing.py,sha256=n8QI7C1U1D1FJDTV6Uz_YRz8zQbWgavbPAwd_wtOWug,8864
|
||||
black/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
black/ranges.cp311-win_amd64.pyd,sha256=W1ebLysNA0u1bNz9BmSIQfwjjO-3EK7Z87wYwQKRwec,10752
|
||||
black/ranges.py,sha256=0733kR2lfRh2aUJ-PVmUrB2rKg9Yhe6qQ99nnAp27eQ,20198
|
||||
black/report.py,sha256=8Xies3PseQeTN4gYfHS7RewVQRjDsDBfFDR3sSNytco,3559
|
||||
black/resources/__init__.cp311-win_amd64.pyd,sha256=zXm6nAktmY5s4UZPTrWu7GMhmcL9MyuAy99nubxR5gQ,10752
|
||||
black/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
black/resources/__pycache__/__init__.cpython-311.pyc,,
|
||||
black/resources/black.schema.json,sha256=evp77V32hKe0NdpqSHSCqt-zrLOF_RP_waiuNN1bQvM,7661
|
||||
black/rusty.cp311-win_amd64.pyd,sha256=ZspoMwtHUyqAKb37FMJRRAgsSfJHtgrzQK0WmMiKox8,10752
|
||||
black/rusty.py,sha256=RogIomJ1RCLMTOK_RA6U3EMbzWV_ZHxPtrXveXbMjzQ,585
|
||||
black/schema.cp311-win_amd64.pyd,sha256=wZe4A_GnjY04AWpttUQiDMTTVoCZnLHHfKlFi6saBZk,10752
|
||||
black/schema.py,sha256=ZLKjanGVK4bG12GD7mkDzjOtLkv_g86p1-TXrdN9Skc,446
|
||||
black/strings.cp311-win_amd64.pyd,sha256=AGssRah9z7xSwY7-O2uKt2gPMn1czlHEQ1PMhQVQKxE,10752
|
||||
black/strings.py,sha256=dlSV74ujPe5-gG0neMG8wpbnVcyHYKTwsBoYtjcdGUM,13549
|
||||
black/trans.cp311-win_amd64.pyd,sha256=iHFDZsf3IbOR0Lz89H3XeO1rUqOZzl5qcuSOSIdxIp8,10752
|
||||
black/trans.py,sha256=KIr_iGdRpMYHqjYALmEZT8qBYP4XGJloaNXbkGN2gj0,97966
|
||||
blackd/__init__.py,sha256=QiAK9bDxzxENcmpX2NI37D5LOx0C4qK0kTMg_0PhglI,9095
|
||||
blackd/__main__.py,sha256=-2NrSIZ5Es7pTFThp8w5JL9LwmmxtF1akhe7NU1OGvs,40
|
||||
blackd/__pycache__/__init__.cpython-311.pyc,,
|
||||
blackd/__pycache__/__main__.cpython-311.pyc,,
|
||||
blackd/__pycache__/middlewares.cpython-311.pyc,,
|
||||
blackd/middlewares.py,sha256=JZz7Yoq18uH8JST1Jr7-64Dezl2bthTIteb1jk0B_4Q,1198
|
||||
blib2to3/Grammar.txt,sha256=LPJtQmVZrVhg3v1ykbBioAalx0_jAHxdfv-Dg5LENzU,11961
|
||||
blib2to3/LICENSE,sha256=D2HM6JsydKABNqFe2-_N4Lf8VxxE1_5DVQtAFzw2_w8,13016
|
||||
blib2to3/PatternGrammar.txt,sha256=m6wfWk7y3-Qo35r77NWdJQ78XL1CqT_Pm0xr6eCOdpM,821
|
||||
blib2to3/README,sha256=G-DiXkC8aKINCNv7smI2q_mz-8k6kC4yYO2OrMb0Nqs,1098
|
||||
blib2to3/__init__.py,sha256=CSR2VOIKJL-JnGG41PcfbQZQEPCw43jfeK_EUisNsFQ,9
|
||||
blib2to3/__pycache__/__init__.cpython-311.pyc,,
|
||||
blib2to3/__pycache__/pygram.cpython-311.pyc,,
|
||||
blib2to3/__pycache__/pytree.cpython-311.pyc,,
|
||||
blib2to3/pgen2/__init__.py,sha256=z8NemtNtAaIBocPMl0aMLgxaQMedsKOS_dOVAy8c3TI,147
|
||||
blib2to3/pgen2/__pycache__/__init__.cpython-311.pyc,,
|
||||
blib2to3/pgen2/__pycache__/conv.cpython-311.pyc,,
|
||||
blib2to3/pgen2/__pycache__/driver.cpython-311.pyc,,
|
||||
blib2to3/pgen2/__pycache__/grammar.cpython-311.pyc,,
|
||||
blib2to3/pgen2/__pycache__/literals.cpython-311.pyc,,
|
||||
blib2to3/pgen2/__pycache__/parse.cpython-311.pyc,,
|
||||
blib2to3/pgen2/__pycache__/pgen.cpython-311.pyc,,
|
||||
blib2to3/pgen2/__pycache__/token.cpython-311.pyc,,
|
||||
blib2to3/pgen2/__pycache__/tokenize.cpython-311.pyc,,
|
||||
blib2to3/pgen2/conv.cp311-win_amd64.pyd,sha256=dSBTlOPVz_xX0QKR0mpfjFZx8ZoBEz329VB8pIZgUIE,10752
|
||||
blib2to3/pgen2/conv.py,sha256=E52W8XiOlM1uldhN086T_2WVNrQyQ1ux2rhJPhDdobs,9843
|
||||
blib2to3/pgen2/driver.cp311-win_amd64.pyd,sha256=rrQb_qx8KYrRcVJFJUN-4nbpMtoy8vdupgq465lQJeU,10752
|
||||
blib2to3/pgen2/driver.py,sha256=usv_Ztzt74cnAq9c5_F5IRQzgGTY9wmhfU6JsyCF4zw,11137
|
||||
blib2to3/pgen2/grammar.cp311-win_amd64.pyd,sha256=WJ3q0eU2B5lWShZWOEtl_Trfp4iXR6rx-SeeXZA0G4I,10752
|
||||
blib2to3/pgen2/grammar.py,sha256=kWLJf3bdvHO4g_b3M_EEo98YIoBAwUBtFFYWd7kFH0c,7074
|
||||
blib2to3/pgen2/literals.cp311-win_amd64.pyd,sha256=-xeTCS31OjLLiWyDhT0AILdpIO2qRMMnCRmq0sPa3MI,10752
|
||||
blib2to3/pgen2/literals.py,sha256=j9l2NBZV_4jyKCVXfv3G_23BUE17Ujn1uqp1Wt0FCYE,1674
|
||||
blib2to3/pgen2/parse.cp311-win_amd64.pyd,sha256=aPA6Yo-Q1Le4BNu_AVLQSqxSbwnkqumSFKeBlTiCHwA,10752
|
||||
blib2to3/pgen2/parse.py,sha256=Sqva2RmhwvSd5nBoNKCvMGV9TrPING77tTkl0PULxqk,15984
|
||||
blib2to3/pgen2/pgen.cp311-win_amd64.pyd,sha256=02026HsXxfPKU7r_84eQOUE7X-tuuKV0bqygY8t6Sz4,10752
|
||||
blib2to3/pgen2/pgen.py,sha256=ZPVrzh3fbt1t1yFVNo0KKav0MevyGljM5M3cdiUrROs,15781
|
||||
blib2to3/pgen2/token.cp311-win_amd64.pyd,sha256=8nl_5G4tA1LYjdoa72htTPCgS5EVGQIO12OOOEhLAIk,10752
|
||||
blib2to3/pgen2/token.py,sha256=VSG-_SZqvacZyd5n_YWfSSjJmgp4lfUB5jGEwGlQQDU,1985
|
||||
blib2to3/pgen2/tokenize.cp311-win_amd64.pyd,sha256=wx5ZG0yV4CXL_gFADad81sC-qNJvwi7QzHT5wVjyhVU,10752
|
||||
blib2to3/pgen2/tokenize.py,sha256=sPO5fZ3p81q5lzfkmJvPgbrYBff7mS2RbA9W7s7HFzg,42569
|
||||
blib2to3/pygram.cp311-win_amd64.pyd,sha256=R2Jwayc-jUpygyzskOrNxP3zC5098VBKfR_1LqvqWiU,10752
|
||||
blib2to3/pygram.py,sha256=tFtDmBUoM7TBZ2N5qul5quAfSagFxIGR3PFUSfI9YWw,5119
|
||||
blib2to3/pytree.cp311-win_amd64.pyd,sha256=xTecs85Hv2TQrrOr5XMvpQA_J-Qd7vQxeK1T0UTXouA,10752
|
||||
blib2to3/pytree.py,sha256=9sEBlXYIJiTYqtKuik0BA55al7hrKeXvv0e9ufTjXC4,33572
|
@@ -1,4 +0,0 @@
|
||||
Wheel-Version: 1.0
|
||||
Generator: hatchling 1.25.0
|
||||
Root-Is-Purelib: false
|
||||
Tag: cp311-cp311-win_amd64
|
@@ -1,6 +0,0 @@
|
||||
[console_scripts]
|
||||
black = black:patched_main
|
||||
blackd = blackd:patched_main [d]
|
||||
|
||||
[validate_pyproject.tool_schema]
|
||||
black = black.schema:get_schema
|
@@ -1,197 +0,0 @@
|
||||
# Authors
|
||||
|
||||
Glued together by [Łukasz Langa](mailto:lukasz@langa.pl).
|
||||
|
||||
Maintained with:
|
||||
|
||||
- [Carol Willing](mailto:carolcode@willingconsulting.com)
|
||||
- [Carl Meyer](mailto:carl@oddbird.net)
|
||||
- [Jelle Zijlstra](mailto:jelle.zijlstra@gmail.com)
|
||||
- [Mika Naylor](mailto:mail@autophagy.io)
|
||||
- [Zsolt Dollenstein](mailto:zsol.zsol@gmail.com)
|
||||
- [Cooper Lees](mailto:me@cooperlees.com)
|
||||
- [Richard Si](mailto:sichard26@gmail.com)
|
||||
- [Felix Hildén](mailto:felix.hilden@gmail.com)
|
||||
- [Batuhan Taskaya](mailto:batuhan@python.org)
|
||||
- [Shantanu Jain](mailto:hauntsaninja@gmail.com)
|
||||
|
||||
Multiple contributions by:
|
||||
|
||||
- [Abdur-Rahmaan Janhangeer](mailto:arj.python@gmail.com)
|
||||
- [Adam Johnson](mailto:me@adamj.eu)
|
||||
- [Adam Williamson](mailto:adamw@happyassassin.net)
|
||||
- [Alexander Huynh](mailto:ahrex-gh-psf-black@e.sc)
|
||||
- [Alexandr Artemyev](mailto:mogost@gmail.com)
|
||||
- [Alex Vandiver](mailto:github@chmrr.net)
|
||||
- [Allan Simon](mailto:allan.simon@supinfo.com)
|
||||
- Anders-Petter Ljungquist
|
||||
- [Amethyst Reese](mailto:amy@n7.gg)
|
||||
- [Andrew Thorp](mailto:andrew.thorp.dev@gmail.com)
|
||||
- [Andrew Zhou](mailto:andrewfzhou@gmail.com)
|
||||
- [Andrey](mailto:dyuuus@yandex.ru)
|
||||
- [Andy Freeland](mailto:andy@andyfreeland.net)
|
||||
- [Anthony Sottile](mailto:asottile@umich.edu)
|
||||
- [Antonio Ossa Guerra](mailto:aaossa+black@uc.cl)
|
||||
- [Arjaan Buijk](mailto:arjaan.buijk@gmail.com)
|
||||
- [Arnav Borbornah](mailto:arnavborborah11@gmail.com)
|
||||
- [Artem Malyshev](mailto:proofit404@gmail.com)
|
||||
- [Asger Hautop Drewsen](mailto:asgerdrewsen@gmail.com)
|
||||
- [Augie Fackler](mailto:raf@durin42.com)
|
||||
- [Aviskar KC](mailto:aviskarkc10@gmail.com)
|
||||
- Batuhan Taşkaya
|
||||
- [Benjamin Wohlwend](mailto:bw@piquadrat.ch)
|
||||
- [Benjamin Woodruff](mailto:github@benjam.info)
|
||||
- [Bharat Raghunathan](mailto:bharatraghunthan9767@gmail.com)
|
||||
- [Brandt Bucher](mailto:brandtbucher@gmail.com)
|
||||
- [Brett Cannon](mailto:brett@python.org)
|
||||
- [Bryan Bugyi](mailto:bryan.bugyi@rutgers.edu)
|
||||
- [Bryan Forbes](mailto:bryan@reigndropsfall.net)
|
||||
- [Calum Lind](mailto:calumlind@gmail.com)
|
||||
- [Charles](mailto:peacech@gmail.com)
|
||||
- Charles Reid
|
||||
- [Christian Clauss](mailto:cclauss@bluewin.ch)
|
||||
- [Christian Heimes](mailto:christian@python.org)
|
||||
- [Chuck Wooters](mailto:chuck.wooters@microsoft.com)
|
||||
- [Chris Rose](mailto:offline@offby1.net)
|
||||
- Codey Oxley
|
||||
- [Cong](mailto:congusbongus@gmail.com)
|
||||
- [Cooper Ry Lees](mailto:me@cooperlees.com)
|
||||
- [Dan Davison](mailto:dandavison7@gmail.com)
|
||||
- [Daniel Hahler](mailto:github@thequod.de)
|
||||
- [Daniel M. Capella](mailto:polycitizen@gmail.com)
|
||||
- Daniele Esposti
|
||||
- [David Hotham](mailto:david.hotham@metaswitch.com)
|
||||
- [David Lukes](mailto:dafydd.lukes@gmail.com)
|
||||
- [David Szotten](mailto:davidszotten@gmail.com)
|
||||
- [Denis Laxalde](mailto:denis@laxalde.org)
|
||||
- [Douglas Thor](mailto:dthor@transphormusa.com)
|
||||
- dylanjblack
|
||||
- [Eli Treuherz](mailto:eli@treuherz.com)
|
||||
- [Emil Hessman](mailto:emil@hessman.se)
|
||||
- [Felix Kohlgrüber](mailto:felix.kohlgrueber@gmail.com)
|
||||
- [Florent Thiery](mailto:fthiery@gmail.com)
|
||||
- Francisco
|
||||
- [Giacomo Tagliabue](mailto:giacomo.tag@gmail.com)
|
||||
- [Greg Gandenberger](mailto:ggandenberger@shoprunner.com)
|
||||
- [Gregory P. Smith](mailto:greg@krypto.org)
|
||||
- Gustavo Camargo
|
||||
- hauntsaninja
|
||||
- [Hadi Alqattan](mailto:alqattanhadizaki@gmail.com)
|
||||
- [Hassan Abouelela](mailto:hassan@hassanamr.com)
|
||||
- [Heaford](mailto:dan@heaford.com)
|
||||
- [Hugo Barrera](mailto::hugo@barrera.io)
|
||||
- Hugo van Kemenade
|
||||
- [Hynek Schlawack](mailto:hs@ox.cx)
|
||||
- [Ionite](mailto:dev@ionite.io)
|
||||
- [Ivan Katanić](mailto:ivan.katanic@gmail.com)
|
||||
- [Jakub Kadlubiec](mailto:jakub.kadlubiec@skyscanner.net)
|
||||
- [Jakub Warczarek](mailto:jakub.warczarek@gmail.com)
|
||||
- [Jan Hnátek](mailto:jan.hnatek@gmail.com)
|
||||
- [Jason Fried](mailto:me@jasonfried.info)
|
||||
- [Jason Friedland](mailto:jason@friedland.id.au)
|
||||
- [jgirardet](mailto:ijkl@netc.fr)
|
||||
- Jim Brännlund
|
||||
- [Jimmy Jia](mailto:tesrin@gmail.com)
|
||||
- [Joe Antonakakis](mailto:jma353@cornell.edu)
|
||||
- [Jon Dufresne](mailto:jon.dufresne@gmail.com)
|
||||
- [Jonas Obrist](mailto:ojiidotch@gmail.com)
|
||||
- [Jonty Wareing](mailto:jonty@jonty.co.uk)
|
||||
- [Jose Nazario](mailto:jose.monkey.org@gmail.com)
|
||||
- [Joseph Larson](mailto:larson.joseph@gmail.com)
|
||||
- [Josh Bode](mailto:joshbode@fastmail.com)
|
||||
- [Josh Holland](mailto:anowlcalledjosh@gmail.com)
|
||||
- [Joshua Cannon](mailto:joshdcannon@gmail.com)
|
||||
- [José Padilla](mailto:jpadilla@webapplicate.com)
|
||||
- [Juan Luis Cano Rodríguez](mailto:hello@juanlu.space)
|
||||
- [kaiix](mailto:kvn.hou@gmail.com)
|
||||
- [Katie McLaughlin](mailto:katie@glasnt.com)
|
||||
- Katrin Leinweber
|
||||
- [Keith Smiley](mailto:keithbsmiley@gmail.com)
|
||||
- [Kenyon Ralph](mailto:kenyon@kenyonralph.com)
|
||||
- [Kevin Kirsche](mailto:Kev.Kirsche+GitHub@gmail.com)
|
||||
- [Kyle Hausmann](mailto:kyle.hausmann@gmail.com)
|
||||
- [Kyle Sunden](mailto:sunden@wisc.edu)
|
||||
- Lawrence Chan
|
||||
- [Linus Groh](mailto:mail@linusgroh.de)
|
||||
- [Loren Carvalho](mailto:comradeloren@gmail.com)
|
||||
- [Luka Sterbic](mailto:luka.sterbic@gmail.com)
|
||||
- [LukasDrude](mailto:mail@lukas-drude.de)
|
||||
- Mahmoud Hossam
|
||||
- Mariatta
|
||||
- [Matt VanEseltine](mailto:vaneseltine@gmail.com)
|
||||
- [Matthew Clapp](mailto:itsayellow+dev@gmail.com)
|
||||
- [Matthew Walster](mailto:matthew@walster.org)
|
||||
- Max Smolens
|
||||
- [Michael Aquilina](mailto:michaelaquilina@gmail.com)
|
||||
- [Michael Flaxman](mailto:michael.flaxman@gmail.com)
|
||||
- [Michael J. Sullivan](mailto:sully@msully.net)
|
||||
- [Michael McClimon](mailto:michael@mcclimon.org)
|
||||
- [Miguel Gaiowski](mailto:miggaiowski@gmail.com)
|
||||
- [Mike](mailto:roshi@fedoraproject.org)
|
||||
- [mikehoyio](mailto:mikehoy@gmail.com)
|
||||
- [Min ho Kim](mailto:minho42@gmail.com)
|
||||
- [Miroslav Shubernetskiy](mailto:miroslav@miki725.com)
|
||||
- MomIsBestFriend
|
||||
- [Nathan Goldbaum](mailto:ngoldbau@illinois.edu)
|
||||
- [Nathan Hunt](mailto:neighthan.hunt@gmail.com)
|
||||
- [Neraste](mailto:neraste.herr10@gmail.com)
|
||||
- [Nikolaus Waxweiler](mailto:madigens@gmail.com)
|
||||
- [Ofek Lev](mailto:ofekmeister@gmail.com)
|
||||
- [Osaetin Daniel](mailto:osaetindaniel@gmail.com)
|
||||
- [otstrel](mailto:otstrel@gmail.com)
|
||||
- [Pablo Galindo](mailto:Pablogsal@gmail.com)
|
||||
- [Paul Ganssle](mailto:p.ganssle@gmail.com)
|
||||
- [Paul Meinhardt](mailto:mnhrdt@gmail.com)
|
||||
- [Peter Bengtsson](mailto:mail@peterbe.com)
|
||||
- [Peter Grayson](mailto:pete@jpgrayson.net)
|
||||
- [Peter Stensmyr](mailto:peter.stensmyr@gmail.com)
|
||||
- pmacosta
|
||||
- [Quentin Pradet](mailto:quentin@pradet.me)
|
||||
- [Ralf Schmitt](mailto:ralf@systemexit.de)
|
||||
- [Ramón Valles](mailto:mroutis@protonmail.com)
|
||||
- [Richard Fearn](mailto:richardfearn@gmail.com)
|
||||
- [Rishikesh Jha](mailto:rishijha424@gmail.com)
|
||||
- [Rupert Bedford](mailto:rupert@rupertb.com)
|
||||
- Russell Davis
|
||||
- [Sagi Shadur](mailto:saroad2@gmail.com)
|
||||
- [Rémi Verschelde](mailto:rverschelde@gmail.com)
|
||||
- [Sami Salonen](mailto:sakki@iki.fi)
|
||||
- [Samuel Cormier-Iijima](mailto:samuel@cormier-iijima.com)
|
||||
- [Sanket Dasgupta](mailto:sanketdasgupta@gmail.com)
|
||||
- Sergi
|
||||
- [Scott Stevenson](mailto:scott@stevenson.io)
|
||||
- Shantanu
|
||||
- [shaoran](mailto:shaoran@sakuranohana.org)
|
||||
- [Shinya Fujino](mailto:shf0811@gmail.com)
|
||||
- springstan
|
||||
- [Stavros Korokithakis](mailto:hi@stavros.io)
|
||||
- [Stephen Rosen](mailto:sirosen@globus.org)
|
||||
- [Steven M. Vascellaro](mailto:S.Vascellaro@gmail.com)
|
||||
- [Sunil Kapil](mailto:snlkapil@gmail.com)
|
||||
- [Sébastien Eustace](mailto:sebastien.eustace@gmail.com)
|
||||
- [Tal Amuyal](mailto:TalAmuyal@gmail.com)
|
||||
- [Terrance](mailto:git@terrance.allofti.me)
|
||||
- [Thom Lu](mailto:thomas.c.lu@gmail.com)
|
||||
- [Thomas Grainger](mailto:tagrain@gmail.com)
|
||||
- [Tim Gates](mailto:tim.gates@iress.com)
|
||||
- [Tim Swast](mailto:swast@google.com)
|
||||
- [Timo](mailto:timo_tk@hotmail.com)
|
||||
- Toby Fleming
|
||||
- [Tom Christie](mailto:tom@tomchristie.com)
|
||||
- [Tony Narlock](mailto:tony@git-pull.com)
|
||||
- [Tsuyoshi Hombashi](mailto:tsuyoshi.hombashi@gmail.com)
|
||||
- [Tushar Chandra](mailto:tusharchandra2018@u.northwestern.edu)
|
||||
- [Tushar Sadhwani](mailto:tushar.sadhwani000@gmail.com)
|
||||
- [Tzu-ping Chung](mailto:uranusjr@gmail.com)
|
||||
- [Utsav Shah](mailto:ukshah2@illinois.edu)
|
||||
- utsav-dbx
|
||||
- vezeli
|
||||
- [Ville Skyttä](mailto:ville.skytta@iki.fi)
|
||||
- [Vishwas B Sharma](mailto:sharma.vishwas88@gmail.com)
|
||||
- [Vlad Emelianov](mailto:volshebnyi@gmail.com)
|
||||
- [williamfzc](mailto:178894043@qq.com)
|
||||
- [wouter bolsterlee](mailto:wouter@bolsterl.ee)
|
||||
- Yazdan
|
||||
- [Yngve Høiseth](mailto:yngve@hoiseth.net)
|
||||
- [Yurii Karabas](mailto:1998uriyyo@gmail.com)
|
||||
- [Zac Hatfield-Dodds](mailto:zac@zhd.dev)
|
@@ -1,21 +0,0 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2018 Łukasz Langa
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -1,3 +0,0 @@
|
||||
from black import patched_main
|
||||
|
||||
patched_main()
|
Binary file not shown.
@@ -1,478 +0,0 @@
|
||||
# Generated by make_width_table.py
|
||||
# wcwidth 0.2.6
|
||||
# Unicode 15.0.0
|
||||
from typing import Final
|
||||
|
||||
WIDTH_TABLE: Final[list[tuple[int, int, int]]] = [
|
||||
(0, 0, 0),
|
||||
(1, 31, -1),
|
||||
(127, 159, -1),
|
||||
(768, 879, 0),
|
||||
(1155, 1161, 0),
|
||||
(1425, 1469, 0),
|
||||
(1471, 1471, 0),
|
||||
(1473, 1474, 0),
|
||||
(1476, 1477, 0),
|
||||
(1479, 1479, 0),
|
||||
(1552, 1562, 0),
|
||||
(1611, 1631, 0),
|
||||
(1648, 1648, 0),
|
||||
(1750, 1756, 0),
|
||||
(1759, 1764, 0),
|
||||
(1767, 1768, 0),
|
||||
(1770, 1773, 0),
|
||||
(1809, 1809, 0),
|
||||
(1840, 1866, 0),
|
||||
(1958, 1968, 0),
|
||||
(2027, 2035, 0),
|
||||
(2045, 2045, 0),
|
||||
(2070, 2073, 0),
|
||||
(2075, 2083, 0),
|
||||
(2085, 2087, 0),
|
||||
(2089, 2093, 0),
|
||||
(2137, 2139, 0),
|
||||
(2200, 2207, 0),
|
||||
(2250, 2273, 0),
|
||||
(2275, 2306, 0),
|
||||
(2362, 2362, 0),
|
||||
(2364, 2364, 0),
|
||||
(2369, 2376, 0),
|
||||
(2381, 2381, 0),
|
||||
(2385, 2391, 0),
|
||||
(2402, 2403, 0),
|
||||
(2433, 2433, 0),
|
||||
(2492, 2492, 0),
|
||||
(2497, 2500, 0),
|
||||
(2509, 2509, 0),
|
||||
(2530, 2531, 0),
|
||||
(2558, 2558, 0),
|
||||
(2561, 2562, 0),
|
||||
(2620, 2620, 0),
|
||||
(2625, 2626, 0),
|
||||
(2631, 2632, 0),
|
||||
(2635, 2637, 0),
|
||||
(2641, 2641, 0),
|
||||
(2672, 2673, 0),
|
||||
(2677, 2677, 0),
|
||||
(2689, 2690, 0),
|
||||
(2748, 2748, 0),
|
||||
(2753, 2757, 0),
|
||||
(2759, 2760, 0),
|
||||
(2765, 2765, 0),
|
||||
(2786, 2787, 0),
|
||||
(2810, 2815, 0),
|
||||
(2817, 2817, 0),
|
||||
(2876, 2876, 0),
|
||||
(2879, 2879, 0),
|
||||
(2881, 2884, 0),
|
||||
(2893, 2893, 0),
|
||||
(2901, 2902, 0),
|
||||
(2914, 2915, 0),
|
||||
(2946, 2946, 0),
|
||||
(3008, 3008, 0),
|
||||
(3021, 3021, 0),
|
||||
(3072, 3072, 0),
|
||||
(3076, 3076, 0),
|
||||
(3132, 3132, 0),
|
||||
(3134, 3136, 0),
|
||||
(3142, 3144, 0),
|
||||
(3146, 3149, 0),
|
||||
(3157, 3158, 0),
|
||||
(3170, 3171, 0),
|
||||
(3201, 3201, 0),
|
||||
(3260, 3260, 0),
|
||||
(3263, 3263, 0),
|
||||
(3270, 3270, 0),
|
||||
(3276, 3277, 0),
|
||||
(3298, 3299, 0),
|
||||
(3328, 3329, 0),
|
||||
(3387, 3388, 0),
|
||||
(3393, 3396, 0),
|
||||
(3405, 3405, 0),
|
||||
(3426, 3427, 0),
|
||||
(3457, 3457, 0),
|
||||
(3530, 3530, 0),
|
||||
(3538, 3540, 0),
|
||||
(3542, 3542, 0),
|
||||
(3633, 3633, 0),
|
||||
(3636, 3642, 0),
|
||||
(3655, 3662, 0),
|
||||
(3761, 3761, 0),
|
||||
(3764, 3772, 0),
|
||||
(3784, 3790, 0),
|
||||
(3864, 3865, 0),
|
||||
(3893, 3893, 0),
|
||||
(3895, 3895, 0),
|
||||
(3897, 3897, 0),
|
||||
(3953, 3966, 0),
|
||||
(3968, 3972, 0),
|
||||
(3974, 3975, 0),
|
||||
(3981, 3991, 0),
|
||||
(3993, 4028, 0),
|
||||
(4038, 4038, 0),
|
||||
(4141, 4144, 0),
|
||||
(4146, 4151, 0),
|
||||
(4153, 4154, 0),
|
||||
(4157, 4158, 0),
|
||||
(4184, 4185, 0),
|
||||
(4190, 4192, 0),
|
||||
(4209, 4212, 0),
|
||||
(4226, 4226, 0),
|
||||
(4229, 4230, 0),
|
||||
(4237, 4237, 0),
|
||||
(4253, 4253, 0),
|
||||
(4352, 4447, 2),
|
||||
(4957, 4959, 0),
|
||||
(5906, 5908, 0),
|
||||
(5938, 5939, 0),
|
||||
(5970, 5971, 0),
|
||||
(6002, 6003, 0),
|
||||
(6068, 6069, 0),
|
||||
(6071, 6077, 0),
|
||||
(6086, 6086, 0),
|
||||
(6089, 6099, 0),
|
||||
(6109, 6109, 0),
|
||||
(6155, 6157, 0),
|
||||
(6159, 6159, 0),
|
||||
(6277, 6278, 0),
|
||||
(6313, 6313, 0),
|
||||
(6432, 6434, 0),
|
||||
(6439, 6440, 0),
|
||||
(6450, 6450, 0),
|
||||
(6457, 6459, 0),
|
||||
(6679, 6680, 0),
|
||||
(6683, 6683, 0),
|
||||
(6742, 6742, 0),
|
||||
(6744, 6750, 0),
|
||||
(6752, 6752, 0),
|
||||
(6754, 6754, 0),
|
||||
(6757, 6764, 0),
|
||||
(6771, 6780, 0),
|
||||
(6783, 6783, 0),
|
||||
(6832, 6862, 0),
|
||||
(6912, 6915, 0),
|
||||
(6964, 6964, 0),
|
||||
(6966, 6970, 0),
|
||||
(6972, 6972, 0),
|
||||
(6978, 6978, 0),
|
||||
(7019, 7027, 0),
|
||||
(7040, 7041, 0),
|
||||
(7074, 7077, 0),
|
||||
(7080, 7081, 0),
|
||||
(7083, 7085, 0),
|
||||
(7142, 7142, 0),
|
||||
(7144, 7145, 0),
|
||||
(7149, 7149, 0),
|
||||
(7151, 7153, 0),
|
||||
(7212, 7219, 0),
|
||||
(7222, 7223, 0),
|
||||
(7376, 7378, 0),
|
||||
(7380, 7392, 0),
|
||||
(7394, 7400, 0),
|
||||
(7405, 7405, 0),
|
||||
(7412, 7412, 0),
|
||||
(7416, 7417, 0),
|
||||
(7616, 7679, 0),
|
||||
(8203, 8207, 0),
|
||||
(8232, 8238, 0),
|
||||
(8288, 8291, 0),
|
||||
(8400, 8432, 0),
|
||||
(8986, 8987, 2),
|
||||
(9001, 9002, 2),
|
||||
(9193, 9196, 2),
|
||||
(9200, 9200, 2),
|
||||
(9203, 9203, 2),
|
||||
(9725, 9726, 2),
|
||||
(9748, 9749, 2),
|
||||
(9800, 9811, 2),
|
||||
(9855, 9855, 2),
|
||||
(9875, 9875, 2),
|
||||
(9889, 9889, 2),
|
||||
(9898, 9899, 2),
|
||||
(9917, 9918, 2),
|
||||
(9924, 9925, 2),
|
||||
(9934, 9934, 2),
|
||||
(9940, 9940, 2),
|
||||
(9962, 9962, 2),
|
||||
(9970, 9971, 2),
|
||||
(9973, 9973, 2),
|
||||
(9978, 9978, 2),
|
||||
(9981, 9981, 2),
|
||||
(9989, 9989, 2),
|
||||
(9994, 9995, 2),
|
||||
(10024, 10024, 2),
|
||||
(10060, 10060, 2),
|
||||
(10062, 10062, 2),
|
||||
(10067, 10069, 2),
|
||||
(10071, 10071, 2),
|
||||
(10133, 10135, 2),
|
||||
(10160, 10160, 2),
|
||||
(10175, 10175, 2),
|
||||
(11035, 11036, 2),
|
||||
(11088, 11088, 2),
|
||||
(11093, 11093, 2),
|
||||
(11503, 11505, 0),
|
||||
(11647, 11647, 0),
|
||||
(11744, 11775, 0),
|
||||
(11904, 11929, 2),
|
||||
(11931, 12019, 2),
|
||||
(12032, 12245, 2),
|
||||
(12272, 12283, 2),
|
||||
(12288, 12329, 2),
|
||||
(12330, 12333, 0),
|
||||
(12334, 12350, 2),
|
||||
(12353, 12438, 2),
|
||||
(12441, 12442, 0),
|
||||
(12443, 12543, 2),
|
||||
(12549, 12591, 2),
|
||||
(12593, 12686, 2),
|
||||
(12688, 12771, 2),
|
||||
(12784, 12830, 2),
|
||||
(12832, 12871, 2),
|
||||
(12880, 19903, 2),
|
||||
(19968, 42124, 2),
|
||||
(42128, 42182, 2),
|
||||
(42607, 42610, 0),
|
||||
(42612, 42621, 0),
|
||||
(42654, 42655, 0),
|
||||
(42736, 42737, 0),
|
||||
(43010, 43010, 0),
|
||||
(43014, 43014, 0),
|
||||
(43019, 43019, 0),
|
||||
(43045, 43046, 0),
|
||||
(43052, 43052, 0),
|
||||
(43204, 43205, 0),
|
||||
(43232, 43249, 0),
|
||||
(43263, 43263, 0),
|
||||
(43302, 43309, 0),
|
||||
(43335, 43345, 0),
|
||||
(43360, 43388, 2),
|
||||
(43392, 43394, 0),
|
||||
(43443, 43443, 0),
|
||||
(43446, 43449, 0),
|
||||
(43452, 43453, 0),
|
||||
(43493, 43493, 0),
|
||||
(43561, 43566, 0),
|
||||
(43569, 43570, 0),
|
||||
(43573, 43574, 0),
|
||||
(43587, 43587, 0),
|
||||
(43596, 43596, 0),
|
||||
(43644, 43644, 0),
|
||||
(43696, 43696, 0),
|
||||
(43698, 43700, 0),
|
||||
(43703, 43704, 0),
|
||||
(43710, 43711, 0),
|
||||
(43713, 43713, 0),
|
||||
(43756, 43757, 0),
|
||||
(43766, 43766, 0),
|
||||
(44005, 44005, 0),
|
||||
(44008, 44008, 0),
|
||||
(44013, 44013, 0),
|
||||
(44032, 55203, 2),
|
||||
(63744, 64255, 2),
|
||||
(64286, 64286, 0),
|
||||
(65024, 65039, 0),
|
||||
(65040, 65049, 2),
|
||||
(65056, 65071, 0),
|
||||
(65072, 65106, 2),
|
||||
(65108, 65126, 2),
|
||||
(65128, 65131, 2),
|
||||
(65281, 65376, 2),
|
||||
(65504, 65510, 2),
|
||||
(66045, 66045, 0),
|
||||
(66272, 66272, 0),
|
||||
(66422, 66426, 0),
|
||||
(68097, 68099, 0),
|
||||
(68101, 68102, 0),
|
||||
(68108, 68111, 0),
|
||||
(68152, 68154, 0),
|
||||
(68159, 68159, 0),
|
||||
(68325, 68326, 0),
|
||||
(68900, 68903, 0),
|
||||
(69291, 69292, 0),
|
||||
(69373, 69375, 0),
|
||||
(69446, 69456, 0),
|
||||
(69506, 69509, 0),
|
||||
(69633, 69633, 0),
|
||||
(69688, 69702, 0),
|
||||
(69744, 69744, 0),
|
||||
(69747, 69748, 0),
|
||||
(69759, 69761, 0),
|
||||
(69811, 69814, 0),
|
||||
(69817, 69818, 0),
|
||||
(69826, 69826, 0),
|
||||
(69888, 69890, 0),
|
||||
(69927, 69931, 0),
|
||||
(69933, 69940, 0),
|
||||
(70003, 70003, 0),
|
||||
(70016, 70017, 0),
|
||||
(70070, 70078, 0),
|
||||
(70089, 70092, 0),
|
||||
(70095, 70095, 0),
|
||||
(70191, 70193, 0),
|
||||
(70196, 70196, 0),
|
||||
(70198, 70199, 0),
|
||||
(70206, 70206, 0),
|
||||
(70209, 70209, 0),
|
||||
(70367, 70367, 0),
|
||||
(70371, 70378, 0),
|
||||
(70400, 70401, 0),
|
||||
(70459, 70460, 0),
|
||||
(70464, 70464, 0),
|
||||
(70502, 70508, 0),
|
||||
(70512, 70516, 0),
|
||||
(70712, 70719, 0),
|
||||
(70722, 70724, 0),
|
||||
(70726, 70726, 0),
|
||||
(70750, 70750, 0),
|
||||
(70835, 70840, 0),
|
||||
(70842, 70842, 0),
|
||||
(70847, 70848, 0),
|
||||
(70850, 70851, 0),
|
||||
(71090, 71093, 0),
|
||||
(71100, 71101, 0),
|
||||
(71103, 71104, 0),
|
||||
(71132, 71133, 0),
|
||||
(71219, 71226, 0),
|
||||
(71229, 71229, 0),
|
||||
(71231, 71232, 0),
|
||||
(71339, 71339, 0),
|
||||
(71341, 71341, 0),
|
||||
(71344, 71349, 0),
|
||||
(71351, 71351, 0),
|
||||
(71453, 71455, 0),
|
||||
(71458, 71461, 0),
|
||||
(71463, 71467, 0),
|
||||
(71727, 71735, 0),
|
||||
(71737, 71738, 0),
|
||||
(71995, 71996, 0),
|
||||
(71998, 71998, 0),
|
||||
(72003, 72003, 0),
|
||||
(72148, 72151, 0),
|
||||
(72154, 72155, 0),
|
||||
(72160, 72160, 0),
|
||||
(72193, 72202, 0),
|
||||
(72243, 72248, 0),
|
||||
(72251, 72254, 0),
|
||||
(72263, 72263, 0),
|
||||
(72273, 72278, 0),
|
||||
(72281, 72283, 0),
|
||||
(72330, 72342, 0),
|
||||
(72344, 72345, 0),
|
||||
(72752, 72758, 0),
|
||||
(72760, 72765, 0),
|
||||
(72767, 72767, 0),
|
||||
(72850, 72871, 0),
|
||||
(72874, 72880, 0),
|
||||
(72882, 72883, 0),
|
||||
(72885, 72886, 0),
|
||||
(73009, 73014, 0),
|
||||
(73018, 73018, 0),
|
||||
(73020, 73021, 0),
|
||||
(73023, 73029, 0),
|
||||
(73031, 73031, 0),
|
||||
(73104, 73105, 0),
|
||||
(73109, 73109, 0),
|
||||
(73111, 73111, 0),
|
||||
(73459, 73460, 0),
|
||||
(73472, 73473, 0),
|
||||
(73526, 73530, 0),
|
||||
(73536, 73536, 0),
|
||||
(73538, 73538, 0),
|
||||
(78912, 78912, 0),
|
||||
(78919, 78933, 0),
|
||||
(92912, 92916, 0),
|
||||
(92976, 92982, 0),
|
||||
(94031, 94031, 0),
|
||||
(94095, 94098, 0),
|
||||
(94176, 94179, 2),
|
||||
(94180, 94180, 0),
|
||||
(94192, 94193, 2),
|
||||
(94208, 100343, 2),
|
||||
(100352, 101589, 2),
|
||||
(101632, 101640, 2),
|
||||
(110576, 110579, 2),
|
||||
(110581, 110587, 2),
|
||||
(110589, 110590, 2),
|
||||
(110592, 110882, 2),
|
||||
(110898, 110898, 2),
|
||||
(110928, 110930, 2),
|
||||
(110933, 110933, 2),
|
||||
(110948, 110951, 2),
|
||||
(110960, 111355, 2),
|
||||
(113821, 113822, 0),
|
||||
(118528, 118573, 0),
|
||||
(118576, 118598, 0),
|
||||
(119143, 119145, 0),
|
||||
(119163, 119170, 0),
|
||||
(119173, 119179, 0),
|
||||
(119210, 119213, 0),
|
||||
(119362, 119364, 0),
|
||||
(121344, 121398, 0),
|
||||
(121403, 121452, 0),
|
||||
(121461, 121461, 0),
|
||||
(121476, 121476, 0),
|
||||
(121499, 121503, 0),
|
||||
(121505, 121519, 0),
|
||||
(122880, 122886, 0),
|
||||
(122888, 122904, 0),
|
||||
(122907, 122913, 0),
|
||||
(122915, 122916, 0),
|
||||
(122918, 122922, 0),
|
||||
(123023, 123023, 0),
|
||||
(123184, 123190, 0),
|
||||
(123566, 123566, 0),
|
||||
(123628, 123631, 0),
|
||||
(124140, 124143, 0),
|
||||
(125136, 125142, 0),
|
||||
(125252, 125258, 0),
|
||||
(126980, 126980, 2),
|
||||
(127183, 127183, 2),
|
||||
(127374, 127374, 2),
|
||||
(127377, 127386, 2),
|
||||
(127488, 127490, 2),
|
||||
(127504, 127547, 2),
|
||||
(127552, 127560, 2),
|
||||
(127568, 127569, 2),
|
||||
(127584, 127589, 2),
|
||||
(127744, 127776, 2),
|
||||
(127789, 127797, 2),
|
||||
(127799, 127868, 2),
|
||||
(127870, 127891, 2),
|
||||
(127904, 127946, 2),
|
||||
(127951, 127955, 2),
|
||||
(127968, 127984, 2),
|
||||
(127988, 127988, 2),
|
||||
(127992, 128062, 2),
|
||||
(128064, 128064, 2),
|
||||
(128066, 128252, 2),
|
||||
(128255, 128317, 2),
|
||||
(128331, 128334, 2),
|
||||
(128336, 128359, 2),
|
||||
(128378, 128378, 2),
|
||||
(128405, 128406, 2),
|
||||
(128420, 128420, 2),
|
||||
(128507, 128591, 2),
|
||||
(128640, 128709, 2),
|
||||
(128716, 128716, 2),
|
||||
(128720, 128722, 2),
|
||||
(128725, 128727, 2),
|
||||
(128732, 128735, 2),
|
||||
(128747, 128748, 2),
|
||||
(128756, 128764, 2),
|
||||
(128992, 129003, 2),
|
||||
(129008, 129008, 2),
|
||||
(129292, 129338, 2),
|
||||
(129340, 129349, 2),
|
||||
(129351, 129535, 2),
|
||||
(129648, 129660, 2),
|
||||
(129664, 129672, 2),
|
||||
(129680, 129725, 2),
|
||||
(129727, 129733, 2),
|
||||
(129742, 129755, 2),
|
||||
(129760, 129768, 2),
|
||||
(129776, 129784, 2),
|
||||
(131072, 196605, 2),
|
||||
(196608, 262141, 2),
|
||||
(917760, 917999, 0),
|
||||
]
|
Binary file not shown.
@@ -1,382 +0,0 @@
|
||||
"""Builds on top of nodes.py to track brackets."""
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Final, Iterable, Optional, Sequence, Union
|
||||
|
||||
from black.nodes import (
|
||||
BRACKET,
|
||||
CLOSING_BRACKETS,
|
||||
COMPARATORS,
|
||||
LOGIC_OPERATORS,
|
||||
MATH_OPERATORS,
|
||||
OPENING_BRACKETS,
|
||||
UNPACKING_PARENTS,
|
||||
VARARGS_PARENTS,
|
||||
is_vararg,
|
||||
syms,
|
||||
)
|
||||
from blib2to3.pgen2 import token
|
||||
from blib2to3.pytree import Leaf, Node
|
||||
|
||||
# types
|
||||
LN = Union[Leaf, Node]
|
||||
Depth = int
|
||||
LeafID = int
|
||||
NodeType = int
|
||||
Priority = int
|
||||
|
||||
|
||||
COMPREHENSION_PRIORITY: Final = 20
|
||||
COMMA_PRIORITY: Final = 18
|
||||
TERNARY_PRIORITY: Final = 16
|
||||
LOGIC_PRIORITY: Final = 14
|
||||
STRING_PRIORITY: Final = 12
|
||||
COMPARATOR_PRIORITY: Final = 10
|
||||
MATH_PRIORITIES: Final = {
|
||||
token.VBAR: 9,
|
||||
token.CIRCUMFLEX: 8,
|
||||
token.AMPER: 7,
|
||||
token.LEFTSHIFT: 6,
|
||||
token.RIGHTSHIFT: 6,
|
||||
token.PLUS: 5,
|
||||
token.MINUS: 5,
|
||||
token.STAR: 4,
|
||||
token.SLASH: 4,
|
||||
token.DOUBLESLASH: 4,
|
||||
token.PERCENT: 4,
|
||||
token.AT: 4,
|
||||
token.TILDE: 3,
|
||||
token.DOUBLESTAR: 2,
|
||||
}
|
||||
DOT_PRIORITY: Final = 1
|
||||
|
||||
|
||||
class BracketMatchError(Exception):
|
||||
"""Raised when an opening bracket is unable to be matched to a closing bracket."""
|
||||
|
||||
|
||||
@dataclass
|
||||
class BracketTracker:
|
||||
"""Keeps track of brackets on a line."""
|
||||
|
||||
depth: int = 0
|
||||
bracket_match: dict[tuple[Depth, NodeType], Leaf] = field(default_factory=dict)
|
||||
delimiters: dict[LeafID, Priority] = field(default_factory=dict)
|
||||
previous: Optional[Leaf] = None
|
||||
_for_loop_depths: list[int] = field(default_factory=list)
|
||||
_lambda_argument_depths: list[int] = field(default_factory=list)
|
||||
invisible: list[Leaf] = field(default_factory=list)
|
||||
|
||||
def mark(self, leaf: Leaf) -> None:
|
||||
"""Mark `leaf` with bracket-related metadata. Keep track of delimiters.
|
||||
|
||||
All leaves receive an int `bracket_depth` field that stores how deep
|
||||
within brackets a given leaf is. 0 means there are no enclosing brackets
|
||||
that started on this line.
|
||||
|
||||
If a leaf is itself a closing bracket and there is a matching opening
|
||||
bracket earlier, it receives an `opening_bracket` field with which it forms a
|
||||
pair. This is a one-directional link to avoid reference cycles. Closing
|
||||
bracket without opening happens on lines continued from previous
|
||||
breaks, e.g. `) -> "ReturnType":` as part of a funcdef where we place
|
||||
the return type annotation on its own line of the previous closing RPAR.
|
||||
|
||||
If a leaf is a delimiter (a token on which Black can split the line if
|
||||
needed) and it's on depth 0, its `id()` is stored in the tracker's
|
||||
`delimiters` field.
|
||||
"""
|
||||
if leaf.type == token.COMMENT:
|
||||
return
|
||||
|
||||
if (
|
||||
self.depth == 0
|
||||
and leaf.type in CLOSING_BRACKETS
|
||||
and (self.depth, leaf.type) not in self.bracket_match
|
||||
):
|
||||
return
|
||||
|
||||
self.maybe_decrement_after_for_loop_variable(leaf)
|
||||
self.maybe_decrement_after_lambda_arguments(leaf)
|
||||
if leaf.type in CLOSING_BRACKETS:
|
||||
self.depth -= 1
|
||||
try:
|
||||
opening_bracket = self.bracket_match.pop((self.depth, leaf.type))
|
||||
except KeyError as e:
|
||||
raise BracketMatchError(
|
||||
"Unable to match a closing bracket to the following opening"
|
||||
f" bracket: {leaf}"
|
||||
) from e
|
||||
leaf.opening_bracket = opening_bracket
|
||||
if not leaf.value:
|
||||
self.invisible.append(leaf)
|
||||
leaf.bracket_depth = self.depth
|
||||
if self.depth == 0:
|
||||
delim = is_split_before_delimiter(leaf, self.previous)
|
||||
if delim and self.previous is not None:
|
||||
self.delimiters[id(self.previous)] = delim
|
||||
else:
|
||||
delim = is_split_after_delimiter(leaf)
|
||||
if delim:
|
||||
self.delimiters[id(leaf)] = delim
|
||||
if leaf.type in OPENING_BRACKETS:
|
||||
self.bracket_match[self.depth, BRACKET[leaf.type]] = leaf
|
||||
self.depth += 1
|
||||
if not leaf.value:
|
||||
self.invisible.append(leaf)
|
||||
self.previous = leaf
|
||||
self.maybe_increment_lambda_arguments(leaf)
|
||||
self.maybe_increment_for_loop_variable(leaf)
|
||||
|
||||
def any_open_for_or_lambda(self) -> bool:
|
||||
"""Return True if there is an open for or lambda expression on the line.
|
||||
|
||||
See maybe_increment_for_loop_variable and maybe_increment_lambda_arguments
|
||||
for details."""
|
||||
return bool(self._for_loop_depths or self._lambda_argument_depths)
|
||||
|
||||
def any_open_brackets(self) -> bool:
|
||||
"""Return True if there is an yet unmatched open bracket on the line."""
|
||||
return bool(self.bracket_match)
|
||||
|
||||
def max_delimiter_priority(self, exclude: Iterable[LeafID] = ()) -> Priority:
|
||||
"""Return the highest priority of a delimiter found on the line.
|
||||
|
||||
Values are consistent with what `is_split_*_delimiter()` return.
|
||||
Raises ValueError on no delimiters.
|
||||
"""
|
||||
return max(v for k, v in self.delimiters.items() if k not in exclude)
|
||||
|
||||
def delimiter_count_with_priority(self, priority: Priority = 0) -> int:
|
||||
"""Return the number of delimiters with the given `priority`.
|
||||
|
||||
If no `priority` is passed, defaults to max priority on the line.
|
||||
"""
|
||||
if not self.delimiters:
|
||||
return 0
|
||||
|
||||
priority = priority or self.max_delimiter_priority()
|
||||
return sum(1 for p in self.delimiters.values() if p == priority)
|
||||
|
||||
def maybe_increment_for_loop_variable(self, leaf: Leaf) -> bool:
|
||||
"""In a for loop, or comprehension, the variables are often unpacks.
|
||||
|
||||
To avoid splitting on the comma in this situation, increase the depth of
|
||||
tokens between `for` and `in`.
|
||||
"""
|
||||
if leaf.type == token.NAME and leaf.value == "for":
|
||||
self.depth += 1
|
||||
self._for_loop_depths.append(self.depth)
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def maybe_decrement_after_for_loop_variable(self, leaf: Leaf) -> bool:
|
||||
"""See `maybe_increment_for_loop_variable` above for explanation."""
|
||||
if (
|
||||
self._for_loop_depths
|
||||
and self._for_loop_depths[-1] == self.depth
|
||||
and leaf.type == token.NAME
|
||||
and leaf.value == "in"
|
||||
):
|
||||
self.depth -= 1
|
||||
self._for_loop_depths.pop()
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def maybe_increment_lambda_arguments(self, leaf: Leaf) -> bool:
|
||||
"""In a lambda expression, there might be more than one argument.
|
||||
|
||||
To avoid splitting on the comma in this situation, increase the depth of
|
||||
tokens between `lambda` and `:`.
|
||||
"""
|
||||
if leaf.type == token.NAME and leaf.value == "lambda":
|
||||
self.depth += 1
|
||||
self._lambda_argument_depths.append(self.depth)
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def maybe_decrement_after_lambda_arguments(self, leaf: Leaf) -> bool:
|
||||
"""See `maybe_increment_lambda_arguments` above for explanation."""
|
||||
if (
|
||||
self._lambda_argument_depths
|
||||
and self._lambda_argument_depths[-1] == self.depth
|
||||
and leaf.type == token.COLON
|
||||
):
|
||||
self.depth -= 1
|
||||
self._lambda_argument_depths.pop()
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def get_open_lsqb(self) -> Optional[Leaf]:
|
||||
"""Return the most recent opening square bracket (if any)."""
|
||||
return self.bracket_match.get((self.depth - 1, token.RSQB))
|
||||
|
||||
|
||||
def is_split_after_delimiter(leaf: Leaf) -> Priority:
|
||||
"""Return the priority of the `leaf` delimiter, given a line break after it.
|
||||
|
||||
The delimiter priorities returned here are from those delimiters that would
|
||||
cause a line break after themselves.
|
||||
|
||||
Higher numbers are higher priority.
|
||||
"""
|
||||
if leaf.type == token.COMMA:
|
||||
return COMMA_PRIORITY
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
def is_split_before_delimiter(leaf: Leaf, previous: Optional[Leaf] = None) -> Priority:
|
||||
"""Return the priority of the `leaf` delimiter, given a line break before it.
|
||||
|
||||
The delimiter priorities returned here are from those delimiters that would
|
||||
cause a line break before themselves.
|
||||
|
||||
Higher numbers are higher priority.
|
||||
"""
|
||||
if is_vararg(leaf, within=VARARGS_PARENTS | UNPACKING_PARENTS):
|
||||
# * and ** might also be MATH_OPERATORS but in this case they are not.
|
||||
# Don't treat them as a delimiter.
|
||||
return 0
|
||||
|
||||
if (
|
||||
leaf.type == token.DOT
|
||||
and leaf.parent
|
||||
and leaf.parent.type not in {syms.import_from, syms.dotted_name}
|
||||
and (previous is None or previous.type in CLOSING_BRACKETS)
|
||||
):
|
||||
return DOT_PRIORITY
|
||||
|
||||
if (
|
||||
leaf.type in MATH_OPERATORS
|
||||
and leaf.parent
|
||||
and leaf.parent.type not in {syms.factor, syms.star_expr}
|
||||
):
|
||||
return MATH_PRIORITIES[leaf.type]
|
||||
|
||||
if leaf.type in COMPARATORS:
|
||||
return COMPARATOR_PRIORITY
|
||||
|
||||
if (
|
||||
leaf.type == token.STRING
|
||||
and previous is not None
|
||||
and previous.type == token.STRING
|
||||
):
|
||||
return STRING_PRIORITY
|
||||
|
||||
if leaf.type not in {token.NAME, token.ASYNC}:
|
||||
return 0
|
||||
|
||||
if (
|
||||
leaf.value == "for"
|
||||
and leaf.parent
|
||||
and leaf.parent.type in {syms.comp_for, syms.old_comp_for}
|
||||
or leaf.type == token.ASYNC
|
||||
):
|
||||
if (
|
||||
not isinstance(leaf.prev_sibling, Leaf)
|
||||
or leaf.prev_sibling.value != "async"
|
||||
):
|
||||
return COMPREHENSION_PRIORITY
|
||||
|
||||
if (
|
||||
leaf.value == "if"
|
||||
and leaf.parent
|
||||
and leaf.parent.type in {syms.comp_if, syms.old_comp_if}
|
||||
):
|
||||
return COMPREHENSION_PRIORITY
|
||||
|
||||
if leaf.value in {"if", "else"} and leaf.parent and leaf.parent.type == syms.test:
|
||||
return TERNARY_PRIORITY
|
||||
|
||||
if leaf.value == "is":
|
||||
return COMPARATOR_PRIORITY
|
||||
|
||||
if (
|
||||
leaf.value == "in"
|
||||
and leaf.parent
|
||||
and leaf.parent.type in {syms.comp_op, syms.comparison}
|
||||
and not (
|
||||
previous is not None
|
||||
and previous.type == token.NAME
|
||||
and previous.value == "not"
|
||||
)
|
||||
):
|
||||
return COMPARATOR_PRIORITY
|
||||
|
||||
if (
|
||||
leaf.value == "not"
|
||||
and leaf.parent
|
||||
and leaf.parent.type == syms.comp_op
|
||||
and not (
|
||||
previous is not None
|
||||
and previous.type == token.NAME
|
||||
and previous.value == "is"
|
||||
)
|
||||
):
|
||||
return COMPARATOR_PRIORITY
|
||||
|
||||
if leaf.value in LOGIC_OPERATORS and leaf.parent:
|
||||
return LOGIC_PRIORITY
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
def max_delimiter_priority_in_atom(node: LN) -> Priority:
|
||||
"""Return maximum delimiter priority inside `node`.
|
||||
|
||||
This is specific to atoms with contents contained in a pair of parentheses.
|
||||
If `node` isn't an atom or there are no enclosing parentheses, returns 0.
|
||||
"""
|
||||
if node.type != syms.atom:
|
||||
return 0
|
||||
|
||||
first = node.children[0]
|
||||
last = node.children[-1]
|
||||
if not (first.type == token.LPAR and last.type == token.RPAR):
|
||||
return 0
|
||||
|
||||
bt = BracketTracker()
|
||||
for c in node.children[1:-1]:
|
||||
if isinstance(c, Leaf):
|
||||
bt.mark(c)
|
||||
else:
|
||||
for leaf in c.leaves():
|
||||
bt.mark(leaf)
|
||||
try:
|
||||
return bt.max_delimiter_priority()
|
||||
|
||||
except ValueError:
|
||||
return 0
|
||||
|
||||
|
||||
def get_leaves_inside_matching_brackets(leaves: Sequence[Leaf]) -> set[LeafID]:
|
||||
"""Return leaves that are inside matching brackets.
|
||||
|
||||
The input `leaves` can have non-matching brackets at the head or tail parts.
|
||||
Matching brackets are included.
|
||||
"""
|
||||
try:
|
||||
# Start with the first opening bracket and ignore closing brackets before.
|
||||
start_index = next(
|
||||
i for i, l in enumerate(leaves) if l.type in OPENING_BRACKETS
|
||||
)
|
||||
except StopIteration:
|
||||
return set()
|
||||
bracket_stack = []
|
||||
ids = set()
|
||||
for i in range(start_index, len(leaves)):
|
||||
leaf = leaves[i]
|
||||
if leaf.type in OPENING_BRACKETS:
|
||||
bracket_stack.append((BRACKET[leaf.type], i))
|
||||
if leaf.type in CLOSING_BRACKETS:
|
||||
if bracket_stack and leaf.type == bracket_stack[-1][0]:
|
||||
_, start = bracket_stack.pop()
|
||||
for j in range(start, i + 1):
|
||||
ids.add(id(leaves[j]))
|
||||
else:
|
||||
break
|
||||
return ids
|
Binary file not shown.
@@ -1,149 +0,0 @@
|
||||
"""Caching of formatted files with feature-based invalidation."""
|
||||
|
||||
import hashlib
|
||||
import os
|
||||
import pickle
|
||||
import sys
|
||||
import tempfile
|
||||
from dataclasses import dataclass, field
|
||||
from pathlib import Path
|
||||
from typing import Iterable, NamedTuple
|
||||
|
||||
from platformdirs import user_cache_dir
|
||||
|
||||
from _black_version import version as __version__
|
||||
from black.mode import Mode
|
||||
from black.output import err
|
||||
|
||||
if sys.version_info >= (3, 11):
|
||||
from typing import Self
|
||||
else:
|
||||
from typing_extensions import Self
|
||||
|
||||
|
||||
class FileData(NamedTuple):
|
||||
st_mtime: float
|
||||
st_size: int
|
||||
hash: str
|
||||
|
||||
|
||||
def get_cache_dir() -> Path:
|
||||
"""Get the cache directory used by black.
|
||||
|
||||
Users can customize this directory on all systems using `BLACK_CACHE_DIR`
|
||||
environment variable. By default, the cache directory is the user cache directory
|
||||
under the black application.
|
||||
|
||||
This result is immediately set to a constant `black.cache.CACHE_DIR` as to avoid
|
||||
repeated calls.
|
||||
"""
|
||||
# NOTE: Function mostly exists as a clean way to test getting the cache directory.
|
||||
default_cache_dir = user_cache_dir("black")
|
||||
cache_dir = Path(os.environ.get("BLACK_CACHE_DIR", default_cache_dir))
|
||||
cache_dir = cache_dir / __version__
|
||||
return cache_dir
|
||||
|
||||
|
||||
CACHE_DIR = get_cache_dir()
|
||||
|
||||
|
||||
def get_cache_file(mode: Mode) -> Path:
|
||||
return CACHE_DIR / f"cache.{mode.get_cache_key()}.pickle"
|
||||
|
||||
|
||||
@dataclass
|
||||
class Cache:
|
||||
mode: Mode
|
||||
cache_file: Path
|
||||
file_data: dict[str, FileData] = field(default_factory=dict)
|
||||
|
||||
@classmethod
|
||||
def read(cls, mode: Mode) -> Self:
|
||||
"""Read the cache if it exists and is well-formed.
|
||||
|
||||
If it is not well-formed, the call to write later should
|
||||
resolve the issue.
|
||||
"""
|
||||
cache_file = get_cache_file(mode)
|
||||
try:
|
||||
exists = cache_file.exists()
|
||||
except OSError as e:
|
||||
# Likely file too long; see #4172 and #4174
|
||||
err(f"Unable to read cache file {cache_file} due to {e}")
|
||||
return cls(mode, cache_file)
|
||||
if not exists:
|
||||
return cls(mode, cache_file)
|
||||
|
||||
with cache_file.open("rb") as fobj:
|
||||
try:
|
||||
data: dict[str, tuple[float, int, str]] = pickle.load(fobj)
|
||||
file_data = {k: FileData(*v) for k, v in data.items()}
|
||||
except (pickle.UnpicklingError, ValueError, IndexError):
|
||||
return cls(mode, cache_file)
|
||||
|
||||
return cls(mode, cache_file, file_data)
|
||||
|
||||
@staticmethod
|
||||
def hash_digest(path: Path) -> str:
|
||||
"""Return hash digest for path."""
|
||||
|
||||
data = path.read_bytes()
|
||||
return hashlib.sha256(data).hexdigest()
|
||||
|
||||
@staticmethod
|
||||
def get_file_data(path: Path) -> FileData:
|
||||
"""Return file data for path."""
|
||||
|
||||
stat = path.stat()
|
||||
hash = Cache.hash_digest(path)
|
||||
return FileData(stat.st_mtime, stat.st_size, hash)
|
||||
|
||||
def is_changed(self, source: Path) -> bool:
|
||||
"""Check if source has changed compared to cached version."""
|
||||
res_src = source.resolve()
|
||||
old = self.file_data.get(str(res_src))
|
||||
if old is None:
|
||||
return True
|
||||
|
||||
st = res_src.stat()
|
||||
if st.st_size != old.st_size:
|
||||
return True
|
||||
if st.st_mtime != old.st_mtime:
|
||||
new_hash = Cache.hash_digest(res_src)
|
||||
if new_hash != old.hash:
|
||||
return True
|
||||
return False
|
||||
|
||||
def filtered_cached(self, sources: Iterable[Path]) -> tuple[set[Path], set[Path]]:
|
||||
"""Split an iterable of paths in `sources` into two sets.
|
||||
|
||||
The first contains paths of files that modified on disk or are not in the
|
||||
cache. The other contains paths to non-modified files.
|
||||
"""
|
||||
changed: set[Path] = set()
|
||||
done: set[Path] = set()
|
||||
for src in sources:
|
||||
if self.is_changed(src):
|
||||
changed.add(src)
|
||||
else:
|
||||
done.add(src)
|
||||
return changed, done
|
||||
|
||||
def write(self, sources: Iterable[Path]) -> None:
|
||||
"""Update the cache file data and write a new cache file."""
|
||||
self.file_data.update(
|
||||
**{str(src.resolve()): Cache.get_file_data(src) for src in sources}
|
||||
)
|
||||
try:
|
||||
CACHE_DIR.mkdir(parents=True, exist_ok=True)
|
||||
with tempfile.NamedTemporaryFile(
|
||||
dir=str(self.cache_file.parent), delete=False
|
||||
) as f:
|
||||
# We store raw tuples in the cache because it's faster.
|
||||
data: dict[str, tuple[float, int, str]] = {
|
||||
k: (*v,) for k, v in self.file_data.items()
|
||||
}
|
||||
pickle.dump(data, f, protocol=4)
|
||||
os.replace(f.name, self.cache_file)
|
||||
except OSError:
|
||||
pass
|
Binary file not shown.
@@ -1,415 +0,0 @@
|
||||
import re
|
||||
from dataclasses import dataclass
|
||||
from functools import lru_cache
|
||||
from typing import Collection, Final, Iterator, Optional, Union
|
||||
|
||||
from black.mode import Mode, Preview
|
||||
from black.nodes import (
|
||||
CLOSING_BRACKETS,
|
||||
STANDALONE_COMMENT,
|
||||
WHITESPACE,
|
||||
container_of,
|
||||
first_leaf_of,
|
||||
make_simple_prefix,
|
||||
preceding_leaf,
|
||||
syms,
|
||||
)
|
||||
from blib2to3.pgen2 import token
|
||||
from blib2to3.pytree import Leaf, Node
|
||||
|
||||
# types
|
||||
LN = Union[Leaf, Node]
|
||||
|
||||
FMT_OFF: Final = {"# fmt: off", "# fmt:off", "# yapf: disable"}
|
||||
FMT_SKIP: Final = {"# fmt: skip", "# fmt:skip"}
|
||||
FMT_ON: Final = {"# fmt: on", "# fmt:on", "# yapf: enable"}
|
||||
|
||||
COMMENT_EXCEPTIONS = " !:#'"
|
||||
_COMMENT_PREFIX = "# "
|
||||
_COMMENT_LIST_SEPARATOR = ";"
|
||||
|
||||
|
||||
@dataclass
|
||||
class ProtoComment:
|
||||
"""Describes a piece of syntax that is a comment.
|
||||
|
||||
It's not a :class:`blib2to3.pytree.Leaf` so that:
|
||||
|
||||
* it can be cached (`Leaf` objects should not be reused more than once as
|
||||
they store their lineno, column, prefix, and parent information);
|
||||
* `newlines` and `consumed` fields are kept separate from the `value`. This
|
||||
simplifies handling of special marker comments like ``# fmt: off/on``.
|
||||
"""
|
||||
|
||||
type: int # token.COMMENT or STANDALONE_COMMENT
|
||||
value: str # content of the comment
|
||||
newlines: int # how many newlines before the comment
|
||||
consumed: int # how many characters of the original leaf's prefix did we consume
|
||||
form_feed: bool # is there a form feed before the comment
|
||||
leading_whitespace: str # leading whitespace before the comment, if any
|
||||
|
||||
|
||||
def generate_comments(leaf: LN) -> Iterator[Leaf]:
|
||||
"""Clean the prefix of the `leaf` and generate comments from it, if any.
|
||||
|
||||
Comments in lib2to3 are shoved into the whitespace prefix. This happens
|
||||
in `pgen2/driver.py:Driver.parse_tokens()`. This was a brilliant implementation
|
||||
move because it does away with modifying the grammar to include all the
|
||||
possible places in which comments can be placed.
|
||||
|
||||
The sad consequence for us though is that comments don't "belong" anywhere.
|
||||
This is why this function generates simple parentless Leaf objects for
|
||||
comments. We simply don't know what the correct parent should be.
|
||||
|
||||
No matter though, we can live without this. We really only need to
|
||||
differentiate between inline and standalone comments. The latter don't
|
||||
share the line with any code.
|
||||
|
||||
Inline comments are emitted as regular token.COMMENT leaves. Standalone
|
||||
are emitted with a fake STANDALONE_COMMENT token identifier.
|
||||
"""
|
||||
total_consumed = 0
|
||||
for pc in list_comments(leaf.prefix, is_endmarker=leaf.type == token.ENDMARKER):
|
||||
total_consumed = pc.consumed
|
||||
prefix = make_simple_prefix(pc.newlines, pc.form_feed)
|
||||
yield Leaf(pc.type, pc.value, prefix=prefix)
|
||||
normalize_trailing_prefix(leaf, total_consumed)
|
||||
|
||||
|
||||
@lru_cache(maxsize=4096)
|
||||
def list_comments(prefix: str, *, is_endmarker: bool) -> list[ProtoComment]:
|
||||
"""Return a list of :class:`ProtoComment` objects parsed from the given `prefix`."""
|
||||
result: list[ProtoComment] = []
|
||||
if not prefix or "#" not in prefix:
|
||||
return result
|
||||
|
||||
consumed = 0
|
||||
nlines = 0
|
||||
ignored_lines = 0
|
||||
form_feed = False
|
||||
for index, full_line in enumerate(re.split("\r?\n", prefix)):
|
||||
consumed += len(full_line) + 1 # adding the length of the split '\n'
|
||||
match = re.match(r"^(\s*)(\S.*|)$", full_line)
|
||||
assert match
|
||||
whitespace, line = match.groups()
|
||||
if not line:
|
||||
nlines += 1
|
||||
if "\f" in full_line:
|
||||
form_feed = True
|
||||
if not line.startswith("#"):
|
||||
# Escaped newlines outside of a comment are not really newlines at
|
||||
# all. We treat a single-line comment following an escaped newline
|
||||
# as a simple trailing comment.
|
||||
if line.endswith("\\"):
|
||||
ignored_lines += 1
|
||||
continue
|
||||
|
||||
if index == ignored_lines and not is_endmarker:
|
||||
comment_type = token.COMMENT # simple trailing comment
|
||||
else:
|
||||
comment_type = STANDALONE_COMMENT
|
||||
comment = make_comment(line)
|
||||
result.append(
|
||||
ProtoComment(
|
||||
type=comment_type,
|
||||
value=comment,
|
||||
newlines=nlines,
|
||||
consumed=consumed,
|
||||
form_feed=form_feed,
|
||||
leading_whitespace=whitespace,
|
||||
)
|
||||
)
|
||||
form_feed = False
|
||||
nlines = 0
|
||||
return result
|
||||
|
||||
|
||||
def normalize_trailing_prefix(leaf: LN, total_consumed: int) -> None:
|
||||
"""Normalize the prefix that's left over after generating comments.
|
||||
|
||||
Note: don't use backslashes for formatting or you'll lose your voting rights.
|
||||
"""
|
||||
remainder = leaf.prefix[total_consumed:]
|
||||
if "\\" not in remainder:
|
||||
nl_count = remainder.count("\n")
|
||||
form_feed = "\f" in remainder and remainder.endswith("\n")
|
||||
leaf.prefix = make_simple_prefix(nl_count, form_feed)
|
||||
return
|
||||
|
||||
leaf.prefix = ""
|
||||
|
||||
|
||||
def make_comment(content: str) -> str:
|
||||
"""Return a consistently formatted comment from the given `content` string.
|
||||
|
||||
All comments (except for "##", "#!", "#:", '#'") should have a single
|
||||
space between the hash sign and the content.
|
||||
|
||||
If `content` didn't start with a hash sign, one is provided.
|
||||
"""
|
||||
content = content.rstrip()
|
||||
if not content:
|
||||
return "#"
|
||||
|
||||
if content[0] == "#":
|
||||
content = content[1:]
|
||||
NON_BREAKING_SPACE = " "
|
||||
if (
|
||||
content
|
||||
and content[0] == NON_BREAKING_SPACE
|
||||
and not content.lstrip().startswith("type:")
|
||||
):
|
||||
content = " " + content[1:] # Replace NBSP by a simple space
|
||||
if content and content[0] not in COMMENT_EXCEPTIONS:
|
||||
content = " " + content
|
||||
return "#" + content
|
||||
|
||||
|
||||
def normalize_fmt_off(
|
||||
node: Node, mode: Mode, lines: Collection[tuple[int, int]]
|
||||
) -> None:
|
||||
"""Convert content between `# fmt: off`/`# fmt: on` into standalone comments."""
|
||||
try_again = True
|
||||
while try_again:
|
||||
try_again = convert_one_fmt_off_pair(node, mode, lines)
|
||||
|
||||
|
||||
def convert_one_fmt_off_pair(
|
||||
node: Node, mode: Mode, lines: Collection[tuple[int, int]]
|
||||
) -> bool:
|
||||
"""Convert content of a single `# fmt: off`/`# fmt: on` into a standalone comment.
|
||||
|
||||
Returns True if a pair was converted.
|
||||
"""
|
||||
for leaf in node.leaves():
|
||||
previous_consumed = 0
|
||||
for comment in list_comments(leaf.prefix, is_endmarker=False):
|
||||
is_fmt_off = comment.value in FMT_OFF
|
||||
is_fmt_skip = _contains_fmt_skip_comment(comment.value, mode)
|
||||
if (not is_fmt_off and not is_fmt_skip) or (
|
||||
# Invalid use when `# fmt: off` is applied before a closing bracket.
|
||||
is_fmt_off
|
||||
and leaf.type in CLOSING_BRACKETS
|
||||
):
|
||||
previous_consumed = comment.consumed
|
||||
continue
|
||||
# We only want standalone comments. If there's no previous leaf or
|
||||
# the previous leaf is indentation, it's a standalone comment in
|
||||
# disguise.
|
||||
if comment.type != STANDALONE_COMMENT:
|
||||
prev = preceding_leaf(leaf)
|
||||
if prev:
|
||||
if is_fmt_off and prev.type not in WHITESPACE:
|
||||
continue
|
||||
if is_fmt_skip and prev.type in WHITESPACE:
|
||||
continue
|
||||
|
||||
ignored_nodes = list(generate_ignored_nodes(leaf, comment, mode))
|
||||
if not ignored_nodes:
|
||||
continue
|
||||
|
||||
first = ignored_nodes[0] # Can be a container node with the `leaf`.
|
||||
parent = first.parent
|
||||
prefix = first.prefix
|
||||
if comment.value in FMT_OFF:
|
||||
first.prefix = prefix[comment.consumed :]
|
||||
if is_fmt_skip:
|
||||
first.prefix = ""
|
||||
standalone_comment_prefix = prefix
|
||||
else:
|
||||
standalone_comment_prefix = (
|
||||
prefix[:previous_consumed] + "\n" * comment.newlines
|
||||
)
|
||||
hidden_value = "".join(str(n) for n in ignored_nodes)
|
||||
comment_lineno = leaf.lineno - comment.newlines
|
||||
if comment.value in FMT_OFF:
|
||||
fmt_off_prefix = ""
|
||||
if len(lines) > 0 and not any(
|
||||
line[0] <= comment_lineno <= line[1] for line in lines
|
||||
):
|
||||
# keeping indentation of comment by preserving original whitespaces.
|
||||
fmt_off_prefix = prefix.split(comment.value)[0]
|
||||
if "\n" in fmt_off_prefix:
|
||||
fmt_off_prefix = fmt_off_prefix.split("\n")[-1]
|
||||
standalone_comment_prefix += fmt_off_prefix
|
||||
hidden_value = comment.value + "\n" + hidden_value
|
||||
if is_fmt_skip:
|
||||
hidden_value += (
|
||||
comment.leading_whitespace
|
||||
if Preview.no_normalize_fmt_skip_whitespace in mode
|
||||
else " "
|
||||
) + comment.value
|
||||
if hidden_value.endswith("\n"):
|
||||
# That happens when one of the `ignored_nodes` ended with a NEWLINE
|
||||
# leaf (possibly followed by a DEDENT).
|
||||
hidden_value = hidden_value[:-1]
|
||||
first_idx: Optional[int] = None
|
||||
for ignored in ignored_nodes:
|
||||
index = ignored.remove()
|
||||
if first_idx is None:
|
||||
first_idx = index
|
||||
assert parent is not None, "INTERNAL ERROR: fmt: on/off handling (1)"
|
||||
assert first_idx is not None, "INTERNAL ERROR: fmt: on/off handling (2)"
|
||||
parent.insert_child(
|
||||
first_idx,
|
||||
Leaf(
|
||||
STANDALONE_COMMENT,
|
||||
hidden_value,
|
||||
prefix=standalone_comment_prefix,
|
||||
fmt_pass_converted_first_leaf=first_leaf_of(first),
|
||||
),
|
||||
)
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
def generate_ignored_nodes(
|
||||
leaf: Leaf, comment: ProtoComment, mode: Mode
|
||||
) -> Iterator[LN]:
|
||||
"""Starting from the container of `leaf`, generate all leaves until `# fmt: on`.
|
||||
|
||||
If comment is skip, returns leaf only.
|
||||
Stops at the end of the block.
|
||||
"""
|
||||
if _contains_fmt_skip_comment(comment.value, mode):
|
||||
yield from _generate_ignored_nodes_from_fmt_skip(leaf, comment)
|
||||
return
|
||||
container: Optional[LN] = container_of(leaf)
|
||||
while container is not None and container.type != token.ENDMARKER:
|
||||
if is_fmt_on(container):
|
||||
return
|
||||
|
||||
# fix for fmt: on in children
|
||||
if children_contains_fmt_on(container):
|
||||
for index, child in enumerate(container.children):
|
||||
if isinstance(child, Leaf) and is_fmt_on(child):
|
||||
if child.type in CLOSING_BRACKETS:
|
||||
# This means `# fmt: on` is placed at a different bracket level
|
||||
# than `# fmt: off`. This is an invalid use, but as a courtesy,
|
||||
# we include this closing bracket in the ignored nodes.
|
||||
# The alternative is to fail the formatting.
|
||||
yield child
|
||||
return
|
||||
if (
|
||||
child.type == token.INDENT
|
||||
and index < len(container.children) - 1
|
||||
and children_contains_fmt_on(container.children[index + 1])
|
||||
):
|
||||
# This means `# fmt: on` is placed right after an indentation
|
||||
# level, and we shouldn't swallow the previous INDENT token.
|
||||
return
|
||||
if children_contains_fmt_on(child):
|
||||
return
|
||||
yield child
|
||||
else:
|
||||
if container.type == token.DEDENT and container.next_sibling is None:
|
||||
# This can happen when there is no matching `# fmt: on` comment at the
|
||||
# same level as `# fmt: on`. We need to keep this DEDENT.
|
||||
return
|
||||
yield container
|
||||
container = container.next_sibling
|
||||
|
||||
|
||||
def _generate_ignored_nodes_from_fmt_skip(
|
||||
leaf: Leaf, comment: ProtoComment
|
||||
) -> Iterator[LN]:
|
||||
"""Generate all leaves that should be ignored by the `# fmt: skip` from `leaf`."""
|
||||
prev_sibling = leaf.prev_sibling
|
||||
parent = leaf.parent
|
||||
# Need to properly format the leaf prefix to compare it to comment.value,
|
||||
# which is also formatted
|
||||
comments = list_comments(leaf.prefix, is_endmarker=False)
|
||||
if not comments or comment.value != comments[0].value:
|
||||
return
|
||||
if prev_sibling is not None:
|
||||
leaf.prefix = ""
|
||||
siblings = [prev_sibling]
|
||||
while "\n" not in prev_sibling.prefix and prev_sibling.prev_sibling is not None:
|
||||
prev_sibling = prev_sibling.prev_sibling
|
||||
siblings.insert(0, prev_sibling)
|
||||
yield from siblings
|
||||
elif (
|
||||
parent is not None and parent.type == syms.suite and leaf.type == token.NEWLINE
|
||||
):
|
||||
# The `# fmt: skip` is on the colon line of the if/while/def/class/...
|
||||
# statements. The ignored nodes should be previous siblings of the
|
||||
# parent suite node.
|
||||
leaf.prefix = ""
|
||||
ignored_nodes: list[LN] = []
|
||||
parent_sibling = parent.prev_sibling
|
||||
while parent_sibling is not None and parent_sibling.type != syms.suite:
|
||||
ignored_nodes.insert(0, parent_sibling)
|
||||
parent_sibling = parent_sibling.prev_sibling
|
||||
# Special case for `async_stmt` where the ASYNC token is on the
|
||||
# grandparent node.
|
||||
grandparent = parent.parent
|
||||
if (
|
||||
grandparent is not None
|
||||
and grandparent.prev_sibling is not None
|
||||
and grandparent.prev_sibling.type == token.ASYNC
|
||||
):
|
||||
ignored_nodes.insert(0, grandparent.prev_sibling)
|
||||
yield from iter(ignored_nodes)
|
||||
|
||||
|
||||
def is_fmt_on(container: LN) -> bool:
|
||||
"""Determine whether formatting is switched on within a container.
|
||||
Determined by whether the last `# fmt:` comment is `on` or `off`.
|
||||
"""
|
||||
fmt_on = False
|
||||
for comment in list_comments(container.prefix, is_endmarker=False):
|
||||
if comment.value in FMT_ON:
|
||||
fmt_on = True
|
||||
elif comment.value in FMT_OFF:
|
||||
fmt_on = False
|
||||
return fmt_on
|
||||
|
||||
|
||||
def children_contains_fmt_on(container: LN) -> bool:
|
||||
"""Determine if children have formatting switched on."""
|
||||
for child in container.children:
|
||||
leaf = first_leaf_of(child)
|
||||
if leaf is not None and is_fmt_on(leaf):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
def contains_pragma_comment(comment_list: list[Leaf]) -> bool:
|
||||
"""
|
||||
Returns:
|
||||
True iff one of the comments in @comment_list is a pragma used by one
|
||||
of the more common static analysis tools for python (e.g. mypy, flake8,
|
||||
pylint).
|
||||
"""
|
||||
for comment in comment_list:
|
||||
if comment.value.startswith(("# type:", "# noqa", "# pylint:")):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
def _contains_fmt_skip_comment(comment_line: str, mode: Mode) -> bool:
|
||||
"""
|
||||
Checks if the given comment contains FMT_SKIP alone or paired with other comments.
|
||||
Matching styles:
|
||||
# fmt:skip <-- single comment
|
||||
# noqa:XXX # fmt:skip # a nice line <-- multiple comments (Preview)
|
||||
# pylint:XXX; fmt:skip <-- list of comments (; separated, Preview)
|
||||
"""
|
||||
semantic_comment_blocks = [
|
||||
comment_line,
|
||||
*[
|
||||
_COMMENT_PREFIX + comment.strip()
|
||||
for comment in comment_line.split(_COMMENT_PREFIX)[1:]
|
||||
],
|
||||
*[
|
||||
_COMMENT_PREFIX + comment.strip()
|
||||
for comment in comment_line.strip(_COMMENT_PREFIX).split(
|
||||
_COMMENT_LIST_SEPARATOR
|
||||
)
|
||||
],
|
||||
]
|
||||
|
||||
return any(comment in FMT_SKIP for comment in semantic_comment_blocks)
|
@@ -1,190 +0,0 @@
|
||||
"""
|
||||
Formatting many files at once via multiprocessing. Contains entrypoint and utilities.
|
||||
|
||||
NOTE: this module is only imported if we need to format several files at once.
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import logging
|
||||
import os
|
||||
import signal
|
||||
import sys
|
||||
import traceback
|
||||
from concurrent.futures import Executor, ProcessPoolExecutor, ThreadPoolExecutor
|
||||
from multiprocessing import Manager
|
||||
from pathlib import Path
|
||||
from typing import Any, Iterable, Optional
|
||||
|
||||
from mypy_extensions import mypyc_attr
|
||||
|
||||
from black import WriteBack, format_file_in_place
|
||||
from black.cache import Cache
|
||||
from black.mode import Mode
|
||||
from black.output import err
|
||||
from black.report import Changed, Report
|
||||
|
||||
|
||||
def maybe_install_uvloop() -> None:
|
||||
"""If our environment has uvloop installed we use it.
|
||||
|
||||
This is called only from command-line entry points to avoid
|
||||
interfering with the parent process if Black is used as a library.
|
||||
"""
|
||||
try:
|
||||
import uvloop
|
||||
|
||||
uvloop.install()
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
def cancel(tasks: Iterable["asyncio.Future[Any]"]) -> None:
|
||||
"""asyncio signal handler that cancels all `tasks` and reports to stderr."""
|
||||
err("Aborted!")
|
||||
for task in tasks:
|
||||
task.cancel()
|
||||
|
||||
|
||||
def shutdown(loop: asyncio.AbstractEventLoop) -> None:
|
||||
"""Cancel all pending tasks on `loop`, wait for them, and close the loop."""
|
||||
try:
|
||||
# This part is borrowed from asyncio/runners.py in Python 3.7b2.
|
||||
to_cancel = [task for task in asyncio.all_tasks(loop) if not task.done()]
|
||||
if not to_cancel:
|
||||
return
|
||||
|
||||
for task in to_cancel:
|
||||
task.cancel()
|
||||
loop.run_until_complete(asyncio.gather(*to_cancel, return_exceptions=True))
|
||||
finally:
|
||||
# `concurrent.futures.Future` objects cannot be cancelled once they
|
||||
# are already running. There might be some when the `shutdown()` happened.
|
||||
# Silence their logger's spew about the event loop being closed.
|
||||
cf_logger = logging.getLogger("concurrent.futures")
|
||||
cf_logger.setLevel(logging.CRITICAL)
|
||||
loop.close()
|
||||
|
||||
|
||||
# diff-shades depends on being to monkeypatch this function to operate. I know it's
|
||||
# not ideal, but this shouldn't cause any issues ... hopefully. ~ichard26
|
||||
@mypyc_attr(patchable=True)
|
||||
def reformat_many(
|
||||
sources: set[Path],
|
||||
fast: bool,
|
||||
write_back: WriteBack,
|
||||
mode: Mode,
|
||||
report: Report,
|
||||
workers: Optional[int],
|
||||
) -> None:
|
||||
"""Reformat multiple files using a ProcessPoolExecutor."""
|
||||
maybe_install_uvloop()
|
||||
|
||||
executor: Executor
|
||||
if workers is None:
|
||||
workers = int(os.environ.get("BLACK_NUM_WORKERS", 0))
|
||||
workers = workers or os.cpu_count() or 1
|
||||
if sys.platform == "win32":
|
||||
# Work around https://bugs.python.org/issue26903
|
||||
workers = min(workers, 60)
|
||||
try:
|
||||
executor = ProcessPoolExecutor(max_workers=workers)
|
||||
except (ImportError, NotImplementedError, OSError):
|
||||
# we arrive here if the underlying system does not support multi-processing
|
||||
# like in AWS Lambda or Termux, in which case we gracefully fallback to
|
||||
# a ThreadPoolExecutor with just a single worker (more workers would not do us
|
||||
# any good due to the Global Interpreter Lock)
|
||||
executor = ThreadPoolExecutor(max_workers=1)
|
||||
|
||||
loop = asyncio.new_event_loop()
|
||||
asyncio.set_event_loop(loop)
|
||||
try:
|
||||
loop.run_until_complete(
|
||||
schedule_formatting(
|
||||
sources=sources,
|
||||
fast=fast,
|
||||
write_back=write_back,
|
||||
mode=mode,
|
||||
report=report,
|
||||
loop=loop,
|
||||
executor=executor,
|
||||
)
|
||||
)
|
||||
finally:
|
||||
try:
|
||||
shutdown(loop)
|
||||
finally:
|
||||
asyncio.set_event_loop(None)
|
||||
if executor is not None:
|
||||
executor.shutdown()
|
||||
|
||||
|
||||
async def schedule_formatting(
|
||||
sources: set[Path],
|
||||
fast: bool,
|
||||
write_back: WriteBack,
|
||||
mode: Mode,
|
||||
report: "Report",
|
||||
loop: asyncio.AbstractEventLoop,
|
||||
executor: "Executor",
|
||||
) -> None:
|
||||
"""Run formatting of `sources` in parallel using the provided `executor`.
|
||||
|
||||
(Use ProcessPoolExecutors for actual parallelism.)
|
||||
|
||||
`write_back`, `fast`, and `mode` options are passed to
|
||||
:func:`format_file_in_place`.
|
||||
"""
|
||||
cache = Cache.read(mode)
|
||||
if write_back not in (WriteBack.DIFF, WriteBack.COLOR_DIFF):
|
||||
sources, cached = cache.filtered_cached(sources)
|
||||
for src in sorted(cached):
|
||||
report.done(src, Changed.CACHED)
|
||||
if not sources:
|
||||
return
|
||||
|
||||
cancelled = []
|
||||
sources_to_cache = []
|
||||
lock = None
|
||||
if write_back in (WriteBack.DIFF, WriteBack.COLOR_DIFF):
|
||||
# For diff output, we need locks to ensure we don't interleave output
|
||||
# from different processes.
|
||||
manager = Manager()
|
||||
lock = manager.Lock()
|
||||
tasks = {
|
||||
asyncio.ensure_future(
|
||||
loop.run_in_executor(
|
||||
executor, format_file_in_place, src, fast, mode, write_back, lock
|
||||
)
|
||||
): src
|
||||
for src in sorted(sources)
|
||||
}
|
||||
pending = tasks.keys()
|
||||
try:
|
||||
loop.add_signal_handler(signal.SIGINT, cancel, pending)
|
||||
loop.add_signal_handler(signal.SIGTERM, cancel, pending)
|
||||
except NotImplementedError:
|
||||
# There are no good alternatives for these on Windows.
|
||||
pass
|
||||
while pending:
|
||||
done, _ = await asyncio.wait(pending, return_when=asyncio.FIRST_COMPLETED)
|
||||
for task in done:
|
||||
src = tasks.pop(task)
|
||||
if task.cancelled():
|
||||
cancelled.append(task)
|
||||
elif exc := task.exception():
|
||||
if report.verbose:
|
||||
traceback.print_exception(type(exc), exc, exc.__traceback__)
|
||||
report.failed(src, str(exc))
|
||||
else:
|
||||
changed = Changed.YES if task.result() else Changed.NO
|
||||
# If the file was written back or was successfully checked as
|
||||
# well-formatted, store this information in the cache.
|
||||
if write_back is WriteBack.YES or (
|
||||
write_back is WriteBack.CHECK and changed is Changed.NO
|
||||
):
|
||||
sources_to_cache.append(src)
|
||||
report.done(src, changed)
|
||||
if cancelled:
|
||||
await asyncio.gather(*cancelled, return_exceptions=True)
|
||||
if sources_to_cache:
|
||||
cache.write(sources_to_cache)
|
Binary file not shown.
@@ -1,4 +0,0 @@
|
||||
DEFAULT_LINE_LENGTH = 88
|
||||
DEFAULT_EXCLUDES = r"/(\.direnv|\.eggs|\.git|\.hg|\.ipynb_checkpoints|\.mypy_cache|\.nox|\.pytest_cache|\.ruff_cache|\.tox|\.svn|\.venv|\.vscode|__pypackages__|_build|buck-out|build|dist|venv)/" # noqa: B950
|
||||
DEFAULT_INCLUDES = r"(\.pyi?|\.ipynb)$"
|
||||
STDIN_PLACEHOLDER = "__BLACK_STDIN_FILENAME__"
|
@@ -1,54 +0,0 @@
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Any, Iterator, TypeVar, Union
|
||||
|
||||
from black.nodes import Visitor
|
||||
from black.output import out
|
||||
from black.parsing import lib2to3_parse
|
||||
from blib2to3.pgen2 import token
|
||||
from blib2to3.pytree import Leaf, Node, type_repr
|
||||
|
||||
LN = Union[Leaf, Node]
|
||||
T = TypeVar("T")
|
||||
|
||||
|
||||
@dataclass
|
||||
class DebugVisitor(Visitor[T]):
|
||||
tree_depth: int = 0
|
||||
list_output: list[str] = field(default_factory=list)
|
||||
print_output: bool = True
|
||||
|
||||
def out(self, message: str, *args: Any, **kwargs: Any) -> None:
|
||||
self.list_output.append(message)
|
||||
if self.print_output:
|
||||
out(message, *args, **kwargs)
|
||||
|
||||
def visit_default(self, node: LN) -> Iterator[T]:
|
||||
indent = " " * (2 * self.tree_depth)
|
||||
if isinstance(node, Node):
|
||||
_type = type_repr(node.type)
|
||||
self.out(f"{indent}{_type}", fg="yellow")
|
||||
self.tree_depth += 1
|
||||
for child in node.children:
|
||||
yield from self.visit(child)
|
||||
|
||||
self.tree_depth -= 1
|
||||
self.out(f"{indent}/{_type}", fg="yellow", bold=False)
|
||||
else:
|
||||
_type = token.tok_name.get(node.type, str(node.type))
|
||||
self.out(f"{indent}{_type}", fg="blue", nl=False)
|
||||
if node.prefix:
|
||||
# We don't have to handle prefixes for `Node` objects since
|
||||
# that delegates to the first child anyway.
|
||||
self.out(f" {node.prefix!r}", fg="green", bold=False, nl=False)
|
||||
self.out(f" {node.value!r}", fg="blue", bold=False)
|
||||
|
||||
@classmethod
|
||||
def show(cls, code: Union[str, Leaf, Node]) -> None:
|
||||
"""Pretty-print the lib2to3 AST of a given string of `code`.
|
||||
|
||||
Convenience method for debugging.
|
||||
"""
|
||||
v: DebugVisitor[None] = DebugVisitor()
|
||||
if isinstance(code, str):
|
||||
code = lib2to3_parse(code)
|
||||
list(v.visit(code))
|
@@ -1,433 +0,0 @@
|
||||
import io
|
||||
import os
|
||||
import sys
|
||||
from functools import lru_cache
|
||||
from pathlib import Path
|
||||
from typing import (
|
||||
TYPE_CHECKING,
|
||||
Any,
|
||||
Iterable,
|
||||
Iterator,
|
||||
Optional,
|
||||
Pattern,
|
||||
Sequence,
|
||||
Union,
|
||||
)
|
||||
|
||||
from mypy_extensions import mypyc_attr
|
||||
from packaging.specifiers import InvalidSpecifier, Specifier, SpecifierSet
|
||||
from packaging.version import InvalidVersion, Version
|
||||
from pathspec import PathSpec
|
||||
from pathspec.patterns.gitwildmatch import GitWildMatchPatternError
|
||||
|
||||
if sys.version_info >= (3, 11):
|
||||
try:
|
||||
import tomllib
|
||||
except ImportError:
|
||||
# Help users on older alphas
|
||||
if not TYPE_CHECKING:
|
||||
import tomli as tomllib
|
||||
else:
|
||||
import tomli as tomllib
|
||||
|
||||
from black.handle_ipynb_magics import jupyter_dependencies_are_installed
|
||||
from black.mode import TargetVersion
|
||||
from black.output import err
|
||||
from black.report import Report
|
||||
|
||||
if TYPE_CHECKING:
|
||||
import colorama # noqa: F401
|
||||
|
||||
|
||||
@lru_cache
|
||||
def _load_toml(path: Union[Path, str]) -> dict[str, Any]:
|
||||
with open(path, "rb") as f:
|
||||
return tomllib.load(f)
|
||||
|
||||
|
||||
@lru_cache
|
||||
def _cached_resolve(path: Path) -> Path:
|
||||
return path.resolve()
|
||||
|
||||
|
||||
@lru_cache
|
||||
def find_project_root(
|
||||
srcs: Sequence[str], stdin_filename: Optional[str] = None
|
||||
) -> tuple[Path, str]:
|
||||
"""Return a directory containing .git, .hg, or pyproject.toml.
|
||||
|
||||
pyproject.toml files are only considered if they contain a [tool.black]
|
||||
section and are ignored otherwise.
|
||||
|
||||
That directory will be a common parent of all files and directories
|
||||
passed in `srcs`.
|
||||
|
||||
If no directory in the tree contains a marker that would specify it's the
|
||||
project root, the root of the file system is returned.
|
||||
|
||||
Returns a two-tuple with the first element as the project root path and
|
||||
the second element as a string describing the method by which the
|
||||
project root was discovered.
|
||||
"""
|
||||
if stdin_filename is not None:
|
||||
srcs = tuple(stdin_filename if s == "-" else s for s in srcs)
|
||||
if not srcs:
|
||||
srcs = [str(_cached_resolve(Path.cwd()))]
|
||||
|
||||
path_srcs = [_cached_resolve(Path(Path.cwd(), src)) for src in srcs]
|
||||
|
||||
# A list of lists of parents for each 'src'. 'src' is included as a
|
||||
# "parent" of itself if it is a directory
|
||||
src_parents = [
|
||||
list(path.parents) + ([path] if path.is_dir() else []) for path in path_srcs
|
||||
]
|
||||
|
||||
common_base = max(
|
||||
set.intersection(*(set(parents) for parents in src_parents)),
|
||||
key=lambda path: path.parts,
|
||||
)
|
||||
|
||||
for directory in (common_base, *common_base.parents):
|
||||
if (directory / ".git").exists():
|
||||
return directory, ".git directory"
|
||||
|
||||
if (directory / ".hg").is_dir():
|
||||
return directory, ".hg directory"
|
||||
|
||||
if (directory / "pyproject.toml").is_file():
|
||||
pyproject_toml = _load_toml(directory / "pyproject.toml")
|
||||
if "black" in pyproject_toml.get("tool", {}):
|
||||
return directory, "pyproject.toml"
|
||||
|
||||
return directory, "file system root"
|
||||
|
||||
|
||||
def find_pyproject_toml(
|
||||
path_search_start: tuple[str, ...], stdin_filename: Optional[str] = None
|
||||
) -> Optional[str]:
|
||||
"""Find the absolute filepath to a pyproject.toml if it exists"""
|
||||
path_project_root, _ = find_project_root(path_search_start, stdin_filename)
|
||||
path_pyproject_toml = path_project_root / "pyproject.toml"
|
||||
if path_pyproject_toml.is_file():
|
||||
return str(path_pyproject_toml)
|
||||
|
||||
try:
|
||||
path_user_pyproject_toml = find_user_pyproject_toml()
|
||||
return (
|
||||
str(path_user_pyproject_toml)
|
||||
if path_user_pyproject_toml.is_file()
|
||||
else None
|
||||
)
|
||||
except (PermissionError, RuntimeError) as e:
|
||||
# We do not have access to the user-level config directory, so ignore it.
|
||||
err(f"Ignoring user configuration directory due to {e!r}")
|
||||
return None
|
||||
|
||||
|
||||
@mypyc_attr(patchable=True)
|
||||
def parse_pyproject_toml(path_config: str) -> dict[str, Any]:
|
||||
"""Parse a pyproject toml file, pulling out relevant parts for Black.
|
||||
|
||||
If parsing fails, will raise a tomllib.TOMLDecodeError.
|
||||
"""
|
||||
pyproject_toml = _load_toml(path_config)
|
||||
config: dict[str, Any] = pyproject_toml.get("tool", {}).get("black", {})
|
||||
config = {k.replace("--", "").replace("-", "_"): v for k, v in config.items()}
|
||||
|
||||
if "target_version" not in config:
|
||||
inferred_target_version = infer_target_version(pyproject_toml)
|
||||
if inferred_target_version is not None:
|
||||
config["target_version"] = [v.name.lower() for v in inferred_target_version]
|
||||
|
||||
return config
|
||||
|
||||
|
||||
def infer_target_version(
|
||||
pyproject_toml: dict[str, Any],
|
||||
) -> Optional[list[TargetVersion]]:
|
||||
"""Infer Black's target version from the project metadata in pyproject.toml.
|
||||
|
||||
Supports the PyPA standard format (PEP 621):
|
||||
https://packaging.python.org/en/latest/specifications/declaring-project-metadata/#requires-python
|
||||
|
||||
If the target version cannot be inferred, returns None.
|
||||
"""
|
||||
project_metadata = pyproject_toml.get("project", {})
|
||||
requires_python = project_metadata.get("requires-python", None)
|
||||
if requires_python is not None:
|
||||
try:
|
||||
return parse_req_python_version(requires_python)
|
||||
except InvalidVersion:
|
||||
pass
|
||||
try:
|
||||
return parse_req_python_specifier(requires_python)
|
||||
except (InvalidSpecifier, InvalidVersion):
|
||||
pass
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def parse_req_python_version(requires_python: str) -> Optional[list[TargetVersion]]:
|
||||
"""Parse a version string (i.e. ``"3.7"``) to a list of TargetVersion.
|
||||
|
||||
If parsing fails, will raise a packaging.version.InvalidVersion error.
|
||||
If the parsed version cannot be mapped to a valid TargetVersion, returns None.
|
||||
"""
|
||||
version = Version(requires_python)
|
||||
if version.release[0] != 3:
|
||||
return None
|
||||
try:
|
||||
return [TargetVersion(version.release[1])]
|
||||
except (IndexError, ValueError):
|
||||
return None
|
||||
|
||||
|
||||
def parse_req_python_specifier(requires_python: str) -> Optional[list[TargetVersion]]:
|
||||
"""Parse a specifier string (i.e. ``">=3.7,<3.10"``) to a list of TargetVersion.
|
||||
|
||||
If parsing fails, will raise a packaging.specifiers.InvalidSpecifier error.
|
||||
If the parsed specifier cannot be mapped to a valid TargetVersion, returns None.
|
||||
"""
|
||||
specifier_set = strip_specifier_set(SpecifierSet(requires_python))
|
||||
if not specifier_set:
|
||||
return None
|
||||
|
||||
target_version_map = {f"3.{v.value}": v for v in TargetVersion}
|
||||
compatible_versions: list[str] = list(specifier_set.filter(target_version_map))
|
||||
if compatible_versions:
|
||||
return [target_version_map[v] for v in compatible_versions]
|
||||
return None
|
||||
|
||||
|
||||
def strip_specifier_set(specifier_set: SpecifierSet) -> SpecifierSet:
|
||||
"""Strip minor versions for some specifiers in the specifier set.
|
||||
|
||||
For background on version specifiers, see PEP 440:
|
||||
https://peps.python.org/pep-0440/#version-specifiers
|
||||
"""
|
||||
specifiers = []
|
||||
for s in specifier_set:
|
||||
if "*" in str(s):
|
||||
specifiers.append(s)
|
||||
elif s.operator in ["~=", "==", ">=", "==="]:
|
||||
version = Version(s.version)
|
||||
stripped = Specifier(f"{s.operator}{version.major}.{version.minor}")
|
||||
specifiers.append(stripped)
|
||||
elif s.operator == ">":
|
||||
version = Version(s.version)
|
||||
if len(version.release) > 2:
|
||||
s = Specifier(f">={version.major}.{version.minor}")
|
||||
specifiers.append(s)
|
||||
else:
|
||||
specifiers.append(s)
|
||||
|
||||
return SpecifierSet(",".join(str(s) for s in specifiers))
|
||||
|
||||
|
||||
@lru_cache
|
||||
def find_user_pyproject_toml() -> Path:
|
||||
r"""Return the path to the top-level user configuration for black.
|
||||
|
||||
This looks for ~\.black on Windows and ~/.config/black on Linux and other
|
||||
Unix systems.
|
||||
|
||||
May raise:
|
||||
- RuntimeError: if the current user has no homedir
|
||||
- PermissionError: if the current process cannot access the user's homedir
|
||||
"""
|
||||
if sys.platform == "win32":
|
||||
# Windows
|
||||
user_config_path = Path.home() / ".black"
|
||||
else:
|
||||
config_root = os.environ.get("XDG_CONFIG_HOME", "~/.config")
|
||||
user_config_path = Path(config_root).expanduser() / "black"
|
||||
return _cached_resolve(user_config_path)
|
||||
|
||||
|
||||
@lru_cache
|
||||
def get_gitignore(root: Path) -> PathSpec:
|
||||
"""Return a PathSpec matching gitignore content if present."""
|
||||
gitignore = root / ".gitignore"
|
||||
lines: list[str] = []
|
||||
if gitignore.is_file():
|
||||
with gitignore.open(encoding="utf-8") as gf:
|
||||
lines = gf.readlines()
|
||||
try:
|
||||
return PathSpec.from_lines("gitwildmatch", lines)
|
||||
except GitWildMatchPatternError as e:
|
||||
err(f"Could not parse {gitignore}: {e}")
|
||||
raise
|
||||
|
||||
|
||||
def resolves_outside_root_or_cannot_stat(
|
||||
path: Path,
|
||||
root: Path,
|
||||
report: Optional[Report] = None,
|
||||
) -> bool:
|
||||
"""
|
||||
Returns whether the path is a symbolic link that points outside the
|
||||
root directory. Also returns True if we failed to resolve the path.
|
||||
"""
|
||||
try:
|
||||
resolved_path = _cached_resolve(path)
|
||||
except OSError as e:
|
||||
if report:
|
||||
report.path_ignored(path, f"cannot be read because {e}")
|
||||
return True
|
||||
try:
|
||||
resolved_path.relative_to(root)
|
||||
except ValueError:
|
||||
if report:
|
||||
report.path_ignored(path, f"is a symbolic link that points outside {root}")
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def best_effort_relative_path(path: Path, root: Path) -> Path:
|
||||
# Precondition: resolves_outside_root_or_cannot_stat(path, root) is False
|
||||
try:
|
||||
return path.absolute().relative_to(root)
|
||||
except ValueError:
|
||||
pass
|
||||
root_parent = next((p for p in path.parents if _cached_resolve(p) == root), None)
|
||||
if root_parent is not None:
|
||||
return path.relative_to(root_parent)
|
||||
# something adversarial, fallback to path guaranteed by precondition
|
||||
return _cached_resolve(path).relative_to(root)
|
||||
|
||||
|
||||
def _path_is_ignored(
|
||||
root_relative_path: str,
|
||||
root: Path,
|
||||
gitignore_dict: dict[Path, PathSpec],
|
||||
) -> bool:
|
||||
path = root / root_relative_path
|
||||
# Note that this logic is sensitive to the ordering of gitignore_dict. Callers must
|
||||
# ensure that gitignore_dict is ordered from least specific to most specific.
|
||||
for gitignore_path, pattern in gitignore_dict.items():
|
||||
try:
|
||||
relative_path = path.relative_to(gitignore_path).as_posix()
|
||||
if path.is_dir():
|
||||
relative_path = relative_path + "/"
|
||||
except ValueError:
|
||||
break
|
||||
if pattern.match_file(relative_path):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def path_is_excluded(
|
||||
normalized_path: str,
|
||||
pattern: Optional[Pattern[str]],
|
||||
) -> bool:
|
||||
match = pattern.search(normalized_path) if pattern else None
|
||||
return bool(match and match.group(0))
|
||||
|
||||
|
||||
def gen_python_files(
|
||||
paths: Iterable[Path],
|
||||
root: Path,
|
||||
include: Pattern[str],
|
||||
exclude: Pattern[str],
|
||||
extend_exclude: Optional[Pattern[str]],
|
||||
force_exclude: Optional[Pattern[str]],
|
||||
report: Report,
|
||||
gitignore_dict: Optional[dict[Path, PathSpec]],
|
||||
*,
|
||||
verbose: bool,
|
||||
quiet: bool,
|
||||
) -> Iterator[Path]:
|
||||
"""Generate all files under `path` whose paths are not excluded by the
|
||||
`exclude_regex`, `extend_exclude`, or `force_exclude` regexes,
|
||||
but are included by the `include` regex.
|
||||
|
||||
Symbolic links pointing outside of the `root` directory are ignored.
|
||||
|
||||
`report` is where output about exclusions goes.
|
||||
"""
|
||||
|
||||
assert root.is_absolute(), f"INTERNAL ERROR: `root` must be absolute but is {root}"
|
||||
for child in paths:
|
||||
assert child.is_absolute()
|
||||
root_relative_path = child.relative_to(root).as_posix()
|
||||
|
||||
# First ignore files matching .gitignore, if passed
|
||||
if gitignore_dict and _path_is_ignored(
|
||||
root_relative_path, root, gitignore_dict
|
||||
):
|
||||
report.path_ignored(child, "matches a .gitignore file content")
|
||||
continue
|
||||
|
||||
# Then ignore with `--exclude` `--extend-exclude` and `--force-exclude` options.
|
||||
root_relative_path = "/" + root_relative_path
|
||||
if child.is_dir():
|
||||
root_relative_path += "/"
|
||||
|
||||
if path_is_excluded(root_relative_path, exclude):
|
||||
report.path_ignored(child, "matches the --exclude regular expression")
|
||||
continue
|
||||
|
||||
if path_is_excluded(root_relative_path, extend_exclude):
|
||||
report.path_ignored(
|
||||
child, "matches the --extend-exclude regular expression"
|
||||
)
|
||||
continue
|
||||
|
||||
if path_is_excluded(root_relative_path, force_exclude):
|
||||
report.path_ignored(child, "matches the --force-exclude regular expression")
|
||||
continue
|
||||
|
||||
if resolves_outside_root_or_cannot_stat(child, root, report):
|
||||
continue
|
||||
|
||||
if child.is_dir():
|
||||
# If gitignore is None, gitignore usage is disabled, while a Falsey
|
||||
# gitignore is when the directory doesn't have a .gitignore file.
|
||||
if gitignore_dict is not None:
|
||||
new_gitignore_dict = {
|
||||
**gitignore_dict,
|
||||
root / child: get_gitignore(child),
|
||||
}
|
||||
else:
|
||||
new_gitignore_dict = None
|
||||
yield from gen_python_files(
|
||||
child.iterdir(),
|
||||
root,
|
||||
include,
|
||||
exclude,
|
||||
extend_exclude,
|
||||
force_exclude,
|
||||
report,
|
||||
new_gitignore_dict,
|
||||
verbose=verbose,
|
||||
quiet=quiet,
|
||||
)
|
||||
|
||||
elif child.is_file():
|
||||
if child.suffix == ".ipynb" and not jupyter_dependencies_are_installed(
|
||||
warn=verbose or not quiet
|
||||
):
|
||||
continue
|
||||
include_match = include.search(root_relative_path) if include else True
|
||||
if include_match:
|
||||
yield child
|
||||
|
||||
|
||||
def wrap_stream_for_windows(
|
||||
f: io.TextIOWrapper,
|
||||
) -> Union[io.TextIOWrapper, "colorama.AnsiToWin32"]:
|
||||
"""
|
||||
Wrap stream with colorama's wrap_stream so colors are shown on Windows.
|
||||
|
||||
If `colorama` is unavailable, the original stream is returned unmodified.
|
||||
Otherwise, the `wrap_stream()` function determines whether the stream needs
|
||||
to be wrapped for a Windows environment and will accordingly either return
|
||||
an `AnsiToWin32` wrapper or the original stream.
|
||||
"""
|
||||
try:
|
||||
from colorama.initialise import wrap_stream
|
||||
except ImportError:
|
||||
return f
|
||||
else:
|
||||
# Set `strip=False` to avoid needing to modify test_express_diff_with_color.
|
||||
return wrap_stream(f, convert=None, strip=False, autoreset=False, wrap=True)
|
Binary file not shown.
@@ -1,497 +0,0 @@
|
||||
"""Functions to process IPython magics with."""
|
||||
|
||||
import ast
|
||||
import collections
|
||||
import dataclasses
|
||||
import re
|
||||
import secrets
|
||||
import sys
|
||||
from functools import lru_cache
|
||||
from importlib.util import find_spec
|
||||
from typing import Optional
|
||||
|
||||
if sys.version_info >= (3, 10):
|
||||
from typing import TypeGuard
|
||||
else:
|
||||
from typing_extensions import TypeGuard
|
||||
|
||||
from black.mode import Mode
|
||||
from black.output import out
|
||||
from black.report import NothingChanged
|
||||
|
||||
TRANSFORMED_MAGICS = frozenset((
|
||||
"get_ipython().run_cell_magic",
|
||||
"get_ipython().system",
|
||||
"get_ipython().getoutput",
|
||||
"get_ipython().run_line_magic",
|
||||
))
|
||||
TOKENS_TO_IGNORE = frozenset((
|
||||
"ENDMARKER",
|
||||
"NL",
|
||||
"NEWLINE",
|
||||
"COMMENT",
|
||||
"DEDENT",
|
||||
"UNIMPORTANT_WS",
|
||||
"ESCAPED_NL",
|
||||
))
|
||||
PYTHON_CELL_MAGICS = frozenset((
|
||||
"capture",
|
||||
"prun",
|
||||
"pypy",
|
||||
"python",
|
||||
"python3",
|
||||
"time",
|
||||
"timeit",
|
||||
))
|
||||
TOKEN_HEX = secrets.token_hex
|
||||
|
||||
|
||||
@dataclasses.dataclass(frozen=True)
|
||||
class Replacement:
|
||||
mask: str
|
||||
src: str
|
||||
|
||||
|
||||
@lru_cache
|
||||
def jupyter_dependencies_are_installed(*, warn: bool) -> bool:
|
||||
installed = (
|
||||
find_spec("tokenize_rt") is not None and find_spec("IPython") is not None
|
||||
)
|
||||
if not installed and warn:
|
||||
msg = (
|
||||
"Skipping .ipynb files as Jupyter dependencies are not installed.\n"
|
||||
'You can fix this by running ``pip install "black[jupyter]"``'
|
||||
)
|
||||
out(msg)
|
||||
return installed
|
||||
|
||||
|
||||
def validate_cell(src: str, mode: Mode) -> None:
|
||||
"""Check that cell does not already contain TransformerManager transformations,
|
||||
or non-Python cell magics, which might cause tokenizer_rt to break because of
|
||||
indentations.
|
||||
|
||||
If a cell contains ``!ls``, then it'll be transformed to
|
||||
``get_ipython().system('ls')``. However, if the cell originally contained
|
||||
``get_ipython().system('ls')``, then it would get transformed in the same way:
|
||||
|
||||
>>> TransformerManager().transform_cell("get_ipython().system('ls')")
|
||||
"get_ipython().system('ls')\n"
|
||||
>>> TransformerManager().transform_cell("!ls")
|
||||
"get_ipython().system('ls')\n"
|
||||
|
||||
Due to the impossibility of safely roundtripping in such situations, cells
|
||||
containing transformed magics will be ignored.
|
||||
"""
|
||||
if any(transformed_magic in src for transformed_magic in TRANSFORMED_MAGICS):
|
||||
raise NothingChanged
|
||||
|
||||
line = _get_code_start(src)
|
||||
if line.startswith("%%") and (
|
||||
line.split(maxsplit=1)[0][2:]
|
||||
not in PYTHON_CELL_MAGICS | mode.python_cell_magics
|
||||
):
|
||||
raise NothingChanged
|
||||
|
||||
|
||||
def remove_trailing_semicolon(src: str) -> tuple[str, bool]:
|
||||
"""Remove trailing semicolon from Jupyter notebook cell.
|
||||
|
||||
For example,
|
||||
|
||||
fig, ax = plt.subplots()
|
||||
ax.plot(x_data, y_data); # plot data
|
||||
|
||||
would become
|
||||
|
||||
fig, ax = plt.subplots()
|
||||
ax.plot(x_data, y_data) # plot data
|
||||
|
||||
Mirrors the logic in `quiet` from `IPython.core.displayhook`, but uses
|
||||
``tokenize_rt`` so that round-tripping works fine.
|
||||
"""
|
||||
from tokenize_rt import reversed_enumerate, src_to_tokens, tokens_to_src
|
||||
|
||||
tokens = src_to_tokens(src)
|
||||
trailing_semicolon = False
|
||||
for idx, token in reversed_enumerate(tokens):
|
||||
if token.name in TOKENS_TO_IGNORE:
|
||||
continue
|
||||
if token.name == "OP" and token.src == ";":
|
||||
del tokens[idx]
|
||||
trailing_semicolon = True
|
||||
break
|
||||
if not trailing_semicolon:
|
||||
return src, False
|
||||
return tokens_to_src(tokens), True
|
||||
|
||||
|
||||
def put_trailing_semicolon_back(src: str, has_trailing_semicolon: bool) -> str:
|
||||
"""Put trailing semicolon back if cell originally had it.
|
||||
|
||||
Mirrors the logic in `quiet` from `IPython.core.displayhook`, but uses
|
||||
``tokenize_rt`` so that round-tripping works fine.
|
||||
"""
|
||||
if not has_trailing_semicolon:
|
||||
return src
|
||||
from tokenize_rt import reversed_enumerate, src_to_tokens, tokens_to_src
|
||||
|
||||
tokens = src_to_tokens(src)
|
||||
for idx, token in reversed_enumerate(tokens):
|
||||
if token.name in TOKENS_TO_IGNORE:
|
||||
continue
|
||||
tokens[idx] = token._replace(src=token.src + ";")
|
||||
break
|
||||
else: # pragma: nocover
|
||||
raise AssertionError(
|
||||
"INTERNAL ERROR: Was not able to reinstate trailing semicolon. "
|
||||
"Please report a bug on https://github.com/psf/black/issues. "
|
||||
) from None
|
||||
return str(tokens_to_src(tokens))
|
||||
|
||||
|
||||
def mask_cell(src: str) -> tuple[str, list[Replacement]]:
|
||||
"""Mask IPython magics so content becomes parseable Python code.
|
||||
|
||||
For example,
|
||||
|
||||
%matplotlib inline
|
||||
'foo'
|
||||
|
||||
becomes
|
||||
|
||||
"25716f358c32750e"
|
||||
'foo'
|
||||
|
||||
The replacements are returned, along with the transformed code.
|
||||
"""
|
||||
replacements: list[Replacement] = []
|
||||
try:
|
||||
ast.parse(src)
|
||||
except SyntaxError:
|
||||
# Might have IPython magics, will process below.
|
||||
pass
|
||||
else:
|
||||
# Syntax is fine, nothing to mask, early return.
|
||||
return src, replacements
|
||||
|
||||
from IPython.core.inputtransformer2 import TransformerManager
|
||||
|
||||
transformer_manager = TransformerManager()
|
||||
transformed = transformer_manager.transform_cell(src)
|
||||
transformed, cell_magic_replacements = replace_cell_magics(transformed)
|
||||
replacements += cell_magic_replacements
|
||||
transformed = transformer_manager.transform_cell(transformed)
|
||||
transformed, magic_replacements = replace_magics(transformed)
|
||||
if len(transformed.splitlines()) != len(src.splitlines()):
|
||||
# Multi-line magic, not supported.
|
||||
raise NothingChanged
|
||||
replacements += magic_replacements
|
||||
return transformed, replacements
|
||||
|
||||
|
||||
def get_token(src: str, magic: str) -> str:
|
||||
"""Return randomly generated token to mask IPython magic with.
|
||||
|
||||
For example, if 'magic' was `%matplotlib inline`, then a possible
|
||||
token to mask it with would be `"43fdd17f7e5ddc83"`. The token
|
||||
will be the same length as the magic, and we make sure that it was
|
||||
not already present anywhere else in the cell.
|
||||
"""
|
||||
assert magic
|
||||
nbytes = max(len(magic) // 2 - 1, 1)
|
||||
token = TOKEN_HEX(nbytes)
|
||||
counter = 0
|
||||
while token in src:
|
||||
token = TOKEN_HEX(nbytes)
|
||||
counter += 1
|
||||
if counter > 100:
|
||||
raise AssertionError(
|
||||
"INTERNAL ERROR: Black was not able to replace IPython magic. "
|
||||
"Please report a bug on https://github.com/psf/black/issues. "
|
||||
f"The magic might be helpful: {magic}"
|
||||
) from None
|
||||
if len(token) + 2 < len(magic):
|
||||
token = f"{token}."
|
||||
return f'"{token}"'
|
||||
|
||||
|
||||
def replace_cell_magics(src: str) -> tuple[str, list[Replacement]]:
|
||||
"""Replace cell magic with token.
|
||||
|
||||
Note that 'src' will already have been processed by IPython's
|
||||
TransformerManager().transform_cell.
|
||||
|
||||
Example,
|
||||
|
||||
get_ipython().run_cell_magic('t', '-n1', 'ls =!ls\\n')
|
||||
|
||||
becomes
|
||||
|
||||
"a794."
|
||||
ls =!ls
|
||||
|
||||
The replacement, along with the transformed code, is returned.
|
||||
"""
|
||||
replacements: list[Replacement] = []
|
||||
|
||||
tree = ast.parse(src)
|
||||
|
||||
cell_magic_finder = CellMagicFinder()
|
||||
cell_magic_finder.visit(tree)
|
||||
if cell_magic_finder.cell_magic is None:
|
||||
return src, replacements
|
||||
header = cell_magic_finder.cell_magic.header
|
||||
mask = get_token(src, header)
|
||||
replacements.append(Replacement(mask=mask, src=header))
|
||||
return f"{mask}\n{cell_magic_finder.cell_magic.body}", replacements
|
||||
|
||||
|
||||
def replace_magics(src: str) -> tuple[str, list[Replacement]]:
|
||||
"""Replace magics within body of cell.
|
||||
|
||||
Note that 'src' will already have been processed by IPython's
|
||||
TransformerManager().transform_cell.
|
||||
|
||||
Example, this
|
||||
|
||||
get_ipython().run_line_magic('matplotlib', 'inline')
|
||||
'foo'
|
||||
|
||||
becomes
|
||||
|
||||
"5e67db56d490fd39"
|
||||
'foo'
|
||||
|
||||
The replacement, along with the transformed code, are returned.
|
||||
"""
|
||||
replacements = []
|
||||
magic_finder = MagicFinder()
|
||||
magic_finder.visit(ast.parse(src))
|
||||
new_srcs = []
|
||||
for i, line in enumerate(src.splitlines(), start=1):
|
||||
if i in magic_finder.magics:
|
||||
offsets_and_magics = magic_finder.magics[i]
|
||||
if len(offsets_and_magics) != 1: # pragma: nocover
|
||||
raise AssertionError(
|
||||
f"Expecting one magic per line, got: {offsets_and_magics}\n"
|
||||
"Please report a bug on https://github.com/psf/black/issues."
|
||||
)
|
||||
col_offset, magic = (
|
||||
offsets_and_magics[0].col_offset,
|
||||
offsets_and_magics[0].magic,
|
||||
)
|
||||
mask = get_token(src, magic)
|
||||
replacements.append(Replacement(mask=mask, src=magic))
|
||||
line = line[:col_offset] + mask
|
||||
new_srcs.append(line)
|
||||
return "\n".join(new_srcs), replacements
|
||||
|
||||
|
||||
def unmask_cell(src: str, replacements: list[Replacement]) -> str:
|
||||
"""Remove replacements from cell.
|
||||
|
||||
For example
|
||||
|
||||
"9b20"
|
||||
foo = bar
|
||||
|
||||
becomes
|
||||
|
||||
%%time
|
||||
foo = bar
|
||||
"""
|
||||
for replacement in replacements:
|
||||
src = src.replace(replacement.mask, replacement.src)
|
||||
return src
|
||||
|
||||
|
||||
def _get_code_start(src: str) -> str:
|
||||
"""Provides the first line where the code starts.
|
||||
|
||||
Iterates over lines of code until it finds the first line that doesn't
|
||||
contain only empty spaces and comments. It removes any empty spaces at the
|
||||
start of the line and returns it. If such line doesn't exist, it returns an
|
||||
empty string.
|
||||
"""
|
||||
for match in re.finditer(".+", src):
|
||||
line = match.group(0).lstrip()
|
||||
if line and not line.startswith("#"):
|
||||
return line
|
||||
return ""
|
||||
|
||||
|
||||
def _is_ipython_magic(node: ast.expr) -> TypeGuard[ast.Attribute]:
|
||||
"""Check if attribute is IPython magic.
|
||||
|
||||
Note that the source of the abstract syntax tree
|
||||
will already have been processed by IPython's
|
||||
TransformerManager().transform_cell.
|
||||
"""
|
||||
return (
|
||||
isinstance(node, ast.Attribute)
|
||||
and isinstance(node.value, ast.Call)
|
||||
and isinstance(node.value.func, ast.Name)
|
||||
and node.value.func.id == "get_ipython"
|
||||
)
|
||||
|
||||
|
||||
def _get_str_args(args: list[ast.expr]) -> list[str]:
|
||||
str_args = []
|
||||
for arg in args:
|
||||
assert isinstance(arg, ast.Constant) and isinstance(arg.value, str)
|
||||
str_args.append(arg.value)
|
||||
return str_args
|
||||
|
||||
|
||||
@dataclasses.dataclass(frozen=True)
|
||||
class CellMagic:
|
||||
name: str
|
||||
params: Optional[str]
|
||||
body: str
|
||||
|
||||
@property
|
||||
def header(self) -> str:
|
||||
if self.params:
|
||||
return f"%%{self.name} {self.params}"
|
||||
return f"%%{self.name}"
|
||||
|
||||
|
||||
# ast.NodeVisitor + dataclass = breakage under mypyc.
|
||||
class CellMagicFinder(ast.NodeVisitor):
|
||||
"""Find cell magics.
|
||||
|
||||
Note that the source of the abstract syntax tree
|
||||
will already have been processed by IPython's
|
||||
TransformerManager().transform_cell.
|
||||
|
||||
For example,
|
||||
|
||||
%%time\n
|
||||
foo()
|
||||
|
||||
would have been transformed to
|
||||
|
||||
get_ipython().run_cell_magic('time', '', 'foo()\\n')
|
||||
|
||||
and we look for instances of the latter.
|
||||
"""
|
||||
|
||||
def __init__(self, cell_magic: Optional[CellMagic] = None) -> None:
|
||||
self.cell_magic = cell_magic
|
||||
|
||||
def visit_Expr(self, node: ast.Expr) -> None:
|
||||
"""Find cell magic, extract header and body."""
|
||||
if (
|
||||
isinstance(node.value, ast.Call)
|
||||
and _is_ipython_magic(node.value.func)
|
||||
and node.value.func.attr == "run_cell_magic"
|
||||
):
|
||||
args = _get_str_args(node.value.args)
|
||||
self.cell_magic = CellMagic(name=args[0], params=args[1], body=args[2])
|
||||
self.generic_visit(node)
|
||||
|
||||
|
||||
@dataclasses.dataclass(frozen=True)
|
||||
class OffsetAndMagic:
|
||||
col_offset: int
|
||||
magic: str
|
||||
|
||||
|
||||
# Unsurprisingly, subclassing ast.NodeVisitor means we can't use dataclasses here
|
||||
# as mypyc will generate broken code.
|
||||
class MagicFinder(ast.NodeVisitor):
|
||||
"""Visit cell to look for get_ipython calls.
|
||||
|
||||
Note that the source of the abstract syntax tree
|
||||
will already have been processed by IPython's
|
||||
TransformerManager().transform_cell.
|
||||
|
||||
For example,
|
||||
|
||||
%matplotlib inline
|
||||
|
||||
would have been transformed to
|
||||
|
||||
get_ipython().run_line_magic('matplotlib', 'inline')
|
||||
|
||||
and we look for instances of the latter (and likewise for other
|
||||
types of magics).
|
||||
"""
|
||||
|
||||
def __init__(self) -> None:
|
||||
self.magics: dict[int, list[OffsetAndMagic]] = collections.defaultdict(list)
|
||||
|
||||
def visit_Assign(self, node: ast.Assign) -> None:
|
||||
"""Look for system assign magics.
|
||||
|
||||
For example,
|
||||
|
||||
black_version = !black --version
|
||||
env = %env var
|
||||
|
||||
would have been (respectively) transformed to
|
||||
|
||||
black_version = get_ipython().getoutput('black --version')
|
||||
env = get_ipython().run_line_magic('env', 'var')
|
||||
|
||||
and we look for instances of any of the latter.
|
||||
"""
|
||||
if isinstance(node.value, ast.Call) and _is_ipython_magic(node.value.func):
|
||||
args = _get_str_args(node.value.args)
|
||||
if node.value.func.attr == "getoutput":
|
||||
src = f"!{args[0]}"
|
||||
elif node.value.func.attr == "run_line_magic":
|
||||
src = f"%{args[0]}"
|
||||
if args[1]:
|
||||
src += f" {args[1]}"
|
||||
else:
|
||||
raise AssertionError(
|
||||
f"Unexpected IPython magic {node.value.func.attr!r} found. "
|
||||
"Please report a bug on https://github.com/psf/black/issues."
|
||||
) from None
|
||||
self.magics[node.value.lineno].append(
|
||||
OffsetAndMagic(node.value.col_offset, src)
|
||||
)
|
||||
self.generic_visit(node)
|
||||
|
||||
def visit_Expr(self, node: ast.Expr) -> None:
|
||||
"""Look for magics in body of cell.
|
||||
|
||||
For examples,
|
||||
|
||||
!ls
|
||||
!!ls
|
||||
?ls
|
||||
??ls
|
||||
|
||||
would (respectively) get transformed to
|
||||
|
||||
get_ipython().system('ls')
|
||||
get_ipython().getoutput('ls')
|
||||
get_ipython().run_line_magic('pinfo', 'ls')
|
||||
get_ipython().run_line_magic('pinfo2', 'ls')
|
||||
|
||||
and we look for instances of any of the latter.
|
||||
"""
|
||||
if isinstance(node.value, ast.Call) and _is_ipython_magic(node.value.func):
|
||||
args = _get_str_args(node.value.args)
|
||||
if node.value.func.attr == "run_line_magic":
|
||||
if args[0] == "pinfo":
|
||||
src = f"?{args[1]}"
|
||||
elif args[0] == "pinfo2":
|
||||
src = f"??{args[1]}"
|
||||
else:
|
||||
src = f"%{args[0]}"
|
||||
if args[1]:
|
||||
src += f" {args[1]}"
|
||||
elif node.value.func.attr == "system":
|
||||
src = f"!{args[0]}"
|
||||
elif node.value.func.attr == "getoutput":
|
||||
src = f"!!{args[0]}"
|
||||
else:
|
||||
raise NothingChanged # unsupported magic.
|
||||
self.magics[node.value.lineno].append(
|
||||
OffsetAndMagic(node.value.col_offset, src)
|
||||
)
|
||||
self.generic_visit(node)
|
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user