Initial commit: Robot ökoszisztéma v2.0 - Stabilizált jármű és szerviz robotok
This commit is contained in:
1
code-server-config/.cache/Microsoft/DeveloperTools/deviceid
Executable file
1
code-server-config/.cache/Microsoft/DeveloperTools/deviceid
Executable file
@@ -0,0 +1 @@
|
||||
b5dbfcec-d709-4c74-ab40-0013b288137b
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,72 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: typing_extensions
|
||||
Version: 4.15.0
|
||||
Summary: Backported and Experimental Type Hints for Python 3.9+
|
||||
Keywords: annotations,backport,checker,checking,function,hinting,hints,type,typechecking,typehinting,typehints,typing
|
||||
Author-email: "Guido van Rossum, Jukka Lehtosalo, Łukasz Langa, Michael Lee" <levkivskyi@gmail.com>
|
||||
Requires-Python: >=3.9
|
||||
Description-Content-Type: text/markdown
|
||||
License-Expression: PSF-2.0
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Environment :: Console
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3 :: Only
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Programming Language :: Python :: 3.14
|
||||
Classifier: Topic :: Software Development
|
||||
License-File: LICENSE
|
||||
Project-URL: Bug Tracker, https://github.com/python/typing_extensions/issues
|
||||
Project-URL: Changes, https://github.com/python/typing_extensions/blob/main/CHANGELOG.md
|
||||
Project-URL: Documentation, https://typing-extensions.readthedocs.io/
|
||||
Project-URL: Home, https://github.com/python/typing_extensions
|
||||
Project-URL: Q & A, https://github.com/python/typing/discussions
|
||||
Project-URL: Repository, https://github.com/python/typing_extensions
|
||||
|
||||
# Typing Extensions
|
||||
|
||||
[](https://gitter.im/python/typing)
|
||||
|
||||
[Documentation](https://typing-extensions.readthedocs.io/en/latest/#) –
|
||||
[PyPI](https://pypi.org/project/typing-extensions/)
|
||||
|
||||
## Overview
|
||||
|
||||
The `typing_extensions` module serves two related purposes:
|
||||
|
||||
- Enable use of new type system features on older Python versions. For example,
|
||||
`typing.TypeGuard` is new in Python 3.10, but `typing_extensions` allows
|
||||
users on previous Python versions to use it too.
|
||||
- Enable experimentation with new type system PEPs before they are accepted and
|
||||
added to the `typing` module.
|
||||
|
||||
`typing_extensions` is treated specially by static type checkers such as
|
||||
mypy and pyright. Objects defined in `typing_extensions` are treated the same
|
||||
way as equivalent forms in `typing`.
|
||||
|
||||
`typing_extensions` uses
|
||||
[Semantic Versioning](https://semver.org/). The
|
||||
major version will be incremented only for backwards-incompatible changes.
|
||||
Therefore, it's safe to depend
|
||||
on `typing_extensions` like this: `typing_extensions ~=x.y`,
|
||||
where `x.y` is the first version that includes all features you need.
|
||||
[This](https://packaging.python.org/en/latest/specifications/version-specifiers/#compatible-release)
|
||||
is equivalent to `typing_extensions >=x.y, <(x+1)`. Do not depend on `~= x.y.z`
|
||||
unless you really know what you're doing; that defeats the purpose of
|
||||
semantic versioning.
|
||||
|
||||
## Included items
|
||||
|
||||
See [the documentation](https://typing-extensions.readthedocs.io/en/latest/#) for a
|
||||
complete listing of module contents.
|
||||
|
||||
## Contributing
|
||||
|
||||
See [CONTRIBUTING.md](https://github.com/python/typing_extensions/blob/main/CONTRIBUTING.md)
|
||||
for how to contribute to `typing_extensions`.
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,243 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: SQLAlchemy
|
||||
Version: 2.0.45
|
||||
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: 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 :: 3.13
|
||||
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: importlib-metadata; python_version < "3.8"
|
||||
Requires-Dist: greenlet>=1; 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: typing-extensions>=4.6.0
|
||||
Provides-Extra: asyncio
|
||||
Requires-Dist: greenlet>=1; extra == "asyncio"
|
||||
Provides-Extra: mypy
|
||||
Requires-Dist: mypy>=0.910; extra == "mypy"
|
||||
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: mysql
|
||||
Requires-Dist: mysqlclient>=1.4.0; extra == "mysql"
|
||||
Provides-Extra: mysql-connector
|
||||
Requires-Dist: mysql-connector-python; extra == "mysql-connector"
|
||||
Provides-Extra: mariadb-connector
|
||||
Requires-Dist: mariadb!=1.1.10,!=1.1.2,!=1.1.5,>=1.0.1; extra == "mariadb-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-pg8000
|
||||
Requires-Dist: pg8000>=1.29.1; extra == "postgresql-pg8000"
|
||||
Provides-Extra: postgresql-asyncpg
|
||||
Requires-Dist: greenlet>=1; extra == "postgresql-asyncpg"
|
||||
Requires-Dist: asyncpg; extra == "postgresql-asyncpg"
|
||||
Provides-Extra: postgresql-psycopg2binary
|
||||
Requires-Dist: psycopg2-binary; extra == "postgresql-psycopg2binary"
|
||||
Provides-Extra: postgresql-psycopg2cffi
|
||||
Requires-Dist: psycopg2cffi; extra == "postgresql-psycopg2cffi"
|
||||
Provides-Extra: postgresql-psycopg
|
||||
Requires-Dist: psycopg>=3.0.7; extra == "postgresql-psycopg"
|
||||
Provides-Extra: postgresql-psycopgbinary
|
||||
Requires-Dist: psycopg[binary]>=3.0.7; extra == "postgresql-psycopgbinary"
|
||||
Provides-Extra: pymysql
|
||||
Requires-Dist: pymysql; extra == "pymysql"
|
||||
Provides-Extra: aiomysql
|
||||
Requires-Dist: greenlet>=1; extra == "aiomysql"
|
||||
Requires-Dist: aiomysql>=0.2.0; extra == "aiomysql"
|
||||
Provides-Extra: aioodbc
|
||||
Requires-Dist: greenlet>=1; extra == "aioodbc"
|
||||
Requires-Dist: aioodbc; extra == "aioodbc"
|
||||
Provides-Extra: asyncmy
|
||||
Requires-Dist: greenlet>=1; extra == "asyncmy"
|
||||
Requires-Dist: asyncmy!=0.2.4,!=0.2.6,>=0.2.3; extra == "asyncmy"
|
||||
Provides-Extra: aiosqlite
|
||||
Requires-Dist: greenlet>=1; extra == "aiosqlite"
|
||||
Requires-Dist: aiosqlite; extra == "aiosqlite"
|
||||
Requires-Dist: typing_extensions!=3.10.0.1; extra == "aiosqlite"
|
||||
Provides-Extra: sqlcipher
|
||||
Requires-Dist: sqlcipher3_binary; extra == "sqlcipher"
|
||||
Dynamic: license-file
|
||||
|
||||
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>`_.
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,96 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: anyio
|
||||
Version: 4.12.1
|
||||
Summary: High-level concurrency and networking framework on top of asyncio or Trio
|
||||
Author-email: Alex Grönholm <alex.gronholm@nextday.fi>
|
||||
License-Expression: 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: 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
|
||||
Classifier: Programming Language :: Python :: 3.14
|
||||
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: typing_extensions>=4.5; python_version < "3.13"
|
||||
Provides-Extra: trio
|
||||
Requires-Dist: trio>=0.32.0; python_version >= "3.10" and extra == "trio"
|
||||
Requires-Dist: trio>=0.31.0; python_version < "3.10" and extra == "trio"
|
||||
Dynamic: license-file
|
||||
|
||||
.. 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.
|
||||
|
||||
To find out why you might want to use AnyIO's APIs instead of asyncio's, you can read about it
|
||||
`here <https://anyio.readthedocs.io/en/stable/why.html>`_.
|
||||
|
||||
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
|
||||
* Subinterpreter support for code parallelization (on Python 3.13 and later)
|
||||
* Asynchronous file I/O (using worker threads)
|
||||
* Signal handling
|
||||
* Asynchronous version of the functools_ module
|
||||
|
||||
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/
|
||||
.. _functools: https://docs.python.org/3/library/functools.html
|
||||
.. _Hypothesis: https://hypothesis.works/
|
||||
Binary file not shown.
@@ -0,0 +1,78 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: certifi
|
||||
Version: 2026.1.4
|
||||
Summary: Python package for providing Mozilla's CA Bundle.
|
||||
Home-page: https://github.com/certifi/python-certifi
|
||||
Author: Kenneth Reitz
|
||||
Author-email: me@kennethreitz.com
|
||||
License: MPL-2.0
|
||||
Project-URL: Source, https://github.com/certifi/python-certifi
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)
|
||||
Classifier: Natural Language :: English
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3 :: Only
|
||||
Classifier: Programming Language :: Python :: 3.7
|
||||
Classifier: Programming Language :: Python :: 3.8
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Programming Language :: Python :: 3.14
|
||||
Requires-Python: >=3.7
|
||||
License-File: LICENSE
|
||||
Dynamic: author
|
||||
Dynamic: author-email
|
||||
Dynamic: classifier
|
||||
Dynamic: description
|
||||
Dynamic: home-page
|
||||
Dynamic: license
|
||||
Dynamic: license-file
|
||||
Dynamic: project-url
|
||||
Dynamic: requires-python
|
||||
Dynamic: summary
|
||||
|
||||
Certifi: Python SSL Certificates
|
||||
================================
|
||||
|
||||
Certifi provides Mozilla's carefully curated collection of Root Certificates for
|
||||
validating the trustworthiness of SSL certificates while verifying the identity
|
||||
of TLS hosts. It has been extracted from the `Requests`_ project.
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
``certifi`` is available on PyPI. Simply install it with ``pip``::
|
||||
|
||||
$ pip install certifi
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
To reference the installed certificate authority (CA) bundle, you can use the
|
||||
built-in function::
|
||||
|
||||
>>> import certifi
|
||||
|
||||
>>> certifi.where()
|
||||
'/usr/local/lib/python3.7/site-packages/certifi/cacert.pem'
|
||||
|
||||
Or from the command line::
|
||||
|
||||
$ python -m certifi
|
||||
/usr/local/lib/python3.7/site-packages/certifi/cacert.pem
|
||||
|
||||
Enjoy!
|
||||
|
||||
.. _`Requests`: https://requests.readthedocs.io/en/master/
|
||||
|
||||
Addition/Removal of Certificates
|
||||
--------------------------------
|
||||
|
||||
Certifi does not support any addition/removal or other modification of the
|
||||
CA trust store content. This project is intended to provide a reliable and
|
||||
highly portable root of trust to python deployments. Look to upstream projects
|
||||
for methods to use alternate trust.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,202 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: h11
|
||||
Version: 0.16.0
|
||||
Summary: A pure-Python, bring-your-own-I/O implementation of HTTP/1.1
|
||||
Home-page: https://github.com/python-hyper/h11
|
||||
Author: Nathaniel J. Smith
|
||||
Author-email: njs@pobox.com
|
||||
License: MIT
|
||||
Classifier: Development Status :: 3 - Alpha
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: MIT License
|
||||
Classifier: Programming Language :: Python :: Implementation :: CPython
|
||||
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3 :: Only
|
||||
Classifier: Programming Language :: Python :: 3.8
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Topic :: Internet :: WWW/HTTP
|
||||
Classifier: Topic :: System :: Networking
|
||||
Requires-Python: >=3.8
|
||||
License-File: LICENSE.txt
|
||||
Dynamic: author
|
||||
Dynamic: author-email
|
||||
Dynamic: classifier
|
||||
Dynamic: description
|
||||
Dynamic: home-page
|
||||
Dynamic: license
|
||||
Dynamic: license-file
|
||||
Dynamic: requires-python
|
||||
Dynamic: summary
|
||||
|
||||
h11
|
||||
===
|
||||
|
||||
.. image:: https://travis-ci.org/python-hyper/h11.svg?branch=master
|
||||
:target: https://travis-ci.org/python-hyper/h11
|
||||
:alt: Automated test status
|
||||
|
||||
.. image:: https://codecov.io/gh/python-hyper/h11/branch/master/graph/badge.svg
|
||||
:target: https://codecov.io/gh/python-hyper/h11
|
||||
:alt: Test coverage
|
||||
|
||||
.. image:: https://readthedocs.org/projects/h11/badge/?version=latest
|
||||
:target: http://h11.readthedocs.io/en/latest/?badge=latest
|
||||
:alt: Documentation Status
|
||||
|
||||
This is a little HTTP/1.1 library written from scratch in Python,
|
||||
heavily inspired by `hyper-h2 <https://hyper-h2.readthedocs.io/>`_.
|
||||
|
||||
It's a "bring-your-own-I/O" library; h11 contains no IO code
|
||||
whatsoever. This means you can hook h11 up to your favorite network
|
||||
API, and that could be anything you want: synchronous, threaded,
|
||||
asynchronous, or your own implementation of `RFC 6214
|
||||
<https://tools.ietf.org/html/rfc6214>`_ -- h11 won't judge you.
|
||||
(Compare this to the current state of the art, where every time a `new
|
||||
network API <https://trio.readthedocs.io/>`_ comes along then someone
|
||||
gets to start over reimplementing the entire HTTP protocol from
|
||||
scratch.) Cory Benfield made an `excellent blog post describing the
|
||||
benefits of this approach
|
||||
<https://lukasa.co.uk/2015/10/The_New_Hyper/>`_, or if you like video
|
||||
then here's his `PyCon 2016 talk on the same theme
|
||||
<https://www.youtube.com/watch?v=7cC3_jGwl_U>`_.
|
||||
|
||||
This also means that h11 is not immediately useful out of the box:
|
||||
it's a toolkit for building programs that speak HTTP, not something
|
||||
that could directly replace ``requests`` or ``twisted.web`` or
|
||||
whatever. But h11 makes it much easier to implement something like
|
||||
``requests`` or ``twisted.web``.
|
||||
|
||||
At a high level, working with h11 goes like this:
|
||||
|
||||
1) First, create an ``h11.Connection`` object to track the state of a
|
||||
single HTTP/1.1 connection.
|
||||
|
||||
2) When you read data off the network, pass it to
|
||||
``conn.receive_data(...)``; you'll get back a list of objects
|
||||
representing high-level HTTP "events".
|
||||
|
||||
3) When you want to send a high-level HTTP event, create the
|
||||
corresponding "event" object and pass it to ``conn.send(...)``;
|
||||
this will give you back some bytes that you can then push out
|
||||
through the network.
|
||||
|
||||
For example, a client might instantiate and then send a
|
||||
``h11.Request`` object, then zero or more ``h11.Data`` objects for the
|
||||
request body (e.g., if this is a POST), and then a
|
||||
``h11.EndOfMessage`` to indicate the end of the message. Then the
|
||||
server would then send back a ``h11.Response``, some ``h11.Data``, and
|
||||
its own ``h11.EndOfMessage``. If either side violates the protocol,
|
||||
you'll get a ``h11.ProtocolError`` exception.
|
||||
|
||||
h11 is suitable for implementing both servers and clients, and has a
|
||||
pleasantly symmetric API: the events you send as a client are exactly
|
||||
the ones that you receive as a server and vice-versa.
|
||||
|
||||
`Here's an example of a tiny HTTP client
|
||||
<https://github.com/python-hyper/h11/blob/master/examples/basic-client.py>`_
|
||||
|
||||
It also has `a fine manual <https://h11.readthedocs.io/>`_.
|
||||
|
||||
FAQ
|
||||
---
|
||||
|
||||
*Whyyyyy?*
|
||||
|
||||
I wanted to play with HTTP in `Curio
|
||||
<https://curio.readthedocs.io/en/latest/tutorial.html>`__ and `Trio
|
||||
<https://trio.readthedocs.io>`__, which at the time didn't have any
|
||||
HTTP libraries. So I thought, no big deal, Python has, like, a dozen
|
||||
different implementations of HTTP, surely I can find one that's
|
||||
reusable. I didn't find one, but I did find Cory's call-to-arms
|
||||
blog-post. So I figured, well, fine, if I have to implement HTTP from
|
||||
scratch, at least I can make sure no-one *else* has to ever again.
|
||||
|
||||
*Should I use it?*
|
||||
|
||||
Maybe. You should be aware that it's a very young project. But, it's
|
||||
feature complete and has an exhaustive test-suite and complete docs,
|
||||
so the next step is for people to try using it and see how it goes
|
||||
:-). If you do then please let us know -- if nothing else we'll want
|
||||
to talk to you before making any incompatible changes!
|
||||
|
||||
*What are the features/limitations?*
|
||||
|
||||
Roughly speaking, it's trying to be a robust, complete, and non-hacky
|
||||
implementation of the first "chapter" of the HTTP/1.1 spec: `RFC 7230:
|
||||
HTTP/1.1 Message Syntax and Routing
|
||||
<https://tools.ietf.org/html/rfc7230>`_. That is, it mostly focuses on
|
||||
implementing HTTP at the level of taking bytes on and off the wire,
|
||||
and the headers related to that, and tries to be anal about spec
|
||||
conformance. It doesn't know about higher-level concerns like URL
|
||||
routing, conditional GETs, cross-origin cookie policies, or content
|
||||
negotiation. But it does know how to take care of framing,
|
||||
cross-version differences in keep-alive handling, and the "obsolete
|
||||
line folding" rule, so you can focus your energies on the hard /
|
||||
interesting parts for your application, and it tries to support the
|
||||
full specification in the sense that any useful HTTP/1.1 conformant
|
||||
application should be able to use h11.
|
||||
|
||||
It's pure Python, and has no dependencies outside of the standard
|
||||
library.
|
||||
|
||||
It has a test suite with 100.0% coverage for both statements and
|
||||
branches.
|
||||
|
||||
Currently it supports Python 3 (testing on 3.8-3.12) and PyPy 3.
|
||||
The last Python 2-compatible version was h11 0.11.x.
|
||||
(Originally it had a Cython wrapper for `http-parser
|
||||
<https://github.com/nodejs/http-parser>`_ and a beautiful nested state
|
||||
machine implemented with ``yield from`` to postprocess the output. But
|
||||
I had to take these out -- the new *parser* needs fewer lines-of-code
|
||||
than the old *parser wrapper*, is written in pure Python, uses no
|
||||
exotic language syntax, and has more features. It's sad, really; that
|
||||
old state machine was really slick. I just need a few sentences here
|
||||
to mourn that.)
|
||||
|
||||
I don't know how fast it is. I haven't benchmarked or profiled it yet,
|
||||
so it's probably got a few pointless hot spots, and I've been trying
|
||||
to err on the side of simplicity and robustness instead of
|
||||
micro-optimization. But at the architectural level I tried hard to
|
||||
avoid fundamentally bad decisions, e.g., I believe that all the
|
||||
parsing algorithms remain linear-time even in the face of pathological
|
||||
input like slowloris, and there are no byte-by-byte loops. (I also
|
||||
believe that it maintains bounded memory usage in the face of
|
||||
arbitrary/pathological input.)
|
||||
|
||||
The whole library is ~800 lines-of-code. You can read and understand
|
||||
the whole thing in less than an hour. Most of the energy invested in
|
||||
this so far has been spent on trying to keep things simple by
|
||||
minimizing special-cases and ad hoc state manipulation; even though it
|
||||
is now quite small and simple, I'm still annoyed that I haven't
|
||||
figured out how to make it even smaller and simpler. (Unfortunately,
|
||||
HTTP does not lend itself to simplicity.)
|
||||
|
||||
The API is ~feature complete and I don't expect the general outlines
|
||||
to change much, but you can't judge an API's ergonomics until you
|
||||
actually document and use it, so I'd expect some changes in the
|
||||
details.
|
||||
|
||||
*How do I try it?*
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
$ pip install h11
|
||||
$ git clone git@github.com:python-hyper/h11
|
||||
$ cd h11/examples
|
||||
$ python basic-client.py
|
||||
|
||||
and go from there.
|
||||
|
||||
*License?*
|
||||
|
||||
MIT
|
||||
|
||||
*Code of conduct?*
|
||||
|
||||
Contributors are requested to follow our `code of conduct
|
||||
<https://github.com/python-hyper/h11/blob/master/CODE_OF_CONDUCT.md>`_ in
|
||||
all project spaces.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,625 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: httpcore
|
||||
Version: 1.0.9
|
||||
Summary: A minimal low-level HTTP client.
|
||||
Project-URL: Documentation, https://www.encode.io/httpcore
|
||||
Project-URL: Homepage, https://www.encode.io/httpcore/
|
||||
Project-URL: Source, https://github.com/encode/httpcore
|
||||
Author-email: Tom Christie <tom@tomchristie.com>
|
||||
License-Expression: BSD-3-Clause
|
||||
License-File: LICENSE.md
|
||||
Classifier: Development Status :: 3 - Alpha
|
||||
Classifier: Environment :: Web Environment
|
||||
Classifier: Framework :: AsyncIO
|
||||
Classifier: Framework :: Trio
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: BSD License
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3 :: Only
|
||||
Classifier: Programming Language :: Python :: 3.8
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Topic :: Internet :: WWW/HTTP
|
||||
Requires-Python: >=3.8
|
||||
Requires-Dist: certifi
|
||||
Requires-Dist: h11>=0.16
|
||||
Provides-Extra: asyncio
|
||||
Requires-Dist: anyio<5.0,>=4.0; extra == 'asyncio'
|
||||
Provides-Extra: http2
|
||||
Requires-Dist: h2<5,>=3; extra == 'http2'
|
||||
Provides-Extra: socks
|
||||
Requires-Dist: socksio==1.*; extra == 'socks'
|
||||
Provides-Extra: trio
|
||||
Requires-Dist: trio<1.0,>=0.22.0; extra == 'trio'
|
||||
Description-Content-Type: text/markdown
|
||||
|
||||
# HTTP Core
|
||||
|
||||
[](https://github.com/encode/httpcore/actions)
|
||||
[](https://pypi.org/project/httpcore/)
|
||||
|
||||
> *Do one thing, and do it well.*
|
||||
|
||||
The HTTP Core package provides a minimal low-level HTTP client, which does
|
||||
one thing only. Sending HTTP requests.
|
||||
|
||||
It does not provide any high level model abstractions over the API,
|
||||
does not handle redirects, multipart uploads, building authentication headers,
|
||||
transparent HTTP caching, URL parsing, session cookie handling,
|
||||
content or charset decoding, handling JSON, environment based configuration
|
||||
defaults, or any of that Jazz.
|
||||
|
||||
Some things HTTP Core does do:
|
||||
|
||||
* Sending HTTP requests.
|
||||
* Thread-safe / task-safe connection pooling.
|
||||
* HTTP(S) proxy & SOCKS proxy support.
|
||||
* Supports HTTP/1.1 and HTTP/2.
|
||||
* Provides both sync and async interfaces.
|
||||
* Async backend support for `asyncio` and `trio`.
|
||||
|
||||
## Requirements
|
||||
|
||||
Python 3.8+
|
||||
|
||||
## Installation
|
||||
|
||||
For HTTP/1.1 only support, install with:
|
||||
|
||||
```shell
|
||||
$ pip install httpcore
|
||||
```
|
||||
|
||||
There are also a number of optional extras available...
|
||||
|
||||
```shell
|
||||
$ pip install httpcore['asyncio,trio,http2,socks']
|
||||
```
|
||||
|
||||
## Sending requests
|
||||
|
||||
Send an HTTP request:
|
||||
|
||||
```python
|
||||
import httpcore
|
||||
|
||||
response = httpcore.request("GET", "https://www.example.com/")
|
||||
|
||||
print(response)
|
||||
# <Response [200]>
|
||||
print(response.status)
|
||||
# 200
|
||||
print(response.headers)
|
||||
# [(b'Accept-Ranges', b'bytes'), (b'Age', b'557328'), (b'Cache-Control', b'max-age=604800'), ...]
|
||||
print(response.content)
|
||||
# b'<!doctype html>\n<html>\n<head>\n<title>Example Domain</title>\n\n<meta charset="utf-8"/>\n ...'
|
||||
```
|
||||
|
||||
The top-level `httpcore.request()` function is provided for convenience. In practice whenever you're working with `httpcore` you'll want to use the connection pooling functionality that it provides.
|
||||
|
||||
```python
|
||||
import httpcore
|
||||
|
||||
http = httpcore.ConnectionPool()
|
||||
response = http.request("GET", "https://www.example.com/")
|
||||
```
|
||||
|
||||
Once you're ready to get going, [head over to the documentation](https://www.encode.io/httpcore/).
|
||||
|
||||
## Motivation
|
||||
|
||||
You *probably* don't want to be using HTTP Core directly. It might make sense if
|
||||
you're writing something like a proxy service in Python, and you just want
|
||||
something at the lowest possible level, but more typically you'll want to use
|
||||
a higher level client library, such as `httpx`.
|
||||
|
||||
The motivation for `httpcore` is:
|
||||
|
||||
* To provide a reusable low-level client library, that other packages can then build on top of.
|
||||
* To provide a *really clear interface split* between the networking code and client logic,
|
||||
so that each is easier to understand and reason about in isolation.
|
||||
|
||||
## Dependencies
|
||||
|
||||
The `httpcore` package has the following dependencies...
|
||||
|
||||
* `h11`
|
||||
* `certifi`
|
||||
|
||||
And the following optional extras...
|
||||
|
||||
* `anyio` - Required by `pip install httpcore['asyncio']`.
|
||||
* `trio` - Required by `pip install httpcore['trio']`.
|
||||
* `h2` - Required by `pip install httpcore['http2']`.
|
||||
* `socksio` - Required by `pip install httpcore['socks']`.
|
||||
|
||||
## Versioning
|
||||
|
||||
We use [SEMVER for our versioning policy](https://semver.org/).
|
||||
|
||||
For changes between package versions please see our [project changelog](CHANGELOG.md).
|
||||
|
||||
We recommend pinning your requirements either the most current major version, or a more specific version range:
|
||||
|
||||
```python
|
||||
pip install 'httpcore==1.*'
|
||||
```
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||
|
||||
## Version 1.0.9 (April 24th, 2025)
|
||||
|
||||
- Resolve https://github.com/advisories/GHSA-vqfr-h8mv-ghfj with h11 dependency update. (#1008)
|
||||
|
||||
## Version 1.0.8 (April 11th, 2025)
|
||||
|
||||
- Fix `AttributeError` when importing on Python 3.14. (#1005)
|
||||
|
||||
## Version 1.0.7 (November 15th, 2024)
|
||||
|
||||
- Support `proxy=…` configuration on `ConnectionPool()`. (#974)
|
||||
|
||||
## Version 1.0.6 (October 1st, 2024)
|
||||
|
||||
- Relax `trio` dependency pinning. (#956)
|
||||
- Handle `trio` raising `NotImplementedError` on unsupported platforms. (#955)
|
||||
- Handle mapping `ssl.SSLError` to `httpcore.ConnectError`. (#918)
|
||||
|
||||
## 1.0.5 (March 27th, 2024)
|
||||
|
||||
- Handle `EndOfStream` exception for anyio backend. (#899)
|
||||
- Allow trio `0.25.*` series in package dependancies. (#903)
|
||||
|
||||
## 1.0.4 (February 21st, 2024)
|
||||
|
||||
- Add `target` request extension. (#888)
|
||||
- Fix support for connection `Upgrade` and `CONNECT` when some data in the stream has been read. (#882)
|
||||
|
||||
## 1.0.3 (February 13th, 2024)
|
||||
|
||||
- Fix support for async cancellations. (#880)
|
||||
- Fix trace extension when used with socks proxy. (#849)
|
||||
- Fix SSL context for connections using the "wss" scheme (#869)
|
||||
|
||||
## 1.0.2 (November 10th, 2023)
|
||||
|
||||
- Fix `float("inf")` timeouts in `Event.wait` function. (#846)
|
||||
|
||||
## 1.0.1 (November 3rd, 2023)
|
||||
|
||||
- Fix pool timeout to account for the total time spent retrying. (#823)
|
||||
- Raise a neater RuntimeError when the correct async deps are not installed. (#826)
|
||||
- Add support for synchronous TLS-in-TLS streams. (#840)
|
||||
|
||||
## 1.0.0 (October 6th, 2023)
|
||||
|
||||
From version 1.0 our async support is now optional, as the package has minimal dependencies by default.
|
||||
|
||||
For async support use either `pip install 'httpcore[asyncio]'` or `pip install 'httpcore[trio]'`.
|
||||
|
||||
The project versioning policy is now explicitly governed by SEMVER. See https://semver.org/.
|
||||
|
||||
- Async support becomes fully optional. (#809)
|
||||
- Add support for Python 3.12. (#807)
|
||||
|
||||
## 0.18.0 (September 8th, 2023)
|
||||
|
||||
- Add support for HTTPS proxies. (#745, #786)
|
||||
- Drop Python 3.7 support. (#727)
|
||||
- Handle `sni_hostname` extension with SOCKS proxy. (#774)
|
||||
- Handle HTTP/1.1 half-closed connections gracefully. (#641)
|
||||
- Change the type of `Extensions` from `Mapping[Str, Any]` to `MutableMapping[Str, Any]`. (#762)
|
||||
|
||||
## 0.17.3 (July 5th, 2023)
|
||||
|
||||
- Support async cancellations, ensuring that the connection pool is left in a clean state when cancellations occur. (#726)
|
||||
- The networking backend interface has [been added to the public API](https://www.encode.io/httpcore/network-backends). Some classes which were previously private implementation detail are now part of the top-level public API. (#699)
|
||||
- Graceful handling of HTTP/2 GoAway frames, with requests being transparently retried on a new connection. (#730)
|
||||
- Add exceptions when a synchronous `trace callback` is passed to an asynchronous request or an asynchronous `trace callback` is passed to a synchronous request. (#717)
|
||||
- Drop Python 3.7 support. (#727)
|
||||
|
||||
## 0.17.2 (May 23th, 2023)
|
||||
|
||||
- Add `socket_options` argument to `ConnectionPool` and `HTTProxy` classes. (#668)
|
||||
- Improve logging with per-module logger names. (#690)
|
||||
- Add `sni_hostname` request extension. (#696)
|
||||
- Resolve race condition during import of `anyio` package. (#692)
|
||||
- Enable TCP_NODELAY for all synchronous sockets. (#651)
|
||||
|
||||
## 0.17.1 (May 17th, 2023)
|
||||
|
||||
- If 'retries' is set, then allow retries if an SSL handshake error occurs. (#669)
|
||||
- Improve correctness of tracebacks on network exceptions, by raising properly chained exceptions. (#678)
|
||||
- Prevent connection-hanging behaviour when HTTP/2 connections are closed by a server-sent 'GoAway' frame. (#679)
|
||||
- Fix edge-case exception when removing requests from the connection pool. (#680)
|
||||
- Fix pool timeout edge-case. (#688)
|
||||
|
||||
## 0.17.0 (March 16th, 2023)
|
||||
|
||||
- Add DEBUG level logging. (#648)
|
||||
- Respect HTTP/2 max concurrent streams when settings updates are sent by server. (#652)
|
||||
- Increase the allowable HTTP header size to 100kB. (#647)
|
||||
- Add `retries` option to SOCKS proxy classes. (#643)
|
||||
|
||||
## 0.16.3 (December 20th, 2022)
|
||||
|
||||
- Allow `ws` and `wss` schemes. Allows us to properly support websocket upgrade connections. (#625)
|
||||
- Forwarding HTTP proxies use a connection-per-remote-host. Required by some proxy implementations. (#637)
|
||||
- Don't raise `RuntimeError` when closing a connection pool with active connections. Removes some error cases when cancellations are used. (#631)
|
||||
- Lazy import `anyio`, so that it's no longer a hard dependancy, and isn't imported if unused. (#639)
|
||||
|
||||
## 0.16.2 (November 25th, 2022)
|
||||
|
||||
- Revert 'Fix async cancellation behaviour', which introduced race conditions. (#627)
|
||||
- Raise `RuntimeError` if attempting to us UNIX domain sockets on Windows. (#619)
|
||||
|
||||
## 0.16.1 (November 17th, 2022)
|
||||
|
||||
- Fix HTTP/1.1 interim informational responses, such as "100 Continue". (#605)
|
||||
|
||||
## 0.16.0 (October 11th, 2022)
|
||||
|
||||
- Support HTTP/1.1 informational responses. (#581)
|
||||
- Fix async cancellation behaviour. (#580)
|
||||
- Support `h11` 0.14. (#579)
|
||||
|
||||
## 0.15.0 (May 17th, 2022)
|
||||
|
||||
- Drop Python 3.6 support (#535)
|
||||
- Ensure HTTP proxy CONNECT requests include `timeout` configuration. (#506)
|
||||
- Switch to explicit `typing.Optional` for type hints. (#513)
|
||||
- For `trio` map OSError exceptions to `ConnectError`. (#543)
|
||||
|
||||
## 0.14.7 (February 4th, 2022)
|
||||
|
||||
- Requests which raise a PoolTimeout need to be removed from the pool queue. (#502)
|
||||
- Fix AttributeError that happened when Socks5Connection were terminated. (#501)
|
||||
|
||||
## 0.14.6 (February 1st, 2022)
|
||||
|
||||
- Fix SOCKS support for `http://` URLs. (#492)
|
||||
- Resolve race condition around exceptions during streaming a response. (#491)
|
||||
|
||||
## 0.14.5 (January 18th, 2022)
|
||||
|
||||
- SOCKS proxy support. (#478)
|
||||
- Add proxy_auth argument to HTTPProxy. (#481)
|
||||
- Improve error message on 'RemoteProtocolError' exception when server disconnects without sending a response. (#479)
|
||||
|
||||
## 0.14.4 (January 5th, 2022)
|
||||
|
||||
- Support HTTP/2 on HTTPS tunnelling proxies. (#468)
|
||||
- Fix proxy headers missing on HTTP forwarding. (#456)
|
||||
- Only instantiate SSL context if required. (#457)
|
||||
- More robust HTTP/2 handling. (#253, #439, #440, #441)
|
||||
|
||||
## 0.14.3 (November 17th, 2021)
|
||||
|
||||
- Fix race condition when removing closed connections from the pool. (#437)
|
||||
|
||||
## 0.14.2 (November 16th, 2021)
|
||||
|
||||
- Failed connections no longer remain in the pool. (Pull #433)
|
||||
|
||||
## 0.14.1 (November 12th, 2021)
|
||||
|
||||
- `max_connections` becomes optional. (Pull #429)
|
||||
- `certifi` is now included in the install dependancies. (Pull #428)
|
||||
- `h2` is now strictly optional. (Pull #428)
|
||||
|
||||
## 0.14.0 (November 11th, 2021)
|
||||
|
||||
The 0.14 release is a complete reworking of `httpcore`, comprehensively addressing some underlying issues in the connection pooling, as well as substantially redesigning the API to be more user friendly.
|
||||
|
||||
Some of the lower-level API design also makes the components more easily testable in isolation, and the package now has 100% test coverage.
|
||||
|
||||
See [discussion #419](https://github.com/encode/httpcore/discussions/419) for a little more background.
|
||||
|
||||
There's some other neat bits in there too, such as the "trace" extension, which gives a hook into inspecting the internal events that occur during the request/response cycle. This extension is needed for the HTTPX cli, in order to...
|
||||
|
||||
* Log the point at which the connection is established, and the IP/port on which it is made.
|
||||
* Determine if the outgoing request should log as HTTP/1.1 or HTTP/2, rather than having to assume it's HTTP/2 if the --http2 flag was passed. (Which may not actually be true.)
|
||||
* Log SSL version info / certificate info.
|
||||
|
||||
Note that `curio` support is not currently available in 0.14.0. If you're using `httpcore` with `curio` please get in touch, so we can assess if we ought to prioritize it as a feature or not.
|
||||
|
||||
## 0.13.7 (September 13th, 2021)
|
||||
|
||||
- Fix broken error messaging when URL scheme is missing, or a non HTTP(S) scheme is used. (Pull #403)
|
||||
|
||||
## 0.13.6 (June 15th, 2021)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Close sockets when read or write timeouts occur. (Pull #365)
|
||||
|
||||
## 0.13.5 (June 14th, 2021)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Resolved niggles with AnyIO EOF behaviours. (Pull #358, #362)
|
||||
|
||||
## 0.13.4 (June 9th, 2021)
|
||||
|
||||
### Added
|
||||
|
||||
- Improved error messaging when URL scheme is missing, or a non HTTP(S) scheme is used. (Pull #354)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Switched to `anyio` as the default backend implementation when running with `asyncio`. Resolves some awkward [TLS timeout issues](https://github.com/encode/httpx/discussions/1511).
|
||||
|
||||
## 0.13.3 (May 6th, 2021)
|
||||
|
||||
### Added
|
||||
|
||||
- Support HTTP/2 prior knowledge, using `httpcore.SyncConnectionPool(http1=False)`. (Pull #333)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Handle cases where environment does not provide `select.poll` support. (Pull #331)
|
||||
|
||||
## 0.13.2 (April 29th, 2021)
|
||||
|
||||
### Added
|
||||
|
||||
- Improve error message for specific case of `RemoteProtocolError` where server disconnects without sending a response. (Pull #313)
|
||||
|
||||
## 0.13.1 (April 28th, 2021)
|
||||
|
||||
### Fixed
|
||||
|
||||
- More resiliant testing for closed connections. (Pull #311)
|
||||
- Don't raise exceptions on ungraceful connection closes. (Pull #310)
|
||||
|
||||
## 0.13.0 (April 21st, 2021)
|
||||
|
||||
The 0.13 release updates the core API in order to match the HTTPX Transport API,
|
||||
introduced in HTTPX 0.18 onwards.
|
||||
|
||||
An example of making requests with the new interface is:
|
||||
|
||||
```python
|
||||
with httpcore.SyncConnectionPool() as http:
|
||||
status_code, headers, stream, extensions = http.handle_request(
|
||||
method=b'GET',
|
||||
url=(b'https', b'example.org', 443, b'/'),
|
||||
headers=[(b'host', b'example.org'), (b'user-agent', b'httpcore')]
|
||||
stream=httpcore.ByteStream(b''),
|
||||
extensions={}
|
||||
)
|
||||
body = stream.read()
|
||||
print(status_code, body)
|
||||
```
|
||||
|
||||
### Changed
|
||||
|
||||
- The `.request()` method is now `handle_request()`. (Pull #296)
|
||||
- The `.arequest()` method is now `.handle_async_request()`. (Pull #296)
|
||||
- The `headers` argument is no longer optional. (Pull #296)
|
||||
- The `stream` argument is no longer optional. (Pull #296)
|
||||
- The `ext` argument is now named `extensions`, and is no longer optional. (Pull #296)
|
||||
- The `"reason"` extension keyword is now named `"reason_phrase"`. (Pull #296)
|
||||
- The `"reason_phrase"` and `"http_version"` extensions now use byte strings for their values. (Pull #296)
|
||||
- The `httpcore.PlainByteStream()` class becomes `httpcore.ByteStream()`. (Pull #296)
|
||||
|
||||
### Added
|
||||
|
||||
- Streams now support a `.read()` interface. (Pull #296)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Task cancellation no longer leaks connections from the connection pool. (Pull #305)
|
||||
|
||||
## 0.12.3 (December 7th, 2020)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Abort SSL connections on close rather than waiting for remote EOF when using `asyncio`. (Pull #167)
|
||||
- Fix exception raised in case of connect timeouts when using the `anyio` backend. (Pull #236)
|
||||
- Fix `Host` header precedence for `:authority` in HTTP/2. (Pull #241, #243)
|
||||
- Handle extra edge case when detecting for socket readability when using `asyncio`. (Pull #242, #244)
|
||||
- Fix `asyncio` SSL warning when using proxy tunneling. (Pull #249)
|
||||
|
||||
## 0.12.2 (November 20th, 2020)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Properly wrap connect errors on the asyncio backend. (Pull #235)
|
||||
- Fix `ImportError` occurring on Python 3.9 when using the HTTP/1.1 sync client in a multithreaded context. (Pull #237)
|
||||
|
||||
## 0.12.1 (November 7th, 2020)
|
||||
|
||||
### Added
|
||||
|
||||
- Add connect retries. (Pull #221)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Tweak detection of dropped connections, resolving an issue with open files limits on Linux. (Pull #185)
|
||||
- Avoid leaking connections when establishing an HTTP tunnel to a proxy has failed. (Pull #223)
|
||||
- Properly wrap OS errors when using `trio`. (Pull #225)
|
||||
|
||||
## 0.12.0 (October 6th, 2020)
|
||||
|
||||
### Changed
|
||||
|
||||
- HTTP header casing is now preserved, rather than always sent in lowercase. (#216 and python-hyper/h11#104)
|
||||
|
||||
### Added
|
||||
|
||||
- Add Python 3.9 to officially supported versions.
|
||||
|
||||
### Fixed
|
||||
|
||||
- Gracefully handle a stdlib asyncio bug when a connection is closed while it is in a paused-for-reading state. (#201)
|
||||
|
||||
## 0.11.1 (September 28nd, 2020)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Add await to async semaphore release() coroutine (#197)
|
||||
- Drop incorrect curio classifier (#192)
|
||||
|
||||
## 0.11.0 (September 22nd, 2020)
|
||||
|
||||
The Transport API with 0.11.0 has a couple of significant changes.
|
||||
|
||||
Firstly we've moved changed the request interface in order to allow extensions, which will later enable us to support features
|
||||
such as trailing headers, HTTP/2 server push, and CONNECT/Upgrade connections.
|
||||
|
||||
The interface changes from:
|
||||
|
||||
```python
|
||||
def request(method, url, headers, stream, timeout):
|
||||
return (http_version, status_code, reason, headers, stream)
|
||||
```
|
||||
|
||||
To instead including an optional dictionary of extensions on the request and response:
|
||||
|
||||
```python
|
||||
def request(method, url, headers, stream, ext):
|
||||
return (status_code, headers, stream, ext)
|
||||
```
|
||||
|
||||
Having an open-ended extensions point will allow us to add later support for various optional features, that wouldn't otherwise be supported without these API changes.
|
||||
|
||||
In particular:
|
||||
|
||||
* Trailing headers support.
|
||||
* HTTP/2 Server Push
|
||||
* sendfile.
|
||||
* Exposing raw connection on CONNECT, Upgrade, HTTP/2 bi-di streaming.
|
||||
* Exposing debug information out of the API, including template name, template context.
|
||||
|
||||
Currently extensions are limited to:
|
||||
|
||||
* request: `timeout` - Optional. Timeout dictionary.
|
||||
* response: `http_version` - Optional. Include the HTTP version used on the response.
|
||||
* response: `reason` - Optional. Include the reason phrase used on the response. Only valid with HTTP/1.*.
|
||||
|
||||
See https://github.com/encode/httpx/issues/1274#issuecomment-694884553 for the history behind this.
|
||||
|
||||
Secondly, the async version of `request` is now namespaced as `arequest`.
|
||||
|
||||
This allows concrete transports to support both sync and async implementations on the same class.
|
||||
|
||||
### Added
|
||||
|
||||
- Add curio support. (Pull #168)
|
||||
- Add anyio support, with `backend="anyio"`. (Pull #169)
|
||||
|
||||
### Changed
|
||||
|
||||
- Update the Transport API to use 'ext' for optional extensions. (Pull #190)
|
||||
- Update the Transport API to use `.request` and `.arequest` so implementations can support both sync and async. (Pull #189)
|
||||
|
||||
## 0.10.2 (August 20th, 2020)
|
||||
|
||||
### Added
|
||||
|
||||
- Added Unix Domain Socket support. (Pull #139)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Always include the port on proxy CONNECT requests. (Pull #154)
|
||||
- Fix `max_keepalive_connections` configuration. (Pull #153)
|
||||
- Fixes behaviour in HTTP/1.1 where server disconnects can be used to signal the end of the response body. (Pull #164)
|
||||
|
||||
## 0.10.1 (August 7th, 2020)
|
||||
|
||||
- Include `max_keepalive_connections` on `AsyncHTTPProxy`/`SyncHTTPProxy` classes.
|
||||
|
||||
## 0.10.0 (August 7th, 2020)
|
||||
|
||||
The most notable change in the 0.10.0 release is that HTTP/2 support is now fully optional.
|
||||
|
||||
Use either `pip install httpcore` for HTTP/1.1 support only, or `pip install httpcore[http2]` for HTTP/1.1 and HTTP/2 support.
|
||||
|
||||
### Added
|
||||
|
||||
- HTTP/2 support becomes optional. (Pull #121, #130)
|
||||
- Add `local_address=...` support. (Pull #100, #134)
|
||||
- Add `PlainByteStream`, `IteratorByteStream`, `AsyncIteratorByteStream`. The `AsyncByteSteam` and `SyncByteStream` classes are now pure interface classes. (#133)
|
||||
- Add `LocalProtocolError`, `RemoteProtocolError` exceptions. (Pull #129)
|
||||
- Add `UnsupportedProtocol` exception. (Pull #128)
|
||||
- Add `.get_connection_info()` method. (Pull #102, #137)
|
||||
- Add better TRACE logs. (Pull #101)
|
||||
|
||||
### Changed
|
||||
|
||||
- `max_keepalive` is deprecated in favour of `max_keepalive_connections`. (Pull #140)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Improve handling of server disconnects. (Pull #112)
|
||||
|
||||
## 0.9.1 (May 27th, 2020)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Proper host resolution for sync case, including IPv6 support. (Pull #97)
|
||||
- Close outstanding connections when connection pool is closed. (Pull #98)
|
||||
|
||||
## 0.9.0 (May 21th, 2020)
|
||||
|
||||
### Changed
|
||||
|
||||
- URL port becomes an `Optional[int]` instead of `int`. (Pull #92)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Honor HTTP/2 max concurrent streams settings. (Pull #89, #90)
|
||||
- Remove incorrect debug log. (Pull #83)
|
||||
|
||||
## 0.8.4 (May 11th, 2020)
|
||||
|
||||
### Added
|
||||
|
||||
- Logging via HTTPCORE_LOG_LEVEL and HTTPX_LOG_LEVEL environment variables
|
||||
and TRACE level logging. (Pull #79)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Reuse of connections on HTTP/2 in close concurrency situations. (Pull #81)
|
||||
|
||||
## 0.8.3 (May 6rd, 2020)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Include `Host` and `Accept` headers on proxy "CONNECT" requests.
|
||||
- De-duplicate any headers also contained in proxy_headers.
|
||||
- HTTP/2 flag not being passed down to proxy connections.
|
||||
|
||||
## 0.8.2 (May 3rd, 2020)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix connections using proxy forwarding requests not being added to the
|
||||
connection pool properly. (Pull #70)
|
||||
|
||||
## 0.8.1 (April 30th, 2020)
|
||||
|
||||
### Changed
|
||||
|
||||
- Allow inherintance of both `httpcore.AsyncByteStream`, `httpcore.SyncByteStream` without type conflicts.
|
||||
|
||||
## 0.8.0 (April 30th, 2020)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed tunnel proxy support.
|
||||
|
||||
### Added
|
||||
|
||||
- New `TimeoutException` base class.
|
||||
|
||||
## 0.7.0 (March 5th, 2020)
|
||||
|
||||
- First integration with HTTPX.
|
||||
Binary file not shown.
@@ -0,0 +1,203 @@
|
||||
Metadata-Version: 2.3
|
||||
Name: httpx
|
||||
Version: 0.28.1
|
||||
Summary: The next generation HTTP client.
|
||||
Project-URL: Changelog, https://github.com/encode/httpx/blob/master/CHANGELOG.md
|
||||
Project-URL: Documentation, https://www.python-httpx.org
|
||||
Project-URL: Homepage, https://github.com/encode/httpx
|
||||
Project-URL: Source, https://github.com/encode/httpx
|
||||
Author-email: Tom Christie <tom@tomchristie.com>
|
||||
License: BSD-3-Clause
|
||||
Classifier: Development Status :: 4 - Beta
|
||||
Classifier: Environment :: Web Environment
|
||||
Classifier: Framework :: AsyncIO
|
||||
Classifier: Framework :: Trio
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: BSD License
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3 :: Only
|
||||
Classifier: Programming Language :: Python :: 3.8
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Topic :: Internet :: WWW/HTTP
|
||||
Requires-Python: >=3.8
|
||||
Requires-Dist: anyio
|
||||
Requires-Dist: certifi
|
||||
Requires-Dist: httpcore==1.*
|
||||
Requires-Dist: idna
|
||||
Provides-Extra: brotli
|
||||
Requires-Dist: brotli; (platform_python_implementation == 'CPython') and extra == 'brotli'
|
||||
Requires-Dist: brotlicffi; (platform_python_implementation != 'CPython') and extra == 'brotli'
|
||||
Provides-Extra: cli
|
||||
Requires-Dist: click==8.*; extra == 'cli'
|
||||
Requires-Dist: pygments==2.*; extra == 'cli'
|
||||
Requires-Dist: rich<14,>=10; extra == 'cli'
|
||||
Provides-Extra: http2
|
||||
Requires-Dist: h2<5,>=3; extra == 'http2'
|
||||
Provides-Extra: socks
|
||||
Requires-Dist: socksio==1.*; extra == 'socks'
|
||||
Provides-Extra: zstd
|
||||
Requires-Dist: zstandard>=0.18.0; extra == 'zstd'
|
||||
Description-Content-Type: text/markdown
|
||||
|
||||
<p align="center">
|
||||
<a href="https://www.python-httpx.org/"><img width="350" height="208" src="https://raw.githubusercontent.com/encode/httpx/master/docs/img/butterfly.png" alt='HTTPX'></a>
|
||||
</p>
|
||||
|
||||
<p align="center"><strong>HTTPX</strong> <em>- A next-generation HTTP client for Python.</em></p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/encode/httpx/actions">
|
||||
<img src="https://github.com/encode/httpx/workflows/Test%20Suite/badge.svg" alt="Test Suite">
|
||||
</a>
|
||||
<a href="https://pypi.org/project/httpx/">
|
||||
<img src="https://badge.fury.io/py/httpx.svg" alt="Package version">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
HTTPX is a fully featured HTTP client library for Python 3. It includes **an integrated command line client**, has support for both **HTTP/1.1 and HTTP/2**, and provides both **sync and async APIs**.
|
||||
|
||||
---
|
||||
|
||||
Install HTTPX using pip:
|
||||
|
||||
```shell
|
||||
$ pip install httpx
|
||||
```
|
||||
|
||||
Now, let's get started:
|
||||
|
||||
```pycon
|
||||
>>> import httpx
|
||||
>>> r = httpx.get('https://www.example.org/')
|
||||
>>> r
|
||||
<Response [200 OK]>
|
||||
>>> r.status_code
|
||||
200
|
||||
>>> r.headers['content-type']
|
||||
'text/html; charset=UTF-8'
|
||||
>>> r.text
|
||||
'<!doctype html>\n<html>\n<head>\n<title>Example Domain</title>...'
|
||||
```
|
||||
|
||||
Or, using the command-line client.
|
||||
|
||||
```shell
|
||||
$ pip install 'httpx[cli]' # The command line client is an optional dependency.
|
||||
```
|
||||
|
||||
Which now allows us to use HTTPX directly from the command-line...
|
||||
|
||||
<p align="center">
|
||||
<img width="700" src="https://raw.githubusercontent.com/encode/httpx/master/docs/img/httpx-help.png" alt='httpx --help'>
|
||||
</p>
|
||||
|
||||
Sending a request...
|
||||
|
||||
<p align="center">
|
||||
<img width="700" src="https://raw.githubusercontent.com/encode/httpx/master/docs/img/httpx-request.png" alt='httpx http://httpbin.org/json'>
|
||||
</p>
|
||||
|
||||
## Features
|
||||
|
||||
HTTPX builds on the well-established usability of `requests`, and gives you:
|
||||
|
||||
* A broadly [requests-compatible API](https://www.python-httpx.org/compatibility/).
|
||||
* An integrated command-line client.
|
||||
* HTTP/1.1 [and HTTP/2 support](https://www.python-httpx.org/http2/).
|
||||
* Standard synchronous interface, but with [async support if you need it](https://www.python-httpx.org/async/).
|
||||
* Ability to make requests directly to [WSGI applications](https://www.python-httpx.org/advanced/transports/#wsgi-transport) or [ASGI applications](https://www.python-httpx.org/advanced/transports/#asgi-transport).
|
||||
* Strict timeouts everywhere.
|
||||
* Fully type annotated.
|
||||
* 100% test coverage.
|
||||
|
||||
Plus all the standard features of `requests`...
|
||||
|
||||
* International Domains and URLs
|
||||
* Keep-Alive & Connection Pooling
|
||||
* Sessions with Cookie Persistence
|
||||
* Browser-style SSL Verification
|
||||
* Basic/Digest Authentication
|
||||
* Elegant Key/Value Cookies
|
||||
* Automatic Decompression
|
||||
* Automatic Content Decoding
|
||||
* Unicode Response Bodies
|
||||
* Multipart File Uploads
|
||||
* HTTP(S) Proxy Support
|
||||
* Connection Timeouts
|
||||
* Streaming Downloads
|
||||
* .netrc Support
|
||||
* Chunked Requests
|
||||
|
||||
## Installation
|
||||
|
||||
Install with pip:
|
||||
|
||||
```shell
|
||||
$ pip install httpx
|
||||
```
|
||||
|
||||
Or, to include the optional HTTP/2 support, use:
|
||||
|
||||
```shell
|
||||
$ pip install httpx[http2]
|
||||
```
|
||||
|
||||
HTTPX requires Python 3.8+.
|
||||
|
||||
## Documentation
|
||||
|
||||
Project documentation is available at [https://www.python-httpx.org/](https://www.python-httpx.org/).
|
||||
|
||||
For a run-through of all the basics, head over to the [QuickStart](https://www.python-httpx.org/quickstart/).
|
||||
|
||||
For more advanced topics, see the [Advanced Usage](https://www.python-httpx.org/advanced/) section, the [async support](https://www.python-httpx.org/async/) section, or the [HTTP/2](https://www.python-httpx.org/http2/) section.
|
||||
|
||||
The [Developer Interface](https://www.python-httpx.org/api/) provides a comprehensive API reference.
|
||||
|
||||
To find out about tools that integrate with HTTPX, see [Third Party Packages](https://www.python-httpx.org/third_party_packages/).
|
||||
|
||||
## Contribute
|
||||
|
||||
If you want to contribute with HTTPX check out the [Contributing Guide](https://www.python-httpx.org/contributing/) to learn how to start.
|
||||
|
||||
## Dependencies
|
||||
|
||||
The HTTPX project relies on these excellent libraries:
|
||||
|
||||
* `httpcore` - The underlying transport implementation for `httpx`.
|
||||
* `h11` - HTTP/1.1 support.
|
||||
* `certifi` - SSL certificates.
|
||||
* `idna` - Internationalized domain name support.
|
||||
* `sniffio` - Async library autodetection.
|
||||
|
||||
As well as these optional installs:
|
||||
|
||||
* `h2` - HTTP/2 support. *(Optional, with `httpx[http2]`)*
|
||||
* `socksio` - SOCKS proxy support. *(Optional, with `httpx[socks]`)*
|
||||
* `rich` - Rich terminal support. *(Optional, with `httpx[cli]`)*
|
||||
* `click` - Command line client support. *(Optional, with `httpx[cli]`)*
|
||||
* `brotli` or `brotlicffi` - Decoding for "brotli" compressed responses. *(Optional, with `httpx[brotli]`)*
|
||||
* `zstandard` - Decoding for "zstd" compressed responses. *(Optional, with `httpx[zstd]`)*
|
||||
|
||||
A huge amount of credit is due to `requests` for the API layout that
|
||||
much of this work follows, as well as to `urllib3` for plenty of design
|
||||
inspiration around the lower-level networking details.
|
||||
|
||||
---
|
||||
|
||||
<p align="center"><i>HTTPX is <a href="https://github.com/encode/httpx/blob/master/LICENSE.md">BSD licensed</a> code.<br/>Designed & crafted with care.</i><br/>— 🦋 —</p>
|
||||
|
||||
## Release Information
|
||||
|
||||
### Fixed
|
||||
|
||||
* Reintroduced supposedly-private `URLTypes` shortcut. (#2673)
|
||||
|
||||
|
||||
---
|
||||
|
||||
[Full changelog](https://github.com/encode/httpx/blob/master/CHANGELOG.md)
|
||||
Binary file not shown.
@@ -0,0 +1,749 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: python-dotenv
|
||||
Version: 1.2.1
|
||||
Summary: Read key-value pairs from a .env file and set them as environment variables
|
||||
Author-email: Saurabh Kumar <me+github@saurabh-kumar.com>
|
||||
License-Expression: BSD-3-Clause
|
||||
Project-URL: Source, https://github.com/theskumar/python-dotenv
|
||||
Keywords: environment variables,deployments,settings,env,dotenv,configurations,python
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: Intended Audience :: System Administrators
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Topic :: System :: Systems Administration
|
||||
Classifier: Topic :: Utilities
|
||||
Classifier: Environment :: Web Environment
|
||||
Requires-Python: >=3.9
|
||||
Description-Content-Type: text/markdown
|
||||
License-File: LICENSE
|
||||
Provides-Extra: cli
|
||||
Requires-Dist: click>=5.0; extra == "cli"
|
||||
Dynamic: license-file
|
||||
|
||||
# python-dotenv
|
||||
|
||||
[![Build Status][build_status_badge]][build_status_link]
|
||||
[![PyPI version][pypi_badge]][pypi_link]
|
||||
|
||||
python-dotenv reads key-value pairs from a `.env` file and can set them as environment
|
||||
variables. It helps in the development of applications following the
|
||||
[12-factor](https://12factor.net/) principles.
|
||||
|
||||
- [Getting Started](#getting-started)
|
||||
- [Other Use Cases](#other-use-cases)
|
||||
* [Load configuration without altering the environment](#load-configuration-without-altering-the-environment)
|
||||
* [Parse configuration as a stream](#parse-configuration-as-a-stream)
|
||||
* [Load .env files in IPython](#load-env-files-in-ipython)
|
||||
- [Command-line Interface](#command-line-interface)
|
||||
- [File format](#file-format)
|
||||
* [Multiline values](#multiline-values)
|
||||
* [Variable expansion](#variable-expansion)
|
||||
- [Related Projects](#related-projects)
|
||||
- [Acknowledgements](#acknowledgements)
|
||||
|
||||
## Getting Started
|
||||
|
||||
```shell
|
||||
pip install python-dotenv
|
||||
```
|
||||
|
||||
If your application takes its configuration from environment variables, like a 12-factor
|
||||
application, launching it in development is not very practical because you have to set
|
||||
those environment variables yourself.
|
||||
|
||||
To help you with that, you can add python-dotenv to your application to make it load the
|
||||
configuration from a `.env` file when it is present (e.g. in development) while remaining
|
||||
configurable via the environment:
|
||||
|
||||
```python
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv() # reads variables from a .env file and sets them in os.environ
|
||||
|
||||
# Code of your application, which uses environment variables (e.g. from `os.environ` or
|
||||
# `os.getenv`) as if they came from the actual environment.
|
||||
```
|
||||
|
||||
By default, `load_dotenv()` will:
|
||||
|
||||
- Look for a `.env` file in the same directory as the Python script (or higher up the directory tree).
|
||||
- Read each key-value pair and add it to `os.environ`.
|
||||
- **Not override** an environment variable that is already set, unless you explicitly pass `override=True`.
|
||||
|
||||
To configure the development environment, add a `.env` in the root directory of your
|
||||
project:
|
||||
|
||||
```
|
||||
.
|
||||
├── .env
|
||||
└── foo.py
|
||||
```
|
||||
|
||||
The syntax of `.env` files supported by python-dotenv is similar to that of Bash:
|
||||
|
||||
```bash
|
||||
# Development settings
|
||||
DOMAIN=example.org
|
||||
ADMIN_EMAIL=admin@${DOMAIN}
|
||||
ROOT_URL=${DOMAIN}/app
|
||||
```
|
||||
|
||||
If you use variables in values, ensure they are surrounded with `{` and `}`, like
|
||||
`${DOMAIN}`, as bare variables such as `$DOMAIN` are not expanded.
|
||||
|
||||
You will probably want to add `.env` to your `.gitignore`, especially if it contains
|
||||
secrets like a password.
|
||||
|
||||
See the section "File format" below for more information about what you can write in a
|
||||
`.env` file.
|
||||
|
||||
## Other Use Cases
|
||||
|
||||
### Load configuration without altering the environment
|
||||
|
||||
The function `dotenv_values` works more or less the same way as `load_dotenv`, except it
|
||||
doesn't touch the environment, it just returns a `dict` with the values parsed from the
|
||||
`.env` file.
|
||||
|
||||
```python
|
||||
from dotenv import dotenv_values
|
||||
|
||||
config = dotenv_values(".env") # config = {"USER": "foo", "EMAIL": "foo@example.org"}
|
||||
```
|
||||
|
||||
This notably enables advanced configuration management:
|
||||
|
||||
```python
|
||||
import os
|
||||
from dotenv import dotenv_values
|
||||
|
||||
config = {
|
||||
**dotenv_values(".env.shared"), # load shared development variables
|
||||
**dotenv_values(".env.secret"), # load sensitive variables
|
||||
**os.environ, # override loaded values with environment variables
|
||||
}
|
||||
```
|
||||
|
||||
### Parse configuration as a stream
|
||||
|
||||
`load_dotenv` and `dotenv_values` accept [streams][python_streams] via their `stream`
|
||||
argument. It is thus possible to load the variables from sources other than the
|
||||
filesystem (e.g. the network).
|
||||
|
||||
```python
|
||||
from io import StringIO
|
||||
|
||||
from dotenv import load_dotenv
|
||||
|
||||
config = StringIO("USER=foo\nEMAIL=foo@example.org")
|
||||
load_dotenv(stream=config)
|
||||
```
|
||||
|
||||
### Load .env files in IPython
|
||||
|
||||
You can use dotenv in IPython. By default, it will use `find_dotenv` to search for a
|
||||
`.env` file:
|
||||
|
||||
```python
|
||||
%load_ext dotenv
|
||||
%dotenv
|
||||
```
|
||||
|
||||
You can also specify a path:
|
||||
|
||||
```python
|
||||
%dotenv relative/or/absolute/path/to/.env
|
||||
```
|
||||
|
||||
Optional flags:
|
||||
|
||||
- `-o` to override existing variables.
|
||||
- `-v` for increased verbosity.
|
||||
|
||||
### Disable load_dotenv
|
||||
|
||||
Set `PYTHON_DOTENV_DISABLED=1` to disable `load_dotenv()` from loading .env files or streams. Useful when you can't modify third-party package calls or in production.
|
||||
|
||||
## Command-line Interface
|
||||
|
||||
A CLI interface `dotenv` is also included, which helps you manipulate the `.env` file
|
||||
without manually opening it.
|
||||
|
||||
```shell
|
||||
$ pip install "python-dotenv[cli]"
|
||||
$ dotenv set USER foo
|
||||
$ dotenv set EMAIL foo@example.org
|
||||
$ dotenv list
|
||||
USER=foo
|
||||
EMAIL=foo@example.org
|
||||
$ dotenv list --format=json
|
||||
{
|
||||
"USER": "foo",
|
||||
"EMAIL": "foo@example.org"
|
||||
}
|
||||
$ dotenv run -- python foo.py
|
||||
```
|
||||
|
||||
Run `dotenv --help` for more information about the options and subcommands.
|
||||
|
||||
## File format
|
||||
|
||||
The format is not formally specified and still improves over time. That being said,
|
||||
`.env` files should mostly look like Bash files.
|
||||
|
||||
Keys can be unquoted or single-quoted. Values can be unquoted, single- or double-quoted.
|
||||
Spaces before and after keys, equal signs, and values are ignored. Values can be followed
|
||||
by a comment. Lines can start with the `export` directive, which does not affect their
|
||||
interpretation.
|
||||
|
||||
Allowed escape sequences:
|
||||
|
||||
- in single-quoted values: `\\`, `\'`
|
||||
- in double-quoted values: `\\`, `\'`, `\"`, `\a`, `\b`, `\f`, `\n`, `\r`, `\t`, `\v`
|
||||
|
||||
### Multiline values
|
||||
|
||||
It is possible for single- or double-quoted values to span multiple lines. The following
|
||||
examples are equivalent:
|
||||
|
||||
```bash
|
||||
FOO="first line
|
||||
second line"
|
||||
```
|
||||
|
||||
```bash
|
||||
FOO="first line\nsecond line"
|
||||
```
|
||||
|
||||
### Variable without a value
|
||||
|
||||
A variable can have no value:
|
||||
|
||||
```bash
|
||||
FOO
|
||||
```
|
||||
|
||||
It results in `dotenv_values` associating that variable name with the value `None` (e.g.
|
||||
`{"FOO": None}`. `load_dotenv`, on the other hand, simply ignores such variables.
|
||||
|
||||
This shouldn't be confused with `FOO=`, in which case the variable is associated with the
|
||||
empty string.
|
||||
|
||||
### Variable expansion
|
||||
|
||||
python-dotenv can interpolate variables using POSIX variable expansion.
|
||||
|
||||
With `load_dotenv(override=True)` or `dotenv_values()`, the value of a variable is the
|
||||
first of the values defined in the following list:
|
||||
|
||||
- Value of that variable in the `.env` file.
|
||||
- Value of that variable in the environment.
|
||||
- Default value, if provided.
|
||||
- Empty string.
|
||||
|
||||
With `load_dotenv(override=False)`, the value of a variable is the first of the values
|
||||
defined in the following list:
|
||||
|
||||
- Value of that variable in the environment.
|
||||
- Value of that variable in the `.env` file.
|
||||
- Default value, if provided.
|
||||
- Empty string.
|
||||
|
||||
## Related Projects
|
||||
|
||||
- [Honcho](https://github.com/nickstenning/honcho) - For managing
|
||||
Procfile-based applications.
|
||||
- [django-dotenv](https://github.com/jpadilla/django-dotenv)
|
||||
- [django-environ](https://github.com/joke2k/django-environ)
|
||||
- [django-environ-2](https://github.com/sergeyklay/django-environ-2)
|
||||
- [django-configuration](https://github.com/jezdez/django-configurations)
|
||||
- [dump-env](https://github.com/sobolevn/dump-env)
|
||||
- [environs](https://github.com/sloria/environs)
|
||||
- [dynaconf](https://github.com/rochacbruno/dynaconf)
|
||||
- [parse_it](https://github.com/naorlivne/parse_it)
|
||||
- [python-decouple](https://github.com/HBNetwork/python-decouple)
|
||||
|
||||
## Acknowledgements
|
||||
|
||||
This project is currently maintained by [Saurabh Kumar](https://saurabh-kumar.com) and
|
||||
[Bertrand Bonnefoy-Claudet](https://github.com/bbc2) and would not have been possible
|
||||
without the support of these [awesome
|
||||
people](https://github.com/theskumar/python-dotenv/graphs/contributors).
|
||||
|
||||
[build_status_badge]: https://github.com/theskumar/python-dotenv/actions/workflows/test.yml/badge.svg
|
||||
[build_status_link]: https://github.com/theskumar/python-dotenv/actions/workflows/test.yml
|
||||
[pypi_badge]: https://badge.fury.io/py/python-dotenv.svg
|
||||
[pypi_link]: https://badge.fury.io/py/python-dotenv
|
||||
[python_streams]: https://docs.python.org/3/library/io.html
|
||||
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this
|
||||
project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [1.2.1] - 2025-10-26
|
||||
|
||||
- Move more config to `pyproject.toml`, removed `setup.cfg`
|
||||
- Add support for reading `.env` from FIFOs (Unix) by [@sidharth-sudhir] in [#586]
|
||||
|
||||
## [1.2.0] - 2025-10-26
|
||||
|
||||
- Upgrade build system to use PEP 517 & PEP 518 to use `build` and `pyproject.toml` by [@EpicWink] in [#583]
|
||||
- Add support for Python 3.14 by [@23f3001135] in [#579](https://github.com/theskumar/python-dotenv/pull/563)
|
||||
- Add support for disabling of `load_dotenv()` using `PYTHON_DOTENV_DISABLED` env var. by [@matthewfranglen] in [#569]
|
||||
|
||||
## [1.1.1] - 2025-06-24
|
||||
|
||||
### Fixed
|
||||
|
||||
* CLI: Ensure `find_dotenv` work reliably on python 3.13 by [@theskumar] in [#563](https://github.com/theskumar/python-dotenv/pull/563)
|
||||
* CLI: revert the use of execvpe on Windows by [@wrongontheinternet] in [#566](https://github.com/theskumar/python-dotenv/pull/566)
|
||||
|
||||
|
||||
## [1.1.0] - 2025-03-25
|
||||
|
||||
**Feature**
|
||||
|
||||
- Add support for python 3.13
|
||||
- Enhance `dotenv run`, switch to `execvpe` for better resource management and signal handling ([#523]) by [@eekstunt]
|
||||
|
||||
**Fixed**
|
||||
|
||||
- `find_dotenv` and `load_dotenv` now correctly looks up at the current directory when running in debugger or pdb ([#553] by [@randomseed42])
|
||||
|
||||
**Misc**
|
||||
|
||||
- Drop support for Python 3.8
|
||||
|
||||
## [1.0.1] - 2024-01-23
|
||||
|
||||
**Fixed**
|
||||
|
||||
* Gracefully handle code which has been imported from a zipfile ([#456] by [@samwyma])
|
||||
* Allow modules using `load_dotenv` to be reloaded when launched in a separate thread ([#497] by [@freddyaboulton])
|
||||
* Fix file not closed after deletion, handle error in the rewrite function ([#469] by [@Qwerty-133])
|
||||
|
||||
**Misc**
|
||||
* Use pathlib.Path in tests ([#466] by [@eumiro])
|
||||
* Fix year in release date in changelog.md ([#454] by [@jankislinger])
|
||||
* Use https in README links ([#474] by [@Nicals])
|
||||
|
||||
## [1.0.0] - 2023-02-24
|
||||
|
||||
**Fixed**
|
||||
|
||||
* Drop support for python 3.7, add python 3.12-dev (#449 by [@theskumar])
|
||||
* Handle situations where the cwd does not exist. (#446 by [@jctanner])
|
||||
|
||||
## [0.21.1] - 2023-01-21
|
||||
|
||||
**Added**
|
||||
|
||||
* Use Python 3.11 non-beta in CI (#438 by [@bbc2])
|
||||
* Modernize variables code (#434 by [@Nougat-Waffle])
|
||||
* Modernize main.py and parser.py code (#435 by [@Nougat-Waffle])
|
||||
* Improve conciseness of cli.py and __init__.py (#439 by [@Nougat-Waffle])
|
||||
* Improve error message for `get` and `list` commands when env file can't be opened (#441 by [@bbc2])
|
||||
* Updated License to align with BSD OSI template (#433 by [@lsmith77])
|
||||
|
||||
|
||||
**Fixed**
|
||||
|
||||
* Fix Out-of-scope error when "dest" variable is undefined (#413 by [@theGOTOguy])
|
||||
* Fix IPython test warning about deprecated `magic` (#440 by [@bbc2])
|
||||
* Fix type hint for dotenv_path var, add StrPath alias (#432 by [@eaf])
|
||||
|
||||
## [0.21.0] - 2022-09-03
|
||||
|
||||
**Added**
|
||||
|
||||
* CLI: add support for invocations via 'python -m'. (#395 by [@theskumar])
|
||||
* `load_dotenv` function now returns `False`. (#388 by [@larsks])
|
||||
* CLI: add --format= option to list command. (#407 by [@sammck])
|
||||
|
||||
**Fixed**
|
||||
|
||||
* Drop Python 3.5 and 3.6 and upgrade GA (#393 by [@eggplants])
|
||||
* Use `open` instead of `io.open`. (#389 by [@rabinadk1])
|
||||
* Improve documentation for variables without a value (#390 by [@bbc2])
|
||||
* Add `parse_it` to Related Projects (#410 by [@naorlivne])
|
||||
* Update README.md (#415 by [@harveer07])
|
||||
* Improve documentation with direct use of MkDocs (#398 by [@bbc2])
|
||||
|
||||
## [0.20.0] - 2022-03-24
|
||||
|
||||
**Added**
|
||||
|
||||
- Add `encoding` (`Optional[str]`) parameter to `get_key`, `set_key` and `unset_key`.
|
||||
(#379 by [@bbc2])
|
||||
|
||||
**Fixed**
|
||||
|
||||
- Use dict to specify the `entry_points` parameter of `setuptools.setup` (#376 by
|
||||
[@mgorny]).
|
||||
- Don't build universal wheels (#387 by [@bbc2]).
|
||||
|
||||
## [0.19.2] - 2021-11-11
|
||||
|
||||
**Fixed**
|
||||
|
||||
- In `set_key`, add missing newline character before new entry if necessary. (#361 by
|
||||
[@bbc2])
|
||||
|
||||
## [0.19.1] - 2021-08-09
|
||||
|
||||
**Added**
|
||||
|
||||
- Add support for Python 3.10. (#359 by [@theskumar])
|
||||
|
||||
## [0.19.0] - 2021-07-24
|
||||
|
||||
**Changed**
|
||||
|
||||
- Require Python 3.5 or a later version. Python 2 and 3.4 are no longer supported. (#341
|
||||
by [@bbc2]).
|
||||
|
||||
**Added**
|
||||
|
||||
- The `dotenv_path` argument of `set_key` and `unset_key` now has a type of `Union[str,
|
||||
os.PathLike]` instead of just `os.PathLike` (#347 by [@bbc2]).
|
||||
- The `stream` argument of `load_dotenv` and `dotenv_values` can now be a text stream
|
||||
(`IO[str]`), which includes values like `io.StringIO("foo")` and `open("file.env",
|
||||
"r")` (#348 by [@bbc2]).
|
||||
|
||||
## [0.18.0] - 2021-06-20
|
||||
|
||||
**Changed**
|
||||
|
||||
- Raise `ValueError` if `quote_mode` isn't one of `always`, `auto` or `never` in
|
||||
`set_key` (#330 by [@bbc2]).
|
||||
- When writing a value to a .env file with `set_key` or `dotenv set <key> <value>` (#330
|
||||
by [@bbc2]):
|
||||
- Use single quotes instead of double quotes.
|
||||
- Don't strip surrounding quotes.
|
||||
- In `auto` mode, don't add quotes if the value is only made of alphanumeric characters
|
||||
(as determined by `string.isalnum`).
|
||||
|
||||
## [0.17.1] - 2021-04-29
|
||||
|
||||
**Fixed**
|
||||
|
||||
- Fixed tests for build environments relying on `PYTHONPATH` (#318 by [@befeleme]).
|
||||
|
||||
## [0.17.0] - 2021-04-02
|
||||
|
||||
**Changed**
|
||||
|
||||
- Make `dotenv get <key>` only show the value, not `key=value` (#313 by [@bbc2]).
|
||||
|
||||
**Added**
|
||||
|
||||
- Add `--override`/`--no-override` option to `dotenv run` (#312 by [@zueve] and [@bbc2]).
|
||||
|
||||
## [0.16.0] - 2021-03-27
|
||||
|
||||
**Changed**
|
||||
|
||||
- The default value of the `encoding` parameter for `load_dotenv` and `dotenv_values` is
|
||||
now `"utf-8"` instead of `None` (#306 by [@bbc2]).
|
||||
- Fix resolution order in variable expansion with `override=False` (#287 by [@bbc2]).
|
||||
|
||||
## [0.15.0] - 2020-10-28
|
||||
|
||||
**Added**
|
||||
|
||||
- Add `--export` option to `set` to make it prepend the binding with `export` (#270 by
|
||||
[@jadutter]).
|
||||
|
||||
**Changed**
|
||||
|
||||
- Make `set` command create the `.env` file in the current directory if no `.env` file was
|
||||
found (#270 by [@jadutter]).
|
||||
|
||||
**Fixed**
|
||||
|
||||
- Fix potentially empty expanded value for duplicate key (#260 by [@bbc2]).
|
||||
- Fix import error on Python 3.5.0 and 3.5.1 (#267 by [@gongqingkui]).
|
||||
- Fix parsing of unquoted values containing several adjacent space or tab characters
|
||||
(#277 by [@bbc2], review by [@x-yuri]).
|
||||
|
||||
## [0.14.0] - 2020-07-03
|
||||
|
||||
**Changed**
|
||||
|
||||
- Privilege definition in file over the environment in variable expansion (#256 by
|
||||
[@elbehery95]).
|
||||
|
||||
**Fixed**
|
||||
|
||||
- Improve error message for when file isn't found (#245 by [@snobu]).
|
||||
- Use HTTPS URL in package meta data (#251 by [@ekohl]).
|
||||
|
||||
## [0.13.0] - 2020-04-16
|
||||
|
||||
**Added**
|
||||
|
||||
- Add support for a Bash-like default value in variable expansion (#248 by [@bbc2]).
|
||||
|
||||
## [0.12.0] - 2020-02-28
|
||||
|
||||
**Changed**
|
||||
|
||||
- Use current working directory to find `.env` when bundled by PyInstaller (#213 by
|
||||
[@gergelyk]).
|
||||
|
||||
**Fixed**
|
||||
|
||||
- Fix escaping of quoted values written by `set_key` (#236 by [@bbc2]).
|
||||
- Fix `dotenv run` crashing on environment variables without values (#237 by [@yannham]).
|
||||
- Remove warning when last line is empty (#238 by [@bbc2]).
|
||||
|
||||
## [0.11.0] - 2020-02-07
|
||||
|
||||
**Added**
|
||||
|
||||
- Add `interpolate` argument to `load_dotenv` and `dotenv_values` to disable interpolation
|
||||
(#232 by [@ulyssessouza]).
|
||||
|
||||
**Changed**
|
||||
|
||||
- Use logging instead of warnings (#231 by [@bbc2]).
|
||||
|
||||
**Fixed**
|
||||
|
||||
- Fix installation in non-UTF-8 environments (#225 by [@altendky]).
|
||||
- Fix PyPI classifiers (#228 by [@bbc2]).
|
||||
|
||||
## [0.10.5] - 2020-01-19
|
||||
|
||||
**Fixed**
|
||||
|
||||
- Fix handling of malformed lines and lines without a value (#222 by [@bbc2]):
|
||||
- Don't print warning when key has no value.
|
||||
- Reject more malformed lines (e.g. "A: B", "a='b',c").
|
||||
- Fix handling of lines with just a comment (#224 by [@bbc2]).
|
||||
|
||||
## [0.10.4] - 2020-01-17
|
||||
|
||||
**Added**
|
||||
|
||||
- Make typing optional (#179 by [@techalchemy]).
|
||||
- Print a warning on malformed line (#211 by [@bbc2]).
|
||||
- Support keys without a value (#220 by [@ulyssessouza]).
|
||||
|
||||
## 0.10.3
|
||||
|
||||
- Improve interactive mode detection ([@andrewsmith])([#183]).
|
||||
- Refactor parser to fix parsing inconsistencies ([@bbc2])([#170]).
|
||||
- Interpret escapes as control characters only in double-quoted strings.
|
||||
- Interpret `#` as start of comment only if preceded by whitespace.
|
||||
|
||||
## 0.10.2
|
||||
|
||||
- Add type hints and expose them to users ([@qnighy])([#172])
|
||||
- `load_dotenv` and `dotenv_values` now accept an `encoding` parameter, defaults to `None`
|
||||
([@theskumar])([@earlbread])([#161])
|
||||
- Fix `str`/`unicode` inconsistency in Python 2: values are always `str` now. ([@bbc2])([#121])
|
||||
- Fix Unicode error in Python 2, introduced in 0.10.0. ([@bbc2])([#176])
|
||||
|
||||
## 0.10.1
|
||||
- Fix parsing of variable without a value ([@asyncee])([@bbc2])([#158])
|
||||
|
||||
## 0.10.0
|
||||
|
||||
- Add support for UTF-8 in unquoted values ([@bbc2])([#148])
|
||||
- Add support for trailing comments ([@bbc2])([#148])
|
||||
- Add backslashes support in values ([@bbc2])([#148])
|
||||
- Add support for newlines in values ([@bbc2])([#148])
|
||||
- Force environment variables to str with Python2 on Windows ([@greyli])
|
||||
- Drop Python 3.3 support ([@greyli])
|
||||
- Fix stderr/-out/-in redirection ([@venthur])
|
||||
|
||||
|
||||
## 0.9.0
|
||||
|
||||
- Add `--version` parameter to cli ([@venthur])
|
||||
- Enable loading from current directory ([@cjauvin])
|
||||
- Add 'dotenv run' command for calling arbitrary shell script with .env ([@venthur])
|
||||
|
||||
## 0.8.1
|
||||
|
||||
- Add tests for docs ([@Flimm])
|
||||
- Make 'cli' support optional. Use `pip install python-dotenv[cli]`. ([@theskumar])
|
||||
|
||||
## 0.8.0
|
||||
|
||||
- `set_key` and `unset_key` only modified the affected file instead of
|
||||
parsing and re-writing file, this causes comments and other file
|
||||
entact as it is.
|
||||
- Add support for `export` prefix in the line.
|
||||
- Internal refractoring ([@theskumar])
|
||||
- Allow `load_dotenv` and `dotenv_values` to work with `StringIO())` ([@alanjds])([@theskumar])([#78])
|
||||
|
||||
## 0.7.1
|
||||
|
||||
- Remove hard dependency on iPython ([@theskumar])
|
||||
|
||||
## 0.7.0
|
||||
|
||||
- Add support to override system environment variable via .env.
|
||||
([@milonimrod](https://github.com/milonimrod))
|
||||
([\#63](https://github.com/theskumar/python-dotenv/issues/63))
|
||||
- Disable ".env not found" warning by default
|
||||
([@maxkoryukov](https://github.com/maxkoryukov))
|
||||
([\#57](https://github.com/theskumar/python-dotenv/issues/57))
|
||||
|
||||
## 0.6.5
|
||||
|
||||
- Add support for special characters `\`.
|
||||
([@pjona](https://github.com/pjona))
|
||||
([\#60](https://github.com/theskumar/python-dotenv/issues/60))
|
||||
|
||||
## 0.6.4
|
||||
|
||||
- Fix issue with single quotes ([@Flimm])
|
||||
([\#52](https://github.com/theskumar/python-dotenv/issues/52))
|
||||
|
||||
## 0.6.3
|
||||
|
||||
- Handle unicode exception in setup.py
|
||||
([\#46](https://github.com/theskumar/python-dotenv/issues/46))
|
||||
|
||||
## 0.6.2
|
||||
|
||||
- Fix dotenv list command ([@ticosax](https://github.com/ticosax))
|
||||
- Add iPython Support
|
||||
([@tillahoffmann](https://github.com/tillahoffmann))
|
||||
|
||||
## 0.6.0
|
||||
|
||||
- Drop support for Python 2.6
|
||||
- Handle escaped characters and newlines in quoted values. (Thanks
|
||||
[@iameugenejo](https://github.com/iameugenejo))
|
||||
- Remove any spaces around unquoted key/value. (Thanks
|
||||
[@paulochf](https://github.com/paulochf))
|
||||
- Added POSIX variable expansion. (Thanks
|
||||
[@hugochinchilla](https://github.com/hugochinchilla))
|
||||
|
||||
## 0.5.1
|
||||
|
||||
- Fix `find_dotenv` - it now start search from the file where this
|
||||
function is called from.
|
||||
|
||||
## 0.5.0
|
||||
|
||||
- Add `find_dotenv` method that will try to find a `.env` file.
|
||||
(Thanks [@isms](https://github.com/isms))
|
||||
|
||||
## 0.4.0
|
||||
|
||||
- cli: Added `-q/--quote` option to control the behaviour of quotes
|
||||
around values in `.env`. (Thanks
|
||||
[@hugochinchilla](https://github.com/hugochinchilla)).
|
||||
- Improved test coverage.
|
||||
|
||||
<!-- PR LINKS -->
|
||||
[#78]: https://github.com/theskumar/python-dotenv/issues/78
|
||||
[#121]: https://github.com/theskumar/python-dotenv/issues/121
|
||||
[#148]: https://github.com/theskumar/python-dotenv/issues/148
|
||||
[#158]: https://github.com/theskumar/python-dotenv/issues/158
|
||||
[#170]: https://github.com/theskumar/python-dotenv/issues/170
|
||||
[#172]: https://github.com/theskumar/python-dotenv/issues/172
|
||||
[#176]: https://github.com/theskumar/python-dotenv/issues/176
|
||||
[#183]: https://github.com/theskumar/python-dotenv/issues/183
|
||||
[#359]: https://github.com/theskumar/python-dotenv/issues/359
|
||||
[#469]: https://github.com/theskumar/python-dotenv/issues/469
|
||||
[#456]: https://github.com/theskumar/python-dotenv/issues/456
|
||||
[#466]: https://github.com/theskumar/python-dotenv/issues/466
|
||||
[#454]: https://github.com/theskumar/python-dotenv/issues/454
|
||||
[#474]: https://github.com/theskumar/python-dotenv/issues/474
|
||||
[#523]: https://github.com/theskumar/python-dotenv/issues/523
|
||||
[#553]: https://github.com/theskumar/python-dotenv/issues/553
|
||||
[#569]: https://github.com/theskumar/python-dotenv/issues/569
|
||||
[#583]: https://github.com/theskumar/python-dotenv/issues/583
|
||||
[#586]: https://github.com/theskumar/python-dotenv/issues/586
|
||||
|
||||
<!-- contributors -->
|
||||
[@23f3001135]: https://github.com/23f3001135
|
||||
[@EpicWink]: https://github.com/EpicWink
|
||||
[@Flimm]: https://github.com/Flimm
|
||||
[@Nicals]: https://github.com/Nicals
|
||||
[@Nougat-Waffle]: https://github.com/Nougat-Waffle
|
||||
[@Qwerty-133]: https://github.com/Qwerty-133
|
||||
[@alanjds]: https://github.com/alanjds
|
||||
[@altendky]: https://github.com/altendky
|
||||
[@andrewsmith]: https://github.com/andrewsmith
|
||||
[@asyncee]: https://github.com/asyncee
|
||||
[@bbc2]: https://github.com/bbc2
|
||||
[@befeleme]: https://github.com/befeleme
|
||||
[@cjauvin]: https://github.com/cjauvin
|
||||
[@eaf]: https://github.com/eaf
|
||||
[@earlbread]: https://github.com/earlbread
|
||||
[@eekstunt]: https://github.com/eekstunt
|
||||
[@eggplants]: https://github.com/@eggplants
|
||||
[@ekohl]: https://github.com/ekohl
|
||||
[@elbehery95]: https://github.com/elbehery95
|
||||
[@eumiro]: https://github.com/eumiro
|
||||
[@freddyaboulton]: https://github.com/freddyaboulton
|
||||
[@gergelyk]: https://github.com/gergelyk
|
||||
[@gongqingkui]: https://github.com/gongqingkui
|
||||
[@greyli]: https://github.com/greyli
|
||||
[@harveer07]: https://github.com/@harveer07
|
||||
[@jadutter]: https://github.com/jadutter
|
||||
[@jankislinger]: https://github.com/jankislinger
|
||||
[@jctanner]: https://github.com/jctanner
|
||||
[@larsks]: https://github.com/@larsks
|
||||
[@lsmith77]: https://github.com/lsmith77
|
||||
[@matthewfranglen]: https://github.com/matthewfranglen
|
||||
[@mgorny]: https://github.com/mgorny
|
||||
[@naorlivne]: https://github.com/@naorlivne
|
||||
[@qnighy]: https://github.com/qnighy
|
||||
[@rabinadk1]: https://github.com/@rabinadk1
|
||||
[@randomseed42]: https://github.com/zueve
|
||||
[@sammck]: https://github.com/@sammck
|
||||
[@samwyma]: https://github.com/samwyma
|
||||
[@sidharth-sudhir]: https://github.com/sidharth-sudhir
|
||||
[@snobu]: https://github.com/snobu
|
||||
[@techalchemy]: https://github.com/techalchemy
|
||||
[@theGOTOguy]: https://github.com/theGOTOguy
|
||||
[@theskumar]: https://github.com/theskumar
|
||||
[@ulyssessouza]: https://github.com/ulyssessouza
|
||||
[@venthur]: https://github.com/venthur
|
||||
[@wrongontheinternet]: https://github.com/wrongontheinternet
|
||||
[@x-yuri]: https://github.com/x-yuri
|
||||
[@yannham]: https://github.com/yannham
|
||||
[@zueve]: https://github.com/zueve
|
||||
|
||||
[Unreleased]: https://github.com/theskumar/python-dotenv/compare/v1.2.0...HEAD
|
||||
[1.2.0]: https://github.com/theskumar/python-dotenv/compare/v1.1.1...v1.2.0
|
||||
[1.1.1]: https://github.com/theskumar/python-dotenv/compare/v1.1.0...v1.1.1
|
||||
[1.1.0]: https://github.com/theskumar/python-dotenv/compare/v1.0.1...v1.1.0
|
||||
[1.0.1]: https://github.com/theskumar/python-dotenv/compare/v1.0.0...v1.0.1
|
||||
[1.0.0]: https://github.com/theskumar/python-dotenv/compare/v0.21.0...v1.0.0
|
||||
[0.21.1]: https://github.com/theskumar/python-dotenv/compare/v0.21.0...v0.21.1
|
||||
[0.21.0]: https://github.com/theskumar/python-dotenv/compare/v0.20.0...v0.21.0
|
||||
[0.20.0]: https://github.com/theskumar/python-dotenv/compare/v0.19.2...v0.20.0
|
||||
[0.19.2]: https://github.com/theskumar/python-dotenv/compare/v0.19.1...v0.19.2
|
||||
[0.19.1]: https://github.com/theskumar/python-dotenv/compare/v0.19.0...v0.19.1
|
||||
[0.19.0]: https://github.com/theskumar/python-dotenv/compare/v0.18.0...v0.19.0
|
||||
[0.18.0]: https://github.com/theskumar/python-dotenv/compare/v0.17.1...v0.18.0
|
||||
[0.17.1]: https://github.com/theskumar/python-dotenv/compare/v0.17.0...v0.17.1
|
||||
[0.17.0]: https://github.com/theskumar/python-dotenv/compare/v0.16.0...v0.17.0
|
||||
[0.16.0]: https://github.com/theskumar/python-dotenv/compare/v0.15.0...v0.16.0
|
||||
[0.15.0]: https://github.com/theskumar/python-dotenv/compare/v0.14.0...v0.15.0
|
||||
[0.14.0]: https://github.com/theskumar/python-dotenv/compare/v0.13.0...v0.14.0
|
||||
[0.13.0]: https://github.com/theskumar/python-dotenv/compare/v0.12.0...v0.13.0
|
||||
[0.12.0]: https://github.com/theskumar/python-dotenv/compare/v0.11.0...v0.12.0
|
||||
[0.11.0]: https://github.com/theskumar/python-dotenv/compare/v0.10.5...v0.11.0
|
||||
[0.10.5]: https://github.com/theskumar/python-dotenv/compare/v0.10.4...v0.10.5
|
||||
[0.10.4]: https://github.com/theskumar/python-dotenv/compare/v0.10.3...v0.10.4
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,123 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: beautifulsoup4
|
||||
Version: 4.14.3
|
||||
Summary: Screen-scraping library
|
||||
Project-URL: Download, https://www.crummy.com/software/BeautifulSoup/bs4/download/
|
||||
Project-URL: Homepage, https://www.crummy.com/software/BeautifulSoup/bs4/
|
||||
Author-email: Leonard Richardson <leonardr@segfault.org>
|
||||
License: MIT License
|
||||
License-File: AUTHORS
|
||||
License-File: LICENSE
|
||||
Keywords: HTML,XML,parse,soup
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: MIT License
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Classifier: Topic :: Text Processing :: Markup :: HTML
|
||||
Classifier: Topic :: Text Processing :: Markup :: SGML
|
||||
Classifier: Topic :: Text Processing :: Markup :: XML
|
||||
Requires-Python: >=3.7.0
|
||||
Requires-Dist: soupsieve>=1.6.1
|
||||
Requires-Dist: typing-extensions>=4.0.0
|
||||
Provides-Extra: cchardet
|
||||
Requires-Dist: cchardet; extra == 'cchardet'
|
||||
Provides-Extra: chardet
|
||||
Requires-Dist: chardet; extra == 'chardet'
|
||||
Provides-Extra: charset-normalizer
|
||||
Requires-Dist: charset-normalizer; extra == 'charset-normalizer'
|
||||
Provides-Extra: html5lib
|
||||
Requires-Dist: html5lib; extra == 'html5lib'
|
||||
Provides-Extra: lxml
|
||||
Requires-Dist: lxml; extra == 'lxml'
|
||||
Description-Content-Type: text/markdown
|
||||
|
||||
Beautiful Soup is a library that makes it easy to scrape information
|
||||
from web pages. It sits atop an HTML or XML parser, providing Pythonic
|
||||
idioms for iterating, searching, and modifying the parse tree.
|
||||
|
||||
# Quick start
|
||||
|
||||
```
|
||||
>>> from bs4 import BeautifulSoup
|
||||
>>> soup = BeautifulSoup("<p>Some<b>bad<i>HTML")
|
||||
>>> print(soup.prettify())
|
||||
<html>
|
||||
<body>
|
||||
<p>
|
||||
Some
|
||||
<b>
|
||||
bad
|
||||
<i>
|
||||
HTML
|
||||
</i>
|
||||
</b>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
>>> soup.find(string="bad")
|
||||
'bad'
|
||||
>>> soup.i
|
||||
<i>HTML</i>
|
||||
#
|
||||
>>> soup = BeautifulSoup("<tag1>Some<tag2/>bad<tag3>XML", "xml")
|
||||
#
|
||||
>>> print(soup.prettify())
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<tag1>
|
||||
Some
|
||||
<tag2/>
|
||||
bad
|
||||
<tag3>
|
||||
XML
|
||||
</tag3>
|
||||
</tag1>
|
||||
```
|
||||
|
||||
To go beyond the basics, [comprehensive documentation is available](https://www.crummy.com/software/BeautifulSoup/bs4/doc/).
|
||||
|
||||
# Links
|
||||
|
||||
* [Homepage](https://www.crummy.com/software/BeautifulSoup/bs4/)
|
||||
* [Documentation](https://www.crummy.com/software/BeautifulSoup/bs4/doc/)
|
||||
* [Discussion group](https://groups.google.com/group/beautifulsoup/)
|
||||
* [Development](https://code.launchpad.net/beautifulsoup/)
|
||||
* [Bug tracker](https://bugs.launchpad.net/beautifulsoup/)
|
||||
* [Complete changelog](https://git.launchpad.net/beautifulsoup/tree/CHANGELOG)
|
||||
|
||||
# Note on Python 2 sunsetting
|
||||
|
||||
Beautiful Soup's support for Python 2 was discontinued on December 31,
|
||||
2020: one year after the sunset date for Python 2 itself. From this
|
||||
point onward, new Beautiful Soup development will exclusively target
|
||||
Python 3. The final release of Beautiful Soup 4 to support Python 2
|
||||
was 4.9.3.
|
||||
|
||||
# Supporting the project
|
||||
|
||||
If you use Beautiful Soup as part of your professional work, please consider a
|
||||
[Tidelift subscription](https://tidelift.com/subscription/pkg/pypi-beautifulsoup4?utm_source=pypi-beautifulsoup4&utm_medium=referral&utm_campaign=readme).
|
||||
This will support many of the free software projects your organization
|
||||
depends on, not just Beautiful Soup.
|
||||
|
||||
If you use Beautiful Soup for personal projects, the best way to say
|
||||
thank you is to read
|
||||
[Tool Safety](https://www.crummy.com/software/BeautifulSoup/zine/), a zine I
|
||||
wrote about what Beautiful Soup has taught me about software
|
||||
development.
|
||||
|
||||
# Building the documentation
|
||||
|
||||
The bs4/doc/ directory contains full documentation in Sphinx
|
||||
format. Run `make html` in that directory to create HTML
|
||||
documentation.
|
||||
|
||||
# Running the unit tests
|
||||
|
||||
Beautiful Soup supports unit test discovery using Pytest:
|
||||
|
||||
```
|
||||
$ pytest
|
||||
```
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,117 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: greenlet
|
||||
Version: 3.3.0
|
||||
Summary: Lightweight in-process concurrent programming
|
||||
Home-page: https://greenlet.readthedocs.io/
|
||||
Author: Alexey Borzenkov
|
||||
Author-email: snaury@gmail.com
|
||||
Maintainer: Jason Madden
|
||||
Maintainer-email: jason@seecoresoftware.com
|
||||
License: MIT AND Python-2.0
|
||||
Project-URL: Bug Tracker, https://github.com/python-greenlet/greenlet/issues
|
||||
Project-URL: Source Code, https://github.com/python-greenlet/greenlet/
|
||||
Project-URL: Documentation, https://greenlet.readthedocs.io/
|
||||
Project-URL: Changes, https://greenlet.readthedocs.io/en/latest/changes.html
|
||||
Keywords: greenlet coroutine concurrency threads cooperative
|
||||
Platform: any
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: Natural Language :: English
|
||||
Classifier: Programming Language :: C
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3 :: Only
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Programming Language :: Python :: 3.14
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Requires-Python: >=3.10
|
||||
Description-Content-Type: text/x-rst
|
||||
License-File: LICENSE
|
||||
License-File: LICENSE.PSF
|
||||
Provides-Extra: docs
|
||||
Requires-Dist: Sphinx; extra == "docs"
|
||||
Requires-Dist: furo; extra == "docs"
|
||||
Provides-Extra: test
|
||||
Requires-Dist: objgraph; extra == "test"
|
||||
Requires-Dist: psutil; extra == "test"
|
||||
Requires-Dist: setuptools; extra == "test"
|
||||
Dynamic: author
|
||||
Dynamic: author-email
|
||||
Dynamic: classifier
|
||||
Dynamic: description
|
||||
Dynamic: description-content-type
|
||||
Dynamic: home-page
|
||||
Dynamic: keywords
|
||||
Dynamic: license
|
||||
Dynamic: license-file
|
||||
Dynamic: maintainer
|
||||
Dynamic: maintainer-email
|
||||
Dynamic: platform
|
||||
Dynamic: project-url
|
||||
Dynamic: provides-extra
|
||||
Dynamic: requires-python
|
||||
Dynamic: summary
|
||||
|
||||
.. This file is included into docs/history.rst
|
||||
|
||||
|
||||
Greenlets are lightweight coroutines for in-process concurrent
|
||||
programming.
|
||||
|
||||
The "greenlet" package is a spin-off of `Stackless`_, a version of
|
||||
CPython that supports micro-threads called "tasklets". Tasklets run
|
||||
pseudo-concurrently (typically in a single or a few OS-level threads)
|
||||
and are synchronized with data exchanges on "channels".
|
||||
|
||||
A "greenlet", on the other hand, is a still more primitive notion of
|
||||
micro-thread with no implicit scheduling; coroutines, in other words.
|
||||
This is useful when you want to control exactly when your code runs.
|
||||
You can build custom scheduled micro-threads on top of greenlet;
|
||||
however, it seems that greenlets are useful on their own as a way to
|
||||
make advanced control flow structures. For example, we can recreate
|
||||
generators; the difference with Python's own generators is that our
|
||||
generators can call nested functions and the nested functions can
|
||||
yield values too. (Additionally, you don't need a "yield" keyword. See
|
||||
the example in `test_generator.py
|
||||
<https://github.com/python-greenlet/greenlet/blob/adca19bf1f287b3395896a8f41f3f4fd1797fdc7/src/greenlet/tests/test_generator.py#L1>`_).
|
||||
|
||||
Greenlets are provided as a C extension module for the regular unmodified
|
||||
interpreter.
|
||||
|
||||
.. _`Stackless`: http://www.stackless.com
|
||||
|
||||
|
||||
Who is using Greenlet?
|
||||
======================
|
||||
|
||||
There are several libraries that use Greenlet as a more flexible
|
||||
alternative to Python's built in coroutine support:
|
||||
|
||||
- `Concurrence`_
|
||||
- `Eventlet`_
|
||||
- `Gevent`_
|
||||
|
||||
.. _Concurrence: http://opensource.hyves.org/concurrence/
|
||||
.. _Eventlet: http://eventlet.net/
|
||||
.. _Gevent: http://www.gevent.org/
|
||||
|
||||
Getting Greenlet
|
||||
================
|
||||
|
||||
The easiest way to get Greenlet is to install it with pip::
|
||||
|
||||
pip install greenlet
|
||||
|
||||
|
||||
Source code archives and binary distributions are available on the
|
||||
python package index at https://pypi.org/project/greenlet
|
||||
|
||||
The source code repository is hosted on github:
|
||||
https://github.com/python-greenlet/greenlet
|
||||
|
||||
Documentation is available on readthedocs.org:
|
||||
https://greenlet.readthedocs.io
|
||||
Binary file not shown.
@@ -0,0 +1,209 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: idna
|
||||
Version: 3.11
|
||||
Summary: Internationalized Domain Names in Applications (IDNA)
|
||||
Author-email: Kim Davies <kim+pypi@gumleaf.org>
|
||||
Requires-Python: >=3.8
|
||||
Description-Content-Type: text/x-rst
|
||||
License-Expression: BSD-3-Clause
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: Intended Audience :: System Administrators
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3 :: Only
|
||||
Classifier: Programming Language :: Python :: 3.8
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Programming Language :: Python :: 3.14
|
||||
Classifier: Programming Language :: Python :: Implementation :: CPython
|
||||
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
||||
Classifier: Topic :: Internet :: Name Service (DNS)
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Classifier: Topic :: Utilities
|
||||
License-File: LICENSE.md
|
||||
Requires-Dist: ruff >= 0.6.2 ; extra == "all"
|
||||
Requires-Dist: mypy >= 1.11.2 ; extra == "all"
|
||||
Requires-Dist: pytest >= 8.3.2 ; extra == "all"
|
||||
Requires-Dist: flake8 >= 7.1.1 ; extra == "all"
|
||||
Project-URL: Changelog, https://github.com/kjd/idna/blob/master/HISTORY.rst
|
||||
Project-URL: Issue tracker, https://github.com/kjd/idna/issues
|
||||
Project-URL: Source, https://github.com/kjd/idna
|
||||
Provides-Extra: all
|
||||
|
||||
Internationalized Domain Names in Applications (IDNA)
|
||||
=====================================================
|
||||
|
||||
Support for `Internationalized Domain Names in
|
||||
Applications (IDNA) <https://tools.ietf.org/html/rfc5891>`_
|
||||
and `Unicode IDNA Compatibility Processing
|
||||
<https://unicode.org/reports/tr46/>`_.
|
||||
|
||||
The latest versions of these standards supplied here provide
|
||||
more comprehensive language coverage and reduce the potential of
|
||||
allowing domains with known security vulnerabilities. This library
|
||||
is a suitable replacement for the “encodings.idna”
|
||||
module that comes with the Python standard library, but which
|
||||
only supports an older superseded IDNA specification from 2003.
|
||||
|
||||
Basic functions are simply executed:
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> import idna
|
||||
>>> idna.encode('ドメイン.テスト')
|
||||
b'xn--eckwd4c7c.xn--zckzah'
|
||||
>>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
|
||||
ドメイン.テスト
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
This package is available for installation from PyPI via the
|
||||
typical mechanisms, such as:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ python3 -m pip install idna
|
||||
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
For typical usage, the ``encode`` and ``decode`` functions will take a
|
||||
domain name argument and perform a conversion to ASCII compatible encoding
|
||||
(known as A-labels), or to Unicode strings (known as U-labels)
|
||||
respectively.
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> import idna
|
||||
>>> idna.encode('ドメイン.テスト')
|
||||
b'xn--eckwd4c7c.xn--zckzah'
|
||||
>>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
|
||||
ドメイン.テスト
|
||||
|
||||
Conversions can be applied at a per-label basis using the ``ulabel`` or
|
||||
``alabel`` functions if necessary:
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> idna.alabel('测试')
|
||||
b'xn--0zwm56d'
|
||||
|
||||
|
||||
Compatibility Mapping (UTS #46)
|
||||
+++++++++++++++++++++++++++++++
|
||||
|
||||
This library provides support for `Unicode IDNA Compatibility
|
||||
Processing <https://unicode.org/reports/tr46/>`_ which normalizes input from
|
||||
different potential ways a user may input a domain prior to performing the IDNA
|
||||
conversion operations. This functionality, known as a
|
||||
`mapping <https://tools.ietf.org/html/rfc5895>`_, is considered by the
|
||||
specification to be a local user-interface issue distinct from IDNA
|
||||
conversion functionality.
|
||||
|
||||
For example, “Königsgäßchen” is not a permissible label as *LATIN
|
||||
CAPITAL LETTER K* is not allowed (nor are capital letters in general).
|
||||
UTS 46 will convert this into lower case prior to applying the IDNA
|
||||
conversion.
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> import idna
|
||||
>>> idna.encode('Königsgäßchen')
|
||||
...
|
||||
idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed
|
||||
>>> idna.encode('Königsgäßchen', uts46=True)
|
||||
b'xn--knigsgchen-b4a3dun'
|
||||
>>> print(idna.decode('xn--knigsgchen-b4a3dun'))
|
||||
königsgäßchen
|
||||
|
||||
|
||||
Exceptions
|
||||
----------
|
||||
|
||||
All errors raised during the conversion following the specification
|
||||
should raise an exception derived from the ``idna.IDNAError`` base
|
||||
class.
|
||||
|
||||
More specific exceptions that may be generated as ``idna.IDNABidiError``
|
||||
when the error reflects an illegal combination of left-to-right and
|
||||
right-to-left characters in a label; ``idna.InvalidCodepoint`` when
|
||||
a specific codepoint is an illegal character in an IDN label (i.e.
|
||||
INVALID); and ``idna.InvalidCodepointContext`` when the codepoint is
|
||||
illegal based on its position in the string (i.e. it is CONTEXTO or CONTEXTJ
|
||||
but the contextual requirements are not satisfied.)
|
||||
|
||||
Building and Diagnostics
|
||||
------------------------
|
||||
|
||||
The IDNA and UTS 46 functionality relies upon pre-calculated lookup
|
||||
tables for performance. These tables are derived from computing against
|
||||
eligibility criteria in the respective standards using the command-line
|
||||
script ``tools/idna-data``.
|
||||
|
||||
This tool will fetch relevant codepoint data from the Unicode repository
|
||||
and perform the required calculations to identify eligibility. There are
|
||||
three main modes:
|
||||
|
||||
* ``idna-data make-libdata``. Generates ``idnadata.py`` and
|
||||
``uts46data.py``, the pre-calculated lookup tables used for IDNA and
|
||||
UTS 46 conversions. Implementers who wish to track this library against
|
||||
a different Unicode version may use this tool to manually generate a
|
||||
different version of the ``idnadata.py`` and ``uts46data.py`` files.
|
||||
|
||||
* ``idna-data make-table``. Generate a table of the IDNA disposition
|
||||
(e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix
|
||||
B.1 of RFC 5892 and the pre-computed tables published by `IANA
|
||||
<https://www.iana.org/>`_.
|
||||
|
||||
* ``idna-data U+0061``. Prints debugging output on the various
|
||||
properties associated with an individual Unicode codepoint (in this
|
||||
case, U+0061), that are used to assess the IDNA and UTS 46 status of a
|
||||
codepoint. This is helpful in debugging or analysis.
|
||||
|
||||
The tool accepts a number of arguments, described using ``idna-data
|
||||
-h``. Most notably, the ``--version`` argument allows the specification
|
||||
of the version of Unicode to be used in computing the table data. For
|
||||
example, ``idna-data --version 9.0.0 make-libdata`` will generate
|
||||
library data against Unicode 9.0.0.
|
||||
|
||||
|
||||
Additional Notes
|
||||
----------------
|
||||
|
||||
* **Packages**. The latest tagged release version is published in the
|
||||
`Python Package Index <https://pypi.org/project/idna/>`_.
|
||||
|
||||
* **Version support**. This library supports Python 3.8 and higher.
|
||||
As this library serves as a low-level toolkit for a variety of
|
||||
applications, many of which strive for broad compatibility with older
|
||||
Python versions, there is no rush to remove older interpreter support.
|
||||
Support for older versions are likely to be removed from new releases
|
||||
as automated tests can no longer easily be run, i.e. once the Python
|
||||
version is officially end-of-life.
|
||||
|
||||
* **Testing**. The library has a test suite based on each rule of the
|
||||
IDNA specification, as well as tests that are provided as part of the
|
||||
Unicode Technical Standard 46, `Unicode IDNA Compatibility Processing
|
||||
<https://unicode.org/reports/tr46/>`_.
|
||||
|
||||
* **Emoji**. It is an occasional request to support emoji domains in
|
||||
this library. Encoding of symbols like emoji is expressly prohibited by
|
||||
the technical standard IDNA 2008 and emoji domains are broadly phased
|
||||
out across the domain industry due to associated security risks. For
|
||||
now, applications that need to support these non-compliant labels
|
||||
may wish to consider trying the encode/decode operation in this library
|
||||
first, and then falling back to using `encodings.idna`. See `the Github
|
||||
project <https://github.com/kjd/idna/issues/18>`_ for more discussion.
|
||||
|
||||
* **Transitional processing**. Unicode 16.0.0 removed transitional
|
||||
processing so the `transitional` argument for the encode() method
|
||||
no longer has any effect and will be removed at a later date.
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,115 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: soupsieve
|
||||
Version: 2.8.3
|
||||
Summary: A modern CSS selector implementation for Beautiful Soup.
|
||||
Project-URL: Homepage, https://github.com/facelessuser/soupsieve
|
||||
Author-email: Isaac Muse <Isaac.Muse@gmail.com>
|
||||
License-Expression: MIT
|
||||
License-File: LICENSE.md
|
||||
Keywords: CSS,HTML,XML,filter,query,selector,soup
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Environment :: Console
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: MIT License
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Programming Language :: Python :: 3.14
|
||||
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Classifier: Typing :: Typed
|
||||
Requires-Python: >=3.9
|
||||
Description-Content-Type: text/markdown
|
||||
|
||||
[![Donate via PayPal][donate-image]][donate-link]
|
||||
[![Build][github-ci-image]][github-ci-link]
|
||||
[![Coverage Status][codecov-image]][codecov-link]
|
||||
[![PyPI Version][pypi-image]][pypi-link]
|
||||
[![PyPI Downloads][pypi-down]][pypi-link]
|
||||
[![PyPI - Python Version][python-image]][pypi-link]
|
||||
[![License][license-image-mit]][license-link]
|
||||
|
||||
# Soup Sieve
|
||||
|
||||
## Overview
|
||||
|
||||
Soup Sieve is a CSS selector library designed to be used with [Beautiful Soup 4][bs4]. It aims to provide selecting,
|
||||
matching, and filtering using modern CSS selectors. Soup Sieve currently provides selectors from the CSS level 1
|
||||
specifications up through the latest CSS level 4 drafts and beyond (though some are not yet implemented).
|
||||
|
||||
Soup Sieve was written with the intent to replace Beautiful Soup's builtin select feature, and as of Beautiful Soup
|
||||
version 4.7.0, it now is :confetti_ball:. Soup Sieve can also be imported in order to use its API directly for
|
||||
more controlled, specialized parsing.
|
||||
|
||||
Soup Sieve has implemented most of the CSS selectors up through the latest CSS draft specifications, though there are a
|
||||
number that don't make sense in a non-browser environment. Selectors that cannot provide meaningful functionality simply
|
||||
do not match anything. Some of the supported selectors are:
|
||||
|
||||
- `.classes`
|
||||
- `#ids`
|
||||
- `[attributes=value]`
|
||||
- `parent child`
|
||||
- `parent > child`
|
||||
- `sibling ~ sibling`
|
||||
- `sibling + sibling`
|
||||
- `:not(element.class, element2.class)`
|
||||
- `:is(element.class, element2.class)`
|
||||
- `parent:has(> child)`
|
||||
- and [many more](https://facelessuser.github.io/soupsieve/selectors/)
|
||||
|
||||
|
||||
## Installation
|
||||
|
||||
You must have Beautiful Soup already installed:
|
||||
|
||||
```
|
||||
pip install beautifulsoup4
|
||||
```
|
||||
|
||||
In most cases, assuming you've installed version 4.7.0, that should be all you need to do, but if you've installed via
|
||||
some alternative method, and Soup Sieve is not automatically installed, you can install it directly:
|
||||
|
||||
```
|
||||
pip install soupsieve
|
||||
```
|
||||
|
||||
If you want to manually install it from source, first ensure that [`build`](https://pypi.org/project/build/) is
|
||||
installed:
|
||||
|
||||
```
|
||||
pip install build
|
||||
```
|
||||
|
||||
Then navigate to the root of the project and build the wheel and install (replacing `<ver>` with the current version):
|
||||
|
||||
```
|
||||
python -m build -w
|
||||
pip install dist/soupsieve-<ver>-py3-none-any.whl
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
Documentation is found here: https://facelessuser.github.io/soupsieve/.
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
|
||||
[bs4]: https://beautiful-soup-4.readthedocs.io/en/latest/#
|
||||
|
||||
[github-ci-image]: https://github.com/facelessuser/soupsieve/workflows/build/badge.svg
|
||||
[github-ci-link]: https://github.com/facelessuser/soupsieve/actions?query=workflow%3Abuild+branch%3Amain
|
||||
[codecov-image]: https://img.shields.io/codecov/c/github/facelessuser/soupsieve/master.svg?logo=codecov&logoColor=aaaaaa&labelColor=333333
|
||||
[codecov-link]: https://codecov.io/github/facelessuser/soupsieve
|
||||
[pypi-image]: https://img.shields.io/pypi/v/soupsieve.svg?logo=pypi&logoColor=aaaaaa&labelColor=333333
|
||||
[pypi-down]: https://img.shields.io/pypi/dm/soupsieve.svg?logo=pypi&logoColor=aaaaaa&labelColor=333333
|
||||
[pypi-link]: https://pypi.python.org/pypi/soupsieve
|
||||
[python-image]: https://img.shields.io/pypi/pyversions/soupsieve?logo=python&logoColor=aaaaaa&labelColor=333333
|
||||
[license-image-mit]: https://img.shields.io/badge/license-MIT-blue.svg?labelColor=333333
|
||||
[license-link]: https://github.com/facelessuser/soupsieve/blob/main/LICENSE.md
|
||||
[donate-image]: https://img.shields.io/badge/Donate-PayPal-3fabd1?logo=paypal
|
||||
[donate-link]: https://www.paypal.me/facelessuser
|
||||
Binary file not shown.
@@ -0,0 +1,131 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: asyncpg
|
||||
Version: 0.31.0
|
||||
Summary: An asyncio PostgreSQL driver
|
||||
Author-email: MagicStack Inc <hello@magic.io>
|
||||
License-Expression: Apache-2.0
|
||||
Project-URL: github, https://github.com/MagicStack/asyncpg
|
||||
Keywords: database,postgres
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Framework :: AsyncIO
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: Operating System :: POSIX
|
||||
Classifier: Operating System :: MacOS :: MacOS X
|
||||
Classifier: Operating System :: Microsoft :: Windows
|
||||
Classifier: Programming Language :: Python :: 3 :: Only
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Programming Language :: Python :: 3.14
|
||||
Classifier: Programming Language :: Python :: Implementation :: CPython
|
||||
Classifier: Programming Language :: Python :: Free Threading :: 2 - Beta
|
||||
Classifier: Topic :: Database :: Front-Ends
|
||||
Requires-Python: >=3.9.0
|
||||
Description-Content-Type: text/x-rst
|
||||
License-File: LICENSE
|
||||
Requires-Dist: async_timeout>=4.0.3; python_version < "3.11.0"
|
||||
Provides-Extra: gssauth
|
||||
Requires-Dist: gssapi; platform_system != "Windows" and extra == "gssauth"
|
||||
Requires-Dist: sspilib; platform_system == "Windows" and extra == "gssauth"
|
||||
Dynamic: license-file
|
||||
|
||||
asyncpg -- A fast PostgreSQL Database Client Library for Python/asyncio
|
||||
=======================================================================
|
||||
|
||||
.. image:: https://github.com/MagicStack/asyncpg/workflows/Tests/badge.svg
|
||||
:target: https://github.com/MagicStack/asyncpg/actions?query=workflow%3ATests+branch%3Amaster
|
||||
:alt: GitHub Actions status
|
||||
.. image:: https://img.shields.io/pypi/v/asyncpg.svg
|
||||
:target: https://pypi.python.org/pypi/asyncpg
|
||||
|
||||
**asyncpg** is a database interface library designed specifically for
|
||||
PostgreSQL and Python/asyncio. asyncpg is an efficient, clean implementation
|
||||
of PostgreSQL server binary protocol for use with Python's ``asyncio``
|
||||
framework. You can read more about asyncpg in an introductory
|
||||
`blog post <http://magic.io/blog/asyncpg-1m-rows-from-postgres-to-python/>`_.
|
||||
|
||||
asyncpg requires Python 3.9 or later and is supported for PostgreSQL
|
||||
versions 9.5 to 18. Other PostgreSQL versions or other databases
|
||||
implementing the PostgreSQL protocol *may* work, but are not being
|
||||
actively tested.
|
||||
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
The project documentation can be found
|
||||
`here <https://magicstack.github.io/asyncpg/current/>`_.
|
||||
|
||||
|
||||
Performance
|
||||
-----------
|
||||
|
||||
In our testing asyncpg is, on average, **5x** faster than psycopg3.
|
||||
|
||||
.. image:: https://raw.githubusercontent.com/MagicStack/asyncpg/master/performance.png?fddca40ab0
|
||||
:target: https://gistpreview.github.io/?0ed296e93523831ea0918d42dd1258c2
|
||||
|
||||
The above results are a geometric mean of benchmarks obtained with PostgreSQL
|
||||
`client driver benchmarking toolbench <https://github.com/MagicStack/pgbench>`_
|
||||
in June 2023 (click on the chart to see full details).
|
||||
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
asyncpg implements PostgreSQL server protocol natively and exposes its
|
||||
features directly, as opposed to hiding them behind a generic facade
|
||||
like DB-API.
|
||||
|
||||
This enables asyncpg to have easy-to-use support for:
|
||||
|
||||
* **prepared statements**
|
||||
* **scrollable cursors**
|
||||
* **partial iteration** on query results
|
||||
* automatic encoding and decoding of composite types, arrays,
|
||||
and any combination of those
|
||||
* straightforward support for custom data types
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
asyncpg is available on PyPI. When not using GSSAPI/SSPI authentication it
|
||||
has no dependencies. Use pip to install::
|
||||
|
||||
$ pip install asyncpg
|
||||
|
||||
If you need GSSAPI/SSPI authentication, use::
|
||||
|
||||
$ pip install 'asyncpg[gssauth]'
|
||||
|
||||
For more details, please `see the documentation
|
||||
<https://magicstack.github.io/asyncpg/current/installation.html>`_.
|
||||
|
||||
|
||||
Basic Usage
|
||||
-----------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import asyncio
|
||||
import asyncpg
|
||||
|
||||
async def run():
|
||||
conn = await asyncpg.connect(user='user', password='password',
|
||||
database='database', host='127.0.0.1')
|
||||
values = await conn.fetch(
|
||||
'SELECT * FROM mytable WHERE id = $1',
|
||||
10,
|
||||
)
|
||||
await conn.close()
|
||||
|
||||
asyncio.run(run())
|
||||
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
asyncpg is developed and distributed under the Apache 2.0 license.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user