cleanup: delete extraneous report.txt file (#1587)
This appears to be an artifact of debugging when the circular reference
feature was being developed.
diff --git a/examples/pip_parse/report.txt b/examples/pip_parse/report.txt
deleted file mode 100644
index 26c0f85..0000000
--- a/examples/pip_parse/report.txt
+++ /dev/null
@@ -1,9681 +0,0 @@
-Collecting alembic==1.12.0 (from -r requirements_lock.txt (line 7))
- Using cached alembic-1.12.0-py3-none-any.whl (226 kB)
-Collecting annotated-types==0.6.0 (from -r requirements_lock.txt (line 11))
- Using cached annotated_types-0.6.0-py3-none-any.whl (12 kB)
-Collecting anyio==4.0.0 (from -r requirements_lock.txt (line 15))
- Using cached anyio-4.0.0-py3-none-any.whl (83 kB)
-Collecting apache-airflow==2.7.2 (from -r requirements_lock.txt (line 19))
- Using cached apache_airflow-2.7.2-py3-none-any.whl (12.9 MB)
-Collecting apache-airflow-providers-common-sql==1.8.0 (from -r requirements_lock.txt (line 29))
- Using cached apache_airflow_providers_common_sql-1.8.0-py3-none-any.whl (31 kB)
-Collecting apache-airflow-providers-ftp==3.6.0 (from -r requirements_lock.txt (line 35))
- Using cached apache_airflow_providers_ftp-3.6.0-py3-none-any.whl (18 kB)
-Collecting apache-airflow-providers-http==2.0.0 (from -r requirements_lock.txt (line 39))
- Using cached apache_airflow_providers_http-2.0.0-py3-none-any.whl (20 kB)
-Collecting apache-airflow-providers-imap==3.4.0 (from -r requirements_lock.txt (line 43))
- Using cached apache_airflow_providers_imap-3.4.0-py3-none-any.whl (17 kB)
-Collecting apache-airflow-providers-sqlite==3.5.0 (from -r requirements_lock.txt (line 47))
- Using cached apache_airflow_providers_sqlite-3.5.0-py3-none-any.whl (13 kB)
-Collecting apispec==6.3.0 (from apispec[yaml]==6.3.0->-r requirements_lock.txt (line 53))
- Using cached apispec-6.3.0-py3-none-any.whl (29 kB)
-Collecting argcomplete==3.1.2 (from -r requirements_lock.txt (line 57))
- Using cached argcomplete-3.1.2-py3-none-any.whl (41 kB)
-Collecting asgiref==3.7.2 (from -r requirements_lock.txt (line 61))
- Using cached asgiref-3.7.2-py3-none-any.whl (24 kB)
-Collecting attrs==23.1.0 (from -r requirements_lock.txt (line 65))
- Using cached attrs-23.1.0-py3-none-any.whl (61 kB)
-Collecting babel==2.13.1 (from -r requirements_lock.txt (line 73))
- Using cached Babel-2.13.1-py3-none-any.whl (10.1 MB)
-Collecting backoff==2.2.1 (from -r requirements_lock.txt (line 77))
- Using cached backoff-2.2.1-py3-none-any.whl (15 kB)
-Collecting blinker==1.6.3 (from -r requirements_lock.txt (line 84))
- Using cached blinker-1.6.3-py3-none-any.whl (13 kB)
-Collecting cachelib==0.9.0 (from -r requirements_lock.txt (line 88))
- Using cached cachelib-0.9.0-py3-none-any.whl (15 kB)
-Collecting cattrs==23.1.2 (from -r requirements_lock.txt (line 94))
- Using cached cattrs-23.1.2-py3-none-any.whl (50 kB)
-Collecting certifi==2022.12.7 (from -r requirements_lock.txt (line 98))
- Using cached certifi-2022.12.7-py3-none-any.whl (155 kB)
-Collecting cffi==1.16.0 (from -r requirements_lock.txt (line 105))
- Using cached cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (464 kB)
-Collecting chardet==4.0.0 (from -r requirements_lock.txt (line 159))
- Using cached chardet-4.0.0-py2.py3-none-any.whl (178 kB)
-Collecting click==8.1.7 (from -r requirements_lock.txt (line 163))
- Using cached click-8.1.7-py3-none-any.whl (97 kB)
-Collecting clickclick==20.10.2 (from -r requirements_lock.txt (line 170))
- Using cached clickclick-20.10.2-py2.py3-none-any.whl (7.4 kB)
-Collecting colorama==0.4.6 (from -r requirements_lock.txt (line 174))
- Using cached colorama-0.4.6-py2.py3-none-any.whl (25 kB)
-Collecting colorlog==4.8.0 (from -r requirements_lock.txt (line 178))
- Using cached colorlog-4.8.0-py2.py3-none-any.whl (10 kB)
-Collecting configupdater==3.1.1 (from -r requirements_lock.txt (line 182))
- Using cached ConfigUpdater-3.1.1-py2.py3-none-any.whl (34 kB)
-Collecting connexion==2.14.2 (from connexion[flask]==2.14.2->-r requirements_lock.txt (line 186))
- Using cached connexion-2.14.2-py2.py3-none-any.whl (95 kB)
-Collecting cron-descriptor==1.4.0 (from -r requirements_lock.txt (line 190))
- Using cached cron_descriptor-1.4.0.tar.gz (29 kB)
- Preparing metadata (setup.py): started
- Preparing metadata (setup.py): finished with status 'done'
-Collecting croniter==2.0.1 (from -r requirements_lock.txt (line 193))
- Using cached croniter-2.0.1-py2.py3-none-any.whl (19 kB)
-Collecting cryptography==41.0.4 (from -r requirements_lock.txt (line 197))
- Using cached cryptography-41.0.4-cp37-abi3-manylinux_2_28_x86_64.whl (4.4 MB)
-Collecting deprecated==1.2.14 (from -r requirements_lock.txt (line 222))
- Using cached Deprecated-1.2.14-py2.py3-none-any.whl (9.6 kB)
-Collecting dill==0.3.7 (from -r requirements_lock.txt (line 231))
- Using cached dill-0.3.7-py3-none-any.whl (115 kB)
-Collecting dnspython==2.4.2 (from -r requirements_lock.txt (line 235))
- Using cached dnspython-2.4.2-py3-none-any.whl (300 kB)
-Collecting docutils==0.20.1 (from -r requirements_lock.txt (line 239))
- Using cached docutils-0.20.1-py3-none-any.whl (572 kB)
-Collecting email-validator==1.3.1 (from -r requirements_lock.txt (line 243))
- Using cached email_validator-1.3.1-py2.py3-none-any.whl (22 kB)
-Collecting exceptiongroup==1.1.3 (from -r requirements_lock.txt (line 247))
- Using cached exceptiongroup-1.1.3-py3-none-any.whl (14 kB)
-Collecting flask==2.2.5 (from -r requirements_lock.txt (line 253))
- Using cached Flask-2.2.5-py3-none-any.whl (101 kB)
-Collecting flask-appbuilder==4.3.6 (from -r requirements_lock.txt (line 268))
- Using cached Flask_AppBuilder-4.3.6-py3-none-any.whl (1.7 MB)
-Collecting flask-babel==2.0.0 (from -r requirements_lock.txt (line 272))
- Using cached Flask_Babel-2.0.0-py3-none-any.whl (9.3 kB)
-Collecting flask-caching==2.1.0 (from -r requirements_lock.txt (line 276))
- Using cached Flask_Caching-2.1.0-py3-none-any.whl (28 kB)
-Collecting flask-jwt-extended==4.5.3 (from -r requirements_lock.txt (line 280))
- Using cached Flask_JWT_Extended-4.5.3-py2.py3-none-any.whl (22 kB)
-Collecting flask-limiter==3.5.0 (from -r requirements_lock.txt (line 284))
- Using cached Flask_Limiter-3.5.0-py3-none-any.whl (28 kB)
-Collecting flask-login==0.6.2 (from -r requirements_lock.txt (line 288))
- Using cached Flask_Login-0.6.2-py3-none-any.whl (17 kB)
-Collecting flask-session==0.5.0 (from -r requirements_lock.txt (line 294))
- Using cached flask_session-0.5.0-py3-none-any.whl (7.2 kB)
-Collecting flask-sqlalchemy==2.5.1 (from -r requirements_lock.txt (line 298))
- Using cached Flask_SQLAlchemy-2.5.1-py2.py3-none-any.whl (17 kB)
-Collecting flask-wtf==1.2.1 (from -r requirements_lock.txt (line 302))
- Using cached flask_wtf-1.2.1-py3-none-any.whl (12 kB)
-Collecting google-re2==1.1 (from -r requirements_lock.txt (line 308))
- Using cached google_re2-1.1-2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (513 kB)
-Collecting googleapis-common-protos==1.61.0 (from -r requirements_lock.txt (line 407))
- Using cached googleapis_common_protos-1.61.0-py2.py3-none-any.whl (230 kB)
-Collecting graphviz==0.20.1 (from -r requirements_lock.txt (line 413))
- Using cached graphviz-0.20.1-py3-none-any.whl (47 kB)
-Collecting greenlet==3.0.0 (from -r requirements_lock.txt (line 417))
- Using cached greenlet-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (616 kB)
-Collecting grpcio==1.59.0 (from -r requirements_lock.txt (line 481))
- Using cached grpcio-1.59.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.3 MB)
-Collecting gunicorn==21.2.0 (from -r requirements_lock.txt (line 537))
- Using cached gunicorn-21.2.0-py3-none-any.whl (80 kB)
-Collecting h11==0.14.0 (from -r requirements_lock.txt (line 541))
- Using cached h11-0.14.0-py3-none-any.whl (58 kB)
-Collecting httpcore==0.18.0 (from -r requirements_lock.txt (line 545))
- Using cached httpcore-0.18.0-py3-none-any.whl (76 kB)
-Collecting httpx==0.25.0 (from -r requirements_lock.txt (line 549))
- Using cached httpx-0.25.0-py3-none-any.whl (75 kB)
-Collecting idna==2.10 (from -r requirements_lock.txt (line 553))
- Using cached idna-2.10-py2.py3-none-any.whl (58 kB)
-Collecting importlib-metadata==6.8.0 (from -r requirements_lock.txt (line 561))
- Using cached importlib_metadata-6.8.0-py3-none-any.whl (22 kB)
-Collecting importlib-resources==6.1.0 (from -r requirements_lock.txt (line 568))
- Using cached importlib_resources-6.1.0-py3-none-any.whl (33 kB)
-Collecting inflection==0.5.1 (from -r requirements_lock.txt (line 572))
- Using cached inflection-0.5.1-py2.py3-none-any.whl (9.5 kB)
-Collecting itsdangerous==2.1.2 (from -r requirements_lock.txt (line 576))
- Using cached itsdangerous-2.1.2-py3-none-any.whl (15 kB)
-Collecting jinja2==3.1.2 (from -r requirements_lock.txt (line 584))
- Using cached Jinja2-3.1.2-py3-none-any.whl (133 kB)
-Collecting jsonschema==4.19.1 (from -r requirements_lock.txt (line 592))
- Using cached jsonschema-4.19.1-py3-none-any.whl (83 kB)
-Collecting jsonschema-specifications==2023.7.1 (from -r requirements_lock.txt (line 599))
- Using cached jsonschema_specifications-2023.7.1-py3-none-any.whl (17 kB)
-Collecting lazy-object-proxy==1.9.0 (from -r requirements_lock.txt (line 603))
- Using cached lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (64 kB)
-Collecting limits==3.6.0 (from -r requirements_lock.txt (line 641))
- Using cached limits-3.6.0-py3-none-any.whl (42 kB)
-Collecting linkify-it-py==2.0.2 (from -r requirements_lock.txt (line 645))
- Using cached linkify_it_py-2.0.2-py3-none-any.whl (19 kB)
-Collecting lockfile==0.12.2 (from -r requirements_lock.txt (line 649))
- Using cached lockfile-0.12.2-py2.py3-none-any.whl (13 kB)
-Collecting mako==1.2.4 (from -r requirements_lock.txt (line 655))
- Using cached Mako-1.2.4-py3-none-any.whl (78 kB)
-Collecting markdown==3.5 (from -r requirements_lock.txt (line 659))
- Using cached Markdown-3.5-py3-none-any.whl (101 kB)
-Collecting markdown-it-py==3.0.0 (from -r requirements_lock.txt (line 663))
- Using cached markdown_it_py-3.0.0-py3-none-any.whl (87 kB)
-Collecting markupsafe==2.1.3 (from -r requirements_lock.txt (line 670))
- Using cached MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (28 kB)
-Collecting marshmallow==3.20.1 (from -r requirements_lock.txt (line 737))
- Using cached marshmallow-3.20.1-py3-none-any.whl (49 kB)
-Collecting marshmallow-oneofschema==3.0.1 (from -r requirements_lock.txt (line 744))
- Using cached marshmallow_oneofschema-3.0.1-py2.py3-none-any.whl (5.8 kB)
-Collecting marshmallow-sqlalchemy==0.26.1 (from -r requirements_lock.txt (line 748))
- Using cached marshmallow_sqlalchemy-0.26.1-py2.py3-none-any.whl (15 kB)
-Collecting mdit-py-plugins==0.4.0 (from -r requirements_lock.txt (line 752))
- Using cached mdit_py_plugins-0.4.0-py3-none-any.whl (54 kB)
-Collecting mdurl==0.1.2 (from -r requirements_lock.txt (line 756))
- Using cached mdurl-0.1.2-py3-none-any.whl (10.0 kB)
-Collecting opentelemetry-api==1.20.0 (from -r requirements_lock.txt (line 760))
- Using cached opentelemetry_api-1.20.0-py3-none-any.whl (57 kB)
-Collecting opentelemetry-exporter-otlp==1.20.0 (from -r requirements_lock.txt (line 768))
- Using cached opentelemetry_exporter_otlp-1.20.0-py3-none-any.whl (7.0 kB)
-Collecting opentelemetry-exporter-otlp-proto-common==1.20.0 (from -r requirements_lock.txt (line 772))
- Using cached opentelemetry_exporter_otlp_proto_common-1.20.0-py3-none-any.whl (17 kB)
-Collecting opentelemetry-exporter-otlp-proto-grpc==1.20.0 (from -r requirements_lock.txt (line 778))
- Using cached opentelemetry_exporter_otlp_proto_grpc-1.20.0-py3-none-any.whl (18 kB)
-Collecting opentelemetry-exporter-otlp-proto-http==1.20.0 (from -r requirements_lock.txt (line 782))
- Using cached opentelemetry_exporter_otlp_proto_http-1.20.0-py3-none-any.whl (16 kB)
-Collecting opentelemetry-proto==1.20.0 (from -r requirements_lock.txt (line 786))
- Using cached opentelemetry_proto-1.20.0-py3-none-any.whl (50 kB)
-Collecting opentelemetry-sdk==1.20.0 (from -r requirements_lock.txt (line 793))
- Using cached opentelemetry_sdk-1.20.0-py3-none-any.whl (103 kB)
-Collecting opentelemetry-semantic-conventions==0.41b0 (from -r requirements_lock.txt (line 799))
- Using cached opentelemetry_semantic_conventions-0.41b0-py3-none-any.whl (26 kB)
-Collecting ordered-set==4.1.0 (from -r requirements_lock.txt (line 803))
- Using cached ordered_set-4.1.0-py3-none-any.whl (7.6 kB)
-Collecting packaging==23.2 (from -r requirements_lock.txt (line 807))
- Using cached packaging-23.2-py3-none-any.whl (53 kB)
-Collecting pathspec==0.10.3 (from -r requirements_lock.txt (line 817))
- Using cached pathspec-0.10.3-py3-none-any.whl (29 kB)
-Collecting pendulum==2.1.2 (from -r requirements_lock.txt (line 823))
- Using cached pendulum-2.1.2.tar.gz (81 kB)
- Installing build dependencies: started
- Installing build dependencies: finished with status 'done'
- Getting requirements to build wheel: started
- Getting requirements to build wheel: finished with status 'done'
- Preparing metadata (pyproject.toml): started
- Preparing metadata (pyproject.toml): finished with status 'done'
-Collecting pluggy==1.3.0 (from -r requirements_lock.txt (line 846))
- Using cached pluggy-1.3.0-py3-none-any.whl (18 kB)
-Collecting prison==0.2.1 (from -r requirements_lock.txt (line 850))
- Using cached prison-0.2.1-py2.py3-none-any.whl (5.8 kB)
-Collecting protobuf==4.24.4 (from -r requirements_lock.txt (line 854))
- Using cached protobuf-4.24.4-cp37-abi3-manylinux2014_x86_64.whl (311 kB)
-Collecting psutil==5.9.6 (from -r requirements_lock.txt (line 871))
- Using cached psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (283 kB)
-Collecting pycparser==2.21 (from -r requirements_lock.txt (line 889))
- Using cached pycparser-2.21-py2.py3-none-any.whl (118 kB)
-Collecting pydantic==2.4.2 (from -r requirements_lock.txt (line 893))
- Using cached pydantic-2.4.2-py3-none-any.whl (395 kB)
-Collecting pydantic-core==2.10.1 (from -r requirements_lock.txt (line 897))
- Using cached pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB)
-Collecting pygments==2.16.1 (from -r requirements_lock.txt (line 1005))
- Using cached Pygments-2.16.1-py3-none-any.whl (1.2 MB)
-Collecting pyjwt==2.8.0 (from -r requirements_lock.txt (line 1011))
- Using cached PyJWT-2.8.0-py3-none-any.whl (22 kB)
-Collecting python-daemon==3.0.1 (from -r requirements_lock.txt (line 1018))
- Using cached python_daemon-3.0.1-py3-none-any.whl (31 kB)
-Collecting python-dateutil==2.8.2 (from -r requirements_lock.txt (line 1022))
- Using cached python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
-Collecting python-magic==0.4.27 (from -r requirements_lock.txt (line 1031))
- Using cached python_magic-0.4.27-py2.py3-none-any.whl (13 kB)
-Collecting python-nvd3==0.15.0 (from -r requirements_lock.txt (line 1035))
- Using cached python-nvd3-0.15.0.tar.gz (31 kB)
- Preparing metadata (setup.py): started
- Preparing metadata (setup.py): finished with status 'done'
-Collecting python-slugify==8.0.1 (from -r requirements_lock.txt (line 1038))
- Using cached python_slugify-8.0.1-py2.py3-none-any.whl (9.7 kB)
-Collecting pytz==2023.3.post1 (from -r requirements_lock.txt (line 1044))
- Using cached pytz-2023.3.post1-py2.py3-none-any.whl (502 kB)
-Collecting pytzdata==2020.1 (from -r requirements_lock.txt (line 1050))
- Using cached pytzdata-2020.1-py2.py3-none-any.whl (489 kB)
-Collecting pyyaml==6.0 (from -r requirements_lock.txt (line 1054))
- Using cached PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (757 kB)
-Collecting referencing==0.30.2 (from -r requirements_lock.txt (line 1100))
- Using cached referencing-0.30.2-py3-none-any.whl (25 kB)
-Collecting requests==2.25.1 (from -r requirements_lock.txt (line 1106))
- Using cached requests-2.25.1-py2.py3-none-any.whl (61 kB)
-Collecting rfc3339-validator==0.1.4 (from -r requirements_lock.txt (line 1114))
- Using cached rfc3339_validator-0.1.4-py2.py3-none-any.whl (3.5 kB)
-Collecting rich==13.6.0 (from -r requirements_lock.txt (line 1118))
- Using cached rich-13.6.0-py3-none-any.whl (239 kB)
-Collecting rich-argparse==1.4.0 (from -r requirements_lock.txt (line 1125))
- Using cached rich_argparse-1.4.0-py3-none-any.whl (19 kB)
-Collecting rpds-py==0.10.6 (from -r requirements_lock.txt (line 1129))
- Using cached rpds_py-0.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB)
-Collecting s3cmd==2.1.0 (from -r requirements_lock.txt (line 1232))
- Using cached s3cmd-2.1.0-py2.py3-none-any.whl (145 kB)
-Collecting setproctitle==1.3.3 (from -r requirements_lock.txt (line 1236))
- Using cached setproctitle-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (31 kB)
-Collecting six==1.16.0 (from -r requirements_lock.txt (line 1326))
- Using cached six-1.16.0-py2.py3-none-any.whl (11 kB)
-Collecting sniffio==1.3.0 (from -r requirements_lock.txt (line 1333))
- Using cached sniffio-1.3.0-py3-none-any.whl (10 kB)
-Collecting sqlalchemy==1.4.49 (from -r requirements_lock.txt (line 1340))
- Using cached SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB)
-Collecting sqlalchemy-jsonfield==1.0.1.post0 (from -r requirements_lock.txt (line 1397))
- Using cached SQLAlchemy_JSONField-1.0.1.post0-py3-none-any.whl (10 kB)
-Collecting sqlalchemy-utils==0.41.1 (from -r requirements_lock.txt (line 1401))
- Using cached SQLAlchemy_Utils-0.41.1-py3-none-any.whl (92 kB)
-Collecting sqlparse==0.4.4 (from -r requirements_lock.txt (line 1405))
- Using cached sqlparse-0.4.4-py3-none-any.whl (41 kB)
-Collecting tabulate==0.9.0 (from -r requirements_lock.txt (line 1409))
- Using cached tabulate-0.9.0-py3-none-any.whl (35 kB)
-Collecting tenacity==8.2.3 (from -r requirements_lock.txt (line 1413))
- Using cached tenacity-8.2.3-py3-none-any.whl (24 kB)
-Collecting termcolor==2.3.0 (from -r requirements_lock.txt (line 1417))
- Using cached termcolor-2.3.0-py3-none-any.whl (6.9 kB)
-Collecting text-unidecode==1.3 (from -r requirements_lock.txt (line 1421))
- Using cached text_unidecode-1.3-py2.py3-none-any.whl (78 kB)
-Collecting typing-extensions==4.8.0 (from -r requirements_lock.txt (line 1425))
- Using cached typing_extensions-4.8.0-py3-none-any.whl (31 kB)
-Collecting uc-micro-py==1.0.2 (from -r requirements_lock.txt (line 1438))
- Using cached uc_micro_py-1.0.2-py3-none-any.whl (6.2 kB)
-Collecting unicodecsv==0.14.1 (from -r requirements_lock.txt (line 1442))
- Using cached unicodecsv-0.14.1.tar.gz (10 kB)
- Preparing metadata (setup.py): started
- Preparing metadata (setup.py): finished with status 'done'
-Collecting urllib3==1.26.18 (from -r requirements_lock.txt (line 1445))
- Using cached urllib3-1.26.18-py2.py3-none-any.whl (143 kB)
-Collecting werkzeug==2.2.3 (from -r requirements_lock.txt (line 1449))
- Using cached Werkzeug-2.2.3-py3-none-any.whl (233 kB)
-Collecting wrapt==1.15.0 (from -r requirements_lock.txt (line 1458))
- Using cached wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (78 kB)
-Collecting wtforms==3.1.0 (from -r requirements_lock.txt (line 1535))
- Using cached wtforms-3.1.0-py3-none-any.whl (145 kB)
-Collecting yamllint==1.28.0 (from -r requirements_lock.txt (line 1541))
- Using cached yamllint-1.28.0-py2.py3-none-any.whl (62 kB)
-Collecting zipp==3.17.0 (from -r requirements_lock.txt (line 1545))
- Using cached zipp-3.17.0-py3-none-any.whl (7.4 kB)
-Collecting setuptools==65.6.3 (from -r requirements_lock.txt (line 1553))
- Using cached setuptools-65.6.3-py3-none-any.whl (1.2 MB)
-{
- "version": "1",
- "pip_version": "23.3.1",
- "install": [
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/a2/8b/46919127496036c8e990b2b236454a0d8655fd46e1df2fd35610a9cbc842/alembic-1.12.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=03226222f1cf943deee6c85d9464261a6c710cd19b4fe867a3ad1f25afda610f",
- "hashes": {
- "sha256": "03226222f1cf943deee6c85d9464261a6c710cd19b4fe867a3ad1f25afda610f"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "alembic",
- "version": "1.12.0",
- "summary": "A database migration tool for SQLAlchemy.",
- "description": "Alembic is a database migrations tool written by the author\nof `SQLAlchemy <http://www.sqlalchemy.org>`_. A migrations tool\noffers the following functionality:\n\n* Can emit ALTER statements to a database in order to change\n the structure of tables and other constructs\n* Provides a system whereby \"migration scripts\" may be constructed;\n each script indicates a particular series of steps that can \"upgrade\" a\n target database to a new version, and optionally a series of steps that can\n \"downgrade\" similarly, doing the same steps in reverse.\n* Allows the scripts to execute in some sequential manner.\n\nThe goals of Alembic are:\n\n* Very open ended and transparent configuration and operation. A new\n Alembic environment is generated from a set of templates which is selected\n among a set of options when setup first occurs. The templates then deposit a\n series of scripts that define fully how database connectivity is established\n and how migration scripts are invoked; the migration scripts themselves are\n generated from a template within that series of scripts. The scripts can\n then be further customized to define exactly how databases will be\n interacted with and what structure new migration files should take.\n* Full support for transactional DDL. The default scripts ensure that all\n migrations occur within a transaction - for those databases which support\n this (Postgresql, Microsoft SQL Server), migrations can be tested with no\n need to manually undo changes upon failure.\n* Minimalist script construction. Basic operations like renaming\n tables/columns, adding/removing columns, changing column attributes can be\n performed through one line commands like alter_column(), rename_table(),\n add_constraint(). There is no need to recreate full SQLAlchemy Table\n structures for simple operations like these - the functions themselves\n generate minimalist schema structures behind the scenes to achieve the given\n DDL sequence.\n* \"auto generation\" of migrations. While real world migrations are far more\n complex than what can be automatically determined, Alembic can still\n eliminate the initial grunt work in generating new migration directives\n from an altered schema. The ``--autogenerate`` feature will inspect the\n current status of a database using SQLAlchemy's schema inspection\n capabilities, compare it to the current state of the database model as\n specified in Python, and generate a series of \"candidate\" migrations,\n rendering them into a new migration script as Python directives. The\n developer then edits the new file, adding additional directives and data\n migrations as needed, to produce a finished migration. Table and column\n level changes can be detected, with constraints and indexes to follow as\n well.\n* Full support for migrations generated as SQL scripts. Those of us who\n work in corporate environments know that direct access to DDL commands on a\n production database is a rare privilege, and DBAs want textual SQL scripts.\n Alembic's usage model and commands are oriented towards being able to run a\n series of migrations into a textual output file as easily as it runs them\n directly to a database. Care must be taken in this mode to not invoke other\n operations that rely upon in-memory SELECTs of rows - Alembic tries to\n provide helper constructs like bulk_insert() to help with data-oriented\n operations that are compatible with script-based DDL.\n* Non-linear, dependency-graph versioning. Scripts are given UUID\n identifiers similarly to a DVCS, and the linkage of one script to the next\n is achieved via human-editable markers within the scripts themselves.\n The structure of a set of migration files is considered as a\n directed-acyclic graph, meaning any migration file can be dependent\n on any other arbitrary set of migration files, or none at\n all. Through this open-ended system, migration files can be organized\n into branches, multiple roots, and mergepoints, without restriction.\n Commands are provided to produce new branches, roots, and merges of\n branches automatically.\n* Provide a library of ALTER constructs that can be used by any SQLAlchemy\n application. The DDL constructs build upon SQLAlchemy's own DDLElement base\n and can be used standalone by any application or script.\n* At long last, bring SQLite and its inablity to ALTER things into the fold,\n but in such a way that SQLite's very special workflow needs are accommodated\n in an explicit way that makes the most of a bad situation, through the\n concept of a \"batch\" migration, where multiple changes to a table can\n be batched together to form a series of instructions for a single, subsequent\n \"move-and-copy\" workflow. You can even use \"move-and-copy\" workflow for\n other databases, if you want to recreate a table in the background\n on a busy system.\n\nDocumentation and status of Alembic is at https://alembic.sqlalchemy.org/\n\nThe SQLAlchemy Project\n======================\n\nAlembic is part of the `SQLAlchemy Project <https://www.sqlalchemy.org>`_ and\nadheres to the same standards and conventions as the core project.\n\nDevelopment / Bug reporting / Pull requests\n___________________________________________\n\nPlease refer to the\n`SQLAlchemy Community Guide <https://www.sqlalchemy.org/develop.html>`_ for\nguidelines on coding and participating in this project.\n\nCode of Conduct\n_______________\n\nAbove all, SQLAlchemy places great emphasis on polite, thoughtful, and\nconstructive communication between users and developers.\nPlease see our current Code of Conduct at\n`Code of Conduct <https://www.sqlalchemy.org/codeofconduct.html>`_.\n\nLicense\n=======\n\nAlembic is distributed under the `MIT license\n<https://opensource.org/licenses/MIT>`_.\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://alembic.sqlalchemy.org",
- "author": "Mike Bayer",
- "author_email": "mike_mp@zzzcomputing.com",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "Environment :: Console",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Database :: Front-Ends"
- ],
- "requires_dist": [
- "SQLAlchemy >=1.3.0",
- "Mako",
- "typing-extensions >=4",
- "importlib-metadata ; python_version < \"3.9\"",
- "importlib-resources ; python_version < \"3.9\"",
- "python-dateutil ; extra == 'tz'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Source, https://github.com/sqlalchemy/alembic/",
- "Documentation, https://alembic.sqlalchemy.org/en/latest/",
- "Issue Tracker, https://github.com/sqlalchemy/alembic/issues/"
- ],
- "provides_extra": [
- "tz"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/28/78/d31230046e58c207284c6b2c4e8d96e6d3cb4e52354721b944d3e1ee4aa5/annotated_types-0.6.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43",
- "hashes": {
- "sha256": "0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "annotated-types",
- "version": "0.6.0",
- "summary": "Reusable constraint types to use with typing.Annotated",
- "description": "# annotated-types\n\n[](https://github.com/annotated-types/annotated-types/actions?query=event%3Apush+branch%3Amain+workflow%3ACI)\n[](https://pypi.python.org/pypi/annotated-types)\n[](https://github.com/annotated-types/annotated-types)\n[](https://github.com/annotated-types/annotated-types/blob/main/LICENSE)\n\n[PEP-593](https://peps.python.org/pep-0593/) added `typing.Annotated` as a way of\nadding context-specific metadata to existing types, and specifies that\n`Annotated[T, x]` _should_ be treated as `T` by any tool or library without special\nlogic for `x`.\n\nThis package provides metadata objects which can be used to represent common\nconstraints such as upper and lower bounds on scalar values and collection sizes,\na `Predicate` marker for runtime checks, and\ndescriptions of how we intend these metadata to be interpreted. In some cases,\nwe also note alternative representations which do not require this package.\n\n## Install\n\n```bash\npip install annotated-types\n```\n\n## Examples\n\n```python\nfrom typing import Annotated\nfrom annotated_types import Gt, Len, Predicate\n\nclass MyClass:\n age: Annotated[int, Gt(18)] # Valid: 19, 20, ...\n # Invalid: 17, 18, \"19\", 19.0, ...\n factors: list[Annotated[int, Predicate(is_prime)]] # Valid: 2, 3, 5, 7, 11, ...\n # Invalid: 4, 8, -2, 5.0, \"prime\", ...\n\n my_list: Annotated[list[int], Len(0, 10)] # Valid: [], [10, 20, 30, 40, 50]\n # Invalid: (1, 2), [\"abc\"], [0] * 20\n```\n\n## Documentation\n\n_While `annotated-types` avoids runtime checks for performance, users should not\nconstruct invalid combinations such as `MultipleOf(\"non-numeric\")` or `Annotated[int, Len(3)]`.\nDownstream implementors may choose to raise an error, emit a warning, silently ignore\na metadata item, etc., if the metadata objects described below are used with an\nincompatible type - or for any other reason!_\n\n### Gt, Ge, Lt, Le\n\nExpress inclusive and/or exclusive bounds on orderable values - which may be numbers,\ndates, times, strings, sets, etc. Note that the boundary value need not be of the\nsame type that was annotated, so long as they can be compared: `Annotated[int, Gt(1.5)]`\nis fine, for example, and implies that the value is an integer x such that `x > 1.5`.\n\nWe suggest that implementors may also interpret `functools.partial(operator.le, 1.5)`\nas being equivalent to `Gt(1.5)`, for users who wish to avoid a runtime dependency on\nthe `annotated-types` package.\n\nTo be explicit, these types have the following meanings:\n\n* `Gt(x)` - value must be \"Greater Than\" `x` - equivalent to exclusive minimum\n* `Ge(x)` - value must be \"Greater than or Equal\" to `x` - equivalent to inclusive minimum\n* `Lt(x)` - value must be \"Less Than\" `x` - equivalent to exclusive maximum\n* `Le(x)` - value must be \"Less than or Equal\" to `x` - equivalent to inclusive maximum\n\n### Interval\n\n`Interval(gt, ge, lt, le)` allows you to specify an upper and lower bound with a single\nmetadata object. `None` attributes should be ignored, and non-`None` attributes\ntreated as per the single bounds above.\n\n### MultipleOf\n\n`MultipleOf(multiple_of=x)` might be interpreted in two ways:\n\n1. Python semantics, implying `value % multiple_of == 0`, or\n2. [JSONschema semantics](https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6.2.1),\n where `int(value / multiple_of) == value / multiple_of`.\n\nWe encourage users to be aware of these two common interpretations and their\ndistinct behaviours, especially since very large or non-integer numbers make\nit easy to cause silent data corruption due to floating-point imprecision.\n\nWe encourage libraries to carefully document which interpretation they implement.\n\n### MinLen, MaxLen, Len\n\n`Len()` implies that `min_length <= len(value) <= max_length` - lower and upper bounds are inclusive.\n\nAs well as `Len()` which can optionally include upper and lower bounds, we also\nprovide `MinLen(x)` and `MaxLen(y)` which are equivalent to `Len(min_length=x)`\nand `Len(max_length=y)` respectively.\n\n`Len`, `MinLen`, and `MaxLen` may be used with any type which supports `len(value)`.\n\nExamples of usage:\n\n* `Annotated[list, MaxLen(10)]` (or `Annotated[list, Len(max_length=10))`) - list must have a length of 10 or less\n* `Annotated[str, MaxLen(10)]` - string must have a length of 10 or less\n* `Annotated[list, MinLen(3))` (or `Annotated[list, Len(min_length=3))`) - list must have a length of 3 or more\n* `Annotated[list, Len(4, 6)]` - list must have a length of 4, 5, or 6\n* `Annotated[list, Len(8, 8)]` - list must have a length of exactly 8\n\n#### Changed in v0.4.0\n\n* `min_inclusive` has been renamed to `min_length`, no change in meaning\n* `max_exclusive` has been renamed to `max_length`, upper bound is now **inclusive** instead of **exclusive**\n* The recommendation that slices are interpreted as `Len` has been removed due to ambiguity and different semantic\n meaning of the upper bound in slices vs. `Len`\n\nSee [issue #23](https://github.com/annotated-types/annotated-types/issues/23) for discussion.\n\n### Timezone\n\n`Timezone` can be used with a `datetime` or a `time` to express which timezones\nare allowed. `Annotated[datetime, Timezone(None)]` must be a naive datetime.\n`Timezone[...]` ([literal ellipsis](https://docs.python.org/3/library/constants.html#Ellipsis))\nexpresses that any timezone-aware datetime is allowed. You may also pass a specific\ntimezone string or `timezone` object such as `Timezone(timezone.utc)` or\n`Timezone(\"Africa/Abidjan\")` to express that you only allow a specific timezone,\nthough we note that this is often a symptom of fragile design.\n\n### Predicate\n\n`Predicate(func: Callable)` expresses that `func(value)` is truthy for valid values.\nUsers should prefer the statically inspectable metadata above, but if you need\nthe full power and flexibility of arbitrary runtime predicates... here it is.\n\nWe provide a few predefined predicates for common string constraints:\n\n* `IsLower = Predicate(str.islower)`\n* `IsUpper = Predicate(str.isupper)`\n* `IsDigit = Predicate(str.isdigit)`\n* `IsFinite = Predicate(math.isfinite)`\n* `IsNotFinite = Predicate(Not(math.isfinite))`\n* `IsNan = Predicate(math.isnan)`\n* `IsNotNan = Predicate(Not(math.isnan))`\n* `IsInfinite = Predicate(math.isinf)`\n* `IsNotInfinite = Predicate(Not(math.isinf))`\n\nSome libraries might have special logic to handle known or understandable predicates,\nfor example by checking for `str.isdigit` and using its presence to both call custom\nlogic to enforce digit-only strings, and customise some generated external schema.\nUsers are therefore encouraged to avoid indirection like `lambda s: s.lower()`, in\nfavor of introspectable methods such as `str.lower` or `re.compile(\"pattern\").search`.\n\nTo enable basic negation of commonly used predicates like `math.isnan` without introducing introspection that makes it impossible for implementers to introspect the predicate we provide a `Not` wrapper that simply negates the predicate in an introspectable manner. Several of the predicates listed above are created in this manner.\n\nWe do not specify what behaviour should be expected for predicates that raise\nan exception. For example `Annotated[int, Predicate(str.isdigit)]` might silently\nskip invalid constraints, or statically raise an error; or it might try calling it\nand then propogate or discard the resulting\n`TypeError: descriptor 'isdigit' for 'str' objects doesn't apply to a 'int' object`\nexception. We encourage libraries to document the behaviour they choose.\n\n### Doc\n\n`doc()` can be used to add documentation information in `Annotated`, for function and method parameters, variables, class attributes, return types, and any place where `Annotated` can be used.\n\nIt expects a value that can be statically analyzed, as the main use case is for static analysis, editors, documentation generators, and similar tools.\n\nIt returns a `DocInfo` class with a single attribute `documentation` containing the value passed to `doc()`.\n\nThis is the early adopter's alternative form of the [`typing-doc` proposal](https://github.com/tiangolo/fastapi/blob/typing-doc/typing_doc.md).\n\n### Integrating downstream types with `GroupedMetadata`\n\nImplementers may choose to provide a convenience wrapper that groups multiple pieces of metadata.\nThis can help reduce verbosity and cognitive overhead for users.\nFor example, an implementer like Pydantic might provide a `Field` or `Meta` type that accepts keyword arguments and transforms these into low-level metadata:\n\n```python\nfrom dataclasses import dataclass\nfrom typing import Iterator\nfrom annotated_types import GroupedMetadata, Ge\n\n@dataclass\nclass Field(GroupedMetadata):\n ge: int | None = None\n description: str | None = None\n\n def __iter__(self) -> Iterator[object]:\n # Iterating over a GroupedMetadata object should yield annotated-types\n # constraint metadata objects which describe it as fully as possible,\n # and may include other unknown objects too.\n if self.ge is not None:\n yield Ge(self.ge)\n if self.description is not None:\n yield Description(self.description)\n```\n\nLibraries consuming annotated-types constraints should check for `GroupedMetadata` and unpack it by iterating over the object and treating the results as if they had been \"unpacked\" in the `Annotated` type. The same logic should be applied to the [PEP 646 `Unpack` type](https://peps.python.org/pep-0646/), so that `Annotated[T, Field(...)]`, `Annotated[T, Unpack[Field(...)]]` and `Annotated[T, *Field(...)]` are all treated consistently.\n\nLibraries consuming annotated-types should also ignore any metadata they do not recongize that came from unpacking a `GroupedMetadata`, just like they ignore unrecognized metadata in `Annotated` itself.\n\nOur own `annotated_types.Interval` class is a `GroupedMetadata` which unpacks itself into `Gt`, `Lt`, etc., so this is not an abstract concern. Similarly, `annotated_types.Len` is a `GroupedMetadata` which unpacks itself into `MinLen` (optionally) and `MaxLen`.\n\n### Consuming metadata\n\nWe intend to not be prescriptive as to _how_ the metadata and constraints are used, but as an example of how one might parse constraints from types annotations see our [implementation in `test_main.py`](https://github.com/annotated-types/annotated-types/blob/f59cf6d1b5255a0fe359b93896759a180bec30ae/tests/test_main.py#L94-L103).\n\nIt is up to the implementer to determine how this metadata is used.\nYou could use the metadata for runtime type checking, for generating schemas or to generate example data, amongst other use cases.\n\n## Design & History\n\nThis package was designed at the PyCon 2022 sprints by the maintainers of Pydantic\nand Hypothesis, with the goal of making it as easy as possible for end-users to\nprovide more informative annotations for use by runtime libraries.\n\nIt is deliberately minimal, and following PEP-593 allows considerable downstream\ndiscretion in what (if anything!) they choose to support. Nonetheless, we expect\nthat staying simple and covering _only_ the most common use-cases will give users\nand maintainers the best experience we can. If you'd like more constraints for your\ntypes - follow our lead, by defining them and documenting them downstream!\n",
- "description_content_type": "text/markdown",
- "author_email": "Samuel Colvin <s@muelcolvin.com>, Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Zac Hatfield-Dodds <zac@zhd.dev>",
- "classifier": [
- "Development Status :: 4 - Beta",
- "Environment :: Console",
- "Environment :: MacOS X",
- "Intended Audience :: Developers",
- "Intended Audience :: Information Technology",
- "License :: OSI Approved :: MIT License",
- "Operating System :: POSIX :: Linux",
- "Operating System :: Unix",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "Typing :: Typed"
- ],
- "requires_dist": [
- "typing-extensions>=4.0.0; python_version < '3.9'"
- ],
- "requires_python": ">=3.8"
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/36/55/ad4de788d84a630656ece71059665e01ca793c04294c463fd84132f40fe6/anyio-4.0.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f",
- "hashes": {
- "sha256": "cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "anyio",
- "version": "4.0.0",
- "summary": "High level compatibility layer for multiple asynchronous event loop implementations",
- "description": ".. image:: https://github.com/agronholm/anyio/actions/workflows/test.yml/badge.svg\n :target: https://github.com/agronholm/anyio/actions/workflows/test.yml\n :alt: Build Status\n.. image:: https://coveralls.io/repos/github/agronholm/anyio/badge.svg?branch=master\n :target: https://coveralls.io/github/agronholm/anyio?branch=master\n :alt: Code Coverage\n.. image:: https://readthedocs.org/projects/anyio/badge/?version=latest\n :target: https://anyio.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation\n.. image:: https://badges.gitter.im/gitterHQ/gitter.svg\n :target: https://gitter.im/python-trio/AnyIO\n :alt: Gitter chat\n\nAnyIO is an asynchronous networking and concurrency library that works on top of either asyncio_ or\ntrio_. It implements trio-like `structured concurrency`_ (SC) on top of asyncio and works in harmony\nwith the native SC of trio itself.\n\nApplications and libraries written against AnyIO's API will run unmodified on either asyncio_ or\ntrio_. AnyIO can also be adopted into a library or application incrementally – bit by bit, no full\nrefactoring necessary. It will blend in with the native libraries of your chosen backend.\n\nDocumentation\n-------------\n\nView full documentation at: https://anyio.readthedocs.io/\n\nFeatures\n--------\n\nAnyIO offers the following functionality:\n\n* Task groups (nurseries_ in trio terminology)\n* High-level networking (TCP, UDP and UNIX sockets)\n\n * `Happy eyeballs`_ algorithm for TCP connections (more robust than that of asyncio on Python\n 3.8)\n * async/await style UDP sockets (unlike asyncio where you still have to use Transports and\n Protocols)\n\n* A versatile API for byte streams and object streams\n* Inter-task synchronization and communication (locks, conditions, events, semaphores, object\n streams)\n* Worker threads\n* Subprocesses\n* Asynchronous file I/O (using worker threads)\n* Signal handling\n\nAnyIO also comes with its own pytest_ plugin which also supports asynchronous fixtures.\nIt even works with the popular Hypothesis_ library.\n\n.. _asyncio: https://docs.python.org/3/library/asyncio.html\n.. _trio: https://github.com/python-trio/trio\n.. _structured concurrency: https://en.wikipedia.org/wiki/Structured_concurrency\n.. _nurseries: https://trio.readthedocs.io/en/stable/reference-core.html#nurseries-and-spawning\n.. _Happy eyeballs: https://en.wikipedia.org/wiki/Happy_Eyeballs\n.. _pytest: https://docs.pytest.org/en/latest/\n.. _Hypothesis: https://hypothesis.works/\n",
- "description_content_type": "text/x-rst",
- "author_email": "Alex Grönholm <alex.gronholm@nextday.fi>",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Framework :: AnyIO",
- "Typing :: Typed",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12"
- ],
- "requires_dist": [
- "idna >=2.8",
- "sniffio >=1.1",
- "exceptiongroup >=1.0.2 ; python_version < \"3.11\"",
- "packaging ; extra == 'doc'",
- "Sphinx >=7 ; extra == 'doc'",
- "sphinx-autodoc-typehints >=1.2.0 ; extra == 'doc'",
- "anyio[trio] ; extra == 'test'",
- "coverage[toml] >=7 ; extra == 'test'",
- "hypothesis >=4.0 ; extra == 'test'",
- "psutil >=5.9 ; extra == 'test'",
- "pytest >=7.0 ; extra == 'test'",
- "pytest-mock >=3.6.1 ; extra == 'test'",
- "trustme ; extra == 'test'",
- "uvloop >=0.17 ; (python_version < \"3.12\" and platform_python_implementation == \"CPython\" and platform_system != \"Windows\") and extra == 'test'",
- "trio >=0.22 ; extra == 'trio'"
- ],
- "requires_python": ">=3.8",
- "project_url": [
- "Documentation, https://anyio.readthedocs.io/en/latest/",
- "Changelog, https://anyio.readthedocs.io/en/stable/versionhistory.html",
- "Source code, https://github.com/agronholm/anyio",
- "Issue tracker, https://github.com/agronholm/anyio/issues"
- ],
- "provides_extra": [
- "doc",
- "test",
- "trio"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/4e/7b/498a6d2f8a95b35b979763fe27a1e6a162f4d4de5e79e30655f21b8e0458/apache_airflow-2.7.2-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=1bc2c022bcae24b911e49fafd5fb619b49efba87ed7bc8561a2065810d8fe899",
- "hashes": {
- "sha256": "1bc2c022bcae24b911e49fafd5fb619b49efba87ed7bc8561a2065810d8fe899"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "apache-airflow",
- "version": "2.7.2",
- "summary": "Programmatically author, schedule and monitor data pipelines",
- "description": "<!--\nLicensed to the Apache Software Foundation (ASF) under one\nor more contributor license agreements. See the NOTICE file\ndistributed with this work for additional information\nregarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the\n\"License\"); you may not use this file except in compliance\nwith the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied. See the License for the\nspecific language governing permissions and limitations\nunder the License.\n-->\n\n<!-- PLEASE DO NOT MODIFY THIS FILE. IT HAS BEEN GENERATED AUTOMATICALLY FROM THE `README.md` FILE OF THE\nPROJECT BY THE `generate-pypi-readme` PRE-COMMIT. YOUR CHANGES HERE WILL BE AUTOMATICALLY OVERWRITTEN.-->\n\n# Apache Airflow\n\n[](https://badge.fury.io/py/apache-airflow)\n[](https://github.com/apache/airflow/actions)\n[](https://app.codecov.io/gh/apache/airflow/branch/main)\n[](https://www.apache.org/licenses/LICENSE-2.0.txt)\n[](https://pypi.org/project/apache-airflow/)\n[](https://hub.docker.com/r/apache/airflow)\n[](https://hub.docker.com/r/apache/airflow)\n[](https://pypi.org/project/apache-airflow/)\n[](https://artifacthub.io/packages/search?repo=apache-airflow)\n[](https://github.com/psf/black)\n[](https://twitter.com/ApacheAirflow)\n[](https://s.apache.org/airflow-slack)\n[](https://github.com/apache/airflow/graphs/contributors)\n[](https://ossrank.com/p/6)\n\n[Apache Airflow](https://airflow.apache.org/docs/apache-airflow/stable/) (or simply Airflow) is a platform to programmatically author, schedule, and monitor workflows.\n\nWhen workflows are defined as code, they become more maintainable, versionable, testable, and collaborative.\n\nUse Airflow to author workflows as directed acyclic graphs (DAGs) of tasks. The Airflow scheduler executes your tasks on an array of workers while following the specified dependencies. Rich command line utilities make performing complex surgeries on DAGs a snap. The rich user interface makes it easy to visualize pipelines running in production, monitor progress, and troubleshoot issues when needed.\n\n## Requirements\n\nApache Airflow is tested with:\n\n| | Main version (dev) | Stable version (2.7.2) |\n|-------------|------------------------------|------------------------|\n| Python | 3.8, 3.9, 3.10, 3.11 | 3.8, 3.9, 3.10, 3.11 |\n| Platform | AMD64/ARM64(\\*) | AMD64/ARM64(\\*) |\n| Kubernetes | 1.24, 1.25, 1.26, 1.27, 1.28 | 1.24, 1.25, 1.26, 1.27 |\n| PostgreSQL | 11, 12, 13, 14, 15 | 11, 12, 13, 14, 15 |\n| MySQL | 5.7, 8.0, 8.1 | 5.7, 8.0 |\n| SQLite | 3.15.0+ | 3.15.0+ |\n| MSSQL | 2017(\\*\\*), 2019(\\*\\*) | 2017(\\*), 2019(\\*) |\n\n\\* Experimental\n\n\\*\\* **Discontinued soon**, not recommended for the new installation\n\n**Note**: MySQL 5.x versions are unable to or have limitations with\nrunning multiple schedulers -- please see the [Scheduler docs](https://airflow.apache.org/docs/apache-airflow/stable/scheduler.html).\nMariaDB is not tested/recommended.\n\n**Note**: SQLite is used in Airflow tests. Do not use it in production. We recommend\nusing the latest stable version of SQLite for local development.\n\n**Note**: Airflow currently can be run on POSIX-compliant Operating Systems. For development, it is regularly\ntested on fairly modern Linux Distros and recent versions of macOS.\nOn Windows you can run it via WSL2 (Windows Subsystem for Linux 2) or via Linux Containers.\nThe work to add Windows support is tracked via [#10388](https://github.com/apache/airflow/issues/10388), but\nit is not a high priority. You should only use Linux-based distros as \"Production\" execution environment\nas this is the only environment that is supported. The only distro that is used in our CI tests and that\nis used in the [Community managed DockerHub image](https://hub.docker.com/p/apache/airflow) is\n`Debian Bullseye`.\n\n## Getting started\n\nVisit the official Airflow website documentation (latest **stable** release) for help with\n[installing Airflow](https://airflow.apache.org/docs/apache-airflow/stable/installation.html),\n[getting started](https://airflow.apache.org/docs/apache-airflow/stable/start.html), or walking\nthrough a more complete [tutorial](https://airflow.apache.org/docs/apache-airflow/stable/tutorial.html).\n\n> Note: If you're looking for documentation for the main branch (latest development branch): you can find it on [s.apache.org/airflow-docs](https://s.apache.org/airflow-docs/).\n\nFor more information on Airflow Improvement Proposals (AIPs), visit\nthe [Airflow Wiki](https://cwiki.apache.org/confluence/display/AIRFLOW/Airflow+Improvement+Proposals).\n\nDocumentation for dependent projects like provider packages, Docker image, Helm Chart, you'll find it in [the documentation index](https://airflow.apache.org/docs/).\n\n## Installing from PyPI\n\nWe publish Apache Airflow as `apache-airflow` package in PyPI. Installing it however might be sometimes tricky\nbecause Airflow is a bit of both a library and application. Libraries usually keep their dependencies open, and\napplications usually pin them, but we should do neither and both simultaneously. We decided to keep\nour dependencies as open as possible (in `setup.py`) so users can install different versions of libraries\nif needed. This means that `pip install apache-airflow` will not work from time to time or will\nproduce unusable Airflow installation.\n\nTo have repeatable installation, however, we keep a set of \"known-to-be-working\" constraint\nfiles in the orphan `constraints-main` and `constraints-2-0` branches. We keep those \"known-to-be-working\"\nconstraints files separately per major/minor Python version.\nYou can use them as constraint files when installing Airflow from PyPI. Note that you have to specify\ncorrect Airflow tag/version/branch and Python versions in the URL.\n\n\n1. Installing just Airflow:\n\n> Note: Only `pip` installation is currently officially supported.\n\nWhile it is possible to install Airflow with tools like [Poetry](https://python-poetry.org) or\n[pip-tools](https://pypi.org/project/pip-tools), they do not share the same workflow as\n`pip` - especially when it comes to constraint vs. requirements management.\nInstalling via `Poetry` or `pip-tools` is not currently supported.\n\nThere are known issues with ``bazel`` that might lead to circular dependencies when using it to install\nAirflow. Please switch to ``pip`` if you encounter such problems. ``Bazel`` community works on fixing\nthe problem in `this PR <https://github.com/bazelbuild/rules_python/pull/1166>`_ so it might be that\nnewer versions of ``bazel`` will handle it.\n\nIf you wish to install Airflow using those tools, you should use the constraint files and convert\nthem to the appropriate format and workflow that your tool requires.\n\n\n```bash\npip install 'apache-airflow==2.7.2' \\\n --constraint \"https://raw.githubusercontent.com/apache/airflow/constraints-2.7.2/constraints-3.8.txt\"\n```\n\n2. Installing with extras (i.e., postgres, google)\n\n```bash\npip install 'apache-airflow[postgres,google]==2.7.2' \\\n --constraint \"https://raw.githubusercontent.com/apache/airflow/constraints-2.7.2/constraints-3.8.txt\"\n```\n\nFor information on installing provider packages, check\n[providers](http://airflow.apache.org/docs/apache-airflow-providers/index.html).\n\n## Official source code\n\nApache Airflow is an [Apache Software Foundation](https://www.apache.org) (ASF) project,\nand our official source code releases:\n\n- Follow the [ASF Release Policy](https://www.apache.org/legal/release-policy.html)\n- Can be downloaded from [the ASF Distribution Directory](https://downloads.apache.org/airflow)\n- Are cryptographically signed by the release manager\n- Are officially voted on by the PMC members during the\n [Release Approval Process](https://www.apache.org/legal/release-policy.html#release-approval)\n\nFollowing the ASF rules, the source packages released must be sufficient for a user to build and test the\nrelease provided they have access to the appropriate platform and tools.\n\n## Contributing\n\nWant to help build Apache Airflow? Check out our [contributing documentation](https://github.com/apache/airflow/blob/main/CONTRIBUTING.rst).\n\nOfficial Docker (container) images for Apache Airflow are described in [IMAGES.rst](https://github.com/apache/airflow/blob/main/IMAGES.rst).\n\n## Who uses Apache Airflow?\n\nMore than 400 organizations are using Apache Airflow\n[in the wild](https://github.com/apache/airflow/blob/main/INTHEWILD.md).\n\n## Who maintains Apache Airflow?\n\nAirflow is the work of the [community](https://github.com/apache/airflow/graphs/contributors),\nbut the [core committers/maintainers](https://people.apache.org/committers-by-project.html#airflow)\nare responsible for reviewing and merging PRs as well as steering conversations around new feature requests.\nIf you would like to become a maintainer, please review the Apache Airflow\n[committer requirements](https://github.com/apache/airflow/blob/main/COMMITTERS.rst#guidelines-to-become-an-airflow-committer).\n",
- "description_content_type": "text/markdown",
- "home_page": "https://airflow.apache.org/",
- "author": "Apache Software Foundation",
- "author_email": "dev@airflow.apache.org",
- "license": "Apache License 2.0",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Console",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "Intended Audience :: System Administrators",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Topic :: System :: Monitoring",
- "Framework :: Apache Airflow"
- ],
- "requires_dist": [
- "alembic (<2.0,>=1.6.3)",
- "argcomplete (>=1.10)",
- "asgiref",
- "attrs (>=22.1.0)",
- "blinker",
- "cattrs (>=22.1.0)",
- "colorlog (<5.0,>=4.0.2)",
- "configupdater (>=3.1.1)",
- "connexion[flask] (>=2.10.0)",
- "cron-descriptor (>=1.2.24)",
- "croniter (>=0.3.17)",
- "cryptography (>=0.9.3)",
- "deprecated (>=1.2.13)",
- "dill (>=0.2.2)",
- "flask (<2.3,>=2.2)",
- "flask-appbuilder (==4.3.6)",
- "flask-caching (>=1.5.0)",
- "flask-login (>=0.6.2)",
- "flask-session (>=0.4.0)",
- "flask-wtf (>=0.15)",
- "google-re2 (>=1.0)",
- "graphviz (>=0.12)",
- "gunicorn (>=20.1.0)",
- "httpx",
- "itsdangerous (>=2.0)",
- "jinja2 (>=3.0.0)",
- "jsonschema (>=4.18.0)",
- "lazy-object-proxy",
- "linkify-it-py (>=2.0.0)",
- "lockfile (>=0.12.2)",
- "markdown (>=3.0)",
- "markdown-it-py (>=2.1.0)",
- "markupsafe (>=1.1.1)",
- "marshmallow-oneofschema (>=2.0.1)",
- "mdit-py-plugins (>=0.3.0)",
- "opentelemetry-api (>=1.15.0)",
- "opentelemetry-exporter-otlp",
- "packaging (>=14.0)",
- "pathspec (>=0.9.0)",
- "pendulum (>=2.0)",
- "pluggy (>=1.0)",
- "psutil (>=4.2.0)",
- "pydantic (>=1.10.0)",
- "pygments (>=2.0.1)",
- "pyjwt (>=2.0.0)",
- "python-daemon (>=3.0.0)",
- "python-dateutil (>=2.3)",
- "python-nvd3 (>=0.15.0)",
- "python-slugify (>=5.0)",
- "rfc3339-validator (>=0.1.4)",
- "rich (>=12.4.4)",
- "rich-argparse (>=1.0.0)",
- "setproctitle (>=1.1.8)",
- "sqlalchemy (<2.0,>=1.4.28)",
- "sqlalchemy-jsonfield (>=1.0)",
- "tabulate (>=0.7.5)",
- "tenacity (!=8.2.0,>=6.2.0)",
- "termcolor (>=1.1.0)",
- "typing-extensions (>=4.0.0)",
- "unicodecsv (>=0.14.1)",
- "werkzeug (>=2.0)",
- "apache-airflow-providers-common-sql",
- "apache-airflow-providers-ftp",
- "apache-airflow-providers-http",
- "apache-airflow-providers-imap",
- "apache-airflow-providers-sqlite",
- "importlib-metadata (>=1.7) ; python_version < \"3.9\"",
- "importlib-resources (>=5.2) ; python_version < \"3.9\"",
- "aiobotocore (>=2.1.1) ; extra == 'aiobotocore'",
- "apache-airflow-providers-airbyte ; extra == 'airbyte'",
- "apache-airflow-providers-alibaba ; extra == 'alibaba'",
- "PyGithub (!=1.58) ; extra == 'all'",
- "PyOpenSSL ; extra == 'all'",
- "adal (>=1.2.7) ; extra == 'all'",
- "aiobotocore (>=2.1.1) ; extra == 'all'",
- "aiohttp ; extra == 'all'",
- "aiohttp (<4,>=3.6.3) ; extra == 'all'",
- "alibabacloud-adb20211201 (>=1.0.0) ; extra == 'all'",
- "alibabacloud-tea-openapi (>=0.3.7) ; extra == 'all'",
- "amqp ; extra == 'all'",
- "analytics-python (>=1.2.9) ; extra == 'all'",
- "apache-airflow (>=2.4.0) ; extra == 'all'",
- "apache-airflow (>=2.7.0) ; extra == 'all'",
- "apache-beam (>=2.47.0) ; extra == 'all'",
- "apprise ; extra == 'all'",
- "arrow (>=0.16.0) ; extra == 'all'",
- "asana (<4.0.0,>=0.10) ; extra == 'all'",
- "asgiref ; extra == 'all'",
- "asgiref (>=3.5.2) ; extra == 'all'",
- "atlasclient (>=0.1.2) ; extra == 'all'",
- "atlassian-python-api (>=1.14.2) ; extra == 'all'",
- "attrs (>=22.2) ; extra == 'all'",
- "authlib (>=1.0.0) ; extra == 'all'",
- "azure-batch (>=8.0.0) ; extra == 'all'",
- "azure-cosmos (>=4.0.0) ; extra == 'all'",
- "azure-datalake-store (>=0.0.45) ; extra == 'all'",
- "azure-identity (>=1.3.1) ; extra == 'all'",
- "azure-keyvault-secrets (>=4.1.0) ; extra == 'all'",
- "azure-kusto-data (<0.1,>=0.0.43) ; extra == 'all'",
- "azure-mgmt-containerinstance (<2.0,>=1.5.0) ; extra == 'all'",
- "azure-mgmt-datafactory (<2.0,>=1.0.0) ; extra == 'all'",
- "azure-mgmt-datalake-store (>=0.5.0) ; extra == 'all'",
- "azure-mgmt-resource (>=2.2.0) ; extra == 'all'",
- "azure-servicebus (>=7.6.1) ; extra == 'all'",
- "azure-storage-blob (>=12.14.0) ; extra == 'all'",
- "azure-storage-common (>=2.1.0) ; extra == 'all'",
- "azure-storage-file-datalake (>=12.9.1) ; extra == 'all'",
- "azure-storage-file (>=2.1.0) ; extra == 'all'",
- "azure-synapse-spark ; extra == 'all'",
- "bcrypt (>=2.0.0) ; extra == 'all'",
- "blinker (>=1.1) ; extra == 'all'",
- "boto3 (>=1.28.0) ; extra == 'all'",
- "botocore (>=1.31.0) ; extra == 'all'",
- "cassandra-driver (>=3.13.0) ; extra == 'all'",
- "celery (!=5.3.2,!=5.3.3,<6,>=5.3.0) ; extra == 'all'",
- "cgroupspy (>=0.2.2) ; extra == 'all'",
- "cloudant (>=2.0) ; extra == 'all'",
- "cloudpickle (>=1.4.1) ; extra == 'all'",
- "confluent-kafka (>=1.8.2) ; extra == 'all'",
- "cryptography (>=2.0.0) ; extra == 'all'",
- "dask (!=2022.10.1,!=2023.5.0,>=2.9.0) ; extra == 'all'",
- "databricks-sql-connector (<3.0.0,>=2.0.0) ; extra == 'all'",
- "datadog (>=0.14.0) ; extra == 'all'",
- "distributed (!=2023.5.0,>=2.11.1) ; extra == 'all'",
- "dnspython (>=1.13.0) ; extra == 'all'",
- "docker (>=5.0.3) ; extra == 'all'",
- "elasticsearch (<9,>8) ; extra == 'all'",
- "eventlet (>=0.33.3) ; extra == 'all'",
- "facebook-business (>=6.0.2) ; extra == 'all'",
- "flask-appbuilder[oauth] (==4.3.6) ; extra == 'all'",
- "flask-bcrypt (>=0.7.1) ; extra == 'all'",
- "flower (>=1.0.0) ; extra == 'all'",
- "gcloud-aio-auth (<5.0.0,>=4.0.0) ; extra == 'all'",
- "gcloud-aio-bigquery (>=6.1.2) ; extra == 'all'",
- "gcloud-aio-storage ; extra == 'all'",
- "gevent (>=0.13) ; extra == 'all'",
- "google-ads (>=21.2.0) ; extra == 'all'",
- "google-api-core (>=2.11.0) ; extra == 'all'",
- "google-api-python-client (>=1.6.0) ; extra == 'all'",
- "google-auth-httplib2 (>=0.0.1) ; extra == 'all'",
- "google-auth (>=1.0.0) ; extra == 'all'",
- "google-auth (<3.0.0,>=1.0.0) ; extra == 'all'",
- "google-cloud-aiplatform (>=1.22.1) ; extra == 'all'",
- "google-cloud-automl (>=2.11.0) ; extra == 'all'",
- "google-cloud-bigquery-datatransfer (>=3.11.0) ; extra == 'all'",
- "google-cloud-bigtable (>=2.17.0) ; extra == 'all'",
- "google-cloud-build (>=3.13.0) ; extra == 'all'",
- "google-cloud-compute (>=1.10.0) ; extra == 'all'",
- "google-cloud-container (>=2.17.4) ; extra == 'all'",
- "google-cloud-datacatalog (>=3.11.1) ; extra == 'all'",
- "google-cloud-dataflow-client (>=0.8.2) ; extra == 'all'",
- "google-cloud-dataform (>=0.5.0) ; extra == 'all'",
- "google-cloud-dataplex (>=1.4.2) ; extra == 'all'",
- "google-cloud-dataproc-metastore (>=1.12.0) ; extra == 'all'",
- "google-cloud-dataproc (>=5.4.0) ; extra == 'all'",
- "google-cloud-dlp (>=3.12.0) ; extra == 'all'",
- "google-cloud-kms (>=2.15.0) ; extra == 'all'",
- "google-cloud-language (>=2.9.0) ; extra == 'all'",
- "google-cloud-logging (>=3.5.0) ; extra == 'all'",
- "google-cloud-memcache (>=1.7.0) ; extra == 'all'",
- "google-cloud-monitoring (>=2.14.1) ; extra == 'all'",
- "google-cloud-orchestration-airflow (>=1.7.0) ; extra == 'all'",
- "google-cloud-os-login (>=2.9.1) ; extra == 'all'",
- "google-cloud-pubsub (>=2.15.0) ; extra == 'all'",
- "google-cloud-redis (>=2.12.0) ; extra == 'all'",
- "google-cloud-secret-manager (>=2.16.0) ; extra == 'all'",
- "google-cloud-spanner (>=3.11.1) ; extra == 'all'",
- "google-cloud-speech (>=2.18.0) ; extra == 'all'",
- "google-cloud-storage-transfer (>=1.4.1) ; extra == 'all'",
- "google-cloud-storage (>=2.7.0) ; extra == 'all'",
- "google-cloud-tasks (>=2.13.0) ; extra == 'all'",
- "google-cloud-texttospeech (>=2.14.1) ; extra == 'all'",
- "google-cloud-translate (>=3.11.0) ; extra == 'all'",
- "google-cloud-videointelligence (>=2.11.0) ; extra == 'all'",
- "google-cloud-vision (>=3.4.0) ; extra == 'all'",
- "google-cloud-workflows (>=1.10.0) ; extra == 'all'",
- "greenlet (>=0.4.9) ; extra == 'all'",
- "grpcio-gcp (>=0.2.2) ; extra == 'all'",
- "grpcio (>=1.15.0) ; extra == 'all'",
- "hdfs[avro,dataframe,kerberos] (>=2.0.4) ; extra == 'all'",
- "hmsclient (>=0.1.0) ; extra == 'all'",
- "httpx ; extra == 'all'",
- "hvac (>=0.10) ; extra == 'all'",
- "impyla (<1.0,>=0.18.0) ; extra == 'all'",
- "influxdb-client (>=1.19.0) ; extra == 'all'",
- "jaydebeapi (>=1.1.1) ; extra == 'all'",
- "json-merge-patch (>=0.2) ; extra == 'all'",
- "jsonpath-ng (>=1.5.3) ; extra == 'all'",
- "kubernetes (<24,>=21.7.0) ; extra == 'all'",
- "kubernetes-asyncio (<25,>=18.20.1) ; extra == 'all'",
- "kylinpy (>=2.6) ; extra == 'all'",
- "ldap3 (>=2.5.1) ; extra == 'all'",
- "looker-sdk (>=22.2.0) ; extra == 'all'",
- "mysqlclient (>=1.3.6) ; extra == 'all'",
- "neo4j (>=4.2.1) ; extra == 'all'",
- "openlineage-integration-common (>=0.28.0) ; extra == 'all'",
- "openlineage-python (>=0.28.0) ; extra == 'all'",
- "opentelemetry-exporter-prometheus ; extra == 'all'",
- "opsgenie-sdk (>=2.1.5) ; extra == 'all'",
- "oracledb (>=1.0.0) ; extra == 'all'",
- "oss2 (>=2.14.0) ; extra == 'all'",
- "pandas-gbq ; extra == 'all'",
- "pandas (>=0.17.1) ; extra == 'all'",
- "papermill[all] (>=1.2.1) ; extra == 'all'",
- "paramiko (>=2.6.0) ; extra == 'all'",
- "pdpyras (>=4.1.2) ; extra == 'all'",
- "pinotdb (>0.4.7) ; extra == 'all'",
- "plyvel ; extra == 'all'",
- "presto-python-client (>=0.8.2) ; extra == 'all'",
- "proto-plus (>=1.19.6) ; extra == 'all'",
- "psycopg2-binary (>=2.8.0) ; extra == 'all'",
- "pyarrow (>=9.0.0) ; extra == 'all'",
- "pydruid (>=0.4.1) ; extra == 'all'",
- "pyexasol (>=0.5.1) ; extra == 'all'",
- "pyhive[hive_pure_sasl] (>=0.7.0) ; extra == 'all'",
- "pykerberos (>=1.1.13) ; extra == 'all'",
- "pymongo (>=3.6.0) ; extra == 'all'",
- "pymssql (>=2.1.5) ; extra == 'all'",
- "pyodbc ; extra == 'all'",
- "pypsrp (>=0.8.0) ; extra == 'all'",
- "pyspark ; extra == 'all'",
- "python-arango (>=7.3.2) ; extra == 'all'",
- "python-dotenv (>=0.21.0) ; extra == 'all'",
- "python-jenkins (>=1.0.0) ; extra == 'all'",
- "python-ldap ; extra == 'all'",
- "python-telegram-bot (>=20.0.0) ; extra == 'all'",
- "pywinrm (>=0.4) ; extra == 'all'",
- "redis (!=4.5.5,<5.0.0,>=4.5.2) ; extra == 'all'",
- "redshift-connector (>=2.0.888) ; extra == 'all'",
- "requests (>=2.26.0) ; extra == 'all'",
- "requests (<3,>=2.27) ; extra == 'all'",
- "requests-kerberos (>=0.10.0) ; extra == 'all'",
- "requests-toolbelt ; extra == 'all'",
- "scrapbook[all] ; extra == 'all'",
- "sendgrid (>=6.0.0) ; extra == 'all'",
- "sentry-sdk (>=0.8.0) ; extra == 'all'",
- "simple-salesforce (>=1.0.0) ; extra == 'all'",
- "slack-sdk (>=3.0.0) ; extra == 'all'",
- "smbprotocol (>=1.5.0) ; extra == 'all'",
- "snowflake-connector-python (>=2.4.1) ; extra == 'all'",
- "snowflake-sqlalchemy (>=1.1.0) ; extra == 'all'",
- "spython (>=0.0.56) ; extra == 'all'",
- "sqlalchemy-bigquery (>=1.2.1) ; extra == 'all'",
- "sqlalchemy-drill (>=1.1.0) ; extra == 'all'",
- "sqlalchemy-spanner (>=1.6.2) ; extra == 'all'",
- "sqlalchemy-redshift (>=0.8.6) ; extra == 'all'",
- "sqlparse (>=0.4.2) ; extra == 'all'",
- "sshtunnel (>=0.3.2) ; extra == 'all'",
- "statsd (>=3.3.0) ; extra == 'all'",
- "tableauserverclient ; extra == 'all'",
- "thrift (>=0.9.2) ; extra == 'all'",
- "thrift-sasl (>=0.2.0) ; extra == 'all'",
- "trino (>=0.318.0) ; extra == 'all'",
- "vertica-python (>=0.5.1) ; extra == 'all'",
- "virtualenv ; extra == 'all'",
- "watchtower (~=2.0.1) ; extra == 'all'",
- "zenpy (>=2.0.24) ; extra == 'all'",
- "apache-airflow-providers-airbyte ; extra == 'all'",
- "apache-airflow-providers-alibaba ; extra == 'all'",
- "apache-airflow-providers-amazon ; extra == 'all'",
- "apache-airflow-providers-apache-beam ; extra == 'all'",
- "apache-airflow-providers-apache-cassandra ; extra == 'all'",
- "apache-airflow-providers-apache-drill ; extra == 'all'",
- "apache-airflow-providers-apache-druid ; extra == 'all'",
- "apache-airflow-providers-apache-flink ; extra == 'all'",
- "apache-airflow-providers-apache-hdfs ; extra == 'all'",
- "apache-airflow-providers-apache-hive ; extra == 'all'",
- "apache-airflow-providers-apache-impala ; extra == 'all'",
- "apache-airflow-providers-apache-kafka ; extra == 'all'",
- "apache-airflow-providers-apache-kylin ; extra == 'all'",
- "apache-airflow-providers-apache-livy ; extra == 'all'",
- "apache-airflow-providers-apache-pig ; extra == 'all'",
- "apache-airflow-providers-apache-pinot ; extra == 'all'",
- "apache-airflow-providers-apache-spark ; extra == 'all'",
- "apache-airflow-providers-apache-sqoop ; extra == 'all'",
- "apache-airflow-providers-apprise ; extra == 'all'",
- "apache-airflow-providers-arangodb ; extra == 'all'",
- "apache-airflow-providers-asana ; extra == 'all'",
- "apache-airflow-providers-atlassian-jira ; extra == 'all'",
- "apache-airflow-providers-celery ; extra == 'all'",
- "apache-airflow-providers-cloudant ; extra == 'all'",
- "apache-airflow-providers-cncf-kubernetes ; extra == 'all'",
- "apache-airflow-providers-common-sql ; extra == 'all'",
- "apache-airflow-providers-daskexecutor ; extra == 'all'",
- "apache-airflow-providers-databricks ; extra == 'all'",
- "apache-airflow-providers-datadog ; extra == 'all'",
- "apache-airflow-providers-dbt-cloud ; extra == 'all'",
- "apache-airflow-providers-dingding ; extra == 'all'",
- "apache-airflow-providers-discord ; extra == 'all'",
- "apache-airflow-providers-docker ; extra == 'all'",
- "apache-airflow-providers-elasticsearch ; extra == 'all'",
- "apache-airflow-providers-exasol ; extra == 'all'",
- "apache-airflow-providers-facebook ; extra == 'all'",
- "apache-airflow-providers-ftp ; extra == 'all'",
- "apache-airflow-providers-github ; extra == 'all'",
- "apache-airflow-providers-google ; extra == 'all'",
- "apache-airflow-providers-grpc ; extra == 'all'",
- "apache-airflow-providers-hashicorp ; extra == 'all'",
- "apache-airflow-providers-http ; extra == 'all'",
- "apache-airflow-providers-imap ; extra == 'all'",
- "apache-airflow-providers-influxdb ; extra == 'all'",
- "apache-airflow-providers-jdbc ; extra == 'all'",
- "apache-airflow-providers-jenkins ; extra == 'all'",
- "apache-airflow-providers-microsoft-azure ; extra == 'all'",
- "apache-airflow-providers-microsoft-mssql ; extra == 'all'",
- "apache-airflow-providers-microsoft-psrp ; extra == 'all'",
- "apache-airflow-providers-microsoft-winrm ; extra == 'all'",
- "apache-airflow-providers-mongo ; extra == 'all'",
- "apache-airflow-providers-mysql ; extra == 'all'",
- "apache-airflow-providers-neo4j ; extra == 'all'",
- "apache-airflow-providers-odbc ; extra == 'all'",
- "apache-airflow-providers-openfaas ; extra == 'all'",
- "apache-airflow-providers-openlineage ; extra == 'all'",
- "apache-airflow-providers-opsgenie ; extra == 'all'",
- "apache-airflow-providers-oracle ; extra == 'all'",
- "apache-airflow-providers-pagerduty ; extra == 'all'",
- "apache-airflow-providers-papermill ; extra == 'all'",
- "apache-airflow-providers-plexus ; extra == 'all'",
- "apache-airflow-providers-postgres ; extra == 'all'",
- "apache-airflow-providers-presto ; extra == 'all'",
- "apache-airflow-providers-redis ; extra == 'all'",
- "apache-airflow-providers-salesforce ; extra == 'all'",
- "apache-airflow-providers-samba ; extra == 'all'",
- "apache-airflow-providers-segment ; extra == 'all'",
- "apache-airflow-providers-sendgrid ; extra == 'all'",
- "apache-airflow-providers-sftp ; extra == 'all'",
- "apache-airflow-providers-singularity ; extra == 'all'",
- "apache-airflow-providers-slack ; extra == 'all'",
- "apache-airflow-providers-smtp ; extra == 'all'",
- "apache-airflow-providers-snowflake ; extra == 'all'",
- "apache-airflow-providers-sqlite ; extra == 'all'",
- "apache-airflow-providers-ssh ; extra == 'all'",
- "apache-airflow-providers-tableau ; extra == 'all'",
- "apache-airflow-providers-tabular ; extra == 'all'",
- "apache-airflow-providers-telegram ; extra == 'all'",
- "apache-airflow-providers-trino ; extra == 'all'",
- "apache-airflow-providers-vertica ; extra == 'all'",
- "apache-airflow-providers-zendesk ; extra == 'all'",
- "aiohttp (<4,>=3.6.3) ; extra == 'all_dbs'",
- "apache-airflow-providers-common-sql (>=1.3.1) ; extra == 'all_dbs'",
- "apache-airflow-providers-common-sql (>=1.5.0) ; extra == 'all_dbs'",
- "apache-airflow (>=2.4.0) ; extra == 'all_dbs'",
- "cassandra-driver (>=3.13.0) ; extra == 'all_dbs'",
- "cloudant (>=2.0) ; extra == 'all_dbs'",
- "databricks-sql-connector (<3.0.0,>=2.0.0) ; extra == 'all_dbs'",
- "dnspython (>=1.13.0) ; extra == 'all_dbs'",
- "hdfs[avro,dataframe,kerberos] (>=2.0.4) ; extra == 'all_dbs'",
- "hmsclient (>=0.1.0) ; extra == 'all_dbs'",
- "impyla (<1.0,>=0.18.0) ; extra == 'all_dbs'",
- "influxdb-client (>=1.19.0) ; extra == 'all_dbs'",
- "mysqlclient (>=1.3.6) ; extra == 'all_dbs'",
- "neo4j (>=4.2.1) ; extra == 'all_dbs'",
- "pandas (>=0.17.1) ; extra == 'all_dbs'",
- "pinotdb (>0.4.7) ; extra == 'all_dbs'",
- "presto-python-client (>=0.8.2) ; extra == 'all_dbs'",
- "psycopg2-binary (>=2.8.0) ; extra == 'all_dbs'",
- "pydruid (>=0.4.1) ; extra == 'all_dbs'",
- "pyexasol (>=0.5.1) ; extra == 'all_dbs'",
- "pyhive[hive_pure_sasl] (>=0.7.0) ; extra == 'all_dbs'",
- "pymongo (>=3.6.0) ; extra == 'all_dbs'",
- "pymssql (>=2.1.5) ; extra == 'all_dbs'",
- "python-arango (>=7.3.2) ; extra == 'all_dbs'",
- "requests (>=2.26.0) ; extra == 'all_dbs'",
- "requests (<3,>=2.27) ; extra == 'all_dbs'",
- "sqlalchemy-drill (>=1.1.0) ; extra == 'all_dbs'",
- "thrift (>=0.9.2) ; extra == 'all_dbs'",
- "trino (>=0.318.0) ; extra == 'all_dbs'",
- "vertica-python (>=0.5.1) ; extra == 'all_dbs'",
- "apache-airflow-providers-apache-cassandra ; extra == 'all_dbs'",
- "apache-airflow-providers-apache-drill ; extra == 'all_dbs'",
- "apache-airflow-providers-apache-druid ; extra == 'all_dbs'",
- "apache-airflow-providers-apache-hdfs ; extra == 'all_dbs'",
- "apache-airflow-providers-apache-hive ; extra == 'all_dbs'",
- "apache-airflow-providers-apache-impala ; extra == 'all_dbs'",
- "apache-airflow-providers-apache-pinot ; extra == 'all_dbs'",
- "apache-airflow-providers-arangodb ; extra == 'all_dbs'",
- "apache-airflow-providers-cloudant ; extra == 'all_dbs'",
- "apache-airflow-providers-databricks ; extra == 'all_dbs'",
- "apache-airflow-providers-exasol ; extra == 'all_dbs'",
- "apache-airflow-providers-influxdb ; extra == 'all_dbs'",
- "apache-airflow-providers-microsoft-mssql ; extra == 'all_dbs'",
- "apache-airflow-providers-mongo ; extra == 'all_dbs'",
- "apache-airflow-providers-mysql ; extra == 'all_dbs'",
- "apache-airflow-providers-neo4j ; extra == 'all_dbs'",
- "apache-airflow-providers-postgres ; extra == 'all_dbs'",
- "apache-airflow-providers-presto ; extra == 'all_dbs'",
- "apache-airflow-providers-trino ; extra == 'all_dbs'",
- "apache-airflow-providers-vertica ; extra == 'all_dbs'",
- "apache-airflow-providers-amazon ; extra == 'amazon'",
- "atlasclient (>=0.1.2) ; extra == 'apache.atlas'",
- "apache-airflow-providers-apache-beam ; extra == 'apache.beam'",
- "apache-airflow-providers-apache-cassandra ; extra == 'apache.cassandra'",
- "apache-airflow-providers-apache-drill ; extra == 'apache.drill'",
- "apache-airflow-providers-apache-druid ; extra == 'apache.druid'",
- "apache-airflow-providers-apache-flink ; extra == 'apache.flink'",
- "apache-airflow-providers-apache-hdfs ; extra == 'apache.hdfs'",
- "apache-airflow-providers-apache-hive (>=5.1.0) ; extra == 'apache.hive'",
- "apache-airflow-providers-apache-impala ; extra == 'apache.impala'",
- "apache-airflow-providers-apache-kafka ; extra == 'apache.kafka'",
- "apache-airflow-providers-apache-kylin ; extra == 'apache.kylin'",
- "apache-airflow-providers-apache-livy ; extra == 'apache.livy'",
- "apache-airflow-providers-apache-pig ; extra == 'apache.pig'",
- "apache-airflow-providers-apache-pinot ; extra == 'apache.pinot'",
- "apache-airflow-providers-apache-spark ; extra == 'apache.spark'",
- "apache-airflow-providers-apache-sqoop ; extra == 'apache.sqoop'",
- "hdfs[avro,dataframe,kerberos] (>=2.0.4) ; extra == 'apache.webhdfs'",
- "apache-airflow-providers-apprise ; extra == 'apprise'",
- "apache-airflow-providers-arangodb ; extra == 'arangodb'",
- "apache-airflow-providers-asana ; extra == 'asana'",
- "eventlet (>=0.33.3) ; extra == 'async'",
- "gevent (>=0.13) ; extra == 'async'",
- "greenlet (>=0.4.9) ; extra == 'async'",
- "apache-airflow-providers-apache-atlas ; extra == 'atlas'",
- "apache-airflow-providers-atlassian-jira ; extra == 'atlassian.jira'",
- "apache-airflow-providers-amazon ; extra == 'aws'",
- "apache-airflow-providers-microsoft-azure ; extra == 'azure'",
- "apache-airflow-providers-apache-cassandra ; extra == 'cassandra'",
- "apache-airflow (>=2.4.0) ; extra == 'celery'",
- "celery (!=5.3.2,!=5.3.3,<6,>=5.3.0) ; extra == 'celery'",
- "flower (>=1.0.0) ; extra == 'celery'",
- "apache-airflow-providers-celery ; extra == 'celery'",
- "cgroupspy (>=0.2.2) ; extra == 'cgroups'",
- "apache-airflow-providers-cloudant ; extra == 'cloudant'",
- "apache-airflow (>=2.4.0) ; extra == 'cncf.kubernetes'",
- "asgiref (>=3.5.2) ; extra == 'cncf.kubernetes'",
- "cryptography (>=2.0.0) ; extra == 'cncf.kubernetes'",
- "kubernetes (<24,>=21.7.0) ; extra == 'cncf.kubernetes'",
- "kubernetes-asyncio (<25,>=18.20.1) ; extra == 'cncf.kubernetes'",
- "apache-airflow-providers-cncf-kubernetes ; extra == 'cncf.kubernetes'",
- "apache-airflow-providers-common-sql ; extra == 'common.sql'",
- "apache-airflow (>=2.4.0) ; extra == 'dask'",
- "cloudpickle (>=1.4.1) ; extra == 'dask'",
- "dask (!=2022.10.1,!=2023.5.0,>=2.9.0) ; extra == 'dask'",
- "distributed (!=2023.5.0,>=2.11.1) ; extra == 'dask'",
- "apache-airflow-providers-daskexecutor ; extra == 'dask'",
- "apache-airflow (>=2.4.0) ; extra == 'daskexecutor'",
- "cloudpickle (>=1.4.1) ; extra == 'daskexecutor'",
- "dask (!=2022.10.1,!=2023.5.0,>=2.9.0) ; extra == 'daskexecutor'",
- "distributed (!=2023.5.0,>=2.11.1) ; extra == 'daskexecutor'",
- "apache-airflow-providers-daskexecutor ; extra == 'daskexecutor'",
- "apache-airflow-providers-databricks ; extra == 'databricks'",
- "apache-airflow-providers-datadog ; extra == 'datadog'",
- "apache-airflow-providers-dbt-cloud ; extra == 'dbt.cloud'",
- "requests (>=2.26.0) ; extra == 'deprecated_api'",
- "aiobotocore (>=2.1.1) ; extra == 'devel'",
- "aioresponses ; extra == 'devel'",
- "apache-airflow-providers-common-sql ; extra == 'devel'",
- "apache-airflow (>=2.4.0) ; extra == 'devel'",
- "astroid (<3.0,>=2.12.3) ; extra == 'devel'",
- "aws-xray-sdk ; extra == 'devel'",
- "bcrypt (>=2.0.0) ; extra == 'devel'",
- "beautifulsoup4 (>=4.7.1) ; extra == 'devel'",
- "black ; extra == 'devel'",
- "blinker ; extra == 'devel'",
- "cgroupspy (>=0.2.2) ; extra == 'devel'",
- "checksumdir ; extra == 'devel'",
- "click (>=8.0) ; extra == 'devel'",
- "click (!=8.1.4,!=8.1.5,>=8.0) ; extra == 'devel'",
- "coverage (>=7.2) ; extra == 'devel'",
- "cryptography (>=2.0.0) ; extra == 'devel'",
- "docutils (<0.17.0) ; extra == 'devel'",
- "eralchemy2 ; extra == 'devel'",
- "filelock ; extra == 'devel'",
- "flask-bcrypt (>=0.7.1) ; extra == 'devel'",
- "gitpython ; extra == 'devel'",
- "ipdb ; extra == 'devel'",
- "jsonschema (>=3.0) ; extra == 'devel'",
- "kubernetes (<24,>=21.7.0) ; extra == 'devel'",
- "mongomock ; extra == 'devel'",
- "moto[glue] (>=4.0) ; extra == 'devel'",
- "mypy-boto3-appflow (>=1.28.0) ; extra == 'devel'",
- "mypy-boto3-rds (>=1.28.0) ; extra == 'devel'",
- "mypy-boto3-redshift-data (>=1.28.0) ; extra == 'devel'",
- "mypy-boto3-s3 (>=1.28.0) ; extra == 'devel'",
- "mypy (==1.2.0) ; extra == 'devel'",
- "mysqlclient (>=1.3.6) ; extra == 'devel'",
- "openapi-spec-validator (>=0.2.8) ; extra == 'devel'",
- "pandas (>=0.17.1) ; extra == 'devel'",
- "pipdeptree ; extra == 'devel'",
- "pre-commit ; extra == 'devel'",
- "pyarrow (>=9.0.0) ; extra == 'devel'",
- "pygithub ; extra == 'devel'",
- "pytest ; extra == 'devel'",
- "pytest-asyncio ; extra == 'devel'",
- "pytest-capture-warnings ; extra == 'devel'",
- "pytest-cov ; extra == 'devel'",
- "pytest-httpx ; extra == 'devel'",
- "pytest-instafail ; extra == 'devel'",
- "pytest-mock ; extra == 'devel'",
- "pytest-rerunfailures ; extra == 'devel'",
- "pytest-timeouts ; extra == 'devel'",
- "pytest-xdist ; extra == 'devel'",
- "pywinrm ; extra == 'devel'",
- "requests-mock ; extra == 'devel'",
- "rich-click (>=1.5) ; extra == 'devel'",
- "ruff (>=0.0.219) ; extra == 'devel'",
- "semver ; extra == 'devel'",
- "sphinx-airflow-theme ; extra == 'devel'",
- "sphinx-argparse (>=0.1.13) ; extra == 'devel'",
- "sphinx-autoapi (>=2.0.0) ; extra == 'devel'",
- "sphinx-copybutton ; extra == 'devel'",
- "sphinx-jinja (>=2.0) ; extra == 'devel'",
- "sphinx-rtd-theme (>=0.1.6) ; extra == 'devel'",
- "sphinx (>=5.2.0) ; extra == 'devel'",
- "sphinxcontrib-httpdomain (>=1.7.0) ; extra == 'devel'",
- "sphinxcontrib-redoc (>=1.6.0) ; extra == 'devel'",
- "sphinxcontrib-spelling (>=7.3) ; extra == 'devel'",
- "time-machine ; extra == 'devel'",
- "towncrier ; extra == 'devel'",
- "twine ; extra == 'devel'",
- "types-Deprecated ; extra == 'devel'",
- "types-Markdown ; extra == 'devel'",
- "types-PyMySQL ; extra == 'devel'",
- "types-PyYAML ; extra == 'devel'",
- "types-certifi ; extra == 'devel'",
- "types-croniter ; extra == 'devel'",
- "types-docutils ; extra == 'devel'",
- "types-paramiko ; extra == 'devel'",
- "types-protobuf ; extra == 'devel'",
- "types-python-dateutil ; extra == 'devel'",
- "types-python-slugify ; extra == 'devel'",
- "types-pytz ; extra == 'devel'",
- "types-redis ; extra == 'devel'",
- "types-requests ; extra == 'devel'",
- "types-setuptools ; extra == 'devel'",
- "types-tabulate ; extra == 'devel'",
- "types-termcolor ; extra == 'devel'",
- "types-toml ; extra == 'devel'",
- "wheel ; extra == 'devel'",
- "yamllint ; extra == 'devel'",
- "backports.zoneinfo (>=0.2.1) ; (python_version < \"3.9\") and extra == 'devel'",
- "PyGithub (!=1.58) ; extra == 'devel_all'",
- "PyOpenSSL ; extra == 'devel_all'",
- "adal (>=1.2.7) ; extra == 'devel_all'",
- "aiobotocore (>=2.1.1) ; extra == 'devel_all'",
- "aiohttp ; extra == 'devel_all'",
- "aiohttp (<4,>=3.6.3) ; extra == 'devel_all'",
- "aioresponses ; extra == 'devel_all'",
- "alibabacloud-adb20211201 (>=1.0.0) ; extra == 'devel_all'",
- "alibabacloud-tea-openapi (>=0.3.7) ; extra == 'devel_all'",
- "amqp ; extra == 'devel_all'",
- "analytics-python (>=1.2.9) ; extra == 'devel_all'",
- "apache-airflow-providers-common-sql ; extra == 'devel_all'",
- "apache-airflow (>=2.4.0) ; extra == 'devel_all'",
- "apache-airflow (>=2.7.0) ; extra == 'devel_all'",
- "apache-beam (>=2.47.0) ; extra == 'devel_all'",
- "apprise ; extra == 'devel_all'",
- "arrow (>=0.16.0) ; extra == 'devel_all'",
- "asana (<4.0.0,>=0.10) ; extra == 'devel_all'",
- "asgiref ; extra == 'devel_all'",
- "asgiref (>=3.5.2) ; extra == 'devel_all'",
- "astroid (<3.0,>=2.12.3) ; extra == 'devel_all'",
- "atlasclient (>=0.1.2) ; extra == 'devel_all'",
- "atlassian-python-api (>=1.14.2) ; extra == 'devel_all'",
- "attrs (>=22.2) ; extra == 'devel_all'",
- "authlib (>=1.0.0) ; extra == 'devel_all'",
- "aws-xray-sdk ; extra == 'devel_all'",
- "azure-batch (>=8.0.0) ; extra == 'devel_all'",
- "azure-cosmos (>=4.0.0) ; extra == 'devel_all'",
- "azure-datalake-store (>=0.0.45) ; extra == 'devel_all'",
- "azure-identity (>=1.3.1) ; extra == 'devel_all'",
- "azure-keyvault-secrets (>=4.1.0) ; extra == 'devel_all'",
- "azure-kusto-data (<0.1,>=0.0.43) ; extra == 'devel_all'",
- "azure-mgmt-containerinstance (<2.0,>=1.5.0) ; extra == 'devel_all'",
- "azure-mgmt-datafactory (<2.0,>=1.0.0) ; extra == 'devel_all'",
- "azure-mgmt-datalake-store (>=0.5.0) ; extra == 'devel_all'",
- "azure-mgmt-resource (>=2.2.0) ; extra == 'devel_all'",
- "azure-servicebus (>=7.6.1) ; extra == 'devel_all'",
- "azure-storage-blob (>=12.14.0) ; extra == 'devel_all'",
- "azure-storage-common (>=2.1.0) ; extra == 'devel_all'",
- "azure-storage-file-datalake (>=12.9.1) ; extra == 'devel_all'",
- "azure-storage-file (>=2.1.0) ; extra == 'devel_all'",
- "azure-synapse-spark ; extra == 'devel_all'",
- "bcrypt (>=2.0.0) ; extra == 'devel_all'",
- "beautifulsoup4 (>=4.7.1) ; extra == 'devel_all'",
- "black ; extra == 'devel_all'",
- "blinker ; extra == 'devel_all'",
- "blinker (>=1.1) ; extra == 'devel_all'",
- "boto3 (>=1.28.0) ; extra == 'devel_all'",
- "botocore (>=1.31.0) ; extra == 'devel_all'",
- "cassandra-driver (>=3.13.0) ; extra == 'devel_all'",
- "celery (!=5.3.2,!=5.3.3,<6,>=5.3.0) ; extra == 'devel_all'",
- "cgroupspy (>=0.2.2) ; extra == 'devel_all'",
- "checksumdir ; extra == 'devel_all'",
- "click (>=8.0) ; extra == 'devel_all'",
- "click (!=8.1.4,!=8.1.5,>=8.0) ; extra == 'devel_all'",
- "cloudant (>=2.0) ; extra == 'devel_all'",
- "cloudpickle (>=1.4.1) ; extra == 'devel_all'",
- "confluent-kafka (>=1.8.2) ; extra == 'devel_all'",
- "coverage (>=7.2) ; extra == 'devel_all'",
- "cryptography (>=2.0.0) ; extra == 'devel_all'",
- "dask (!=2022.10.1,!=2023.5.0,>=2.9.0) ; extra == 'devel_all'",
- "databricks-sql-connector (<3.0.0,>=2.0.0) ; extra == 'devel_all'",
- "datadog (>=0.14.0) ; extra == 'devel_all'",
- "distributed (!=2023.5.0,>=2.11.1) ; extra == 'devel_all'",
- "dnspython (>=1.13.0) ; extra == 'devel_all'",
- "docker (>=5.0.3) ; extra == 'devel_all'",
- "docutils (<0.17.0) ; extra == 'devel_all'",
- "elasticsearch (<9,>8) ; extra == 'devel_all'",
- "eralchemy2 ; extra == 'devel_all'",
- "eventlet (>=0.33.3) ; extra == 'devel_all'",
- "facebook-business (>=6.0.2) ; extra == 'devel_all'",
- "filelock ; extra == 'devel_all'",
- "flask-appbuilder[oauth] (==4.3.6) ; extra == 'devel_all'",
- "flask-bcrypt (>=0.7.1) ; extra == 'devel_all'",
- "flower (>=1.0.0) ; extra == 'devel_all'",
- "gcloud-aio-auth (<5.0.0,>=4.0.0) ; extra == 'devel_all'",
- "gcloud-aio-bigquery (>=6.1.2) ; extra == 'devel_all'",
- "gcloud-aio-storage ; extra == 'devel_all'",
- "gevent (>=0.13) ; extra == 'devel_all'",
- "gitpython ; extra == 'devel_all'",
- "google-ads (>=21.2.0) ; extra == 'devel_all'",
- "google-api-core (>=2.11.0) ; extra == 'devel_all'",
- "google-api-python-client (>=1.6.0) ; extra == 'devel_all'",
- "google-auth-httplib2 (>=0.0.1) ; extra == 'devel_all'",
- "google-auth (>=1.0.0) ; extra == 'devel_all'",
- "google-auth (<3.0.0,>=1.0.0) ; extra == 'devel_all'",
- "google-cloud-aiplatform (>=1.22.1) ; extra == 'devel_all'",
- "google-cloud-automl (>=2.11.0) ; extra == 'devel_all'",
- "google-cloud-bigquery-datatransfer (>=3.11.0) ; extra == 'devel_all'",
- "google-cloud-bigtable (>=2.17.0) ; extra == 'devel_all'",
- "google-cloud-build (>=3.13.0) ; extra == 'devel_all'",
- "google-cloud-compute (>=1.10.0) ; extra == 'devel_all'",
- "google-cloud-container (>=2.17.4) ; extra == 'devel_all'",
- "google-cloud-datacatalog (>=3.11.1) ; extra == 'devel_all'",
- "google-cloud-dataflow-client (>=0.8.2) ; extra == 'devel_all'",
- "google-cloud-dataform (>=0.5.0) ; extra == 'devel_all'",
- "google-cloud-dataplex (>=1.4.2) ; extra == 'devel_all'",
- "google-cloud-dataproc-metastore (>=1.12.0) ; extra == 'devel_all'",
- "google-cloud-dataproc (>=5.4.0) ; extra == 'devel_all'",
- "google-cloud-dlp (>=3.12.0) ; extra == 'devel_all'",
- "google-cloud-kms (>=2.15.0) ; extra == 'devel_all'",
- "google-cloud-language (>=2.9.0) ; extra == 'devel_all'",
- "google-cloud-logging (>=3.5.0) ; extra == 'devel_all'",
- "google-cloud-memcache (>=1.7.0) ; extra == 'devel_all'",
- "google-cloud-monitoring (>=2.14.1) ; extra == 'devel_all'",
- "google-cloud-orchestration-airflow (>=1.7.0) ; extra == 'devel_all'",
- "google-cloud-os-login (>=2.9.1) ; extra == 'devel_all'",
- "google-cloud-pubsub (>=2.15.0) ; extra == 'devel_all'",
- "google-cloud-redis (>=2.12.0) ; extra == 'devel_all'",
- "google-cloud-secret-manager (>=2.16.0) ; extra == 'devel_all'",
- "google-cloud-spanner (>=3.11.1) ; extra == 'devel_all'",
- "google-cloud-speech (>=2.18.0) ; extra == 'devel_all'",
- "google-cloud-storage-transfer (>=1.4.1) ; extra == 'devel_all'",
- "google-cloud-storage (>=2.7.0) ; extra == 'devel_all'",
- "google-cloud-tasks (>=2.13.0) ; extra == 'devel_all'",
- "google-cloud-texttospeech (>=2.14.1) ; extra == 'devel_all'",
- "google-cloud-translate (>=3.11.0) ; extra == 'devel_all'",
- "google-cloud-videointelligence (>=2.11.0) ; extra == 'devel_all'",
- "google-cloud-vision (>=3.4.0) ; extra == 'devel_all'",
- "google-cloud-workflows (>=1.10.0) ; extra == 'devel_all'",
- "greenlet (>=0.4.9) ; extra == 'devel_all'",
- "grpcio-gcp (>=0.2.2) ; extra == 'devel_all'",
- "grpcio (>=1.15.0) ; extra == 'devel_all'",
- "hdfs[avro,dataframe,kerberos] (>=2.0.4) ; extra == 'devel_all'",
- "hmsclient (>=0.1.0) ; extra == 'devel_all'",
- "httpx ; extra == 'devel_all'",
- "hvac (>=0.10) ; extra == 'devel_all'",
- "impyla (<1.0,>=0.18.0) ; extra == 'devel_all'",
- "influxdb-client (>=1.19.0) ; extra == 'devel_all'",
- "ipdb ; extra == 'devel_all'",
- "jaydebeapi (>=1.1.1) ; extra == 'devel_all'",
- "json-merge-patch (>=0.2) ; extra == 'devel_all'",
- "jsonpath-ng (>=1.5.3) ; extra == 'devel_all'",
- "jsonschema (>=3.0) ; extra == 'devel_all'",
- "kubernetes (<24,>=21.7.0) ; extra == 'devel_all'",
- "kubernetes-asyncio (<25,>=18.20.1) ; extra == 'devel_all'",
- "kylinpy (>=2.6) ; extra == 'devel_all'",
- "ldap3 (>=2.5.1) ; extra == 'devel_all'",
- "looker-sdk (>=22.2.0) ; extra == 'devel_all'",
- "mongomock ; extra == 'devel_all'",
- "moto[glue] (>=4.0) ; extra == 'devel_all'",
- "mypy-boto3-appflow (>=1.28.0) ; extra == 'devel_all'",
- "mypy-boto3-rds (>=1.28.0) ; extra == 'devel_all'",
- "mypy-boto3-redshift-data (>=1.28.0) ; extra == 'devel_all'",
- "mypy-boto3-s3 (>=1.28.0) ; extra == 'devel_all'",
- "mypy (==1.2.0) ; extra == 'devel_all'",
- "mysqlclient (>=1.3.6) ; extra == 'devel_all'",
- "neo4j (>=4.2.1) ; extra == 'devel_all'",
- "openapi-spec-validator (>=0.2.8) ; extra == 'devel_all'",
- "openlineage-integration-common (>=0.28.0) ; extra == 'devel_all'",
- "openlineage-python (>=0.28.0) ; extra == 'devel_all'",
- "opentelemetry-exporter-prometheus ; extra == 'devel_all'",
- "opsgenie-sdk (>=2.1.5) ; extra == 'devel_all'",
- "oracledb (>=1.0.0) ; extra == 'devel_all'",
- "oss2 (>=2.14.0) ; extra == 'devel_all'",
- "pandas-gbq ; extra == 'devel_all'",
- "pandas (>=0.17.1) ; extra == 'devel_all'",
- "papermill[all] (>=1.2.1) ; extra == 'devel_all'",
- "paramiko (>=2.6.0) ; extra == 'devel_all'",
- "pdpyras (>=4.1.2) ; extra == 'devel_all'",
- "pinotdb (>0.4.7) ; extra == 'devel_all'",
- "pipdeptree ; extra == 'devel_all'",
- "plyvel ; extra == 'devel_all'",
- "pre-commit ; extra == 'devel_all'",
- "presto-python-client (>=0.8.2) ; extra == 'devel_all'",
- "proto-plus (>=1.19.6) ; extra == 'devel_all'",
- "psycopg2-binary (>=2.8.0) ; extra == 'devel_all'",
- "pyarrow (>=9.0.0) ; extra == 'devel_all'",
- "pydruid (>=0.4.1) ; extra == 'devel_all'",
- "pyexasol (>=0.5.1) ; extra == 'devel_all'",
- "pygithub ; extra == 'devel_all'",
- "pyhive[hive_pure_sasl] (>=0.7.0) ; extra == 'devel_all'",
- "pykerberos (>=1.1.13) ; extra == 'devel_all'",
- "pymongo (>=3.6.0) ; extra == 'devel_all'",
- "pymssql (>=2.1.5) ; extra == 'devel_all'",
- "pyodbc ; extra == 'devel_all'",
- "pypsrp (>=0.8.0) ; extra == 'devel_all'",
- "pyspark ; extra == 'devel_all'",
- "pytest ; extra == 'devel_all'",
- "pytest-asyncio ; extra == 'devel_all'",
- "pytest-capture-warnings ; extra == 'devel_all'",
- "pytest-cov ; extra == 'devel_all'",
- "pytest-httpx ; extra == 'devel_all'",
- "pytest-instafail ; extra == 'devel_all'",
- "pytest-mock ; extra == 'devel_all'",
- "pytest-rerunfailures ; extra == 'devel_all'",
- "pytest-timeouts ; extra == 'devel_all'",
- "pytest-xdist ; extra == 'devel_all'",
- "python-arango (>=7.3.2) ; extra == 'devel_all'",
- "python-dotenv (>=0.21.0) ; extra == 'devel_all'",
- "python-jenkins (>=1.0.0) ; extra == 'devel_all'",
- "python-ldap ; extra == 'devel_all'",
- "python-telegram-bot (>=20.0.0) ; extra == 'devel_all'",
- "pywinrm ; extra == 'devel_all'",
- "pywinrm (>=0.4) ; extra == 'devel_all'",
- "redis (!=4.5.5,<5.0.0,>=4.5.2) ; extra == 'devel_all'",
- "redshift-connector (>=2.0.888) ; extra == 'devel_all'",
- "requests (>=2.26.0) ; extra == 'devel_all'",
- "requests (<3,>=2.27) ; extra == 'devel_all'",
- "requests-kerberos (>=0.10.0) ; extra == 'devel_all'",
- "requests-mock ; extra == 'devel_all'",
- "requests-toolbelt ; extra == 'devel_all'",
- "rich-click (>=1.5) ; extra == 'devel_all'",
- "ruff (>=0.0.219) ; extra == 'devel_all'",
- "scrapbook[all] ; extra == 'devel_all'",
- "semver ; extra == 'devel_all'",
- "sendgrid (>=6.0.0) ; extra == 'devel_all'",
- "sentry-sdk (>=0.8.0) ; extra == 'devel_all'",
- "simple-salesforce (>=1.0.0) ; extra == 'devel_all'",
- "slack-sdk (>=3.0.0) ; extra == 'devel_all'",
- "smbprotocol (>=1.5.0) ; extra == 'devel_all'",
- "snowflake-connector-python (>=2.4.1) ; extra == 'devel_all'",
- "snowflake-sqlalchemy (>=1.1.0) ; extra == 'devel_all'",
- "sphinx-airflow-theme ; extra == 'devel_all'",
- "sphinx-argparse (>=0.1.13) ; extra == 'devel_all'",
- "sphinx-autoapi (>=2.0.0) ; extra == 'devel_all'",
- "sphinx-copybutton ; extra == 'devel_all'",
- "sphinx-jinja (>=2.0) ; extra == 'devel_all'",
- "sphinx-rtd-theme (>=0.1.6) ; extra == 'devel_all'",
- "sphinx (>=5.2.0) ; extra == 'devel_all'",
- "sphinxcontrib-httpdomain (>=1.7.0) ; extra == 'devel_all'",
- "sphinxcontrib-redoc (>=1.6.0) ; extra == 'devel_all'",
- "sphinxcontrib-spelling (>=7.3) ; extra == 'devel_all'",
- "spython (>=0.0.56) ; extra == 'devel_all'",
- "sqlalchemy-bigquery (>=1.2.1) ; extra == 'devel_all'",
- "sqlalchemy-drill (>=1.1.0) ; extra == 'devel_all'",
- "sqlalchemy-spanner (>=1.6.2) ; extra == 'devel_all'",
- "sqlalchemy-redshift (>=0.8.6) ; extra == 'devel_all'",
- "sqlparse (>=0.4.2) ; extra == 'devel_all'",
- "sshtunnel (>=0.3.2) ; extra == 'devel_all'",
- "statsd (>=3.3.0) ; extra == 'devel_all'",
- "tableauserverclient ; extra == 'devel_all'",
- "thrift (>=0.9.2) ; extra == 'devel_all'",
- "thrift-sasl (>=0.2.0) ; extra == 'devel_all'",
- "time-machine ; extra == 'devel_all'",
- "towncrier ; extra == 'devel_all'",
- "trino (>=0.318.0) ; extra == 'devel_all'",
- "twine ; extra == 'devel_all'",
- "types-Deprecated ; extra == 'devel_all'",
- "types-Markdown ; extra == 'devel_all'",
- "types-PyMySQL ; extra == 'devel_all'",
- "types-PyYAML ; extra == 'devel_all'",
- "types-certifi ; extra == 'devel_all'",
- "types-croniter ; extra == 'devel_all'",
- "types-docutils ; extra == 'devel_all'",
- "types-paramiko ; extra == 'devel_all'",
- "types-protobuf ; extra == 'devel_all'",
- "types-python-dateutil ; extra == 'devel_all'",
- "types-python-slugify ; extra == 'devel_all'",
- "types-pytz ; extra == 'devel_all'",
- "types-redis ; extra == 'devel_all'",
- "types-requests ; extra == 'devel_all'",
- "types-setuptools ; extra == 'devel_all'",
- "types-tabulate ; extra == 'devel_all'",
- "types-termcolor ; extra == 'devel_all'",
- "types-toml ; extra == 'devel_all'",
- "vertica-python (>=0.5.1) ; extra == 'devel_all'",
- "virtualenv ; extra == 'devel_all'",
- "watchtower (~=2.0.1) ; extra == 'devel_all'",
- "wheel ; extra == 'devel_all'",
- "yamllint ; extra == 'devel_all'",
- "zenpy (>=2.0.24) ; extra == 'devel_all'",
- "apache-airflow-providers-airbyte ; extra == 'devel_all'",
- "apache-airflow-providers-alibaba ; extra == 'devel_all'",
- "apache-airflow-providers-amazon ; extra == 'devel_all'",
- "apache-airflow-providers-apache-beam ; extra == 'devel_all'",
- "apache-airflow-providers-apache-cassandra ; extra == 'devel_all'",
- "apache-airflow-providers-apache-drill ; extra == 'devel_all'",
- "apache-airflow-providers-apache-druid ; extra == 'devel_all'",
- "apache-airflow-providers-apache-flink ; extra == 'devel_all'",
- "apache-airflow-providers-apache-hdfs ; extra == 'devel_all'",
- "apache-airflow-providers-apache-hive ; extra == 'devel_all'",
- "apache-airflow-providers-apache-impala ; extra == 'devel_all'",
- "apache-airflow-providers-apache-kafka ; extra == 'devel_all'",
- "apache-airflow-providers-apache-kylin ; extra == 'devel_all'",
- "apache-airflow-providers-apache-livy ; extra == 'devel_all'",
- "apache-airflow-providers-apache-pig ; extra == 'devel_all'",
- "apache-airflow-providers-apache-pinot ; extra == 'devel_all'",
- "apache-airflow-providers-apache-spark ; extra == 'devel_all'",
- "apache-airflow-providers-apache-sqoop ; extra == 'devel_all'",
- "apache-airflow-providers-apprise ; extra == 'devel_all'",
- "apache-airflow-providers-arangodb ; extra == 'devel_all'",
- "apache-airflow-providers-asana ; extra == 'devel_all'",
- "apache-airflow-providers-atlassian-jira ; extra == 'devel_all'",
- "apache-airflow-providers-celery ; extra == 'devel_all'",
- "apache-airflow-providers-cloudant ; extra == 'devel_all'",
- "apache-airflow-providers-cncf-kubernetes ; extra == 'devel_all'",
- "apache-airflow-providers-daskexecutor ; extra == 'devel_all'",
- "apache-airflow-providers-databricks ; extra == 'devel_all'",
- "apache-airflow-providers-datadog ; extra == 'devel_all'",
- "apache-airflow-providers-dbt-cloud ; extra == 'devel_all'",
- "apache-airflow-providers-dingding ; extra == 'devel_all'",
- "apache-airflow-providers-discord ; extra == 'devel_all'",
- "apache-airflow-providers-docker ; extra == 'devel_all'",
- "apache-airflow-providers-elasticsearch ; extra == 'devel_all'",
- "apache-airflow-providers-exasol ; extra == 'devel_all'",
- "apache-airflow-providers-facebook ; extra == 'devel_all'",
- "apache-airflow-providers-ftp ; extra == 'devel_all'",
- "apache-airflow-providers-github ; extra == 'devel_all'",
- "apache-airflow-providers-google ; extra == 'devel_all'",
- "apache-airflow-providers-grpc ; extra == 'devel_all'",
- "apache-airflow-providers-hashicorp ; extra == 'devel_all'",
- "apache-airflow-providers-http ; extra == 'devel_all'",
- "apache-airflow-providers-imap ; extra == 'devel_all'",
- "apache-airflow-providers-influxdb ; extra == 'devel_all'",
- "apache-airflow-providers-jdbc ; extra == 'devel_all'",
- "apache-airflow-providers-jenkins ; extra == 'devel_all'",
- "apache-airflow-providers-microsoft-azure ; extra == 'devel_all'",
- "apache-airflow-providers-microsoft-mssql ; extra == 'devel_all'",
- "apache-airflow-providers-microsoft-psrp ; extra == 'devel_all'",
- "apache-airflow-providers-microsoft-winrm ; extra == 'devel_all'",
- "apache-airflow-providers-mongo ; extra == 'devel_all'",
- "apache-airflow-providers-mysql ; extra == 'devel_all'",
- "apache-airflow-providers-neo4j ; extra == 'devel_all'",
- "apache-airflow-providers-odbc ; extra == 'devel_all'",
- "apache-airflow-providers-openfaas ; extra == 'devel_all'",
- "apache-airflow-providers-openlineage ; extra == 'devel_all'",
- "apache-airflow-providers-opsgenie ; extra == 'devel_all'",
- "apache-airflow-providers-oracle ; extra == 'devel_all'",
- "apache-airflow-providers-pagerduty ; extra == 'devel_all'",
- "apache-airflow-providers-papermill ; extra == 'devel_all'",
- "apache-airflow-providers-plexus ; extra == 'devel_all'",
- "apache-airflow-providers-postgres ; extra == 'devel_all'",
- "apache-airflow-providers-presto ; extra == 'devel_all'",
- "apache-airflow-providers-redis ; extra == 'devel_all'",
- "apache-airflow-providers-salesforce ; extra == 'devel_all'",
- "apache-airflow-providers-samba ; extra == 'devel_all'",
- "apache-airflow-providers-segment ; extra == 'devel_all'",
- "apache-airflow-providers-sendgrid ; extra == 'devel_all'",
- "apache-airflow-providers-sftp ; extra == 'devel_all'",
- "apache-airflow-providers-singularity ; extra == 'devel_all'",
- "apache-airflow-providers-slack ; extra == 'devel_all'",
- "apache-airflow-providers-smtp ; extra == 'devel_all'",
- "apache-airflow-providers-snowflake ; extra == 'devel_all'",
- "apache-airflow-providers-sqlite ; extra == 'devel_all'",
- "apache-airflow-providers-ssh ; extra == 'devel_all'",
- "apache-airflow-providers-tableau ; extra == 'devel_all'",
- "apache-airflow-providers-tabular ; extra == 'devel_all'",
- "apache-airflow-providers-telegram ; extra == 'devel_all'",
- "apache-airflow-providers-trino ; extra == 'devel_all'",
- "apache-airflow-providers-vertica ; extra == 'devel_all'",
- "apache-airflow-providers-zendesk ; extra == 'devel_all'",
- "backports.zoneinfo (>=0.2.1) ; (python_version < \"3.9\") and extra == 'devel_all'",
- "PyGithub (!=1.58) ; extra == 'devel_ci'",
- "PyOpenSSL ; extra == 'devel_ci'",
- "adal (>=1.2.7) ; extra == 'devel_ci'",
- "aiobotocore (>=2.1.1) ; extra == 'devel_ci'",
- "aiohttp ; extra == 'devel_ci'",
- "aiohttp (<4,>=3.6.3) ; extra == 'devel_ci'",
- "aioresponses ; extra == 'devel_ci'",
- "alibabacloud-adb20211201 (>=1.0.0) ; extra == 'devel_ci'",
- "alibabacloud-tea-openapi (>=0.3.7) ; extra == 'devel_ci'",
- "amqp ; extra == 'devel_ci'",
- "analytics-python (>=1.2.9) ; extra == 'devel_ci'",
- "apache-airflow-providers-common-sql ; extra == 'devel_ci'",
- "apache-airflow (>=2.4.0) ; extra == 'devel_ci'",
- "apache-airflow (>=2.7.0) ; extra == 'devel_ci'",
- "apache-beam (>=2.47.0) ; extra == 'devel_ci'",
- "apprise ; extra == 'devel_ci'",
- "arrow (>=0.16.0) ; extra == 'devel_ci'",
- "asana (<4.0.0,>=0.10) ; extra == 'devel_ci'",
- "asgiref ; extra == 'devel_ci'",
- "asgiref (>=3.5.2) ; extra == 'devel_ci'",
- "astroid (<3.0,>=2.12.3) ; extra == 'devel_ci'",
- "atlasclient (>=0.1.2) ; extra == 'devel_ci'",
- "atlassian-python-api (>=1.14.2) ; extra == 'devel_ci'",
- "attrs (>=22.2) ; extra == 'devel_ci'",
- "authlib (>=1.0.0) ; extra == 'devel_ci'",
- "aws-xray-sdk ; extra == 'devel_ci'",
- "azure-batch (>=8.0.0) ; extra == 'devel_ci'",
- "azure-cosmos (>=4.0.0) ; extra == 'devel_ci'",
- "azure-datalake-store (>=0.0.45) ; extra == 'devel_ci'",
- "azure-identity (>=1.3.1) ; extra == 'devel_ci'",
- "azure-keyvault-secrets (>=4.1.0) ; extra == 'devel_ci'",
- "azure-kusto-data (<0.1,>=0.0.43) ; extra == 'devel_ci'",
- "azure-mgmt-containerinstance (<2.0,>=1.5.0) ; extra == 'devel_ci'",
- "azure-mgmt-datafactory (<2.0,>=1.0.0) ; extra == 'devel_ci'",
- "azure-mgmt-datalake-store (>=0.5.0) ; extra == 'devel_ci'",
- "azure-mgmt-resource (>=2.2.0) ; extra == 'devel_ci'",
- "azure-servicebus (>=7.6.1) ; extra == 'devel_ci'",
- "azure-storage-blob (>=12.14.0) ; extra == 'devel_ci'",
- "azure-storage-common (>=2.1.0) ; extra == 'devel_ci'",
- "azure-storage-file-datalake (>=12.9.1) ; extra == 'devel_ci'",
- "azure-storage-file (>=2.1.0) ; extra == 'devel_ci'",
- "azure-synapse-spark ; extra == 'devel_ci'",
- "bcrypt (>=2.0.0) ; extra == 'devel_ci'",
- "beautifulsoup4 (>=4.7.1) ; extra == 'devel_ci'",
- "black ; extra == 'devel_ci'",
- "blinker ; extra == 'devel_ci'",
- "blinker (>=1.1) ; extra == 'devel_ci'",
- "boto3 (>=1.28.0) ; extra == 'devel_ci'",
- "botocore (>=1.31.0) ; extra == 'devel_ci'",
- "cassandra-driver (>=3.13.0) ; extra == 'devel_ci'",
- "celery (!=5.3.2,!=5.3.3,<6,>=5.3.0) ; extra == 'devel_ci'",
- "cgroupspy (>=0.2.2) ; extra == 'devel_ci'",
- "checksumdir ; extra == 'devel_ci'",
- "click (>=8.0) ; extra == 'devel_ci'",
- "click (!=8.1.4,!=8.1.5,>=8.0) ; extra == 'devel_ci'",
- "cloudant (>=2.0) ; extra == 'devel_ci'",
- "cloudpickle (>=1.4.1) ; extra == 'devel_ci'",
- "confluent-kafka (>=1.8.2) ; extra == 'devel_ci'",
- "coverage (>=7.2) ; extra == 'devel_ci'",
- "cryptography (>=2.0.0) ; extra == 'devel_ci'",
- "dask (!=2022.10.1,!=2023.5.0,>=2.9.0) ; extra == 'devel_ci'",
- "databricks-sql-connector (<3.0.0,>=2.0.0) ; extra == 'devel_ci'",
- "datadog (>=0.14.0) ; extra == 'devel_ci'",
- "distributed (!=2023.5.0,>=2.11.1) ; extra == 'devel_ci'",
- "dnspython (>=1.13.0) ; extra == 'devel_ci'",
- "docker (>=5.0.3) ; extra == 'devel_ci'",
- "docutils (<0.17.0) ; extra == 'devel_ci'",
- "elasticsearch (<9,>8) ; extra == 'devel_ci'",
- "eralchemy2 ; extra == 'devel_ci'",
- "eventlet (>=0.33.3) ; extra == 'devel_ci'",
- "facebook-business (>=6.0.2) ; extra == 'devel_ci'",
- "filelock ; extra == 'devel_ci'",
- "flask-appbuilder[oauth] (==4.3.6) ; extra == 'devel_ci'",
- "flask-bcrypt (>=0.7.1) ; extra == 'devel_ci'",
- "flower (>=1.0.0) ; extra == 'devel_ci'",
- "gcloud-aio-auth (<5.0.0,>=4.0.0) ; extra == 'devel_ci'",
- "gcloud-aio-bigquery (>=6.1.2) ; extra == 'devel_ci'",
- "gcloud-aio-storage ; extra == 'devel_ci'",
- "gevent (>=0.13) ; extra == 'devel_ci'",
- "gitpython ; extra == 'devel_ci'",
- "google-ads (>=21.2.0) ; extra == 'devel_ci'",
- "google-api-core (>=2.11.0) ; extra == 'devel_ci'",
- "google-api-python-client (>=1.6.0) ; extra == 'devel_ci'",
- "google-auth-httplib2 (>=0.0.1) ; extra == 'devel_ci'",
- "google-auth (>=1.0.0) ; extra == 'devel_ci'",
- "google-auth (<3.0.0,>=1.0.0) ; extra == 'devel_ci'",
- "google-cloud-aiplatform (>=1.22.1) ; extra == 'devel_ci'",
- "google-cloud-automl (>=2.11.0) ; extra == 'devel_ci'",
- "google-cloud-bigquery-datatransfer (>=3.11.0) ; extra == 'devel_ci'",
- "google-cloud-bigtable (>=2.17.0) ; extra == 'devel_ci'",
- "google-cloud-build (>=3.13.0) ; extra == 'devel_ci'",
- "google-cloud-compute (>=1.10.0) ; extra == 'devel_ci'",
- "google-cloud-container (>=2.17.4) ; extra == 'devel_ci'",
- "google-cloud-datacatalog (>=3.11.1) ; extra == 'devel_ci'",
- "google-cloud-dataflow-client (>=0.8.2) ; extra == 'devel_ci'",
- "google-cloud-dataform (>=0.5.0) ; extra == 'devel_ci'",
- "google-cloud-dataplex (>=1.4.2) ; extra == 'devel_ci'",
- "google-cloud-dataproc-metastore (>=1.12.0) ; extra == 'devel_ci'",
- "google-cloud-dataproc (>=5.4.0) ; extra == 'devel_ci'",
- "google-cloud-dlp (>=3.12.0) ; extra == 'devel_ci'",
- "google-cloud-kms (>=2.15.0) ; extra == 'devel_ci'",
- "google-cloud-language (>=2.9.0) ; extra == 'devel_ci'",
- "google-cloud-logging (>=3.5.0) ; extra == 'devel_ci'",
- "google-cloud-memcache (>=1.7.0) ; extra == 'devel_ci'",
- "google-cloud-monitoring (>=2.14.1) ; extra == 'devel_ci'",
- "google-cloud-orchestration-airflow (>=1.7.0) ; extra == 'devel_ci'",
- "google-cloud-os-login (>=2.9.1) ; extra == 'devel_ci'",
- "google-cloud-pubsub (>=2.15.0) ; extra == 'devel_ci'",
- "google-cloud-redis (>=2.12.0) ; extra == 'devel_ci'",
- "google-cloud-secret-manager (>=2.16.0) ; extra == 'devel_ci'",
- "google-cloud-spanner (>=3.11.1) ; extra == 'devel_ci'",
- "google-cloud-speech (>=2.18.0) ; extra == 'devel_ci'",
- "google-cloud-storage-transfer (>=1.4.1) ; extra == 'devel_ci'",
- "google-cloud-storage (>=2.7.0) ; extra == 'devel_ci'",
- "google-cloud-tasks (>=2.13.0) ; extra == 'devel_ci'",
- "google-cloud-texttospeech (>=2.14.1) ; extra == 'devel_ci'",
- "google-cloud-translate (>=3.11.0) ; extra == 'devel_ci'",
- "google-cloud-videointelligence (>=2.11.0) ; extra == 'devel_ci'",
- "google-cloud-vision (>=3.4.0) ; extra == 'devel_ci'",
- "google-cloud-workflows (>=1.10.0) ; extra == 'devel_ci'",
- "greenlet (>=0.4.9) ; extra == 'devel_ci'",
- "grpcio-gcp (>=0.2.2) ; extra == 'devel_ci'",
- "grpcio (>=1.15.0) ; extra == 'devel_ci'",
- "hdfs[avro,dataframe,kerberos] (>=2.0.4) ; extra == 'devel_ci'",
- "hmsclient (>=0.1.0) ; extra == 'devel_ci'",
- "httpx ; extra == 'devel_ci'",
- "hvac (>=0.10) ; extra == 'devel_ci'",
- "impyla (<1.0,>=0.18.0) ; extra == 'devel_ci'",
- "influxdb-client (>=1.19.0) ; extra == 'devel_ci'",
- "ipdb ; extra == 'devel_ci'",
- "jaydebeapi (>=1.1.1) ; extra == 'devel_ci'",
- "json-merge-patch (>=0.2) ; extra == 'devel_ci'",
- "jsonpath-ng (>=1.5.3) ; extra == 'devel_ci'",
- "jsonschema (>=3.0) ; extra == 'devel_ci'",
- "kubernetes (<24,>=21.7.0) ; extra == 'devel_ci'",
- "kubernetes-asyncio (<25,>=18.20.1) ; extra == 'devel_ci'",
- "kylinpy (>=2.6) ; extra == 'devel_ci'",
- "ldap3 (>=2.5.1) ; extra == 'devel_ci'",
- "looker-sdk (>=22.2.0) ; extra == 'devel_ci'",
- "mongomock ; extra == 'devel_ci'",
- "moto[glue] (>=4.0) ; extra == 'devel_ci'",
- "mypy-boto3-appflow (>=1.28.0) ; extra == 'devel_ci'",
- "mypy-boto3-rds (>=1.28.0) ; extra == 'devel_ci'",
- "mypy-boto3-redshift-data (>=1.28.0) ; extra == 'devel_ci'",
- "mypy-boto3-s3 (>=1.28.0) ; extra == 'devel_ci'",
- "mypy (==1.2.0) ; extra == 'devel_ci'",
- "mysqlclient (>=1.3.6) ; extra == 'devel_ci'",
- "neo4j (>=4.2.1) ; extra == 'devel_ci'",
- "openapi-spec-validator (>=0.2.8) ; extra == 'devel_ci'",
- "openlineage-integration-common (>=0.28.0) ; extra == 'devel_ci'",
- "openlineage-python (>=0.28.0) ; extra == 'devel_ci'",
- "opentelemetry-exporter-prometheus ; extra == 'devel_ci'",
- "opsgenie-sdk (>=2.1.5) ; extra == 'devel_ci'",
- "oracledb (>=1.0.0) ; extra == 'devel_ci'",
- "oss2 (>=2.14.0) ; extra == 'devel_ci'",
- "pandas-gbq ; extra == 'devel_ci'",
- "pandas (>=0.17.1) ; extra == 'devel_ci'",
- "papermill[all] (>=1.2.1) ; extra == 'devel_ci'",
- "paramiko (>=2.6.0) ; extra == 'devel_ci'",
- "pdpyras (>=4.1.2) ; extra == 'devel_ci'",
- "pinotdb (>0.4.7) ; extra == 'devel_ci'",
- "pipdeptree ; extra == 'devel_ci'",
- "plyvel ; extra == 'devel_ci'",
- "pre-commit ; extra == 'devel_ci'",
- "presto-python-client (>=0.8.2) ; extra == 'devel_ci'",
- "proto-plus (>=1.19.6) ; extra == 'devel_ci'",
- "psycopg2-binary (>=2.8.0) ; extra == 'devel_ci'",
- "pyarrow (>=9.0.0) ; extra == 'devel_ci'",
- "pydruid (>=0.4.1) ; extra == 'devel_ci'",
- "pyexasol (>=0.5.1) ; extra == 'devel_ci'",
- "pygithub ; extra == 'devel_ci'",
- "pyhive[hive_pure_sasl] (>=0.7.0) ; extra == 'devel_ci'",
- "pykerberos (>=1.1.13) ; extra == 'devel_ci'",
- "pymongo (>=3.6.0) ; extra == 'devel_ci'",
- "pymssql (>=2.1.5) ; extra == 'devel_ci'",
- "pyodbc ; extra == 'devel_ci'",
- "pypsrp (>=0.8.0) ; extra == 'devel_ci'",
- "pyspark ; extra == 'devel_ci'",
- "pytest ; extra == 'devel_ci'",
- "pytest-asyncio ; extra == 'devel_ci'",
- "pytest-capture-warnings ; extra == 'devel_ci'",
- "pytest-cov ; extra == 'devel_ci'",
- "pytest-httpx ; extra == 'devel_ci'",
- "pytest-instafail ; extra == 'devel_ci'",
- "pytest-mock ; extra == 'devel_ci'",
- "pytest-rerunfailures ; extra == 'devel_ci'",
- "pytest-timeouts ; extra == 'devel_ci'",
- "pytest-xdist ; extra == 'devel_ci'",
- "python-arango (>=7.3.2) ; extra == 'devel_ci'",
- "python-dotenv (>=0.21.0) ; extra == 'devel_ci'",
- "python-jenkins (>=1.0.0) ; extra == 'devel_ci'",
- "python-ldap ; extra == 'devel_ci'",
- "python-telegram-bot (>=20.0.0) ; extra == 'devel_ci'",
- "pywinrm ; extra == 'devel_ci'",
- "pywinrm (>=0.4) ; extra == 'devel_ci'",
- "redis (!=4.5.5,<5.0.0,>=4.5.2) ; extra == 'devel_ci'",
- "redshift-connector (>=2.0.888) ; extra == 'devel_ci'",
- "requests (>=2.26.0) ; extra == 'devel_ci'",
- "requests (<3,>=2.27) ; extra == 'devel_ci'",
- "requests-kerberos (>=0.10.0) ; extra == 'devel_ci'",
- "requests-mock ; extra == 'devel_ci'",
- "requests-toolbelt ; extra == 'devel_ci'",
- "rich-click (>=1.5) ; extra == 'devel_ci'",
- "ruff (>=0.0.219) ; extra == 'devel_ci'",
- "scrapbook[all] ; extra == 'devel_ci'",
- "semver ; extra == 'devel_ci'",
- "sendgrid (>=6.0.0) ; extra == 'devel_ci'",
- "sentry-sdk (>=0.8.0) ; extra == 'devel_ci'",
- "simple-salesforce (>=1.0.0) ; extra == 'devel_ci'",
- "slack-sdk (>=3.0.0) ; extra == 'devel_ci'",
- "smbprotocol (>=1.5.0) ; extra == 'devel_ci'",
- "snowflake-connector-python (>=2.4.1) ; extra == 'devel_ci'",
- "snowflake-sqlalchemy (>=1.1.0) ; extra == 'devel_ci'",
- "sphinx-airflow-theme ; extra == 'devel_ci'",
- "sphinx-argparse (>=0.1.13) ; extra == 'devel_ci'",
- "sphinx-autoapi (>=2.0.0) ; extra == 'devel_ci'",
- "sphinx-copybutton ; extra == 'devel_ci'",
- "sphinx-jinja (>=2.0) ; extra == 'devel_ci'",
- "sphinx-rtd-theme (>=0.1.6) ; extra == 'devel_ci'",
- "sphinx (>=5.2.0) ; extra == 'devel_ci'",
- "sphinxcontrib-httpdomain (>=1.7.0) ; extra == 'devel_ci'",
- "sphinxcontrib-redoc (>=1.6.0) ; extra == 'devel_ci'",
- "sphinxcontrib-spelling (>=7.3) ; extra == 'devel_ci'",
- "spython (>=0.0.56) ; extra == 'devel_ci'",
- "sqlalchemy-bigquery (>=1.2.1) ; extra == 'devel_ci'",
- "sqlalchemy-drill (>=1.1.0) ; extra == 'devel_ci'",
- "sqlalchemy-spanner (>=1.6.2) ; extra == 'devel_ci'",
- "sqlalchemy-redshift (>=0.8.6) ; extra == 'devel_ci'",
- "sqlparse (>=0.4.2) ; extra == 'devel_ci'",
- "sshtunnel (>=0.3.2) ; extra == 'devel_ci'",
- "statsd (>=3.3.0) ; extra == 'devel_ci'",
- "tableauserverclient ; extra == 'devel_ci'",
- "thrift (>=0.9.2) ; extra == 'devel_ci'",
- "thrift-sasl (>=0.2.0) ; extra == 'devel_ci'",
- "time-machine ; extra == 'devel_ci'",
- "towncrier ; extra == 'devel_ci'",
- "trino (>=0.318.0) ; extra == 'devel_ci'",
- "twine ; extra == 'devel_ci'",
- "types-Deprecated ; extra == 'devel_ci'",
- "types-Markdown ; extra == 'devel_ci'",
- "types-PyMySQL ; extra == 'devel_ci'",
- "types-PyYAML ; extra == 'devel_ci'",
- "types-certifi ; extra == 'devel_ci'",
- "types-croniter ; extra == 'devel_ci'",
- "types-docutils ; extra == 'devel_ci'",
- "types-paramiko ; extra == 'devel_ci'",
- "types-protobuf ; extra == 'devel_ci'",
- "types-python-dateutil ; extra == 'devel_ci'",
- "types-python-slugify ; extra == 'devel_ci'",
- "types-pytz ; extra == 'devel_ci'",
- "types-redis ; extra == 'devel_ci'",
- "types-requests ; extra == 'devel_ci'",
- "types-setuptools ; extra == 'devel_ci'",
- "types-tabulate ; extra == 'devel_ci'",
- "types-termcolor ; extra == 'devel_ci'",
- "types-toml ; extra == 'devel_ci'",
- "vertica-python (>=0.5.1) ; extra == 'devel_ci'",
- "virtualenv ; extra == 'devel_ci'",
- "watchtower (~=2.0.1) ; extra == 'devel_ci'",
- "wheel ; extra == 'devel_ci'",
- "yamllint ; extra == 'devel_ci'",
- "zenpy (>=2.0.24) ; extra == 'devel_ci'",
- "apache-airflow-providers-airbyte ; extra == 'devel_ci'",
- "apache-airflow-providers-alibaba ; extra == 'devel_ci'",
- "apache-airflow-providers-amazon ; extra == 'devel_ci'",
- "apache-airflow-providers-apache-beam ; extra == 'devel_ci'",
- "apache-airflow-providers-apache-cassandra ; extra == 'devel_ci'",
- "apache-airflow-providers-apache-drill ; extra == 'devel_ci'",
- "apache-airflow-providers-apache-druid ; extra == 'devel_ci'",
- "apache-airflow-providers-apache-flink ; extra == 'devel_ci'",
- "apache-airflow-providers-apache-hdfs ; extra == 'devel_ci'",
- "apache-airflow-providers-apache-hive ; extra == 'devel_ci'",
- "apache-airflow-providers-apache-impala ; extra == 'devel_ci'",
- "apache-airflow-providers-apache-kafka ; extra == 'devel_ci'",
- "apache-airflow-providers-apache-kylin ; extra == 'devel_ci'",
- "apache-airflow-providers-apache-livy ; extra == 'devel_ci'",
- "apache-airflow-providers-apache-pig ; extra == 'devel_ci'",
- "apache-airflow-providers-apache-pinot ; extra == 'devel_ci'",
- "apache-airflow-providers-apache-spark ; extra == 'devel_ci'",
- "apache-airflow-providers-apache-sqoop ; extra == 'devel_ci'",
- "apache-airflow-providers-apprise ; extra == 'devel_ci'",
- "apache-airflow-providers-arangodb ; extra == 'devel_ci'",
- "apache-airflow-providers-asana ; extra == 'devel_ci'",
- "apache-airflow-providers-atlassian-jira ; extra == 'devel_ci'",
- "apache-airflow-providers-celery ; extra == 'devel_ci'",
- "apache-airflow-providers-cloudant ; extra == 'devel_ci'",
- "apache-airflow-providers-cncf-kubernetes ; extra == 'devel_ci'",
- "apache-airflow-providers-daskexecutor ; extra == 'devel_ci'",
- "apache-airflow-providers-databricks ; extra == 'devel_ci'",
- "apache-airflow-providers-datadog ; extra == 'devel_ci'",
- "apache-airflow-providers-dbt-cloud ; extra == 'devel_ci'",
- "apache-airflow-providers-dingding ; extra == 'devel_ci'",
- "apache-airflow-providers-discord ; extra == 'devel_ci'",
- "apache-airflow-providers-docker ; extra == 'devel_ci'",
- "apache-airflow-providers-elasticsearch ; extra == 'devel_ci'",
- "apache-airflow-providers-exasol ; extra == 'devel_ci'",
- "apache-airflow-providers-facebook ; extra == 'devel_ci'",
- "apache-airflow-providers-ftp ; extra == 'devel_ci'",
- "apache-airflow-providers-github ; extra == 'devel_ci'",
- "apache-airflow-providers-google ; extra == 'devel_ci'",
- "apache-airflow-providers-grpc ; extra == 'devel_ci'",
- "apache-airflow-providers-hashicorp ; extra == 'devel_ci'",
- "apache-airflow-providers-http ; extra == 'devel_ci'",
- "apache-airflow-providers-imap ; extra == 'devel_ci'",
- "apache-airflow-providers-influxdb ; extra == 'devel_ci'",
- "apache-airflow-providers-jdbc ; extra == 'devel_ci'",
- "apache-airflow-providers-jenkins ; extra == 'devel_ci'",
- "apache-airflow-providers-microsoft-azure ; extra == 'devel_ci'",
- "apache-airflow-providers-microsoft-mssql ; extra == 'devel_ci'",
- "apache-airflow-providers-microsoft-psrp ; extra == 'devel_ci'",
- "apache-airflow-providers-microsoft-winrm ; extra == 'devel_ci'",
- "apache-airflow-providers-mongo ; extra == 'devel_ci'",
- "apache-airflow-providers-mysql ; extra == 'devel_ci'",
- "apache-airflow-providers-neo4j ; extra == 'devel_ci'",
- "apache-airflow-providers-odbc ; extra == 'devel_ci'",
- "apache-airflow-providers-openfaas ; extra == 'devel_ci'",
- "apache-airflow-providers-openlineage ; extra == 'devel_ci'",
- "apache-airflow-providers-opsgenie ; extra == 'devel_ci'",
- "apache-airflow-providers-oracle ; extra == 'devel_ci'",
- "apache-airflow-providers-pagerduty ; extra == 'devel_ci'",
- "apache-airflow-providers-papermill ; extra == 'devel_ci'",
- "apache-airflow-providers-plexus ; extra == 'devel_ci'",
- "apache-airflow-providers-postgres ; extra == 'devel_ci'",
- "apache-airflow-providers-presto ; extra == 'devel_ci'",
- "apache-airflow-providers-redis ; extra == 'devel_ci'",
- "apache-airflow-providers-salesforce ; extra == 'devel_ci'",
- "apache-airflow-providers-samba ; extra == 'devel_ci'",
- "apache-airflow-providers-segment ; extra == 'devel_ci'",
- "apache-airflow-providers-sendgrid ; extra == 'devel_ci'",
- "apache-airflow-providers-sftp ; extra == 'devel_ci'",
- "apache-airflow-providers-singularity ; extra == 'devel_ci'",
- "apache-airflow-providers-slack ; extra == 'devel_ci'",
- "apache-airflow-providers-smtp ; extra == 'devel_ci'",
- "apache-airflow-providers-snowflake ; extra == 'devel_ci'",
- "apache-airflow-providers-sqlite ; extra == 'devel_ci'",
- "apache-airflow-providers-ssh ; extra == 'devel_ci'",
- "apache-airflow-providers-tableau ; extra == 'devel_ci'",
- "apache-airflow-providers-tabular ; extra == 'devel_ci'",
- "apache-airflow-providers-telegram ; extra == 'devel_ci'",
- "apache-airflow-providers-trino ; extra == 'devel_ci'",
- "apache-airflow-providers-vertica ; extra == 'devel_ci'",
- "apache-airflow-providers-zendesk ; extra == 'devel_ci'",
- "backports.zoneinfo (>=0.2.1) ; (python_version < \"3.9\") and extra == 'devel_ci'",
- "aiobotocore (>=2.1.1) ; extra == 'devel_hadoop'",
- "aioresponses ; extra == 'devel_hadoop'",
- "apache-airflow-providers-common-sql ; extra == 'devel_hadoop'",
- "apache-airflow (>=2.4.0) ; extra == 'devel_hadoop'",
- "astroid (<3.0,>=2.12.3) ; extra == 'devel_hadoop'",
- "aws-xray-sdk ; extra == 'devel_hadoop'",
- "bcrypt (>=2.0.0) ; extra == 'devel_hadoop'",
- "beautifulsoup4 (>=4.7.1) ; extra == 'devel_hadoop'",
- "black ; extra == 'devel_hadoop'",
- "blinker ; extra == 'devel_hadoop'",
- "cgroupspy (>=0.2.2) ; extra == 'devel_hadoop'",
- "checksumdir ; extra == 'devel_hadoop'",
- "click (>=8.0) ; extra == 'devel_hadoop'",
- "click (!=8.1.4,!=8.1.5,>=8.0) ; extra == 'devel_hadoop'",
- "coverage (>=7.2) ; extra == 'devel_hadoop'",
- "cryptography (>=2.0.0) ; extra == 'devel_hadoop'",
- "docutils (<0.17.0) ; extra == 'devel_hadoop'",
- "eralchemy2 ; extra == 'devel_hadoop'",
- "filelock ; extra == 'devel_hadoop'",
- "flask-bcrypt (>=0.7.1) ; extra == 'devel_hadoop'",
- "gitpython ; extra == 'devel_hadoop'",
- "hdfs[avro,dataframe,kerberos] (>=2.0.4) ; extra == 'devel_hadoop'",
- "hmsclient (>=0.1.0) ; extra == 'devel_hadoop'",
- "impyla (<1.0,>=0.18.0) ; extra == 'devel_hadoop'",
- "ipdb ; extra == 'devel_hadoop'",
- "jsonschema (>=3.0) ; extra == 'devel_hadoop'",
- "kubernetes (<24,>=21.7.0) ; extra == 'devel_hadoop'",
- "mongomock ; extra == 'devel_hadoop'",
- "moto[glue] (>=4.0) ; extra == 'devel_hadoop'",
- "mypy-boto3-appflow (>=1.28.0) ; extra == 'devel_hadoop'",
- "mypy-boto3-rds (>=1.28.0) ; extra == 'devel_hadoop'",
- "mypy-boto3-redshift-data (>=1.28.0) ; extra == 'devel_hadoop'",
- "mypy-boto3-s3 (>=1.28.0) ; extra == 'devel_hadoop'",
- "mypy (==1.2.0) ; extra == 'devel_hadoop'",
- "mysqlclient (>=1.3.6) ; extra == 'devel_hadoop'",
- "openapi-spec-validator (>=0.2.8) ; extra == 'devel_hadoop'",
- "pandas (>=0.17.1) ; extra == 'devel_hadoop'",
- "pipdeptree ; extra == 'devel_hadoop'",
- "pre-commit ; extra == 'devel_hadoop'",
- "presto-python-client (>=0.8.2) ; extra == 'devel_hadoop'",
- "pyarrow (>=9.0.0) ; extra == 'devel_hadoop'",
- "pygithub ; extra == 'devel_hadoop'",
- "pyhive[hive_pure_sasl] (>=0.7.0) ; extra == 'devel_hadoop'",
- "pykerberos (>=1.1.13) ; extra == 'devel_hadoop'",
- "pytest ; extra == 'devel_hadoop'",
- "pytest-asyncio ; extra == 'devel_hadoop'",
- "pytest-capture-warnings ; extra == 'devel_hadoop'",
- "pytest-cov ; extra == 'devel_hadoop'",
- "pytest-httpx ; extra == 'devel_hadoop'",
- "pytest-instafail ; extra == 'devel_hadoop'",
- "pytest-mock ; extra == 'devel_hadoop'",
- "pytest-rerunfailures ; extra == 'devel_hadoop'",
- "pytest-timeouts ; extra == 'devel_hadoop'",
- "pytest-xdist ; extra == 'devel_hadoop'",
- "pywinrm ; extra == 'devel_hadoop'",
- "requests-kerberos (>=0.10.0) ; extra == 'devel_hadoop'",
- "requests-mock ; extra == 'devel_hadoop'",
- "rich-click (>=1.5) ; extra == 'devel_hadoop'",
- "ruff (>=0.0.219) ; extra == 'devel_hadoop'",
- "semver ; extra == 'devel_hadoop'",
- "sphinx-airflow-theme ; extra == 'devel_hadoop'",
- "sphinx-argparse (>=0.1.13) ; extra == 'devel_hadoop'",
- "sphinx-autoapi (>=2.0.0) ; extra == 'devel_hadoop'",
- "sphinx-copybutton ; extra == 'devel_hadoop'",
- "sphinx-jinja (>=2.0) ; extra == 'devel_hadoop'",
- "sphinx-rtd-theme (>=0.1.6) ; extra == 'devel_hadoop'",
- "sphinx (>=5.2.0) ; extra == 'devel_hadoop'",
- "sphinxcontrib-httpdomain (>=1.7.0) ; extra == 'devel_hadoop'",
- "sphinxcontrib-redoc (>=1.6.0) ; extra == 'devel_hadoop'",
- "sphinxcontrib-spelling (>=7.3) ; extra == 'devel_hadoop'",
- "thrift (>=0.9.2) ; extra == 'devel_hadoop'",
- "thrift-sasl (>=0.2.0) ; extra == 'devel_hadoop'",
- "time-machine ; extra == 'devel_hadoop'",
- "towncrier ; extra == 'devel_hadoop'",
- "twine ; extra == 'devel_hadoop'",
- "types-Deprecated ; extra == 'devel_hadoop'",
- "types-Markdown ; extra == 'devel_hadoop'",
- "types-PyMySQL ; extra == 'devel_hadoop'",
- "types-PyYAML ; extra == 'devel_hadoop'",
- "types-certifi ; extra == 'devel_hadoop'",
- "types-croniter ; extra == 'devel_hadoop'",
- "types-docutils ; extra == 'devel_hadoop'",
- "types-paramiko ; extra == 'devel_hadoop'",
- "types-protobuf ; extra == 'devel_hadoop'",
- "types-python-dateutil ; extra == 'devel_hadoop'",
- "types-python-slugify ; extra == 'devel_hadoop'",
- "types-pytz ; extra == 'devel_hadoop'",
- "types-redis ; extra == 'devel_hadoop'",
- "types-requests ; extra == 'devel_hadoop'",
- "types-setuptools ; extra == 'devel_hadoop'",
- "types-tabulate ; extra == 'devel_hadoop'",
- "types-termcolor ; extra == 'devel_hadoop'",
- "types-toml ; extra == 'devel_hadoop'",
- "wheel ; extra == 'devel_hadoop'",
- "yamllint ; extra == 'devel_hadoop'",
- "apache-airflow-providers-apache-hdfs ; extra == 'devel_hadoop'",
- "apache-airflow-providers-apache-hive ; extra == 'devel_hadoop'",
- "apache-airflow-providers-presto ; extra == 'devel_hadoop'",
- "apache-airflow-providers-trino ; extra == 'devel_hadoop'",
- "backports.zoneinfo (>=0.2.1) ; (python_version < \"3.9\") and extra == 'devel_hadoop'",
- "apache-airflow-providers-dingding ; extra == 'dingding'",
- "apache-airflow-providers-discord ; extra == 'discord'",
- "astroid (<3.0,>=2.12.3) ; extra == 'doc'",
- "checksumdir ; extra == 'doc'",
- "click (!=8.1.4,!=8.1.5,>=8.0) ; extra == 'doc'",
- "docutils (<0.17.0) ; extra == 'doc'",
- "eralchemy2 ; extra == 'doc'",
- "sphinx-airflow-theme ; extra == 'doc'",
- "sphinx-argparse (>=0.1.13) ; extra == 'doc'",
- "sphinx-autoapi (>=2.0.0) ; extra == 'doc'",
- "sphinx-copybutton ; extra == 'doc'",
- "sphinx-jinja (>=2.0) ; extra == 'doc'",
- "sphinx-rtd-theme (>=0.1.6) ; extra == 'doc'",
- "sphinx (>=5.2.0) ; extra == 'doc'",
- "sphinxcontrib-httpdomain (>=1.7.0) ; extra == 'doc'",
- "sphinxcontrib-redoc (>=1.6.0) ; extra == 'doc'",
- "sphinxcontrib-spelling (>=7.3) ; extra == 'doc'",
- "eralchemy2 ; extra == 'doc_gen'",
- "apache-airflow-providers-docker ; extra == 'docker'",
- "apache-airflow-providers-apache-druid ; extra == 'druid'",
- "apache-airflow-providers-elasticsearch ; extra == 'elasticsearch'",
- "apache-airflow-providers-exasol ; extra == 'exasol'",
- "apache-airflow-providers-facebook ; extra == 'facebook'",
- "apache-airflow-providers-ftp ; extra == 'ftp'",
- "apache-airflow-providers-google ; extra == 'gcp'",
- "apache-airflow-providers-google ; extra == 'gcp_api'",
- "apache-airflow-providers-github ; extra == 'github'",
- "authlib (>=1.0.0) ; extra == 'github_enterprise'",
- "flask-appbuilder[oauth] (==4.3.6) ; extra == 'github_enterprise'",
- "apache-airflow-providers-google ; extra == 'google'",
- "authlib (>=1.0.0) ; extra == 'google_auth'",
- "flask-appbuilder[oauth] (==4.3.6) ; extra == 'google_auth'",
- "apache-airflow-providers-grpc ; extra == 'grpc'",
- "apache-airflow-providers-hashicorp ; extra == 'hashicorp'",
- "apache-airflow-providers-apache-hdfs ; extra == 'hdfs'",
- "apache-airflow-providers-apache-hive ; extra == 'hive'",
- "apache-airflow-providers-http ; extra == 'http'",
- "apache-airflow-providers-imap ; extra == 'imap'",
- "apache-airflow-providers-influxdb ; extra == 'influxdb'",
- "apache-airflow-providers-jdbc ; extra == 'jdbc'",
- "apache-airflow-providers-jenkins ; extra == 'jenkins'",
- "pykerberos (>=1.1.13) ; extra == 'kerberos'",
- "requests-kerberos (>=0.10.0) ; extra == 'kerberos'",
- "thrift-sasl (>=0.2.0) ; extra == 'kerberos'",
- "apache-airflow (>=2.4.0) ; extra == 'kubernetes'",
- "asgiref (>=3.5.2) ; extra == 'kubernetes'",
- "cryptography (>=2.0.0) ; extra == 'kubernetes'",
- "kubernetes (<24,>=21.7.0) ; extra == 'kubernetes'",
- "kubernetes-asyncio (<25,>=18.20.1) ; extra == 'kubernetes'",
- "apache-airflow-providers-cncf-kubernetes ; extra == 'kubernetes'",
- "ldap3 (>=2.5.1) ; extra == 'ldap'",
- "python-ldap ; extra == 'ldap'",
- "plyvel ; extra == 'leveldb'",
- "apache-airflow-providers-microsoft-azure ; extra == 'microsoft.azure'",
- "apache-airflow-providers-microsoft-mssql ; extra == 'microsoft.mssql'",
- "apache-airflow-providers-microsoft-psrp ; extra == 'microsoft.psrp'",
- "apache-airflow-providers-microsoft-winrm ; extra == 'microsoft.winrm'",
- "apache-airflow-providers-mongo ; extra == 'mongo'",
- "apache-airflow-providers-microsoft-mssql ; extra == 'mssql'",
- "apache-airflow-providers-mysql ; extra == 'mysql'",
- "apache-airflow-providers-neo4j ; extra == 'neo4j'",
- "apache-airflow-providers-odbc ; extra == 'odbc'",
- "apache-airflow-providers-openfaas ; extra == 'openfaas'",
- "apache-airflow-providers-openlineage ; extra == 'openlineage'",
- "apache-airflow-providers-opsgenie ; extra == 'opsgenie'",
- "apache-airflow-providers-oracle ; extra == 'oracle'",
- "opentelemetry-exporter-prometheus ; extra == 'otel'",
- "apache-airflow-providers-pagerduty ; extra == 'pagerduty'",
- "pandas (>=0.17.1) ; extra == 'pandas'",
- "pyarrow (>=9.0.0) ; extra == 'pandas'",
- "apache-airflow-providers-papermill ; extra == 'papermill'",
- "bcrypt (>=2.0.0) ; extra == 'password'",
- "flask-bcrypt (>=0.7.1) ; extra == 'password'",
- "apache-airflow-providers-apache-pinot ; extra == 'pinot'",
- "apache-airflow-providers-plexus ; extra == 'plexus'",
- "apache-airflow-providers-postgres ; extra == 'postgres'",
- "apache-airflow-providers-presto ; extra == 'presto'",
- "apache-airflow-providers-qubole ; extra == 'qds'",
- "amqp ; extra == 'rabbitmq'",
- "apache-airflow-providers-redis ; extra == 'redis'",
- "apache-airflow-providers-amazon ; extra == 's3'",
- "apache-airflow-providers-salesforce ; extra == 'salesforce'",
- "apache-airflow-providers-samba ; extra == 'samba'",
- "apache-airflow-providers-segment ; extra == 'segment'",
- "apache-airflow-providers-sendgrid ; extra == 'sendgrid'",
- "blinker (>=1.1) ; extra == 'sentry'",
- "sentry-sdk (>=0.8.0) ; extra == 'sentry'",
- "apache-airflow-providers-sftp ; extra == 'sftp'",
- "apache-airflow-providers-singularity ; extra == 'singularity'",
- "apache-airflow-providers-slack ; extra == 'slack'",
- "apache-airflow-providers-smtp ; extra == 'smtp'",
- "apache-airflow-providers-snowflake ; extra == 'snowflake'",
- "apache-airflow-providers-apache-spark ; extra == 'spark'",
- "apache-airflow-providers-sqlite ; extra == 'sqlite'",
- "apache-airflow-providers-ssh ; extra == 'ssh'",
- "statsd (>=3.3.0) ; extra == 'statsd'",
- "apache-airflow-providers-tableau ; extra == 'tableau'",
- "apache-airflow-providers-tabular ; extra == 'tabular'",
- "apache-airflow-providers-telegram ; extra == 'telegram'",
- "apache-airflow-providers-trino ; extra == 'trino'",
- "apache-airflow-providers-vertica ; extra == 'vertica'",
- "virtualenv ; extra == 'virtualenv'",
- "hdfs[avro,dataframe,kerberos] (>=2.0.4) ; extra == 'webhdfs'",
- "apache-airflow-providers-microsoft-winrm ; extra == 'winrm'",
- "apache-airflow-providers-zendesk ; extra == 'zendesk'"
- ],
- "requires_python": "~=3.8",
- "project_url": [
- "Bug Tracker, https://github.com/apache/airflow/issues",
- "Documentation, https://airflow.apache.org/docs/",
- "Downloads, https://archive.apache.org/dist/airflow/",
- "Release Notes, https://airflow.apache.org/docs/apache-airflow/stable/release_notes.html",
- "Slack Chat, https://s.apache.org/airflow-slack",
- "Source Code, https://github.com/apache/airflow",
- "Twitter, https://twitter.com/ApacheAirflow",
- "YouTube, https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/"
- ],
- "provides_extra": [
- "aiobotocore",
- "airbyte",
- "alibaba",
- "all",
- "all_dbs",
- "amazon",
- "apache.atlas",
- "apache.beam",
- "apache.cassandra",
- "apache.drill",
- "apache.druid",
- "apache.flink",
- "apache.hdfs",
- "apache.hive",
- "apache.impala",
- "apache.kafka",
- "apache.kylin",
- "apache.livy",
- "apache.pig",
- "apache.pinot",
- "apache.spark",
- "apache.sqoop",
- "apache.webhdfs",
- "apprise",
- "arangodb",
- "asana",
- "async",
- "atlas",
- "atlassian.jira",
- "aws",
- "azure",
- "cassandra",
- "celery",
- "cgroups",
- "cloudant",
- "cncf.kubernetes",
- "common.sql",
- "crypto",
- "dask",
- "daskexecutor",
- "databricks",
- "datadog",
- "dbt.cloud",
- "deprecated_api",
- "devel",
- "devel_all",
- "devel_ci",
- "devel_hadoop",
- "dingding",
- "discord",
- "doc",
- "doc_gen",
- "docker",
- "druid",
- "elasticsearch",
- "exasol",
- "facebook",
- "ftp",
- "gcp",
- "gcp_api",
- "github",
- "github_enterprise",
- "google",
- "google_auth",
- "grpc",
- "hashicorp",
- "hdfs",
- "hive",
- "http",
- "imap",
- "influxdb",
- "jdbc",
- "jenkins",
- "kerberos",
- "kubernetes",
- "ldap",
- "leveldb",
- "microsoft.azure",
- "microsoft.mssql",
- "microsoft.psrp",
- "microsoft.winrm",
- "mongo",
- "mssql",
- "mysql",
- "neo4j",
- "odbc",
- "openfaas",
- "openlineage",
- "opsgenie",
- "oracle",
- "otel",
- "pagerduty",
- "pandas",
- "papermill",
- "password",
- "pinot",
- "plexus",
- "postgres",
- "presto",
- "qds",
- "rabbitmq",
- "redis",
- "s3",
- "salesforce",
- "samba",
- "segment",
- "sendgrid",
- "sentry",
- "sftp",
- "singularity",
- "slack",
- "smtp",
- "snowflake",
- "spark",
- "sqlite",
- "ssh",
- "statsd",
- "tableau",
- "tabular",
- "telegram",
- "trino",
- "vertica",
- "virtualenv",
- "webhdfs",
- "winrm",
- "zendesk"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/4c/9e/4de9a1399d4d3e1ec939a93734b5cf7ae4a72f335fe3a97b04fa1a39ec47/apache_airflow_providers_common_sql-1.8.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=45117fa38f5a2e83cdb9a8d3bdfdbd602bfdc7a894d087b26e6ebb94df79ec32",
- "hashes": {
- "sha256": "45117fa38f5a2e83cdb9a8d3bdfdbd602bfdc7a894d087b26e6ebb94df79ec32"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "apache-airflow-providers-common-sql",
- "version": "1.8.0",
- "summary": "Provider for Apache Airflow. Implements apache-airflow-providers-common-sql package",
- "description": "\n.. Licensed to the Apache Software Foundation (ASF) under one\n or more contributor license agreements. See the NOTICE file\n distributed with this work for additional information\n regarding copyright ownership. The ASF licenses this file\n to you under the Apache License, Version 2.0 (the\n \"License\"); you may not use this file except in compliance\n with the License. You may obtain a copy of the License at\n\n.. http://www.apache.org/licenses/LICENSE-2.0\n\n.. Unless required by applicable law or agreed to in writing,\n software distributed under the License is distributed on an\n \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n KIND, either express or implied. See the License for the\n specific language governing permissions and limitations\n under the License.\n\n .. Licensed to the Apache Software Foundation (ASF) under one\n or more contributor license agreements. See the NOTICE file\n distributed with this work for additional information\n regarding copyright ownership. The ASF licenses this file\n to you under the Apache License, Version 2.0 (the\n \"License\"); you may not use this file except in compliance\n with the License. You may obtain a copy of the License at\n\n .. http://www.apache.org/licenses/LICENSE-2.0\n\n .. Unless required by applicable law or agreed to in writing,\n software distributed under the License is distributed on an\n \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n KIND, either express or implied. See the License for the\n specific language governing permissions and limitations\n under the License.\n\n\nPackage ``apache-airflow-providers-common-sql``\n\nRelease: ``1.8.0``\n\n\n`Common SQL Provider <https://en.wikipedia.org/wiki/SQL>`__\n\n\nProvider package\n----------------\n\nThis is a provider package for ``common.sql`` provider. All classes for this provider package\nare in ``airflow.providers.common.sql`` python package.\n\nYou can find package information and changelog for the provider\nin the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.8.0/>`_.\n\n\nInstallation\n------------\n\nYou can install this package on top of an existing Airflow 2 installation (see ``Requirements`` below\nfor the minimum Airflow version supported) via\n``pip install apache-airflow-providers-common-sql``\n\nThe package supports the following python versions: 3.8,3.9,3.10,3.11\n\nRequirements\n------------\n\n================== ==================\nPIP package Version required\n================== ==================\n``apache-airflow`` ``>=2.5.0``\n``sqlparse`` ``>=0.4.2``\n================== ==================\n\nCross provider package dependencies\n-----------------------------------\n\nThose are dependencies that might be needed in order to use all the features of the package.\nYou need to install the specified provider packages in order to use them.\n\nYou can install such cross-provider dependencies when installing from PyPI. For example:\n\n.. code-block:: bash\n\n pip install apache-airflow-providers-common-sql[openlineage]\n\n\n============================================================================================================== ===============\nDependent package Extra\n============================================================================================================== ===============\n`apache-airflow-providers-openlineage <https://airflow.apache.org/docs/apache-airflow-providers-openlineage>`_ ``openlineage``\n============================================================================================================== ===============\n\nThe changelog for the provider package can be found in the\n`changelog <https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.8.0/changelog.html>`_.\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://airflow.apache.org/",
- "download_url": "https://archive.apache.org/dist/airflow/providers",
- "author": "Apache Software Foundation",
- "author_email": "dev@airflow.apache.org",
- "license": "Apache License 2.0",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Console",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "Intended Audience :: System Administrators",
- "Framework :: Apache Airflow",
- "Framework :: Apache Airflow :: Provider",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Topic :: System :: Monitoring"
- ],
- "requires_dist": [
- "apache-airflow >=2.5.0",
- "sqlparse >=0.4.2",
- "apache-airflow-providers-openlineage ; extra == 'openlineage'",
- "pandas >=0.17.1 ; extra == 'pandas'"
- ],
- "requires_python": "~=3.8",
- "project_url": [
- "Documentation, https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.8.0/",
- "Changelog, https://airflow.apache.org/docs/apache-airflow-providers-common-sql/1.8.0/changelog.html",
- "Bug Tracker, https://github.com/apache/airflow/issues",
- "Source Code, https://github.com/apache/airflow",
- "Slack Chat, https://s.apache.org/airflow-slack",
- "Twitter, https://twitter.com/ApacheAirflow",
- "YouTube, https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/"
- ],
- "provides_extra": [
- "openlineage",
- "pandas"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/9b/85/61bb5bc0275c957162d11e71c568fa553f54c13b2d1b0c65565a9227561b/apache_airflow_providers_ftp-3.6.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=03264207293710c3821f5ccd548c5e89a3c5ca7562bc4ff629e6f73d112a71a4",
- "hashes": {
- "sha256": "03264207293710c3821f5ccd548c5e89a3c5ca7562bc4ff629e6f73d112a71a4"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "apache-airflow-providers-ftp",
- "version": "3.6.0",
- "summary": "Provider for Apache Airflow. Implements apache-airflow-providers-ftp package",
- "description": "\n.. Licensed to the Apache Software Foundation (ASF) under one\n or more contributor license agreements. See the NOTICE file\n distributed with this work for additional information\n regarding copyright ownership. The ASF licenses this file\n to you under the Apache License, Version 2.0 (the\n \"License\"); you may not use this file except in compliance\n with the License. You may obtain a copy of the License at\n\n.. http://www.apache.org/licenses/LICENSE-2.0\n\n.. Unless required by applicable law or agreed to in writing,\n software distributed under the License is distributed on an\n \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n KIND, either express or implied. See the License for the\n specific language governing permissions and limitations\n under the License.\n\n .. Licensed to the Apache Software Foundation (ASF) under one\n or more contributor license agreements. See the NOTICE file\n distributed with this work for additional information\n regarding copyright ownership. The ASF licenses this file\n to you under the Apache License, Version 2.0 (the\n \"License\"); you may not use this file except in compliance\n with the License. You may obtain a copy of the License at\n\n .. http://www.apache.org/licenses/LICENSE-2.0\n\n .. Unless required by applicable law or agreed to in writing,\n software distributed under the License is distributed on an\n \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n KIND, either express or implied. See the License for the\n specific language governing permissions and limitations\n under the License.\n\n\nPackage ``apache-airflow-providers-ftp``\n\nRelease: ``3.6.0``\n\n\n`File Transfer Protocol (FTP) <https://tools.ietf.org/html/rfc114>`__\n\n\nProvider package\n----------------\n\nThis is a provider package for ``ftp`` provider. All classes for this provider package\nare in ``airflow.providers.ftp`` python package.\n\nYou can find package information and changelog for the provider\nin the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-ftp/3.6.0/>`_.\n\n\nInstallation\n------------\n\nYou can install this package on top of an existing Airflow 2 installation (see ``Requirements`` below\nfor the minimum Airflow version supported) via\n``pip install apache-airflow-providers-ftp``\n\nThe package supports the following python versions: 3.8,3.9,3.10,3.11\n\nRequirements\n------------\n\n================== ==================\nPIP package Version required\n================== ==================\n``apache-airflow`` ``>=2.5.0``\n================== ==================\n\nCross provider package dependencies\n-----------------------------------\n\nThose are dependencies that might be needed in order to use all the features of the package.\nYou need to install the specified provider packages in order to use them.\n\nYou can install such cross-provider dependencies when installing from PyPI. For example:\n\n.. code-block:: bash\n\n pip install apache-airflow-providers-ftp[openlineage]\n\n\n============================================================================================================== ===============\nDependent package Extra\n============================================================================================================== ===============\n`apache-airflow-providers-openlineage <https://airflow.apache.org/docs/apache-airflow-providers-openlineage>`_ ``openlineage``\n============================================================================================================== ===============\n\nThe changelog for the provider package can be found in the\n`changelog <https://airflow.apache.org/docs/apache-airflow-providers-ftp/3.6.0/changelog.html>`_.\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://airflow.apache.org/",
- "download_url": "https://archive.apache.org/dist/airflow/providers",
- "author": "Apache Software Foundation",
- "author_email": "dev@airflow.apache.org",
- "license": "Apache License 2.0",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Console",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "Intended Audience :: System Administrators",
- "Framework :: Apache Airflow",
- "Framework :: Apache Airflow :: Provider",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Topic :: System :: Monitoring"
- ],
- "requires_dist": [
- "apache-airflow >=2.5.0",
- "apache-airflow-providers-openlineage ; extra == 'openlineage'"
- ],
- "requires_python": "~=3.8",
- "project_url": [
- "Documentation, https://airflow.apache.org/docs/apache-airflow-providers-ftp/3.6.0/",
- "Changelog, https://airflow.apache.org/docs/apache-airflow-providers-ftp/3.6.0/changelog.html",
- "Bug Tracker, https://github.com/apache/airflow/issues",
- "Source Code, https://github.com/apache/airflow",
- "Slack Chat, https://s.apache.org/airflow-slack",
- "Twitter, https://twitter.com/ApacheAirflow",
- "YouTube, https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/"
- ],
- "provides_extra": [
- "openlineage"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/44/3a/f2ec761a5717ca6653df481e5d9bf415a2f1df8a4781987cb37b933786a9/apache_airflow_providers_http-2.0.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=5fa98bd07b58680806434652aaad045e7e15b632627a54d8cf8270d134a2d8ad",
- "hashes": {
- "sha256": "5fa98bd07b58680806434652aaad045e7e15b632627a54d8cf8270d134a2d8ad"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "apache-airflow-providers-http",
- "version": "2.0.0",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "Provider package apache-airflow-providers-http for Apache Airflow",
- "description": "\n.. Licensed to the Apache Software Foundation (ASF) under one\n or more contributor license agreements. See the NOTICE file\n distributed with this work for additional information\n regarding copyright ownership. The ASF licenses this file\n to you under the Apache License, Version 2.0 (the\n \"License\"); you may not use this file except in compliance\n with the License. You may obtain a copy of the License at\n\n.. http://www.apache.org/licenses/LICENSE-2.0\n\n.. Unless required by applicable law or agreed to in writing,\n software distributed under the License is distributed on an\n \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n KIND, either express or implied. See the License for the\n specific language governing permissions and limitations\n under the License.\n\n\nPackage ``apache-airflow-providers-http``\n\nRelease: ``2.0.0``\n\n\n`Hypertext Transfer Protocol (HTTP) <https://www.w3.org/Protocols/>`__\n\n\nProvider package\n----------------\n\nThis is a provider package for ``http`` provider. All classes for this provider package\nare in ``airflow.providers.http`` python package.\n\nYou can find package information and changelog for the provider\nin the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-http/2.0.0/>`_.\n\n\nInstallation\n------------\n\nYou can install this package on top of an existing airflow 2.1+ installation via\n``pip install apache-airflow-providers-http``\n\nPIP requirements\n----------------\n\n================== ==================\nPIP package Version required\n================== ==================\n``apache-airflow`` ``>=2.1.0``\n``requests`` ``>=2.20.0``\n================== ==================\n\n .. Licensed to the Apache Software Foundation (ASF) under one\n or more contributor license agreements. See the NOTICE file\n distributed with this work for additional information\n regarding copyright ownership. The ASF licenses this file\n to you under the Apache License, Version 2.0 (the\n \"License\"); you may not use this file except in compliance\n with the License. You may obtain a copy of the License at\n\n .. http://www.apache.org/licenses/LICENSE-2.0\n\n .. Unless required by applicable law or agreed to in writing,\n software distributed under the License is distributed on an\n \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n KIND, either express or implied. See the License for the\n specific language governing permissions and limitations\n under the License.\n\n\nChangelog\n---------\n\n2.0.0\n.....\n\nBreaking changes\n~~~~~~~~~~~~~~~~\n\n* ``Auto-apply apply_default decorator (#15667)``\n\n.. warning:: Due to apply_default decorator removal, this version of the provider requires Airflow 2.1.0+.\n If your Airflow version is < 2.1.0, and you want to install this provider version, first upgrade\n Airflow to at least version 2.1.0. Otherwise your Airflow package version will be upgraded\n automatically and you will have to manually run ``airflow upgrade db`` to complete the migration.\n\nFeatures\n~~~~~~~~\n\n* ``Update 'SimpleHttpOperator' to take auth object (#15605)``\n* ``HttpHook: Use request factory and respect defaults (#14701)``\n\n.. Below changes are excluded from the changelog. Move them to\n appropriate section above if needed. Do not delete the lines(!):\n * ``Check synctatic correctness for code-snippets (#16005)``\n * ``Prepares provider release after PIP 21 compatibility (#15576)``\n * ``Remove Backport Providers (#14886)``\n * ``Updated documentation for June 2021 provider release (#16294)``\n * ``Add documentation for the HTTP connection (#15379)``\n * ``More documentation update for June providers release (#16405)``\n * ``Synchronizes updated changelog after buggfix release (#16464)``\n\n1.1.1\n.....\n\nBug fixes\n~~~~~~~~~\n\n* ``Corrections in docs and tools after releasing provider RCs (#14082)``\n\n\n1.1.0\n.....\n\nUpdated documentation and readme files.\n\nFeatures\n~~~~~~~~\n\n* ``Add a new argument for HttpSensor to accept a list of http status code``\n\n1.0.0\n.....\n\nInitial version of the provider.\n\n\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://airflow.apache.org/",
- "download_url": "https://archive.apache.org/dist/airflow/providers",
- "author": "Apache Software Foundation",
- "author_email": "dev@airflow.apache.org",
- "license": "Apache License 2.0",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Console",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "Intended Audience :: System Administrators",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Topic :: System :: Monitoring"
- ],
- "requires_dist": [
- "apache-airflow (>=2.1.0)",
- "requests (>=2.20.0)"
- ],
- "requires_python": "~=3.6",
- "project_url": [
- "Documentation, https://airflow.apache.org/docs/apache-airflow-providers-http/2.0.0/",
- "Bug Tracker, https://github.com/apache/airflow/issues",
- "Source Code, https://github.com/apache/airflow"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/81/f1/fd276f800b5790ec046b0fdeadc758055e4ba58474e6f1c9877ddeb08f75/apache_airflow_providers_imap-3.4.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=4972793b0dbb25d5372fe1bf174329958075985c0beca013459ec89fcbbca620",
- "hashes": {
- "sha256": "4972793b0dbb25d5372fe1bf174329958075985c0beca013459ec89fcbbca620"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "apache-airflow-providers-imap",
- "version": "3.4.0",
- "summary": "Provider for Apache Airflow. Implements apache-airflow-providers-imap package",
- "description": "\n.. Licensed to the Apache Software Foundation (ASF) under one\n or more contributor license agreements. See the NOTICE file\n distributed with this work for additional information\n regarding copyright ownership. The ASF licenses this file\n to you under the Apache License, Version 2.0 (the\n \"License\"); you may not use this file except in compliance\n with the License. You may obtain a copy of the License at\n\n.. http://www.apache.org/licenses/LICENSE-2.0\n\n.. Unless required by applicable law or agreed to in writing,\n software distributed under the License is distributed on an\n \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n KIND, either express or implied. See the License for the\n specific language governing permissions and limitations\n under the License.\n\n .. Licensed to the Apache Software Foundation (ASF) under one\n or more contributor license agreements. See the NOTICE file\n distributed with this work for additional information\n regarding copyright ownership. The ASF licenses this file\n to you under the Apache License, Version 2.0 (the\n \"License\"); you may not use this file except in compliance\n with the License. You may obtain a copy of the License at\n\n .. http://www.apache.org/licenses/LICENSE-2.0\n\n .. Unless required by applicable law or agreed to in writing,\n software distributed under the License is distributed on an\n \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n KIND, either express or implied. See the License for the\n specific language governing permissions and limitations\n under the License.\n\n\nPackage ``apache-airflow-providers-imap``\n\nRelease: ``3.4.0``\n\n\n`Internet Message Access Protocol (IMAP) <https://tools.ietf.org/html/rfc3501>`__\n\n\nProvider package\n----------------\n\nThis is a provider package for ``imap`` provider. All classes for this provider package\nare in ``airflow.providers.imap`` python package.\n\nYou can find package information and changelog for the provider\nin the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-imap/3.4.0/>`_.\n\n\nInstallation\n------------\n\nYou can install this package on top of an existing Airflow 2 installation (see ``Requirements`` below\nfor the minimum Airflow version supported) via\n``pip install apache-airflow-providers-imap``\n\nThe package supports the following python versions: 3.8,3.9,3.10,3.11\n\nRequirements\n------------\n\n================== ==================\nPIP package Version required\n================== ==================\n``apache-airflow`` ``>=2.5.0``\n================== ==================\n\nThe changelog for the provider package can be found in the\n`changelog <https://airflow.apache.org/docs/apache-airflow-providers-imap/3.4.0/changelog.html>`_.\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://airflow.apache.org/",
- "download_url": "https://archive.apache.org/dist/airflow/providers",
- "author": "Apache Software Foundation",
- "author_email": "dev@airflow.apache.org",
- "license": "Apache License 2.0",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Console",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "Intended Audience :: System Administrators",
- "Framework :: Apache Airflow",
- "Framework :: Apache Airflow :: Provider",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Topic :: System :: Monitoring"
- ],
- "requires_dist": [
- "apache-airflow >=2.5.0"
- ],
- "requires_python": "~=3.8",
- "project_url": [
- "Documentation, https://airflow.apache.org/docs/apache-airflow-providers-imap/3.4.0/",
- "Changelog, https://airflow.apache.org/docs/apache-airflow-providers-imap/3.4.0/changelog.html",
- "Bug Tracker, https://github.com/apache/airflow/issues",
- "Source Code, https://github.com/apache/airflow",
- "Slack Chat, https://s.apache.org/airflow-slack",
- "Twitter, https://twitter.com/ApacheAirflow",
- "YouTube, https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/e1/30/95f0c4a6b3ba7f1a2a6a9f0f3f6e0cb0de812851ffd1765981eec3d305b6/apache_airflow_providers_sqlite-3.5.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=7baba67c9ddf75b31d8197e22ca491c2e1cf9e4c6306c1788c150b5457c3a182",
- "hashes": {
- "sha256": "7baba67c9ddf75b31d8197e22ca491c2e1cf9e4c6306c1788c150b5457c3a182"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "apache-airflow-providers-sqlite",
- "version": "3.5.0",
- "summary": "Provider for Apache Airflow. Implements apache-airflow-providers-sqlite package",
- "description": "\n.. Licensed to the Apache Software Foundation (ASF) under one\n or more contributor license agreements. See the NOTICE file\n distributed with this work for additional information\n regarding copyright ownership. The ASF licenses this file\n to you under the Apache License, Version 2.0 (the\n \"License\"); you may not use this file except in compliance\n with the License. You may obtain a copy of the License at\n\n.. http://www.apache.org/licenses/LICENSE-2.0\n\n.. Unless required by applicable law or agreed to in writing,\n software distributed under the License is distributed on an\n \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n KIND, either express or implied. See the License for the\n specific language governing permissions and limitations\n under the License.\n\n .. Licensed to the Apache Software Foundation (ASF) under one\n or more contributor license agreements. See the NOTICE file\n distributed with this work for additional information\n regarding copyright ownership. The ASF licenses this file\n to you under the Apache License, Version 2.0 (the\n \"License\"); you may not use this file except in compliance\n with the License. You may obtain a copy of the License at\n\n .. http://www.apache.org/licenses/LICENSE-2.0\n\n .. Unless required by applicable law or agreed to in writing,\n software distributed under the License is distributed on an\n \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n KIND, either express or implied. See the License for the\n specific language governing permissions and limitations\n under the License.\n\n\nPackage ``apache-airflow-providers-sqlite``\n\nRelease: ``3.5.0``\n\n\n`SQLite <https://www.sqlite.org/>`__\n\n\nProvider package\n----------------\n\nThis is a provider package for ``sqlite`` provider. All classes for this provider package\nare in ``airflow.providers.sqlite`` python package.\n\nYou can find package information and changelog for the provider\nin the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-sqlite/3.5.0/>`_.\n\n\nInstallation\n------------\n\nYou can install this package on top of an existing Airflow 2 installation (see ``Requirements`` below\nfor the minimum Airflow version supported) via\n``pip install apache-airflow-providers-sqlite``\n\nThe package supports the following python versions: 3.8,3.9,3.10,3.11\n\nRequirements\n------------\n\n======================================= ==================\nPIP package Version required\n======================================= ==================\n``apache-airflow`` ``>=2.5.0``\n``apache-airflow-providers-common-sql`` ``>=1.3.1``\n======================================= ==================\n\nCross provider package dependencies\n-----------------------------------\n\nThose are dependencies that might be needed in order to use all the features of the package.\nYou need to install the specified provider packages in order to use them.\n\nYou can install such cross-provider dependencies when installing from PyPI. For example:\n\n.. code-block:: bash\n\n pip install apache-airflow-providers-sqlite[common.sql]\n\n\n============================================================================================================ ==============\nDependent package Extra\n============================================================================================================ ==============\n`apache-airflow-providers-common-sql <https://airflow.apache.org/docs/apache-airflow-providers-common-sql>`_ ``common.sql``\n============================================================================================================ ==============\n\nThe changelog for the provider package can be found in the\n`changelog <https://airflow.apache.org/docs/apache-airflow-providers-sqlite/3.5.0/changelog.html>`_.\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://airflow.apache.org/",
- "download_url": "https://archive.apache.org/dist/airflow/providers",
- "author": "Apache Software Foundation",
- "author_email": "dev@airflow.apache.org",
- "license": "Apache License 2.0",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Console",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "Intended Audience :: System Administrators",
- "Framework :: Apache Airflow",
- "Framework :: Apache Airflow :: Provider",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Topic :: System :: Monitoring"
- ],
- "requires_dist": [
- "apache-airflow-providers-common-sql >=1.3.1",
- "apache-airflow >=2.5.0",
- "apache-airflow-providers-common-sql ; extra == 'common.sql'"
- ],
- "requires_python": "~=3.8",
- "project_url": [
- "Documentation, https://airflow.apache.org/docs/apache-airflow-providers-sqlite/3.5.0/",
- "Changelog, https://airflow.apache.org/docs/apache-airflow-providers-sqlite/3.5.0/changelog.html",
- "Bug Tracker, https://github.com/apache/airflow/issues",
- "Source Code, https://github.com/apache/airflow",
- "Slack Chat, https://s.apache.org/airflow-slack",
- "Twitter, https://twitter.com/ApacheAirflow",
- "YouTube, https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/"
- ],
- "provides_extra": [
- "common.sql"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/8c/fb/5b32dc208c0adadd1b9f08f0982c1a39c0bcc7a0f6206802a0c9086c4756/apispec-6.3.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=95a0b9355785df998bb0e9b939237a30ee4c7428fd6ef97305eae3da06b9b339",
- "hashes": {
- "sha256": "95a0b9355785df998bb0e9b939237a30ee4c7428fd6ef97305eae3da06b9b339"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "apispec",
- "version": "6.3.0",
- "summary": "A pluggable API specification generator. Currently supports the OpenAPI Specification (f.k.a. the Swagger specification).",
- "description": "*******\napispec\n*******\n\n.. image:: https://badgen.net/pypi/v/apispec\n :target: https://pypi.org/project/apispec/\n :alt: PyPI version\n\n.. image:: https://dev.azure.com/sloria/sloria/_apis/build/status/marshmallow-code.apispec?branchName=dev\n :target: https://dev.azure.com/sloria/sloria/_build/latest?definitionId=8&branchName=dev\n :alt: Build status\n\n.. image:: https://readthedocs.org/projects/apispec/badge/\n :target: https://apispec.readthedocs.io/\n :alt: Documentation\n\n.. image:: https://badgen.net/badge/marshmallow/3?list=1\n :target: https://marshmallow.readthedocs.io/en/latest/upgrading.html\n :alt: marshmallow 3 only\n\n.. image:: https://badgen.net/badge/OAS/2,3?list=1&color=cyan\n :target: https://github.com/OAI/OpenAPI-Specification\n :alt: OpenAPI Specification 2/3 compatible\n\n.. image:: https://badgen.net/badge/code%20style/black/000\n :target: https://github.com/ambv/black\n :alt: code style: black\n\nA pluggable API specification generator. Currently supports the `OpenAPI Specification <https://github.com/OAI/OpenAPI-Specification>`_ (f.k.a. the Swagger specification).\n\nFeatures\n========\n\n- Supports the OpenAPI Specification (versions 2 and 3)\n- Framework-agnostic\n- Built-in support for `marshmallow <https://marshmallow.readthedocs.io/>`_\n- Utilities for parsing docstrings\n\nInstallation\n============\n\n::\n\n $ pip install -U apispec\n\nWhen using the marshmallow plugin, ensure a compatible marshmallow version is used: ::\n\n $ pip install -U apispec[marshmallow]\n\nExample Application\n===================\n\n.. code-block:: python\n\n from apispec import APISpec\n from apispec.ext.marshmallow import MarshmallowPlugin\n from apispec_webframeworks.flask import FlaskPlugin\n from flask import Flask\n from marshmallow import Schema, fields\n\n\n # Create an APISpec\n spec = APISpec(\n title=\"Swagger Petstore\",\n version=\"1.0.0\",\n openapi_version=\"3.0.2\",\n plugins=[FlaskPlugin(), MarshmallowPlugin()],\n )\n\n # Optional marshmallow support\n class CategorySchema(Schema):\n id = fields.Int()\n name = fields.Str(required=True)\n\n\n class PetSchema(Schema):\n category = fields.List(fields.Nested(CategorySchema))\n name = fields.Str()\n\n\n # Optional security scheme support\n api_key_scheme = {\"type\": \"apiKey\", \"in\": \"header\", \"name\": \"X-API-Key\"}\n spec.components.security_scheme(\"ApiKeyAuth\", api_key_scheme)\n\n\n # Optional Flask support\n app = Flask(__name__)\n\n\n @app.route(\"/random\")\n def random_pet():\n \"\"\"A cute furry animal endpoint.\n ---\n get:\n description: Get a random pet\n security:\n - ApiKeyAuth: []\n responses:\n 200:\n content:\n application/json:\n schema: PetSchema\n \"\"\"\n pet = get_random_pet()\n return PetSchema().dump(pet)\n\n\n # Register the path and the entities within it\n with app.test_request_context():\n spec.path(view=random_pet)\n\n\nGenerated OpenAPI Spec\n----------------------\n\n.. code-block:: python\n\n import json\n\n print(json.dumps(spec.to_dict(), indent=2))\n # {\n # \"paths\": {\n # \"/random\": {\n # \"get\": {\n # \"description\": \"Get a random pet\",\n # \"security\": [\n # {\n # \"ApiKeyAuth\": []\n # }\n # ],\n # \"responses\": {\n # \"200\": {\n # \"content\": {\n # \"application/json\": {\n # \"schema\": {\n # \"$ref\": \"#/components/schemas/Pet\"\n # }\n # }\n # }\n # }\n # }\n # }\n # }\n # },\n # \"tags\": [],\n # \"info\": {\n # \"title\": \"Swagger Petstore\",\n # \"version\": \"1.0.0\"\n # },\n # \"openapi\": \"3.0.2\",\n # \"components\": {\n # \"parameters\": {},\n # \"responses\": {},\n # \"schemas\": {\n # \"Category\": {\n # \"type\": \"object\",\n # \"properties\": {\n # \"name\": {\n # \"type\": \"string\"\n # },\n # \"id\": {\n # \"type\": \"integer\",\n # \"format\": \"int32\"\n # }\n # },\n # \"required\": [\n # \"name\"\n # ]\n # },\n # \"Pet\": {\n # \"type\": \"object\",\n # \"properties\": {\n # \"name\": {\n # \"type\": \"string\"\n # },\n # \"category\": {\n # \"type\": \"array\",\n # \"items\": {\n # \"$ref\": \"#/components/schemas/Category\"\n # }\n # }\n # }\n # }\n # \"securitySchemes\": {\n # \"ApiKeyAuth\": {\n # \"type\": \"apiKey\",\n # \"in\": \"header\",\n # \"name\": \"X-API-Key\"\n # }\n # }\n # }\n # }\n # }\n\n print(spec.to_yaml())\n # components:\n # parameters: {}\n # responses: {}\n # schemas:\n # Category:\n # properties:\n # id: {format: int32, type: integer}\n # name: {type: string}\n # required: [name]\n # type: object\n # Pet:\n # properties:\n # category:\n # items: {$ref: '#/components/schemas/Category'}\n # type: array\n # name: {type: string}\n # type: object\n # securitySchemes:\n # ApiKeyAuth:\n # in: header\n # name: X-API-KEY\n # type: apiKey\n # info: {title: Swagger Petstore, version: 1.0.0}\n # openapi: 3.0.2\n # paths:\n # /random:\n # get:\n # description: Get a random pet\n # responses:\n # 200:\n # content:\n # application/json:\n # schema: {$ref: '#/components/schemas/Pet'}\n # security:\n # - ApiKeyAuth: []\n # tags: []\n\n\nDocumentation\n=============\n\nDocumentation is available at https://apispec.readthedocs.io/ .\n\nEcosystem\n=========\n\nA list of apispec-related libraries can be found at the GitHub wiki here:\n\nhttps://github.com/marshmallow-code/apispec/wiki/Ecosystem\n\nSupport apispec\n===============\n\napispec is maintained by a group of\n`volunteers <https://apispec.readthedocs.io/en/latest/authors.html>`_.\nIf you'd like to support the future of the project, please consider\ncontributing to our Open Collective:\n\n.. image:: https://opencollective.com/marshmallow/donate/button.png\n :target: https://opencollective.com/marshmallow\n :width: 200\n :alt: Donate to our collective\n\nProfessional Support\n====================\n\nProfessionally-supported apispec is available through the\n`Tidelift Subscription <https://tidelift.com/subscription/pkg/pypi-apispec?utm_source=pypi-apispec&utm_medium=referral&utm_campaign=readme>`_.\n\nTidelift gives software development teams a single source for purchasing and maintaining their software,\nwith professional-grade assurances from the experts who know it best,\nwhile seamlessly integrating with existing tools. [`Get professional support`_]\n\n.. _`Get professional support`: https://tidelift.com/subscription/pkg/pypi-apispec?utm_source=pypi-apispec&utm_medium=referral&utm_campaign=readme\n\n.. image:: https://user-images.githubusercontent.com/2379650/45126032-50b69880-b13f-11e8-9c2c-abd16c433495.png\n :target: https://tidelift.com/subscription/pkg/pypi-apispec?utm_source=pypi-apispec&utm_medium=referral&utm_campaign=readme\n :alt: Get supported apispec with Tidelift\n\nSecurity Contact Information\n============================\n\nTo report a security vulnerability, please use the\n`Tidelift security contact <https://tidelift.com/security>`_.\nTidelift will coordinate the fix and disclosure.\n\nProject Links\n=============\n\n- Docs: https://apispec.readthedocs.io/\n- Changelog: https://apispec.readthedocs.io/en/latest/changelog.html\n- Contributing Guidelines: https://apispec.readthedocs.io/en/latest/contributing.html\n- PyPI: https://pypi.python.org/pypi/apispec\n- Issues: https://github.com/marshmallow-code/apispec/issues\n\n\nLicense\n=======\n\nMIT licensed. See the bundled `LICENSE <https://github.com/marshmallow-code/apispec/blob/dev/LICENSE>`_ file for more details.\n",
- "keywords": [
- "apispec",
- "swagger",
- "openapi",
- "specification",
- "oas",
- "documentation",
- "spec",
- "rest",
- "api"
- ],
- "home_page": "https://github.com/marshmallow-code/apispec",
- "author": "Steven Loria",
- "author_email": "sloria1@gmail.com",
- "license": "MIT",
- "classifier": [
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3 :: Only"
- ],
- "requires_dist": [
- "packaging (>=21.3)",
- "PyYAML (>=3.10) ; extra == 'dev'",
- "prance[osv] (>=0.11) ; extra == 'dev'",
- "openapi-spec-validator (<0.5) ; extra == 'dev'",
- "marshmallow (>=3.13.0) ; extra == 'dev'",
- "pytest ; extra == 'dev'",
- "flake8 (==5.0.4) ; extra == 'dev'",
- "flake8-bugbear (==22.9.23) ; extra == 'dev'",
- "pre-commit (~=2.4) ; extra == 'dev'",
- "mypy (==0.982) ; extra == 'dev'",
- "types-PyYAML ; extra == 'dev'",
- "tox ; extra == 'dev'",
- "marshmallow (>=3.13.0) ; extra == 'docs'",
- "pyyaml (==6.0) ; extra == 'docs'",
- "sphinx (==5.2.3) ; extra == 'docs'",
- "sphinx-issues (==3.0.1) ; extra == 'docs'",
- "sphinx-rtd-theme (==1.0.0) ; extra == 'docs'",
- "flake8 (==5.0.4) ; extra == 'lint'",
- "flake8-bugbear (==22.9.23) ; extra == 'lint'",
- "pre-commit (~=2.4) ; extra == 'lint'",
- "mypy (==0.982) ; extra == 'lint'",
- "types-PyYAML ; extra == 'lint'",
- "marshmallow (>=3.18.0) ; extra == 'marshmallow'",
- "PyYAML (>=3.10) ; extra == 'tests'",
- "prance[osv] (>=0.11) ; extra == 'tests'",
- "openapi-spec-validator (<0.5) ; extra == 'tests'",
- "marshmallow (>=3.13.0) ; extra == 'tests'",
- "pytest ; extra == 'tests'",
- "prance[osv] (>=0.11) ; extra == 'validation'",
- "openapi-spec-validator (<0.5) ; extra == 'validation'",
- "PyYAML (>=3.10) ; extra == 'yaml'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Funding, https://opencollective.com/marshmallow",
- "Issues, https://github.com/marshmallow-code/apispec/issues",
- "Tidelift, https://tidelift.com/subscription/pkg/pypi-apispec?utm_source=pypi-apispec&utm_medium=pypi"
- ],
- "provides_extra": [
- "dev",
- "docs",
- "lint",
- "marshmallow",
- "tests",
- "validation",
- "yaml"
- ]
- },
- "requested_extras": [
- "yaml"
- ]
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/1e/05/223116a4a5905d6b26bff334ffc7b74474fafe23fcb10532caf0ef86ca69/argcomplete-3.1.2-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=d97c036d12a752d1079f190bc1521c545b941fda89ad85d15afa909b4d1b9a99",
- "hashes": {
- "sha256": "d97c036d12a752d1079f190bc1521c545b941fda89ad85d15afa909b4d1b9a99"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "argcomplete",
- "version": "3.1.2",
- "platform": [
- "MacOS X",
- "Posix"
- ],
- "summary": "Bash tab completion for argparse",
- "description": "argcomplete - Bash/zsh tab completion for argparse\n==================================================\n*Tab complete all the things!*\n\nArgcomplete provides easy, extensible command line tab completion of arguments for your Python application.\n\nIt makes two assumptions:\n\n* You're using bash or zsh as your shell\n* You're using `argparse <http://docs.python.org/3/library/argparse.html>`_ to manage your command line arguments/options\n\nArgcomplete is particularly useful if your program has lots of options or subparsers, and if your program can\ndynamically suggest completions for your argument/option values (for example, if the user is browsing resources over\nthe network).\n\nInstallation\n------------\n::\n\n pip install argcomplete\n activate-global-python-argcomplete\n\nSee `Activating global completion`_ below for details about the second step.\n\nRefresh your shell environment (start a new shell).\n\nSynopsis\n--------\nAdd the ``PYTHON_ARGCOMPLETE_OK`` marker and a call to ``argcomplete.autocomplete()`` to your Python application as\nfollows:\n\n.. code-block:: python\n\n #!/usr/bin/env python\n # PYTHON_ARGCOMPLETE_OK\n import argcomplete, argparse\n parser = argparse.ArgumentParser()\n ...\n argcomplete.autocomplete(parser)\n args = parser.parse_args()\n ...\n\nRegister your Python application with your shell's completion framework by running ``register-python-argcomplete``::\n\n eval \"$(register-python-argcomplete my-python-app)\"\n\nQuotes are significant; the registration will fail without them. See `Global completion`_ below for a way to enable\nargcomplete generally without registering each application individually.\n\nargcomplete.autocomplete(*parser*)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nThis method is the entry point to the module. It must be called **after** ArgumentParser construction is complete, but\n**before** the ``ArgumentParser.parse_args()`` method is called. The method looks for an environment variable that the\ncompletion hook shellcode sets, and if it's there, collects completions, prints them to the output stream (fd 8 by\ndefault), and exits. Otherwise, it returns to the caller immediately.\n\n.. admonition:: Side effects\n\n Argcomplete gets completions by running your program. It intercepts the execution flow at the moment\n ``argcomplete.autocomplete()`` is called. After sending completions, it exits using ``exit_method`` (``os._exit``\n by default). This means if your program has any side effects that happen before ``argcomplete`` is called, those\n side effects will happen every time the user presses ``<TAB>`` (although anything your program prints to stdout or\n stderr will be suppressed). For this reason it's best to construct the argument parser and call\n ``argcomplete.autocomplete()`` as early as possible in your execution flow.\n\n.. admonition:: Performance\n\n If the program takes a long time to get to the point where ``argcomplete.autocomplete()`` is called, the tab completion\n process will feel sluggish, and the user may lose confidence in it. So it's also important to minimize the startup time\n of the program up to that point (for example, by deferring initialization or importing of large modules until after\n parsing options).\n\nSpecifying completers\n---------------------\nYou can specify custom completion functions for your options and arguments. Two styles are supported: callable and\nreadline-style. Callable completers are simpler. They are called with the following keyword arguments:\n\n* ``prefix``: The prefix text of the last word before the cursor on the command line.\n For dynamic completers, this can be used to reduce the work required to generate possible completions.\n* ``action``: The ``argparse.Action`` instance that this completer was called for.\n* ``parser``: The ``argparse.ArgumentParser`` instance that the action was taken by.\n* ``parsed_args``: The result of argument parsing so far (the ``argparse.Namespace`` args object normally returned by\n ``ArgumentParser.parse_args()``).\n\nCompleters can return their completions as an iterable of strings or a mapping (dict) of strings to their\ndescriptions (zsh will display the descriptions as context help alongside completions). An example completer for names\nof environment variables might look like this:\n\n.. code-block:: python\n\n def EnvironCompleter(**kwargs):\n return os.environ\n\nTo specify a completer for an argument or option, set the ``completer`` attribute of its associated action. An easy\nway to do this at definition time is:\n\n.. code-block:: python\n\n from argcomplete.completers import EnvironCompleter\n\n parser = argparse.ArgumentParser()\n parser.add_argument(\"--env-var1\").completer = EnvironCompleter\n parser.add_argument(\"--env-var2\").completer = EnvironCompleter\n argcomplete.autocomplete(parser)\n\nIf you specify the ``choices`` keyword for an argparse option or argument (and don't specify a completer), it will be\nused for completions.\n\nA completer that is initialized with a set of all possible choices of values for its action might look like this:\n\n.. code-block:: python\n\n class ChoicesCompleter(object):\n def __init__(self, choices):\n self.choices = choices\n\n def __call__(self, **kwargs):\n return self.choices\n\nThe following two ways to specify a static set of choices are equivalent for completion purposes:\n\n.. code-block:: python\n\n from argcomplete.completers import ChoicesCompleter\n\n parser.add_argument(\"--protocol\", choices=('http', 'https', 'ssh', 'rsync', 'wss'))\n parser.add_argument(\"--proto\").completer=ChoicesCompleter(('http', 'https', 'ssh', 'rsync', 'wss'))\n\nNote that if you use the ``choices=<completions>`` option, argparse will show\nall these choices in the ``--help`` output by default. To prevent this, set\n``metavar`` (like ``parser.add_argument(\"--protocol\", metavar=\"PROTOCOL\",\nchoices=('http', 'https', 'ssh', 'rsync', 'wss'))``).\n\nThe following `script <https://raw.github.com/kislyuk/argcomplete/master/docs/examples/describe_github_user.py>`_ uses\n``parsed_args`` and `Requests <http://python-requests.org/>`_ to query GitHub for publicly known members of an\norganization and complete their names, then prints the member description:\n\n.. code-block:: python\n\n #!/usr/bin/env python\n # PYTHON_ARGCOMPLETE_OK\n import argcomplete, argparse, requests, pprint\n\n def github_org_members(prefix, parsed_args, **kwargs):\n resource = \"https://api.github.com/orgs/{org}/members\".format(org=parsed_args.organization)\n return (member['login'] for member in requests.get(resource).json() if member['login'].startswith(prefix))\n\n parser = argparse.ArgumentParser()\n parser.add_argument(\"--organization\", help=\"GitHub organization\")\n parser.add_argument(\"--member\", help=\"GitHub member\").completer = github_org_members\n\n argcomplete.autocomplete(parser)\n args = parser.parse_args()\n\n pprint.pprint(requests.get(\"https://api.github.com/users/{m}\".format(m=args.member)).json())\n\n`Try it <https://raw.github.com/kislyuk/argcomplete/master/docs/examples/describe_github_user.py>`_ like this::\n\n ./describe_github_user.py --organization heroku --member <TAB>\n\nIf you have a useful completer to add to the `completer library\n<https://github.com/kislyuk/argcomplete/blob/master/argcomplete/completers.py>`_, send a pull request!\n\nReadline-style completers\n~~~~~~~~~~~~~~~~~~~~~~~~~\nThe readline_ module defines a completer protocol in rlcompleter_. Readline-style completers are also supported by\nargcomplete, so you can use the same completer object both in an interactive readline-powered shell and on the command\nline. For example, you can use the readline-style completer provided by IPython_ to get introspective completions like\nyou would get in the IPython shell:\n\n.. _readline: http://docs.python.org/3/library/readline.html\n.. _rlcompleter: http://docs.python.org/3/library/rlcompleter.html#completer-objects\n.. _IPython: http://ipython.org/\n\n.. code-block:: python\n\n import IPython\n parser.add_argument(\"--python-name\").completer = IPython.core.completer.Completer()\n\n``argcomplete.CompletionFinder.rl_complete`` can also be used to plug in an argparse parser as a readline completer.\n\nPrinting warnings in completers\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nNormal stdout/stderr output is suspended when argcomplete runs. Sometimes, though, when the user presses ``<TAB>``, it's\nappropriate to print information about why completions generation failed. To do this, use ``warn``:\n\n.. code-block:: python\n\n from argcomplete import warn\n\n def AwesomeWebServiceCompleter(prefix, **kwargs):\n if login_failed:\n warn(\"Please log in to Awesome Web Service to use autocompletion\")\n return completions\n\nUsing a custom completion validator\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nBy default, argcomplete validates your completions by checking if they start with the prefix given to the completer. You\ncan override this validation check by supplying the ``validator`` keyword to ``argcomplete.autocomplete()``:\n\n.. code-block:: python\n\n def my_validator(completion_candidate, current_input):\n \"\"\"Complete non-prefix substring matches.\"\"\"\n return current_input in completion_candidate\n\n argcomplete.autocomplete(parser, validator=my_validator)\n\nGlobal completion\n-----------------\nIn global completion mode, you don't have to register each argcomplete-capable executable separately. Instead, the shell\nwill look for the string **PYTHON_ARGCOMPLETE_OK** in the first 1024 bytes of any executable that it's running\ncompletion for, and if it's found, follow the rest of the argcomplete protocol as described above.\n\nAdditionally, completion is activated for scripts run as ``python <script>`` and ``python -m <module>``. If you're using\nmultiple Python versions on the same system, the version being used to run the script must have argcomplete installed.\n\n.. admonition:: Bash version compatibility\n\n When using bash, global completion requires bash support for ``complete -D``, which was introduced in bash 4.2. Since\n Mac OS ships with an outdated version of Bash (3.2), you can either use zsh or install a newer version of bash using\n `Homebrew <http://brew.sh/>`_ (``brew install bash`` - you will also need to add ``/usr/local/bin/bash`` to\n ``/etc/shells``, and run ``chsh`` to change your shell). You can check the version of the running copy of bash with\n ``echo $BASH_VERSION``.\n\n.. note:: If you use setuptools/distribute ``scripts`` or ``entry_points`` directives to package your module,\n argcomplete will follow the wrapper scripts to their destination and look for ``PYTHON_ARGCOMPLETE_OK`` in the\n destination code.\n\nIf you choose not to use global completion, or ship a completion module that depends on argcomplete, you must register\nyour script explicitly using ``eval \"$(register-python-argcomplete my-python-app)\"``. Standard completion module\nregistration rules apply: namely, the script name is passed directly to ``complete``, meaning it is only tab completed\nwhen invoked exactly as it was registered. In the above example, ``my-python-app`` must be on the path, and the user\nmust be attempting to complete it by that name. The above line alone would **not** allow you to complete\n``./my-python-app``, or ``/path/to/my-python-app``.\n\nActivating global completion\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nThe script ``activate-global-python-argcomplete`` installs the global completion script\n`bash_completion.d/_python-argcomplete <https://github.com/kislyuk/argcomplete/blob/master/argcomplete/bash_completion.d/_python-argcomplete>`_\ninto an appropriate location on your system for both bash and zsh. The specific location depends on your platform and\nwhether you installed argcomplete system-wide using ``sudo`` or locally (into your user's home directory).\n\nZsh Support\n-----------\nArgcomplete supports zsh. On top of plain completions like in bash, zsh allows you to see argparse help strings as\ncompletion descriptions. All shellcode included with argcomplete is compatible with both bash and zsh, so the same\ncompleter commands ``activate-global-python-argcomplete`` and ``eval \"$(register-python-argcomplete my-python-app)\"``\nwork for zsh as well.\n\nPython Support\n--------------\nArgcomplete requires Python 3.7+.\n\nSupport for other shells\n------------------------\nArgcomplete maintainers provide support only for the bash and zsh shells on Linux and MacOS. For resources related to\nother shells and platforms, including fish, tcsh, xonsh, powershell, and Windows, please see the\n`contrib <https://github.com/kislyuk/argcomplete/tree/develop/contrib>`_ directory.\n\nCommon Problems\n---------------\nIf global completion is not completing your script, bash may have registered a default completion function::\n\n $ complete | grep my-python-app\n complete -F _minimal my-python-app\n\nYou can fix this by restarting your shell, or by running ``complete -r my-python-app``.\n\nDebugging\n---------\nSet the ``_ARC_DEBUG`` variable in your shell to enable verbose debug output every time argcomplete runs. This will\ndisrupt the command line composition state of your terminal, but make it possible to see the internal state of the\ncompleter if it encounters problems.\n\nAcknowledgments\n---------------\nInspired and informed by the optcomplete_ module by Martin Blais.\n\n.. _optcomplete: http://pypi.python.org/pypi/optcomplete\n\nLinks\n-----\n* `Project home page (GitHub) <https://github.com/kislyuk/argcomplete>`_\n* `Documentation <https://kislyuk.github.io/argcomplete/>`_\n* `Package distribution (PyPI) <https://pypi.python.org/pypi/argcomplete>`_\n* `Change log <https://github.com/kislyuk/argcomplete/blob/master/Changes.rst>`_\n\nBugs\n~~~~\nPlease report bugs, issues, feature requests, etc. on `GitHub <https://github.com/kislyuk/argcomplete/issues>`_.\n\nLicense\n-------\nCopyright 2012-2023, Andrey Kislyuk and argcomplete contributors. Licensed under the terms of the\n`Apache License, Version 2.0 <http://www.apache.org/licenses/LICENSE-2.0>`_. Distribution of the LICENSE and NOTICE\nfiles with source copies of this package and derivative works is **REQUIRED** as specified by the Apache License.\n\n.. image:: https://github.com/kislyuk/argcomplete/workflows/Python%20package/badge.svg\n :target: https://github.com/kislyuk/argcomplete/actions\n.. image:: https://codecov.io/github/kislyuk/argcomplete/coverage.svg?branch=master\n :target: https://codecov.io/github/kislyuk/argcomplete?branch=master\n.. image:: https://img.shields.io/pypi/v/argcomplete.svg\n :target: https://pypi.python.org/pypi/argcomplete\n.. image:: https://img.shields.io/pypi/l/argcomplete.svg\n :target: https://pypi.python.org/pypi/argcomplete\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://github.com/kislyuk/argcomplete",
- "author": "Andrey Kislyuk",
- "author_email": "kislyuk@gmail.com",
- "license": "Apache Software License",
- "classifier": [
- "Environment :: Console",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Apache Software License",
- "Operating System :: MacOS :: MacOS X",
- "Operating System :: POSIX",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Development Status :: 5 - Production/Stable",
- "Topic :: Software Development",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "Topic :: System :: Shells",
- "Topic :: Terminals"
- ],
- "requires_dist": [
- "importlib-metadata <7,>=0.23 ; python_version < \"3.8\"",
- "coverage ; extra == 'test'",
- "pexpect ; extra == 'test'",
- "wheel ; extra == 'test'",
- "ruff ; extra == 'test'",
- "mypy ; extra == 'test'"
- ],
- "requires_python": ">=3.6",
- "project_url": [
- "Documentation, https://kislyuk.github.io/argcomplete",
- "Source Code, https://github.com/kislyuk/argcomplete",
- "Issue Tracker, https://github.com/kislyuk/argcomplete/issues",
- "Change Log, https://github.com/kislyuk/argcomplete/blob/master/Changes.rst"
- ],
- "provides_extra": [
- "test"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/9b/80/b9051a4a07ad231558fcd8ffc89232711b4e618c15cb7a392a17384bbeef/asgiref-3.7.2-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e",
- "hashes": {
- "sha256": "89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "asgiref",
- "version": "3.7.2",
- "summary": "ASGI specs, helper code, and adapters",
- "description": "asgiref\n=======\n\n.. image:: https://api.travis-ci.org/django/asgiref.svg\n :target: https://travis-ci.org/django/asgiref\n\n.. image:: https://img.shields.io/pypi/v/asgiref.svg\n :target: https://pypi.python.org/pypi/asgiref\n\nASGI is a standard for Python asynchronous web apps and servers to communicate\nwith each other, and positioned as an asynchronous successor to WSGI. You can\nread more at https://asgi.readthedocs.io/en/latest/\n\nThis package includes ASGI base libraries, such as:\n\n* Sync-to-async and async-to-sync function wrappers, ``asgiref.sync``\n* Server base classes, ``asgiref.server``\n* A WSGI-to-ASGI adapter, in ``asgiref.wsgi``\n\n\nFunction wrappers\n-----------------\n\nThese allow you to wrap or decorate async or sync functions to call them from\nthe other style (so you can call async functions from a synchronous thread,\nor vice-versa).\n\nIn particular:\n\n* AsyncToSync lets a synchronous subthread stop and wait while the async\n function is called on the main thread's event loop, and then control is\n returned to the thread when the async function is finished.\n\n* SyncToAsync lets async code call a synchronous function, which is run in\n a threadpool and control returned to the async coroutine when the synchronous\n function completes.\n\nThe idea is to make it easier to call synchronous APIs from async code and\nasynchronous APIs from synchronous code so it's easier to transition code from\none style to the other. In the case of Channels, we wrap the (synchronous)\nDjango view system with SyncToAsync to allow it to run inside the (asynchronous)\nASGI server.\n\nNote that exactly what threads things run in is very specific, and aimed to\nkeep maximum compatibility with old synchronous code. See\n\"Synchronous code & Threads\" below for a full explanation. By default,\n``sync_to_async`` will run all synchronous code in the program in the same\nthread for safety reasons; you can disable this for more performance with\n``@sync_to_async(thread_sensitive=False)``, but make sure that your code does\nnot rely on anything bound to threads (like database connections) when you do.\n\n\nThreadlocal replacement\n-----------------------\n\nThis is a drop-in replacement for ``threading.local`` that works with both\nthreads and asyncio Tasks. Even better, it will proxy values through from a\ntask-local context to a thread-local context when you use ``sync_to_async``\nto run things in a threadpool, and vice-versa for ``async_to_sync``.\n\nIf you instead want true thread- and task-safety, you can set\n``thread_critical`` on the Local object to ensure this instead.\n\n\nServer base classes\n-------------------\n\nIncludes a ``StatelessServer`` class which provides all the hard work of\nwriting a stateless server (as in, does not handle direct incoming sockets\nbut instead consumes external streams or sockets to work out what is happening).\n\nAn example of such a server would be a chatbot server that connects out to\na central chat server and provides a \"connection scope\" per user chatting to\nit. There's only one actual connection, but the server has to separate things\ninto several scopes for easier writing of the code.\n\nYou can see an example of this being used in `frequensgi <https://github.com/andrewgodwin/frequensgi>`_.\n\n\nWSGI-to-ASGI adapter\n--------------------\n\nAllows you to wrap a WSGI application so it appears as a valid ASGI application.\n\nSimply wrap it around your WSGI application like so::\n\n asgi_application = WsgiToAsgi(wsgi_application)\n\nThe WSGI application will be run in a synchronous threadpool, and the wrapped\nASGI application will be one that accepts ``http`` class messages.\n\nPlease note that not all extended features of WSGI may be supported (such as\nfile handles for incoming POST bodies).\n\n\nDependencies\n------------\n\n``asgiref`` requires Python 3.7 or higher.\n\n\nContributing\n------------\n\nPlease refer to the\n`main Channels contributing docs <https://github.com/django/channels/blob/master/CONTRIBUTING.rst>`_.\n\n\nTesting\n'''''''\n\nTo run tests, make sure you have installed the ``tests`` extra with the package::\n\n cd asgiref/\n pip install -e .[tests]\n pytest\n\n\nBuilding the documentation\n''''''''''''''''''''''''''\n\nThe documentation uses `Sphinx <http://www.sphinx-doc.org>`_::\n\n cd asgiref/docs/\n pip install sphinx\n\nTo build the docs, you can use the default tools::\n\n sphinx-build -b html . _build/html # or `make html`, if you've got make set up\n cd _build/html\n python -m http.server\n\n...or you can use ``sphinx-autobuild`` to run a server and rebuild/reload\nyour documentation changes automatically::\n\n pip install sphinx-autobuild\n sphinx-autobuild . _build/html\n\n\nReleasing\n'''''''''\n\nTo release, first add details to CHANGELOG.txt and update the version number in ``asgiref/__init__.py``.\n\nThen, build and push the packages::\n\n python -m build\n twine upload dist/*\n rm -r build/ dist/\n\n\nImplementation Details\n----------------------\n\nSynchronous code & threads\n''''''''''''''''''''''''''\n\nThe ``asgiref.sync`` module provides two wrappers that let you go between\nasynchronous and synchronous code at will, while taking care of the rough edges\nfor you.\n\nUnfortunately, the rough edges are numerous, and the code has to work especially\nhard to keep things in the same thread as much as possible. Notably, the\nrestrictions we are working with are:\n\n* All synchronous code called through ``SyncToAsync`` and marked with\n ``thread_sensitive`` should run in the same thread as each other (and if the\n outer layer of the program is synchronous, the main thread)\n\n* If a thread already has a running async loop, ``AsyncToSync`` can't run things\n on that loop if it's blocked on synchronous code that is above you in the\n call stack.\n\nThe first compromise you get to might be that ``thread_sensitive`` code should\njust run in the same thread and not spawn in a sub-thread, fulfilling the first\nrestriction, but that immediately runs you into the second restriction.\n\nThe only real solution is to essentially have a variant of ThreadPoolExecutor\nthat executes any ``thread_sensitive`` code on the outermost synchronous\nthread - either the main thread, or a single spawned subthread.\n\nThis means you now have two basic states:\n\n* If the outermost layer of your program is synchronous, then all async code\n run through ``AsyncToSync`` will run in a per-call event loop in arbitrary\n sub-threads, while all ``thread_sensitive`` code will run in the main thread.\n\n* If the outermost layer of your program is asynchronous, then all async code\n runs on the main thread's event loop, and all ``thread_sensitive`` synchronous\n code will run in a single shared sub-thread.\n\nCrucially, this means that in both cases there is a thread which is a shared\nresource that all ``thread_sensitive`` code must run on, and there is a chance\nthat this thread is currently blocked on its own ``AsyncToSync`` call. Thus,\n``AsyncToSync`` needs to act as an executor for thread code while it's blocking.\n\nThe ``CurrentThreadExecutor`` class provides this functionality; rather than\nsimply waiting on a Future, you can call its ``run_until_future`` method and\nit will run submitted code until that Future is done. This means that code\ninside the call can then run code on your thread.\n\n\nMaintenance and Security\n------------------------\n\nTo report security issues, please contact security@djangoproject.com. For GPG\nsignatures and more security process information, see\nhttps://docs.djangoproject.com/en/dev/internals/security/.\n\nTo report bugs or request new features, please open a new GitHub issue.\n\nThis repository is part of the Channels project. For the shepherd and maintenance team, please see the\n`main Channels readme <https://github.com/django/channels/blob/master/README.rst>`_.\n",
- "home_page": "https://github.com/django/asgiref/",
- "author": "Django Software Foundation",
- "author_email": "foundation@djangoproject.com",
- "license": "BSD-3-Clause",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Topic :: Internet :: WWW/HTTP"
- ],
- "requires_dist": [
- "typing-extensions (>=4) ; python_version < \"3.11\"",
- "pytest ; extra == 'tests'",
- "pytest-asyncio ; extra == 'tests'",
- "mypy (>=0.800) ; extra == 'tests'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Documentation, https://asgi.readthedocs.io/",
- "Further Documentation, https://docs.djangoproject.com/en/stable/topics/async/#async-adapter-functions",
- "Changelog, https://github.com/django/asgiref/blob/master/CHANGELOG.txt"
- ],
- "provides_extra": [
- "tests"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/f0/eb/fcb708c7bf5056045e9e98f62b93bd7467eb718b0202e7698eb11d66416c/attrs-23.1.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04",
- "hashes": {
- "sha256": "1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "attrs",
- "version": "23.1.0",
- "summary": "Classes Without Boilerplate",
- "description": "<p align=\"center\">\n <a href=\"https://www.attrs.org/\">\n <img src=\"https://raw.githubusercontent.com/python-attrs/attrs/main/docs/_static/attrs_logo.svg\" width=\"35%\" alt=\"attrs\" />\n </a>\n</p>\n\n\n*attrs* is the Python package that will bring back the **joy** of **writing classes** by relieving you from the drudgery of implementing object protocols (aka [dunder methods](https://www.attrs.org/en/latest/glossary.html#term-dunder-methods)).\n[Trusted by NASA](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/personalizing-your-profile#list-of-qualifying-repositories-for-mars-2020-helicopter-contributor-achievement) for Mars missions since 2020!\n\nIts main goal is to help you to write **concise** and **correct** software without slowing down your code.\n\n\n## Sponsors\n\n*attrs* would not be possible without our [amazing sponsors](https://github.com/sponsors/hynek).\nEspecially those generously supporting us at the *The Organization* tier and higher:\n\n<p align=\"center\">\n <a href=\"https://www.variomedia.de/\">\n <img src=\"https://raw.githubusercontent.com/python-attrs/attrs/main/.github/sponsors/Variomedia.svg\" width=\"200\" height=\"60\"></img>\n </a>\n\n <a href=\"https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo\">\n <img src=\"https://raw.githubusercontent.com/python-attrs/attrs/main/.github/sponsors/Tidelift.svg\" width=\"200\" height=\"60\"></img>\n </a>\n\n <a href=\"https://sentry.io/\">\n <img src=\"https://raw.githubusercontent.com/python-attrs/attrs/main/.github/sponsors/Sentry.svg\" width=\"200\" height=\"60\"></img>\n </a>\n\n <a href=\"https://filepreviews.io/\">\n <img src=\"https://raw.githubusercontent.com/python-attrs/attrs/main/.github/sponsors/FilePreviews.svg\" width=\"200\" height=\"60\"></img>\n </a>\n</p>\n\n<p align=\"center\">\n <strong>Please consider <a href=\"https://github.com/sponsors/hynek\">joining them</a> to help make <em>attrs</em>’s maintenance more sustainable!</strong>\n</p>\n\n<!-- teaser-end -->\n\n## Example\n\n*attrs* gives you a class decorator and a way to declaratively define the attributes on that class:\n\n<!-- code-begin -->\n\n```pycon\n>>> from attrs import asdict, define, make_class, Factory\n\n>>> @define\n... class SomeClass:\n... a_number: int = 42\n... list_of_numbers: list[int] = Factory(list)\n...\n... def hard_math(self, another_number):\n... return self.a_number + sum(self.list_of_numbers) * another_number\n\n\n>>> sc = SomeClass(1, [1, 2, 3])\n>>> sc\nSomeClass(a_number=1, list_of_numbers=[1, 2, 3])\n\n>>> sc.hard_math(3)\n19\n>>> sc == SomeClass(1, [1, 2, 3])\nTrue\n>>> sc != SomeClass(2, [3, 2, 1])\nTrue\n\n>>> asdict(sc)\n{'a_number': 1, 'list_of_numbers': [1, 2, 3]}\n\n>>> SomeClass()\nSomeClass(a_number=42, list_of_numbers=[])\n\n>>> C = make_class(\"C\", [\"a\", \"b\"])\n>>> C(\"foo\", \"bar\")\nC(a='foo', b='bar')\n```\n\nAfter *declaring* your attributes, *attrs* gives you:\n\n- a concise and explicit overview of the class's attributes,\n- a nice human-readable `__repr__`,\n- equality-checking methods,\n- an initializer,\n- and much more,\n\n*without* writing dull boilerplate code again and again and *without* runtime performance penalties.\n\n**Hate type annotations**!?\nNo problem!\nTypes are entirely **optional** with *attrs*.\nSimply assign `attrs.field()` to the attributes instead of annotating them with types.\n\n---\n\nThis example uses *attrs*'s modern APIs that have been introduced in version 20.1.0, and the *attrs* package import name that has been added in version 21.3.0.\nThe classic APIs (`@attr.s`, `attr.ib`, plus their serious-business aliases) and the `attr` package import name will remain **indefinitely**.\n\nPlease check out [*On The Core API Names*](https://www.attrs.org/en/latest/names.html) for a more in-depth explanation.\n\n\n## Data Classes\n\nOn the tin, *attrs* might remind you of `dataclasses` (and indeed, `dataclasses` [are a descendant](https://hynek.me/articles/import-attrs/) of *attrs*).\nIn practice it does a lot more and is more flexible.\nFor instance it allows you to define [special handling of NumPy arrays for equality checks](https://www.attrs.org/en/stable/comparison.html#customization), or allows more ways to [plug into the initialization process](https://www.attrs.org/en/stable/init.html#hooking-yourself-into-initialization).\n\nFor more details, please refer to our [comparison page](https://www.attrs.org/en/stable/why.html#data-classes).\n\n\n## Project Information\n\n- [**Changelog**](https://www.attrs.org/en/stable/changelog.html)\n- [**Documentation**](https://www.attrs.org/)\n- [**PyPI**](https://pypi.org/project/attrs/)\n- [**Source Code**](https://github.com/python-attrs/attrs)\n- [**Contributing**](https://github.com/python-attrs/attrs/blob/main/.github/CONTRIBUTING.md)\n- [**Third-party Extensions**](https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs)\n- **License**: [MIT](https://www.attrs.org/en/latest/license.html)\n- **Get Help**: please use the `python-attrs` tag on [StackOverflow](https://stackoverflow.com/questions/tagged/python-attrs)\n- **Supported Python Versions**: 3.7 and later\n\n\n### *attrs* for Enterprise\n\nAvailable as part of the Tidelift Subscription.\n\nThe maintainers of *attrs* and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications.\nSave time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.\n[Learn more.](https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n\n## Release Information\n\n### Backwards-incompatible Changes\n\n- Python 3.6 has been dropped and packaging switched to static package data using [Hatch](https://hatch.pypa.io/latest/).\n [#993](https://github.com/python-attrs/attrs/issues/993)\n\n\n### Deprecations\n\n- The support for *zope-interface* via the `attrs.validators.provides` validator is now deprecated and will be removed in, or after, April 2024.\n\n The presence of a C-based package in our developement dependencies has caused headaches and we're not under the impression it's used a lot.\n\n Let us know if you're using it and we might publish it as a separate package.\n [#1120](https://github.com/python-attrs/attrs/issues/1120)\n\n\n### Changes\n\n- `attrs.filters.exclude()` and `attrs.filters.include()` now support the passing of attribute names as strings.\n [#1068](https://github.com/python-attrs/attrs/issues/1068)\n- `attrs.has()` and `attrs.fields()` now handle generic classes correctly.\n [#1079](https://github.com/python-attrs/attrs/issues/1079)\n- Fix frozen exception classes when raised within e.g. `contextlib.contextmanager`, which mutates their `__traceback__` attributes.\n [#1081](https://github.com/python-attrs/attrs/issues/1081)\n- `@frozen` now works with type checkers that implement [PEP-681](https://peps.python.org/pep-0681/) (ex. [pyright](https://github.com/microsoft/pyright/)).\n [#1084](https://github.com/python-attrs/attrs/issues/1084)\n- Restored ability to unpickle instances pickled before 22.2.0.\n [#1085](https://github.com/python-attrs/attrs/issues/1085)\n- `attrs.asdict()`'s and `attrs.astuple()`'s type stubs now accept the `attrs.AttrsInstance` protocol.\n [#1090](https://github.com/python-attrs/attrs/issues/1090)\n- Fix slots class cellvar updating closure in CPython 3.8+ even when `__code__` introspection is unavailable.\n [#1092](https://github.com/python-attrs/attrs/issues/1092)\n- `attrs.resolve_types()` can now pass `include_extras` to `typing.get_type_hints()` on Python 3.9+, and does so by default.\n [#1099](https://github.com/python-attrs/attrs/issues/1099)\n- Added instructions for pull request workflow to `CONTRIBUTING.md`.\n [#1105](https://github.com/python-attrs/attrs/issues/1105)\n- Added *type* parameter to `attrs.field()` function for use with `attrs.make_class()`.\n\n Please note that type checkers ignore type metadata passed into `make_class()`, but it can be useful if you're wrapping _attrs_.\n [#1107](https://github.com/python-attrs/attrs/issues/1107)\n- It is now possible for `attrs.evolve()` (and `attr.evolve()`) to change fields named `inst` if the instance is passed as a positional argument.\n\n Passing the instance using the `inst` keyword argument is now deprecated and will be removed in, or after, April 2024.\n [#1117](https://github.com/python-attrs/attrs/issues/1117)\n- `attrs.validators.optional()` now also accepts a tuple of validators (in addition to lists of validators).\n [#1122](https://github.com/python-attrs/attrs/issues/1122)\n\n\n\n---\n\n[Full changelog](https://www.attrs.org/en/stable/changelog.html)\n",
- "description_content_type": "text/markdown",
- "keywords": [
- "attribute",
- "boilerplate",
- "class"
- ],
- "author_email": "Hynek Schlawack <hs@ox.cx>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Typing :: Typed"
- ],
- "requires_dist": [
- "importlib-metadata; python_version < '3.8'",
- "attrs[tests]; extra == 'cov'",
- "coverage[toml]>=5.3; extra == 'cov'",
- "attrs[docs,tests]; extra == 'dev'",
- "pre-commit; extra == 'dev'",
- "furo; extra == 'docs'",
- "myst-parser; extra == 'docs'",
- "sphinx; extra == 'docs'",
- "sphinx-notfound-page; extra == 'docs'",
- "sphinxcontrib-towncrier; extra == 'docs'",
- "towncrier; extra == 'docs'",
- "zope-interface; extra == 'docs'",
- "attrs[tests-no-zope]; extra == 'tests'",
- "zope-interface; extra == 'tests'",
- "cloudpickle; platform_python_implementation == 'CPython' and extra == 'tests-no-zope'",
- "hypothesis; extra == 'tests-no-zope'",
- "mypy>=1.1.1; platform_python_implementation == 'CPython' and extra == 'tests-no-zope'",
- "pympler; extra == 'tests-no-zope'",
- "pytest-mypy-plugins; platform_python_implementation == 'CPython' and python_version < '3.11' and extra == 'tests-no-zope'",
- "pytest-xdist[psutil]; extra == 'tests-no-zope'",
- "pytest>=4.3.0; extra == 'tests-no-zope'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Documentation, https://www.attrs.org/",
- "Changelog, https://www.attrs.org/en/stable/changelog.html",
- "Bug Tracker, https://github.com/python-attrs/attrs/issues",
- "Source Code, https://github.com/python-attrs/attrs",
- "Funding, https://github.com/sponsors/hynek",
- "Tidelift, https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=pypi"
- ],
- "provides_extra": [
- "cov",
- "dev",
- "docs",
- "tests",
- "tests-no-zope"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/86/14/5dc2eb02b7cc87b2f95930310a2cc5229198414919a116b564832c747bc1/Babel-2.13.1-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed",
- "hashes": {
- "sha256": "7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "Babel",
- "version": "2.13.1",
- "summary": "Internationalization utilities",
- "description": "A collection of tools for internationalizing Python applications.\n",
- "home_page": "https://babel.pocoo.org/",
- "author": "Armin Ronacher",
- "author_email": "armin.ronacher@active-4.com",
- "maintainer": "Aarni Koskela",
- "maintainer_email": "akx@iki.fi",
- "license": "BSD-3-Clause",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ],
- "requires_dist": [
- "pytz >=2015.7 ; python_version < \"3.9\"",
- "setuptools ; python_version >= \"3.12\"",
- "pytest >=6.0 ; extra == 'dev'",
- "pytest-cov ; extra == 'dev'",
- "freezegun ~=1.0 ; extra == 'dev'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Source, https://github.com/python-babel/babel"
- ],
- "provides_extra": [
- "dev"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8",
- "hashes": {
- "sha256": "63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "backoff",
- "version": "2.2.1",
- "summary": "Function decoration for backoff and retry",
- "description": "backoff\n=======\n\n.. image:: https://travis-ci.org/litl/backoff.svg\n :target: https://travis-ci.org/litl/backoff\n.. image:: https://coveralls.io/repos/litl/backoff/badge.svg\n :target: https://coveralls.io/r/litl/backoff?branch=python-3\n.. image:: https://github.com/litl/backoff/workflows/CodeQL/badge.svg\n :target: https://github.com/litl/backoff/actions/workflows/codeql-analysis.yml\n.. image:: https://img.shields.io/pypi/v/backoff.svg\n :target: https://pypi.python.org/pypi/backoff\n.. image:: https://img.shields.io/github/license/litl/backoff\n :target: https://github.com/litl/backoff/blob/master/LICENSE\n\n**Function decoration for backoff and retry**\n\nThis module provides function decorators which can be used to wrap a\nfunction such that it will be retried until some condition is met. It\nis meant to be of use when accessing unreliable resources with the\npotential for intermittent failures i.e. network resources and external\nAPIs. Somewhat more generally, it may also be of use for dynamically\npolling resources for externally generated content.\n\nDecorators support both regular functions for synchronous code and\n`asyncio <https://docs.python.org/3/library/asyncio.html>`__'s coroutines\nfor asynchronous code.\n\nExamples\n========\n\nSince Kenneth Reitz's `requests <http://python-requests.org>`_ module\nhas become a defacto standard for synchronous HTTP clients in Python,\nnetworking examples below are written using it, but it is in no way required\nby the backoff module.\n\n@backoff.on_exception\n---------------------\n\nThe ``on_exception`` decorator is used to retry when a specified exception\nis raised. Here's an example using exponential backoff when any\n``requests`` exception is raised:\n\n.. code-block:: python\n\n @backoff.on_exception(backoff.expo,\n requests.exceptions.RequestException)\n def get_url(url):\n return requests.get(url)\n\nThe decorator will also accept a tuple of exceptions for cases where\nthe same backoff behavior is desired for more than one exception type:\n\n.. code-block:: python\n\n @backoff.on_exception(backoff.expo,\n (requests.exceptions.Timeout,\n requests.exceptions.ConnectionError))\n def get_url(url):\n return requests.get(url)\n\n**Give Up Conditions**\n\nOptional keyword arguments can specify conditions under which to give\nup.\n\nThe keyword argument ``max_time`` specifies the maximum amount\nof total time in seconds that can elapse before giving up.\n\n.. code-block:: python\n\n @backoff.on_exception(backoff.expo,\n requests.exceptions.RequestException,\n max_time=60)\n def get_url(url):\n return requests.get(url)\n\n\nKeyword argument ``max_tries`` specifies the maximum number of calls\nto make to the target function before giving up.\n\n.. code-block:: python\n\n @backoff.on_exception(backoff.expo,\n requests.exceptions.RequestException,\n max_tries=8,\n jitter=None)\n def get_url(url):\n return requests.get(url)\n\n\nIn some cases the raised exception instance itself may need to be\ninspected in order to determine if it is a retryable condition. The\n``giveup`` keyword arg can be used to specify a function which accepts\nthe exception and returns a truthy value if the exception should not\nbe retried:\n\n.. code-block:: python\n\n def fatal_code(e):\n return 400 <= e.response.status_code < 500\n\n @backoff.on_exception(backoff.expo,\n requests.exceptions.RequestException,\n max_time=300,\n giveup=fatal_code)\n def get_url(url):\n return requests.get(url)\n\nBy default, when a give up event occurs, the exception in question is reraised\nand so code calling an `on_exception`-decorated function may still\nneed to do exception handling. This behavior can optionally be disabled\nusing the `raise_on_giveup` keyword argument.\n\nIn the code below, `requests.exceptions.RequestException` will not be raised\nwhen giveup occurs. Note that the decorated function will return `None` in this\ncase, regardless of the logic in the `on_exception` handler.\n\n.. code-block:: python\n\n def fatal_code(e):\n return 400 <= e.response.status_code < 500\n\n @backoff.on_exception(backoff.expo,\n requests.exceptions.RequestException,\n max_time=300,\n raise_on_giveup=False,\n giveup=fatal_code)\n def get_url(url):\n return requests.get(url)\n\nThis is useful for non-mission critical code where you still wish to retry\nthe code inside of `backoff.on_exception` but wish to proceed with execution\neven if all retries fail.\n\n@backoff.on_predicate\n---------------------\n\nThe ``on_predicate`` decorator is used to retry when a particular\ncondition is true of the return value of the target function. This may\nbe useful when polling a resource for externally generated content.\n\nHere's an example which uses a fibonacci sequence backoff when the\nreturn value of the target function is the empty list:\n\n.. code-block:: python\n\n @backoff.on_predicate(backoff.fibo, lambda x: x == [], max_value=13)\n def poll_for_messages(queue):\n return queue.get()\n\nExtra keyword arguments are passed when initializing the\nwait generator, so the ``max_value`` param above is passed as a keyword\narg when initializing the fibo generator.\n\nWhen not specified, the predicate param defaults to the falsey test,\nso the above can more concisely be written:\n\n.. code-block:: python\n\n @backoff.on_predicate(backoff.fibo, max_value=13)\n def poll_for_message(queue):\n return queue.get()\n\nMore simply, a function which continues polling every second until it\ngets a non-falsey result could be defined like like this:\n\n.. code-block:: python\n\n @backoff.on_predicate(backoff.constant, jitter=None, interval=1)\n def poll_for_message(queue):\n return queue.get()\n\nThe jitter is disabled in order to keep the polling frequency fixed. \n\n@backoff.runtime\n----------------\n\nYou can also use the ``backoff.runtime`` generator to make use of the\nreturn value or thrown exception of the decorated method.\n\nFor example, to use the value in the ``Retry-After`` header of the response:\n\n.. code-block:: python\n\n @backoff.on_predicate(\n backoff.runtime,\n predicate=lambda r: r.status_code == 429,\n value=lambda r: int(r.headers.get(\"Retry-After\")),\n jitter=None,\n )\n def get_url():\n return requests.get(url)\n\nJitter\n------\n\nA jitter algorithm can be supplied with the ``jitter`` keyword arg to\neither of the backoff decorators. This argument should be a function\naccepting the original unadulterated backoff value and returning it's\njittered counterpart.\n\nAs of version 1.2, the default jitter function ``backoff.full_jitter``\nimplements the 'Full Jitter' algorithm as defined in the AWS\nArchitecture Blog's `Exponential Backoff And Jitter\n<https://www.awsarchitectureblog.com/2015/03/backoff.html>`_ post.\nNote that with this algorithm, the time yielded by the wait generator\nis actually the *maximum* amount of time to wait.\n\nPrevious versions of backoff defaulted to adding some random number of\nmilliseconds (up to 1s) to the raw sleep value. If desired, this\nbehavior is now available as ``backoff.random_jitter``.\n\nUsing multiple decorators\n-------------------------\n\nThe backoff decorators may also be combined to specify different\nbackoff behavior for different cases:\n\n.. code-block:: python\n\n @backoff.on_predicate(backoff.fibo, max_value=13)\n @backoff.on_exception(backoff.expo,\n requests.exceptions.HTTPError,\n max_time=60)\n @backoff.on_exception(backoff.expo,\n requests.exceptions.Timeout,\n max_time=300)\n def poll_for_message(queue):\n return queue.get()\n\n\nRuntime Configuration\n---------------------\n\nThe decorator functions ``on_exception`` and ``on_predicate`` are\ngenerally evaluated at import time. This is fine when the keyword args\nare passed as constant values, but suppose we want to consult a\ndictionary with configuration options that only become available at\nruntime. The relevant values are not available at import time. Instead,\ndecorator functions can be passed callables which are evaluated at\nruntime to obtain the value:\n\n.. code-block:: python\n\n def lookup_max_time():\n # pretend we have a global reference to 'app' here\n # and that it has a dictionary-like 'config' property\n return app.config[\"BACKOFF_MAX_TIME\"]\n\n @backoff.on_exception(backoff.expo,\n ValueError,\n max_time=lookup_max_time)\n\nEvent handlers\n--------------\n\nBoth backoff decorators optionally accept event handler functions\nusing the keyword arguments ``on_success``, ``on_backoff``, and ``on_giveup``.\nThis may be useful in reporting statistics or performing other custom\nlogging.\n\nHandlers must be callables with a unary signature accepting a dict\nargument. This dict contains the details of the invocation. Valid keys\ninclude:\n\n* *target*: reference to the function or method being invoked\n* *args*: positional arguments to func\n* *kwargs*: keyword arguments to func\n* *tries*: number of invocation tries so far\n* *elapsed*: elapsed time in seconds so far\n* *wait*: seconds to wait (``on_backoff`` handler only)\n* *value*: value triggering backoff (``on_predicate`` decorator only)\n\nA handler which prints the details of the backoff event could be\nimplemented like so:\n\n.. code-block:: python\n\n def backoff_hdlr(details):\n print (\"Backing off {wait:0.1f} seconds after {tries} tries \"\n \"calling function {target} with args {args} and kwargs \"\n \"{kwargs}\".format(**details))\n\n @backoff.on_exception(backoff.expo,\n requests.exceptions.RequestException,\n on_backoff=backoff_hdlr)\n def get_url(url):\n return requests.get(url)\n\n**Multiple handlers per event type**\n\nIn all cases, iterables of handler functions are also accepted, which\nare called in turn. For example, you might provide a simple list of\nhandler functions as the value of the ``on_backoff`` keyword arg:\n\n.. code-block:: python\n\n @backoff.on_exception(backoff.expo,\n requests.exceptions.RequestException,\n on_backoff=[backoff_hdlr1, backoff_hdlr2])\n def get_url(url):\n return requests.get(url)\n\n**Getting exception info**\n\nIn the case of the ``on_exception`` decorator, all ``on_backoff`` and\n``on_giveup`` handlers are called from within the except block for the\nexception being handled. Therefore exception info is available to the\nhandler functions via the python standard library, specifically\n``sys.exc_info()`` or the ``traceback`` module. The exception is also\navailable at the *exception* key in the `details` dict passed to the\nhandlers.\n\nAsynchronous code\n-----------------\n\nBackoff supports asynchronous execution in Python 3.5 and above.\n\nTo use backoff in asynchronous code based on\n`asyncio <https://docs.python.org/3/library/asyncio.html>`__\nyou simply need to apply ``backoff.on_exception`` or ``backoff.on_predicate``\nto coroutines.\nYou can also use coroutines for the ``on_success``, ``on_backoff``, and\n``on_giveup`` event handlers, with the interface otherwise being identical.\n\nThe following examples use `aiohttp <https://aiohttp.readthedocs.io/>`__\nasynchronous HTTP client/server library.\n\n.. code-block:: python\n\n @backoff.on_exception(backoff.expo, aiohttp.ClientError, max_time=60)\n async def get_url(url):\n async with aiohttp.ClientSession(raise_for_status=True) as session:\n async with session.get(url) as response:\n return await response.text()\n\nLogging configuration\n---------------------\n\nBy default, backoff and retry attempts are logged to the 'backoff'\nlogger. By default, this logger is configured with a NullHandler, so\nthere will be nothing output unless you configure a handler.\nProgrammatically, this might be accomplished with something as simple\nas:\n\n.. code-block:: python\n\n logging.getLogger('backoff').addHandler(logging.StreamHandler())\n\nThe default logging level is INFO, which corresponds to logging\nanytime a retry event occurs. If you would instead like to log\nonly when a giveup event occurs, set the logger level to ERROR.\n\n.. code-block:: python\n\n logging.getLogger('backoff').setLevel(logging.ERROR)\n\nIt is also possible to specify an alternate logger with the ``logger``\nkeyword argument. If a string value is specified the logger will be\nlooked up by name.\n\n.. code-block:: python\n\n @backoff.on_exception(backoff.expo,\n requests.exceptions.RequestException,\n\t\t\t logger='my_logger')\n # ...\n\nIt is also supported to specify a Logger (or LoggerAdapter) object\ndirectly.\n\n.. code-block:: python\n\n my_logger = logging.getLogger('my_logger')\n my_handler = logging.StreamHandler()\n my_logger.addHandler(my_handler)\n my_logger.setLevel(logging.ERROR)\n\n @backoff.on_exception(backoff.expo,\n requests.exceptions.RequestException,\n\t\t\t logger=my_logger)\n # ...\n\nDefault logging can be disabled all together by specifying\n``logger=None``. In this case, if desired alternative logging behavior\ncould be defined by using custom event handlers.\n\n",
- "description_content_type": "text/x-rst",
- "keywords": [
- "retry",
- "backoff",
- "decorators"
- ],
- "home_page": "https://github.com/litl/backoff",
- "author": "Bob Green",
- "author_email": "rgreen@aquent.com",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Natural Language :: English",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Topic :: Internet :: WWW/HTTP",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "Topic :: Utilities"
- ],
- "requires_python": ">=3.7,<4.0",
- "project_url": [
- "Repository, https://github.com/litl/backoff"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/bf/2b/11bcedb7dee4923253a4a21bae3be854bcc4f06295bd827756352016d97c/blinker-1.6.3-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=296320d6c28b006eb5e32d4712202dbcdcbf5dc482da298c2f44881c43884aaa",
- "hashes": {
- "sha256": "296320d6c28b006eb5e32d4712202dbcdcbf5dc482da298c2f44881c43884aaa"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "blinker",
- "version": "1.6.3",
- "summary": "Fast, simple object-to-object and broadcast signaling",
- "description": "Blinker\n=======\n\nBlinker provides a fast dispatching system that allows any number of\ninterested parties to subscribe to events, or \"signals\".\n\nSignal receivers can subscribe to specific senders or receive signals\nsent by any sender.\n\n.. code-block:: pycon\n\n >>> from blinker import signal\n >>> started = signal('round-started')\n >>> def each(round):\n ... print(f\"Round {round}\")\n ...\n >>> started.connect(each)\n\n >>> def round_two(round):\n ... print(\"This is round two.\")\n ...\n >>> started.connect(round_two, sender=2)\n\n >>> for round in range(1, 4):\n ... started.send(round)\n ...\n Round 1!\n Round 2!\n This is round two.\n Round 3!\n\n\nLinks\n-----\n\n- Documentation: https://blinker.readthedocs.io/\n- Changes: https://blinker.readthedocs.io/#changes\n- PyPI Releases: https://pypi.org/project/blinker/\n- Source Code: https://github.com/pallets-eco/blinker/\n- Issue Tracker: https://github.com/pallets-eco/blinker/issues/\n\n",
- "description_content_type": "text/x-rst",
- "keywords": [
- "signal",
- "emit",
- "events",
- "broadcast"
- ],
- "author_email": "Jason Kirtland <jek@discorporate.us>",
- "maintainer_email": "Pallets Ecosystem <contact@palletsprojects.com>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Topic :: Software Development :: Libraries"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Chat, https://discord.gg/pallets",
- "Documentation, https://blinker.readthedocs.io",
- "Homepage, https://blinker.readthedocs.io",
- "Issue Tracker, https://github.com/pallets-eco/blinker/issues/",
- "Source Code, https://github.com/pallets-eco/blinker/"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/93/70/58e525451478055b0fd2859b22226888a6985d404fe65e014fc4893d3b75/cachelib-0.9.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=811ceeb1209d2fe51cd2b62810bd1eccf70feba5c52641532498be5c675493b3",
- "hashes": {
- "sha256": "811ceeb1209d2fe51cd2b62810bd1eccf70feba5c52641532498be5c675493b3"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "cachelib",
- "version": "0.9.0",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "A collection of cache libraries in the same API interface.",
- "description": "CacheLib\n========\n\nA collection of cache libraries in the same API interface. Extracted\nfrom Werkzeug.\n\n\nInstalling\n----------\n\nInstall and update using `pip`_:\n\n.. code-block:: text\n\n $ pip install -U cachelib\n\n.. _pip: https://pip.pypa.io/en/stable/getting-started/\n\n\nDonate\n------\n\nThe Pallets organization develops and supports Flask and the libraries\nit uses. In order to grow the community of contributors and users, and\nallow the maintainers to devote more time to the projects, `please\ndonate today`_.\n\n.. _please donate today: https://palletsprojects.com/donate\n\n\nLinks\n-----\n\n- Documentation: https://cachelib.readthedocs.io/\n- Changes: https://cachelib.readthedocs.io/changes/\n- PyPI Releases: https://pypi.org/project/cachelib/\n- Source Code: https://github.com/pallets/cachelib/\n- Issue Tracker: https://github.com/pallets/cachelib/issues/\n- Twitter: https://twitter.com/PalletsTeam\n- Chat: https://discord.gg/pallets\n\n\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://github.com/pallets/cachelib/",
- "maintainer": "Pallets",
- "maintainer_email": "contact@palletsprojects.com",
- "license": "BSD-3-Clause",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Donate, https://palletsprojects.com/donate",
- "Documentation, https://cachelib.readthedocs.io/",
- "Changes, https://cachelib.readthedocs.io/changes/",
- "Source Code, https://github.com/pallets/cachelib/",
- "Issue Tracker, https://github.com/pallets/cachelib/issues/",
- "Twitter, https://twitter.com/PalletsTeam",
- "Chat, https://discord.gg/pallets"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/3a/ba/05df14efaa0624fac6b1510e87f5ce446208d2f6ce50270a89b6268aebfe/cattrs-23.1.2-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4",
- "hashes": {
- "sha256": "b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "cattrs",
- "version": "23.1.2",
- "summary": "Composable complex class support for attrs and dataclasses.",
- "description": "# cattrs\n\n<a href=\"https://pypi.python.org/pypi/cattrs\"><img src=\"https://img.shields.io/pypi/v/cattrs.svg\"/></a>\n<a href=\"https://github.com/python-attrs/cattrs/actions?workflow=CI\"><img src=\"https://github.com/python-attrs/cattrs/workflows/CI/badge.svg\"/></a>\n<a href=\"https://catt.rs/en/latest/?badge=latest\"><img src=\"https://readthedocs.org/projects/cattrs/badge/?version=latest\" alt=\"Documentation Status\"/></a>\n<a href=\"https://github.com/python-attrs/cattrs\"><img src=\"https://img.shields.io/pypi/pyversions/cattrs.svg\" alt=\"Supported Python versions\"/></a>\n<a href=\"https://codecov.io/gh/python-attrs/cattrs/\"><img src=\"https://codecov.io/gh/python-attrs/cattrs/branch/master/graph/badge.svg\"/></a>\n<a href=\"https://github.com/psf/black\"><img src=\"https://img.shields.io/badge/code%20style-black-000000.svg\"/></a>\n\n---\n\n**cattrs** is an open source Python library for structuring and unstructuring\ndata. _cattrs_ works best with _attrs_ classes, dataclasses and the usual\nPython collections, but other kinds of classes are supported by manually\nregistering converters.\n\nPython has a rich set of powerful, easy to use, built-in data types like\ndictionaries, lists and tuples. These data types are also the lingua franca\nof most data serialization libraries, for formats like json, msgpack, cbor,\nyaml or toml.\n\nData types like this, and mappings like `dict` s in particular, represent\nunstructured data. Your data is, in all likelihood, structured: not all\ncombinations of field names or values are valid inputs to your programs. In\nPython, structured data is better represented with classes and enumerations.\n_attrs_ is an excellent library for declaratively describing the structure of\nyour data, and validating it.\n\nWhen you're handed unstructured data (by your network, file system, database...),\n_cattrs_ helps to convert this data into structured data. When you have to\nconvert your structured data into data types other libraries can handle,\n_cattrs_ turns your classes and enumerations into dictionaries, integers and\nstrings.\n\nHere's a simple taste. The list containing a float, an int and a string\ngets converted into a tuple of three ints.\n\n```python\n>>> import cattrs\n\n>>> cattrs.structure([1.0, 2, \"3\"], tuple[int, int, int])\n(1, 2, 3)\n```\n\n_cattrs_ works well with _attrs_ classes out of the box.\n\n```python\n>>> from attrs import frozen\n>>> import cattrs\n\n>>> @frozen # It works with non-frozen classes too.\n... class C:\n... a: int\n... b: str\n\n>>> instance = C(1, 'a')\n>>> cattrs.unstructure(instance)\n{'a': 1, 'b': 'a'}\n>>> cattrs.structure({'a': 1, 'b': 'a'}, C)\nC(a=1, b='a')\n```\n\nHere's a much more complex example, involving `attrs` classes with type\nmetadata.\n\n```python\n>>> from enum import unique, Enum\n>>> from typing import Optional, Sequence, Union\n>>> from cattrs import structure, unstructure\n>>> from attrs import define, field\n\n>>> @unique\n... class CatBreed(Enum):\n... SIAMESE = \"siamese\"\n... MAINE_COON = \"maine_coon\"\n... SACRED_BIRMAN = \"birman\"\n\n>>> @define\n... class Cat:\n... breed: CatBreed\n... names: Sequence[str]\n\n>>> @define\n... class DogMicrochip:\n... chip_id = field() # Type annotations are optional, but recommended\n... time_chipped: float = field()\n\n>>> @define\n... class Dog:\n... cuteness: int\n... chip: Optional[DogMicrochip] = None\n\n>>> p = unstructure([Dog(cuteness=1, chip=DogMicrochip(chip_id=1, time_chipped=10.0)),\n... Cat(breed=CatBreed.MAINE_COON, names=('Fluffly', 'Fluffer'))])\n\n>>> print(p)\n[{'cuteness': 1, 'chip': {'chip_id': 1, 'time_chipped': 10.0}}, {'breed': 'maine_coon', 'names': ('Fluffly', 'Fluffer')}]\n>>> print(structure(p, list[Union[Dog, Cat]]))\n[Dog(cuteness=1, chip=DogMicrochip(chip_id=1, time_chipped=10.0)), Cat(breed=<CatBreed.MAINE_COON: 'maine_coon'>, names=['Fluffly', 'Fluffer'])]\n```\n\nConsider unstructured data a low-level representation that needs to be converted\nto structured data to be handled, and use `structure`. When you're done,\n`unstructure` the data to its unstructured form and pass it along to another\nlibrary or module. Use [attrs type metadata](http://attrs.readthedocs.io/en/stable/examples.html#types)\nto add type metadata to attributes, so _cattrs_ will know how to structure and\ndestructure them.\n\n- Free software: MIT license\n- Documentation: https://catt.rs\n- Python versions supported: 3.7 and up. (Older Python versions, like 2.7, 3.5 and 3.6 are supported by older versions; see the changelog.)\n\n## Features\n\n- Converts structured data into unstructured data, recursively:\n\n - _attrs_ classes and dataclasses are converted into dictionaries in a way similar to `attrs.asdict`, or into tuples in a way similar to `attrs.astuple`.\n - Enumeration instances are converted to their values.\n - Other types are let through without conversion. This includes types such as\n integers, dictionaries, lists and instances of non-_attrs_ classes.\n - Custom converters for any type can be registered using `register_unstructure_hook`.\n\n- Converts unstructured data into structured data, recursively, according to\n your specification given as a type. The following types are supported:\n\n - `typing.Optional[T]`.\n - `typing.List[T]`, `typing.MutableSequence[T]`, `typing.Sequence[T]` (converts to a list).\n - `typing.Tuple` (both variants, `Tuple[T, ...]` and `Tuple[X, Y, Z]`).\n - `typing.MutableSet[T]`, `typing.Set[T]` (converts to a set).\n - `typing.FrozenSet[T]` (converts to a frozenset).\n - `typing.Dict[K, V]`, `typing.MutableMapping[K, V]`, `typing.Mapping[K, V]` (converts to a dict).\n - _attrs_ classes with simple attributes and the usual `__init__`.\n\n - Simple attributes are attributes that can be assigned unstructured data,\n like numbers, strings, and collections of unstructured data.\n\n - All _attrs_ classes and dataclasses with the usual `__init__`, if their complex attributes have type metadata.\n - `typing.Union` s of supported _attrs_ classes, given that all of the classes have a unique field.\n - `typing.Union` s of anything, given that you provide a disambiguation function for it.\n - Custom converters for any type can be registered using `register_structure_hook`.\n\n_cattrs_ comes with preconfigured converters for a number of serialization libraries, including json, msgpack, cbor2, bson, yaml and toml.\nFor details, see the [cattr.preconf package](https://catt.rs/en/stable/preconf.html).\n\n## Additional documentation and talks\n\n- [On structured and unstructured data, or the case for cattrs](https://threeofwands.com/on-structured-and-unstructured-data-or-the-case-for-cattrs/)\n- [Why I use attrs instead of pydantic](https://threeofwands.com/why-i-use-attrs-instead-of-pydantic/)\n- [cattrs I: un/structuring speed](https://threeofwands.com/why-cattrs-is-so-fast/)\n- [Python has a macro language - it's Python (PyCon IT 2022)](https://www.youtube.com/watch?v=UYRSixikUTo)\n\n## Credits\n\nMajor credits to Hynek Schlawack for creating [attrs](https://attrs.org) and its predecessor,\n[characteristic](https://github.com/hynek/characteristic).\n\n_cattrs_ is tested with [Hypothesis](http://hypothesis.readthedocs.io/en/latest/), by David R. MacIver.\n\n_cattrs_ is benchmarked using [perf](https://github.com/haypo/perf) and [pytest-benchmark](https://pytest-benchmark.readthedocs.io/en/latest/index.html).\n\nThis package was created with [Cookiecutter](https://github.com/audreyr/cookiecutter) and the [`audreyr/cookiecutter-pypackage`](https://github.com/audreyr/cookiecutter-pypackage) project template.\n\n",
- "description_content_type": "text/markdown",
- "keywords": [
- "attrs",
- "serialization",
- "dataclasses"
- ],
- "home_page": "https://github.com/python-attrs/cattrs",
- "author": "Tin Tvrtkovic",
- "author_email": "tinchester@gmail.com",
- "license": "MIT",
- "classifier": [
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11"
- ],
- "requires_dist": [
- "PyYAML (>=6.0,<7.0) ; extra == \"pyyaml\"",
- "attrs (>=20)",
- "cbor2 (>=5.4.6,<6.0.0) ; extra == \"cbor2\"",
- "exceptiongroup ; python_version < \"3.11\"",
- "msgpack (>=1.0.2,<2.0.0) ; extra == \"msgpack\"",
- "orjson (>=3.5.2,<4.0.0) ; (implementation_name == \"cpython\") and (extra == \"orjson\")",
- "pymongo (>=4.2.0,<5.0.0) ; extra == \"bson\"",
- "tomlkit (>=0.11.4,<0.12.0) ; (python_version < \"4\") and (extra == \"tomlkit\")",
- "typing_extensions (>=4.1.0) ; python_version < \"3.11\"",
- "ujson (>=5.4.0,<6.0.0) ; extra == \"ujson\""
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Bug Tracker, https://github.com/python-attrs/cattrs/issues",
- "Changelog, https://catt.rs/en/latest/history.html",
- "Documentation, https://catt.rs/en/stable/",
- "Repository, https://github.com/python-attrs/cattrs"
- ],
- "provides_extra": [
- "bson",
- "cbor2",
- "msgpack",
- "orjson",
- "pyyaml",
- "tomlkit",
- "ujson"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/71/4c/3db2b8021bd6f2f0ceb0e088d6b2d49147671f25832fb17970e9b583d742/certifi-2022.12.7-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18",
- "hashes": {
- "sha256": "4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "certifi",
- "version": "2022.12.7",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "Python package for providing Mozilla's CA Bundle.",
- "description": "Certifi: Python SSL Certificates\n================================\n\nCertifi provides Mozilla's carefully curated collection of Root Certificates for\nvalidating the trustworthiness of SSL certificates while verifying the identity\nof TLS hosts. It has been extracted from the `Requests`_ project.\n\nInstallation\n------------\n\n``certifi`` is available on PyPI. Simply install it with ``pip``::\n\n $ pip install certifi\n\nUsage\n-----\n\nTo reference the installed certificate authority (CA) bundle, you can use the\nbuilt-in function::\n\n >>> import certifi\n\n >>> certifi.where()\n '/usr/local/lib/python3.7/site-packages/certifi/cacert.pem'\n\nOr from the command line::\n\n $ python -m certifi\n /usr/local/lib/python3.7/site-packages/certifi/cacert.pem\n\nEnjoy!\n\n1024-bit Root Certificates\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nBrowsers and certificate authorities have concluded that 1024-bit keys are\nunacceptably weak for certificates, particularly root certificates. For this\nreason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its\nbundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key)\ncertificate from the same CA. Because Mozilla removed these certificates from\nits bundle, ``certifi`` removed them as well.\n\nIn previous versions, ``certifi`` provided the ``certifi.old_where()`` function\nto intentionally re-add the 1024-bit roots back into your bundle. This was not\nrecommended in production and therefore was removed at the end of 2018.\n\n.. _`Requests`: https://requests.readthedocs.io/en/master/\n\nAddition/Removal of Certificates\n--------------------------------\n\nCertifi does not support any addition/removal or other modification of the\nCA trust store content. This project is intended to provide a reliable and\nhighly portable root of trust to python deployments. Look to upstream projects\nfor methods to use alternate trust.\n\n\n",
- "home_page": "https://github.com/certifi/python-certifi",
- "author": "Kenneth Reitz",
- "author_email": "me@kennethreitz.com",
- "license": "MPL-2.0",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)",
- "Natural Language :: English",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11"
- ],
- "requires_python": ">=3.6",
- "project_url": [
- "Source, https://github.com/certifi/python-certifi"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/9b/89/a31c81e36bbb793581d8bba4406a8aac4ba84b2559301c44eef81f4cf5df/cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "archive_info": {
- "hash": "sha256=7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e",
- "hashes": {
- "sha256": "7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "cffi",
- "version": "1.16.0",
- "summary": "Foreign Function Interface for Python calling C code.",
- "description": "\nCFFI\n====\n\nForeign Function Interface for Python calling C code.\nPlease see the `Documentation <http://cffi.readthedocs.org/>`_.\n\nContact\n-------\n\n`Mailing list <https://groups.google.com/forum/#!forum/python-cffi>`_\n",
- "home_page": "http://cffi.readthedocs.org",
- "author": "Armin Rigo, Maciej Fijalkowski",
- "author_email": "python-cffi@googlegroups.com",
- "license": "MIT",
- "classifier": [
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "License :: OSI Approved :: MIT License"
- ],
- "requires_dist": [
- "pycparser"
- ],
- "requires_python": ">=3.8",
- "project_url": [
- "Documentation, http://cffi.readthedocs.org/",
- "Source Code, https://github.com/python-cffi/cffi",
- "Issue Tracker, https://github.com/python-cffi/cffi/issues",
- "Changelog, https://cffi.readthedocs.io/en/latest/whatsnew.html",
- "Downloads, https://github.com/python-cffi/cffi/releases",
- "Contact, https://groups.google.com/forum/#!forum/python-cffi"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/19/c7/fa589626997dd07bd87d9269342ccb74b1720384a4d739a1872bd84fbe68/chardet-4.0.0-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5",
- "hashes": {
- "sha256": "f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "chardet",
- "version": "4.0.0",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "Universal encoding detector for Python 2 and 3",
- "description": "Chardet: The Universal Character Encoding Detector\n--------------------------------------------------\n\n.. image:: https://img.shields.io/travis/chardet/chardet/stable.svg\n :alt: Build status\n :target: https://travis-ci.org/chardet/chardet\n\n.. image:: https://img.shields.io/coveralls/chardet/chardet/stable.svg\n :target: https://coveralls.io/r/chardet/chardet\n\n.. image:: https://img.shields.io/pypi/v/chardet.svg\n :target: https://warehouse.python.org/project/chardet/\n :alt: Latest version on PyPI\n\n.. image:: https://img.shields.io/pypi/l/chardet.svg\n :alt: License\n\n\nDetects\n - ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants)\n - Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese)\n - EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese)\n - EUC-KR, ISO-2022-KR (Korean)\n - KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic)\n - ISO-8859-5, windows-1251 (Bulgarian)\n - ISO-8859-1, windows-1252 (Western European languages)\n - ISO-8859-7, windows-1253 (Greek)\n - ISO-8859-8, windows-1255 (Visual and Logical Hebrew)\n - TIS-620 (Thai)\n\n.. note::\n Our ISO-8859-2 and windows-1250 (Hungarian) probers have been temporarily\n disabled until we can retrain the models.\n\nRequires Python 2.7 or 3.5+.\n\nInstallation\n------------\n\nInstall from `PyPI <https://pypi.org/project/chardet/>`_::\n\n pip install chardet\n\nDocumentation\n-------------\n\nFor users, docs are now available at https://chardet.readthedocs.io/.\n\nCommand-line Tool\n-----------------\n\nchardet comes with a command-line script which reports on the encodings of one\nor more files::\n\n % chardetect somefile someotherfile\n somefile: windows-1252 with confidence 0.5\n someotherfile: ascii with confidence 1.0\n\nAbout\n-----\n\nThis is a continuation of Mark Pilgrim's excellent chardet. Previously, two\nversions needed to be maintained: one that supported python 2.x and one that\nsupported python 3.x. We've recently merged with `Ian Cordasco <https://github.com/sigmavirus24>`_'s\n`charade <https://github.com/sigmavirus24/charade>`_ fork, so now we have one\ncoherent version that works for Python 2.7+ and 3.4+.\n\n:maintainer: Dan Blanchard\n\n\n",
- "keywords": [
- "encoding",
- "i18n",
- "xml"
- ],
- "home_page": "https://github.com/chardet/chardet",
- "author": "Mark Pilgrim",
- "author_email": "mark@diveintomark.org",
- "maintainer": "Daniel Blanchard",
- "maintainer_email": "dan.blanchard@gmail.com",
- "license": "LGPL",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "Topic :: Text Processing :: Linguistic"
- ],
- "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28",
- "hashes": {
- "sha256": "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "click",
- "version": "8.1.7",
- "summary": "Composable command line interface toolkit",
- "description": "\\$ click\\_\n==========\n\nClick is a Python package for creating beautiful command line interfaces\nin a composable way with as little code as necessary. It's the \"Command\nLine Interface Creation Kit\". It's highly configurable but comes with\nsensible defaults out of the box.\n\nIt aims to make the process of writing command line tools quick and fun\nwhile also preventing any frustration caused by the inability to\nimplement an intended CLI API.\n\nClick in three points:\n\n- Arbitrary nesting of commands\n- Automatic help page generation\n- Supports lazy loading of subcommands at runtime\n\n\nInstalling\n----------\n\nInstall and update using `pip`_:\n\n.. code-block:: text\n\n $ pip install -U click\n\n.. _pip: https://pip.pypa.io/en/stable/getting-started/\n\n\nA Simple Example\n----------------\n\n.. code-block:: python\n\n import click\n\n @click.command()\n @click.option(\"--count\", default=1, help=\"Number of greetings.\")\n @click.option(\"--name\", prompt=\"Your name\", help=\"The person to greet.\")\n def hello(count, name):\n \"\"\"Simple program that greets NAME for a total of COUNT times.\"\"\"\n for _ in range(count):\n click.echo(f\"Hello, {name}!\")\n\n if __name__ == '__main__':\n hello()\n\n.. code-block:: text\n\n $ python hello.py --count=3\n Your name: Click\n Hello, Click!\n Hello, Click!\n Hello, Click!\n\n\nDonate\n------\n\nThe Pallets organization develops and supports Click and other popular\npackages. In order to grow the community of contributors and users, and\nallow the maintainers to devote more time to the projects, `please\ndonate today`_.\n\n.. _please donate today: https://palletsprojects.com/donate\n\n\nLinks\n-----\n\n- Documentation: https://click.palletsprojects.com/\n- Changes: https://click.palletsprojects.com/changes/\n- PyPI Releases: https://pypi.org/project/click/\n- Source Code: https://github.com/pallets/click\n- Issue Tracker: https://github.com/pallets/click/issues\n- Chat: https://discord.gg/pallets\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://palletsprojects.com/p/click/",
- "maintainer": "Pallets",
- "maintainer_email": "contact@palletsprojects.com",
- "license": "BSD-3-Clause",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python"
- ],
- "requires_dist": [
- "colorama ; platform_system == \"Windows\"",
- "importlib-metadata ; python_version < \"3.8\""
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Donate, https://palletsprojects.com/donate",
- "Documentation, https://click.palletsprojects.com/",
- "Changes, https://click.palletsprojects.com/changes/",
- "Source Code, https://github.com/pallets/click/",
- "Issue Tracker, https://github.com/pallets/click/issues/",
- "Chat, https://discord.gg/pallets"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/7a/7e/c08007d3fb2bbefb430437a3573373590abedc03566b785d7d6763b22480/clickclick-20.10.2-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=c8f33e6d9ec83f68416dd2136a7950125bd256ec39ccc9a85c6e280a16be2bb5",
- "hashes": {
- "sha256": "c8f33e6d9ec83f68416dd2136a7950125bd256ec39ccc9a85c6e280a16be2bb5"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "clickclick",
- "version": "20.10.2",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "Click utility functions",
- "description": "===========\nClick Click\n===========\n\n.. image:: https://travis-ci.org/hjacobs/python-clickclick.svg?branch=master\n :target: https://travis-ci.org/hjacobs/python-clickclick\n :alt: Travis CI build status\n\n.. image:: https://coveralls.io/repos/hjacobs/python-clickclick/badge.svg\n :target: https://coveralls.io/r/hjacobs/python-clickclick\n\n.. image:: https://img.shields.io/pypi/dw/clickclick.svg\n :target: https://pypi.python.org/pypi/clickclick/\n :alt: PyPI Downloads\n\n.. image:: https://img.shields.io/pypi/v/clickclick.svg\n :target: https://pypi.python.org/pypi/clickclick/\n :alt: Latest PyPI version\n\n.. image:: https://img.shields.io/pypi/l/clickclick.svg\n :target: https://pypi.python.org/pypi/clickclick/\n :alt: License\n\nUtility functions (Python 3 only) for the wonderful `Click library`_.\nClick is a Python package for creating beautiful command line interfaces in a composable way with as little code as necessary.\n\n\nUsage\n=====\n\n.. code-block:: python\n\n from clickclick import Action, OutputFormat\n\n with Action('Performing remote call..') as act:\n do_something()\n act.progress()\n do_something_else()\n\n output_format = 'json' # default: \"text\"\n with OutputFormat(output_format):\n print_table(['col1', 'col2'], rows)\n\n\n.. _Click library: http://click.pocoo.org/\n\nWorking Example\n---------------\n\nSee this `example script`_ and the `shell script`_.\n\n.. _example script: example.py\n\n.. _shell script: example.sh\n\n.. code-block:: python3\n\n $ ./example.py\n Usage: example.py [OPTIONS] COMMAND [ARGS]...\n\n Options:\n -V, --version Print the current version number and exit.\n -h, --help Show this message and exit.\n\n Commands:\n list Example for Listings\n localtime Print the localtime\n output Example for all possible Echo Formats You see...\n work-in-progress Work untile working is done\n work_done Work done in ?? %\n\n::\n\n $ ./example.py l\n Usage: example.py [OPTIONS] COMMAND [ARGS]...\n\n Error: Too many matches: list, localtime\n\n::\n\n $ ./example.py lo\n Localtime: 2015-08-27 15:47:46.688547\n\n::\n\n $ ./example.py li\n Identifier|Name |Status |Creation Date|Description |Without Title\n 0 Column #0 ERROR -4228033s ago this is a verrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr.. column without title\n 1 Column #1 FINE -4228033s ago this is a verrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr.. column without title\n 2 Column #2 WARNING -4228033s ago this is a verrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr.. column without title\n\n::\n\n $ ./example.py li -o tsv\n id name state creation_time desc without_title\n 0 Column #0 ERROR -4228033s ago this is a verrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrry long description column without title\n 1 Column #1 FINE -4228033s ago this is a verrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrry long description column without title\n 2 Column #2 WARNING -4228033s ago this is a verrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrry long description column without title\n\n::\n\n $ ./example.py li -o json\n [{\"creation_time\": 1444911300, \"desc\": \"this is a verrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrry long description\", \"id\": 0, \"name\": \"Column #0\", \"state\": \"ERROR\", \"without_title\": \"column without title\"}, {\"creation_time\": 1444911300, \"desc\": \"this is a verrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrry long description\", \"id\": 1, \"name\": \"Column #1\", \"state\": \"FINE\", \"without_title\": \"column without title\"}, {\"creation_time\": 1444911300, \"desc\": \"this is a verrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrry long description\", \"id\": 2, \"name\": \"Column #2\", \"state\": \"WARNING\", \"without_title\": \"column without title\"}]\n\n::\n\n $ ./example.py li -o yaml\n creation_time: 1444911300\n desc: this is a verrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrry long description\n id: 0\n name: 'Column #0'\n state: ERROR\n without_title: column without title\n ---\n creation_time: 1444911300\n desc: this is a verrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrry long description\n id: 1\n name: 'Column #1'\n state: FINE\n without_title: column without title\n ---\n creation_time: 1444911300\n desc: this is a verrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrry long description\n id: 2\n name: 'Column #2'\n state: WARNING\n without_title: column without title\n\n\n::\n\n $ ./example.py work-\n do anything.. OK\n create an excption.. EXCEPTION OCCURRED: No active exception to reraise\n Start with working.. . . . . OK\n Calc 1 + 1.. 2\n Oh, I make an error.. work not complete done\n Oh, I make a warning.. work is complicated\n Start an exception.. EXCEPTION OCCURRED: name 'function_not_found' is not defined\n Make a final error.. this is the end..\n\n::\n\n $ ./example.py work_ 15.4\n Please select the state of your work\n 1) Done\n 2) In Progress\n 3) unknown\n 4) lost\n Please select (1-4) [4]: 2\n Your work is 15.4% In Progress\n\n::\n\n $ ./example.py work_ 15.4\n Please select the state of your work\n 1) Done\n 2) In Progress\n 3) unknown\n 4) lost\n Please select (1-4) [4]: 3\n Your work is 15.4% unknown\n\n::\n\n $ ./example.py work_ 15.4\n Please select the state of your work\n 1) Done\n 2) In Progress\n 3) unknown\n 4) lost\n Please select (1-4) [4]:\n Your work is 15.4% lost\n\n::\n\n $ ./example.py output\n This is a ok: OK\n This is a ok with message:all is fine\n This is a warning: please check this\n Start with working.. . . . . OK\n Id|Name\n 1 Test #1\n 2 Test #2\n Only FYI\n This is a error: this is wrong, please fix\n This is a fatal error: this is a fuckup\n\n::\n\n $ ./example.py output -o tsv\n id name\n 1 Test #1\n 2 Test #2\n\n::\n\n $ ./example.py output -o json\n [{\"id\": 1, \"name\": \"Test #1\"}, {\"id\": 2, \"name\": \"Test #2\"}]\n\n::\n\n $ ./example.py output -o yaml\n id: 1\n name: 'Test #1'\n ---\n id: 2\n name: 'Test #2'\n\n\nLicense\n=======\n\nCopyright (c) 2015-2019 Zalando SE\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n\n",
- "keywords": [
- "click",
- "console",
- "terminal",
- "cli"
- ],
- "home_page": "https://codeberg.org/hjacobs/python-clickclick",
- "author": "Henning Jacobs",
- "author_email": "henning.jacobs@jacobs1.de",
- "license": "Apache License 2.0",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Console",
- "Intended Audience :: Developers",
- "Intended Audience :: System Administrators",
- "License :: OSI Approved :: Apache Software License",
- "Operating System :: POSIX :: Linux",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: Implementation :: CPython"
- ],
- "requires_dist": [
- "PyYAML (>=3.11)",
- "click (>=4.0)"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6",
- "hashes": {
- "sha256": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "colorama",
- "version": "0.4.6",
- "summary": "Cross-platform colored terminal text.",
- "description": ".. image:: https://img.shields.io/pypi/v/colorama.svg\n :target: https://pypi.org/project/colorama/\n :alt: Latest Version\n\n.. image:: https://img.shields.io/pypi/pyversions/colorama.svg\n :target: https://pypi.org/project/colorama/\n :alt: Supported Python versions\n\n.. image:: https://github.com/tartley/colorama/actions/workflows/test.yml/badge.svg\n :target: https://github.com/tartley/colorama/actions/workflows/test.yml\n :alt: Build Status\n\nColorama\n========\n\nMakes ANSI escape character sequences (for producing colored terminal text and\ncursor positioning) work under MS Windows.\n\n.. |donate| image:: https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif\n :target: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=2MZ9D2GMLYCUJ&item_name=Colorama¤cy_code=USD\n :alt: Donate with Paypal\n\n`PyPI for releases <https://pypi.org/project/colorama/>`_ |\n`Github for source <https://github.com/tartley/colorama>`_ |\n`Colorama for enterprise on Tidelift <https://github.com/tartley/colorama/blob/master/ENTERPRISE.md>`_\n\nIf you find Colorama useful, please |donate| to the authors. Thank you!\n\nInstallation\n------------\n\nTested on CPython 2.7, 3.7, 3.8, 3.9 and 3.10 and Pypy 2.7 and 3.8.\n\nNo requirements other than the standard library.\n\n.. code-block:: bash\n\n pip install colorama\n # or\n conda install -c anaconda colorama\n\nDescription\n-----------\n\nANSI escape character sequences have long been used to produce colored terminal\ntext and cursor positioning on Unix and Macs. Colorama makes this work on\nWindows, too, by wrapping ``stdout``, stripping ANSI sequences it finds (which\nwould appear as gobbledygook in the output), and converting them into the\nappropriate win32 calls to modify the state of the terminal. On other platforms,\nColorama does nothing.\n\nThis has the upshot of providing a simple cross-platform API for printing\ncolored terminal text from Python, and has the happy side-effect that existing\napplications or libraries which use ANSI sequences to produce colored output on\nLinux or Macs can now also work on Windows, simply by calling\n``colorama.just_fix_windows_console()`` (since v0.4.6) or ``colorama.init()``\n(all versions, but may have other side-effects – see below).\n\nAn alternative approach is to install ``ansi.sys`` on Windows machines, which\nprovides the same behaviour for all applications running in terminals. Colorama\nis intended for situations where that isn't easy (e.g., maybe your app doesn't\nhave an installer.)\n\nDemo scripts in the source code repository print some colored text using\nANSI sequences. Compare their output under Gnome-terminal's built in ANSI\nhandling, versus on Windows Command-Prompt using Colorama:\n\n.. image:: https://github.com/tartley/colorama/raw/master/screenshots/ubuntu-demo.png\n :width: 661\n :height: 357\n :alt: ANSI sequences on Ubuntu under gnome-terminal.\n\n.. image:: https://github.com/tartley/colorama/raw/master/screenshots/windows-demo.png\n :width: 668\n :height: 325\n :alt: Same ANSI sequences on Windows, using Colorama.\n\nThese screenshots show that, on Windows, Colorama does not support ANSI 'dim\ntext'; it looks the same as 'normal text'.\n\nUsage\n-----\n\nInitialisation\n..............\n\nIf the only thing you want from Colorama is to get ANSI escapes to work on\nWindows, then run:\n\n.. code-block:: python\n\n from colorama import just_fix_windows_console\n just_fix_windows_console()\n\nIf you're on a recent version of Windows 10 or better, and your stdout/stderr\nare pointing to a Windows console, then this will flip the magic configuration\nswitch to enable Windows' built-in ANSI support.\n\nIf you're on an older version of Windows, and your stdout/stderr are pointing to\na Windows console, then this will wrap ``sys.stdout`` and/or ``sys.stderr`` in a\nmagic file object that intercepts ANSI escape sequences and issues the\nappropriate Win32 calls to emulate them.\n\nIn all other circumstances, it does nothing whatsoever. Basically the idea is\nthat this makes Windows act like Unix with respect to ANSI escape handling.\n\nIt's safe to call this function multiple times. It's safe to call this function\non non-Windows platforms, but it won't do anything. It's safe to call this\nfunction when one or both of your stdout/stderr are redirected to a file – it\nwon't do anything to those streams.\n\nAlternatively, you can use the older interface with more features (but also more\npotential footguns):\n\n.. code-block:: python\n\n from colorama import init\n init()\n\nThis does the same thing as ``just_fix_windows_console``, except for the\nfollowing differences:\n\n- It's not safe to call ``init`` multiple times; you can end up with multiple\n layers of wrapping and broken ANSI support.\n\n- Colorama will apply a heuristic to guess whether stdout/stderr support ANSI,\n and if it thinks they don't, then it will wrap ``sys.stdout`` and\n ``sys.stderr`` in a magic file object that strips out ANSI escape sequences\n before printing them. This happens on all platforms, and can be convenient if\n you want to write your code to emit ANSI escape sequences unconditionally, and\n let Colorama decide whether they should actually be output. But note that\n Colorama's heuristic is not particularly clever.\n\n- ``init`` also accepts explicit keyword args to enable/disable various\n functionality – see below.\n\nTo stop using Colorama before your program exits, simply call ``deinit()``.\nThis will restore ``stdout`` and ``stderr`` to their original values, so that\nColorama is disabled. To resume using Colorama again, call ``reinit()``; it is\ncheaper than calling ``init()`` again (but does the same thing).\n\nMost users should depend on ``colorama >= 0.4.6``, and use\n``just_fix_windows_console``. The old ``init`` interface will be supported\nindefinitely for backwards compatibility, but we don't plan to fix any issues\nwith it, also for backwards compatibility.\n\nColored Output\n..............\n\nCross-platform printing of colored text can then be done using Colorama's\nconstant shorthand for ANSI escape sequences. These are deliberately\nrudimentary, see below.\n\n.. code-block:: python\n\n from colorama import Fore, Back, Style\n print(Fore.RED + 'some red text')\n print(Back.GREEN + 'and with a green background')\n print(Style.DIM + 'and in dim text')\n print(Style.RESET_ALL)\n print('back to normal now')\n\n...or simply by manually printing ANSI sequences from your own code:\n\n.. code-block:: python\n\n print('\\033[31m' + 'some red text')\n print('\\033[39m') # and reset to default color\n\n...or, Colorama can be used in conjunction with existing ANSI libraries\nsuch as the venerable `Termcolor <https://pypi.org/project/termcolor/>`_\nthe fabulous `Blessings <https://pypi.org/project/blessings/>`_,\nor the incredible `_Rich <https://pypi.org/project/rich/>`_.\n\nIf you wish Colorama's Fore, Back and Style constants were more capable,\nthen consider using one of the above highly capable libraries to generate\ncolors, etc, and use Colorama just for its primary purpose: to convert\nthose ANSI sequences to also work on Windows:\n\nSIMILARLY, do not send PRs adding the generation of new ANSI types to Colorama.\nWe are only interested in converting ANSI codes to win32 API calls, not\nshortcuts like the above to generate ANSI characters.\n\n.. code-block:: python\n\n from colorama import just_fix_windows_console\n from termcolor import colored\n\n # use Colorama to make Termcolor work on Windows too\n just_fix_windows_console()\n\n # then use Termcolor for all colored text output\n print(colored('Hello, World!', 'green', 'on_red'))\n\nAvailable formatting constants are::\n\n Fore: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET.\n Back: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET.\n Style: DIM, NORMAL, BRIGHT, RESET_ALL\n\n``Style.RESET_ALL`` resets foreground, background, and brightness. Colorama will\nperform this reset automatically on program exit.\n\nThese are fairly well supported, but not part of the standard::\n\n Fore: LIGHTBLACK_EX, LIGHTRED_EX, LIGHTGREEN_EX, LIGHTYELLOW_EX, LIGHTBLUE_EX, LIGHTMAGENTA_EX, LIGHTCYAN_EX, LIGHTWHITE_EX\n Back: LIGHTBLACK_EX, LIGHTRED_EX, LIGHTGREEN_EX, LIGHTYELLOW_EX, LIGHTBLUE_EX, LIGHTMAGENTA_EX, LIGHTCYAN_EX, LIGHTWHITE_EX\n\nCursor Positioning\n..................\n\nANSI codes to reposition the cursor are supported. See ``demos/demo06.py`` for\nan example of how to generate them.\n\nInit Keyword Args\n.................\n\n``init()`` accepts some ``**kwargs`` to override default behaviour.\n\ninit(autoreset=False):\n If you find yourself repeatedly sending reset sequences to turn off color\n changes at the end of every print, then ``init(autoreset=True)`` will\n automate that:\n\n .. code-block:: python\n\n from colorama import init\n init(autoreset=True)\n print(Fore.RED + 'some red text')\n print('automatically back to default color again')\n\ninit(strip=None):\n Pass ``True`` or ``False`` to override whether ANSI codes should be\n stripped from the output. The default behaviour is to strip if on Windows\n or if output is redirected (not a tty).\n\ninit(convert=None):\n Pass ``True`` or ``False`` to override whether to convert ANSI codes in the\n output into win32 calls. The default behaviour is to convert if on Windows\n and output is to a tty (terminal).\n\ninit(wrap=True):\n On Windows, Colorama works by replacing ``sys.stdout`` and ``sys.stderr``\n with proxy objects, which override the ``.write()`` method to do their work.\n If this wrapping causes you problems, then this can be disabled by passing\n ``init(wrap=False)``. The default behaviour is to wrap if ``autoreset`` or\n ``strip`` or ``convert`` are True.\n\n When wrapping is disabled, colored printing on non-Windows platforms will\n continue to work as normal. To do cross-platform colored output, you can\n use Colorama's ``AnsiToWin32`` proxy directly:\n\n .. code-block:: python\n\n import sys\n from colorama import init, AnsiToWin32\n init(wrap=False)\n stream = AnsiToWin32(sys.stderr).stream\n\n # Python 2\n print >>stream, Fore.BLUE + 'blue text on stderr'\n\n # Python 3\n print(Fore.BLUE + 'blue text on stderr', file=stream)\n\nRecognised ANSI Sequences\n.........................\n\nANSI sequences generally take the form::\n\n ESC [ <param> ; <param> ... <command>\n\nWhere ``<param>`` is an integer, and ``<command>`` is a single letter. Zero or\nmore params are passed to a ``<command>``. If no params are passed, it is\ngenerally synonymous with passing a single zero. No spaces exist in the\nsequence; they have been inserted here simply to read more easily.\n\nThe only ANSI sequences that Colorama converts into win32 calls are::\n\n ESC [ 0 m # reset all (colors and brightness)\n ESC [ 1 m # bright\n ESC [ 2 m # dim (looks same as normal brightness)\n ESC [ 22 m # normal brightness\n\n # FOREGROUND:\n ESC [ 30 m # black\n ESC [ 31 m # red\n ESC [ 32 m # green\n ESC [ 33 m # yellow\n ESC [ 34 m # blue\n ESC [ 35 m # magenta\n ESC [ 36 m # cyan\n ESC [ 37 m # white\n ESC [ 39 m # reset\n\n # BACKGROUND\n ESC [ 40 m # black\n ESC [ 41 m # red\n ESC [ 42 m # green\n ESC [ 43 m # yellow\n ESC [ 44 m # blue\n ESC [ 45 m # magenta\n ESC [ 46 m # cyan\n ESC [ 47 m # white\n ESC [ 49 m # reset\n\n # cursor positioning\n ESC [ y;x H # position cursor at x across, y down\n ESC [ y;x f # position cursor at x across, y down\n ESC [ n A # move cursor n lines up\n ESC [ n B # move cursor n lines down\n ESC [ n C # move cursor n characters forward\n ESC [ n D # move cursor n characters backward\n\n # clear the screen\n ESC [ mode J # clear the screen\n\n # clear the line\n ESC [ mode K # clear the line\n\nMultiple numeric params to the ``'m'`` command can be combined into a single\nsequence::\n\n ESC [ 36 ; 45 ; 1 m # bright cyan text on magenta background\n\nAll other ANSI sequences of the form ``ESC [ <param> ; <param> ... <command>``\nare silently stripped from the output on Windows.\n\nAny other form of ANSI sequence, such as single-character codes or alternative\ninitial characters, are not recognised or stripped. It would be cool to add\nthem though. Let me know if it would be useful for you, via the Issues on\nGitHub.\n\nStatus & Known Problems\n-----------------------\n\nI've personally only tested it on Windows XP (CMD, Console2), Ubuntu\n(gnome-terminal, xterm), and OS X.\n\nSome valid ANSI sequences aren't recognised.\n\nIf you're hacking on the code, see `README-hacking.md`_. ESPECIALLY, see the\nexplanation there of why we do not want PRs that allow Colorama to generate new\ntypes of ANSI codes.\n\nSee outstanding issues and wish-list:\nhttps://github.com/tartley/colorama/issues\n\nIf anything doesn't work for you, or doesn't do what you expected or hoped for,\nI'd love to hear about it on that issues list, would be delighted by patches,\nand would be happy to grant commit access to anyone who submits a working patch\nor two.\n\n.. _README-hacking.md: README-hacking.md\n\nLicense\n-------\n\nCopyright Jonathan Hartley & Arnon Yaari, 2013-2020. BSD 3-Clause license; see\nLICENSE file.\n\nProfessional support\n--------------------\n\n.. |tideliftlogo| image:: https://cdn2.hubspot.net/hubfs/4008838/website/logos/logos_for_download/Tidelift_primary-shorthand-logo.png\n :alt: Tidelift\n :target: https://tidelift.com/subscription/pkg/pypi-colorama?utm_source=pypi-colorama&utm_medium=referral&utm_campaign=readme\n\n.. list-table::\n :widths: 10 100\n\n * - |tideliftlogo|\n - Professional support for colorama is available as part of the\n `Tidelift Subscription`_.\n Tidelift gives software development teams a single source for purchasing\n and maintaining their software, with professional grade assurances from\n the experts who know it best, while seamlessly integrating with existing\n tools.\n\n.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-colorama?utm_source=pypi-colorama&utm_medium=referral&utm_campaign=readme\n\nThanks\n------\n\nSee the CHANGELOG for more thanks!\n\n* Marc Schlaich (schlamar) for a ``setup.py`` fix for Python2.5.\n* Marc Abramowitz, reported & fixed a crash on exit with closed ``stdout``,\n providing a solution to issue #7's setuptools/distutils debate,\n and other fixes.\n* User 'eryksun', for guidance on correctly instantiating ``ctypes.windll``.\n* Matthew McCormick for politely pointing out a longstanding crash on non-Win.\n* Ben Hoyt, for a magnificent fix under 64-bit Windows.\n* Jesse at Empty Square for submitting a fix for examples in the README.\n* User 'jamessp', an observant documentation fix for cursor positioning.\n* User 'vaal1239', Dave Mckee & Lackner Kristof for a tiny but much-needed Win7\n fix.\n* Julien Stuyck, for wisely suggesting Python3 compatible updates to README.\n* Daniel Griffith for multiple fabulous patches.\n* Oscar Lesta for a valuable fix to stop ANSI chars being sent to non-tty\n output.\n* Roger Binns, for many suggestions, valuable feedback, & bug reports.\n* Tim Golden for thought and much appreciated feedback on the initial idea.\n* User 'Zearin' for updates to the README file.\n* John Szakmeister for adding support for light colors\n* Charles Merriam for adding documentation to demos\n* Jurko for a fix on 64-bit Windows CPython2.5 w/o ctypes\n* Florian Bruhin for a fix when stdout or stderr are None\n* Thomas Weininger for fixing ValueError on Windows\n* Remi Rampin for better Github integration and fixes to the README file\n* Simeon Visser for closing a file handle using 'with' and updating classifiers\n to include Python 3.3 and 3.4\n* Andy Neff for fixing RESET of LIGHT_EX colors.\n* Jonathan Hartley for the initial idea and implementation.\n",
- "description_content_type": "text/x-rst",
- "keywords": [
- "ansi",
- "color",
- "colour",
- "crossplatform",
- "terminal",
- "text",
- "windows",
- "xplatform"
- ],
- "author_email": "Jonathan Hartley <tartley@tartley.com>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Console",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Terminals"
- ],
- "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7",
- "project_url": [
- "Homepage, https://github.com/tartley/colorama"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/51/62/61449c6bb74c2a3953c415b2cdb488e4f0518ac67b35e2b03a6d543035ca/colorlog-4.8.0-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=3dd15cb27e8119a24c1a7b5c93f9f3b455855e0f73993b1c25921b2f646f1dcd",
- "hashes": {
- "sha256": "3dd15cb27e8119a24c1a7b5c93f9f3b455855e0f73993b1c25921b2f646f1dcd"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "colorlog",
- "version": "4.8.0",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "Log formatting with colors!",
- "description": "Log formatting with colors!\n===========================\n\n[](https://pypi.org/project/colorlog/)\n[](https://pypi.org/project/colorlog/)\n[](https://travis-ci.org/borntyping/python-colorlog)\n\n`colorlog.ColoredFormatter` is a formatter for use with Python's `logging`\nmodule that outputs records using terminal colors.\n\n* [Source on GitHub](https://github.com/borntyping/python-colorlog)\n* [Packages on PyPI](https://pypi.org/pypi/colorlog/)\n* [Builds on Travis CI](https://travis-ci.org/borntyping/python-colorlog)\n\nInstallation\n------------\n\nInstall from PyPI with:\n\n```bash\npip install colorlog\n```\n\nSeveral Linux distributions provide official packages ([Debian], [Gentoo],\n[OpenSuse] and [Ubuntu]), and others have user provided packages ([Arch AUR],\n[BSD ports], [Conda], [Fedora packaging scripts]).\n\nUsage\n-----\n\n```python\nimport colorlog\n\nhandler = colorlog.StreamHandler()\nhandler.setFormatter(colorlog.ColoredFormatter(\n\t'%(log_color)s%(levelname)s:%(name)s:%(message)s'))\n\nlogger = colorlog.getLogger('example')\nlogger.addHandler(handler)\n```\n\nThe `ColoredFormatter` class takes several arguments:\n\n- `format`: The format string used to output the message (required).\n- `datefmt`: An optional date format passed to the base class. See [`logging.Formatter`][Formatter].\n- `reset`: Implicitly adds a color reset code to the message output, unless the output already ends with one. Defaults to `True`.\n- `log_colors`: A mapping of record level names to color names. The defaults can be found in `colorlog.default_log_colors`, or the below example.\n- `secondary_log_colors`: A mapping of names to `log_colors` style mappings, defining additional colors that can be used in format strings. See below for an example.\n- `style`: Available on Python 3.2 and above. See [`logging.Formatter`][Formatter].\n\nColor escape codes can be selected based on the log records level, by adding\nparameters to the format string:\n\n- `log_color`: Return the color associated with the records level.\n- `<name>_log_color`: Return another color based on the records level if the formatter has secondary colors configured (see `secondary_log_colors` below).\n\nMultiple escape codes can be used at once by joining them with commas when\nconfiguring the color for a log level (but can't be used directly in the format\nstring). For example, `black,bg_white` would use the escape codes for black\ntext on a white background.\n\nThe following escape codes are made available for use in the format string:\n\n- `{color}`, `fg_{color}`, `bg_{color}`: Foreground and background colors.\n- `bold`, `bold_{color}`, `fg_bold_{color}`, `bg_bold_{color}`: Bold/bright colors.\n- `thin`, `thin_{color}`, `fg_thin_{color}`: Thin colors (terminal dependent).\n- `reset`: Clear all formatting (both foreground and background colors).\n\nThe available color names are `black`, `red`, `green`, `yellow`, `blue`,\n`purple`, `cyan` and `white`.\n\nExamples\n--------\n\n\n\nThe following code creates a `ColoredFormatter` for use in a logging setup,\nusing the default values for each argument.\n\n```python\nfrom colorlog import ColoredFormatter\n\nformatter = ColoredFormatter(\n\t\"%(log_color)s%(levelname)-8s%(reset)s %(blue)s%(message)s\",\n\tdatefmt=None,\n\treset=True,\n\tlog_colors={\n\t\t'DEBUG': 'cyan',\n\t\t'INFO': 'green',\n\t\t'WARNING': 'yellow',\n\t\t'ERROR': 'red',\n\t\t'CRITICAL': 'red,bg_white',\n\t},\n\tsecondary_log_colors={},\n\tstyle='%'\n)\n```\n\n### Using `secondary_log_colors`\n\nSecondary log colors are a way to have more than one color that is selected\nbased on the log level. Each key in `secondary_log_colors` adds an attribute\nthat can be used in format strings (`message` becomes `message_log_color`), and\nhas a corresponding value that is identical in format to the `log_colors`\nargument.\n\nThe following example highlights the level name using the default log colors,\nand highlights the message in red for `error` and `critical` level log messages.\n\n```python\nfrom colorlog import ColoredFormatter\n\nformatter = ColoredFormatter(\n\t\"%(log_color)s%(levelname)-8s%(reset)s %(message_log_color)s%(message)s\",\n\tsecondary_log_colors={\n\t\t'message': {\n\t\t\t'ERROR': 'red',\n\t\t\t'CRITICAL': 'red'\n\t\t}\n\t}\n)\n```\n\n### With [`dictConfig`][dictConfig]\n\n```python\nlogging.config.dictConfig({\n\t'formatters': {\n\t\t'colored': {\n\t\t\t'()': 'colorlog.ColoredFormatter',\n\t\t\t'format': \"%(log_color)s%(levelname)-8s%(reset)s %(blue)s%(message)s\"\n\t\t}\n\t}\n})\n```\n\nA full example dictionary can be found in `tests/test_colorlog.py`.\n\n### With [`fileConfig`][fileConfig]\n\n```ini\n...\n\n[formatters]\nkeys=color\n\n[formatter_color]\nclass=colorlog.ColoredFormatter\nformat=%(log_color)s%(levelname)-8s%(reset)s %(bg_blue)s[%(name)s]%(reset)s %(message)s from fileConfig\ndatefmt=%m-%d %H:%M:%S\n```\n\nAn instance of ColoredFormatter created with those arguments will then be used\nby any handlers that are configured to use the `color` formatter.\n\nA full example configuration can be found in `tests/test_config.ini`.\n\n### With custom log levels\n\nColoredFormatter will work with custom log levels added with\n[`logging.addLevelName`][addLevelName]:\n\n```python\nimport logging, colorlog\nTRACE = 5\nlogging.addLevelName(TRACE, 'TRACE')\nformatter = colorlog.ColoredFormatter(log_colors={'TRACE': 'yellow'})\nhandler = logging.StreamHandler()\nhandler.setFormatter(formatter)\nlogger = logging.getLogger('example')\nlogger.addHandler(handler)\nlogger.setLevel('TRACE')\nlogger.log(TRACE, 'a message using a custom level')\n```\n\nCompatibility\n-------------\n\ncolorlog works on Python 2.6 and above, including Python 3.\n\nOn Windows, [colorama] is required for `colorlog` to work properly. It will\nautomatically be included when installing `colorlog` on windows.\n\nTests\n-----\n\nTests similar to the above examples are found in `tests/test_colorlog.py`.\n\nStatus\n------\n\ncolorlog is in maintainance mode. I try and ensure bugfixes are published,\nbut compatibility with Python 2.6+ and Python 3+ makes this a difficult\ncodebase to add features to. Any changes that might break backwards\ncompatibility for existing users will not be considered.\n\nAlternatives\n------------\n\nThere are some more modern libraries for improving Python logging you may\nfind useful.\n\n- [structlog]\n- [jsonlog]\n\nProjects using colorlog\n-----------------------\n\n- [Counterparty]\n- [Errbot]\n- [Pythran]\n- [zenlog]\n\nLicence\n-------\n\nCopyright (c) 2012-2020 Sam Clements <sam@borntyping.co.uk>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n[dictConfig]: http://docs.python.org/3/library/logging.config.html#logging.config.dictConfig\n[fileConfig]: http://docs.python.org/3/library/logging.config.html#logging.config.fileConfig\n[addLevelName]: https://docs.python.org/3/library/logging.html#logging.addLevelName\n[Formatter]: http://docs.python.org/3/library/logging.html#logging.Formatter\n[tox]: http://tox.readthedocs.org/\n[Arch AUR]: https://aur.archlinux.org/packages/python-colorlog/\n[BSD ports]: https://www.freshports.org/devel/py-colorlog/\n[colorama]: https://pypi.python.org/pypi/colorama\n[Conda]: https://anaconda.org/auto/colorlog\n[Counterparty]: https://counterparty.io/\n[Debian]: https://packages.debian.org/jessie/python-colorlog\n[Errbot]: http://errbot.io/\n[Fedora packaging scripts]: https://github.com/bartv/python-colorlog\n[Gentoo]: https://packages.gentoo.org/packages/dev-python/colorlog\n[OpenSuse]: http://rpm.pbone.net/index.php3?stat=3&search=python-colorlog&srodzaj=3\n[Pythran]: https://github.com/serge-sans-paille/pythran\n[Ubuntu]: https://launchpad.net/python-colorlog\n[zenlog]: https://github.com/ManufacturaInd/python-zenlog\n[structlog]: https://www.structlog.org/en/stable/\n[jsonlog]: https://github.com/borntyping/jsonlog\n\n\n",
- "description_content_type": "text/markdown",
- "home_page": "https://github.com/borntyping/python-colorlog",
- "author": "Sam Clements",
- "author_email": "sam@borntyping.co.uk",
- "license": "MIT License",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Console",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.6",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Topic :: Terminals",
- "Topic :: Utilities"
- ],
- "requires_dist": [
- "colorama ; sys_platform==\"win32\""
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/4d/13/6791bba527baf3648be8aabaf6d3775027c3ebbf4000f2ae16867911b879/ConfigUpdater-3.1.1-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=805986dbeba317886c7a8d348b2e34986dc9e3128cd3761ecc35decbd372b286",
- "hashes": {
- "sha256": "805986dbeba317886c7a8d348b2e34986dc9e3128cd3761ecc35decbd372b286"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "ConfigUpdater",
- "version": "3.1.1",
- "platform": [
- "any"
- ],
- "summary": "Parser like ConfigParser but for updating configuration files",
- "description": ".. image:: https://api.cirrus-ci.com/github/pyscaffold/configupdater.svg?branch=master\n :alt: Built Status\n :target: https://cirrus-ci.com/github/pyscaffold/configupdater\n.. image:: https://readthedocs.org/projects/pyscaffold/badge/?version=latest\n :alt: ReadTheDocs\n :target: https://configupdater.readthedocs.io/\n.. image:: https://img.shields.io/coveralls/github/pyscaffold/configupdater/master.svg\n :alt: Coveralls\n :target: https://coveralls.io/r/pyscaffold/configupdater\n.. image:: https://img.shields.io/pypi/v/configupdater.svg\n :alt: PyPI-Server\n :target: https://pypi.org/project/configupdater/\n.. image:: https://img.shields.io/conda/vn/conda-forge/configupdater.svg\n :alt: Conda-Forge\n :target: https://anaconda.org/conda-forge/configupdater\n.. image:: https://pepy.tech/badge/configupdater/month\n :alt: Monthly Downloads\n :target: https://pepy.tech/project/configupdater\n\n|\n\n.. image:: https://configupdater.readthedocs.io/en/latest/_images/banner-640x323.png\n :height: 323px\n :width: 640px\n :scale: 60 %\n :alt: Config Updater\n :align: center\n\n|\n\nThe sole purpose of `ConfigUpdater`_ is to easily update an INI config file\nwith no changes to the original file except the intended ones. This means\ncomments, the ordering of sections and key/value-pairs as wells as their\ncases are kept as in the original file. Thus ConfigUpdater provides\ncomplementary functionality to Python's `ConfigParser`_ which is primarily\nmeant for reading config files and writing *new* ones.\n\nFeatures\n========\n\nThe key differences to `ConfigParser`_ are:\n\n* minimal invasive changes in the update configuration file,\n* proper handling of comments,\n* only a single config file can be updated at a time,\n* the original case of sections and keys are kept,\n* control over the position of a new section/key\n\nFollowing features are **deliberately not** implemented:\n\n* interpolation of values,\n* propagation of parameters from the default section,\n* conversions of values,\n* passing key/value-pairs with ``default`` argument,\n* non-strict mode allowing duplicate sections and keys.\n\nUsage\n=====\n\nFirst install the package with either::\n\n pip install configupdater\n\nor::\n\n conda install -c conda-forge configupdater\n\nNow we can simply do::\n\n from configupdater import ConfigUpdater\n\n updater = ConfigUpdater()\n updater.read(\"setup.cfg\")\n\nwhich would read the file ``setup.cfg`` that is found in many projects.\n\nTo change the value of an existing key we can simply do::\n\n updater[\"metadata\"][\"author\"].value = \"Alan Turing\"\n\nAt any point we can print the current state of the configuration file with::\n\n print(updater)\n\nTo update the read-in file just call ``updater.update_file()`` or ``updater.write(open('filename','w'))``\nto write the changed configuration file to another destination. Before actually writing,\nConfigUpdater will automatically check that the updated configuration file is still valid by\nparsing it with the help of ConfigParser.\n\nMany of ConfigParser's methods still exists and it's best to look them up in the `module reference`_.\nLet's look at some examples.\n\nAdding and removing options\n---------------------------\n\nLet's say we have the following configuration in a string::\n\n cfg = \"\"\"\n [metadata]\n author = Ada Lovelace\n summary = The Analytical Engine\n \"\"\"\n\nWe can add an *license* option, i.e. a key/value pair, in the same way we would do with ConfigParser::\n\n updater = ConfigUpdater()\n updater.read_string(cfg)\n updater[\"metadata\"][\"license\"] = \"MIT\"\n\nA simple ``print(updater)`` will give show you that the new option was appended to the end::\n\n [metadata]\n author = Ada Lovelace\n summary = The Analytical Engine\n license = MIT\n\nSince the license is really important to us let's say we want to add it before the ``summary``\nand even add a short comment before it::\n\n updater = ConfigUpdater()\n updater.read_string(cfg)\n (updater[\"metadata\"][\"summary\"].add_before\n .comment(\"Ada would have loved MIT\")\n .option(\"license\", \"MIT\"))\n\nwhich would result in::\n\n [metadata]\n author = Ada Lovelace\n # Ada would have loved MIT\n license = MIT\n summary = Analytical Engine calculating the Bernoulli numbers\n\nUsing ``add_after`` would give the same result and looks like::\n\n updater = ConfigUpdater()\n updater.read_string(cfg)\n (updater[\"metadata\"][\"author\"].add_after\n .comment(\"Ada would have loved MIT\")\n .option(\"license\", \"MIT\"))\n\nLet's say we want to rename `summary` to the more common `description`::\n\n updater = ConfigUpdater()\n updater.read_string(cfg)\n updater[\"metadata\"][\"summary\"].key = \"description\"\n\nIf we wanted no summary at all, we could just do ``del updater[\"metadata\"][\"summary\"]``.\n\n\nAdding and removing sections\n----------------------------\n\nAdding and remove sections just works like adding and removing options but on a higher level.\nSticking to our *Ada Lovelace* example, let's say we want to add a section ``options`` just\nbefore ``metadata`` with a comment and two new lines to separate it from ``metadata``::\n\n updater = ConfigUpdater()\n updater.read_string(cfg)\n (updater[\"metadata\"].add_before\n .comment(\"Some specific project options\")\n .section(\"options\")\n .space(2))\n\nAs expected, this results in::\n\n # Some specific project options\n [options]\n\n [metadata]\n author = Ada Lovelace\n summary = The Analytical Engine\n\nWe could now fill the new section with options like we learnt before. If we wanted to rename\nan existing section we could do this with the help of the ``name`` attribute::\n\n updater[\"metadata\"].name = \"MetaData\"\n\nSometimes it might be useful to inject a new section not in a programmatic way but more declarative.\nLet's assume we have thus defined our new section in a multi-line string::\n\n sphinx_sect_str = \"\"\"\n [build_sphinx]\n source_dir = docs\n build_dir = docs/_build\n \"\"\"\n\nWith the help of two ConfigUpdater objects we can easily inject this section into our example::\n\n sphinx = ConfigUpdater()\n sphinx.read_string(sphinx_sect_str)\n sphinx_sect = sphinx[\"build_sphinx\"]\n\n updater = ConfigUpdater()\n updater.read_string(cfg)\n\n (updater[\"metadata\"].add_after\n .space()\n .section(sphinx_sect.detach()))\n\nThe ``detach`` method will remove the ``build_sphinx`` section from the first object\nand add it to the second object. This results in::\n\n [metadata]\n author = Ada Lovelace\n summary = The Analytical Engine\n\n [build_sphinx]\n source_dir = docs\n build_dir = docs/_build\n\nAlternatively, if you want to preserve ``build_sphinx`` in both\n``ConfigUpdater`` objects (i.e., prevent it from being removed from the first\nwhile still adding a copy to the second), you call also rely on stdlib's\n``copy.deepcopy`` function instead of ``detach``::\n\n from copy import deepcopy\n\n (updater[\"metadata\"].add_after\n .space()\n .section(deepcopy(sphinx_sect)))\n\nThis technique can be used for all objects inside ConfigUpdater: sections,\noptions, comments and blank spaces.\n\nShallow copies are discouraged in the context of ConfigUpdater because each\nconfiguration block keeps a reference to its container to allow easy document\nediting. When doing editions (such as adding or changing options and comments)\nbased on a shallow copy, the results can be unreliable and unexpected.\n\nFor more examples on how the API of ConfigUpdater works it's best to take a look into the\n`unit tests`_ and read the references.\n\n\nNotes\n=====\n\nConfigUpdater is mainly developed for `PyScaffold`_.\n\n.. _ConfigParser: https://docs.python.org/3/library/configparser.html\n.. _ConfigUpdater: https://configupdater.readthedocs.io/\n.. _PyScaffold: https://pyscaffold.org/\n.. _module reference: https://configupdater.readthedocs.io/en/latest/api/configupdater.html#configupdater.configupdater.ConfigUpdater\n.. _unit tests: https://github.com/pyscaffold/configupdater/blob/master/tests/test_configupdater.py\n",
- "description_content_type": "text/x-rst; charset=UTF-8",
- "home_page": "https://github.com/pyscaffold/configupdater",
- "author": "Florian Wilhelm",
- "author_email": "florian.wilhelm@gmail.com",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "Operating System :: OS Independent",
- "License :: OSI Approved :: MIT License",
- "Intended Audience :: Developers",
- "Operating System :: POSIX :: Linux",
- "Operating System :: Unix",
- "Operating System :: MacOS",
- "Operating System :: Microsoft :: Windows"
- ],
- "requires_dist": [
- "importlib-metadata ; python_version < \"3.8\"",
- "sphinx ; extra == 'testing'",
- "flake8 ; extra == 'testing'",
- "pytest ; extra == 'testing'",
- "pytest-cov ; extra == 'testing'",
- "pytest-virtualenv ; extra == 'testing'",
- "pytest-xdist ; extra == 'testing'"
- ],
- "requires_python": ">=3.6",
- "project_url": [
- "Documentation, https://configupdater.readthedocs.io/",
- "Source, https://github.com/pyscaffold/configupdater/",
- "Tracker, https://github.com/pyscaffold/configupdater/issues",
- "Changelog, https://configupdater.readthedocs.io/en/latest/changelog.html",
- "Download, https://pypi.org/project/configupdater/#files",
- "Conda-Forge, https://anaconda.org/conda-forge/configupdater"
- ],
- "provides_extra": [
- "testing"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/ed/e6/851b3d7688115b176eb5d3e45055d1dc5b2b91708007064a38b0e93813ed/connexion-2.14.2-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=a73b96a0e07b16979a42cde7c7e26afe8548099e352cf350f80c57185e0e0b36",
- "hashes": {
- "sha256": "a73b96a0e07b16979a42cde7c7e26afe8548099e352cf350f80c57185e0e0b36"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "connexion",
- "version": "2.14.2",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "Connexion - API first applications with OpenAPI/Swagger and Flask",
- "description": "Connexion\n=========\n\n.. image:: https://badges.gitter.im/zalando/connexion.svg\n :alt: Join the chat at https://gitter.im/zalando/connexion\n :target: https://gitter.im/zalando/connexion?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge\n\n.. image:: https://github.com/zalando/connexion/actions/workflows/pipeline.yml/badge.svg\n :alt: Build status\n :target: https://github.com/zalando/connexion/actions/workflows/pipeline.yml\n\n.. image:: https://coveralls.io/repos/github/zalando/connexion/badge.svg?branch=main\n :target: https://coveralls.io/github/zalando/connexion?branch=main\n :alt: Coveralls status\n\n.. image:: https://img.shields.io/pypi/v/connexion.svg\n :target: https://pypi.python.org/pypi/connexion\n :alt: Latest Version\n\n.. image:: https://img.shields.io/pypi/status/connexion.svg\n :target: https://pypi.python.org/pypi/connexion\n :alt: Development Status\n\n.. image:: https://img.shields.io/pypi/pyversions/connexion.svg\n :target: https://pypi.python.org/pypi/connexion\n :alt: Python Versions\n\n.. image:: https://img.shields.io/pypi/l/connexion.svg\n :target: https://github.com/zalando/connexion/blob/main/LICENSE.txt\n :alt: License\n\nConnexion is a framework that automagically handles HTTP requests based on `OpenAPI Specification`_\n(formerly known as Swagger Spec) of your API described in `YAML format`_. Connexion allows you to\nwrite an OpenAPI specification, then maps the endpoints to your Python functions; this makes it\nunique, as many tools generate the specification based on your Python code. You can describe your\nREST API in as much detail as you want; then Connexion guarantees that it will work as you\nspecified.\n\nWe built Connexion this way in order to:\n\n- simplify the development process\n- confirm expectations about what your API will look like\n\nConnexion Features:\n-------------------\n\n- Validates requests and endpoint parameters automatically, based on\n your specification\n- Provides a Web Swagger Console UI so that the users of your API can\n have live documentation and even call your API's endpoints\n through it\n- Handles OAuth 2 token-based authentication\n- Supports API versioning\n- Supports automatic serialization of payloads. If your\n specification defines that an endpoint returns JSON, Connexion will\n automatically serialize the return value for you and set the right\n content type in the HTTP header.\n\nWhy Connexion\n-------------\n\nWith Connexion, you write the spec first. Connexion then calls your Python\ncode, handling the mapping from the specification to the code. This\nincentivizes you to write the specification so that all of your\ndevelopers can understand what your API does, even before you write a\nsingle line of code.\n\nIf multiple teams depend on your APIs, you can use Connexion to easily send them the documentation of your API. This guarantees that your API will follow the specification that you wrote. This is a different process from that offered by frameworks such as Hug_, which generates a specification *after* you've written the code. Some disadvantages of generating specifications based on code is that they often end up lacking details or mix your documentation with the code logic of your application.\n\nOther Sources/Mentions\n----------------------\n\n- Zalando RESTful API guidelines with `API First`_\n- Connexion listed on Swagger_'s website\n- Blog post: `Crafting effective Microservices in Python`_\n\nNew in Connexion 2.0:\n---------------------\n- App and Api options must be provided through the \"options\" argument (``old_style_options`` have been removed).\n- You must specify a form content-type in 'consumes' in order to consume form data.\n- The `Operation` interface has been formalized in the `AbstractOperation` class.\n- The `Operation` class has been renamed to `Swagger2Operation`.\n- Array parameter deserialization now follows the Swagger 2.0 spec more closely.\n In situations when a query parameter is passed multiple times, and the collectionFormat is either csv or pipes, the right-most value will be used.\n For example, `?q=1,2,3&q=4,5,6` will result in `q = [4, 5, 6]`.\n The old behavior is available by setting the collectionFormat to `multi`, or by importing `decorators.uri_parsing.AlwaysMultiURIParser` and passing `parser_class=AlwaysMultiURIParser` to your Api.\n- The spec validator library has changed from `swagger-spec-validator` to `openapi-spec-validator`.\n- Errors that previously raised `SwaggerValidationError` now raise the `InvalidSpecification` exception.\n All spec validation errors should be wrapped with `InvalidSpecification`.\n- Support for nullable/x-nullable, readOnly and writeOnly/x-writeOnly has been added to the standard json schema validator.\n- Custom validators can now be specified on api level (instead of app level).\n- Added support for basic authentication and apikey authentication\n- If unsupported security requirements are defined or ``x-tokenInfoFunc``/``x-tokenInfoUrl`` is missing, connexion now denies requests instead of allowing access without security-check.\n- Accessing ``connexion.request.user`` / ``flask.request.user`` is no longer supported, use ``connexion.context['user']`` instead\n\nHow to Use\n==========\n\nPrerequisites\n-------------\n\nPython 3.6+\n\nInstalling It\n-------------\n\nIn your command line, type:\n\n.. code-block:: bash\n\n $ pip install connexion\n\nRunning It\n----------\n\nPlace your API YAML inside a folder in the root\npath of your application (e.g ``swagger/``). Then run:\n\n.. code-block:: python\n\n import connexion\n\n app = connexion.App(__name__, specification_dir='swagger/')\n app.add_api('my_api.yaml')\n app.run(port=8080)\n\nSee the `Connexion Pet Store Example Application`_ for a sample\nspecification.\n\nNow you're able to run and use Connexion!\n\n\nOAuth 2 Authentication and Authorization\n----------------------------------------\n\nConnexion supports one of the three OAuth 2 handling methods. (See\n\"TODO\" below.) With Connexion, the API security definition **must**\ninclude a 'x-tokenInfoUrl' or 'x-tokenInfoFunc (or set ``TOKENINFO_URL``\nor ``TOKENINFO_FUNC`` env var respectively). 'x-tokenInfoUrl' must contain an\nURL to validate and get the `token information`_ and 'x-tokenInfoFunc must\ncontain a reference to a function used to obtain the token info. When both 'x-tokenInfoUrl'\nand 'x-tokenInfoFunc' are used, Connexion will prioritize the function method. Connexion expects to\nreceive the OAuth token in the ``Authorization`` header field in the\nformat described in `RFC 6750 <rfc6750_>`_ section 2.1. This aspect\nrepresents a significant difference from the usual OAuth flow.\n\nDynamic Rendering of Your Specification\n---------------------------------------\n\nConnexion uses Jinja2_ to allow specification parameterization through the ``arguments`` parameter. You can define specification arguments for the application either globally (via the ``connexion.App`` constructor) or for each specific API (via the ``connexion.App#add_api`` method):\n\n.. code-block:: python\n\n app = connexion.App(__name__, specification_dir='swagger/',\n arguments={'global': 'global_value'})\n app.add_api('my_api.yaml', arguments={'api_local': 'local_value'})\n app.run(port=8080)\n\nWhen a value is provided both globally and on the API, the API value will take precedence.\n\nEndpoint Routing to Your Python Views\n-------------------------------------\n\nConnexion uses the ``operationId`` from each `Operation Object`_ to\nidentify which Python function should handle each URL.\n\n**Explicit Routing**:\n\n.. code-block:: yaml\n\n paths:\n /hello_world:\n post:\n operationId: myapp.api.hello_world\n\nIf you provide this path in your specification POST requests to\n``http://MYHOST/hello_world``, it will be handled by the function\n``hello_world`` in the ``myapp.api`` module. Optionally, you can include\n``x-swagger-router-controller`` (or ``x-openapi-router-controller``) in your\noperation definition, making ``operationId`` relative:\n\n.. code-block:: yaml\n\n paths:\n /hello_world:\n post:\n x-swagger-router-controller: myapp.api\n operationId: hello_world\n\nKeep in mind that Connexion follows how `HTTP methods work in Flask`_ and therefore HEAD requests will be handled by the ``operationId`` specified under GET in the specification. If both methods are supported, ``connexion.request.method`` can be used to determine which request was made.\n\nAutomatic Routing\n-----------------\n\nTo customize this behavior, Connexion can use alternative\n``Resolvers``--for example, ``RestyResolver``. The ``RestyResolver``\nwill compose an ``operationId`` based on the path and HTTP method of\nthe endpoints in your specification:\n\n.. code-block:: python\n\n from connexion.resolver import RestyResolver\n\n app = connexion.App(__name__)\n app.add_api('swagger.yaml', resolver=RestyResolver('api'))\n\n.. code-block:: yaml\n\n paths:\n /:\n get:\n # Implied operationId: api.get\n /foo:\n get:\n # Implied operationId: api.foo.search\n post:\n # Implied operationId: api.foo.post\n\n '/foo/{id}':\n get:\n # Implied operationId: api.foo.get\n put:\n # Implied operationId: api.foo.put\n copy:\n # Implied operationId: api.foo.copy\n delete:\n # Implied operationId: api.foo.delete\n\n``RestyResolver`` will give precedence to any ``operationId`` encountered in the specification. It will also respect\n``x-router-controller``. You can import and extend ``connexion.resolver.Resolver`` to implement your own ``operationId``\n(and function) resolution algorithm.\n\nAutomatic Parameter Handling\n----------------------------\n\nConnexion automatically maps the parameters defined in your endpoint specification to arguments of your Python views as named parameters, and, whenever possible, with value casting. Simply define the endpoint's parameters with the same names as your views arguments.\n\nAs an example, say you have an endpoint specified as:\n\n.. code-block:: yaml\n\n paths:\n /foo:\n get:\n operationId: api.foo_get\n parameters:\n - name: message\n description: Some message.\n in: query\n type: string\n required: true\n\nAnd the view function:\n\n.. code-block:: python\n\n # api.py file\n\n def foo_get(message):\n # do something\n return 'You send the message: {}'.format(message), 200\n\nIn this example, Connexion automatically recognizes that your view\nfunction expects an argument named ``message`` and assigns the value\nof the endpoint parameter ``message`` to your view function.\n\n.. note:: In the OpenAPI 3.x.x spec, the requestBody does not have a name.\n By default it will be passed in as 'body'. You can optionally\n provide the x-body-name parameter in your requestBody\n (or legacy position within the requestBody schema)\n to override the name of the parameter that will be passed to your\n handler function.\n\n.. code-block:: yaml\n\n\n /path\n post:\n requestBody:\n x-body-name: body\n content:\n application/json:\n schema:\n # legacy location here should be ignored because the preferred location for x-body-name is at the requestBody level above\n x-body-name: this_should_be_ignored\n $ref: '#/components/schemas/someComponent'\n\n.. warning:: When you define a parameter at your endpoint as *not* required, and\n this argument does not have default value in your Python view, you will get\n a \"missing positional argument\" exception whenever you call this endpoint\n WITHOUT the parameter. Provide a default value for a named argument or use\n ``**kwargs`` dict.\n\nType casting\n^^^^^^^^^^^^\n\nWhenever possible, Connexion will try to parse your argument values and\ndo type casting to related Python native values. The current\navailable type castings are:\n\n+--------------+-------------+\n| OpenAPI Type | Python Type |\n+==============+=============+\n| integer | int |\n+--------------+-------------+\n| string | str |\n+--------------+-------------+\n| number | float |\n+--------------+-------------+\n| boolean | bool |\n+--------------+-------------+\n| array | list |\n+--------------+-------------+\n| null | None |\n+--------------+-------------+\n| object | dict |\n+--------------+-------------+\n\nIf you use the ``array`` type In the Swagger definition, you can define the\n``collectionFormat`` so that it won't be recognized. Connexion currently\nsupports collection formats \"pipes\" and \"csv\". The default format is \"csv\".\n\nConnexion is opinionated about how the URI is parsed for ``array`` types.\nThe default behavior for query parameters that have been defined multiple\ntimes is to use the right-most value. For example, if you provide a URI with\nthe the query string ``?letters=a,b,c&letters=d,e,f``, connexion will set\n``letters = ['d', 'e', 'f']``.\n\nYou can override this behavior by specifying the URI parser in the app or\napi options.\n\n.. code-block:: python\n\n from connexion.decorators.uri_parsing import AlwaysMultiURIParser\n options = {'uri_parser_class': AlwaysMultiURIParser}\n app = connexion.App(__name__, specification_dir='swagger/', options=options)\n\nYou can implement your own URI parsing behavior by inheriting from\n``connexion.decorators.uri_parsing.AbstractURIParser``.\n\nThere are a handful of URI parsers included with connection.\n\n+----------------------+---------------------------------------------------------------------------+\n| OpenAPIURIParser | This parser adheres to the OpenAPI 3.x.x spec, and uses the ``style`` |\n| default: OpenAPI 3.0 | parameter. Query parameters are parsed from left to right, so if a query |\n| | parameter is defined twice, then the right-most definition will take |\n| | precedence. For example, if you provided a URI with the query string |\n| | ``?letters=a,b,c&letters=d,e,f``, and ``style: simple``, then connexion |\n| | will set ``letters = ['d', 'e', 'f']``. For additional information see |\n| | `OpenAPI 3.0 Style Values`_. |\n+----------------------+---------------------------------------------------------------------------+\n| Swagger2URIParser | This parser adheres to the Swagger 2.0 spec, and will only join together |\n| default: OpenAPI 2.0 | multiple instance of the same query parameter if the ``collectionFormat`` |\n| | is set to ``multi``. Query parameters are parsed from left to right, so |\n| | if a query parameter is defined twice, then the right-most definition |\n| | wins. For example, if you provided a URI with the query string |\n| | ``?letters=a,b,c&letters=d,e,f``, and ``collectionFormat: csv``, then |\n| | connexion will set ``letters = ['d', 'e', 'f']`` |\n+----------------------+---------------------------------------------------------------------------+\n| FirstValueURIParser | This parser behaves like the Swagger2URIParser, except that it prefers |\n| | the first defined value. For example, if you provided a URI with the query|\n| | string ``?letters=a,b,c&letters=d,e,f`` and ``collectionFormat: csv`` |\n| | hen connexion will set ``letters = ['a', 'b', 'c']`` |\n+----------------------+---------------------------------------------------------------------------+\n| AlwaysMultiURIParser | This parser is backwards compatible with Connexion 1.x. It joins together |\n| | multiple instances of the same query parameter. |\n+----------------------+---------------------------------------------------------------------------+\n\n\nParameter validation\n^^^^^^^^^^^^^^^^^^^^\n\nConnexion can apply strict parameter validation for query and form data\nparameters. When this is enabled, requests that include parameters not defined\nin the swagger spec return a 400 error. You can enable it when adding the API\nto your application:\n\n.. code-block:: python\n\n app.add_api('my_apy.yaml', strict_validation=True)\n\nAPI Versioning and basePath\n---------------------------\n\nSetting a base path is useful for versioned APIs. An example of\na base path would be the ``1.0`` in ``http://MYHOST/1.0/hello_world``.\n\nIf you are using OpenAPI 3.x.x, you set your base URL path in the\nservers block of the specification. You can either specify a full\nURL, or just a relative path.\n\n.. code-block:: yaml\n\n servers:\n - url: https://MYHOST/1.0\n description: full url example\n - url: /1.0\n description: relative path example\n\n paths:\n ...\n\nIf you are using OpenAPI 2.0, you can define a ``basePath`` on the top level\nof your OpenAPI 2.0 specification.\n\n.. code-block:: yaml\n\n basePath: /1.0\n\n paths:\n ...\n\nIf you don't want to include the base path in your specification, you\ncan provide it when adding the API to your application:\n\n.. code-block:: python\n\n app.add_api('my_api.yaml', base_path='/1.0')\n\nSwagger JSON\n------------\nConnexion makes the OpenAPI/Swagger specification in JSON format\navailable from either ``swagger.json`` (for OpenAPI 2.0) or\n``openapi.json`` (for OpenAPI 3.x.x) at the base path of the API.\nFor example, if your base path was ``1.0``, then your spec would be\navailable at ``/1.0/openapi.json``.\n\nYou can disable serving the spec JSON at the application level:\n\n.. code-block:: python\n\n options = {\"serve_spec\": False}\n app = connexion.App(__name__, specification_dir='openapi/',\n options=options)\n app.add_api('my_api.yaml')\n\nYou can also disable it at the API level:\n\n.. code-block:: python\n\n options = {\"serve_spec\": False}\n app = connexion.App(__name__, specification_dir='openapi/')\n app.add_api('my_api.yaml', options=options)\n\nHTTPS Support\n-------------\n\nWhen specifying HTTPS as the scheme in the API YAML file, all the URIs\nin the served Swagger UI are HTTPS endpoints. The problem: The default\nserver that runs is a \"normal\" HTTP server. This means that the\nSwagger UI cannot be used to play with the API. What is the correct\nway to start a HTTPS server when using Connexion?\n\nOne way, `described by Flask`_, looks like this:\n\n.. code-block:: python\n\n from OpenSSL import SSL\n context = SSL.Context(SSL.SSLv23_METHOD)\n context.use_privatekey_file('yourserver.key')\n context.use_certificate_file('yourserver.crt')\n\n app.run(host='127.0.0.1', port='12344',\n debug=False/True, ssl_context=context)\n\nHowever, Connexion doesn't provide an ssl_context parameter. This is\nbecause Flask doesn't, either--but it uses ``**kwargs`` to send the\nparameters to the underlying `werkzeug`_ server.\n\nThe Swagger UI Console\n----------------------\n\nThe Swagger UI for an API is available through pip extras.\nYou can install it with ``pip install connexion[swagger-ui]``.\nIt will be served up at ``{base_path}/ui/`` where ``base_path`` is the\nbase path of the API.\n\nYou can disable the Swagger UI at the application level:\n\n.. code-block:: python\n\n app = connexion.App(__name__, specification_dir='openapi/',\n options={\"swagger_ui\": False})\n app.add_api('my_api.yaml')\n\n\nYou can also disable it at the API level:\n\n.. code-block:: python\n\n app = connexion.App(__name__, specification_dir='openapi/')\n app.add_api('my_api.yaml', options={\"swagger_ui\": False})\n\nIf necessary, you can explicitly specify the path to the directory with\nswagger-ui to not use the connexion[swagger-ui] distro.\nIn order to do this, you should specify the following option:\n\n.. code-block:: python\n\n options = {'swagger_path': '/path/to/swagger_ui/'}\n app = connexion.App(__name__, specification_dir='openapi/', options=options)\n\nIf you wish to provide your own swagger-ui distro, note that connexion\nexpects a jinja2 file called ``swagger_ui/index.j2`` in order to load the\ncorrect ``swagger.json`` by default. Your ``index.j2`` file can use the\n``openapi_spec_url`` jinja variable for this purpose:\n\n.. code-block::\n\n const ui = SwaggerUIBundle({ url: \"{{ openapi_spec_url }}\"})\n\nAdditionally, if you wish to use swagger-ui-3.x.x, it is also provided by\ninstalling connexion[swagger-ui], and can be enabled like this:\n\n.. code-block:: python\n\n from swagger_ui_bundle import swagger_ui_3_path\n options = {'swagger_path': swagger_ui_3_path}\n app = connexion.App(__name__, specification_dir='swagger/', options=options)\n\n\nServer Backend\n--------------\n\nBy default Connexion uses the Flask_ server. For asynchronous\napplications, you can also use Tornado_ as the HTTP server. To do\nthis, set your server to ``tornado``:\n\n.. code-block:: python\n\n import connexion\n\n app = connexion.App(__name__, specification_dir='swagger/')\n app.run(server='tornado', port=8080)\n\nYou can use the Flask WSGI app with any WSGI container, e.g. `using\nFlask with uWSGI`_ (this is common):\n\n.. code-block:: python\n\n app = connexion.App(__name__, specification_dir='swagger/')\n application = app.app # expose global WSGI application object\n\nYou can use the ``aiohttp`` framework as server backend as well:\n\n.. code-block:: python\n\n import connexion\n\n app = connexion.AioHttpApp(__name__, specification_dir='swagger/')\n app.run(port=8080)\n\n.. note:: Also check aiohttp handler examples_.\n\nSet up and run the installation code:\n\n.. code-block:: bash\n\n $ sudo pip3 install uwsgi\n $ uwsgi --http :8080 -w app -p 16 # use 16 worker processes\n\nSee the `uWSGI documentation`_ for more information.\n\n.. _using Flask with uWSGI: http://flask.pocoo.org/docs/latest/deploying/uwsgi/\n.. _uWSGI documentation: https://uwsgi-docs.readthedocs.org/\n.. _examples: https://docs.aiohttp.org/en/stable/web.html#handler\n\n\nDocumentation\n=============\nAdditional information is available at `Connexion's Documentation Page`_.\n\nChanges\n=======\n\nA full changelog is maintained on the `GitHub releases page`_.\n\n.. _GitHub releases page: https://github.com/zalando/connexion/releases\n\nContributing to Connexion/TODOs\n===============================\n\nWe welcome your ideas, issues, and pull requests. Just follow the\nusual/standard GitHub practices.\n\nYou can find out more about how Connexion works and where to apply your changes by having a look\nat our `ARCHITECTURE.rst <ARCHITECTURE.rst>`_.\n\nUnless you explicitly state otherwise in advance, any non trivial\ncontribution intentionally submitted for inclusion in this project by you\nto the steward of this repository (Zalando SE, Berlin) shall be under the\nterms and conditions of Apache License 2.0 written below, without any\nadditional copyright information, terms or conditions.\n\nTODOs\n-----\n\n\nIf you'd like to become a more consistent contributor to Connexion, we'd love your help working on\nthese we have a list of `issues where we are looking for contributions`_.\n\nThanks\n===================\n\nWe'd like to thank all of Connexion's contributors for working on this\nproject, and to Swagger/OpenAPI for their support.\n\nLicense\n===================\n\nCopyright 2015 Zalando SE\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\n.. _Flask: http://flask.pocoo.org/\n.. _issues waffle board: https://waffle.io/zalando/connexion\n.. _API First: https://opensource.zalando.com/restful-api-guidelines/#api-first\n.. _Hug: https://github.com/timothycrosley/hug\n.. _Swagger: http://swagger.io/open-source-integrations/\n.. _Jinja2: http://jinja.pocoo.org/\n.. _rfc6750: https://tools.ietf.org/html/rfc6750\n.. _OpenAPI Specification: https://www.openapis.org/\n.. _OpenAPI 3.0 Style Values: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#style-values\n.. _Operation Object: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#operation-object\n.. _swager.spec.security_definition: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#security-definitions-object\n.. _swager.spec.security_requirement: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#security-requirement-object\n.. _YAML format: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#format\n.. _token information: https://tools.ietf.org/html/rfc6749\n.. _Tornado: http://www.tornadoweb.org/en/stable/\n.. _Connexion Pet Store Example Application: https://github.com/hjacobs/connexion-example\n.. _described by Flask: http://flask.pocoo.org/snippets/111/\n.. _werkzeug: http://werkzeug.pocoo.org/\n.. _Connexion's Documentation Page: http://connexion.readthedocs.org/en/latest/\n.. _Crafting effective Microservices in Python: https://jobs.zalando.com/tech/blog/crafting-effective-microservices-in-python/\n.. _issues where we are looking for contributions: https://github.com/zalando/connexion/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22\n.. _HTTP Methods work in Flask: http://flask.pocoo.org/docs/1.0/quickstart/#http-methods\n\n\n",
- "keywords": [
- "openapi",
- "oai",
- "swagger",
- "rest",
- "api",
- "oauth",
- "flask",
- "microservice",
- "framework"
- ],
- "home_page": "https://github.com/zalando/connexion",
- "author": "Zalando SE",
- "license": "Apache License Version 2.0",
- "classifier": [
- "Programming Language :: Python",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "Operating System :: OS Independent",
- "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
- "Topic :: Software Development :: Libraries :: Application Frameworks"
- ],
- "requires_dist": [
- "clickclick (<21,>=1.2)",
- "jsonschema (<5,>=2.5.1)",
- "PyYAML (<7,>=5.1)",
- "requests (<3,>=2.9.1)",
- "inflection (<0.6,>=0.3.1)",
- "werkzeug (<2.3,>=1.0)",
- "packaging (>=20)",
- "flask (<2.3,>=1.0.4)",
- "itsdangerous (>=0.24)",
- "importlib-metadata (>=1) ; python_version < \"3.8\"",
- "aiohttp (<4,>=2.3.10) ; extra == 'aiohttp'",
- "aiohttp-jinja2 (<2,>=0.14.0) ; extra == 'aiohttp'",
- "MarkupSafe (>=0.23) ; extra == 'aiohttp'",
- "sphinx-autoapi (==1.8.1) ; extra == 'docs'",
- "flask (<2.3,>=1.0.4) ; extra == 'flask'",
- "itsdangerous (>=0.24) ; extra == 'flask'",
- "swagger-ui-bundle (<0.1,>=0.0.2) ; extra == 'swagger-ui'",
- "decorator (<6,>=5) ; extra == 'tests'",
- "pytest (<7,>=6) ; extra == 'tests'",
- "pytest-cov (<3,>=2) ; extra == 'tests'",
- "testfixtures (<7,>=6) ; extra == 'tests'",
- "flask (<2.3,>=1.0.4) ; extra == 'tests'",
- "itsdangerous (>=0.24) ; extra == 'tests'",
- "swagger-ui-bundle (<0.1,>=0.0.2) ; extra == 'tests'",
- "aiohttp (<4,>=2.3.10) ; extra == 'tests'",
- "aiohttp-jinja2 (<2,>=0.14.0) ; extra == 'tests'",
- "MarkupSafe (>=0.23) ; extra == 'tests'",
- "pytest-aiohttp ; extra == 'tests'",
- "aiohttp-remotes ; extra == 'tests'"
- ],
- "requires_python": ">=3.6",
- "provides_extra": [
- "aiohttp",
- "docs",
- "flask",
- "swagger-ui",
- "tests"
- ]
- },
- "requested_extras": [
- "flask"
- ]
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/24/a0/455f5a0181cf9a0d2e84d3a66c88de019dce5644ad9680825d1c8a403335/cron_descriptor-1.4.0.tar.gz",
- "archive_info": {
- "hash": "sha256=b6ff4e3a988d7ca04a4ab150248e9f166fb7a5c828a85090e75bcc25aa93b4dd",
- "hashes": {
- "sha256": "b6ff4e3a988d7ca04a4ab150248e9f166fb7a5c828a85090e75bcc25aa93b4dd"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "cron-descriptor",
- "version": "1.4.0",
- "summary": "A Python library that converts cron expressions into human readable strings.",
- "description": "# Cron Descriptor\n\n[](https://github.com/Salamek/cron-descriptor/actions/workflows/python-test.yml)\n[](https://www.paypal.me/salamek)\n\nA Python library that converts cron expressions into human readable strings. Ported to Python from https://github.com/bradyholt/cron-expression-descriptor.\n\n**Author**: Adam Schubert (https://www.salamek.cz) \n**Original Author & Credit**: Brady Holt (http://www.geekytidbits.com) \n**License**: [MIT](http://opensource.org/licenses/MIT)\n\n## Features \n * Supports all cron expression special characters including * / , - ? L W, #\n * Supports 5, 6 (w/ seconds or year), or 7 (w/ seconds and year) part cron expressions\n * Provides casing options (Sentence, Title, Lower, etc.)\n * Localization with support for 17 languages\n * Supports Python 2.7 - 3.10\n\n## Installation\nUsing PIP\n```bash\npip install cron-descriptor\n```\n\n## Usage example\n\n### Simple\n```python\nfrom cron_descriptor import get_description, ExpressionDescriptor\n\nprint(get_description(\"* 2 3 * *\"))\n\n#OR\n\nprint(str(ExpressionDescriptor(\"* 2 3 * *\")))\n```\n\n### Advanced\n```python\n# Consult Options.py/CasingTypeEnum.py/DescriptionTypeEnum.py for more info\nfrom cron_descriptor import Options, CasingTypeEnum, DescriptionTypeEnum, ExpressionDescriptor\n\ndescriptor = ExpressionDescriptor(\n expression = \"*/10 * * * *\",\n casing_type = CasingTypeEnum.Sentence,\n use_24hour_time_format = True\n)\n\n# GetDescription uses DescriptionTypeEnum.FULL by default:\nprint(descriptor.get_description())\nprint(\"{}\".format(descriptor))\n\n# Or passing Options class as second argument:\n\noptions = Options()\noptions.casing_type = CasingTypeEnum.Sentence\noptions.use_24hour_time_format = True\ndescriptor = ExpressionDescriptor(\"*/10 * * * *\", options)\nprint(descriptor.get_description(DescriptionTypeEnum.FULL))\n```\n\n## Languages Available\n\n|Language| Locale Code | Contributor |\n|--------|-------------|-------------|\n|English |en|[Brady Holt](https://github.com/bradyholt)|\n|Brazilian |pt_PT|[Renato Lima](https://github.com/natenho)|\n|Chinese Simplified | zh_CN |[Star Peng](https://github.com/starpeng)|\n|Spanish |es_ES|[Ivan Santos](https://github.com/ivansg)|\n|Norwegian |nb_NO|[Siarhei Khalipski](https://github.com/KhalipskiSiarhei)|\n|Turkish |tr_TR|[Mustafa SADEDİL](https://github.com/sadedil)|\n|Dutch |nl_NL|[TotalMace](https://github.com/TotalMace)|\n|Russian |ru_RU|[LbISS](https://github.com/LbISS)|\n|French |fr_FR|[Arnaud TAMAILLON](https://github.com/Greybird)|\n|German |de_DE|[Michael Schuler](https://github.com/mschuler)|\n|Ukrainian |uk_UA|[Taras](https://github.com/tbudurovych)|\n|Italian |it_IT|[rinaldihno](https://github.com/rinaldihno)|\n|Czech |cs_CZ|[Adam Schubert](https://github.com/salamek)|\n|Swedish |sv_SE|[Åke Engelbrektson](https://github.com/eson57)|\n|Tamil |ta_IN|[Sankar Hari](https://github.com/sankarhari)|\n|Persian|fa_IR|[M. Yas. Davoodeh](https://github.com/Davoodeh)|\n|Korean|ko_KR|[KyuJoo Han](https://github.com/hanqyu)|\n|Japanese |ja_JP|[Tho Nguyen](https://github.com/tho-asterist)|\n\n<!-- SOON\n## Demo\n\n\n\n## Download\n\n-->\n\n## Original Source\n - .NET - [https://github.com/bradyholt/cron-expression-descriptor](https://github.com/bradyholt/cron-expression-descriptor)\n\n## Ports\n - Java - [https://github.com/RedHogs/cron-parser](https://github.com/RedHogs/cron-parser)\n - Ruby - [https://github.com/alpinweis/cronex](https://github.com/alpinweis/cronex)\n - Golang - [https://github.com/jsuar/go-cron-descriptor](https://github.com/jsuar/go-cron-descriptor)\n\n## Running Unit Tests\n\n```bash\npython setup.py test\n```\n\n## Translating\ncron-descriptor is using [Gettext](https://www.gnu.org/software/gettext/) for translations.\n\n> To create new translation or edit existing one, i suggest using [Poedit](https://poedit.net/).\n\nYou can copy/rename and translate any file from `locale` directory:\n```bash\ncp ./cron_descriptor/locale/de_DE.po ./cron_descriptor/locale/YOUR_LOCALE_CODE.po\npoedit ./cron_descriptor/locale/YOUR_LOCALE_CODE.po\n```\nor you can generate new untranslated *.po file from sources by running in `cron_descriptor` directory:\n```bash\ncd cron_descriptor\nxgettext *.py -o locale/YOUR_LOCALE_CODE.po\n```\n\nGenerating *.mo file from *.po file. In root directory run command:\n```bash\nmsgfmt -o cron_descriptor/locale/YOUR_LOCALE_CODE.mo cron_descriptor/locale/YOUR_LOCALE_CODE.po\n```\n\n## Developing\n\nAll suggestions and PR's are welcomed\n\nJust clone this repository and register pre-commit hook by running:\n\n```bash\nln -s ../../pre-commit.sh .git/hooks/pre-commit\n```\n\nThen install dev requirements:\n\n```bash\npip install pep8\npip install flake8\npip install pep8-naming\n```\n",
- "description_content_type": "text/markdown",
- "home_page": "https://github.com/Salamek/cron-descriptor",
- "author": "Adam Schubert",
- "author_email": "adam.schubert@sg1-game.net",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.2",
- "Programming Language :: Python :: 3.3",
- "Programming Language :: Python :: 3.4",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Topic :: Software Development"
- ],
- "requires_dist": [
- "polib; extra == \"dev\""
- ],
- "provides_extra": [
- "dev"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/27/86/c1ce37af79385a106aacdd40b6e25ff25b2d888f2e64a05ee4e5b05f5768/croniter-2.0.1-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=4cb064ce2d8f695b3b078be36ff50115cf8ac306c10a7e8653ee2a5b534673d7",
- "hashes": {
- "sha256": "4cb064ce2d8f695b3b078be36ff50115cf8ac306c10a7e8653ee2a5b534673d7"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "croniter",
- "version": "2.0.1",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "croniter provides iteration for datetime object with cron like format",
- "description": "Introduction\n============\n\n.. contents::\n\n\ncroniter provides iteration for the datetime object with a cron like format.\n\n::\n\n _ _\n ___ _ __ ___ _ __ (_) |_ ___ _ __\n / __| '__/ _ \\| '_ \\| | __/ _ \\ '__|\n | (__| | | (_) | | | | | || __/ |\n \\___|_| \\___/|_| |_|_|\\__\\___|_|\n\n\nWebsite: https://github.com/kiorky/croniter\n\nBuild Badge\n===========\n.. image:: https://github.com/kiorky/croniter/actions/workflows/cicd.yml/badge.svg\n :target: https://github.com/kiorky/croniter/actions/workflows/cicd.yml\n\n\nUsage\n============\n\nA simple example::\n\n >>> from croniter import croniter\n >>> from datetime import datetime\n >>> base = datetime(2010, 1, 25, 4, 46)\n >>> iter = croniter('*/5 * * * *', base) # every 5 minutes\n >>> print(iter.get_next(datetime)) # 2010-01-25 04:50:00\n >>> print(iter.get_next(datetime)) # 2010-01-25 04:55:00\n >>> print(iter.get_next(datetime)) # 2010-01-25 05:00:00\n >>>\n >>> iter = croniter('2 4 * * mon,fri', base) # 04:02 on every Monday and Friday\n >>> print(iter.get_next(datetime)) # 2010-01-26 04:02:00\n >>> print(iter.get_next(datetime)) # 2010-01-30 04:02:00\n >>> print(iter.get_next(datetime)) # 2010-02-02 04:02:00\n >>>\n >>> iter = croniter('2 4 1 * wed', base) # 04:02 on every Wednesday OR on 1st day of month\n >>> print(iter.get_next(datetime)) # 2010-01-27 04:02:00\n >>> print(iter.get_next(datetime)) # 2010-02-01 04:02:00\n >>> print(iter.get_next(datetime)) # 2010-02-03 04:02:00\n >>>\n >>> iter = croniter('2 4 1 * wed', base, day_or=False) # 04:02 on every 1st day of the month if it is a Wednesday\n >>> print(iter.get_next(datetime)) # 2010-09-01 04:02:00\n >>> print(iter.get_next(datetime)) # 2010-12-01 04:02:00\n >>> print(iter.get_next(datetime)) # 2011-06-01 04:02:00\n >>>\n >>> iter = croniter('0 0 * * sat#1,sun#2', base) # 1st Saturday, and 2nd Sunday of the month\n >>> print(iter.get_next(datetime)) # 2010-02-06 00:00:00\n >>>\n >>> iter = croniter('0 0 * * 5#3,L5', base) # 3rd and last Friday of the month\n >>> print(iter.get_next(datetime)) # 2010-01-29 00:00:00\n >>> print(iter.get_next(datetime)) # 2010-02-19 00:00:00\n\n\nAll you need to know is how to use the constructor and the ``get_next``\nmethod, the signature of these methods are listed below::\n\n >>> def __init__(self, cron_format, start_time=time.time(), day_or=True)\n\ncroniter iterates along with ``cron_format`` from ``start_time``.\n``cron_format`` is **min hour day month day_of_week**, you can refer to\nhttp://en.wikipedia.org/wiki/Cron for more details. The ``day_or``\nswitch is used to control how croniter handles **day** and **day_of_week**\nentries. Default option is the cron behaviour, which connects those\nvalues using **OR**. If the switch is set to False, the values are connected\nusing **AND**. This behaves like fcron and enables you to e.g. define a job that\nexecutes each 2nd Friday of a month by setting the days of month and the\nweekday.\n::\n\n >>> def get_next(self, ret_type=float)\n\nget_next calculates the next value according to the cron expression and\nreturns an object of type ``ret_type``. ``ret_type`` should be a ``float`` or a\n``datetime`` object.\n\nSupported added for ``get_prev`` method. (>= 0.2.0)::\n\n >>> base = datetime(2010, 8, 25)\n >>> itr = croniter('0 0 1 * *', base)\n >>> print(itr.get_prev(datetime)) # 2010-08-01 00:00:00\n >>> print(itr.get_prev(datetime)) # 2010-07-01 00:00:00\n >>> print(itr.get_prev(datetime)) # 2010-06-01 00:00:00\n\nYou can validate your crons using ``is_valid`` class method. (>= 0.3.18)::\n\n >>> croniter.is_valid('0 0 1 * *') # True\n >>> croniter.is_valid('0 wrong_value 1 * *') # False\n\nAbout DST\n=========\nBe sure to init your croniter instance with a TZ aware datetime for this to work!\n\nExample using pytz::\n\n >>> import pytz\n >>> tz = pytz.timezone(\"Europe/Paris\")\n >>> local_date = tz.localize(datetime(2017, 3, 26))\n >>> val = croniter('0 0 * * *', local_date).get_next(datetime)\n\nExample using python_dateutil::\n\n >>> import dateutil.tz\n >>> tz = dateutil.tz.gettz('Asia/Tokyo')\n >>> local_date = datetime(2017, 3, 26, tzinfo=tz)\n >>> val = croniter('0 0 * * *', local_date).get_next(datetime)\n\nExample using python built in module::\n\n >>> from datetime import datetime, timezone\n >>> local_date = datetime(2017, 3, 26, tzinfo=timezone.utc)\n >>> val = croniter('0 0 * * *', local_date).get_next(datetime)\n\nAbout second repeats\n=====================\nCroniter is able to do second repetition crontabs form::\n\n >>> croniter('* * * * * 1', local_date).get_next(datetime)\n >>> base = datetime(2012, 4, 6, 13, 26, 10)\n >>> itr = croniter('* * * * * 15,25', base)\n >>> itr.get_next(datetime) # 4/6 13:26:15\n >>> itr.get_next(datetime) # 4/6 13:26:25\n >>> itr.get_next(datetime) # 4/6 13:27:15\n\nYou can also note that this expression will repeat every second from the start datetime.::\n\n >>> croniter('* * * * * *', local_date).get_next(datetime)\n\nTesting if a date matches a crontab\n===================================\nTest for a match with (>=0.3.32)::\n\n >>> croniter.match(\"0 0 * * *\", datetime(2019, 1, 14, 0, 0, 0, 0))\n True\n >>> croniter.match(\"0 0 * * *\", datetime(2019, 1, 14, 0, 2, 0, 0))\n False\n >>>\n >>> croniter.match(\"2 4 1 * wed\", datetime(2019, 1, 1, 4, 2, 0, 0)) # 04:02 on every Wednesday OR on 1st day of month\n True\n >>> croniter.match(\"2 4 1 * wed\", datetime(2019, 1, 1, 4, 2, 0, 0), day_or=False) # 04:02 on every 1st day of the month if it is a Wednesday\n False\n\nGaps between date matches\n=========================\nFor performance reasons, croniter limits the amount of CPU cycles spent attempting to find the next match.\nStarting in v0.3.35, this behavior is configurable via the ``max_years_between_matches`` parameter, and the default window has been increased from 1 year to 50 years.\n\nThe defaults should be fine for many use cases.\nApplications that evaluate multiple cron expressions or handle cron expressions from untrusted sources or end-users should use this parameter.\nIterating over sparse cron expressions can result in increased CPU consumption or a raised ``CroniterBadDateError`` exception which indicates that croniter has given up attempting to find the next (or previous) match.\nExplicitly specifying ``max_years_between_matches`` provides a way to limit CPU utilization and simplifies the iterable interface by eliminating the need for ``CroniterBadDateError``.\nThe difference in the iterable interface is based on the reasoning that whenever ``max_years_between_matches`` is explicitly agreed upon, there is no need for croniter to signal that it has given up; simply stopping the iteration is preferable.\n\nThis example matches 4 AM Friday, January 1st.\nSince January 1st isn't often a Friday, there may be a few years between each occurrence.\nSetting the limit to 15 years ensures all matches::\n\n >>> it = croniter(\"0 4 1 1 fri\", datetime(2000,1,1), day_or=False, max_years_between_matches=15).all_next(datetime)\n >>> for i in range(5):\n ... print(next(it))\n ...\n 2010-01-01 04:00:00\n 2016-01-01 04:00:00\n 2021-01-01 04:00:00\n 2027-01-01 04:00:00\n 2038-01-01 04:00:00\n\nHowever, when only concerned with dates within the next 5 years, simply set ``max_years_between_matches=5`` in the above example.\nThis will result in no matches found, but no additional cycles will be wasted on unwanted matches far in the future.\n\nIterating over a range using cron\n=================================\nFind matches within a range using the ``croniter_range()`` function. This is much like the builtin ``range(start,stop,step)`` function, but for dates. The `step` argument is a cron expression.\nAdded in (>=0.3.34)\n\nList the first Saturday of every month in 2019::\n\n >>> from croniter import croniter_range\n >>> for dt in croniter_range(datetime(2019, 1, 1), datetime(2019, 12, 31), \"0 0 * * sat#1\"):\n >>> print(dt)\n\n\nHashed expressions\n==================\n\ncroniter supports Jenkins-style hashed expressions, using the \"H\" definition keyword and the required hash_id keyword argument.\nHashed expressions remain consistent, given the same hash_id, but different hash_ids will evaluate completely different to each other.\nThis allows, for example, for an even distribution of differently-named jobs without needing to manually spread them out.\n\n >>> itr = croniter(\"H H * * *\", hash_id=\"hello\")\n >>> itr.get_next(datetime)\n datetime.datetime(2021, 4, 10, 11, 10)\n >>> itr.get_next(datetime)\n datetime.datetime(2021, 4, 11, 11, 10)\n >>> itr = croniter(\"H H * * *\", hash_id=\"hello\")\n >>> itr.get_next(datetime)\n datetime.datetime(2021, 4, 10, 11, 10)\n >>> itr = croniter(\"H H * * *\", hash_id=\"bonjour\")\n >>> itr.get_next(datetime)\n datetime.datetime(2021, 4, 10, 20, 52)\n\n\nRandom expressions\n==================\n\nRandom \"R\" definition keywords are supported, and remain consistent only within their croniter() instance.\n\n >>> itr = croniter(\"R R * * *\")\n >>> itr.get_next(datetime)\n datetime.datetime(2021, 4, 10, 22, 56)\n >>> itr.get_next(datetime)\n datetime.datetime(2021, 4, 11, 22, 56)\n >>> itr = croniter(\"R R * * *\")\n >>> itr.get_next(datetime)\n datetime.datetime(2021, 4, 11, 4, 19)\n\n\nKeyword expressions\n===================\n\nVixie cron-style \"@\" keyword expressions are supported.\nWhat they evaluate to depends on whether you supply hash_id: no hash_id corresponds to Vixie cron definitions (exact times, minute resolution), while with hash_id corresponds to Jenkins definitions (hashed within the period, second resolution).\n\n ============ ============ ================\n Keyword No hash_id With hash_id\n ============ ============ ================\n @midnight 0 0 * * * H H(0-2) * * * H\n @hourly 0 * * * * H * * * * H\n @daily 0 0 * * * H H * * * H\n @weekly 0 0 * * 0 H H * * H H\n @monthly 0 0 1 * * H H H * * H\n @yearly 0 0 1 1 * H H H H * H\n @annually 0 0 1 1 * H H H H * H\n ============ ============ ================\n\n\nUpgrading\n==========\n\nTo 2.0.0\n---------\n\n- Install or upgrade pytz by using version specified requirements/base.txt if you have it installed `<=2021.1`.\n\nDevelop this package\n====================\n\n::\n\n git clone https://github.com/kiorky/croniter.git\n cd croniter\n virtualenv --no-site-packages venv\n . venv/bin/activate\n pip install --upgrade -r requirements/test.txt\n py.test src\n\n\nMake a new release\n====================\nWe use zest.fullreleaser, a great release infrastructure.\n\nDo and follow these instructions\n::\n\n . venv/bin/activate\n pip install --upgrade -r requirements/release.txt\n ./release.sh\n\n\nContributors\n===============\nThanks to all who have contributed to this project!\nIf you have contributed and your name is not listed below please let me know.\n\n - mrmachine\n - Hinnack\n - shazow\n - kiorky\n - jlsandell\n - mag009\n - djmitche\n - GreatCombinator\n - chris-baynes\n - ipartola\n - yuzawa-san\n - lowell80 (Kintyre)\n - scop\n - zed2015\n - Ryan Finnie (rfinnie)\n\n\n\nChangelog\n==============\n\n2.0.1 (2023-10-11)\n------------------\n\n- Fix release issue [kiorky]\n\n\n2.0.0 (2023-10-10)\n------------------\n\n- Add Python 3.12 support [rafsaf]\n- Make major release instructions [kiorky]\n\n\n1.4.1 (2023-06-15)\n------------------\n\n- Make a retrocompatible version of 1.4.0 change about supporting VIXIECRON bug. (fix #47)\n [kiorky]\n\n\n1.4.0 (2023-06-15)\n------------------\n\n- Added \"implement_cron_bug\" flag to make the cron parser compatible with a bug in Vixie/ISC Cron\n [kiorky, David White <dwhite2@cisco.com>]\n *WARNING*: EXPAND METHOD CHANGES RETURN VALUE\n\n\n1.3.15 (2023-05-25)\n-------------------\n\n- Fix hashed expressions omitting some entries\n [@waltervos/Walter Vos <walter.vos@ns.nl>]\n- Enhance .match() precision for 6 position expressions\n [@szpol/szymon <szymon.polinkiewicz@gmail.com>]\n\n1.3.14 (2023-04-12)\n-------------------\n\n- Lint\n\n\n1.3.13 (2023-04-12)\n-------------------\n\n- Add check for range begin/end\n\n\n\n1.3.12 (2023-04-12)\n-------------------\n\n- restore py2 compat\n\n\n1.3.11 (2023-04-12)\n-------------------\n\n- Do not expose `i` into global namespace\n\n\n1.3.10 (2023-04-07)\n-------------------\n\n- Fix DOW hash parsing [kiorky]\n- better error handling on py3 [kiorky]\n\n1.3.8 (2022-11-22)\n------------------\n\n- Add Python 3.11 support and move docs files to main folder [rafsaf]\n\n\n1.3.7 (2022-09-06)\n------------------\n\n- fix tests\n- Fix croniter_range infinite loop [Shachar Snapiri <ssnapiri@paloaltonetworks.com>]\n\n\n1.3.5 (2022-05-14)\n------------------\n\n- Add Python 3.10 support [eelkevdbos]\n\n\n1.3.4 (2022-02-18)\n------------------\n\n- Really fix compat for tests under py27\n [kiorky]\n\n\n1.3.3 (2022-02-18)\n------------------\n\n- Fix compat for tests under py27\n [kiorky]\n\n\n1.3.2 (2022-02-18)\n------------------\n\n- Fix #12: regressions with set_current\n [kiorky, agateblue]\n\n\n1.3.1 (2022-02-15)\n------------------\n\n- Restore compat with python2\n [kiorky]\n\n\n1.3.0 (2022-02-15)\n------------------\n\n- Add a way to make next() easier to use. This fixes #11\n [kiorky]\n\n\n1.2.0 (2022-01-14)\n------------------\n\n- Enforce validation for day=1. Before this release we used to support day=0 and it was silently glided to day=1 to support having both day in day in 4th field when it came to have 6fields cron forms (second repeat). It will now raises a CroniterBadDateError. See https://github.com/kiorky/croniter/issues/6\n [kiorky]\n\n1.1.0 (2021-12-03)\n------------------\n\n- Enforce validation for month=1. Before this release we used to support month=0 and it was silently glided to month=1 to support having both day in month in 4th field when it came to have 6fields cron forms (second repeat). It will now raises a CroniterBadDateError. See https://github.com/kiorky/croniter/issues/6\n [kiorky]\n\n1.0.15 (2021-06-25)\n-------------------\n\n- restore py2 [kiorky]\n\n\n1.0.14 (2021-06-25)\n-------------------\n\n- better type checks [kiorky]\n\n\n1.0.13 (2021-05-06)\n-------------------\n\n- Fix ZeroDivisionError with ``* * R/0 * *``\n [cuu508]\n\n1.0.12 (2021-04-13)\n-------------------\n\n- Add support for hashed/random/keyword expressions\n Ryan Finnie (rfinnie)\n- Review support support for hashed/random/keyword expression and add expanders reactor\n [ kiorky ]\n\n\n1.0.11 (2021-04-07)\n-------------------\n\n- fix bug: bad case:``0 6 30 3 *``\n [zed2015(zhangchi)]\n- Add support for ``L`` in the day_of_week component. This enable expressions like ``* * * * L4``, which means last Thursday of the month. This resolves #159.\n [Kintyre]\n- Create ``CroniterUnsupportedSyntaxError`` exception for situations where CRON syntax may be valid but some combinations of features is not supported.\n Currently, this is used when the ``day_of_week`` component has a combination of literal values and nth/last syntax at the same time.\n For example, ``0 0 * * 1,L6`` or ``0 0 * * 15,sat#1`` will both raise this exception because of mixing literal days of the week with nth-weekday or last-weekday syntax.\n This *may* impact existing cron expressions in prior releases, because ``0 0 * * 15,sat#1`` was previously allowed but incorrectly handled.\n [Kintyre]\n\n- Update ``croniter_range()`` to allow an alternate ``croniter`` class to be used. Helpful when using a custom class derived from croniter.\n [Kintyre]\n\n\n1.0.10 (2021-03-25)\n-------------------\n\n- Remove external library ``natsort``.\n Sorting of cron expression components now handled with ``sorted()`` with a custom ``key`` function.\n [Kintyre]\n\n\n\n1.0.9 (2021-03-23)\n------------------\n\n- Remove futures dependency\n [kiorky]\n\n\n1.0.8 (2021-03-06)\n------------------\n\n- Update `_expand` to lowercase each component of the expression.\n This is in relation to #157. With this change, croniter accepts and correctly handles `* * 10-L * *`.\n [cuu508]\n\n\n1.0.7 (2021-03-02)\n------------------\n\n- Fix _expand to reject int literals with underscores\n [cuu508]\n- Remove a debug statement to make flake8 happy\n [cuu508]\n\n1.0.6 (2021-02-01)\n------------------\n\n- Fix combination of star and invalid expression bugs\n [kiorky]\n\n\n1.0.5 (2021-01-29)\n------------------\n\n- Security fix: fix overflow when using cron ranges\n [kiorky]\n\n1.0.4 (2021-01-29)\n------------------\n\n- Spelling fix release\n\n\n1.0.3 (2021-01-29)\n------------------\n\n- Fix #155: raise CroniterBadCronError when error syntax\n [kiorky]\n\n\n1.0.2 (2021-01-19)\n------------------\n\n- Fix match when datetime has microseconds\n [kiorky]\n\n1.0.1 (2021-01-06)\n------------------\n- no changes, just to make sense with new semver2 (making croniter on a stable state)\n [kiorky]\n\n\n0.3.37 (2020-12-31)\n-------------------\n\n- Added Python 3.8 and 3.9 support\n [eumiro]\n\n\n0.3.36 (2020-11-02)\n-------------------\n\n- Updated docs section regarding ``max_years_between_matches`` to be more shorter and hopefully more relevant.\n [Kintyre]\n- Don't install tests\n [scop]\n\n\n0.3.35 (2020-10-11)\n-------------------\n\n- Handle L in ranges. This fixes #142.\n [kiorky]\n- Add a new initialization parameter ``max_years_between_matches`` to support finding the next/previous date beyond the default 1 year window, if so desired. Updated README to include additional notes and example of this usage. Fixes #145.\n [Kintyre]\n- The ``croniter_range()`` function was updated to automatically determines the appropriate ``max_years_between_matches`` value, this preventing handling of the ``CroniterBadDateError`` exception.\n [Kintyre]\n- Updated exception handling classes: ``CroniterBadDateError`` now only\n applies during date finding operations (next/prev), and all parsing errors can now be caught using ``CroniterBadCronError``. The ``CroniterNotAlphaError`` exception is now a subclass of ``CroniterBadCronError``. A brief description of each exception class was added as an inline docstring.\n [Kintyre]\n- Updated iterable interfaces to replace the ``CroniterBadDateError`` with ``StopIteration`` if (and only if) the ``max_years_between_matches`` argument is provided. The rationale here is that if the user has specified the max tolerance between matches, then there's no need to further inform them of no additional matches. Just stop the iteration. This also keeps backwards compatibility.\n [Kintyre]\n- Minor docs update\n [Kintyre]\n\n\n0.3.34 (2020-06-19)\n-------------------\n\n- Feat ``croniter_range(start, stop, cron)``\n [Kintyre]\n- Optimization for poorly written cron expression\n [Kintyre]\n\n0.3.33 (2020-06-15)\n-------------------\n\n- Make dateutil tz support more official\n [Kintyre]\n- Feat/support for day or\n [田口信元]\n\n0.3.32 (2020-05-27)\n-------------------\n\n- document seconds repeats, fixes #122\n [kiorky]\n- Implement match method, fixes #54\n [kiorky]\n- Adding tests for #127 (test more DSTs and croniter behavior around)\n [kiorky]\n- Changed lag_hours comparison to absolute to manage dst boundary when getting previous\n [Sokkka]\n\n0.3.31 (2020-01-02)\n-------------------\n\n- Fix get_next() when start_time less then 1s before next instant\n [AlexHill]\n\n\n0.3.30 (2019-04-20)\n-------------------\n\n- credits\n\n\n0.3.29 (2019-03-26)\n-------------------\n\n- credits\n- history stripping (security)\n- Handle -Sun notation, This fixes `#119 <https://github.com/taichino/croniter/issues/119>`_.\n [kiorky]\n- Handle invalid ranges correctly, This fixes `#114 <https://github.com/taichino/croniter/issues/114>`_.\n [kiorky]\n\n0.3.25 (2018-08-07)\n-------------------\n- Pypi hygiene\n [hugovk]\n\n\n0.3.24 (2018-06-20)\n-------------------\n- fix `#107 <https://github.com/taichino/croniter/issues/107>`_: microsecond threshold\n [kiorky]\n\n\n0.3.23 (2018-05-23)\n-------------------\n\n- fix ``get_next`` while preserving the fix of ``get_prev`` in 7661c2aaa\n [Avikam Agur <avikam@pagaya-inv.com>]\n\n\n0.3.22 (2018-05-16)\n-------------------\n- Don't count previous minute if now is dynamic\n If the code is triggered from 5-asterisk based cron\n ``get_prev`` based on ``datetime.now()`` is expected to return\n current cron iteration and not previous execution.\n [Igor Khrol <igor.khrol@toptal.com>]\n\n0.3.20 (2017-11-06)\n-------------------\n\n- More DST fixes\n [Kevin Rose <kbrose@github>]\n\n\n0.3.19 (2017-08-31)\n-------------------\n\n- fix #87: backward dst changes\n [kiorky]\n\n\n0.3.18 (2017-08-31)\n-------------------\n\n- Add is valid method, refactor errors\n [otherpirate, Mauro Murari <mauro_murari@hotmail.com>]\n\n\n0.3.17 (2017-05-22)\n-------------------\n- DOW occurrence sharp style support.\n [kiorky, Kengo Seki <sekikn@apache.org>]\n\n\n0.3.16 (2017-03-15)\n-------------------\n\n- Better test suite [mrcrilly@github]\n- DST support [kiorky]\n\n0.3.15 (2017-02-16)\n-------------------\n\n- fix bug around multiple conditions and range_val in\n _get_prev_nearest_diff.\n [abeja-yuki@github]\n\n0.3.14 (2017-01-25)\n-------------------\n\n- issue #69: added day_or option to change behavior when day-of-month and\n day-of-week is given\n [Andreas Vogl <a.vogl@hackner-security.com>]\n\n\n\n0.3.13 (2016-11-01)\n-------------------\n\n- `Real fix for #34 <https://github.com/taichino/croniter/pull/73>`_\n [kiorky@github]\n- `Modernize test infra <https://github.com/taichino/croniter/pull/72>`_\n [kiorky@github]\n- `Release as a universal wheel <https://github.com/kiorky/croniter/pull/16>`_\n [adamchainz@github]\n- `Raise ValueError on negative numbers <https://github.com/taichino/croniter/pull/63>`_\n [josegonzalez@github]\n- `Compare types using \"issubclass\" instead of exact match <https://github.com/taichino/croniter/pull/70>`_\n [darkk@github]\n- `Implement step cron with a variable base <https://github.com/taichino/croniter/pull/60>`_\n [josegonzalez@github]\n\n0.3.12 (2016-03-10)\n-------------------\n- support setting ret_type in __init__ [Brent Tubbs <brent.tubbs@gmail.com>]\n\n0.3.11 (2016-01-13)\n-------------------\n\n- Bug fix: The get_prev API crashed when last day of month token was used. Some\n essential logic was missing.\n [Iddo Aviram <iddo.aviram@similarweb.com>]\n\n\n0.3.10 (2015-11-29)\n-------------------\n\n- The functionality of 'l' as day of month was broken, since the month variable\n was not properly updated\n [Iddo Aviram <iddo.aviram@similarweb.com>]\n\n0.3.9 (2015-11-19)\n------------------\n\n- Don't use datetime functions python 2.6 doesn't support\n [petervtzand]\n\n0.3.8 (2015-06-23)\n------------------\n- Truncate microseconds by setting to 0\n [Corey Wright]\n\n\n0.3.7 (2015-06-01)\n------------------\n\n- converting sun in range sun-thu transforms to int 0 which is\n recognized as empty string; the solution was to convert sun to string \"0\"\n\n0.3.6 (2015-05-29)\n------------------\n\n- Fix default behavior when no start_time given\n Default value for ``start_time`` parameter is calculated at module init time rather than call time.\n- Fix timezone support and stop depending on the system time zone\n\n\n\n0.3.5 (2014-08-01)\n------------------\n\n- support for 'l' (last day of month)\n\n\n0.3.4 (2014-01-30)\n------------------\n\n- Python 3 compat\n- QA Release\n\n\n0.3.3 (2012-09-29)\n------------------\n- proper packaging\n\n\n\n",
- "keywords": [
- "datetime",
- "iterator",
- "cron"
- ],
- "home_page": "http://github.com/kiorky/croniter",
- "author": "Matsumoto Taichi, kiorky",
- "author_email": "taichino@gmail.com, kiorky@cryptelium.net",
- "license": "MIT License",
- "classifier": [
- "Development Status :: 4 - Beta",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: POSIX",
- "Programming Language :: Python",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.6",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.4",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ],
- "requires_dist": [
- "python-dateutil",
- "pytz (>2021.1)"
- ],
- "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/eb/4b/f86cc66c632cf0948ca1712aadd255f624deef1cd371ea3bfd30851e188d/cryptography-41.0.4-cp37-abi3-manylinux_2_28_x86_64.whl",
- "archive_info": {
- "hash": "sha256=2ed09183922d66c4ec5fdaa59b4d14e105c084dd0febd27452de8f6f74704143",
- "hashes": {
- "sha256": "2ed09183922d66c4ec5fdaa59b4d14e105c084dd0febd27452de8f6f74704143"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "cryptography",
- "version": "41.0.4",
- "summary": "cryptography is a package which provides cryptographic recipes and primitives to Python developers.",
- "description": "pyca/cryptography\n=================\n\n.. image:: https://img.shields.io/pypi/v/cryptography.svg\n :target: https://pypi.org/project/cryptography/\n :alt: Latest Version\n\n.. image:: https://readthedocs.org/projects/cryptography/badge/?version=latest\n :target: https://cryptography.io\n :alt: Latest Docs\n\n.. image:: https://github.com/pyca/cryptography/workflows/CI/badge.svg?branch=main\n :target: https://github.com/pyca/cryptography/actions?query=workflow%3ACI+branch%3Amain\n\n\n``cryptography`` is a package which provides cryptographic recipes and\nprimitives to Python developers. Our goal is for it to be your \"cryptographic\nstandard library\". It supports Python 3.7+ and PyPy3 7.3.10+.\n\n``cryptography`` includes both high level recipes and low level interfaces to\ncommon cryptographic algorithms such as symmetric ciphers, message digests, and\nkey derivation functions. For example, to encrypt something with\n``cryptography``'s high level symmetric encryption recipe:\n\n.. code-block:: pycon\n\n >>> from cryptography.fernet import Fernet\n >>> # Put this somewhere safe!\n >>> key = Fernet.generate_key()\n >>> f = Fernet(key)\n >>> token = f.encrypt(b\"A really secret message. Not for prying eyes.\")\n >>> token\n b'...'\n >>> f.decrypt(token)\n b'A really secret message. Not for prying eyes.'\n\nYou can find more information in the `documentation`_.\n\nYou can install ``cryptography`` with:\n\n.. code-block:: console\n\n $ pip install cryptography\n\nFor full details see `the installation documentation`_.\n\nDiscussion\n~~~~~~~~~~\n\nIf you run into bugs, you can file them in our `issue tracker`_.\n\nWe maintain a `cryptography-dev`_ mailing list for development discussion.\n\nYou can also join ``#pyca`` on ``irc.libera.chat`` to ask questions or get\ninvolved.\n\nSecurity\n~~~~~~~~\n\nNeed to report a security issue? Please consult our `security reporting`_\ndocumentation.\n\n\n.. _`documentation`: https://cryptography.io/\n.. _`the installation documentation`: https://cryptography.io/en/latest/installation/\n.. _`issue tracker`: https://github.com/pyca/cryptography/issues\n.. _`cryptography-dev`: https://mail.python.org/mailman/listinfo/cryptography-dev\n.. _`security reporting`: https://cryptography.io/en/latest/security/\n",
- "description_content_type": "text/x-rst",
- "author_email": "The Python Cryptographic Authority and individual contributors <cryptography-dev@python.org>",
- "license": "Apache-2.0 OR BSD-3-Clause",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Apache Software License",
- "License :: OSI Approved :: BSD License",
- "Natural Language :: English",
- "Operating System :: MacOS :: MacOS X",
- "Operating System :: POSIX",
- "Operating System :: POSIX :: BSD",
- "Operating System :: POSIX :: Linux",
- "Operating System :: Microsoft :: Windows",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Security :: Cryptography"
- ],
- "requires_dist": [
- "cffi >=1.12",
- "sphinx >=5.3.0 ; extra == 'docs'",
- "sphinx-rtd-theme >=1.1.1 ; extra == 'docs'",
- "pyenchant >=1.6.11 ; extra == 'docstest'",
- "twine >=1.12.0 ; extra == 'docstest'",
- "sphinxcontrib-spelling >=4.0.1 ; extra == 'docstest'",
- "nox ; extra == 'nox'",
- "black ; extra == 'pep8test'",
- "ruff ; extra == 'pep8test'",
- "mypy ; extra == 'pep8test'",
- "check-sdist ; extra == 'pep8test'",
- "build ; extra == 'sdist'",
- "bcrypt >=3.1.5 ; extra == 'ssh'",
- "pytest >=6.2.0 ; extra == 'test'",
- "pytest-benchmark ; extra == 'test'",
- "pytest-cov ; extra == 'test'",
- "pytest-xdist ; extra == 'test'",
- "pretend ; extra == 'test'",
- "pytest-randomly ; extra == 'test-randomorder'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "homepage, https://github.com/pyca/cryptography",
- "documentation, https://cryptography.io/",
- "source, https://github.com/pyca/cryptography/",
- "issues, https://github.com/pyca/cryptography/issues",
- "changelog, https://cryptography.io/en/latest/changelog/"
- ],
- "provides_extra": [
- "docs",
- "docstest",
- "nox",
- "pep8test",
- "sdist",
- "ssh",
- "test",
- "test-randomorder"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/20/8d/778b7d51b981a96554f29136cd59ca7880bf58094338085bcf2a979a0e6a/Deprecated-1.2.14-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c",
- "hashes": {
- "sha256": "6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "Deprecated",
- "version": "1.2.14",
- "platform": [
- "any"
- ],
- "summary": "Python @deprecated decorator to deprecate old python classes, functions or methods.",
- "description": "\nDeprecated Library\n------------------\n\nDeprecated is Easy to Use\n`````````````````````````\n\nIf you need to mark a function or a method as deprecated,\nyou can use the ``@deprecated`` decorator:\n\nSave in a hello.py:\n\n.. code:: python\n\n from deprecated import deprecated\n\n\n @deprecated(version='1.2.1', reason=\"You should use another function\")\n def some_old_function(x, y):\n return x + y\n\n\n class SomeClass(object):\n @deprecated(version='1.3.0', reason=\"This method is deprecated\")\n def some_old_method(self, x, y):\n return x + y\n\n\n some_old_function(12, 34)\n obj = SomeClass()\n obj.some_old_method(5, 8)\n\n\nAnd Easy to Setup\n`````````````````\n\nAnd run it:\n\n.. code:: bash\n\n $ pip install Deprecated\n $ python hello.py\n hello.py:15: DeprecationWarning: Call to deprecated function (or staticmethod) some_old_function.\n (You should use another function) -- Deprecated since version 1.2.0.\n some_old_function(12, 34)\n hello.py:17: DeprecationWarning: Call to deprecated method some_old_method.\n (This method is deprecated) -- Deprecated since version 1.3.0.\n obj.some_old_method(5, 8)\n\n\nYou can document your code\n``````````````````````````\n\nHave you ever wonder how to document that some functions, classes, methods, etc. are deprecated?\nThis is now possible with the integrated Sphinx directives:\n\nFor instance, in hello_sphinx.py:\n\n.. code:: python\n\n from deprecated.sphinx import deprecated\n from deprecated.sphinx import versionadded\n from deprecated.sphinx import versionchanged\n\n\n @versionadded(version='1.0', reason=\"This function is new\")\n def function_one():\n '''This is the function one'''\n\n\n @versionchanged(version='1.0', reason=\"This function is modified\")\n def function_two():\n '''This is the function two'''\n\n\n @deprecated(version='1.0', reason=\"This function will be removed soon\")\n def function_three():\n '''This is the function three'''\n\n\n function_one()\n function_two()\n function_three() # warns\n\n help(function_one)\n help(function_two)\n help(function_three)\n\n\nThe result it immediate\n```````````````````````\n\nRun it:\n\n.. code:: bash\n\n $ python hello_sphinx.py\n\n hello_sphinx.py:23: DeprecationWarning: Call to deprecated function (or staticmethod) function_three.\n (This function will be removed soon) -- Deprecated since version 1.0.\n function_three() # warns\n\n Help on function function_one in module __main__:\n\n function_one()\n This is the function one\n\n .. versionadded:: 1.0\n This function is new\n\n Help on function function_two in module __main__:\n\n function_two()\n This is the function two\n\n .. versionchanged:: 1.0\n This function is modified\n\n Help on function function_three in module __main__:\n\n function_three()\n This is the function three\n\n .. deprecated:: 1.0\n This function will be removed soon\n\n\nLinks\n`````\n\n* `Python package index (PyPi) <https://pypi.python.org/pypi/deprecated>`_\n* `GitHub website <https://github.com/tantale/deprecated>`_\n* `Read The Docs <https://readthedocs.org/projects/deprecated>`_\n* `EBook on Lulu.com <http://www.lulu.com/commerce/index.php?fBuyContent=21305117>`_\n* `StackOverFlow Q&A <https://stackoverflow.com/a/40301488/1513933>`_\n* `Development version\n <https://github.com/tantale/deprecated/zipball/master#egg=Deprecated-dev>`_\n\n",
- "description_content_type": "text/x-rst",
- "keywords": [
- "deprecate",
- "deprecated",
- "deprecation",
- "warning",
- "warn",
- "decorator"
- ],
- "home_page": "https://github.com/tantale/deprecated",
- "author": "Laurent LAPORTE",
- "author_email": "tantale.solutions@gmail.com",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.4",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ],
- "requires_dist": [
- "wrapt (<2,>=1.10)",
- "tox ; extra == 'dev'",
- "PyTest ; extra == 'dev'",
- "PyTest-Cov ; extra == 'dev'",
- "bump2version (<1) ; extra == 'dev'",
- "sphinx (<2) ; extra == 'dev'"
- ],
- "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
- "project_url": [
- "Documentation, https://deprecated.readthedocs.io/en/latest/",
- "Source, https://github.com/tantale/deprecated",
- "Bug Tracker, https://github.com/tantale/deprecated/issues"
- ],
- "provides_extra": [
- "dev"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/f5/3a/74a29b11cf2cdfcd6ba89c0cecd70b37cd1ba7b77978ce611eb7a146a832/dill-0.3.7-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e",
- "hashes": {
- "sha256": "76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "dill",
- "version": "0.3.7",
- "platform": [
- "Linux",
- "Windows",
- "Mac"
- ],
- "summary": "serialize all of Python",
- "description": "-----------------------------\ndill: serialize all of Python\n-----------------------------\n\nAbout Dill\n==========\n\n``dill`` extends Python's ``pickle`` module for serializing and de-serializing\nPython objects to the majority of the built-in Python types. Serialization\nis the process of converting an object to a byte stream, and the inverse\nof which is converting a byte stream back to a Python object hierarchy.\n\n``dill`` provides the user the same interface as the ``pickle`` module, and\nalso includes some additional features. In addition to pickling Python\nobjects, ``dill`` provides the ability to save the state of an interpreter\nsession in a single command. Hence, it would be feasible to save an\ninterpreter session, close the interpreter, ship the pickled file to\nanother computer, open a new interpreter, unpickle the session and\nthus continue from the 'saved' state of the original interpreter\nsession.\n\n``dill`` can be used to store Python objects to a file, but the primary\nusage is to send Python objects across the network as a byte stream.\n``dill`` is quite flexible, and allows arbitrary user defined classes\nand functions to be serialized. Thus ``dill`` is not intended to be\nsecure against erroneously or maliciously constructed data. It is\nleft to the user to decide whether the data they unpickle is from\na trustworthy source.\n\n``dill`` is part of ``pathos``, a Python framework for heterogeneous computing.\n``dill`` is in active development, so any user feedback, bug reports, comments,\nor suggestions are highly appreciated. A list of issues is located at\nhttps://github.com/uqfoundation/dill/issues, with a legacy list maintained at\nhttps://uqfoundation.github.io/project/pathos/query.\n\n\nMajor Features\n==============\n\n``dill`` can pickle the following standard types:\n\n - none, type, bool, int, float, complex, bytes, str,\n - tuple, list, dict, file, buffer, builtin,\n - Python classes, namedtuples, dataclasses, metaclasses,\n - instances of classes,\n - set, frozenset, array, functions, exceptions\n\n``dill`` can also pickle more 'exotic' standard types:\n\n - functions with yields, nested functions, lambdas,\n - cell, method, unboundmethod, module, code, methodwrapper,\n - methoddescriptor, getsetdescriptor, memberdescriptor, wrapperdescriptor,\n - dictproxy, slice, notimplemented, ellipsis, quit\n\n``dill`` cannot yet pickle these standard types:\n\n - frame, generator, traceback\n\n``dill`` also provides the capability to:\n\n - save and load Python interpreter sessions\n - save and extract the source code from functions and classes\n - interactively diagnose pickling errors\n\n\nCurrent Release\n===============\n\nThe latest released version of ``dill`` is available from:\n\n https://pypi.org/project/dill\n\n``dill`` is distributed under a 3-clause BSD license.\n\n\nDevelopment Version\n===================\n\nYou can get the latest development version with all the shiny new features at:\n\n https://github.com/uqfoundation\n\nIf you have a new contribution, please submit a pull request.\n\n\nInstallation\n============\n\n``dill`` can be installed with ``pip``::\n\n $ pip install dill\n\nTo optionally include the ``objgraph`` diagnostic tool in the install::\n\n $ pip install dill[graph]\n\nFor windows users, to optionally install session history tools::\n\n $ pip install dill[readline]\n\n\nRequirements\n============\n\n``dill`` requires:\n\n - ``python`` (or ``pypy``), **>=3.7**\n - ``setuptools``, **>=42**\n\nOptional requirements:\n\n - ``objgraph``, **>=1.7.2**\n - ``pyreadline``, **>=1.7.1** (on windows)\n\n\nBasic Usage\n===========\n\n``dill`` is a drop-in replacement for ``pickle``. Existing code can be\nupdated to allow complete pickling using::\n\n >>> import dill as pickle\n\nor::\n\n >>> from dill import dumps, loads\n\n``dumps`` converts the object to a unique byte string, and ``loads`` performs\nthe inverse operation::\n\n >>> squared = lambda x: x**2\n >>> loads(dumps(squared))(3)\n 9\n\nThere are a number of options to control serialization which are provided\nas keyword arguments to several ``dill`` functions:\n\n* with *protocol*, the pickle protocol level can be set. This uses the\n same value as the ``pickle`` module, *DEFAULT_PROTOCOL*.\n* with *byref=True*, ``dill`` to behave a lot more like pickle with\n certain objects (like modules) pickled by reference as opposed to\n attempting to pickle the object itself.\n* with *recurse=True*, objects referred to in the global dictionary are\n recursively traced and pickled, instead of the default behavior of\n attempting to store the entire global dictionary.\n* with *fmode*, the contents of the file can be pickled along with the file\n handle, which is useful if the object is being sent over the wire to a\n remote system which does not have the original file on disk. Options are\n *HANDLE_FMODE* for just the handle, *CONTENTS_FMODE* for the file content\n and *FILE_FMODE* for content and handle.\n* with *ignore=False*, objects reconstructed with types defined in the\n top-level script environment use the existing type in the environment\n rather than a possibly different reconstructed type.\n\nThe default serialization can also be set globally in *dill.settings*.\nThus, we can modify how ``dill`` handles references to the global dictionary\nlocally or globally::\n\n >>> import dill.settings\n >>> dumps(absolute) == dumps(absolute, recurse=True)\n False\n >>> dill.settings['recurse'] = True\n >>> dumps(absolute) == dumps(absolute, recurse=True)\n True\n\n``dill`` also includes source code inspection, as an alternate to pickling::\n\n >>> import dill.source\n >>> print(dill.source.getsource(squared))\n squared = lambda x:x**2\n\nTo aid in debugging pickling issues, use *dill.detect* which provides\ntools like pickle tracing::\n\n >>> import dill.detect\n >>> with dill.detect.trace():\n >>> dumps(squared)\n ┬ F1: <function <lambda> at 0x7fe074f8c280>\n ├┬ F2: <function _create_function at 0x7fe074c49c10>\n │└ # F2 [34 B]\n ├┬ Co: <code object <lambda> at 0x7fe07501eb30, file \"<stdin>\", line 1>\n │├┬ F2: <function _create_code at 0x7fe074c49ca0>\n ││└ # F2 [19 B]\n │└ # Co [87 B]\n ├┬ D1: <dict object at 0x7fe0750d4680>\n │└ # D1 [22 B]\n ├┬ D2: <dict object at 0x7fe074c5a1c0>\n │└ # D2 [2 B]\n ├┬ D2: <dict object at 0x7fe074f903c0>\n │├┬ D2: <dict object at 0x7fe074f8ebc0>\n ││└ # D2 [2 B]\n │└ # D2 [23 B]\n └ # F1 [180 B]\n\nWith trace, we see how ``dill`` stored the lambda (``F1``) by first storing\n``_create_function``, the underlying code object (``Co``) and ``_create_code``\n(which is used to handle code objects), then we handle the reference to\nthe global dict (``D2``) plus other dictionaries (``D1`` and ``D2``) that\nsave the lambda object's state. A ``#`` marks when the object is actually stored.\n\n\nMore Information\n================\n\nProbably the best way to get started is to look at the documentation at\nhttp://dill.rtfd.io. Also see ``dill.tests`` for a set of scripts that\ndemonstrate how ``dill`` can serialize different Python objects. You can\nrun the test suite with ``python -m dill.tests``. The contents of any\npickle file can be examined with ``undill``. As ``dill`` conforms to\nthe ``pickle`` interface, the examples and documentation found at\nhttp://docs.python.org/library/pickle.html also apply to ``dill``\nif one will ``import dill as pickle``. The source code is also generally\nwell documented, so further questions may be resolved by inspecting the\ncode itself. Please feel free to submit a ticket on github, or ask a\nquestion on stackoverflow (**@Mike McKerns**).\nIf you would like to share how you use ``dill`` in your work, please send\nan email (to **mmckerns at uqfoundation dot org**).\n\n\nCitation\n========\n\nIf you use ``dill`` to do research that leads to publication, we ask that you\nacknowledge use of ``dill`` by citing the following in your publication::\n\n M.M. McKerns, L. Strand, T. Sullivan, A. Fang, M.A.G. Aivazis,\n \"Building a framework for predictive science\", Proceedings of\n the 10th Python in Science Conference, 2011;\n http://arxiv.org/pdf/1202.1056\n\n Michael McKerns and Michael Aivazis,\n \"pathos: a framework for heterogeneous computing\", 2010- ;\n https://uqfoundation.github.io/project/pathos\n\nPlease see https://uqfoundation.github.io/project/pathos or\nhttp://arxiv.org/pdf/1202.1056 for further information.\n",
- "home_page": "https://github.com/uqfoundation/dill",
- "download_url": "https://pypi.org/project/dill/#files",
- "author": "Mike McKerns",
- "author_email": "mmckerns@uqfoundation.org",
- "maintainer": "Mike McKerns",
- "maintainer_email": "mmckerns@uqfoundation.org",
- "license": "BSD-3-Clause",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "Intended Audience :: Science/Research",
- "License :: OSI Approved :: BSD License",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Scientific/Engineering",
- "Topic :: Software Development"
- ],
- "requires_dist": [
- "objgraph (>=1.7.2) ; extra == 'graph'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Documentation, http://dill.rtfd.io",
- "Source Code, https://github.com/uqfoundation/dill",
- "Bug Tracker, https://github.com/uqfoundation/dill/issues"
- ],
- "provides_extra": [
- "graph",
- "readline"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/f6/b4/0a9bee52c50f226a3cbfb54263d02bb421c7f2adc136520729c2c689c1e5/dnspython-2.4.2-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=57c6fbaaeaaf39c891292012060beb141791735dbb4004798328fc2c467402d8",
- "hashes": {
- "sha256": "57c6fbaaeaaf39c891292012060beb141791735dbb4004798328fc2c467402d8"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "dnspython",
- "version": "2.4.2",
- "summary": "DNS toolkit",
- "description": "# dnspython\n\n[](https://github.com/rthalley/dnspython/actions/)\n[](https://dnspython.readthedocs.io/en/latest/?badge=latest)\n[](https://badge.fury.io/py/dnspython)\n[](https://opensource.org/licenses/ISC)\n[](https://codecov.io/github/rthalley/dnspython)\n[](https://github.com/psf/black)\n\n## INTRODUCTION\n\ndnspython is a DNS toolkit for Python. It supports almost all record types. It\ncan be used for queries, zone transfers, and dynamic updates. It supports TSIG\nauthenticated messages and EDNS0.\n\ndnspython provides both high and low level access to DNS. The high level classes\nperform queries for data of a given name, type, and class, and return an answer\nset. The low level classes allow direct manipulation of DNS zones, messages,\nnames, and records.\n\nTo see a few of the ways dnspython can be used, look in the `examples/`\ndirectory.\n\ndnspython is a utility to work with DNS, `/etc/hosts` is thus not used. For\nsimple forward DNS lookups, it's better to use `socket.getaddrinfo()` or\n`socket.gethostbyname()`.\n\ndnspython originated at Nominum where it was developed\nto facilitate the testing of DNS software.\n\n## ABOUT THIS RELEASE\n\nThis is dnspython 2.4.2.\nPlease read\n[What's New](https://dnspython.readthedocs.io/en/stable/whatsnew.html) for\ninformation about the changes in this release.\n\n## INSTALLATION\n\n* Many distributions have dnspython packaged for you, so you should\n check there first.\n* To use a wheel downloaded from PyPi, run:\n\n pip install dnspython\n\n* To install from the source code, go into the top-level of the source code\n and run:\n\n```\n pip install --upgrade pip build\n python -m build\n pip install dist/*.whl\n```\n\n* To install the latest from the master branch, run `pip install git+https://github.com/rthalley/dnspython.git`\n\nDnspython's default installation does not depend on any modules other than\nthose in the Python standard library. To use some features, additional modules\nmust be installed. For convenience, pip options are defined for the\nrequirements.\n\nIf you want to use DNS-over-HTTPS, run\n`pip install dnspython[doh]`.\n\nIf you want to use DNSSEC functionality, run\n`pip install dnspython[dnssec]`.\n\nIf you want to use internationalized domain names (IDNA)\nfunctionality, you must run\n`pip install dnspython[idna]`\n\nIf you want to use the Trio asynchronous I/O package, run\n`pip install dnspython[trio]`.\n\nIf you want to use WMI on Windows to determine the active DNS settings\ninstead of the default registry scanning method, run\n`pip install dnspython[wmi]`.\n\nIf you want to try the experimental DNS-over-QUIC code, run\n`pip install dnspython[doq]`.\n\nNote that you can install any combination of the above, e.g.:\n`pip install dnspython[doh,dnssec,idna]`\n\n### Notices\n\nPython 2.x support ended with the release of 1.16.0. Dnspython 2.0.0 through\n2.2.x support Python 3.6 and later. For dnspython 2.3.x, the minimum\nsupported Python version is 3.7, and for 2.4.x the minimum supported verison is 3.8.\nWe plan to align future support with the lifetime of the Python 3 versions.\n\nDocumentation has moved to\n[dnspython.readthedocs.io](https://dnspython.readthedocs.io).\n\n",
- "description_content_type": "text/markdown",
- "home_page": "https://www.dnspython.org",
- "author": "Bob Halley",
- "author_email": "halley@dnspython.org",
- "license": "ISC",
- "classifier": [
- "License :: OSI Approved",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11"
- ],
- "requires_dist": [
- "aioquic (>=0.9.20) ; extra == \"doq\"",
- "cryptography (>=2.6,<42.0) ; extra == \"dnssec\"",
- "h2 (>=4.1.0) ; extra == \"doh\"",
- "httpcore (>=0.17.3) ; extra == \"doh\"",
- "httpx (>=0.24.1) ; extra == \"doh\"",
- "idna (>=2.1,<4.0) ; extra == \"idna\"",
- "trio (>=0.14,<0.23) ; extra == \"trio\"",
- "wmi (>=1.5.1,<2.0.0) ; extra == \"wmi\""
- ],
- "requires_python": ">=3.8,<4.0",
- "project_url": [
- "Bug Tracker, https://github.com/rthalley/dnspython/issues",
- "Documentation, https://dnspython.readthedocs.io/en/stable/",
- "Repository, https://github.com/rthalley/dnspython.git"
- ],
- "provides_extra": [
- "dnssec",
- "doh",
- "doq",
- "idna",
- "trio",
- "wmi"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6",
- "hashes": {
- "sha256": "96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "docutils",
- "version": "0.20.1",
- "platform": [
- "OS-independent"
- ],
- "summary": "Docutils -- Python Documentation Utilities",
- "description": "Docutils is a modular system for processing documentation\ninto useful formats, such as HTML, XML, and LaTeX. For\ninput Docutils supports reStructuredText, an easy-to-read,\nwhat-you-see-is-what-you-get plaintext markup syntax.\n\n",
- "home_page": "https://docutils.sourceforge.io/",
- "author": "David Goodger",
- "author_email": "goodger@python.org",
- "maintainer": "docutils-develop list",
- "maintainer_email": "docutils-develop@lists.sourceforge.net",
- "license": "public domain, Python, 2-Clause BSD, GPL 3 (see COPYING.txt)",
- "classifier": [
- "Development Status :: 4 - Beta",
- "Environment :: Console",
- "Intended Audience :: End Users/Desktop",
- "Intended Audience :: Other Audience",
- "Intended Audience :: Developers",
- "Intended Audience :: System Administrators",
- "License :: Public Domain",
- "License :: OSI Approved :: Python Software Foundation License",
- "License :: OSI Approved :: BSD License",
- "License :: OSI Approved :: GNU General Public License (GPL)",
- "Operating System :: OS Independent",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Topic :: Documentation",
- "Topic :: Software Development :: Documentation",
- "Topic :: Text Processing",
- "Natural Language :: English",
- "Natural Language :: Afrikaans",
- "Natural Language :: Arabic",
- "Natural Language :: Catalan",
- "Natural Language :: Chinese (Simplified)",
- "Natural Language :: Chinese (Traditional)",
- "Natural Language :: Czech",
- "Natural Language :: Danish",
- "Natural Language :: Dutch",
- "Natural Language :: Esperanto",
- "Natural Language :: Finnish",
- "Natural Language :: French",
- "Natural Language :: Galician",
- "Natural Language :: German",
- "Natural Language :: Hebrew",
- "Natural Language :: Italian",
- "Natural Language :: Japanese",
- "Natural Language :: Korean",
- "Natural Language :: Latvian",
- "Natural Language :: Lithuanian",
- "Natural Language :: Persian",
- "Natural Language :: Polish",
- "Natural Language :: Portuguese (Brazilian)",
- "Natural Language :: Russian",
- "Natural Language :: Slovak",
- "Natural Language :: Spanish",
- "Natural Language :: Swedish",
- "Natural Language :: Ukrainian"
- ],
- "requires_python": ">=3.7"
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/ba/ec/adc595d04e795b04bb0028fc6b067713fdb4a7e8cec44b428f7144fc432e/email_validator-1.3.1-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=49a72f5fa6ed26be1c964f0567d931d10bf3fdeeacdf97bc26ef1cd2a44e0bda",
- "hashes": {
- "sha256": "49a72f5fa6ed26be1c964f0567d931d10bf3fdeeacdf97bc26ef1cd2a44e0bda"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "email-validator",
- "version": "1.3.1",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "A robust email address syntax and deliverability validation library.",
- "description": "email-validator: Validate Email Addresses\n=========================================\n\nA robust email address syntax and deliverability validation library for\nPython by [Joshua Tauberer](https://joshdata.me).\n\nThis library validates that a string is of the form `name@example.com`. This is\nthe sort of validation you would want for an email-based login form on \na website.\n\nKey features:\n\n* Checks that an email address has the correct syntax --- good for\n login forms or other uses related to identifying users.\n* Gives friendly error messages when validation fails (appropriate to show\n to end users).\n* (optionally) Checks deliverability: Does the domain name resolve? And you can override the default DNS resolver.\n* Supports internationalized domain names and (optionally)\n internationalized local parts, but blocks unsafe characters.\n* Normalizes email addresses (super important for internationalized\n addresses! see below).\n\nThe library is NOT for validation of the To: line in an email message\n(e.g. `My Name <my@address.com>`), which\n[flanker](https://github.com/mailgun/flanker) is more appropriate for.\nAnd this library does NOT permit obsolete forms of email addresses, so\nif you need strict validation against the email specs exactly, use\n[pyIsEmail](https://github.com/michaelherold/pyIsEmail).\n\nThis library is tested with Python 3.6+ but should work in earlier versions:\n\n[](https://app.travis-ci.com/JoshData/python-email-validator)\n\nView the [CHANGELOG / Release Notes](CHANGELOG.md) for the version history of changes in the library. Occasionally this README is ahead of the latest published package --- see the CHANGELOG for details.\n\n---\n\nInstallation\n------------\n\nThis package [is on PyPI](https://pypi.org/project/email-validator/), so:\n\n```sh\npip install email-validator\n```\n\n`pip3` also works.\n\nQuick Start\n-----------\n\nIf you're validating a user's email address before creating a user\naccount in your application, you might do this:\n\n```python\nfrom email_validator import validate_email, EmailNotValidError\n\nemail = \"my+address@mydomain.tld\"\nis_new_account = True # False for login pages\n\ntry:\n # Check that the email address is valid.\n validation = validate_email(email, check_deliverability=is_new_account)\n\n # Take the normalized form of the email address\n # for all logic beyond this point (especially\n # before going to a database query where equality\n # may not take into account Unicode normalization). \n email = validation.email\nexcept EmailNotValidError as e:\n # Email is not valid.\n # The exception message is human-readable.\n print(str(e))\n```\n\nThis validates the address and gives you its normalized form. You should\n**put the normalized form in your database** and always normalize before\nchecking if an address is in your database. When using this in a login form,\nset `check_deliverability` to `False` to avoid unnecessary DNS queries.\n\nUsage\n-----\n\n### Overview\n\nThe module provides a function `validate_email(email_address)` which\ntakes an email address (either a `str` or `bytes`, but only non-internationalized\naddresses are allowed when passing a `bytes`) and:\n\n- Raises a `EmailNotValidError` with a helpful, human-readable error\n message explaining why the email address is not valid, or\n- Returns an object with a normalized form of the email address (which\n you should use!) and other information about it.\n\nWhen an email address is not valid, `validate_email` raises either an\n`EmailSyntaxError` if the form of the address is invalid or an\n`EmailUndeliverableError` if the domain name fails DNS checks. Both\nexception classes are subclasses of `EmailNotValidError`, which in turn\nis a subclass of `ValueError`.\n\nBut when an email address is valid, an object is returned containing\na normalized form of the email address (which you should use!) and\nother information.\n\nThe validator doesn't permit obsoleted forms of email addresses that no\none uses anymore even though they are still valid and deliverable, since\nthey will probably give you grief if you're using email for login. (See\nlater in the document about that.)\n\nThe validator checks that the domain name in the email address has a\nDNS MX record (except a NULL MX record) indicating that it can receive\nemail (or a fallback A-record, see below).\nThere is nothing to be gained by trying to actually contact an SMTP\nserver, so that's not done here. For privacy, security, and practicality\nreasons servers are good at not giving away whether an address is\ndeliverable or not: email addresses that appear to accept mail at first\ncan bounce mail after a delay, and bounced mail may indicate a temporary\nfailure of a good email address (sometimes an intentional failure, like\ngreylisting).\n\n### Options\n\nThe `validate_email` function also accepts the following keyword arguments\n(defaults are as shown below):\n\n`allow_smtputf8=True`: Set to `False` to prohibit internationalized addresses that would\n require the\n [SMTPUTF8](https://tools.ietf.org/html/rfc6531) extension. You can also set `email_validator.ALLOW_SMTPUTF8` to `False` to turn it off for all calls by default.\n\n`check_deliverability=True`: If true, a DNS query is made to check that a non-null MX record is present for the domain-part of the email address (or if not, an A/AAAA record as an MX fallback can be present but in that case a reject-all SPF record must not be present). Set to `False` to skip this DNS-based check. DNS is slow and sometimes unavailable, so consider whether these checks are useful for your use case. It is recommended to pass `False` when performing validation for login pages (but not account creation pages) since re-validation of a previously validated domain in your database by querying DNS at every login is probably undesirable. You can also set `email_validator.CHECK_DELIVERABILITY` to `False` to turn this off for all calls by default.\n\n`allow_empty_local=False`: Set to `True` to allow an empty local part (i.e.\n `@example.com`), e.g. for validating Postfix aliases.\n \n`dns_resolver=None`: Pass an instance of [dns.resolver.Resolver](https://dnspython.readthedocs.io/en/latest/resolver-class.html) to control the DNS resolver including setting a timeout and [a cache](https://dnspython.readthedocs.io/en/latest/resolver-caching.html). The `caching_resolver` function shown above is a helper function to construct a dns.resolver.Resolver with a [LRUCache](https://dnspython.readthedocs.io/en/latest/resolver-caching.html#dns.resolver.LRUCache). Reuse the same resolver instance across calls to `validate_email` to make use of the cache.\n\n`test_environment=False`: DNS-based deliverability checks are disabled and `test` and `subdomain.test` domain names are permitted (see below). You can also set `email_validator.TEST_ENVIRONMENT` to `True` to turn it on for all calls by default.\n\n### DNS timeout and cache\n\nWhen validating many email addresses or to control the timeout (the default is 15 seconds), create a caching [dns.resolver.Resolver](https://dnspython.readthedocs.io/en/latest/resolver-class.html) to reuse in each call. The `caching_resolver` function returns one easily for you:\n\n```python\nfrom email_validator import validate_email, caching_resolver\n\nresolver = caching_resolver(timeout=10)\n\nwhile True:\n email = validate_email(email, dns_resolver=resolver).email\n```\n\n### Test addresses\n\nThis library rejects email addresess that use the [Special Use Domain Names](https://www.iana.org/assignments/special-use-domain-names/special-use-domain-names.xhtml) `invalid`, `localhost`, `test`, and some others by raising `EmailSyntaxError`. This is to protect your system from abuse: You probably don't want a user to be able to cause an email to be sent to `localhost`. However, in your non-production test environments you may want to use `@test` or `@myname.test` email addresses. There are three ways you can allow this:\n\n1. Add `test_environment=True` to the call to `validate_email` (see above).\n2. Set `email_validator.TEST_ENVIRONMENT` to `True`.\n3. Remove the special-use domain name that you want to use from `email_validator.SPECIAL_USE_DOMAIN_NAMES`:\n\n```python\nimport email_validator\nemail_validator.SPECIAL_USE_DOMAIN_NAMES.remove(\"test\")\n```\n\nIt is tempting to use `@example.com/net/org` in tests. These domains are reserved to IANA for use in documentation so there is no risk of accidentally emailing someone at those domains. But beware that this library will reject these domain names if DNS-based deliverability checks are not disabled because these domains do not resolve to domains that accept email. In tests, consider using your own domain name or `@test` or `@myname.test` instead.\n\nInternationalized email addresses\n---------------------------------\n\nThe email protocol SMTP and the domain name system DNS have historically\nonly allowed English (ASCII) characters in email addresses and domain names,\nrespectively. Each has adapted to internationalization in a separate\nway, creating two separate aspects to email address\ninternationalization.\n\n### Internationalized domain names (IDN)\n\nThe first is [internationalized domain names (RFC\n5891)](https://tools.ietf.org/html/rfc5891), a.k.a IDNA 2008. The DNS\nsystem has not been updated with Unicode support. Instead, internationalized\ndomain names are converted into a special IDNA ASCII \"[Punycode](https://www.rfc-editor.org/rfc/rfc3492.txt)\"\nform starting with `xn--`. When an email address has non-ASCII\ncharacters in its domain part, the domain part is replaced with its IDNA\nASCII equivalent form in the process of mail transmission. Your mail\nsubmission library probably does this for you transparently. Note that\nmost web browsers are currently in transition between IDNA 2003 (RFC\n3490) and IDNA 2008 (RFC 5891) and [compliance around the web is not\nvery\ngood](http://archives.miloush.net/michkap/archive/2012/02/27/10273315.html)\nin any case, so be aware that edge cases are handled differently by\ndifferent applications and libraries. This library conforms to IDNA 2008\nusing the [idna](https://github.com/kjd/idna) module by Kim Davies.\n\n### Internationalized local parts\n\nThe second sort of internationalization is internationalization in the\n*local* part of the address (before the @-sign). In non-internationalized\nemail addresses, only English letters, numbers, and some punctuation\n(`._!#$%&'^``*+-=~/?{|}`) are allowed. In internationalized email address\nlocal parts, a wider range of Unicode characters are allowed.\n\nA surprisingly large number of Unicode characters are not safe to display,\nespecially when the email address is concatenated with other text, so this\nlibrary tries to protect you by not permitting resvered, non-, private use,\nformatting (which can be used to alter the display order of characters),\nwhitespace, and control characters, and combining characters\nas the first character (so that they cannot combine with something outside\nof the email address string). See https://qntm.org/safe and https://trojansource.codes/\nfor relevant prior work. (Other than whitespace, these are checks that\nyou should be applying to nearly all user inputs in a security-sensitive\ncontext.)\n\nThese character checks are performed after Unicode normalization (see below),\nso you are only fully protected if you replace all user-provided email addresses\nwith the normalized email address string returned by this library. This does not\nguard against the well known problem that many Unicode characters look alike\n(or are identical), which can be used to fool humans reading displayed text.\n\nEmail addresses with these non-ASCII characters require that your mail\nsubmission library and the mail servers along the route to the destination,\nincluding your own outbound mail server, all support the\n[SMTPUTF8 (RFC 6531)](https://tools.ietf.org/html/rfc6531) extension.\nSupport for SMTPUTF8 varies. See the `allow_smtputf8` parameter.\n\n### If you know ahead of time that SMTPUTF8 is not supported by your mail submission stack\n\nBy default all internationalized forms are accepted by the validator.\nBut if you know ahead of time that SMTPUTF8 is not supported by your\nmail submission stack, then you must filter out addresses that require\nSMTPUTF8 using the `allow_smtputf8=False` keyword argument (see above).\nThis will cause the validation function to raise a `EmailSyntaxError` if\ndelivery would require SMTPUTF8. That's just in those cases where\nnon-ASCII characters appear before the @-sign. If you do not set\n`allow_smtputf8=False`, you can also check the value of the `smtputf8`\nfield in the returned object.\n\nIf your mail submission library doesn't support Unicode at all --- even\nin the domain part of the address --- then immediately prior to mail\nsubmission you must replace the email address with its ASCII-ized form.\nThis library gives you back the ASCII-ized form in the `ascii_email`\nfield in the returned object, which you can get like this:\n\n```python\nvalid = validate_email(email, allow_smtputf8=False)\nemail = valid.ascii_email\n```\n\nThe local part is left alone (if it has internationalized characters\n`allow_smtputf8=False` will force validation to fail) and the domain\npart is converted to [IDNA ASCII](https://tools.ietf.org/html/rfc5891).\n(You probably should not do this at account creation time so you don't\nchange the user's login information without telling them.)\n\n### Support for Python 2.7\n\nThe last version of this library supporting Python 2.x is version 1.2.1.\n\nWhen using Python 2.x, it is required that it was built with\nUCS-4 support (see\n[here](https://stackoverflow.com/questions/29109944/python-returns-length-of-2-for-single-unicode-character-string)).\nWithout UCS-4 support, unicode characters outside of the BMP (Basic\nMultilingual Plane) will not validate correctly.\n\nNormalization\n-------------\n\nThe use of Unicode in email addresses introduced a normalization\nproblem. Different Unicode strings can look identical and have the same\nsemantic meaning to the user. The `email` field returned on successful\nvalidation provides the correctly normalized form of the given email\naddress:\n\n```python\nvalid = validate_email(\"me@Domain.com\")\nemail = valid.ascii_email\nprint(email)\n# prints: me@domain.com\n```\n\nBecause an end-user might type their email address in different (but\nequivalent) un-normalized forms at different times, you ought to\nreplace what they enter with the normalized form immediately prior to\ngoing into your database (during account creation), querying your database\n(during login), or sending outbound mail. Normalization may also change\nthe length of an email address, and this may affect whether it is valid\nand acceptable by your SMTP provider.\n\nThe normalizations include lowercasing the domain part of the email\naddress (domain names are case-insensitive), [Unicode \"NFC\"\nnormalization](https://en.wikipedia.org/wiki/Unicode_equivalence) of the\nwhole address (which turns characters plus [combining\ncharacters](https://en.wikipedia.org/wiki/Combining_character) into\nprecomposed characters where possible, replacement of [fullwidth and\nhalfwidth\ncharacters](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms)\nin the domain part, possibly other\n[UTS46](http://unicode.org/reports/tr46) mappings on the domain part,\nand conversion from Punycode to Unicode characters.\n\n(See [RFC 6532 (internationalized email) section\n3.1](https://tools.ietf.org/html/rfc6532#section-3.1) and [RFC 5895\n(IDNA 2008) section 2](http://www.ietf.org/rfc/rfc5895.txt).)\n\nExamples\n--------\n\nFor the email address `test@joshdata.me`, the returned object is:\n\n```python\nValidatedEmail(\n email='test@joshdata.me',\n local_part='test',\n domain='joshdata.me',\n ascii_email='test@joshdata.me',\n ascii_local_part='test',\n ascii_domain='joshdata.me',\n smtputf8=False)\n```\n\nFor the fictitious address `example@ツ.life`, which has an\ninternationalized domain but ASCII local part, the returned object is:\n\n```python\nValidatedEmail(\n email='example@ツ.life',\n local_part='example',\n domain='ツ.life',\n ascii_email='example@xn--bdk.life',\n ascii_local_part='example',\n ascii_domain='xn--bdk.life',\n smtputf8=False)\n\n```\n\nNote that `smtputf8` is `False` even though the domain part is\ninternationalized because\n[SMTPUTF8](https://tools.ietf.org/html/rfc6531) is only needed if the\nlocal part of the address is internationalized (the domain part can be\nconverted to IDNA ASCII Punycode). Also note that the `email` and `domain`\nfields provide a normalized form of the email address and domain name\n(casefolding and Unicode normalization as required by IDNA 2008).\n\nCalling `validate_email` with the ASCII form of the above email address,\n`example@xn--bdk.life`, returns the exact same information (i.e., the\n`email` field always will contain Unicode characters, not Punycode).\n\nFor the fictitious address `ツ-test@joshdata.me`, which has an\ninternationalized local part, the returned object is:\n\n```python\nValidatedEmail(\n email='ツ-test@joshdata.me',\n local_part='ツ-test',\n domain='joshdata.me',\n ascii_email=None,\n ascii_local_part=None,\n ascii_domain='joshdata.me',\n smtputf8=True)\n```\n\nNow `smtputf8` is `True` and `ascii_email` is `None` because the local\npart of the address is internationalized. The `local_part` and `email` fields\nreturn the normalized form of the address: certain Unicode characters\n(such as angstrom and ohm) may be replaced by other equivalent code\npoints (a-with-ring and omega).\n\nReturn value\n------------\n\nWhen an email address passes validation, the fields in the returned object\nare:\n\n| Field | Value |\n| -----:|-------|\n| `email` | The normalized form of the email address that you should put in your database. This merely combines the `local_part` and `domain` fields (see below). |\n| `ascii_email` | If set, an ASCII-only form of the email address by replacing the domain part with [IDNA](https://tools.ietf.org/html/rfc5891) [Punycode](https://www.rfc-editor.org/rfc/rfc3492.txt). This field will be present when an ASCII-only form of the email address exists (including if the email address is already ASCII). If the local part of the email address contains internationalized characters, `ascii_email` will be `None`. If set, it merely combines `ascii_local_part` and `ascii_domain`. |\n| `local_part` | The local part of the given email address (before the @-sign) with Unicode NFC normalization applied. |\n| `ascii_local_part` | If set, the local part, which is composed of ASCII characters only. |\n| `domain` | The canonical internationalized Unicode form of the domain part of the email address. If the returned string contains non-ASCII characters, either the [SMTPUTF8](https://tools.ietf.org/html/rfc6531) feature of your mail relay will be required to transmit the message or else the email address's domain part must be converted to IDNA ASCII first: Use `ascii_domain` field instead. |\n| `ascii_domain` | The [IDNA](https://tools.ietf.org/html/rfc5891) [Punycode](https://www.rfc-editor.org/rfc/rfc3492.txt)-encoded form of the domain part of the given email address, as it would be transmitted on the wire. |\n| `smtputf8` | A boolean indicating that the [SMTPUTF8](https://tools.ietf.org/html/rfc6531) feature of your mail relay will be required to transmit messages to this address because the local part of the address has non-ASCII characters (the local part cannot be IDNA-encoded). If `allow_smtputf8=False` is passed as an argument, this flag will always be false because an exception is raised if it would have been true. |\n| `mx` | A list of (priority, domain) tuples of MX records specified in the DNS for the domain (see [RFC 5321 section 5](https://tools.ietf.org/html/rfc5321#section-5)). May be `None` if the deliverability check could not be completed because of a temporary issue like a timeout. |\n| `mx_fallback_type` | `None` if an `MX` record is found. If no MX records are actually specified in DNS and instead are inferred, through an obsolete mechanism, from A or AAAA records, the value is the type of DNS record used instead (`A` or `AAAA`). May be `None` if the deliverability check could not be completed because of a temporary issue like a timeout. |\n| `spf` | Any SPF record found while checking deliverability. Only set if the SPF record is queried. |\n\nAssumptions\n-----------\n\nBy design, this validator does not pass all email addresses that\nstrictly conform to the standards. Many email address forms are obsolete\nor likely to cause trouble:\n\n* The validator assumes the email address is intended to be\n usable on the public Internet. The domain part\n of the email address must be a resolvable domain name\n (see the deliverability checks described above).\n Most [Special Use Domain Names](https://www.iana.org/assignments/special-use-domain-names/special-use-domain-names.xhtml)\n and their subdomains, as well as\n domain names without a `.`, are rejected as a syntax error\n (except see the `test_environment` parameter above).\n* Obsolete email syntaxes are rejected:\n The \"quoted string\" form of the local part of the email address (RFC\n 5321 4.1.2) is not permitted.\n Quoted forms allow multiple @-signs, space characters, and other\n troublesome conditions. The unsual [(comment) syntax](https://github.com/JoshData/python-email-validator/issues/77)\n is also rejected. The \"literal\" form for the domain part of an email address (an\n IP address in brackets) is rejected. Other obsolete and deprecated syntaxes are\n rejected. No one uses these forms anymore.\n\nTesting\n-------\n\nTests can be run using\n\n```sh\npip install -r test_requirements.txt \nmake test\n```\n\nFor Project Maintainers\n-----------------------\n\nThe package is distributed as a universal wheel and as a source package.\n\nTo release:\n\n* Update CHANGELOG.md.\n* Update the version number in setup.cfg.\n* Make & push a commit with the new version number.\n* Make & push a tag (`git tag v... && git push --tags`).\n* Make a release at https://github.com/JoshData/python-email-validator/releases/new.\n* Follow the steps below to publish source and a universal wheel to pypi.\n\n```sh\n./release_to_pypi.sh\ngit tag v$(grep version setup.cfg | sed \"s/.*= //\")\ngit push --tags\n```\n\nNotes: The wheel is specified as universal in the file `setup.cfg` by the `universal = 1` key in the\n`[bdist_wheel]` section.\n\n\n",
- "description_content_type": "text/markdown",
- "keywords": [
- "email",
- "address",
- "validator"
- ],
- "home_page": "https://github.com/JoshData/python-email-validator",
- "author": "Joshua Tauberer",
- "author_email": "jt@occams.info",
- "license": "CC0 (copyright waived)",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ],
- "requires_dist": [
- "dnspython (>=1.15.0)",
- "idna (>=2.0.0)"
- ],
- "requires_python": ">=3.5"
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/ad/83/b71e58666f156a39fb29417e4c8ca4bc7400c0dd4ed9e8842ab54dc8c344/exceptiongroup-1.1.3-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3",
- "hashes": {
- "sha256": "343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "exceptiongroup",
- "version": "1.1.3",
- "summary": "Backport of PEP 654 (exception groups)",
- "description": ".. image:: https://github.com/agronholm/exceptiongroup/actions/workflows/test.yml/badge.svg\n :target: https://github.com/agronholm/exceptiongroup/actions/workflows/test.yml\n :alt: Build Status\n.. image:: https://coveralls.io/repos/github/agronholm/exceptiongroup/badge.svg?branch=main\n :target: https://coveralls.io/github/agronholm/exceptiongroup?branch=main\n :alt: Code Coverage\n\nThis is a backport of the ``BaseExceptionGroup`` and ``ExceptionGroup`` classes from\nPython 3.11.\n\nIt contains the following:\n\n* The ``exceptiongroup.BaseExceptionGroup`` and ``exceptiongroup.ExceptionGroup``\n classes\n* A utility function (``exceptiongroup.catch()``) for catching exceptions possibly\n nested in an exception group\n* Patches to the ``TracebackException`` class that properly formats exception groups\n (installed on import)\n* An exception hook that handles formatting of exception groups through\n ``TracebackException`` (installed on import)\n* Special versions of some of the functions from the ``traceback`` module, modified to\n correctly handle exception groups even when monkey patching is disabled, or blocked by\n another custom exception hook:\n\n * ``traceback.format_exception()``\n * ``traceback.format_exception_only()``\n * ``traceback.print_exception()``\n * ``traceback.print_exc()``\n\nIf this package is imported on Python 3.11 or later, the built-in implementations of the\nexception group classes are used instead, ``TracebackException`` is not monkey patched\nand the exception hook won't be installed.\n\nSee the `standard library documentation`_ for more information on exception groups.\n\n.. _standard library documentation: https://docs.python.org/3/library/exceptions.html\n\nCatching exceptions\n===================\n\nDue to the lack of the ``except*`` syntax introduced by `PEP 654`_ in earlier Python\nversions, you need to use ``exceptiongroup.catch()`` to catch exceptions that are\npotentially nested inside an exception group. This function returns a context manager\nthat calls the given handler for any exceptions matching the sole argument.\n\nThe argument to ``catch()`` must be a dict (or any ``Mapping``) where each key is either\nan exception class or an iterable of exception classes. Each value must be a callable\nthat takes a single positional argument. The handler will be called at most once, with\nan exception group as an argument which will contain all the exceptions that are any\nof the given types, or their subclasses. The exception group may contain nested groups\ncontaining more matching exceptions.\n\nThus, the following Python 3.11+ code:\n\n.. code-block:: python3\n\n try:\n ...\n except* (ValueError, KeyError) as excgroup:\n for exc in excgroup.exceptions:\n print('Caught exception:', type(exc))\n except* RuntimeError:\n print('Caught runtime error')\n\nwould be written with this backport like this:\n\n.. code-block:: python3\n\n from exceptiongroup import ExceptionGroup, catch\n\n def value_key_err_handler(excgroup: ExceptionGroup) -> None:\n for exc in excgroup.exceptions:\n print('Caught exception:', type(exc))\n\n def runtime_err_handler(exc: ExceptionGroup) -> None:\n print('Caught runtime error')\n\n with catch({\n (ValueError, KeyError): value_key_err_handler,\n RuntimeError: runtime_err_handler\n }):\n ...\n\n**NOTE**: Just like with ``except*``, you cannot handle ``BaseExceptionGroup`` or\n``ExceptionGroup`` with ``catch()``.\n\nNotes on monkey patching\n========================\n\nTo make exception groups render properly when an unhandled exception group is being\nprinted out, this package does two things when it is imported on any Python version\nearlier than 3.11:\n\n#. The ``traceback.TracebackException`` class is monkey patched to store extra\n information about exception groups (in ``__init__()``) and properly format them (in\n ``format()``)\n#. An exception hook is installed at ``sys.excepthook``, provided that no other hook is\n already present. This hook causes the exception to be formatted using\n ``traceback.TracebackException`` rather than the built-in rendered.\n\nIf ``sys.exceptionhook`` is found to be set to something else than the default when\n``exceptiongroup`` is imported, no monkeypatching is done at all.\n\nTo prevent the exception hook and patches from being installed, set the environment\nvariable ``EXCEPTIONGROUP_NO_PATCH`` to ``1``.\n\nFormatting exception groups\n---------------------------\n\nNormally, the monkey patching applied by this library on import will cause exception\ngroups to be printed properly in tracebacks. But in cases when the monkey patching is\nblocked by a third party exception hook, or monkey patching is explicitly disabled,\nyou can still manually format exceptions using the special versions of the ``traceback``\nfunctions, like ``format_exception()``, listed at the top of this page. They work just\nlike their counterparts in the ``traceback`` module, except that they use a separately\npatched subclass of ``TracebackException`` to perform the rendering.\n\nParticularly in cases where a library installs its own exception hook, it is recommended\nto use these special versions to do the actual formatting of exceptions/tracebacks.\n\n.. _PEP 654: https://www.python.org/dev/peps/pep-0654/\n\n",
- "description_content_type": "text/x-rst",
- "author_email": "Alex Grönholm <alex.gronholm@nextday.fi>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3 :: Only",
- "Typing :: Typed"
- ],
- "requires_dist": [
- "pytest >= 6 ; extra == \"test\""
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Changelog, https://github.com/agronholm/exceptiongroup/blob/main/CHANGES.rst",
- "Issue Tracker, https://github.com/agronholm/exceptiongroup/issues",
- "Source code, https://github.com/agronholm/exceptiongroup"
- ],
- "provides_extra": [
- "test"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/9f/1a/8b6d48162861009d1e017a9740431c78d860809773b66cac220a11aa3310/Flask-2.2.5-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=58107ed83443e86067e41eff4631b058178191a355886f8e479e347fa1285fdf",
- "hashes": {
- "sha256": "58107ed83443e86067e41eff4631b058178191a355886f8e479e347fa1285fdf"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "Flask",
- "version": "2.2.5",
- "summary": "A simple framework for building complex web applications.",
- "description": "Flask\n=====\n\nFlask is a lightweight `WSGI`_ web application framework. It is designed\nto make getting started quick and easy, with the ability to scale up to\ncomplex applications. It began as a simple wrapper around `Werkzeug`_\nand `Jinja`_ and has become one of the most popular Python web\napplication frameworks.\n\nFlask offers suggestions, but doesn't enforce any dependencies or\nproject layout. It is up to the developer to choose the tools and\nlibraries they want to use. There are many extensions provided by the\ncommunity that make adding new functionality easy.\n\n.. _WSGI: https://wsgi.readthedocs.io/\n.. _Werkzeug: https://werkzeug.palletsprojects.com/\n.. _Jinja: https://jinja.palletsprojects.com/\n\n\nInstalling\n----------\n\nInstall and update using `pip`_:\n\n.. code-block:: text\n\n $ pip install -U Flask\n\n.. _pip: https://pip.pypa.io/en/stable/getting-started/\n\n\nA Simple Example\n----------------\n\n.. code-block:: python\n\n # save this as app.py\n from flask import Flask\n\n app = Flask(__name__)\n\n @app.route(\"/\")\n def hello():\n return \"Hello, World!\"\n\n.. code-block:: text\n\n $ flask run\n * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)\n\n\nContributing\n------------\n\nFor guidance on setting up a development environment and how to make a\ncontribution to Flask, see the `contributing guidelines`_.\n\n.. _contributing guidelines: https://github.com/pallets/flask/blob/main/CONTRIBUTING.rst\n\n\nDonate\n------\n\nThe Pallets organization develops and supports Flask and the libraries\nit uses. In order to grow the community of contributors and users, and\nallow the maintainers to devote more time to the projects, `please\ndonate today`_.\n\n.. _please donate today: https://palletsprojects.com/donate\n\n\nLinks\n-----\n\n- Documentation: https://flask.palletsprojects.com/\n- Changes: https://flask.palletsprojects.com/changes/\n- PyPI Releases: https://pypi.org/project/Flask/\n- Source Code: https://github.com/pallets/flask/\n- Issue Tracker: https://github.com/pallets/flask/issues/\n- Website: https://palletsprojects.com/p/flask/\n- Twitter: https://twitter.com/PalletsTeam\n- Chat: https://discord.gg/pallets\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://palletsprojects.com/p/flask",
- "author": "Armin Ronacher",
- "author_email": "armin.ronacher@active-4.com",
- "maintainer": "Pallets",
- "maintainer_email": "contact@palletsprojects.com",
- "license": "BSD-3-Clause",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Web Environment",
- "Framework :: Flask",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
- "Topic :: Internet :: WWW/HTTP :: WSGI",
- "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
- "Topic :: Software Development :: Libraries :: Application Frameworks"
- ],
- "requires_dist": [
- "Werkzeug (>=2.2.2)",
- "Jinja2 (>=3.0)",
- "itsdangerous (>=2.0)",
- "click (>=8.0)",
- "importlib-metadata (>=3.6.0) ; python_version < \"3.10\"",
- "asgiref (>=3.2) ; extra == 'async'",
- "python-dotenv ; extra == 'dotenv'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Donate, https://palletsprojects.com/donate",
- "Documentation, https://flask.palletsprojects.com/",
- "Changes, https://flask.palletsprojects.com/changes/",
- "Source Code, https://github.com/pallets/flask/",
- "Issue Tracker, https://github.com/pallets/flask/issues/",
- "Twitter, https://twitter.com/PalletsTeam",
- "Chat, https://discord.gg/pallets"
- ],
- "provides_extra": [
- "async",
- "dotenv"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/9b/13/7ed7265ee77655466292f6e6ba8c989ac60cb82f6450b2f0bd01804a5024/Flask_AppBuilder-4.3.6-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=840480dfd43134bebf78f3c7dc909e324c2689d2d9f27aeb1880a8a25466bc8d",
- "hashes": {
- "sha256": "840480dfd43134bebf78f3c7dc909e324c2689d2d9f27aeb1880a8a25466bc8d"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "Flask-AppBuilder",
- "version": "4.3.6",
- "platform": [
- "any"
- ],
- "summary": "Simple and rapid application development framework, built on top of Flask. includes detailed security, auto CRUD generation for your models, google charts and much more.",
- "description": "Flask App Builder\n=================\n\n.. image:: https://github.com/dpgaspar/Flask-AppBuilder/workflows/Python/badge.svg\n :target: https://github.com/dpgaspar/Flask-AppBuilder/actions\n\n.. image:: https://img.shields.io/pypi/v/Flask-AppBuilder.svg\n :alt: PyPI\n :target: https://pypi.org/project/Flask-AppBuilder/\n\n.. image:: https://img.shields.io/badge/pyversions-3.6%2C3.7-blue.svg\n :target: https://www.python.org/\n\n.. image:: https://codecov.io/github/dpgaspar/Flask-AppBuilder/coverage.svg?branch=master\n :target: https://codecov.io/github/dpgaspar/Flask-AppBuilder\n\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n :target: https://github.com/psf/black\n\n\nSimple and rapid application development framework, built on top of `Flask <http://flask.pocoo.org/>`_.\nincludes detailed security, auto CRUD generation for your models, google charts and much more.\n\nExtensive configuration of all functionality, easily integrate with normal Flask/Jinja2 development.\n\n- Documentation: `Documentation <http://flask-appbuilder.readthedocs.org/en/latest/>`_\n\n- Mailing list: `Google group <https://groups.google.com/forum/#!forum/flask-appbuilder>`_\n\n- Chat: `Gitter <https://gitter.im/dpgaspar/Flask-AppBuilder>`_\n\n- Examples: `examples <https://github.com/dpgaspar/Flask-AppBuilder/tree/master/examples>`_\n\nCheckout installation video on `YouTube <http://youtu.be/xvum4vfwldg>`_\n\nQuick how to `Demo from the docs <http://flaskappbuilder.pythonanywhere.com/>`_ (login has guest/welcome).\n\nChange Log\n----------\n\n`Versions <https://github.com/dpgaspar/Flask-AppBuilder/tree/master/CHANGELOG.rst>`_ for further detail on what changed.\n\nFixes, Bugs and contributions\n-----------------------------\n\nYou're welcome to report bugs, propose new features, or even better contribute to this project.\n\n`Issues, bugs and new features <https://github.com/dpgaspar/Flask-AppBuilder/issues/new>`_\n\n`Contribute <https://github.com/dpgaspar/Flask-AppBuilder/fork>`_\n\nIncludes:\n---------\n\n - Database\n - SQLAlchemy, multiple database support: sqlite, MySQL, ORACLE, MSSQL, DB2 etc.\n - Partial support for MongoDB using MongoEngine.\n - Multiple database connections support (Vertical partitioning).\n - Easy mixin audit to models (created/changed by user, and timestamps).\n - Security\n - Automatic permissions lookup, based on exposed methods. It will grant all permissions to the Admin Role.\n - Inserts on the Database all the detailed permissions possible on your application.\n - Public (no authentication needed) and Private permissions.\n - Role based permissions.\n - Authentication support for OAuth, OpenID, Database, LDAP and REMOTE_USER environ var.\n - Support for self user registration.\n - Views and Widgets\n - Automatic menu generation.\n - Automatic CRUD generation.\n - Multiple actions on db records.\n - Big variety of filters for your lists.\n - Various view widgets: lists, master-detail, list of thumbnails etc\n - Select2, Datepicker, DateTimePicker\n - Related Select2 fields.\n - Google charts with automatic group by or direct values and filters.\n - AddOn system, write your own and contribute.\n - CRUD REST API\n - Automatic CRUD RESTful APIs.\n - Internationalization\n - Integration with flask-jwt-extended extension to protect your endpoints.\n - Metadata for dynamic rendering.\n - Selectable columns and metadata keys.\n - Automatic and configurable data validation.\n - Forms\n - Automatic, Add, Edit and Show from Database Models\n - Labels and descriptions for each field.\n - Automatic base validators from model's definition.\n - Custom validators, extra fields, custom filters for related dropdown lists.\n - Image and File support for upload and database field association. It will handle everything for you.\n - Field sets for Form's (Django style).\n - i18n\n - Support for multi-language via Babel\n - Bootstrap 3.1.1 CSS and js, with Select2 and DatePicker\n - Font-Awesome icons, for menu icons and actions.\n\n\nSome pictures\n-------------\n\nLogin page (with AUTH_DB)\n\n.. image:: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/login_db.png\n :width: 480px\n :target: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/login_db.png\n\n\nLogin page (with AUTH_OAUTH)\n\n.. image:: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/login_oauth.png\n :width: 480px\n :target: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/login_oauth.png\n\n\nSecurity\n\n.. image:: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/security.png\n :width: 480px\n :target: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/security.png\n\n\nLists:\n\nList contacts example\n\n.. image:: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/contact_list.png\n :width: 480px\n :target: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/contact_list.png\n\n\nList Group example with search\n\n.. image:: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/group_list.png\n :width: 480px\n :target: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/group_list.png\n\n\n\nCharts:\n\nGroup by pie chart\n\n.. image:: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/grouped_chart.png\n :width: 480px\n :target: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/grouped_chart.png\n\nDirect time chart\n\n.. image:: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/direct_chart.png\n :width: 480px\n :target: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/chart_time1.png\n\nGroup by time chart\n\n.. image:: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/chart_time2.png\n :width: 480px\n :target: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/chart_time2.png\n\n\nProjects/Organizations using FAB\n--------------------------------\n\nIf you would like to share your project, or let everyone know that you're using FAB\non your organization please submit a PR or send me an email with the details.\n\nProjects:\n\n- `Superset <https://github.com/apache/incubator-superset>`_ - a data exploration platform designed to be visual, intuitive, and interactive\n\n- `Airflow <https://github.com/apache/airflow>`_ - a platform to programmatically author, schedule, and monitor workflows.\n\n\nOrganizations:\n\n- Miniclip\n- EuroBIC\n- `On Beat Digital <https://onbeat.digital/>`_\n\n\nDepends on:\n-----------\n\n- flask\n- click\n- colorama\n- flask-sqlalchemy\n- flask-login\n- flask-openid\n- flask-wtform\n- flask-Babel\n\n\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://github.com/dpgaspar/flask-appbuilder/",
- "author": "Daniel Vaz Gaspar",
- "author_email": "danielvazgaspar@gmail.com",
- "license": "BSD",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ],
- "requires_dist": [
- "apispec[yaml] (<7,>=6.0.0)",
- "colorama (<1,>=0.3.9)",
- "click (<9,>=8)",
- "email-validator (<2,>=1.0.5)",
- "Flask (<3,>=2)",
- "Flask-Babel (<3,>=1)",
- "Flask-Limiter (<4,>3)",
- "Flask-Login (<0.7,>=0.3)",
- "Flask-SQLAlchemy (<3,>=2.4)",
- "Flask-WTF (<2,>=0.14.2)",
- "Flask-JWT-Extended (<5.0.0,>=4.0.0)",
- "jsonschema (<5,>=3)",
- "marshmallow (<4,>=3.18.0)",
- "marshmallow-sqlalchemy (<0.27.0,>=0.22.0)",
- "python-dateutil (<3,>=2.3)",
- "prison (<1.0.0,>=0.2.1)",
- "PyJWT (<3.0.0,>=2.0.0)",
- "SQLAlchemy (<1.5)",
- "sqlalchemy-utils (<1,>=0.32.21)",
- "WTForms (<4)",
- "jmespath (>=0.9.5) ; extra == 'jmespath'",
- "Authlib (<2.0.0,>=0.14) ; extra == 'oauth'",
- "Flask-OpenID (<2,>=1.2.5) ; extra == 'openid'",
- "flask-talisman (<2.0,>=1.0.0) ; extra == 'talisman'"
- ],
- "requires_python": "~=3.7",
- "provides_extra": [
- "jmespath",
- "oauth",
- "openid",
- "talisman"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/ab/3e/02331179ffab8b79e0383606a028b6a60fb1b4419b84935edd43223406a0/Flask_Babel-2.0.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=e6820a052a8d344e178cdd36dd4bb8aea09b4bda3d5f9fa9f008df2c7f2f5468",
- "hashes": {
- "sha256": "e6820a052a8d344e178cdd36dd4bb8aea09b4bda3d5f9fa9f008df2c7f2f5468"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "Flask-Babel",
- "version": "2.0.0",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "Adds i18n/l10n support to Flask applications",
- "description": "# Flask Babel\n\n\n[](https://pypi.python.org/pypi/Flask-Babel)\n\nImplements i18n and l10n support for Flask. This is based on the Python\n[babel][] module as well as [pytz][] both of which are installed automatically\nfor you if you install this library.\n\n# Documention\n\nThe latest documentation is available [here][docs].\n\n[babel]: https://github.com/python-babel/babel\n[pytz]: https://pypi.python.org/pypi/pytz/\n[docs]: https://flask-babel.tkte.ch/\n[semver]: https://semver.org/\n\n\n",
- "description_content_type": "text/markdown",
- "home_page": "http://github.com/python-babel/flask-babel",
- "author": "Armin Ronacher",
- "author_email": "armin.ronacher@active-4.com",
- "maintainer": "Tyler Kennedy",
- "maintainer_email": "tk@tkte.ch",
- "license": "BSD",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ],
- "requires_dist": [
- "pytz",
- "Flask",
- "Babel (>=2.3)",
- "Jinja2 (>=2.5)",
- "pytest ; extra == 'dev'",
- "pytest-mock ; extra == 'dev'",
- "bumpversion ; extra == 'dev'",
- "ghp-import ; extra == 'dev'",
- "sphinx ; extra == 'dev'",
- "Pallets-Sphinx-Themes ; extra == 'dev'"
- ],
- "provides_extra": [
- "dev"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/49/99/e279e06a1a0147763bda92359b3fa5eab8566e032407e539eb851cdfb4bc/Flask_Caching-2.1.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=f02645a629a8c89800d96dc8f690a574a0d49dcd66c7536badc6d362ba46b716",
- "hashes": {
- "sha256": "f02645a629a8c89800d96dc8f690a574a0d49dcd66c7536badc6d362ba46b716"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "Flask-Caching",
- "version": "2.1.0",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "Adds caching support to Flask applications.",
- "description": "Flask-Caching\n=============\n\nA fork of the `Flask-cache`_ extension which adds easy cache support to Flask.\n\n.. _Flask-cache: https://github.com/thadeusb/flask-cache\n\n\nInstalling\n----------\n\nInstall and update using `pip`_:\n\n.. code-block:: text\n\n $ pip install -U flask-caching\n\n.. _pip: https://pip.pypa.io/en/stable/getting-started/\n\n\nDonate\n------\n\nThe Pallets organization develops and supports Flask and the libraries\nit uses. In order to grow the community of contributors and users, and\nallow the maintainers to devote more time to the projects, `please\ndonate today`_.\n\n.. _please donate today: https://palletsprojects.com/donate\n\n\nLinks\n-----\n\n- Documentation: https://flask-caching.readthedocs.io\n- Changes: https://flask-caching.readthedocs.io/en/latest/changelog.html\n- PyPI Releases: https://pypi.org/project/Flask-Caching/\n- Source Code: https://github.com/pallets-eco/flask-caching\n- Issue Tracker: https://github.com/pallets-eco/flask-caching/issues\n- Twitter: https://twitter.com/PalletsTeam\n- Chat: https://discord.gg/pallets\n\n\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://github.com/pallets-eco/flask-caching",
- "author": "Peter Justin",
- "author_email": "peter.justin@outlook.com",
- "maintainer": "Pallets",
- "maintainer_email": "contact@palletsprojects.com",
- "license": "BSD",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python"
- ],
- "requires_dist": [
- "cachelib (<0.10.0,>=0.9.0)",
- "Flask"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Donate, https://palletsprojects.com/donate",
- "Documentation, https://flask-caching.readthedocs.io",
- "Changes, https://flask-caching.readthedocs.io/en/latest/changelog.html",
- "Source Code, https://github.com/pallets-eco/flask-caching",
- "Issue Tracker, https://github.com/pallets-eco/flask-caching/issues",
- "Twitter, https://twitter.com/PalletsTeam",
- "Chat, https://discord.gg/pallets"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/9a/aa/5b4f97d9612acc7db90fef5e97acabeec72a3c6465dd33339a281ce5d947/Flask_JWT_Extended-4.5.3-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=eaec42af107dcb919785a4b3766c09ffba9f286b92a8d58603933f28fd4db6a3",
- "hashes": {
- "sha256": "eaec42af107dcb919785a4b3766c09ffba9f286b92a8d58603933f28fd4db6a3"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "Flask-JWT-Extended",
- "version": "4.5.3",
- "platform": [
- "any"
- ],
- "summary": "Extended JWT integration with Flask",
- "description": "# Flask-JWT-Extended\n\n### Features\n\nFlask-JWT-Extended not only adds support for using JSON Web Tokens (JWT) to Flask for protecting routes,\nbut also many helpful (and **optional**) features built in to make working with JSON Web Tokens\neasier. These include:\n\n- Adding custom claims to JSON Web Tokens\n- Automatic user loading (`current_user`).\n- Custom claims validation on received tokens\n- [Refresh tokens](https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/)\n- First class support for fresh tokens for making sensitive changes.\n- Token revoking/blocklisting\n- Storing tokens in cookies and CSRF protection\n\n### Usage\n\n[View the documentation online](https://flask-jwt-extended.readthedocs.io/en/stable/)\n\n### Upgrading from 3.x.x to 4.0.0\n\n[View the changes](https://flask-jwt-extended.readthedocs.io/en/stable/v4_upgrade_guide/)\n\n### Changelog\n\nYou can view the changelog [here](https://github.com/vimalloc/flask-jwt-extended/releases).\nThis project follows [semantic versioning](https://semver.org/).\n\n### Chatting\n\nCome chat with the community or ask questions at https://discord.gg/EJBsbFd\n\n### Contributing\n\nBefore making any changes, make sure to install the development requirements\nand setup the git hooks which will automatically lint and format your changes.\n\n```bash\npip install -r requirements.txt\npre-commit install\n```\n\nWe require 100% code coverage in our unit tests. You can run the tests locally\nwith `tox` which ensures that all tests pass, tests provide complete code coverage,\ndocumentation builds, and style guide are adhered to\n\n```bash\ntox\n```\n\nA subset of checks can also be ran by adding an argument to tox. The available\narguments are:\n\n- py37, py38, py39, py310, py311, py312, pypy3\n - Run unit tests on the given python version\n- mypy\n - Run mypy type checking\n- coverage\n - Run a code coverage check\n- docs\n - Ensure documentation builds and there are no broken links\n- style\n - Ensure style guide is adhered to\n\n```bash\ntox -e py38\n```\n\nWe also require features to be well documented. You can generate a local copy\nof the documentation by going to the `docs` directory and running:\n\n```bash\nmake clean && make html && open _build/html/index.html\n```\n",
- "description_content_type": "text/markdown",
- "keywords": [
- "flask",
- "jwt",
- "json web token"
- ],
- "home_page": "https://github.com/vimalloc/flask-jwt-extended",
- "author": "Lily Acadia Gilbert",
- "author_email": "lily.gilbert@hey.com",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Web Environment",
- "Framework :: Flask",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ],
- "requires_dist": [
- "Werkzeug >=0.14",
- "Flask <4.0,>=2.0",
- "PyJWT <3.0,>=2.0",
- "typing-extensions >=3.7.4 ; python_version < \"3.8\"",
- "cryptography >=3.3.1 ; extra == 'asymmetric_crypto'"
- ],
- "requires_python": ">=3.7,<4",
- "provides_extra": [
- "asymmetric_crypto"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/a2/ff/2dc82d9517172b67c2f5b13884777be9fe644cbfd6c52600076747d2f125/Flask_Limiter-3.5.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=dbda4174f44e6cb858c6eb75e7488186f2977dd5d33d7028ba1aabf179de1bee",
- "hashes": {
- "sha256": "dbda4174f44e6cb858c6eb75e7488186f2977dd5d33d7028ba1aabf179de1bee"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "Flask-Limiter",
- "version": "3.5.0",
- "summary": "Rate limiting for flask applications",
- "description": ".. |ci| image:: https://github.com/alisaifee/flask-limiter/workflows/CI/badge.svg?branch=master\n :target: https://github.com/alisaifee/flask-limiter/actions?query=branch%3Amaster+workflow%3ACI\n.. |codecov| image:: https://codecov.io/gh/alisaifee/flask-limiter/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/alisaifee/flask-limiter\n.. |pypi| image:: https://img.shields.io/pypi/v/Flask-Limiter.svg?style=flat-square\n :target: https://pypi.python.org/pypi/Flask-Limiter\n.. |license| image:: https://img.shields.io/pypi/l/Flask-Limiter.svg?style=flat-square\n :target: https://pypi.python.org/pypi/Flask-Limiter\n.. |docs| image:: https://readthedocs.org/projects/flask-limiter/badge/?version=latest\n :target: https://flask-limiter.readthedocs.org/en/latest\n\n*************\nFlask-Limiter\n*************\n\n\n|docs| |ci| |codecov| |pypi| |license|\n\n**Flask-Limiter** adds rate limiting to `Flask <https://flask.palletsprojects.com>`_ applications.\n\n----\n\nSponsored by `Zuplo <https://zuplo.link/3NuX0co>`_ a fully-managed API Gateway for developers.\nAdd `dynamic rate-limiting <https://zuplo.link/flask-dynamic-rate-limit>`_ authentication and more to any API in minutes.\nLearn more at `zuplo.com <https://zuplo.link/3NuX0co>`_\n\n----\n\n\nYou can configure rate limits at different levels such as:\n\n- Application wide global limits per user\n- Default limits per route\n- By `Blueprints <https://flask-limiter.readthedocs.io/en/latest/recipes.html#rate-limiting-all-routes-in-a-blueprint>`_\n- By `Class-based views <https://flask-limiter.readthedocs.io/en/latest/recipes.html#using-flask-pluggable-views>`_\n- By `individual routes <https://flask-limiter.readthedocs.io/en/latest/index.html#decorators-to-declare-rate-limits>`_\n\n**Flask-Limiter** can be `configured <https://flask-limiter.readthedocs.io/en/latest/configuration.html>`_ to fit your application in many ways, including:\n\n- Persistance to various commonly used `storage backends <https://flask-limiter.readthedocs.io/en/latest/#configuring-a-storage-backend>`_\n (such as Redis, Memcached & MongoDB)\n via `limits <https://limits.readthedocs.io/en/stable/storage.html>`__\n- Any rate limiting strategy supported by `limits <https://limits.readthedocs.io/en/stable/strategies.html>`__\n\nFollow the quickstart below to get started or `read the documentation <http://flask-limiter.readthedocs.org/en/latest>`_ for more details.\n\n\nQuickstart\n===========\n\nInstall\n-------\n.. code-block:: bash\n\n pip install Flask-Limiter\n\nAdd the rate limiter to your flask app\n---------------------------------------\n.. code-block:: python\n\n # app.py\n\n from flask import Flask\n from flask_limiter import Limiter\n from flask_limiter.util import get_remote_address\n\n app = Flask(__name__)\n limiter = Limiter(\n get_remote_address,\n app=app,\n default_limits=[\"2 per minute\", \"1 per second\"],\n storage_uri=\"memory://\",\n # Redis\n # storage_uri=\"redis://localhost:6379\",\n # Redis cluster\n # storage_uri=\"redis+cluster://localhost:7000,localhost:7001,localhost:70002\",\n # Memcached\n # storage_uri=\"memcached://localhost:11211\",\n # Memcached Cluster\n # storage_uri=\"memcached://localhost:11211,localhost:11212,localhost:11213\",\n # MongoDB\n # storage_uri=\"mongodb://localhost:27017\",\n strategy=\"fixed-window\", # or \"moving-window\"\n )\n\n @app.route(\"/slow\")\n @limiter.limit(\"1 per day\")\n def slow():\n return \"24\"\n\n @app.route(\"/fast\")\n def fast():\n return \"42\"\n\n @app.route(\"/ping\")\n @limiter.exempt\n def ping():\n return 'PONG'\n\nInspect the limits using the command line interface\n---------------------------------------------------\n.. code-block:: bash\n\n $ FLASK_APP=app:app flask limiter limits\n\n app\n ├── fast: /fast\n │ ├── 2 per 1 minute\n │ └── 1 per 1 second\n ├── ping: /ping\n │ └── Exempt\n └── slow: /slow\n └── 1 per 1 day\n\nRun the app\n-----------\n.. code-block:: bash\n\n $ FLASK_APP=app:app flask run\n\n\nTest it out\n-----------\nThe ``fast`` endpoint respects the default rate limit while the\n``slow`` endpoint uses the decorated one. ``ping`` has no rate limit associated\nwith it.\n\n.. code-block:: bash\n\n $ curl localhost:5000/fast\n 42\n $ curl localhost:5000/fast\n 42\n $ curl localhost:5000/fast\n <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n <title>429 Too Many Requests</title>\n <h1>Too Many Requests</h1>\n <p>2 per 1 minute</p>\n $ curl localhost:5000/slow\n 24\n $ curl localhost:5000/slow\n <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n <title>429 Too Many Requests</title>\n <h1>Too Many Requests</h1>\n <p>1 per 1 day</p>\n $ curl localhost:5000/ping\n PONG\n $ curl localhost:5000/ping\n PONG\n $ curl localhost:5000/ping\n PONG\n $ curl localhost:5000/ping\n PONG\n\n\n\n\n",
- "home_page": "https://flask-limiter.readthedocs.org",
- "author": "Ali-Akber Saifee",
- "author_email": "ali@indydevs.org",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Web Environment",
- "Framework :: Flask",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: MacOS",
- "Operating System :: POSIX :: Linux",
- "Operating System :: OS Independent",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11"
- ],
- "requires_dist": [
- "limits >=2.8",
- "Flask >=2",
- "ordered-set <5,>4",
- "rich <14,>=12",
- "typing-extensions >=4",
- "limits[memcached] ; extra == 'memcached'",
- "limits[mongodb] ; extra == 'mongodb'",
- "limits[redis] ; extra == 'redis'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Source, https://github.com/alisaifee/flask-limiter"
- ],
- "provides_extra": [
- "memcached",
- "mongodb",
- "redis"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/a6/94/01b658bef1863a07f4738a322cce87d97be4362645255dc1182f7f5c075a/Flask_Login-0.6.2-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=1ef79843f5eddd0f143c2cd994c1b05ac83c0401dc6234c143495af9a939613f",
- "hashes": {
- "sha256": "1ef79843f5eddd0f143c2cd994c1b05ac83c0401dc6234c143495af9a939613f"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "Flask-Login",
- "version": "0.6.2",
- "summary": "User authentication and session management for Flask.",
- "description": "# Flask-Login\n\n\n[](https://coveralls.io/github/maxcountryman/flask-login?branch=main)\n[](LICENSE)\n\nFlask-Login provides user session management for Flask. It handles the common\ntasks of logging in, logging out, and remembering your users' sessions over\nextended periods of time.\n\nFlask-Login is not bound to any particular database system or permissions\nmodel. The only requirement is that your user objects implement a few methods,\nand that you provide a callback to the extension capable of loading users from\ntheir ID.\n\n## Installation\n\nInstall the extension with pip:\n\n```sh\n$ pip install flask-login\n```\n\n## Usage\n\nOnce installed, the Flask-Login is easy to use. Let's walk through setting up\na basic application. Also please note that this is a very basic guide: we will\nbe taking shortcuts here that you should never take in a real application.\n\nTo begin we'll set up a Flask app:\n\n```python\nimport flask\n\napp = flask.Flask(__name__)\napp.secret_key = 'super secret string' # Change this!\n```\n\nFlask-Login works via a login manager. To kick things off, we'll set up the\nlogin manager by instantiating it and telling it about our Flask app:\n\n```python\nimport flask_login\n\nlogin_manager = flask_login.LoginManager()\n\nlogin_manager.init_app(app)\n```\n\nTo keep things simple we're going to use a dictionary to represent a database\nof users. In a real application, this would be an actual persistence layer.\nHowever it's important to point out this is a feature of Flask-Login: it\ndoesn't care how your data is stored so long as you tell it how to retrieve it!\n\n```python\n# Our mock database.\nusers = {'foo@bar.tld': {'password': 'secret'}}\n```\n\nWe also need to tell Flask-Login how to load a user from a Flask request and\nfrom its session. To do this we need to define our user object, a\n`user_loader` callback, and a `request_loader` callback.\n\n```python\nclass User(flask_login.UserMixin):\n pass\n\n\n@login_manager.user_loader\ndef user_loader(email):\n if email not in users:\n return\n\n user = User()\n user.id = email\n return user\n\n\n@login_manager.request_loader\ndef request_loader(request):\n email = request.form.get('email')\n if email not in users:\n return\n\n user = User()\n user.id = email\n return user\n```\n\nNow we're ready to define our views. We can start with a login view, which will\npopulate the session with authentication bits. After that we can define a view\nthat requires authentication.\n\n```python\n@app.route('/login', methods=['GET', 'POST'])\ndef login():\n if flask.request.method == 'GET':\n return '''\n <form action='login' method='POST'>\n <input type='text' name='email' id='email' placeholder='email'/>\n <input type='password' name='password' id='password' placeholder='password'/>\n <input type='submit' name='submit'/>\n </form>\n '''\n\n email = flask.request.form['email']\n if email in users and flask.request.form['password'] == users[email]['password']:\n user = User()\n user.id = email\n flask_login.login_user(user)\n return flask.redirect(flask.url_for('protected'))\n\n return 'Bad login'\n\n\n@app.route('/protected')\n@flask_login.login_required\ndef protected():\n return 'Logged in as: ' + flask_login.current_user.id\n```\n\nFinally we can define a view to clear the session and log users out:\n\n```python\n@app.route('/logout')\ndef logout():\n flask_login.logout_user()\n return 'Logged out'\n```\n\nWe now have a basic working application that makes use of session-based\nauthentication. To round things off, we should provide a callback for login\nfailures:\n\n```python\n@login_manager.unauthorized_handler\ndef unauthorized_handler():\n return 'Unauthorized', 401\n```\n\nDocumentation for Flask-Login is available on [ReadTheDocs](https://flask-login.readthedocs.io/en/latest/).\nFor complete understanding of available configuration, please refer to the [source code](https://github.com/maxcountryman/flask-login).\n\n\n## Contributing\n\nWe welcome contributions! If you would like to hack on Flask-Login, please\nfollow these steps:\n\n1. Fork this repository\n2. Make your changes\n3. Install the dev requirements with `pip install -r requirements/dev.txt`\n4. Submit a pull request after running `tox` (ensure it does not error!)\n\nPlease give us adequate time to review your submission. Thanks!\n",
- "description_content_type": "text/markdown",
- "home_page": "https://github.com/maxcountryman/flask-login",
- "author": "Matthew Frazier",
- "author_email": "leafstormrush@gmail.com",
- "maintainer": "Max Countryman",
- "license": "MIT",
- "classifier": [
- "Development Status :: 4 - Beta",
- "Environment :: Web Environment",
- "Framework :: Flask",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ],
- "requires_dist": [
- "Flask (>=1.0.4)",
- "Werkzeug (>=1.0.1)"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Documentation, https://flask-login.readthedocs.io/",
- "Changes, https://github.com/maxcountryman/flask-login/blob/main/CHANGES.md",
- "Source Code, https://github.com/maxcountryman/flask-login",
- "Issue Tracker, https://github.com/maxcountryman/flask-login/issues"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/3e/d4/b374183251054928ddb5e72f9a0d3d764d0f2af0638fbbdf205df26e55e3/flask_session-0.5.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=1619bcbc16f04f64e90f8e0b17145ba5c9700090bb1294e889956c1282d58631",
- "hashes": {
- "sha256": "1619bcbc16f04f64e90f8e0b17145ba5c9700090bb1294e889956c1282d58631"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "Flask-Session",
- "version": "0.5.0",
- "summary": "Server-side session support for Flask",
- "description": "Flask-Session\n=============\n\nFlask-Session is an extension for Flask that adds support for server-side sessions to\nyour application.\n\n",
- "description_content_type": "text/x-rst",
- "author_email": "Shipeng Feng <fsp261@gmail.com>",
- "maintainer_email": "Pallets Community Ecosystem <contact@palletsprojects.com>",
- "classifier": [
- "Development Status :: 4 - Beta",
- "Environment :: Web Environment",
- "Framework :: Flask",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Topic :: Internet :: WWW/HTTP :: Session",
- "Topic :: Internet :: WWW/HTTP :: WSGI",
- "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
- "Topic :: Software Development :: Libraries :: Application Frameworks"
- ],
- "requires_dist": [
- "flask>=2.2",
- "cachelib"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Changes, https://flasksession.readthedocs.io/changes.html",
- "Chat, https://discord.gg/pallets",
- "Documentation, https://flasksession.readthedocs.io",
- "Issue Tracker, https://github.com/pallets-eco/flask-session/issues/",
- "Source Code, https://github.com/pallets-eco/flask-session/"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/26/2c/9088b6bd95bca539230bbe9ad446737ed391aab9a83aff403e18dded3e75/Flask_SQLAlchemy-2.5.1-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=f12c3d4cc5cc7fdcc148b9527ea05671718c3ea45d50c7e732cceb33f574b390",
- "hashes": {
- "sha256": "f12c3d4cc5cc7fdcc148b9527ea05671718c3ea45d50c7e732cceb33f574b390"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "Flask-SQLAlchemy",
- "version": "2.5.1",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "Adds SQLAlchemy support to your Flask application.",
- "description": "Flask-SQLAlchemy\n================\n\nFlask-SQLAlchemy is an extension for `Flask`_ that adds support for\n`SQLAlchemy`_ to your application. It aims to simplify using SQLAlchemy\nwith Flask by providing useful defaults and extra helpers that make it\neasier to accomplish common tasks.\n\n\nInstalling\n----------\n\nInstall and update using `pip`_:\n\n.. code-block:: text\n\n $ pip install -U Flask-SQLAlchemy\n\n\nA Simple Example\n----------------\n\n.. code-block:: python\n\n from flask import Flask\n from flask_sqlalchemy import SQLAlchemy\n\n app = Flask(__name__)\n app.config[\"SQLALCHEMY_DATABASE_URI\"] = \"sqlite:///example.sqlite\"\n db = SQLAlchemy(app)\n\n\n class User(db.Model):\n id = db.Column(db.Integer, primary_key=True)\n username = db.Column(db.String, unique=True, nullable=False)\n email = db.Column(db.String, unique=True, nullable=False)\n\n\n db.session.add(User(name=\"Flask\", email=\"example@example.com\"))\n db.session.commit()\n\n users = User.query.all()\n\n\nLinks\n-----\n\n- Documentation: https://flask-sqlalchemy.palletsprojects.com/\n- Releases: https://pypi.org/project/Flask-SQLAlchemy/\n- Code: https://github.com/pallets/flask-sqlalchemy\n- Issue tracker: https://github.com/pallets/flask-sqlalchemy/issues\n- Test status: https://travis-ci.org/pallets/flask-sqlalchemy\n- Test coverage: https://codecov.io/gh/pallets/flask-sqlalchemy\n\n.. _Flask: https://palletsprojects.com/p/flask/\n.. _SQLAlchemy: https://www.sqlalchemy.org\n.. _pip: https://pip.pypa.io/en/stable/quickstart/\n\n\n",
- "home_page": "https://github.com/pallets/flask-sqlalchemy",
- "author": "Armin Ronacher",
- "author_email": "armin.ronacher@active-4.com",
- "maintainer": "Pallets",
- "maintainer_email": "contact@palletsprojects.com",
- "license": "BSD-3-Clause",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.4",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ],
- "requires_dist": [
- "Flask (>=0.10)",
- "SQLAlchemy (>=0.8.0)"
- ],
- "requires_python": ">= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*",
- "project_url": [
- "Documentation, https://flask-sqlalchemy.palletsprojects.com/",
- "Code, https://github.com/pallets/flask-sqlalchemy",
- "Issue tracker, https://github.com/pallets/flask-sqlalchemy/issues"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/02/2b/0f0cf68a2f052ea3dbb8b6c8c2a7e8aea5e6df7410f5e289437fefbeb461/flask_wtf-1.2.1-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=fa6793f2fb7e812e0fe9743b282118e581fb1b6c45d414b8af05e659bd653287",
- "hashes": {
- "sha256": "fa6793f2fb7e812e0fe9743b282118e581fb1b6c45d414b8af05e659bd653287"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "Flask-WTF",
- "version": "1.2.1",
- "summary": "Form rendering, validation, and CSRF protection for Flask with WTForms.",
- "description": "Flask-WTF\n=========\n\nSimple integration of Flask and WTForms, including CSRF, file upload,\nand reCAPTCHA.\n\nLinks\n-----\n\n- Documentation: https://flask-wtf.readthedocs.io/\n- Changes: https://flask-wtf.readthedocs.io/changes/\n- PyPI Releases: https://pypi.org/project/Flask-WTF/\n- Source Code: https://github.com/wtforms/flask-wtf/\n- Issue Tracker: https://github.com/wtforms/flask-wtf/issues/\n- Chat: https://discord.gg/pallets\n",
- "description_content_type": "text/x-rst",
- "maintainer": "WTForms",
- "license": "Copyright 2010 WTForms\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n1. Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
- "Topic :: Internet :: WWW/HTTP :: WSGI",
- "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
- "Topic :: Software Development :: Libraries :: Application Frameworks"
- ],
- "requires_dist": [
- "flask",
- "itsdangerous",
- "wtforms",
- "email-validator; extra == 'email'"
- ],
- "requires_python": ">=3.8",
- "project_url": [
- "Documentation, https://flask-wtf.readthedocs.io/",
- "Changes, https://flask-wtf.readthedocs.io/changes/",
- "Source Code, https://github.com/wtforms/flask-wtf/",
- "Issue Tracker, https://github.com/wtforms/flask-wtf/issues/",
- "Chat, https://discord.gg/pallets"
- ],
- "provides_extra": [
- "email"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/ac/92/5336df50c62dd741ab7236a15613a3c236f2069b6602885c0682f8b455c5/google_re2-1.1-2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl",
- "archive_info": {
- "hash": "sha256=b632eff5e4cd44545a9c0e52f2e1becd55831e25f4dd4e0d7ec8ee6ca50858c1",
- "hashes": {
- "sha256": "b632eff5e4cd44545a9c0e52f2e1becd55831e25f4dd4e0d7ec8ee6ca50858c1"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "google-re2",
- "version": "1.1",
- "summary": "RE2 Python bindings",
- "description": "A drop-in replacement for the re module.\n\nIt uses RE2 under the hood, of course, so various PCRE features\n(e.g. backreferences, look-around assertions) are not supported.\nSee https://github.com/google/re2/wiki/Syntax for the canonical\nreference, but known syntactic \"gotchas\" relative to Python are:\n\n * PCRE supports \\Z and \\z; RE2 supports \\z; Python supports \\z,\n but calls it \\Z. You must rewrite \\Z to \\z in pattern strings.\n\nKnown differences between this module's API and the re module's API:\n\n * The error class does not provide any error information as attributes.\n * The Options class replaces the re module's flags with RE2's options as\n gettable/settable properties. Please see re2.h for their documentation.\n * The pattern string and the input string do not have to be the same type.\n Any str will be encoded to UTF-8.\n * The pattern string cannot be str if the options specify Latin-1 encoding.\n\nKnown issues with regard to building the C++ extension:\n\n * Building requires RE2 to be installed on your system.\n On Debian, for example, install the libre2-dev package.\n * Building requires pybind11 to be installed on your system OR venv.\n On Debian, for example, install the pybind11-dev package.\n For a venv, install the pybind11 package from PyPI.\n * Building on macOS is known to work, but has been known to fail.\n For example, the system Python may not know which compiler flags\n to set when building bindings for software installed by Homebrew;\n see https://docs.brew.sh/Homebrew-and-Python#brewed-python-modules.\n * Building on Windows has not been tested yet and will probably fail.\n",
- "description_content_type": "text/plain",
- "home_page": "https://github.com/google/re2",
- "author": "The RE2 Authors",
- "author_email": "re2-dev@googlegroups.com",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Programming Language :: C++",
- "Programming Language :: Python :: 3.8"
- ],
- "requires_python": "~=3.8"
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/21/49/12996dc0238e017504dceea1d121a48bd49fb3f4416f40d59fc3e924b4f3/googleapis_common_protos-1.61.0-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=22f1915393bb3245343f6efe87f6fe868532efc12aa26b391b15132e1279f1c0",
- "hashes": {
- "sha256": "22f1915393bb3245343f6efe87f6fe868532efc12aa26b391b15132e1279f1c0"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "googleapis-common-protos",
- "version": "1.61.0",
- "summary": "Common protobufs used in Google APIs",
- "description": "Google APIs common protos\n-------------------------\n\n.. image:: https://img.shields.io/pypi/v/googleapis-common-protos.svg\n :target: https://pypi.org/project/googleapis-common-protos/\n\n\ngoogleapis-common-protos contains the python classes generated from the common\nprotos in the `googleapis/googleapis <https://github.com/googleapis/googleapis>`_ repository.\n",
- "description_content_type": "text/markdown",
- "home_page": "https://github.com/googleapis/python-api-common-protos",
- "author": "Google LLC",
- "author_email": "googleapis-packages@google.com",
- "license": "Apache-2.0",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: Implementation :: CPython"
- ],
- "requires_dist": [
- "protobuf (!=3.20.0,!=3.20.1,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0.dev0,>=3.19.5)",
- "grpcio (<2.0.0.dev0,>=1.44.0) ; extra == 'grpc'"
- ],
- "requires_python": ">=3.7",
- "provides_extra": [
- "grpc"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/de/5e/fcbb22c68208d39edff467809d06c9d81d7d27426460ebc598e55130c1aa/graphviz-0.20.1-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=587c58a223b51611c0cf461132da386edd896a029524ca61a1462b880bf97977",
- "hashes": {
- "sha256": "587c58a223b51611c0cf461132da386edd896a029524ca61a1462b880bf97977"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "graphviz",
- "version": "0.20.1",
- "platform": [
- "any"
- ],
- "summary": "Simple Python interface for Graphviz",
- "description": "Graphviz\n========\n\n|PyPI version| |License| |Supported Python| |Wheel| |Downloads|\n\n|Build| |Codecov| |Readthedocs-stable| |Readthedocs-latest|\n\n|Binder-stable|\n\nThis package facilitates the creation and rendering of graph descriptions in\nthe DOT_ language of the Graphviz_ graph drawing software (`upstream repo`_)\nfrom Python.\n\nCreate a graph object, assemble the graph by adding nodes and edges, and\nretrieve its DOT source code string. Save the source code to a file and render\nit with the Graphviz installation of your system.\n\nUse the ``view`` option/method to directly inspect the resulting (PDF, PNG,\nSVG, etc.) file with its default application. Graphs can also be rendered\nand displayed within `Jupyter notebooks`_ (formerly known as\n`IPython notebooks`_,\n`example <notebook_>`_, `nbviewer <notebook-nbviewer_>`_)\nas well as the `Jupyter QtConsole`_.\n\n\nLinks\n-----\n\n- GitHub: https://github.com/xflr6/graphviz\n- PyPI: https://pypi.org/project/graphviz/\n- Documentation: https://graphviz.readthedocs.io\n- Changelog: https://graphviz.readthedocs.io/en/latest/changelog.html\n- Issue Tracker: https://github.com/xflr6/graphviz/issues\n- Download: https://pypi.org/project/graphviz/#files\n\n\nInstallation\n------------\n\nThis package runs under Python 3.7+, use pip_ to install:\n\n.. code:: bash\n\n $ pip install graphviz\n\nTo render the generated DOT source code, you also need to install Graphviz_\n(`download page <upstream-download_>`_,\n`archived versions <upstream-archived_>`_,\n`installation procedure for Windows <upstream-windows_>`_).\n\nMake sure that the directory containing the ``dot`` executable is on your\nsystems' ``PATH``\n(sometimes done by the installer;\nsetting ``PATH``\non `Linux <set-path-linux_>`_,\n`Mac <set-path-darwin_>`_,\nand `Windows <set-path-windows_>`_).\n\nAnaconda_: see the conda-forge_ package\n`conda-forge/python-graphviz <conda-forge-python-graphviz_>`_\n(`feedstock <conda-forge-python-graphviz-feedstock_>`_),\nwhich should automatically ``conda install``\n`conda-forge/graphviz <conda-forge-graphviz_>`_\n(`feedstock <conda-forge-graphviz-feedstock_>`_) as dependency.\n\n\nQuickstart\n----------\n\nCreate a graph object:\n\n.. code:: python\n\n >>> import graphviz # doctest: +NO_EXE\n >>> dot = graphviz.Digraph(comment='The Round Table')\n >>> dot #doctest: +ELLIPSIS\n <graphviz.graphs.Digraph object at 0x...>\n\nAdd nodes and edges:\n\n.. code:: python\n\n >>> dot.node('A', 'King Arthur') # doctest: +NO_EXE\n >>> dot.node('B', 'Sir Bedevere the Wise')\n >>> dot.node('L', 'Sir Lancelot the Brave')\n\n >>> dot.edges(['AB', 'AL'])\n >>> dot.edge('B', 'L', constraint='false')\n\nCheck the generated source code:\n\n.. code:: python\n\n >>> print(dot.source) # doctest: +NORMALIZE_WHITESPACE +NO_EXE\n // The Round Table\n digraph {\n A [label=\"King Arthur\"]\n B [label=\"Sir Bedevere the Wise\"]\n L [label=\"Sir Lancelot the Brave\"]\n A -> B\n A -> L\n B -> L [constraint=false]\n }\n\nSave and render the source code:\n\n.. code:: python\n\n >>> doctest_mark_exe()\n\n >>> dot.render('doctest-output/round-table.gv').replace('\\\\', '/')\n 'doctest-output/round-table.gv.pdf'\n\nSave and render and view the result:\n\n.. code:: python\n\n >>> doctest_mark_exe()\n\n >>> dot.render('doctest-output/round-table.gv', view=True) # doctest: +SKIP\n 'doctest-output/round-table.gv.pdf'\n\n.. image:: https://raw.github.com/xflr6/graphviz/master/docs/_static/round-table.svg\n :align: center\n :alt: round-table.svg\n\n**Caveat:**\nBackslash-escapes and strings of the form ``<...>``\nhave a special meaning in the DOT language.\nIf you need to render arbitrary strings (e.g. from user input),\ncheck the details in the `user guide`_.\n\n\nSee also\n--------\n\n- pygraphviz_ |--| full-blown interface wrapping the Graphviz C library with SWIG\n- graphviz-python_ |--| official Python bindings\n (`documentation <graphviz-python-docs_>`_)\n- pydot_ |--| stable pure-Python approach, requires pyparsing\n\n\nLicense\n-------\n\nThis package is distributed under the `MIT license`_.\n\n\nDevelopment\n-----------\n\n- Development documentation: https://graphviz.readthedocs.io/en/latest/development.html\n- Release process: https://graphviz.readthedocs.io/en/latest/release_process.html\n\n\n.. _Graphviz: https://www.graphviz.org\n.. _DOT: https://www.graphviz.org/doc/info/lang.html\n.. _upstream repo: https://gitlab.com/graphviz/graphviz/\n.. _upstream-download: https://www.graphviz.org/download/\n.. _upstream-archived: https://www2.graphviz.org/Archive/stable/\n.. _upstream-windows: https://forum.graphviz.org/t/new-simplified-installation-procedure-on-windows/224\n\n.. _set-path-windows: https://www.computerhope.com/issues/ch000549.htm\n.. _set-path-linux: https://stackoverflow.com/questions/14637979/how-to-permanently-set-path-on-linux-unix\n.. _set-path-darwin: https://stackoverflow.com/questions/22465332/setting-path-environment-variable-in-osx-permanently\n\n.. _pip: https://pip.pypa.io\n\n.. _Jupyter notebooks: https://jupyter.org\n.. _IPython notebooks: https://ipython.org/notebook.html\n.. _Jupyter QtConsole: https://qtconsole.readthedocs.io\n\n.. _notebook: https://github.com/xflr6/graphviz/blob/master/examples/graphviz-notebook.ipynb\n.. _notebook-nbviewer: https://nbviewer.org/github/xflr6/graphviz/blob/master/examples/graphviz-notebook.ipynb\n\n.. _Anaconda: https://docs.anaconda.com/anaconda/install/\n.. _conda-forge: https://conda-forge.org\n.. _conda-forge-python-graphviz: https://anaconda.org/conda-forge/python-graphviz\n.. _conda-forge-python-graphviz-feedstock: https://github.com/conda-forge/python-graphviz-feedstock\n.. _conda-forge-graphviz: https://anaconda.org/conda-forge/graphviz\n.. _conda-forge-graphviz-feedstock: https://github.com/conda-forge/graphviz-feedstock\n\n.. _user guide: https://graphviz.readthedocs.io/en/stable/manual.html\n\n.. _pygraphviz: https://pypi.org/project/pygraphviz/\n.. _graphviz-python: https://pypi.org/project/graphviz-python/\n.. _graphviz-python-docs: https://www.graphviz.org/pdf/gv.3python.pdf\n.. _pydot: https://pypi.org/project/pydot/\n\n.. _MIT license: https://opensource.org/licenses/MIT\n\n\n.. |--| unicode:: U+2013\n\n\n.. |PyPI version| image:: https://img.shields.io/pypi/v/graphviz.svg\n :target: https://pypi.org/project/graphviz/\n :alt: Latest PyPI Version\n.. |License| image:: https://img.shields.io/pypi/l/graphviz.svg\n :target: https://github.com/xflr6/graphviz/blob/master/LICENSE.txt\n :alt: License\n.. |Supported Python| image:: https://img.shields.io/pypi/pyversions/graphviz.svg\n :target: https://pypi.org/project/graphviz/\n :alt: Supported Python Versions\n.. |Wheel| image:: https://img.shields.io/pypi/wheel/graphviz.svg\n :target: https://pypi.org/project/graphviz/#files\n :alt: Wheel format\n.. |Downloads| image:: https://img.shields.io/pypi/dm/graphviz.svg\n :target: https://pypistats.org/packages/graphviz\n :alt: Monthly downloads\n\n.. |Build| image:: https://github.com/xflr6/graphviz/actions/workflows/build.yaml/badge.svg?branch=master\n :target: https://github.com/xflr6/graphviz/actions/workflows/build.yaml?query=branch%3Amaster\n :alt: Build\n.. |Codecov| image:: https://codecov.io/gh/xflr6/graphviz/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/xflr6/graphviz\n :alt: Codecov\n.. |Readthedocs-stable| image:: https://readthedocs.org/projects/graphviz/badge/?version=stable\n :target: https://graphviz.readthedocs.io/en/stable/\n :alt: Readthedocs (stable)\n.. |Readthedocs-latest| image:: https://readthedocs.org/projects/graphviz/badge/?version=latest\n :target: https://graphviz.readthedocs.io/en/latest/\n :alt: Readthedocs (latest)\n\n.. |Binder-stable| image:: https://img.shields.io/badge/launch-binder%20(stable)-579ACA.svg?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFkAAABZCAMAAABi1XidAAAB8lBMVEX///9XmsrmZYH1olJXmsr1olJXmsrmZYH1olJXmsr1olJXmsrmZYH1olL1olJXmsr1olJXmsrmZYH1olL1olJXmsrmZYH1olJXmsr1olL1olJXmsrmZYH1olL1olJXmsrmZYH1olL1olL0nFf1olJXmsrmZYH1olJXmsq8dZb1olJXmsrmZYH1olJXmspXmspXmsr1olL1olJXmsrmZYH1olJXmsr1olL1olJXmsrmZYH1olL1olLeaIVXmsrmZYH1olL1olL1olJXmsrmZYH1olLna31Xmsr1olJXmsr1olJXmsrmZYH1olLqoVr1olJXmsr1olJXmsrmZYH1olL1olKkfaPobXvviGabgadXmsqThKuofKHmZ4Dobnr1olJXmsr1olJXmspXmsr1olJXmsrfZ4TuhWn1olL1olJXmsqBi7X1olJXmspZmslbmMhbmsdemsVfl8ZgmsNim8Jpk8F0m7R4m7F5nLB6jbh7jbiDirOEibOGnKaMhq+PnaCVg6qWg6qegKaff6WhnpKofKGtnomxeZy3noG6dZi+n3vCcpPDcpPGn3bLb4/Mb47UbIrVa4rYoGjdaIbeaIXhoWHmZYHobXvpcHjqdHXreHLroVrsfG/uhGnuh2bwj2Hxk17yl1vzmljzm1j0nlX1olL3AJXWAAAAbXRSTlMAEBAQHx8gICAuLjAwMDw9PUBAQEpQUFBXV1hgYGBkcHBwcXl8gICAgoiIkJCQlJicnJ2goKCmqK+wsLC4usDAwMjP0NDQ1NbW3Nzg4ODi5+3v8PDw8/T09PX29vb39/f5+fr7+/z8/Pz9/v7+zczCxgAABC5JREFUeAHN1ul3k0UUBvCb1CTVpmpaitAGSLSpSuKCLWpbTKNJFGlcSMAFF63iUmRccNG6gLbuxkXU66JAUef/9LSpmXnyLr3T5AO/rzl5zj137p136BISy44fKJXuGN/d19PUfYeO67Znqtf2KH33Id1psXoFdW30sPZ1sMvs2D060AHqws4FHeJojLZqnw53cmfvg+XR8mC0OEjuxrXEkX5ydeVJLVIlV0e10PXk5k7dYeHu7Cj1j+49uKg7uLU61tGLw1lq27ugQYlclHC4bgv7VQ+TAyj5Zc/UjsPvs1sd5cWryWObtvWT2EPa4rtnWW3JkpjggEpbOsPr7F7EyNewtpBIslA7p43HCsnwooXTEc3UmPmCNn5lrqTJxy6nRmcavGZVt/3Da2pD5NHvsOHJCrdc1G2r3DITpU7yic7w/7Rxnjc0kt5GC4djiv2Sz3Fb2iEZg41/ddsFDoyuYrIkmFehz0HR2thPgQqMyQYb2OtB0WxsZ3BeG3+wpRb1vzl2UYBog8FfGhttFKjtAclnZYrRo9ryG9uG/FZQU4AEg8ZE9LjGMzTmqKXPLnlWVnIlQQTvxJf8ip7VgjZjyVPrjw1te5otM7RmP7xm+sK2Gv9I8Gi++BRbEkR9EBw8zRUcKxwp73xkaLiqQb+kGduJTNHG72zcW9LoJgqQxpP3/Tj//c3yB0tqzaml05/+orHLksVO+95kX7/7qgJvnjlrfr2Ggsyx0eoy9uPzN5SPd86aXggOsEKW2Prz7du3VID3/tzs/sSRs2w7ovVHKtjrX2pd7ZMlTxAYfBAL9jiDwfLkq55Tm7ifhMlTGPyCAs7RFRhn47JnlcB9RM5T97ASuZXIcVNuUDIndpDbdsfrqsOppeXl5Y+XVKdjFCTh+zGaVuj0d9zy05PPK3QzBamxdwtTCrzyg/2Rvf2EstUjordGwa/kx9mSJLr8mLLtCW8HHGJc2R5hS219IiF6PnTusOqcMl57gm0Z8kanKMAQg0qSyuZfn7zItsbGyO9QlnxY0eCuD1XL2ys/MsrQhltE7Ug0uFOzufJFE2PxBo/YAx8XPPdDwWN0MrDRYIZF0mSMKCNHgaIVFoBbNoLJ7tEQDKxGF0kcLQimojCZopv0OkNOyWCCg9XMVAi7ARJzQdM2QUh0gmBozjc3Skg6dSBRqDGYSUOu66Zg+I2fNZs/M3/f/Grl/XnyF1Gw3VKCez0PN5IUfFLqvgUN4C0qNqYs5YhPL+aVZYDE4IpUk57oSFnJm4FyCqqOE0jhY2SMyLFoo56zyo6becOS5UVDdj7Vih0zp+tcMhwRpBeLyqtIjlJKAIZSbI8SGSF3k0pA3mR5tHuwPFoa7N7reoq2bqCsAk1HqCu5uvI1n6JuRXI+S1Mco54YmYTwcn6Aeic+kssXi8XpXC4V3t7/ADuTNKaQJdScAAAAAElFTkSuQmCC\n :target: https://mybinder.org/v2/gh/xflr6/graphviz/stable\n :alt: Binder (stable)\n",
- "keywords": [
- "graph",
- "visualization",
- "dot",
- "render"
- ],
- "home_page": "https://github.com/xflr6/graphviz",
- "author": "Sebastian Bank",
- "author_email": "sebastian.bank@uni-leipzig.de",
- "license": "MIT",
- "classifier": [
- "Development Status :: 4 - Beta",
- "Intended Audience :: Developers",
- "Intended Audience :: Science/Research",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Topic :: Scientific/Engineering :: Visualization"
- ],
- "requires_dist": [
- "tox (>=3) ; extra == 'dev'",
- "flake8 ; extra == 'dev'",
- "pep8-naming ; extra == 'dev'",
- "wheel ; extra == 'dev'",
- "twine ; extra == 'dev'",
- "sphinx (>=5) ; extra == 'docs'",
- "sphinx-autodoc-typehints ; extra == 'docs'",
- "sphinx-rtd-theme ; extra == 'docs'",
- "pytest (>=7) ; extra == 'test'",
- "pytest-mock (>=3) ; extra == 'test'",
- "mock (>=4) ; extra == 'test'",
- "pytest-cov ; extra == 'test'",
- "coverage ; extra == 'test'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Documentation, https://graphviz.readthedocs.io",
- "Changelog, https://graphviz.readthedocs.io/en/latest/changelog.html",
- "Issue Tracker, https://github.com/xflr6/graphviz/issues",
- "CI, https://github.com/xflr6/graphviz/actions",
- "Coverage, https://codecov.io/gh/xflr6/graphviz"
- ],
- "provides_extra": [
- "dev",
- "docs",
- "test"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/6c/df/1e3e52e35e56b912c7bcd64ba2010d6972c43dff96794074b32a62345970/greenlet-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl",
- "archive_info": {
- "hash": "sha256=96d9ea57292f636ec851a9bb961a5cc0f9976900e16e5d5647f19aa36ba6366b",
- "hashes": {
- "sha256": "96d9ea57292f636ec851a9bb961a5cc0f9976900e16e5d5647f19aa36ba6366b"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "greenlet",
- "version": "3.0.0",
- "platform": [
- "any"
- ],
- "summary": "Lightweight in-process concurrent programming",
- "description": ".. This file is included into docs/history.rst\n\n.. image:: https://github.com/python-greenlet/greenlet/workflows/tests/badge.svg\n :target: https://github.com/python-greenlet/greenlet/actions\n\nGreenlets are lightweight coroutines for in-process concurrent\nprogramming.\n\nThe \"greenlet\" package is a spin-off of `Stackless`_, a version of\nCPython that supports micro-threads called \"tasklets\". Tasklets run\npseudo-concurrently (typically in a single or a few OS-level threads)\nand are synchronized with data exchanges on \"channels\".\n\nA \"greenlet\", on the other hand, is a still more primitive notion of\nmicro-thread with no implicit scheduling; coroutines, in other words.\nThis is useful when you want to control exactly when your code runs.\nYou can build custom scheduled micro-threads on top of greenlet;\nhowever, it seems that greenlets are useful on their own as a way to\nmake advanced control flow structures. For example, we can recreate\ngenerators; the difference with Python's own generators is that our\ngenerators can call nested functions and the nested functions can\nyield values too. (Additionally, you don't need a \"yield\" keyword. See\nthe example in `test_generator.py\n<https://github.com/python-greenlet/greenlet/blob/adca19bf1f287b3395896a8f41f3f4fd1797fdc7/src/greenlet/tests/test_generator.py#L1>`_).\n\nGreenlets are provided as a C extension module for the regular unmodified\ninterpreter.\n\n.. _`Stackless`: http://www.stackless.com\n\n\nWho is using Greenlet?\n======================\n\nThere are several libraries that use Greenlet as a more flexible\nalternative to Python's built in coroutine support:\n\n - `Concurrence`_\n - `Eventlet`_\n - `Gevent`_\n\n.. _Concurrence: http://opensource.hyves.org/concurrence/\n.. _Eventlet: http://eventlet.net/\n.. _Gevent: http://www.gevent.org/\n\nGetting Greenlet\n================\n\nThe easiest way to get Greenlet is to install it with pip::\n\n pip install greenlet\n\n\nSource code archives and binary distributions are available on the\npython package index at https://pypi.org/project/greenlet\n\nThe source code repository is hosted on github:\nhttps://github.com/python-greenlet/greenlet\n\nDocumentation is available on readthedocs.org:\nhttps://greenlet.readthedocs.io\n",
- "description_content_type": "text/x-rst",
- "keywords": [
- "greenlet",
- "coroutine",
- "concurrency",
- "threads",
- "cooperative"
- ],
- "home_page": "https://greenlet.readthedocs.io/",
- "author": "Alexey Borzenkov",
- "author_email": "snaury@gmail.com",
- "maintainer": "Jason Madden",
- "maintainer_email": "jason@seecoresoftware.com",
- "license": "MIT License",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Natural Language :: English",
- "Programming Language :: C",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Operating System :: OS Independent",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ],
- "requires_dist": [
- "Sphinx ; extra == 'docs'",
- "objgraph ; extra == 'test'",
- "psutil ; extra == 'test'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Bug Tracker, https://github.com/python-greenlet/greenlet/issues",
- "Source Code, https://github.com/python-greenlet/greenlet/",
- "Documentation, https://greenlet.readthedocs.io/"
- ],
- "provides_extra": [
- "docs",
- "test"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/e7/f9/33e17bb938d4b2afc7373120190e857f951d26f899992a9e717121170e2a/grpcio-1.59.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "archive_info": {
- "hash": "sha256=956f0b7cb465a65de1bd90d5a7475b4dc55089b25042fe0f6c870707e9aabb1d",
- "hashes": {
- "sha256": "956f0b7cb465a65de1bd90d5a7475b4dc55089b25042fe0f6c870707e9aabb1d"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "grpcio",
- "version": "1.59.0",
- "summary": "HTTP/2-based RPC framework",
- "description": "gRPC Python\n===========\n\n|compat_check_pypi|\n\nPackage for gRPC Python.\n\n.. |compat_check_pypi| image:: https://python-compatibility-tools.appspot.com/one_badge_image?package=grpcio\n :target: https://python-compatibility-tools.appspot.com/one_badge_target?package=grpcio\n\nSupported Python Versions\n-------------------------\nPython >= 3.7\n\nInstallation\n------------\n\ngRPC Python is available for Linux, macOS, and Windows.\n\nInstalling From PyPI\n~~~~~~~~~~~~~~~~~~~~\n\nIf you are installing locally...\n\n::\n\n $ pip install grpcio\n\nElse system wide (on Ubuntu)...\n\n::\n\n $ sudo pip install grpcio\n\nIf you're on Windows make sure that you installed the :code:`pip.exe` component\nwhen you installed Python (if not go back and install it!) then invoke:\n\n::\n\n $ pip.exe install grpcio\n\nWindows users may need to invoke :code:`pip.exe` from a command line ran as\nadministrator.\n\nn.b. On Windows and on Mac OS X one *must* have a recent release of :code:`pip`\nto retrieve the proper wheel from PyPI. Be sure to upgrade to the latest\nversion!\n\nInstalling From Source\n~~~~~~~~~~~~~~~~~~~~~~\n\nBuilding from source requires that you have the Python headers (usually a\npackage named :code:`python-dev`).\n\n::\n\n $ export REPO_ROOT=grpc # REPO_ROOT can be any directory of your choice\n $ git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc $REPO_ROOT\n $ cd $REPO_ROOT\n $ git submodule update --init\n\n # For the next two commands do `sudo pip install` if you get permission-denied errors\n $ pip install -rrequirements.txt\n $ GRPC_PYTHON_BUILD_WITH_CYTHON=1 pip install .\n\nYou cannot currently install Python from source on Windows. Things might work\nout for you in MSYS2 (follow the Linux instructions), but it isn't officially\nsupported at the moment.\n\nTroubleshooting\n~~~~~~~~~~~~~~~\n\nHelp, I ...\n\n* **... see a** :code:`pkg_resources.VersionConflict` **when I try to install\n grpc**\n\n This is likely because :code:`pip` doesn't own the offending dependency,\n which in turn is likely because your operating system's package manager owns\n it. You'll need to force the installation of the dependency:\n\n :code:`pip install --ignore-installed $OFFENDING_DEPENDENCY`\n\n For example, if you get an error like the following:\n\n ::\n\n Traceback (most recent call last):\n File \"<string>\", line 17, in <module>\n ...\n File \"/usr/lib/python2.7/dist-packages/pkg_resources.py\", line 509, in find\n raise VersionConflict(dist, req)\n pkg_resources.VersionConflict: (six 1.8.0 (/usr/lib/python2.7/dist-packages), Requirement.parse('six>=1.10'))\n\n You can fix it by doing:\n\n ::\n\n sudo pip install --ignore-installed six\n\n* **... see the following error on some platforms**\n\n ::\n\n /tmp/pip-build-U8pSsr/cython/Cython/Plex/Scanners.c:4:20: fatal error: Python.h: No such file or directory\n #include \"Python.h\"\n ^\n compilation terminated.\n\n You can fix it by installing `python-dev` package. i.e\n\n ::\n\n sudo apt-get install python-dev\n\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://grpc.io",
- "author": "The gRPC Authors",
- "author_email": "grpc-io@googlegroups.com",
- "license": "Apache License 2.0",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "License :: OSI Approved :: Apache Software License"
- ],
- "requires_dist": [
- "grpcio-tools >=1.59.0 ; extra == 'protobuf'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Source Code, https://github.com/grpc/grpc",
- "Bug Tracker, https://github.com/grpc/grpc/issues",
- "Documentation, https://grpc.github.io/grpc/python"
- ],
- "provides_extra": [
- "protobuf"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/0e/2a/c3a878eccb100ccddf45c50b6b8db8cf3301a6adede6e31d48e8531cab13/gunicorn-21.2.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=3213aa5e8c24949e792bcacfc176fef362e7aac80b76c56f6b5122bf350722f0",
- "hashes": {
- "sha256": "3213aa5e8c24949e792bcacfc176fef362e7aac80b76c56f6b5122bf350722f0"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "gunicorn",
- "version": "21.2.0",
- "summary": "WSGI HTTP Server for UNIX",
- "description": "Gunicorn\n--------\n\n.. image:: https://img.shields.io/pypi/v/gunicorn.svg?style=flat\n :alt: PyPI version\n :target: https://pypi.python.org/pypi/gunicorn\n\n.. image:: https://img.shields.io/pypi/pyversions/gunicorn.svg\n :alt: Supported Python versions\n :target: https://pypi.python.org/pypi/gunicorn\n\n.. image:: https://github.com/benoitc/gunicorn/actions/workflows/tox.yml/badge.svg\n :alt: Build Status\n :target: https://github.com/benoitc/gunicorn/actions/workflows/tox.yml\n\n.. image:: https://github.com/benoitc/gunicorn/actions/workflows/lint.yml/badge.svg\n :alt: Lint Status\n :target: https://github.com/benoitc/gunicorn/actions/workflows/lint.yml\n\nGunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX. It's a pre-fork\nworker model ported from Ruby's Unicorn_ project. The Gunicorn server is broadly\ncompatible with various web frameworks, simply implemented, light on server\nresource usage, and fairly speedy.\n\nFeel free to join us in `#gunicorn`_ on `Libera.chat`_.\n\nDocumentation\n-------------\n\nThe documentation is hosted at https://docs.gunicorn.org.\n\nInstallation\n------------\n\nGunicorn requires **Python 3.x >= 3.5**.\n\nInstall from PyPI::\n\n $ pip install gunicorn\n\n\nUsage\n-----\n\nBasic usage::\n\n $ gunicorn [OPTIONS] APP_MODULE\n\nWhere ``APP_MODULE`` is of the pattern ``$(MODULE_NAME):$(VARIABLE_NAME)``. The\nmodule name can be a full dotted path. The variable name refers to a WSGI\ncallable that should be found in the specified module.\n\nExample with test app::\n\n $ cd examples\n $ gunicorn --workers=2 test:app\n\n\nContributing\n------------\n\nSee `our complete contributor's guide <CONTRIBUTING.md>`_ for more details.\n\n\nLicense\n-------\n\nGunicorn is released under the MIT License. See the LICENSE_ file for more\ndetails.\n\n.. _Unicorn: https://bogomips.org/unicorn/\n.. _`#gunicorn`: https://web.libera.chat/?channels=#gunicorn\n.. _`Libera.chat`: https://libera.chat/\n.. _LICENSE: https://github.com/benoitc/gunicorn/blob/master/LICENSE\n",
- "home_page": "https://gunicorn.org",
- "author": "Benoit Chesneau",
- "author_email": "benoitc@gunicorn.org",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Other Environment",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: MacOS :: MacOS X",
- "Operating System :: POSIX",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Internet",
- "Topic :: Utilities",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "Topic :: Internet :: WWW/HTTP",
- "Topic :: Internet :: WWW/HTTP :: WSGI",
- "Topic :: Internet :: WWW/HTTP :: WSGI :: Server",
- "Topic :: Internet :: WWW/HTTP :: Dynamic Content"
- ],
- "requires_dist": [
- "packaging",
- "importlib-metadata ; python_version < \"3.8\"",
- "eventlet (>=0.24.1) ; extra == 'eventlet'",
- "gevent (>=1.4.0) ; extra == 'gevent'",
- "setproctitle ; extra == 'setproctitle'",
- "tornado (>=0.2) ; extra == 'tornado'"
- ],
- "requires_python": ">=3.5",
- "project_url": [
- "Documentation, https://docs.gunicorn.org",
- "Homepage, https://gunicorn.org",
- "Issue tracker, https://github.com/benoitc/gunicorn/issues",
- "Source code, https://github.com/benoitc/gunicorn"
- ],
- "provides_extra": [
- "eventlet",
- "gevent",
- "gthread",
- "setproctitle",
- "tornado"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761",
- "hashes": {
- "sha256": "e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "h11",
- "version": "0.14.0",
- "summary": "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1",
- "description": "h11\n===\n\n.. image:: https://travis-ci.org/python-hyper/h11.svg?branch=master\n :target: https://travis-ci.org/python-hyper/h11\n :alt: Automated test status\n\n.. image:: https://codecov.io/gh/python-hyper/h11/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/python-hyper/h11\n :alt: Test coverage\n\n.. image:: https://readthedocs.org/projects/h11/badge/?version=latest\n :target: http://h11.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\nThis is a little HTTP/1.1 library written from scratch in Python,\nheavily inspired by `hyper-h2 <https://hyper-h2.readthedocs.io/>`_.\n\nIt's a \"bring-your-own-I/O\" library; h11 contains no IO code\nwhatsoever. This means you can hook h11 up to your favorite network\nAPI, and that could be anything you want: synchronous, threaded,\nasynchronous, or your own implementation of `RFC 6214\n<https://tools.ietf.org/html/rfc6214>`_ -- h11 won't judge you.\n(Compare this to the current state of the art, where every time a `new\nnetwork API <https://trio.readthedocs.io/>`_ comes along then someone\ngets to start over reimplementing the entire HTTP protocol from\nscratch.) Cory Benfield made an `excellent blog post describing the\nbenefits of this approach\n<https://lukasa.co.uk/2015/10/The_New_Hyper/>`_, or if you like video\nthen here's his `PyCon 2016 talk on the same theme\n<https://www.youtube.com/watch?v=7cC3_jGwl_U>`_.\n\nThis also means that h11 is not immediately useful out of the box:\nit's a toolkit for building programs that speak HTTP, not something\nthat could directly replace ``requests`` or ``twisted.web`` or\nwhatever. But h11 makes it much easier to implement something like\n``requests`` or ``twisted.web``.\n\nAt a high level, working with h11 goes like this:\n\n1) First, create an ``h11.Connection`` object to track the state of a\n single HTTP/1.1 connection.\n\n2) When you read data off the network, pass it to\n ``conn.receive_data(...)``; you'll get back a list of objects\n representing high-level HTTP \"events\".\n\n3) When you want to send a high-level HTTP event, create the\n corresponding \"event\" object and pass it to ``conn.send(...)``;\n this will give you back some bytes that you can then push out\n through the network.\n\nFor example, a client might instantiate and then send a\n``h11.Request`` object, then zero or more ``h11.Data`` objects for the\nrequest body (e.g., if this is a POST), and then a\n``h11.EndOfMessage`` to indicate the end of the message. Then the\nserver would then send back a ``h11.Response``, some ``h11.Data``, and\nits own ``h11.EndOfMessage``. If either side violates the protocol,\nyou'll get a ``h11.ProtocolError`` exception.\n\nh11 is suitable for implementing both servers and clients, and has a\npleasantly symmetric API: the events you send as a client are exactly\nthe ones that you receive as a server and vice-versa.\n\n`Here's an example of a tiny HTTP client\n<https://github.com/python-hyper/h11/blob/master/examples/basic-client.py>`_\n\nIt also has `a fine manual <https://h11.readthedocs.io/>`_.\n\nFAQ\n---\n\n*Whyyyyy?*\n\nI wanted to play with HTTP in `Curio\n<https://curio.readthedocs.io/en/latest/tutorial.html>`__ and `Trio\n<https://trio.readthedocs.io>`__, which at the time didn't have any\nHTTP libraries. So I thought, no big deal, Python has, like, a dozen\ndifferent implementations of HTTP, surely I can find one that's\nreusable. I didn't find one, but I did find Cory's call-to-arms\nblog-post. So I figured, well, fine, if I have to implement HTTP from\nscratch, at least I can make sure no-one *else* has to ever again.\n\n*Should I use it?*\n\nMaybe. You should be aware that it's a very young project. But, it's\nfeature complete and has an exhaustive test-suite and complete docs,\nso the next step is for people to try using it and see how it goes\n:-). If you do then please let us know -- if nothing else we'll want\nto talk to you before making any incompatible changes!\n\n*What are the features/limitations?*\n\nRoughly speaking, it's trying to be a robust, complete, and non-hacky\nimplementation of the first \"chapter\" of the HTTP/1.1 spec: `RFC 7230:\nHTTP/1.1 Message Syntax and Routing\n<https://tools.ietf.org/html/rfc7230>`_. That is, it mostly focuses on\nimplementing HTTP at the level of taking bytes on and off the wire,\nand the headers related to that, and tries to be anal about spec\nconformance. It doesn't know about higher-level concerns like URL\nrouting, conditional GETs, cross-origin cookie policies, or content\nnegotiation. But it does know how to take care of framing,\ncross-version differences in keep-alive handling, and the \"obsolete\nline folding\" rule, so you can focus your energies on the hard /\ninteresting parts for your application, and it tries to support the\nfull specification in the sense that any useful HTTP/1.1 conformant\napplication should be able to use h11.\n\nIt's pure Python, and has no dependencies outside of the standard\nlibrary.\n\nIt has a test suite with 100.0% coverage for both statements and\nbranches.\n\nCurrently it supports Python 3 (testing on 3.7-3.10) and PyPy 3.\nThe last Python 2-compatible version was h11 0.11.x.\n(Originally it had a Cython wrapper for `http-parser\n<https://github.com/nodejs/http-parser>`_ and a beautiful nested state\nmachine implemented with ``yield from`` to postprocess the output. But\nI had to take these out -- the new *parser* needs fewer lines-of-code\nthan the old *parser wrapper*, is written in pure Python, uses no\nexotic language syntax, and has more features. It's sad, really; that\nold state machine was really slick. I just need a few sentences here\nto mourn that.)\n\nI don't know how fast it is. I haven't benchmarked or profiled it yet,\nso it's probably got a few pointless hot spots, and I've been trying\nto err on the side of simplicity and robustness instead of\nmicro-optimization. But at the architectural level I tried hard to\navoid fundamentally bad decisions, e.g., I believe that all the\nparsing algorithms remain linear-time even in the face of pathological\ninput like slowloris, and there are no byte-by-byte loops. (I also\nbelieve that it maintains bounded memory usage in the face of\narbitrary/pathological input.)\n\nThe whole library is ~800 lines-of-code. You can read and understand\nthe whole thing in less than an hour. Most of the energy invested in\nthis so far has been spent on trying to keep things simple by\nminimizing special-cases and ad hoc state manipulation; even though it\nis now quite small and simple, I'm still annoyed that I haven't\nfigured out how to make it even smaller and simpler. (Unfortunately,\nHTTP does not lend itself to simplicity.)\n\nThe API is ~feature complete and I don't expect the general outlines\nto change much, but you can't judge an API's ergonomics until you\nactually document and use it, so I'd expect some changes in the\ndetails.\n\n*How do I try it?*\n\n.. code-block:: sh\n\n $ pip install h11\n $ git clone git@github.com:python-hyper/h11\n $ cd h11/examples\n $ python basic-client.py\n\nand go from there.\n\n*License?*\n\nMIT\n\n*Code of conduct?*\n\nContributors are requested to follow our `code of conduct\n<https://github.com/python-hyper/h11/blob/master/CODE_OF_CONDUCT.md>`_ in\nall project spaces.\n",
- "home_page": "https://github.com/python-hyper/h11",
- "author": "Nathaniel J. Smith",
- "author_email": "njs@pobox.com",
- "license": "MIT",
- "classifier": [
- "Development Status :: 3 - Alpha",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Topic :: Internet :: WWW/HTTP",
- "Topic :: System :: Networking"
- ],
- "requires_dist": [
- "typing-extensions ; python_version < \"3.8\""
- ],
- "requires_python": ">=3.7"
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/ac/97/724afbb7925339f6214bf1fdb5714d1a462690466832bf8fb3fd497649f1/httpcore-0.18.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=adc5398ee0a476567bf87467063ee63584a8bce86078bf748e48754f60202ced",
- "hashes": {
- "sha256": "adc5398ee0a476567bf87467063ee63584a8bce86078bf748e48754f60202ced"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "httpcore",
- "version": "0.18.0",
- "summary": "A minimal low-level HTTP client.",
- "description": "# HTTP Core\n\n[](https://github.com/encode/httpcore/actions)\n[](https://pypi.org/project/httpcore/)\n\n> *Do one thing, and do it well.*\n\nThe HTTP Core package provides a minimal low-level HTTP client, which does\none thing only. Sending HTTP requests.\n\nIt does not provide any high level model abstractions over the API,\ndoes not handle redirects, multipart uploads, building authentication headers,\ntransparent HTTP caching, URL parsing, session cookie handling,\ncontent or charset decoding, handling JSON, environment based configuration\ndefaults, or any of that Jazz.\n\nSome things HTTP Core does do:\n\n* Sending HTTP requests.\n* Thread-safe / task-safe connection pooling.\n* HTTP(S) proxy & SOCKS proxy support.\n* Supports HTTP/1.1 and HTTP/2.\n* Provides both sync and async interfaces.\n* Async backend support for `asyncio` and `trio`.\n\n## Requirements\n\nPython 3.8+\n\n## Installation\n\nFor HTTP/1.1 only support, install with:\n\n```shell\n$ pip install httpcore\n```\n\nFor HTTP/1.1 and HTTP/2 support, install with:\n\n```shell\n$ pip install httpcore[http2]\n```\n\nFor SOCKS proxy support, install with:\n\n```shell\n$ pip install httpcore[socks]\n```\n\n# Sending requests\n\nSend an HTTP request:\n\n```python\nimport httpcore\n\nresponse = httpcore.request(\"GET\", \"https://www.example.com/\")\n\nprint(response)\n# <Response [200]>\nprint(response.status)\n# 200\nprint(response.headers)\n# [(b'Accept-Ranges', b'bytes'), (b'Age', b'557328'), (b'Cache-Control', b'max-age=604800'), ...]\nprint(response.content)\n# b'<!doctype html>\\n<html>\\n<head>\\n<title>Example Domain</title>\\n\\n<meta charset=\"utf-8\"/>\\n ...'\n```\n\nThe top-level `httpcore.request()` function is provided for convenience. In practice whenever you're working with `httpcore` you'll want to use the connection pooling functionality that it provides.\n\n```python\nimport httpcore\n\nhttp = httpcore.ConnectionPool()\nresponse = http.request(\"GET\", \"https://www.example.com/\")\n```\n\nOnce you're ready to get going, [head over to the documentation](https://www.encode.io/httpcore/).\n\n## Motivation\n\nYou *probably* don't want to be using HTTP Core directly. It might make sense if\nyou're writing something like a proxy service in Python, and you just want\nsomething at the lowest possible level, but more typically you'll want to use\na higher level client library, such as `httpx`.\n\nThe motivation for `httpcore` is:\n\n* To provide a reusable low-level client library, that other packages can then build on top of.\n* To provide a *really clear interface split* between the networking code and client logic,\n so that each is easier to understand and reason about in isolation.\n# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).\n\n## 0.18.0 (September 8th, 2023)\n\n- Add support for HTTPS proxies. (#745, #786)\n- Drop Python 3.7 support. (#727)\n- Handle `sni_hostname` extension with SOCKS proxy. (#774)\n- Handle HTTP/1.1 half-closed connections gracefully. (#641)\n- Change the type of `Extensions` from `Mapping[Str, Any]` to `MutableMapping[Str, Any]`. (#762)\n\n## 0.17.3 (July 5th, 2023)\n\n- Support async cancellations, ensuring that the connection pool is left in a clean state when cancellations occur. (#726)\n- The networking backend interface has [been added to the public API](https://www.encode.io/httpcore/network-backends). Some classes which were previously private implementation detail are now part of the top-level public API. (#699)\n- Graceful handling of HTTP/2 GoAway frames, with requests being transparently retried on a new connection. (#730)\n- Add exceptions when a synchronous `trace callback` is passed to an asynchronous request or an asynchronous `trace callback` is passed to a synchronous request. (#717)\n- Drop Python 3.7 support. (#727)\n\n## 0.17.2 (May 23th, 2023)\n\n- Add `socket_options` argument to `ConnectionPool` and `HTTProxy` classes. (#668)\n- Improve logging with per-module logger names. (#690)\n- Add `sni_hostname` request extension. (#696)\n- Resolve race condition during import of `anyio` package. (#692)\n- Enable TCP_NODELAY for all synchronous sockets. (#651)\n\n## 0.17.1 (May 17th, 2023)\n\n- If 'retries' is set, then allow retries if an SSL handshake error occurs. (#669)\n- Improve correctness of tracebacks on network exceptions, by raising properly chained exceptions. (#678)\n- Prevent connection-hanging behaviour when HTTP/2 connections are closed by a server-sent 'GoAway' frame. (#679)\n- Fix edge-case exception when removing requests from the connection pool. (#680)\n- Fix pool timeout edge-case. (#688)\n\n## 0.17.0 (March 16th, 2023)\n\n- Add DEBUG level logging. (#648)\n- Respect HTTP/2 max concurrent streams when settings updates are sent by server. (#652)\n- Increase the allowable HTTP header size to 100kB. (#647)\n- Add `retries` option to SOCKS proxy classes. (#643)\n\n## 0.16.3 (December 20th, 2022)\n\n- Allow `ws` and `wss` schemes. Allows us to properly support websocket upgrade connections. (#625)\n- Forwarding HTTP proxies use a connection-per-remote-host. Required by some proxy implementations. (#637)\n- Don't raise `RuntimeError` when closing a connection pool with active connections. Removes some error cases when cancellations are used. (#631)\n- Lazy import `anyio`, so that it's no longer a hard dependancy, and isn't imported if unused. (#639)\n\n## 0.16.2 (November 25th, 2022)\n\n- Revert 'Fix async cancellation behaviour', which introduced race conditions. (#627)\n- Raise `RuntimeError` if attempting to us UNIX domain sockets on Windows. (#619)\n\n## 0.16.1 (November 17th, 2022)\n\n- Fix HTTP/1.1 interim informational responses, such as \"100 Continue\". (#605)\n\n## 0.16.0 (October 11th, 2022)\n\n- Support HTTP/1.1 informational responses. (#581)\n- Fix async cancellation behaviour. (#580)\n- Support `h11` 0.14. (#579)\n\n## 0.15.0 (May 17th, 2022)\n\n- Drop Python 3.6 support (#535)\n- Ensure HTTP proxy CONNECT requests include `timeout` configuration. (#506)\n- Switch to explicit `typing.Optional` for type hints. (#513)\n- For `trio` map OSError exceptions to `ConnectError`. (#543)\n\n## 0.14.7 (February 4th, 2022)\n\n- Requests which raise a PoolTimeout need to be removed from the pool queue. (#502)\n- Fix AttributeError that happened when Socks5Connection were terminated. (#501)\n\n## 0.14.6 (February 1st, 2022)\n\n- Fix SOCKS support for `http://` URLs. (#492)\n- Resolve race condition around exceptions during streaming a response. (#491)\n\n## 0.14.5 (January 18th, 2022)\n\n- SOCKS proxy support. (#478)\n- Add proxy_auth argument to HTTPProxy. (#481)\n- Improve error message on 'RemoteProtocolError' exception when server disconnects without sending a response. (#479)\n\n## 0.14.4 (January 5th, 2022)\n\n- Support HTTP/2 on HTTPS tunnelling proxies. (#468)\n- Fix proxy headers missing on HTTP forwarding. (#456)\n- Only instantiate SSL context if required. (#457)\n- More robust HTTP/2 handling. (#253, #439, #440, #441)\n\n## 0.14.3 (November 17th, 2021)\n\n- Fix race condition when removing closed connections from the pool. (#437)\n\n## 0.14.2 (November 16th, 2021)\n\n- Failed connections no longer remain in the pool. (Pull #433)\n\n## 0.14.1 (November 12th, 2021)\n\n- `max_connections` becomes optional. (Pull #429)\n- `certifi` is now included in the install dependancies. (Pull #428)\n- `h2` is now strictly optional. (Pull #428)\n\n## 0.14.0 (November 11th, 2021)\n\nThe 0.14 release is a complete reworking of `httpcore`, comprehensively addressing some underlying issues in the connection pooling, as well as substantially redesigning the API to be more user friendly.\n\nSome of the lower-level API design also makes the components more easily testable in isolation, and the package now has 100% test coverage.\n\nSee [discussion #419](https://github.com/encode/httpcore/discussions/419) for a little more background.\n\nThere's some other neat bits in there too, such as the \"trace\" extension, which gives a hook into inspecting the internal events that occur during the request/response cycle. This extension is needed for the HTTPX cli, in order to...\n\n* Log the point at which the connection is established, and the IP/port on which it is made.\n* Determine if the outgoing request should log as HTTP/1.1 or HTTP/2, rather than having to assume it's HTTP/2 if the --http2 flag was passed. (Which may not actually be true.)\n* Log SSL version info / certificate info.\n\nNote that `curio` support is not currently available in 0.14.0. If you're using `httpcore` with `curio` please get in touch, so we can assess if we ought to prioritize it as a feature or not.\n\n## 0.13.7 (September 13th, 2021)\n\n- Fix broken error messaging when URL scheme is missing, or a non HTTP(S) scheme is used. (Pull #403)\n\n## 0.13.6 (June 15th, 2021)\n\n### Fixed\n\n- Close sockets when read or write timeouts occur. (Pull #365)\n\n## 0.13.5 (June 14th, 2021)\n\n### Fixed\n\n- Resolved niggles with AnyIO EOF behaviours. (Pull #358, #362)\n\n## 0.13.4 (June 9th, 2021)\n\n### Added\n\n- Improved error messaging when URL scheme is missing, or a non HTTP(S) scheme is used. (Pull #354)\n\n### Fixed\n\n- Switched to `anyio` as the default backend implementation when running with `asyncio`. Resolves some awkward [TLS timeout issues](https://github.com/encode/httpx/discussions/1511).\n\n## 0.13.3 (May 6th, 2021)\n\n### Added\n\n- Support HTTP/2 prior knowledge, using `httpcore.SyncConnectionPool(http1=False)`. (Pull #333)\n\n### Fixed\n\n- Handle cases where environment does not provide `select.poll` support. (Pull #331)\n\n## 0.13.2 (April 29th, 2021)\n\n### Added\n\n- Improve error message for specific case of `RemoteProtocolError` where server disconnects without sending a response. (Pull #313)\n\n## 0.13.1 (April 28th, 2021)\n\n### Fixed\n\n- More resiliant testing for closed connections. (Pull #311)\n- Don't raise exceptions on ungraceful connection closes. (Pull #310)\n\n## 0.13.0 (April 21st, 2021)\n\nThe 0.13 release updates the core API in order to match the HTTPX Transport API,\nintroduced in HTTPX 0.18 onwards.\n\nAn example of making requests with the new interface is:\n\n```python\nwith httpcore.SyncConnectionPool() as http:\n status_code, headers, stream, extensions = http.handle_request(\n method=b'GET',\n url=(b'https', b'example.org', 443, b'/'),\n headers=[(b'host', b'example.org'), (b'user-agent', b'httpcore')]\n stream=httpcore.ByteStream(b''),\n extensions={}\n )\n body = stream.read()\n print(status_code, body)\n```\n\n### Changed\n\n- The `.request()` method is now `handle_request()`. (Pull #296)\n- The `.arequest()` method is now `.handle_async_request()`. (Pull #296)\n- The `headers` argument is no longer optional. (Pull #296)\n- The `stream` argument is no longer optional. (Pull #296)\n- The `ext` argument is now named `extensions`, and is no longer optional. (Pull #296)\n- The `\"reason\"` extension keyword is now named `\"reason_phrase\"`. (Pull #296)\n- The `\"reason_phrase\"` and `\"http_version\"` extensions now use byte strings for their values. (Pull #296)\n- The `httpcore.PlainByteStream()` class becomes `httpcore.ByteStream()`. (Pull #296)\n\n### Added\n\n- Streams now support a `.read()` interface. (Pull #296)\n\n### Fixed\n\n- Task cancellation no longer leaks connections from the connection pool. (Pull #305)\n\n## 0.12.3 (December 7th, 2020)\n\n### Fixed\n\n- Abort SSL connections on close rather than waiting for remote EOF when using `asyncio`. (Pull #167)\n- Fix exception raised in case of connect timeouts when using the `anyio` backend. (Pull #236)\n- Fix `Host` header precedence for `:authority` in HTTP/2. (Pull #241, #243)\n- Handle extra edge case when detecting for socket readability when using `asyncio`. (Pull #242, #244)\n- Fix `asyncio` SSL warning when using proxy tunneling. (Pull #249)\n\n## 0.12.2 (November 20th, 2020)\n\n### Fixed\n\n- Properly wrap connect errors on the asyncio backend. (Pull #235)\n- Fix `ImportError` occurring on Python 3.9 when using the HTTP/1.1 sync client in a multithreaded context. (Pull #237)\n\n## 0.12.1 (November 7th, 2020)\n\n### Added\n\n- Add connect retries. (Pull #221)\n\n### Fixed\n\n- Tweak detection of dropped connections, resolving an issue with open files limits on Linux. (Pull #185)\n- Avoid leaking connections when establishing an HTTP tunnel to a proxy has failed. (Pull #223)\n- Properly wrap OS errors when using `trio`. (Pull #225)\n\n## 0.12.0 (October 6th, 2020)\n\n### Changed\n\n- HTTP header casing is now preserved, rather than always sent in lowercase. (#216 and python-hyper/h11#104)\n\n### Added\n\n- Add Python 3.9 to officially supported versions.\n\n### Fixed\n\n- Gracefully handle a stdlib asyncio bug when a connection is closed while it is in a paused-for-reading state. (#201)\n\n## 0.11.1 (September 28nd, 2020)\n\n### Fixed\n\n- Add await to async semaphore release() coroutine (#197)\n- Drop incorrect curio classifier (#192)\n\n## 0.11.0 (September 22nd, 2020)\n\nThe Transport API with 0.11.0 has a couple of significant changes.\n\nFirstly we've moved changed the request interface in order to allow extensions, which will later enable us to support features\nsuch as trailing headers, HTTP/2 server push, and CONNECT/Upgrade connections.\n\nThe interface changes from:\n\n```python\ndef request(method, url, headers, stream, timeout):\n return (http_version, status_code, reason, headers, stream)\n```\n\nTo instead including an optional dictionary of extensions on the request and response:\n\n```python\ndef request(method, url, headers, stream, ext):\n return (status_code, headers, stream, ext)\n```\n\nHaving an open-ended extensions point will allow us to add later support for various optional features, that wouldn't otherwise be supported without these API changes.\n\nIn particular:\n\n* Trailing headers support.\n* HTTP/2 Server Push\n* sendfile.\n* Exposing raw connection on CONNECT, Upgrade, HTTP/2 bi-di streaming.\n* Exposing debug information out of the API, including template name, template context.\n\nCurrently extensions are limited to:\n\n* request: `timeout` - Optional. Timeout dictionary.\n* response: `http_version` - Optional. Include the HTTP version used on the response.\n* response: `reason` - Optional. Include the reason phrase used on the response. Only valid with HTTP/1.*.\n\nSee https://github.com/encode/httpx/issues/1274#issuecomment-694884553 for the history behind this.\n\nSecondly, the async version of `request` is now namespaced as `arequest`.\n\nThis allows concrete transports to support both sync and async implementations on the same class.\n\n### Added\n\n- Add curio support. (Pull #168)\n- Add anyio support, with `backend=\"anyio\"`. (Pull #169)\n\n### Changed\n\n- Update the Transport API to use 'ext' for optional extensions. (Pull #190)\n- Update the Transport API to use `.request` and `.arequest` so implementations can support both sync and async. (Pull #189)\n\n## 0.10.2 (August 20th, 2020)\n\n### Added\n\n- Added Unix Domain Socket support. (Pull #139)\n\n### Fixed\n\n- Always include the port on proxy CONNECT requests. (Pull #154)\n- Fix `max_keepalive_connections` configuration. (Pull #153)\n- Fixes behaviour in HTTP/1.1 where server disconnects can be used to signal the end of the response body. (Pull #164)\n\n## 0.10.1 (August 7th, 2020)\n\n- Include `max_keepalive_connections` on `AsyncHTTPProxy`/`SyncHTTPProxy` classes.\n\n## 0.10.0 (August 7th, 2020)\n\nThe most notable change in the 0.10.0 release is that HTTP/2 support is now fully optional.\n\nUse either `pip install httpcore` for HTTP/1.1 support only, or `pip install httpcore[http2]` for HTTP/1.1 and HTTP/2 support.\n\n### Added\n\n- HTTP/2 support becomes optional. (Pull #121, #130)\n- Add `local_address=...` support. (Pull #100, #134)\n- Add `PlainByteStream`, `IteratorByteStream`, `AsyncIteratorByteStream`. The `AsyncByteSteam` and `SyncByteStream` classes are now pure interface classes. (#133)\n- Add `LocalProtocolError`, `RemoteProtocolError` exceptions. (Pull #129)\n- Add `UnsupportedProtocol` exception. (Pull #128)\n- Add `.get_connection_info()` method. (Pull #102, #137)\n- Add better TRACE logs. (Pull #101)\n\n### Changed\n\n- `max_keepalive` is deprecated in favour of `max_keepalive_connections`. (Pull #140)\n\n### Fixed\n\n- Improve handling of server disconnects. (Pull #112)\n\n## 0.9.1 (May 27th, 2020)\n\n### Fixed\n\n- Proper host resolution for sync case, including IPv6 support. (Pull #97)\n- Close outstanding connections when connection pool is closed. (Pull #98)\n\n## 0.9.0 (May 21th, 2020)\n\n### Changed\n\n- URL port becomes an `Optional[int]` instead of `int`. (Pull #92)\n\n### Fixed\n\n- Honor HTTP/2 max concurrent streams settings. (Pull #89, #90)\n- Remove incorrect debug log. (Pull #83)\n\n## 0.8.4 (May 11th, 2020)\n\n### Added\n\n- Logging via HTTPCORE_LOG_LEVEL and HTTPX_LOG_LEVEL environment variables\nand TRACE level logging. (Pull #79)\n\n### Fixed\n\n- Reuse of connections on HTTP/2 in close concurrency situations. (Pull #81)\n\n## 0.8.3 (May 6rd, 2020)\n\n### Fixed\n\n- Include `Host` and `Accept` headers on proxy \"CONNECT\" requests.\n- De-duplicate any headers also contained in proxy_headers.\n- HTTP/2 flag not being passed down to proxy connections.\n\n## 0.8.2 (May 3rd, 2020)\n\n### Fixed\n\n- Fix connections using proxy forwarding requests not being added to the\nconnection pool properly. (Pull #70)\n\n## 0.8.1 (April 30th, 2020)\n\n### Changed\n\n- Allow inherintance of both `httpcore.AsyncByteStream`, `httpcore.SyncByteStream` without type conflicts.\n\n## 0.8.0 (April 30th, 2020)\n\n### Fixed\n\n- Fixed tunnel proxy support.\n\n### Added\n\n- New `TimeoutException` base class.\n\n## 0.7.0 (March 5th, 2020)\n\n- First integration with HTTPX.\n",
- "description_content_type": "text/markdown",
- "author_email": "Tom Christie <tom@tomchristie.com>",
- "classifier": [
- "Development Status :: 3 - Alpha",
- "Environment :: Web Environment",
- "Framework :: AsyncIO",
- "Framework :: Trio",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Topic :: Internet :: WWW/HTTP"
- ],
- "requires_dist": [
- "anyio<5.0,>=3.0",
- "certifi",
- "h11<0.15,>=0.13",
- "sniffio==1.*",
- "h2<5,>=3; extra == 'http2'",
- "socksio==1.*; extra == 'socks'"
- ],
- "requires_python": ">=3.8",
- "project_url": [
- "Documentation, https://www.encode.io/httpcore",
- "Homepage, https://www.encode.io/httpcore/",
- "Source, https://github.com/encode/httpcore"
- ],
- "provides_extra": [
- "http2",
- "socks"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/33/0d/d9ce469af019741c8999711d36b270ff992ceb1a0293f73f9f34fdf131e9/httpx-0.25.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=181ea7f8ba3a82578be86ef4171554dd45fec26a02556a744db029a0a27b7100",
- "hashes": {
- "sha256": "181ea7f8ba3a82578be86ef4171554dd45fec26a02556a744db029a0a27b7100"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "httpx",
- "version": "0.25.0",
- "summary": "The next generation HTTP client.",
- "description": "<p align=\"center\">\n <a href=\"https://www.python-httpx.org/\"><img width=\"350\" height=\"208\" src=\"https://raw.githubusercontent.com/encode/httpx/master/docs/img/butterfly.png\" alt='HTTPX'></a>\n</p>\n\n<p align=\"center\"><strong>HTTPX</strong> <em>- A next-generation HTTP client for Python.</em></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/encode/httpx/actions\">\n <img src=\"https://github.com/encode/httpx/workflows/Test%20Suite/badge.svg\" alt=\"Test Suite\">\n</a>\n<a href=\"https://pypi.org/project/httpx/\">\n <img src=\"https://badge.fury.io/py/httpx.svg\" alt=\"Package version\">\n</a>\n</p>\n\nHTTPX is a fully featured HTTP client library for Python 3. It includes **an integrated\ncommand line client**, has support for both **HTTP/1.1 and HTTP/2**, and provides both **sync\nand async APIs**.\n\n---\n\nInstall HTTPX using pip:\n\n```shell\n$ pip install httpx\n```\n\nNow, let's get started:\n\n```pycon\n>>> import httpx\n>>> r = httpx.get('https://www.example.org/')\n>>> r\n<Response [200 OK]>\n>>> r.status_code\n200\n>>> r.headers['content-type']\n'text/html; charset=UTF-8'\n>>> r.text\n'<!doctype html>\\n<html>\\n<head>\\n<title>Example Domain</title>...'\n```\n\nOr, using the command-line client.\n\n```shell\n$ pip install 'httpx[cli]' # The command line client is an optional dependency.\n```\n\nWhich now allows us to use HTTPX directly from the command-line...\n\n<p align=\"center\">\n <img width=\"700\" src=\"https://raw.githubusercontent.com/encode/httpx/master/docs/img/httpx-help.png\" alt='httpx --help'>\n</p>\n\nSending a request...\n\n<p align=\"center\">\n <img width=\"700\" src=\"https://raw.githubusercontent.com/encode/httpx/master/docs/img/httpx-request.png\" alt='httpx http://httpbin.org/json'>\n</p>\n\n## Features\n\nHTTPX builds on the well-established usability of `requests`, and gives you:\n\n* A broadly [requests-compatible API](https://www.python-httpx.org/compatibility/).\n* An integrated command-line client.\n* HTTP/1.1 [and HTTP/2 support](https://www.python-httpx.org/http2/).\n* Standard synchronous interface, but with [async support if you need it](https://www.python-httpx.org/async/).\n* Ability to make requests directly to [WSGI applications](https://www.python-httpx.org/advanced/#calling-into-python-web-apps) or [ASGI applications](https://www.python-httpx.org/async/#calling-into-python-web-apps).\n* Strict timeouts everywhere.\n* Fully type annotated.\n* 100% test coverage.\n\nPlus all the standard features of `requests`...\n\n* International Domains and URLs\n* Keep-Alive & Connection Pooling\n* Sessions with Cookie Persistence\n* Browser-style SSL Verification\n* Basic/Digest Authentication\n* Elegant Key/Value Cookies\n* Automatic Decompression\n* Automatic Content Decoding\n* Unicode Response Bodies\n* Multipart File Uploads\n* HTTP(S) Proxy Support\n* Connection Timeouts\n* Streaming Downloads\n* .netrc Support\n* Chunked Requests\n\n## Installation\n\nInstall with pip:\n\n```shell\n$ pip install httpx\n```\n\nOr, to include the optional HTTP/2 support, use:\n\n```shell\n$ pip install httpx[http2]\n```\n\nHTTPX requires Python 3.8+.\n\n## Documentation\n\nProject documentation is available at [https://www.python-httpx.org/](https://www.python-httpx.org/).\n\nFor a run-through of all the basics, head over to the [QuickStart](https://www.python-httpx.org/quickstart/).\n\nFor more advanced topics, see the [Advanced Usage](https://www.python-httpx.org/advanced/) section, the [async support](https://www.python-httpx.org/async/) section, or the [HTTP/2](https://www.python-httpx.org/http2/) section.\n\nThe [Developer Interface](https://www.python-httpx.org/api/) provides a comprehensive API reference.\n\nTo find out about tools that integrate with HTTPX, see [Third Party Packages](https://www.python-httpx.org/third_party_packages/).\n\n## Contribute\n\nIf you want to contribute with HTTPX check out the [Contributing Guide](https://www.python-httpx.org/contributing/) to learn how to start.\n\n## Dependencies\n\nThe HTTPX project relies on these excellent libraries:\n\n* `httpcore` - The underlying transport implementation for `httpx`.\n * `h11` - HTTP/1.1 support.\n* `certifi` - SSL certificates.\n* `idna` - Internationalized domain name support.\n* `sniffio` - Async library autodetection.\n\nAs well as these optional installs:\n\n* `h2` - HTTP/2 support. *(Optional, with `httpx[http2]`)*\n* `socksio` - SOCKS proxy support. *(Optional, with `httpx[socks]`)*\n* `rich` - Rich terminal support. *(Optional, with `httpx[cli]`)*\n* `click` - Command line client support. *(Optional, with `httpx[cli]`)*\n* `brotli` or `brotlicffi` - Decoding for \"brotli\" compressed responses. *(Optional, with `httpx[brotli]`)*\n\nA huge amount of credit is due to `requests` for the API layout that\nmuch of this work follows, as well as to `urllib3` for plenty of design\ninspiration around the lower-level networking details.\n\n---\n\n<p align=\"center\"><i>HTTPX is <a href=\"https://github.com/encode/httpx/blob/master/LICENSE.md\">BSD licensed</a> code.<br/>Designed & crafted with care.</i><br/>— 🦋 —</p>\n\n## Release Information\n\n### Removed\n\n* Drop support for Python 3.7. (#2813)\n\n### Added\n\n* Support HTTPS proxies. (#2845)\n* Change the type of `Extensions` from `Mapping[Str, Any]` to `MutableMapping[Str, Any]`. (#2803)\n* Add `socket_options` argument to `httpx.HTTPTransport` and `httpx.AsyncHTTPTransport` classes. (#2716)\n* The `Response.raise_for_status()` method now returns the response instance. For example: `data = httpx.get('...').raise_for_status().json()`. (#2776)\n\n### Fixed\n\n* Return `500` error response instead of exceptions when `raise_app_exceptions=False` is set on `ASGITransport`. (#2669)\n* Ensure all `WSGITransport` environs have a `SERVER_PROTOCOL`. (#2708)\n* Always encode forward slashes as `%2F` in query parameters (#2723)\n* Use Mozilla documentation instead of `httpstatuses.com` for HTTP error reference (#2768)\n\n\n---\n\n[Full changelog](https://github.com/encode/httpx/blob/master/CHANGELOG.md)\n",
- "description_content_type": "text/markdown",
- "author_email": "Tom Christie <tom@tomchristie.com>",
- "classifier": [
- "Development Status :: 4 - Beta",
- "Environment :: Web Environment",
- "Framework :: AsyncIO",
- "Framework :: Trio",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Topic :: Internet :: WWW/HTTP"
- ],
- "requires_dist": [
- "certifi",
- "httpcore<0.19.0,>=0.18.0",
- "idna",
- "sniffio",
- "brotli; platform_python_implementation == 'CPython' and extra == 'brotli'",
- "brotlicffi; platform_python_implementation != 'CPython' and extra == 'brotli'",
- "click==8.*; extra == 'cli'",
- "pygments==2.*; extra == 'cli'",
- "rich<14,>=10; extra == 'cli'",
- "h2<5,>=3; extra == 'http2'",
- "socksio==1.*; extra == 'socks'"
- ],
- "requires_python": ">=3.8",
- "project_url": [
- "Changelog, https://github.com/encode/httpx/blob/master/CHANGELOG.md",
- "Documentation, https://www.python-httpx.org",
- "Homepage, https://github.com/encode/httpx",
- "Source, https://github.com/encode/httpx"
- ],
- "provides_extra": [
- "brotli",
- "cli",
- "http2",
- "socks"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/a2/38/928ddce2273eaa564f6f50de919327bf3a00f091b5baba8dfa9460f3a8a8/idna-2.10-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0",
- "hashes": {
- "sha256": "b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "idna",
- "version": "2.10",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "Internationalized Domain Names in Applications (IDNA)",
- "description": "Internationalized Domain Names in Applications (IDNA)\n=====================================================\n\nSupport for the Internationalised Domain Names in Applications\n(IDNA) protocol as specified in `RFC 5891 <http://tools.ietf.org/html/rfc5891>`_.\nThis is the latest version of the protocol and is sometimes referred to as\n“IDNA 2008”.\n\nThis library also provides support for Unicode Technical Standard 46,\n`Unicode IDNA Compatibility Processing <http://unicode.org/reports/tr46/>`_.\n\nThis acts as a suitable replacement for the “encodings.idna” module that\ncomes with the Python standard library, but only supports the\nold, deprecated IDNA specification (`RFC 3490 <http://tools.ietf.org/html/rfc3490>`_).\n\nBasic functions are simply executed:\n\n.. code-block:: pycon\n\n # Python 3\n >>> import idna\n >>> idna.encode('ドメイン.テスト')\n b'xn--eckwd4c7c.xn--zckzah'\n >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))\n ドメイン.テスト\n\n # Python 2\n >>> import idna\n >>> idna.encode(u'ドメイン.テスト')\n 'xn--eckwd4c7c.xn--zckzah'\n >>> print idna.decode('xn--eckwd4c7c.xn--zckzah')\n ドメイン.テスト\n\nPackages\n--------\n\nThe latest tagged release version is published in the PyPI repository:\n\n.. image:: https://badge.fury.io/py/idna.svg\n :target: http://badge.fury.io/py/idna\n\n\nInstallation\n------------\n\nTo install this library, you can use pip:\n\n.. code-block:: bash\n\n $ pip install idna\n\nAlternatively, you can install the package using the bundled setup script:\n\n.. code-block:: bash\n\n $ python setup.py install\n\nThis library works with Python 2.7 and Python 3.4 or later.\n\n\nUsage\n-----\n\nFor typical usage, the ``encode`` and ``decode`` functions will take a domain\nname argument and perform a conversion to A-labels or U-labels respectively.\n\n.. code-block:: pycon\n\n # Python 3\n >>> import idna\n >>> idna.encode('ドメイン.テスト')\n b'xn--eckwd4c7c.xn--zckzah'\n >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))\n ドメイン.テスト\n\nYou may use the codec encoding and decoding methods using the\n``idna.codec`` module:\n\n.. code-block:: pycon\n\n # Python 2\n >>> import idna.codec\n >>> print u'домена.испытание'.encode('idna')\n xn--80ahd1agd.xn--80akhbyknj4f\n >>> print 'xn--80ahd1agd.xn--80akhbyknj4f'.decode('idna')\n домена.испытание\n\nConversions can be applied at a per-label basis using the ``ulabel`` or ``alabel``\nfunctions if necessary:\n\n.. code-block:: pycon\n\n # Python 2\n >>> idna.alabel(u'测试')\n 'xn--0zwm56d'\n\nCompatibility Mapping (UTS #46)\n+++++++++++++++++++++++++++++++\n\nAs described in `RFC 5895 <http://tools.ietf.org/html/rfc5895>`_, the IDNA\nspecification no longer normalizes input from different potential ways a user\nmay input a domain name. This functionality, known as a “mapping”, is now\nconsidered by the specification to be a local user-interface issue distinct\nfrom IDNA conversion functionality.\n\nThis library provides one such mapping, that was developed by the Unicode\nConsortium. Known as `Unicode IDNA Compatibility Processing <http://unicode.org/reports/tr46/>`_,\nit provides for both a regular mapping for typical applications, as well as\na transitional mapping to help migrate from older IDNA 2003 applications.\n\nFor example, “Königsgäßchen” is not a permissible label as *LATIN CAPITAL\nLETTER K* is not allowed (nor are capital letters in general). UTS 46 will\nconvert this into lower case prior to applying the IDNA conversion.\n\n.. code-block:: pycon\n\n # Python 3\n >>> import idna\n >>> idna.encode(u'Königsgäßchen')\n ...\n idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed\n >>> idna.encode('Königsgäßchen', uts46=True)\n b'xn--knigsgchen-b4a3dun'\n >>> print(idna.decode('xn--knigsgchen-b4a3dun'))\n königsgäßchen\n\nTransitional processing provides conversions to help transition from the older\n2003 standard to the current standard. For example, in the original IDNA\nspecification, the *LATIN SMALL LETTER SHARP S* (ß) was converted into two\n*LATIN SMALL LETTER S* (ss), whereas in the current IDNA specification this\nconversion is not performed.\n\n.. code-block:: pycon\n\n # Python 2\n >>> idna.encode(u'Königsgäßchen', uts46=True, transitional=True)\n 'xn--knigsgsschen-lcb0w'\n\nImplementors should use transitional processing with caution, only in rare\ncases where conversion from legacy labels to current labels must be performed\n(i.e. IDNA implementations that pre-date 2008). For typical applications\nthat just need to convert labels, transitional processing is unlikely to be\nbeneficial and could produce unexpected incompatible results.\n\n``encodings.idna`` Compatibility\n++++++++++++++++++++++++++++++++\n\nFunction calls from the Python built-in ``encodings.idna`` module are\nmapped to their IDNA 2008 equivalents using the ``idna.compat`` module.\nSimply substitute the ``import`` clause in your code to refer to the\nnew module name.\n\nExceptions\n----------\n\nAll errors raised during the conversion following the specification should\nraise an exception derived from the ``idna.IDNAError`` base class.\n\nMore specific exceptions that may be generated as ``idna.IDNABidiError``\nwhen the error reflects an illegal combination of left-to-right and right-to-left\ncharacters in a label; ``idna.InvalidCodepoint`` when a specific codepoint is\nan illegal character in an IDN label (i.e. INVALID); and ``idna.InvalidCodepointContext``\nwhen the codepoint is illegal based on its positional context (i.e. it is CONTEXTO\nor CONTEXTJ but the contextual requirements are not satisfied.)\n\nBuilding and Diagnostics\n------------------------\n\nThe IDNA and UTS 46 functionality relies upon pre-calculated lookup tables for\nperformance. These tables are derived from computing against eligibility criteria\nin the respective standards. These tables are computed using the command-line\nscript ``tools/idna-data``.\n\nThis tool will fetch relevant tables from the Unicode Consortium and perform the\nrequired calculations to identify eligibility. It has three main modes:\n\n* ``idna-data make-libdata``. Generates ``idnadata.py`` and ``uts46data.py``,\n the pre-calculated lookup tables using for IDNA and UTS 46 conversions. Implementors\n who wish to track this library against a different Unicode version may use this tool\n to manually generate a different version of the ``idnadata.py`` and ``uts46data.py``\n files.\n\n* ``idna-data make-table``. Generate a table of the IDNA disposition\n (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix B.1 of RFC\n 5892 and the pre-computed tables published by `IANA <http://iana.org/>`_.\n\n* ``idna-data U+0061``. Prints debugging output on the various properties\n associated with an individual Unicode codepoint (in this case, U+0061), that are\n used to assess the IDNA and UTS 46 status of a codepoint. This is helpful in debugging\n or analysis.\n\nThe tool accepts a number of arguments, described using ``idna-data -h``. Most notably,\nthe ``--version`` argument allows the specification of the version of Unicode to use\nin computing the table data. For example, ``idna-data --version 9.0.0 make-libdata``\nwill generate library data against Unicode 9.0.0.\n\nNote that this script requires Python 3, but all generated library data will work\nin Python 2.7.\n\n\nTesting\n-------\n\nThe library has a test suite based on each rule of the IDNA specification, as\nwell as tests that are provided as part of the Unicode Technical Standard 46,\n`Unicode IDNA Compatibility Processing <http://unicode.org/reports/tr46/>`_.\n\nThe tests are run automatically on each commit at Travis CI:\n\n.. image:: https://travis-ci.org/kjd/idna.svg?branch=master\n :target: https://travis-ci.org/kjd/idna\n\n\n",
- "home_page": "https://github.com/kjd/idna",
- "author": "Kim Davies",
- "author_email": "kim@cynosure.com.au",
- "license": "BSD-like",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "Intended Audience :: System Administrators",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.4",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Internet :: Name Service (DNS)",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "Topic :: Utilities"
- ],
- "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/cc/37/db7ba97e676af155f5fcb1a35466f446eadc9104e25b83366e8088c9c926/importlib_metadata-6.8.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb",
- "hashes": {
- "sha256": "3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "importlib-metadata",
- "version": "6.8.0",
- "summary": "Read metadata from Python packages",
- "description": ".. image:: https://img.shields.io/pypi/v/importlib_metadata.svg\n :target: https://pypi.org/project/importlib_metadata\n\n.. image:: https://img.shields.io/pypi/pyversions/importlib_metadata.svg\n\n.. image:: https://github.com/python/importlib_metadata/workflows/tests/badge.svg\n :target: https://github.com/python/importlib_metadata/actions?query=workflow%3A%22tests%22\n :alt: tests\n\n.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json\n :target: https://github.com/astral-sh/ruff\n :alt: Ruff\n\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n :target: https://github.com/psf/black\n :alt: Code style: Black\n\n.. image:: https://readthedocs.org/projects/importlib-metadata/badge/?version=latest\n :target: https://importlib-metadata.readthedocs.io/en/latest/?badge=latest\n\n.. image:: https://img.shields.io/badge/skeleton-2023-informational\n :target: https://blog.jaraco.com/skeleton\n\n.. image:: https://tidelift.com/badges/package/pypi/importlib-metadata\n :target: https://tidelift.com/subscription/pkg/pypi-importlib-metadata?utm_source=pypi-importlib-metadata&utm_medium=readme\n\nLibrary to access the metadata for a Python package.\n\nThis package supplies third-party access to the functionality of\n`importlib.metadata <https://docs.python.org/3/library/importlib.metadata.html>`_\nincluding improvements added to subsequent Python versions.\n\n\nCompatibility\n=============\n\nNew features are introduced in this third-party library and later merged\ninto CPython. The following table indicates which versions of this library\nwere contributed to different versions in the standard library:\n\n.. list-table::\n :header-rows: 1\n\n * - importlib_metadata\n - stdlib\n * - 6.5\n - 3.12\n * - 4.13\n - 3.11\n * - 4.6\n - 3.10\n * - 1.4\n - 3.8\n\n\nUsage\n=====\n\nSee the `online documentation <https://importlib-metadata.readthedocs.io/>`_\nfor usage details.\n\n`Finder authors\n<https://docs.python.org/3/reference/import.html#finders-and-loaders>`_ can\nalso add support for custom package installers. See the above documentation\nfor details.\n\n\nCaveats\n=======\n\nThis project primarily supports third-party packages installed by PyPA\ntools (or other conforming packages). It does not support:\n\n- Packages in the stdlib.\n- Packages installed without metadata.\n\nProject details\n===============\n\n * Project home: https://github.com/python/importlib_metadata\n * Report bugs at: https://github.com/python/importlib_metadata/issues\n * Code hosting: https://github.com/python/importlib_metadata\n * Documentation: https://importlib-metadata.readthedocs.io/\n\nFor Enterprise\n==============\n\nAvailable as part of the Tidelift Subscription.\n\nThis project and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use.\n\n`Learn more <https://tidelift.com/subscription/pkg/pypi-importlib-metadata?utm_source=pypi-importlib-metadata&utm_medium=referral&utm_campaign=github>`_.\n\nSecurity Contact\n================\n\nTo report a security vulnerability, please use the\n`Tidelift security contact <https://tidelift.com/security>`_.\nTidelift will coordinate the fix and disclosure.\n",
- "home_page": "https://github.com/python/importlib_metadata",
- "author": "Jason R. Coombs",
- "author_email": "jaraco@jaraco.com",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only"
- ],
- "requires_dist": [
- "zipp (>=0.5)",
- "typing-extensions (>=3.6.4) ; python_version < \"3.8\"",
- "sphinx (>=3.5) ; extra == 'docs'",
- "jaraco.packaging (>=9) ; extra == 'docs'",
- "rst.linker (>=1.9) ; extra == 'docs'",
- "furo ; extra == 'docs'",
- "sphinx-lint ; extra == 'docs'",
- "jaraco.tidelift (>=1.4) ; extra == 'docs'",
- "ipython ; extra == 'perf'",
- "pytest (>=6) ; extra == 'testing'",
- "pytest-checkdocs (>=2.4) ; extra == 'testing'",
- "pytest-cov ; extra == 'testing'",
- "pytest-enabler (>=2.2) ; extra == 'testing'",
- "pytest-ruff ; extra == 'testing'",
- "packaging ; extra == 'testing'",
- "pyfakefs ; extra == 'testing'",
- "flufl.flake8 ; extra == 'testing'",
- "pytest-perf (>=0.9.2) ; extra == 'testing'",
- "pytest-black (>=0.3.7) ; (platform_python_implementation != \"PyPy\") and extra == 'testing'",
- "pytest-mypy (>=0.9.1) ; (platform_python_implementation != \"PyPy\") and extra == 'testing'",
- "importlib-resources (>=1.3) ; (python_version < \"3.9\") and extra == 'testing'"
- ],
- "requires_python": ">=3.8",
- "provides_extra": [
- "docs",
- "perf",
- "testing"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/65/6e/09d8816b5cb7a4006ef8ad1717a2703ad9f331dae9717d9f22488a2d6469/importlib_resources-6.1.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=aa50258bbfa56d4e33fbd8aa3ef48ded10d1735f11532b8df95388cc6bdb7e83",
- "hashes": {
- "sha256": "aa50258bbfa56d4e33fbd8aa3ef48ded10d1735f11532b8df95388cc6bdb7e83"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "importlib-resources",
- "version": "6.1.0",
- "summary": "Read resources from Python packages",
- "description": ".. image:: https://img.shields.io/pypi/v/importlib_resources.svg\n :target: https://pypi.org/project/importlib_resources\n\n.. image:: https://img.shields.io/pypi/pyversions/importlib_resources.svg\n\n.. image:: https://github.com/python/importlib_resources/workflows/tests/badge.svg\n :target: https://github.com/python/importlib_resources/actions?query=workflow%3A%22tests%22\n :alt: tests\n\n.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json\n :target: https://github.com/astral-sh/ruff\n :alt: Ruff\n\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n :target: https://github.com/psf/black\n :alt: Code style: Black\n\n.. image:: https://readthedocs.org/projects/importlib-resources/badge/?version=latest\n :target: https://importlib-resources.readthedocs.io/en/latest/?badge=latest\n\n.. image:: https://img.shields.io/badge/skeleton-2023-informational\n :target: https://blog.jaraco.com/skeleton\n\n.. image:: https://tidelift.com/badges/package/pypi/importlib-resources\n :target: https://tidelift.com/subscription/pkg/pypi-importlib-resources?utm_source=pypi-importlib-resources&utm_medium=readme\n\n``importlib_resources`` is a backport of Python standard library\n`importlib.resources\n<https://docs.python.org/3/library/importlib.html#module-importlib.resources>`_\nmodule for older Pythons.\n\nThe key goal of this module is to replace parts of `pkg_resources\n<https://setuptools.readthedocs.io/en/latest/pkg_resources.html>`_ with a\nsolution in Python's stdlib that relies on well-defined APIs. This makes\nreading resources included in packages easier, with more stable and consistent\nsemantics.\n\nCompatibility\n=============\n\nNew features are introduced in this third-party library and later merged\ninto CPython. The following table indicates which versions of this library\nwere contributed to different versions in the standard library:\n\n.. list-table::\n :header-rows: 1\n\n * - importlib_resources\n - stdlib\n * - 6.0\n - 3.13\n * - 5.12\n - 3.12\n * - 5.7\n - 3.11\n * - 5.0\n - 3.10\n * - 1.3\n - 3.9\n * - 0.5 (?)\n - 3.7\n\nFor Enterprise\n==============\n\nAvailable as part of the Tidelift Subscription.\n\nThis project and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use.\n\n`Learn more <https://tidelift.com/subscription/pkg/pypi-importlib-resources?utm_source=pypi-importlib-resources&utm_medium=referral&utm_campaign=github>`_.\n",
- "home_page": "https://github.com/python/importlib_resources",
- "author": "Barry Warsaw",
- "author_email": "barry@python.org",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only"
- ],
- "requires_dist": [
- "zipp >=3.1.0 ; python_version < \"3.10\"",
- "sphinx >=3.5 ; extra == 'docs'",
- "sphinx <7.2.5 ; extra == 'docs'",
- "jaraco.packaging >=9.3 ; extra == 'docs'",
- "rst.linker >=1.9 ; extra == 'docs'",
- "furo ; extra == 'docs'",
- "sphinx-lint ; extra == 'docs'",
- "jaraco.tidelift >=1.4 ; extra == 'docs'",
- "pytest >=6 ; extra == 'testing'",
- "pytest-checkdocs >=2.4 ; extra == 'testing'",
- "pytest-cov ; extra == 'testing'",
- "pytest-enabler >=2.2 ; extra == 'testing'",
- "pytest-ruff ; extra == 'testing'",
- "zipp >=3.17 ; extra == 'testing'",
- "pytest-black >=0.3.7 ; (platform_python_implementation != \"PyPy\") and extra == 'testing'",
- "pytest-mypy >=0.9.1 ; (platform_python_implementation != \"PyPy\") and extra == 'testing'"
- ],
- "requires_python": ">=3.8",
- "project_url": [
- "Documentation, https://importlib-resources.readthedocs.io/"
- ],
- "provides_extra": [
- "docs",
- "testing"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/59/91/aa6bde563e0085a02a435aa99b49ef75b0a4b062635e606dab23ce18d720/inflection-0.5.1-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2",
- "hashes": {
- "sha256": "f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "inflection",
- "version": "0.5.1",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "A port of Ruby on Rails inflector to Python",
- "description": "Inflection\n==========\n\n|build status|_\n\n.. |build status| image:: https://travis-ci.org/jpvanhal/inflection.svg?branch=master\n :alt: Build Status\n.. _build status: http://travis-ci.org/jpvanhal/inflection\n\nInflection is a string transformation library. It singularizes and pluralizes\nEnglish words, and transforms strings from CamelCase to underscored string.\nInflection is a port of `Ruby on Rails`_' `inflector`_ to Python.\n\n.. _Ruby on Rails: http://rubyonrails.org\n.. _inflector: http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html\n\nResources\n---------\n\n- `Documentation <https://inflection.readthedocs.io/>`_\n- `Issue Tracker <http://github.com/jpvanhal/inflection/issues>`_\n- `Code <http://github.com/jpvanhal/inflection>`_\n- `Development Version\n <http://github.com/jpvanhal/inflection/zipball/master#egg=Inflection-dev>`_\n\n\n",
- "home_page": "https://github.com/jpvanhal/inflection",
- "author": "Janne Vanhala",
- "author_email": "janne.vanhala@gmail.com",
- "license": "MIT",
- "classifier": [
- "Development Status :: 4 - Beta",
- "Intended Audience :: Developers",
- "Natural Language :: English",
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy"
- ],
- "requires_python": ">=3.5"
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44",
- "hashes": {
- "sha256": "2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "itsdangerous",
- "version": "2.1.2",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "Safely pass data to untrusted environments and back.",
- "description": "ItsDangerous\n============\n\n... so better sign this\n\nVarious helpers to pass data to untrusted environments and to get it\nback safe and sound. Data is cryptographically signed to ensure that a\ntoken has not been tampered with.\n\nIt's possible to customize how data is serialized. Data is compressed as\nneeded. A timestamp can be added and verified automatically while\nloading a token.\n\n\nInstalling\n----------\n\nInstall and update using `pip`_:\n\n.. code-block:: text\n\n pip install -U itsdangerous\n\n.. _pip: https://pip.pypa.io/en/stable/getting-started/\n\n\nA Simple Example\n----------------\n\nHere's how you could generate a token for transmitting a user's id and\nname between web requests.\n\n.. code-block:: python\n\n from itsdangerous import URLSafeSerializer\n auth_s = URLSafeSerializer(\"secret key\", \"auth\")\n token = auth_s.dumps({\"id\": 5, \"name\": \"itsdangerous\"})\n\n print(token)\n # eyJpZCI6NSwibmFtZSI6Iml0c2Rhbmdlcm91cyJ9.6YP6T0BaO67XP--9UzTrmurXSmg\n\n data = auth_s.loads(token)\n print(data[\"name\"])\n # itsdangerous\n\n\nDonate\n------\n\nThe Pallets organization develops and supports ItsDangerous and other\npopular packages. In order to grow the community of contributors and\nusers, and allow the maintainers to devote more time to the projects,\n`please donate today`_.\n\n.. _please donate today: https://palletsprojects.com/donate\n\n\nLinks\n-----\n\n- Documentation: https://itsdangerous.palletsprojects.com/\n- Changes: https://itsdangerous.palletsprojects.com/changes/\n- PyPI Releases: https://pypi.org/project/ItsDangerous/\n- Source Code: https://github.com/pallets/itsdangerous/\n- Issue Tracker: https://github.com/pallets/itsdangerous/issues/\n- Website: https://palletsprojects.com/p/itsdangerous/\n- Twitter: https://twitter.com/PalletsTeam\n- Chat: https://discord.gg/pallets\n\n\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://palletsprojects.com/p/itsdangerous/",
- "author": "Armin Ronacher",
- "author_email": "armin.ronacher@active-4.com",
- "maintainer": "Pallets",
- "maintainer_email": "contact@palletsprojects.com",
- "license": "BSD-3-Clause",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Donate, https://palletsprojects.com/donate",
- "Documentation, https://itsdangerous.palletsprojects.com/",
- "Changes, https://itsdangerous.palletsprojects.com/changes/",
- "Source Code, https://github.com/pallets/itsdangerous/",
- "Issue Tracker, https://github.com/pallets/itsdangerous/issues/",
- "Twitter, https://twitter.com/PalletsTeam",
- "Chat, https://discord.gg/pallets"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/bc/c3/f068337a370801f372f2f8f6bad74a5c140f6fda3d9de154052708dd3c65/Jinja2-3.1.2-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61",
- "hashes": {
- "sha256": "6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "Jinja2",
- "version": "3.1.2",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "A very fast and expressive template engine.",
- "description": "Jinja\n=====\n\nJinja is a fast, expressive, extensible templating engine. Special\nplaceholders in the template allow writing code similar to Python\nsyntax. Then the template is passed data to render the final document.\n\nIt includes:\n\n- Template inheritance and inclusion.\n- Define and import macros within templates.\n- HTML templates can use autoescaping to prevent XSS from untrusted\n user input.\n- A sandboxed environment can safely render untrusted templates.\n- AsyncIO support for generating templates and calling async\n functions.\n- I18N support with Babel.\n- Templates are compiled to optimized Python code just-in-time and\n cached, or can be compiled ahead-of-time.\n- Exceptions point to the correct line in templates to make debugging\n easier.\n- Extensible filters, tests, functions, and even syntax.\n\nJinja's philosophy is that while application logic belongs in Python if\npossible, it shouldn't make the template designer's job difficult by\nrestricting functionality too much.\n\n\nInstalling\n----------\n\nInstall and update using `pip`_:\n\n.. code-block:: text\n\n $ pip install -U Jinja2\n\n.. _pip: https://pip.pypa.io/en/stable/getting-started/\n\n\nIn A Nutshell\n-------------\n\n.. code-block:: jinja\n\n {% extends \"base.html\" %}\n {% block title %}Members{% endblock %}\n {% block content %}\n <ul>\n {% for user in users %}\n <li><a href=\"{{ user.url }}\">{{ user.username }}</a></li>\n {% endfor %}\n </ul>\n {% endblock %}\n\n\nDonate\n------\n\nThe Pallets organization develops and supports Jinja and other popular\npackages. In order to grow the community of contributors and users, and\nallow the maintainers to devote more time to the projects, `please\ndonate today`_.\n\n.. _please donate today: https://palletsprojects.com/donate\n\n\nLinks\n-----\n\n- Documentation: https://jinja.palletsprojects.com/\n- Changes: https://jinja.palletsprojects.com/changes/\n- PyPI Releases: https://pypi.org/project/Jinja2/\n- Source Code: https://github.com/pallets/jinja/\n- Issue Tracker: https://github.com/pallets/jinja/issues/\n- Website: https://palletsprojects.com/p/jinja/\n- Twitter: https://twitter.com/PalletsTeam\n- Chat: https://discord.gg/pallets\n\n\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://palletsprojects.com/p/jinja/",
- "author": "Armin Ronacher",
- "author_email": "armin.ronacher@active-4.com",
- "maintainer": "Pallets",
- "maintainer_email": "contact@palletsprojects.com",
- "license": "BSD-3-Clause",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
- "Topic :: Text Processing :: Markup :: HTML"
- ],
- "requires_dist": [
- "MarkupSafe (>=2.0)",
- "Babel (>=2.7) ; extra == 'i18n'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Donate, https://palletsprojects.com/donate",
- "Documentation, https://jinja.palletsprojects.com/",
- "Changes, https://jinja.palletsprojects.com/changes/",
- "Source Code, https://github.com/pallets/jinja/",
- "Issue Tracker, https://github.com/pallets/jinja/issues/",
- "Twitter, https://twitter.com/PalletsTeam",
- "Chat, https://discord.gg/pallets"
- ],
- "provides_extra": [
- "i18n"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/0f/bf/a84bc75f069f4f156e1c0d9892fb7325945106c6ecaad9f29d24360872af/jsonschema-4.19.1-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=cd5f1f9ed9444e554b38ba003af06c0a8c2868131e56bfbef0550fb450c0330e",
- "hashes": {
- "sha256": "cd5f1f9ed9444e554b38ba003af06c0a8c2868131e56bfbef0550fb450c0330e"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "jsonschema",
- "version": "4.19.1",
- "summary": "An implementation of JSON Schema validation for Python",
- "description": "==========\njsonschema\n==========\n\n|PyPI| |Pythons| |CI| |ReadTheDocs| |Precommit| |Zenodo|\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/jsonschema.svg\n :alt: PyPI version\n :target: https://pypi.org/project/jsonschema/\n\n.. |Pythons| image:: https://img.shields.io/pypi/pyversions/jsonschema.svg\n :alt: Supported Python versions\n :target: https://pypi.org/project/jsonschema/\n\n.. |CI| image:: https://github.com/python-jsonschema/jsonschema/workflows/CI/badge.svg\n :alt: Build status\n :target: https://github.com/python-jsonschema/jsonschema/actions?query=workflow%3ACI\n\n.. |ReadTheDocs| image:: https://readthedocs.org/projects/python-jsonschema/badge/?version=stable&style=flat\n :alt: ReadTheDocs status\n :target: https://python-jsonschema.readthedocs.io/en/stable/\n\n.. |Precommit| image:: https://results.pre-commit.ci/badge/github/python-jsonschema/jsonschema/main.svg\n :alt: pre-commit.ci status\n :target: https://results.pre-commit.ci/latest/github/python-jsonschema/jsonschema/main\n\n.. |Zenodo| image:: https://zenodo.org/badge/3072629.svg\n :alt: Zenodo DOI\n :target: https://zenodo.org/badge/latestdoi/3072629\n\n\n``jsonschema`` is an implementation of the `JSON Schema <https://json-schema.org>`_ specification for Python.\n\n.. code:: python\n\n >>> from jsonschema import validate\n\n >>> # A sample schema, like what we'd get from json.load()\n >>> schema = {\n ... \"type\" : \"object\",\n ... \"properties\" : {\n ... \"price\" : {\"type\" : \"number\"},\n ... \"name\" : {\"type\" : \"string\"},\n ... },\n ... }\n\n >>> # If no exception is raised by validate(), the instance is valid.\n >>> validate(instance={\"name\" : \"Eggs\", \"price\" : 34.99}, schema=schema)\n\n >>> validate(\n ... instance={\"name\" : \"Eggs\", \"price\" : \"Invalid\"}, schema=schema,\n ... ) # doctest: +IGNORE_EXCEPTION_DETAIL\n Traceback (most recent call last):\n ...\n ValidationError: 'Invalid' is not of type 'number'\n\nIt can also be used from the command line by installing `check-jsonschema <https://github.com/python-jsonschema/check-jsonschema>`_.\n\nFeatures\n--------\n\n* Full support for `Draft 2020-12 <https://python-jsonschema.readthedocs.io/en/latest/api/jsonschema/validators/#jsonschema.validators.Draft202012Validator>`_, `Draft 2019-09 <https://python-jsonschema.readthedocs.io/en/latest/api/jsonschema/validators/#jsonschema.validators.Draft201909Validator>`_, `Draft 7 <https://python-jsonschema.readthedocs.io/en/latest/api/jsonschema/validators/#jsonschema.validators.Draft7Validator>`_, `Draft 6 <https://python-jsonschema.readthedocs.io/en/latest/api/jsonschema/validators/#jsonschema.validators.Draft6Validator>`_, `Draft 4 <https://python-jsonschema.readthedocs.io/en/latest/api/jsonschema/validators/#jsonschema.validators.Draft4Validator>`_ and `Draft 3 <https://python-jsonschema.readthedocs.io/en/latest/api/jsonschema/validators/#jsonschema.validators.Draft3Validator>`_\n\n* `Lazy validation <https://python-jsonschema.readthedocs.io/en/latest/api/jsonschema/protocols/#jsonschema.protocols.Validator.iter_errors>`_ that can iteratively report *all* validation errors.\n\n* `Programmatic querying <https://python-jsonschema.readthedocs.io/en/latest/errors/>`_ of which properties or items failed validation.\n\n\nInstallation\n------------\n\n``jsonschema`` is available on `PyPI <https://pypi.org/project/jsonschema/>`_. You can install using `pip <https://pip.pypa.io/en/stable/>`_:\n\n.. code:: bash\n\n $ pip install jsonschema\n\n\nExtras\n======\n\nTwo extras are available when installing the package, both currently related to ``format`` validation:\n\n * ``format``\n * ``format-nongpl``\n\nThey can be used when installing in order to include additional dependencies, e.g.:\n\n.. code:: bash\n\n $ pip install jsonschema'[format]'\n\nBe aware that the mere presence of these dependencies – or even the specification of ``format`` checks in a schema – do *not* activate format checks (as per the specification).\nPlease read the `format validation documentation <https://python-jsonschema.readthedocs.io/en/latest/validate/#validating-formats>`_ for further details.\n\nAbout\n-----\n\nI'm Julian Berman.\n\n``jsonschema`` is on `GitHub <https://github.com/python-jsonschema/jsonschema>`_.\n\nGet in touch, via GitHub or otherwise, if you've got something to contribute, it'd be most welcome!\n\nYou can also generally find me on Libera (nick: ``Julian``) in various channels, including ``#python``.\n\nIf you feel overwhelmingly grateful, you can also `sponsor me <https://github.com/sponsors/Julian/>`_.\n\nAnd for companies who appreciate ``jsonschema`` and its continued support and growth, ``jsonschema`` is also now supportable via `TideLift <https://tidelift.com/subscription/pkg/pypi-jsonschema?utm_source=pypi-jsonschema&utm_medium=referral&utm_campaign=readme>`_.\n\n\nRelease Information\n-------------------\n\nv4.19.1\n=======\n\n* Single label hostnames are now properly considered valid according to the ``hostname`` format.\n This is the behavior specified by the relevant RFC (1123).\n IDN hostname behavior was already correct.\n",
- "description_content_type": "text/x-rst",
- "keywords": [
- "data validation",
- "json",
- "jsonschema",
- "validation"
- ],
- "author": "Julian Berman",
- "author_email": "Julian+jsonschema@GrayVines.com",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: File Formats :: JSON",
- "Topic :: File Formats :: JSON :: JSON Schema"
- ],
- "requires_dist": [
- "attrs>=22.2.0",
- "importlib-resources>=1.4.0; python_version < '3.9'",
- "jsonschema-specifications>=2023.03.6",
- "pkgutil-resolve-name>=1.3.10; python_version < '3.9'",
- "referencing>=0.28.4",
- "rpds-py>=0.7.1",
- "fqdn; extra == 'format'",
- "idna; extra == 'format'",
- "isoduration; extra == 'format'",
- "jsonpointer>1.13; extra == 'format'",
- "rfc3339-validator; extra == 'format'",
- "rfc3987; extra == 'format'",
- "uri-template; extra == 'format'",
- "webcolors>=1.11; extra == 'format'",
- "fqdn; extra == 'format-nongpl'",
- "idna; extra == 'format-nongpl'",
- "isoduration; extra == 'format-nongpl'",
- "jsonpointer>1.13; extra == 'format-nongpl'",
- "rfc3339-validator; extra == 'format-nongpl'",
- "rfc3986-validator>0.1.0; extra == 'format-nongpl'",
- "uri-template; extra == 'format-nongpl'",
- "webcolors>=1.11; extra == 'format-nongpl'"
- ],
- "requires_python": ">=3.8",
- "project_url": [
- "Documentation, https://python-jsonschema.readthedocs.io/",
- "Homepage, https://github.com/python-jsonschema/jsonschema",
- "Issues, https://github.com/python-jsonschema/jsonschema/issues/",
- "Funding, https://github.com/sponsors/Julian",
- "Tidelift, https://tidelift.com/subscription/pkg/pypi-jsonschema?utm_source=pypi-jsonschema&utm_medium=referral&utm_campaign=pypi-link",
- "Changelog, https://github.com/python-jsonschema/jsonschema/blob/main/CHANGELOG.rst",
- "Source, https://github.com/python-jsonschema/jsonschema"
- ],
- "provides_extra": [
- "format",
- "format-nongpl"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/1c/24/83349ac2189cc2435e84da3f69ba3c97314d3c0622628e55171c6798ed80/jsonschema_specifications-2023.7.1-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1",
- "hashes": {
- "sha256": "05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "jsonschema-specifications",
- "version": "2023.7.1",
- "summary": "The JSON Schema meta-schemas and vocabularies, exposed as a Registry",
- "description": "=============================\n``jsonschema-specifications``\n=============================\n\n|PyPI| |Pythons| |CI| |ReadTheDocs|\n\nJSON support files from the `JSON Schema Specifications <https://json-schema.org/specification.html>`_ (metaschemas, vocabularies, etc.), packaged for runtime access from Python as a `referencing-based Schema Registry <https://referencing.readthedocs.io/en/stable/api/#referencing.Registry>`_.\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/jsonschema-specifications.svg\n :alt: PyPI version\n :target: https://pypi.org/project/jsonschema-specifications/\n\n.. |Pythons| image:: https://img.shields.io/pypi/pyversions/jsonschema-specifications.svg\n :alt: Supported Python versions\n :target: https://pypi.org/project/jsonschema-specifications/\n\n.. |CI| image:: https://github.com/python-jsonschema/jsonschema-specifications/workflows/CI/badge.svg\n :alt: Build status\n :target: https://github.com/python-jsonschema/jsonschema-specifications/actions?query=workflow%3ACI\n\n.. |ReadTheDocs| image:: https://readthedocs.org/projects/jsonschema-specifications/badge/?version=stable&style=flat\n :alt: ReadTheDocs status\n :target: https://jsonschema-specifications.readthedocs.io/en/stable/\n",
- "description_content_type": "text/x-rst",
- "keywords": [
- "data validation",
- "json",
- "json schema",
- "jsonschema",
- "validation"
- ],
- "author": "Julian Berman",
- "author_email": "Julian+jsonschema-specifications@GrayVines.com",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: File Formats :: JSON :: JSON Schema"
- ],
- "requires_dist": [
- "importlib-resources>=1.4.0; python_version < '3.9'",
- "referencing>=0.28.0"
- ],
- "requires_python": ">=3.8",
- "project_url": [
- "Documentation, https://jsonschema-specifications.readthedocs.io/",
- "Homepage, https://github.com/python-jsonschema/jsonschema-specifications",
- "Issues, https://github.com/python-jsonschema/jsonschema-specifications/issues/",
- "Funding, https://github.com/sponsors/Julian",
- "Source, https://github.com/python-jsonschema/jsonschema-specifications"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/c9/8f/c8aab72c72634de0c726a98a1e4c84a93ef20049ee0427c871214f6a58d5/lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "archive_info": {
- "hash": "sha256=f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59",
- "hashes": {
- "sha256": "f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "lazy-object-proxy",
- "version": "1.9.0",
- "summary": "A fast and thorough lazy object proxy.",
- "description": "========\nOverview\n========\n\n\n\nA fast and thorough lazy object proxy.\n\n* Free software: BSD 2-Clause License\n\nNote that this is based on `wrapt`_'s ObjectProxy with one big change: it calls a function the first time the proxy object is\nused, while `wrapt.ObjectProxy` just forwards the method calls to the target object.\n\nIn other words, you use `lazy-object-proxy` when you only have the object way later and you use `wrapt.ObjectProxy` when you\nwant to override few methods (by subclassing) and forward everything else to the target object.\n\nExample::\n\n import lazy_object_proxy\n\n def expensive_func():\n from time import sleep\n print('starting calculation')\n # just as example for a very slow computation\n sleep(2)\n print('finished calculation')\n # return the result of the calculation\n return 10\n\n obj = lazy_object_proxy.Proxy(expensive_func)\n # function is called only when object is actually used\n print(obj) # now expensive_func is called\n\n print(obj) # the result without calling the expensive_func\n\nInstallation\n============\n\n::\n\n pip install lazy-object-proxy\n\nDocumentation\n=============\n\nhttps://python-lazy-object-proxy.readthedocs.io/\n\nDevelopment\n===========\n\nTo run all the tests run::\n\n tox\n\nAcknowledgements\n================\n\nThis project is based on some code from `wrapt`_ as you can see in the git history.\n\n.. _wrapt: https://github.com/GrahamDumpleton/wrapt\n\n\nChangelog\n=========\n\n1.9.0 (2023-01-04)\n------------------\n\n* Added support for matrix multiplication operator (``@``).\n* Should have all the wheels now (including the manylinux ones).\n* Bumped minimum version requirements for setuptools and setuptools-scm.\n* Switched the default pure python fallback implementation to the \"simple\" one (when you ``from lazy_object_proxy import Proxy``\n and the C extension is not available).\n Previously the \"slots\" implementation was used but as it turns out it is slower on Python 3.\n\n1.8.0 (2022-10-26)\n------------------\n\n* Cleaned up use of cPickle. Contributed by Sandro Tosi in `#62 <https://github.com/ionelmc/python-lazy-object-proxy/pull/62>`_.\n* Cleaned up more dead Python 2 code.\n* Added Python 3.11 wheels.\n* Dropped support for Python 3.6.\n\n1.7.1 (2021-12-15)\n------------------\n\n* Removed most of the Python 2 support code and fixed ``python_requires`` to require at least Python 3.6.\n\n Note that 1.7.0 has been yanked because it could not install on Python 2.7.\n Installing lazy-object-proxy on Python 2.7 should automatically fall back to the 1.6.0 release now.\n\n1.7.0 (2021-12-15)\n------------------\n\n* Switched CI to GitHub Actions, this has a couple consequences:\n\n * Support for Python 2.7 is dropped. You can still install it there but it's not tested anymore and\n Python 2 specific handling will be removed at some point.\n * Linux wheels are now provided in `musllinux` and `manylinux2014` variants.\n\n* Fixed ``__index__`` to fallback to ``int`` if the wrapped object doesn't have an ``__index__`` method.\n This prevents situations where code using a proxy would otherwise likely just call ``int`` had the object\n not have an ``__index__`` method.\n\n1.6.0 (2021-03-22)\n------------------\n\n* Added support for async special methods (``__aiter__``, ``__anext__``,\n ``__await__``, ``__aenter__``, ``__aexit__``).\n These are used in the ``async for``, ``await` and ``async with`` statements.\n\n Note that ``__await__`` returns a wrapper that tries to emulate the crazy\n stuff going on in the ceval loop, so there will be a small performance overhead.\n* Added the ``__resolved__`` property. You can use it to check if the factory has\n been called.\n\n1.5.2 (2020-11-26)\n------------------\n\n* Added Python 3.9 wheels.\n* Removed Python 2.7 Windows wheels\n (not supported on newest image with Python 3.9).\n\n1.5.1 (2020-07-22)\n------------------\n\n* Added ARM64 wheels (manylinux2014).\n\n1.5.0 (2020-06-05)\n------------------\n\n* Added support for ``__fspath__``.\n* Dropped support for Python 3.4.\n\n1.4.3 (2019-10-26)\n------------------\n\n* Added binary wheels for Python 3.8.\n* Fixed license metadata.\n\n1.4.2 (2019-08-22)\n------------------\n\n* Included a ``pyproject.toml`` to allow users install the sdist with old python/setuptools, as the\n setuptools-scm dep will be fetched by pip instead of setuptools.\n Fixes `#30 <https://github.com/ionelmc/python-lazy-object-proxy/issues/30>`_.\n\n1.4.1 (2019-05-10)\n------------------\n\n* Fixed wheels being built with ``-coverage`` cflags. No more issues about bogus ``cext.gcda`` files.\n* Removed useless C file from wheels.\n* Changed ``setup.py`` to use setuptools-scm.\n\n1.4.0 (2019-05-05)\n------------------\n\n* Fixed ``__mod__`` for the slots backend. Contributed by Ran Benita in\n `#28 <https://github.com/ionelmc/python-lazy-object-proxy/pull/28>`_.\n* Dropped support for Python 2.6 and 3.3. Contributed by \"hugovk\" in\n `#24 <https://github.com/ionelmc/python-lazy-object-proxy/pull/24>`_.\n\n1.3.1 (2017-05-05)\n------------------\n\n* Fix broken release (``sdist`` had a broken ``MANIFEST.in``).\n\n1.3.0 (2017-05-02)\n------------------\n\n* Speed up arithmetic operations involving ``cext.Proxy`` subclasses.\n\n1.2.2 (2016-04-14)\n------------------\n\n* Added `manylinux <https://www.python.org/dev/peps/pep-0513/>`_ wheels.\n* Minor cleanup in readme.\n\n1.2.1 (2015-08-18)\n------------------\n\n* Fix a memory leak (the wrapped object would get bogus references). Contributed by Astrum Kuo in\n `#10 <https://github.com/ionelmc/python-lazy-object-proxy/pull/10>`_.\n\n1.2.0 (2015-07-06)\n------------------\n\n* Don't instantiate the object when __repr__ is called. This aids with debugging (allows one to see exactly in\n what state the proxy is).\n\n1.1.0 (2015-07-05)\n------------------\n\n* Added support for pickling. The pickled value is going to be the wrapped object *without* any Proxy container.\n* Fixed a memory management issue in the C extension (reference cycles weren't garbage collected due to improper\n handling in the C extension). Contributed by Alvin Chow in\n `#8 <https://github.com/ionelmc/python-lazy-object-proxy/pull/8>`_.\n\n1.0.2 (2015-04-11)\n-----------------------------------------\n\n* First release on PyPI.\n",
- "home_page": "https://github.com/ionelmc/python-lazy-object-proxy",
- "author": "Ionel Cristian Mărieș",
- "author_email": "contact@ionelmc.ro",
- "license": "BSD-2-Clause",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: Unix",
- "Operating System :: POSIX",
- "Operating System :: Microsoft :: Windows",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Utilities"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Documentation, https://python-lazy-object-proxy.readthedocs.io/",
- "Changelog, https://python-lazy-object-proxy.readthedocs.io/en/latest/changelog.html",
- "Issue Tracker, https://github.com/ionelmc/python-lazy-object-proxy/issues"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/1d/58/bcdf5719709d13d8523117ec3eb6b027d1bec461cdc91d05bceb88d0aec1/limits-3.6.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=32fe29a398352c71bc43d53773117d47e22c5ea4200aef28d3f5fdee10334cd7",
- "hashes": {
- "sha256": "32fe29a398352c71bc43d53773117d47e22c5ea4200aef28d3f5fdee10334cd7"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "limits",
- "version": "3.6.0",
- "summary": "Rate limiting utilities",
- "description": ".. |ci| image:: https://github.com/alisaifee/limits/workflows/CI/badge.svg?branch=master\n :target: https://github.com/alisaifee/limits/actions?query=branch%3Amaster+workflow%3ACI\n.. |codecov| image:: https://codecov.io/gh/alisaifee/limits/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/alisaifee/limits\n.. |pypi| image:: https://img.shields.io/pypi/v/limits.svg?style=flat-square\n :target: https://pypi.python.org/pypi/limits\n.. |pypi-versions| image:: https://img.shields.io/pypi/pyversions/limits?style=flat-square\n :target: https://pypi.python.org/pypi/limits\n.. |license| image:: https://img.shields.io/pypi/l/limits.svg?style=flat-square\n :target: https://pypi.python.org/pypi/limits\n.. |docs| image:: https://readthedocs.org/projects/limits/badge/?version=latest\n :target: https://limits.readthedocs.org\n\nlimits\n------\n|docs| |ci| |codecov| |pypi| |pypi-versions| |license|\n\n\n**limits** is a python library to perform rate limiting with commonly used storage backends (Redis, Memcached, MongoDB & Etcd).\n\n----\n\nSponsored by Zuplo - fully-managed, programmable API Management platform.\nAdd rate limiting and more to your public API in minutes, try it at `zuplo.com <https://zuplo.link/3DZM9Ej>`_\n\n----\n\nSupported Strategies\n====================\n`Fixed Window <https://limits.readthedocs.io/en/latest/strategies.html#fixed-window>`_\n This strategy resets at a fixed interval (start of minute, hour, day etc).\n For example, given a rate limit of ``10/minute`` the strategy will:\n\n - Allow 10 requests between ``00:01:00`` and ``00:02:00``\n - Allow 10 requests at ``00:00:59`` and 10 more requests at ``00:01:00``\n\n\n`Fixed Window (Elastic) <https://limits.readthedocs.io/en/latest/strategies.html#fixed-window-with-elastic-expiry>`_\n Identical to Fixed window, except every breach of rate limit results in an extension\n to the time out. For example a rate limit of `1/minute` hit twice within a minute will\n result in a lock-out for two minutes.\n\n`Moving Window <https://limits.readthedocs.io/en/latest/strategies.html#moving-window>`_\n Sliding window strategy enforces a rate limit of N/(m time units)\n on the **last m** time units at the second granularity.\n\n For example, with a rate limit of ``10/minute``:\n\n - Allow 9 requests that arrive at ``00:00:59``\n - Allow another request that arrives at ``00:01:00``\n - Reject the request that arrives at ``00:01:01``\n\nStorage backends\n================\n\n- `Redis <https://limits.readthedocs.io/en/latest/storage.html#redis-storage>`_\n- `Memcached <https://limits.readthedocs.io/en/latest/storage.html#memcached-storage>`_\n- `MongoDB <https://limits.readthedocs.io/en/latest/storage.html#mongodb-storage>`_\n- `Etcd <https://limits.readthedocs.io/en/latest/storage.html#etcd-storage>`_\n- `In-Memory <https://limits.readthedocs.io/en/latest/storage.html#in-memory-storage>`_\n\nDive right in\n=============\n\nInitialize the storage backend\n\n.. code-block:: python\n\n from limits import storage\n memory_storage = storage.MemoryStorage()\n # or memcached\n memcached_storage = storage.MemcachedStorage(\"memcached://localhost:11211\")\n # or redis\n redis_storage = storage.RedisStorage(\"redis://localhost:6379\")\n # or use the factory\n storage_uri = \"memcached://localhost:11211\"\n some_storage = storage.storage_from_string(storage_uri)\n\nInitialize a rate limiter with the Moving Window Strategy\n\n.. code-block:: python\n\n from limits import strategies\n moving_window = strategies.MovingWindowRateLimiter(memory_storage)\n\n\nInitialize a rate limit\n\n.. code-block:: python\n\n from limits import parse\n one_per_minute = parse(\"1/minute\")\n\nInitialize a rate limit explicitly\n\n.. code-block:: python\n\n from limits import RateLimitItemPerSecond\n one_per_second = RateLimitItemPerSecond(1, 1)\n\nTest the limits\n\n.. code-block:: python\n\n assert True == moving_window.hit(one_per_minute, \"test_namespace\", \"foo\")\n assert False == moving_window.hit(one_per_minute, \"test_namespace\", \"foo\")\n assert True == moving_window.hit(one_per_minute, \"test_namespace\", \"bar\")\n\n assert True == moving_window.hit(one_per_second, \"test_namespace\", \"foo\")\n assert False == moving_window.hit(one_per_second, \"test_namespace\", \"foo\")\n time.sleep(1)\n assert True == moving_window.hit(one_per_second, \"test_namespace\", \"foo\")\n\nCheck specific limits without hitting them\n\n.. code-block:: python\n\n assert True == moving_window.hit(one_per_second, \"test_namespace\", \"foo\")\n while not moving_window.test(one_per_second, \"test_namespace\", \"foo\"):\n time.sleep(0.01)\n assert True == moving_window.hit(one_per_second, \"test_namespace\", \"foo\")\n\nLinks\n=====\n\n* `Documentation <http://limits.readthedocs.org/en/latest>`_\n* `Changelog <http://limits.readthedocs.org/en/stable/changelog.html>`_\n\n",
- "home_page": "https://limits.readthedocs.org",
- "author": "Ali-Akber Saifee",
- "author_email": "ali@indydevs.org",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: MacOS",
- "Operating System :: POSIX :: Linux",
- "Operating System :: OS Independent",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: Implementation :: PyPy"
- ],
- "requires_dist": [
- "deprecated >=1.2",
- "importlib-resources >=1.3",
- "packaging <24,>=21",
- "typing-extensions",
- "redis !=4.5.2,!=4.5.3,<6.0.0,>3 ; extra == 'all'",
- "redis !=4.5.2,!=4.5.3,>=4.2.0 ; extra == 'all'",
- "pymemcache <5.0.0,>3 ; extra == 'all'",
- "pymongo <5,>4.1 ; extra == 'all'",
- "etcd3 ; extra == 'all'",
- "coredis <5,>=3.4.0 ; extra == 'all'",
- "motor <4,>=3 ; extra == 'all'",
- "aetcd ; extra == 'all'",
- "emcache >=0.6.1 ; (python_version < \"3.11\") and extra == 'all'",
- "emcache >=1 ; (python_version >= \"3.11\") and extra == 'all'",
- "aetcd ; extra == 'async-etcd'",
- "emcache >=0.6.1 ; (python_version < \"3.11\") and extra == 'async-memcached'",
- "emcache >=1 ; (python_version >= \"3.11\") and extra == 'async-memcached'",
- "motor <4,>=3 ; extra == 'async-mongodb'",
- "coredis <5,>=3.4.0 ; extra == 'async-redis'",
- "etcd3 ; extra == 'etcd'",
- "pymemcache <5.0.0,>3 ; extra == 'memcached'",
- "pymongo <5,>4.1 ; extra == 'mongodb'",
- "redis !=4.5.2,!=4.5.3,<6.0.0,>3 ; extra == 'redis'",
- "redis !=4.5.2,!=4.5.3,>=4.2.0 ; extra == 'rediscluster'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Source, https://github.com/alisaifee/limits"
- ],
- "provides_extra": [
- "all",
- "async-etcd",
- "async-memcached",
- "async-mongodb",
- "async-redis",
- "etcd",
- "memcached",
- "mongodb",
- "redis",
- "rediscluster"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/1f/1a/16b0d2f66601ba3081f1d4177087c79fd1f11d17706ee01d373e4ba8e00d/linkify_it_py-2.0.2-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=a3a24428f6c96f27370d7fe61d2ac0be09017be5190d68d8658233171f1b6541",
- "hashes": {
- "sha256": "a3a24428f6c96f27370d7fe61d2ac0be09017be5190d68d8658233171f1b6541"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "linkify-it-py",
- "version": "2.0.2",
- "summary": "Links recognition library with FULL unicode support.",
- "description": "# linkify-it-py\n\n[](https://github.com/tsutsu3/linkify-it-py/actions)\n[](https://pypi.org/project/linkify-it-py/)\n[](https://anaconda.org/conda-forge/linkify-it-py)\n[](https://linkify-it-py.readthedocs.io/en/latest/?badge=latest)\n[](https://codecov.io/gh/tsutsu3/linkify-it-py)\n[](https://codeclimate.com/github/tsutsu3/linkify-it-py/maintainability)\n\nThis is Python port of [linkify-it](https://github.com/markdown-it/linkify-it).\n\n> Links recognition library with FULL unicode support.\n> Focused on high quality link patterns detection in plain text.\n\n__[Javascript Demo](http://markdown-it.github.io/linkify-it/)__\n\nWhy it's awesome:\n\n- Full unicode support, _with astral characters_!\n- International domains support.\n- Allows rules extension & custom normalizers.\n\n\n## Install\n\n```bash\npip install linkify-it-py\n```\n\nor\n\n```bash\nconda install -c conda-forge linkify-it-py\n```\n\n## Usage examples\n\n### Example 1. Simple use\n\n```python\nfrom linkify_it import LinkifyIt\n\n\nlinkify = LinkifyIt()\n\nprint(linkify.test(\"Site github.com!\"))\n# => True\n\nprint(linkify.match(\"Site github.com!\"))\n# => [linkify_it.main.Match({\n# 'schema': '',\n# 'index': 5,\n# 'last_index': 15,\n# 'raw': 'github.com',\n# 'text': 'github.com',\n# 'url': 'http://github.com'\n# }]\n```\n\n### Example 2. With options\n\n```python\nfrom linkify_it import LinkifyIt\nfrom linkify_it.tlds import TLDS\n\n\n# Reload full tlds list & add unofficial `.onion` domain.\nlinkify = (\n LinkifyIt()\n .tlds(TLDS) # Reload with full tlds list\n .tlds(\"onion\", True) # Add unofficial `.onion` domain\n .add(\"git:\", \"http:\") # Add `git:` protocol as \"alias\"\n .add(\"ftp:\", None) # Disable `ftp:` protocol\n .set({\"fuzzy_ip\": True}) # Enable IPs in fuzzy links (without schema)\n)\nprint(linkify.test(\"Site tamanegi.onion!\"))\n# => True\n\nprint(linkify.match(\"Site tamanegi.onion!\"))\n# => [linkify_it.main.Match({\n# 'schema': '',\n# 'index': 5,\n# 'last_index': 19,\n# 'raw': 'tamanegi.onion',\n# 'text': 'tamanegi.onion',\n# 'url': 'http://tamanegi.onion'\n# }]\n```\n\n### Example 3. Add twitter mentions handler\n\n```python\nfrom linkify_it import LinkifyIt\n\n\nlinkify = LinkifyIt()\n\ndef validate(obj, text, pos):\n tail = text[pos:]\n\n if not obj.re.get(\"twitter\"):\n obj.re[\"twitter\"] = re.compile(\n \"^([a-zA-Z0-9_]){1,15}(?!_)(?=$|\" + obj.re[\"src_ZPCc\"] + \")\"\n )\n if obj.re[\"twitter\"].search(tail):\n if pos > 2 and tail[pos - 2] == \"@\":\n return False\n return len(obj.re[\"twitter\"].search(tail).group())\n return 0\n\ndef normalize(obj, match):\n match.url = \"https://twitter.com/\" + re.sub(r\"^@\", \"\", match.url)\n\nlinkify.add(\"@\", {\"validate\": validate, \"normalize\": normalize})\n```\n\n\n## API\n\n[API documentation](https://linkify-it-py.readthedocs.io/en/latest/)\n\n### LinkifyIt(schemas, options)\n\nCreates new linkifier instance with optional additional schemas.\n\nBy default understands:\n\n- `http(s)://...` , `ftp://...`, `mailto:...` & `//...` links\n- \"fuzzy\" links and emails (google.com, foo@bar.com).\n\n`schemas` is an dict, where each key/value describes protocol/rule:\n\n- __key__ - link prefix (usually, protocol name with `:` at the end, `skype:`\n for example). `linkify-it-py` makes sure that prefix is not preceded with\n alphanumeric char.\n- __value__ - rule to check tail after link prefix\n - _str_\n - just alias to existing rule\n - _dict_\n - _validate_ - either a `re.Pattern` (start with `^`, and don't include the\n link prefix itself), or a validator `function` which, given arguments\n _self_, _text_ and _pos_, returns the length of a match in _text_\n starting at index _pos_. _pos_ is the index right after the link prefix.\n _self_ can be used to access the linkify object to cache data.\n - _normalize_ - optional function to normalize text & url of matched result\n (for example, for twitter mentions).\n\n`options`:\n\n- __fuzzy_link__ - recognize URL-s without `http(s)://` head. Default `True`.\n- __fuzzy_ip__ - allow IPs in fuzzy links above. Can conflict with some texts\n like version numbers. Default `False`.\n- __fuzzy_email__ - recognize emails without `mailto:` prefix. Default `True`.\n- __---__ - set `True` to terminate link with `---` (if it's considered as long dash).\n\n\n### .test(text)\n\nSearches linkifiable pattern and returns `True` on success or `False` on fail.\n\n\n### .pretest(text)\n\nQuick check if link MAY BE can exist. Can be used to optimize more expensive\n`.test()` calls. Return `False` if link can not be found, `True` - if `.test()`\ncall needed to know exactly.\n\n\n### .test_schema_at(text, name, position)\n\nSimilar to `.test()` but checks only specific protocol tail exactly at given\nposition. Returns length of found pattern (0 on fail).\n\n\n### .match(text)\n\nReturns `list` of found link matches or null if nothing found.\n\nEach match has:\n\n- __schema__ - link schema, can be empty for fuzzy links, or `//` for\n protocol-neutral links.\n- __index__ - offset of matched text\n- __last_index__ - index of next char after mathch end\n- __raw__ - matched text\n- __text__ - normalized text\n- __url__ - link, generated from matched text\n\n### .matchAtStart(text)\n\nChecks if a match exists at the start of the string. Returns `Match`\n(see docs for `match(text)`) or null if no URL is at the start.\nDoesn't work with fuzzy links.\n\n### .tlds(list_tlds, keep_old=False)\n\nLoad (or merge) new tlds list. Those are needed for fuzzy links (without schema)\nto avoid false positives. By default:\n\n- 2-letter root zones are ok.\n- biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф are ok.\n- encoded (`xn--...`) root zones are ok.\n\nIf that's not enough, you can reload defaults with more detailed zones list.\n\n### .add(key, value)\n\nAdd a new schema to the schemas object. As described in the constructor\ndefinition, `key` is a link prefix (`skype:`, for example), and `value`\nis a `str` to alias to another schema, or an `dict` with `validate` and\noptionally `normalize` definitions. To disable an existing rule, use\n`.add(key, None)`.\n\n\n### .set(options)\n\nOverride default options. Missed properties will not be changed.\n\n\n## License\n\n[MIT](https://github.com/tsutsu3/linkify-it-py/blob/master/LICENSE)\n",
- "description_content_type": "text/markdown",
- "keywords": [
- "linkify",
- "linkifier",
- "autolink",
- "autolinker"
- ],
- "author": "tsutsu3",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Intended Audience :: Developers",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ],
- "requires_dist": [
- "uc-micro-py",
- "pytest ; extra == 'benchmark'",
- "pytest-benchmark ; extra == 'benchmark'",
- "pre-commit ; extra == 'dev'",
- "isort ; extra == 'dev'",
- "flake8 ; extra == 'dev'",
- "black ; extra == 'dev'",
- "pyproject-flake8 ; extra == 'dev'",
- "sphinx ; extra == 'doc'",
- "sphinx-book-theme ; extra == 'doc'",
- "myst-parser ; extra == 'doc'",
- "pytest ; extra == 'test'",
- "coverage ; extra == 'test'",
- "pytest-cov ; extra == 'test'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Homepage, https://github.com/tsutsu3/linkify-it-py"
- ],
- "provides_extra": [
- "benchmark",
- "dev",
- "doc",
- "test"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/c8/22/9460e311f340cb62d26a38c419b1381b8593b0bb6b5d1f056938b086d362/lockfile-0.12.2-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa",
- "hashes": {
- "sha256": "6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.0",
- "name": "lockfile",
- "version": "0.12.2",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "Platform-independent file locking module",
- "description": "Note: This package is **deprecated**. It is highly preferred that instead of\nusing this code base that instead `fasteners`_ or `oslo.concurrency`_ is\nused instead. For any questions or comments or further help needed\nplease email `openstack-dev`_ and prefix your email subject\nwith ``[oslo][pylockfile]`` (for a faster response).\n\nThe lockfile package exports a LockFile class which provides a simple API for\nlocking files. Unlike the Windows msvcrt.locking function, the fcntl.lockf\nand flock functions, and the deprecated posixfile module, the API is\nidentical across both Unix (including Linux and Mac) and Windows platforms.\nThe lock mechanism relies on the atomic nature of the link (on Unix) and\nmkdir (on Windows) system calls. An implementation based on SQLite is also\nprovided, more as a demonstration of the possibilities it provides than as\nproduction-quality code.\n\nNote: In version 0.9 the API changed in two significant ways:\n\n * It changed from a module defining several classes to a package containing\n several modules, each defining a single class.\n\n * Where classes had been named SomethingFileLock before the last two words\n have been reversed, so that class is now SomethingLockFile.\n\nThe previous module-level definitions of LinkFileLock, MkdirFileLock and\nSQLiteFileLock will be retained until the 1.0 release.\n\nTo install:\n\n python setup.py install\n\n* Documentation: http://docs.openstack.org/developer/pylockfile\n* Source: http://git.openstack.org/cgit/openstack/pylockfile\n* Bugs: http://bugs.launchpad.net/pylockfile\n\n\n\n",
- "home_page": "http://launchpad.net/pylockfile",
- "author": "OpenStack",
- "author_email": "openstack-dev@lists.openstack.org",
- "license": "UNKNOWN",
- "classifier": [
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: POSIX :: Linux",
- "Operating System :: MacOS",
- "Operating System :: Microsoft :: Windows :: Windows NT/2000",
- "Operating System :: POSIX",
- "Programming Language :: Python",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.3",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/03/3b/68690a035ba7347860f1b8c0cde853230ba69ff41df5884ea7d89fe68cd3/Mako-1.2.4-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818",
- "hashes": {
- "sha256": "c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "Mako",
- "version": "1.2.4",
- "summary": "A super-fast templating language that borrows the best ideas from the existing templating languages.",
- "description": "=========================\nMako Templates for Python\n=========================\n\nMako is a template library written in Python. It provides a familiar, non-XML \nsyntax which compiles into Python modules for maximum performance. Mako's \nsyntax and API borrows from the best ideas of many others, including Django\ntemplates, Cheetah, Myghty, and Genshi. Conceptually, Mako is an embedded \nPython (i.e. Python Server Page) language, which refines the familiar ideas\nof componentized layout and inheritance to produce one of the most \nstraightforward and flexible models available, while also maintaining close \nties to Python calling and scoping semantics.\n\nNutshell\n========\n\n::\n\n <%inherit file=\"base.html\"/>\n <%\n rows = [[v for v in range(0,10)] for row in range(0,10)]\n %>\n <table>\n % for row in rows:\n ${makerow(row)}\n % endfor\n </table>\n\n <%def name=\"makerow(row)\">\n <tr>\n % for name in row:\n <td>${name}</td>\\\n % endfor\n </tr>\n </%def>\n\nPhilosophy\n===========\n\nPython is a great scripting language. Don't reinvent the wheel...your templates can handle it !\n\nDocumentation\n==============\n\nSee documentation for Mako at https://docs.makotemplates.org/en/latest/\n\nLicense\n========\n\nMako is licensed under an MIT-style license (see LICENSE).\nOther incorporated projects may be licensed under different licenses.\nAll licenses allow for non-commercial and commercial use.\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://www.makotemplates.org/",
- "author": "Mike Bayer",
- "author_email": "mike@zzzcomputing.com",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "License :: OSI Approved :: MIT License",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Internet :: WWW/HTTP :: Dynamic Content"
- ],
- "requires_dist": [
- "MarkupSafe (>=0.9.2)",
- "importlib-metadata ; python_version < \"3.8\"",
- "Babel ; extra == 'babel'",
- "lingua ; extra == 'lingua'",
- "pytest ; extra == 'testing'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Documentation, https://docs.makotemplates.org",
- "Issue Tracker, https://github.com/sqlalchemy/mako"
- ],
- "provides_extra": [
- "babel",
- "lingua",
- "testing"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/bb/c1/50caaec6cadc1c6adc8fe351e03bd646d6e4dd17f55fca0f4c8d7ea8d3e9/Markdown-3.5-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=4afb124395ce5fc34e6d9886dab977fd9ae987fc6e85689f08278cf0c69d4bf3",
- "hashes": {
- "sha256": "4afb124395ce5fc34e6d9886dab977fd9ae987fc6e85689f08278cf0c69d4bf3"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "Markdown",
- "version": "3.5",
- "summary": "Python implementation of John Gruber's Markdown.",
- "description": "[Python-Markdown][]\n===================\n\n[![Build Status][build-button]][build]\n[![Coverage Status][codecov-button]][codecov]\n[![Latest Version][mdversion-button]][md-pypi]\n[![Python Versions][pyversion-button]][md-pypi]\n[![BSD License][bsdlicense-button]][bsdlicense]\n[![Code of Conduct][codeofconduct-button]][Code of Conduct]\n\n[build-button]: https://github.com/Python-Markdown/markdown/workflows/CI/badge.svg?event=push\n[build]: https://github.com/Python-Markdown/markdown/actions?query=workflow%3ACI+event%3Apush\n[codecov-button]: https://codecov.io/gh/Python-Markdown/markdown/branch/master/graph/badge.svg\n[codecov]: https://codecov.io/gh/Python-Markdown/markdown\n[mdversion-button]: https://img.shields.io/pypi/v/Markdown.svg\n[md-pypi]: https://pypi.org/project/Markdown/\n[pyversion-button]: https://img.shields.io/pypi/pyversions/Markdown.svg\n[bsdlicense-button]: https://img.shields.io/badge/license-BSD-yellow.svg\n[bsdlicense]: https://opensource.org/licenses/BSD-3-Clause\n[codeofconduct-button]: https://img.shields.io/badge/code%20of%20conduct-contributor%20covenant-green.svg?style=flat-square\n[Code of Conduct]: https://github.com/Python-Markdown/markdown/blob/master/CODE_OF_CONDUCT.md\n\nThis is a Python implementation of John Gruber's [Markdown][].\nIt is almost completely compliant with the reference implementation,\nthough there are a few known issues. See [Features][] for information\non what exactly is supported and what is not. Additional features are\nsupported by the [Available Extensions][].\n\n[Python-Markdown]: https://Python-Markdown.github.io/\n[Markdown]: https://daringfireball.net/projects/markdown/\n[Features]: https://Python-Markdown.github.io#Features\n[Available Extensions]: https://Python-Markdown.github.io/extensions\n\nDocumentation\n-------------\n\n```bash\npip install markdown\n```\n```python\nimport markdown\nhtml = markdown.markdown(your_text_string)\n```\n\nFor more advanced [installation] and [usage] documentation, see the `docs/` directory\nof the distribution or the project website at <https://Python-Markdown.github.io/>.\n\n[installation]: https://python-markdown.github.io/install/\n[usage]: https://python-markdown.github.io/reference/\n\nSee the change log at <https://Python-Markdown.github.io/change_log>.\n\nSupport\n-------\n\nYou may report bugs, ask for help, and discuss various other issues on the [bug tracker][].\n\n[bug tracker]: https://github.com/Python-Markdown/markdown/issues\n\nCode of Conduct\n---------------\n\nEveryone interacting in the Python-Markdown project's code bases, issue trackers,\nand mailing lists is expected to follow the [Code of Conduct].\n",
- "description_content_type": "text/markdown",
- "keywords": [
- "markdown",
- "markdown-parser",
- "python-markdown",
- "markdown-to-html"
- ],
- "author": "Manfred Stienstra, Yuri Takhteyev",
- "author_email": "Waylan limberg <python.markdown@gmail.com>",
- "maintainer": "Isaac Muse",
- "maintainer_email": "Waylan Limberg <python.markdown@gmail.com>",
- "license": "Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later)\nCopyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b)\nCopyright 2004 Manfred Stienstra (the original version)\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n* Neither the name of the Python Markdown Project nor the\n names of its contributors may be used to endorse or promote products\n derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE PYTHON MARKDOWN PROJECT ''AS IS'' AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL ANY CONTRIBUTORS TO THE PYTHON MARKDOWN PROJECT\nBE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Communications :: Email :: Filters",
- "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries",
- "Topic :: Internet :: WWW/HTTP :: Site Management",
- "Topic :: Software Development :: Documentation",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "Topic :: Text Processing :: Filters",
- "Topic :: Text Processing :: Markup :: HTML",
- "Topic :: Text Processing :: Markup :: Markdown"
- ],
- "requires_dist": [
- "importlib-metadata >=4.4 ; python_version < \"3.10\"",
- "mkdocs >=1.5 ; extra == 'docs'",
- "mkdocs-nature >=0.6 ; extra == 'docs'",
- "mdx-gh-links >=0.2 ; extra == 'docs'",
- "mkdocstrings[python] ; extra == 'docs'",
- "mkdocs-gen-files ; extra == 'docs'",
- "mkdocs-section-index ; extra == 'docs'",
- "mkdocs-literate-nav ; extra == 'docs'",
- "coverage ; extra == 'testing'",
- "pyyaml ; extra == 'testing'"
- ],
- "requires_python": ">=3.8",
- "project_url": [
- "Homepage, https://Python-Markdown.github.io/",
- "Documentation, https://Python-Markdown.github.io/",
- "Repository, https://github.com/Python-Markdown/markdown",
- "Issue Tracker, https://github.com/Python-Markdown/markdown/issues",
- "Changelog, https://github.com/Python-Markdown/markdown/blob/master/docs/change_log/index.md"
- ],
- "provides_extra": [
- "docs",
- "testing"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1",
- "hashes": {
- "sha256": "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "markdown-it-py",
- "version": "3.0.0",
- "summary": "Python port of markdown-it. Markdown parsing, done right!",
- "description": "# markdown-it-py\n\n[![Github-CI][github-ci]][github-link]\n[![Coverage Status][codecov-badge]][codecov-link]\n[![PyPI][pypi-badge]][pypi-link]\n[![Conda][conda-badge]][conda-link]\n[![Code style: black][black-badge]][black-link]\n[![PyPI - Downloads][install-badge]][install-link]\n\n> Markdown parser done right.\n\n- Follows the __[CommonMark spec](http://spec.commonmark.org/)__ for baseline parsing\n- Configurable syntax: you can add new rules and even replace existing ones.\n- Pluggable: Adds syntax extensions to extend the parser (see the [plugin list][md-plugins]).\n- High speed (see our [benchmarking tests][md-performance])\n- [Safe by default][md-security]\n- Member of [Google's Assured Open Source Software](https://cloud.google.com/assured-open-source-software/docs/supported-packages)\n\nThis is a Python port of [markdown-it], and some of its associated plugins.\nFor more details see: <https://markdown-it-py.readthedocs.io>.\n\nFor details on [markdown-it] itself, see:\n\n- The __[Live demo](https://markdown-it.github.io)__\n- [The markdown-it README][markdown-it-readme]\n\n## Installation\n\n```bash\nconda install -c conda-forge markdown-it-py\n```\n\nor\n\n```bash\npip install markdown-it-py[plugins]\n```\n\nor with extras\n\n```bash\nconda install -c conda-forge markdown-it-py linkify-it-py mdit-py-plugins\npip install markdown-it-py[linkify,plugins]\n```\n\n## Usage\n\n### Python API Usage\n\nRender markdown to HTML with markdown-it-py and a custom configuration\nwith and without plugins and features:\n\n```python\nfrom markdown_it import MarkdownIt\nfrom mdit_py_plugins.front_matter import front_matter_plugin\nfrom mdit_py_plugins.footnote import footnote_plugin\n\nmd = (\n MarkdownIt('commonmark' ,{'breaks':True,'html':True})\n .use(front_matter_plugin)\n .use(footnote_plugin)\n .enable('table')\n)\ntext = (\"\"\"\n---\na: 1\n---\n\na | b\n- | -\n1 | 2\n\nA footnote [^1]\n\n[^1]: some details\n\"\"\")\ntokens = md.parse(text)\nhtml_text = md.render(text)\n\n## To export the html to a file, uncomment the lines below:\n# from pathlib import Path\n# Path(\"output.html\").write_text(html_text)\n```\n\n### Command-line Usage\n\nRender markdown to HTML with markdown-it-py from the\ncommand-line:\n\n```console\nusage: markdown-it [-h] [-v] [filenames [filenames ...]]\n\nParse one or more markdown files, convert each to HTML, and print to stdout\n\npositional arguments:\n filenames specify an optional list of files to convert\n\noptional arguments:\n -h, --help show this help message and exit\n -v, --version show program's version number and exit\n\nInteractive:\n\n $ markdown-it\n markdown-it-py [version 0.0.0] (interactive)\n Type Ctrl-D to complete input, or Ctrl-C to exit.\n >>> # Example\n ... > markdown *input*\n ...\n <h1>Example</h1>\n <blockquote>\n <p>markdown <em>input</em></p>\n </blockquote>\n\nBatch:\n\n $ markdown-it README.md README.footer.md > index.html\n\n```\n\n## References / Thanks\n\nBig thanks to the authors of [markdown-it]:\n\n- Alex Kocharin [github/rlidwka](https://github.com/rlidwka)\n- Vitaly Puzrin [github/puzrin](https://github.com/puzrin)\n\nAlso [John MacFarlane](https://github.com/jgm) for his work on the CommonMark spec and reference implementations.\n\n[github-ci]: https://github.com/executablebooks/markdown-it-py/workflows/Python%20package/badge.svg?branch=master\n[github-link]: https://github.com/executablebooks/markdown-it-py\n[pypi-badge]: https://img.shields.io/pypi/v/markdown-it-py.svg\n[pypi-link]: https://pypi.org/project/markdown-it-py\n[conda-badge]: https://anaconda.org/conda-forge/markdown-it-py/badges/version.svg\n[conda-link]: https://anaconda.org/conda-forge/markdown-it-py\n[codecov-badge]: https://codecov.io/gh/executablebooks/markdown-it-py/branch/master/graph/badge.svg\n[codecov-link]: https://codecov.io/gh/executablebooks/markdown-it-py\n[black-badge]: https://img.shields.io/badge/code%20style-black-000000.svg\n[black-link]: https://github.com/ambv/black\n[install-badge]: https://img.shields.io/pypi/dw/markdown-it-py?label=pypi%20installs\n[install-link]: https://pypistats.org/packages/markdown-it-py\n\n[CommonMark spec]: http://spec.commonmark.org/\n[markdown-it]: https://github.com/markdown-it/markdown-it\n[markdown-it-readme]: https://github.com/markdown-it/markdown-it/blob/master/README.md\n[md-security]: https://markdown-it-py.readthedocs.io/en/latest/other.html\n[md-performance]: https://markdown-it-py.readthedocs.io/en/latest/other.html\n[md-plugins]: https://markdown-it-py.readthedocs.io/en/latest/plugins.html\n\n",
- "description_content_type": "text/markdown",
- "keywords": [
- "markdown",
- "lexer",
- "parser",
- "commonmark",
- "markdown-it"
- ],
- "author_email": "Chris Sewell <chrisj_sewell@hotmail.com>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "Topic :: Text Processing :: Markup"
- ],
- "requires_dist": [
- "mdurl~=0.1",
- "psutil ; extra == \"benchmarking\"",
- "pytest ; extra == \"benchmarking\"",
- "pytest-benchmark ; extra == \"benchmarking\"",
- "pre-commit~=3.0 ; extra == \"code_style\"",
- "commonmark~=0.9 ; extra == \"compare\"",
- "markdown~=3.4 ; extra == \"compare\"",
- "mistletoe~=1.0 ; extra == \"compare\"",
- "mistune~=2.0 ; extra == \"compare\"",
- "panflute~=2.3 ; extra == \"compare\"",
- "linkify-it-py>=1,<3 ; extra == \"linkify\"",
- "mdit-py-plugins ; extra == \"plugins\"",
- "gprof2dot ; extra == \"profiling\"",
- "mdit-py-plugins ; extra == \"rtd\"",
- "myst-parser ; extra == \"rtd\"",
- "pyyaml ; extra == \"rtd\"",
- "sphinx ; extra == \"rtd\"",
- "sphinx-copybutton ; extra == \"rtd\"",
- "sphinx-design ; extra == \"rtd\"",
- "sphinx_book_theme ; extra == \"rtd\"",
- "jupyter_sphinx ; extra == \"rtd\"",
- "coverage ; extra == \"testing\"",
- "pytest ; extra == \"testing\"",
- "pytest-cov ; extra == \"testing\"",
- "pytest-regressions ; extra == \"testing\""
- ],
- "requires_python": ">=3.8",
- "project_url": [
- "Documentation, https://markdown-it-py.readthedocs.io",
- "Homepage, https://github.com/executablebooks/markdown-it-py"
- ],
- "provides_extra": [
- "benchmarking",
- "code_style",
- "compare",
- "linkify",
- "plugins",
- "profiling",
- "rtd",
- "testing"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/fe/21/2eff1de472ca6c99ec3993eab11308787b9879af9ca8bbceb4868cf4f2ca/MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "archive_info": {
- "hash": "sha256=bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2",
- "hashes": {
- "sha256": "bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "MarkupSafe",
- "version": "2.1.3",
- "summary": "Safely add untrusted strings to HTML/XML markup.",
- "description": "MarkupSafe\n==========\n\nMarkupSafe implements a text object that escapes characters so it is\nsafe to use in HTML and XML. Characters that have special meanings are\nreplaced so that they display as the actual characters. This mitigates\ninjection attacks, meaning untrusted user input can safely be displayed\non a page.\n\n\nInstalling\n----------\n\nInstall and update using `pip`_:\n\n.. code-block:: text\n\n pip install -U MarkupSafe\n\n.. _pip: https://pip.pypa.io/en/stable/getting-started/\n\n\nExamples\n--------\n\n.. code-block:: pycon\n\n >>> from markupsafe import Markup, escape\n\n >>> # escape replaces special characters and wraps in Markup\n >>> escape(\"<script>alert(document.cookie);</script>\")\n Markup('<script>alert(document.cookie);</script>')\n\n >>> # wrap in Markup to mark text \"safe\" and prevent escaping\n >>> Markup(\"<strong>Hello</strong>\")\n Markup('<strong>hello</strong>')\n\n >>> escape(Markup(\"<strong>Hello</strong>\"))\n Markup('<strong>hello</strong>')\n\n >>> # Markup is a str subclass\n >>> # methods and operators escape their arguments\n >>> template = Markup(\"Hello <em>{name}</em>\")\n >>> template.format(name='\"World\"')\n Markup('Hello <em>"World"</em>')\n\n\nDonate\n------\n\nThe Pallets organization develops and supports MarkupSafe and other\npopular packages. In order to grow the community of contributors and\nusers, and allow the maintainers to devote more time to the projects,\n`please donate today`_.\n\n.. _please donate today: https://palletsprojects.com/donate\n\n\nLinks\n-----\n\n- Documentation: https://markupsafe.palletsprojects.com/\n- Changes: https://markupsafe.palletsprojects.com/changes/\n- PyPI Releases: https://pypi.org/project/MarkupSafe/\n- Source Code: https://github.com/pallets/markupsafe/\n- Issue Tracker: https://github.com/pallets/markupsafe/issues/\n- Chat: https://discord.gg/pallets\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://palletsprojects.com/p/markupsafe/",
- "maintainer": "Pallets",
- "maintainer_email": "contact@palletsprojects.com",
- "license": "BSD-3-Clause",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
- "Topic :: Text Processing :: Markup :: HTML"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Donate, https://palletsprojects.com/donate",
- "Documentation, https://markupsafe.palletsprojects.com/",
- "Changes, https://markupsafe.palletsprojects.com/changes/",
- "Source Code, https://github.com/pallets/markupsafe/",
- "Issue Tracker, https://github.com/pallets/markupsafe/issues/",
- "Chat, https://discord.gg/pallets"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/ed/3c/cebfdcad015240014ff08b883d1c0c427f2ba45ae8c6572851b6ef136cad/marshmallow-3.20.1-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c",
- "hashes": {
- "sha256": "684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "marshmallow",
- "version": "3.20.1",
- "summary": "A lightweight library for converting complex datatypes to and from native Python datatypes.",
- "description": "********************************************\nmarshmallow: simplified object serialization\n********************************************\n\n.. image:: https://badgen.net/pypi/v/marshmallow\n :target: https://pypi.org/project/marshmallow/\n :alt: Latest version\n\n.. image:: https://github.com/marshmallow-code/marshmallow/actions/workflows/build-release.yml/badge.svg\n :target: https://github.com/marshmallow-code/marshmallow/actions/workflows/build-release.yml\n :alt: Build status\n\n.. image:: https://results.pre-commit.ci/badge/github/marshmallow-code/marshmallow/dev.svg\n :target: https://results.pre-commit.ci/latest/github/marshmallow-code/marshmallow/dev\n :alt: pre-commit.ci status\n\n.. image:: https://readthedocs.org/projects/marshmallow/badge/\n :target: https://marshmallow.readthedocs.io/\n :alt: Documentation\n \n.. image:: https://badgen.net/badge/code%20style/black/000\n :target: https://github.com/ambv/black\n :alt: code style: black\n\n\n**marshmallow** is an ORM/ODM/framework-agnostic library for converting complex datatypes, such as objects, to and from native Python datatypes.\n\n.. code-block:: python\n\n from datetime import date\n from pprint import pprint\n\n from marshmallow import Schema, fields\n\n\n class ArtistSchema(Schema):\n name = fields.Str()\n\n\n class AlbumSchema(Schema):\n title = fields.Str()\n release_date = fields.Date()\n artist = fields.Nested(ArtistSchema())\n\n\n bowie = dict(name=\"David Bowie\")\n album = dict(artist=bowie, title=\"Hunky Dory\", release_date=date(1971, 12, 17))\n\n schema = AlbumSchema()\n result = schema.dump(album)\n pprint(result, indent=2)\n # { 'artist': {'name': 'David Bowie'},\n # 'release_date': '1971-12-17',\n # 'title': 'Hunky Dory'}\n\n\nIn short, marshmallow schemas can be used to:\n\n- **Validate** input data.\n- **Deserialize** input data to app-level objects.\n- **Serialize** app-level objects to primitive Python types. The serialized objects can then be rendered to standard formats such as JSON for use in an HTTP API.\n\nGet It Now\n==========\n\n::\n\n $ pip install -U marshmallow\n\n\nDocumentation\n=============\n\nFull documentation is available at https://marshmallow.readthedocs.io/ .\n\nRequirements\n============\n\n- Python >= 3.8\n\nEcosystem\n=========\n\nA list of marshmallow-related libraries can be found at the GitHub wiki here:\n\nhttps://github.com/marshmallow-code/marshmallow/wiki/Ecosystem\n\nCredits\n=======\n\nContributors\n------------\n\nThis project exists thanks to all the people who contribute.\n\n**You're highly encouraged to participate in marshmallow's development.**\nCheck out the `Contributing Guidelines <https://marshmallow.readthedocs.io/en/latest/contributing.html>`_ to see how you can help.\n\nThank you to all who have already contributed to marshmallow!\n\n.. image:: https://opencollective.com/marshmallow/contributors.svg?width=890&button=false\n :target: https://marshmallow.readthedocs.io/en/latest/authors.html\n :alt: Contributors\n\nBackers\n-------\n\nIf you find marshmallow useful, please consider supporting the team with\na donation. Your donation helps move marshmallow forward.\n\nThank you to all our backers! [`Become a backer`_]\n\n.. _`Become a backer`: https://opencollective.com/marshmallow#backer\n\n.. image:: https://opencollective.com/marshmallow/backers.svg?width=890\n :target: https://opencollective.com/marshmallow#backers\n :alt: Backers\n\nSponsors\n--------\n\nSupport this project by becoming a sponsor (or ask your company to support this project by becoming a sponsor).\nYour logo will show up here with a link to your website. [`Become a sponsor`_]\n\n.. _`Become a sponsor`: https://opencollective.com/marshmallow#sponsor\n\n.. image:: https://opencollective.com/marshmallow/sponsor/0/avatar.svg\n :target: https://opencollective.com/marshmallow/sponsor/0/website\n :alt: Sponsors\n\n.. image:: https://opencollective.com/static/images/become_sponsor.svg\n :target: https://opencollective.com/marshmallow#sponsor\n :alt: Become a sponsor\n\n\nProfessional Support\n====================\n\nProfessionally-supported marshmallow is now available through the\n`Tidelift Subscription <https://tidelift.com/subscription/pkg/pypi-marshmallow?utm_source=pypi-marshmallow&utm_medium=readme>`_.\n\nTidelift gives software development teams a single source for purchasing and maintaining their software,\nwith professional-grade assurances from the experts who know it best,\nwhile seamlessly integrating with existing tools. [`Get professional support`_]\n\n.. _`Get professional support`: https://tidelift.com/subscription/pkg/pypi-marshmallow?utm_source=marshmallow&utm_medium=referral&utm_campaign=github\n\n.. image:: https://user-images.githubusercontent.com/2379650/45126032-50b69880-b13f-11e8-9c2c-abd16c433495.png\n :target: https://tidelift.com/subscription/pkg/pypi-marshmallow?utm_source=pypi-marshmallow&utm_medium=readme\n :alt: Get supported marshmallow with Tidelift\n\n\nProject Links\n=============\n\n- Docs: https://marshmallow.readthedocs.io/\n- Changelog: https://marshmallow.readthedocs.io/en/latest/changelog.html\n- Contributing Guidelines: https://marshmallow.readthedocs.io/en/latest/contributing.html\n- PyPI: https://pypi.python.org/pypi/marshmallow\n- Issues: https://github.com/marshmallow-code/marshmallow/issues\n- Donate: https://opencollective.com/marshmallow\n\nLicense\n=======\n\nMIT licensed. See the bundled `LICENSE <https://github.com/marshmallow-code/marshmallow/blob/dev/LICENSE>`_ file for more details.\n",
- "keywords": [
- "serialization",
- "rest",
- "json",
- "api",
- "marshal",
- "marshalling",
- "deserialization",
- "validation",
- "schema"
- ],
- "home_page": "https://github.com/marshmallow-code/marshmallow",
- "author": "Steven Loria",
- "author_email": "sloria1@gmail.com",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11"
- ],
- "requires_dist": [
- "packaging (>=17.0)",
- "pytest ; extra == 'dev'",
- "pytz ; extra == 'dev'",
- "simplejson ; extra == 'dev'",
- "mypy (==1.4.1) ; extra == 'dev'",
- "flake8 (==6.0.0) ; extra == 'dev'",
- "flake8-bugbear (==23.7.10) ; extra == 'dev'",
- "pre-commit (<4.0,>=2.4) ; extra == 'dev'",
- "tox ; extra == 'dev'",
- "sphinx (==7.0.1) ; extra == 'docs'",
- "sphinx-issues (==3.0.1) ; extra == 'docs'",
- "alabaster (==0.7.13) ; extra == 'docs'",
- "sphinx-version-warning (==1.1.2) ; extra == 'docs'",
- "autodocsumm (==0.2.11) ; extra == 'docs'",
- "mypy (==1.4.1) ; extra == 'lint'",
- "flake8 (==6.0.0) ; extra == 'lint'",
- "flake8-bugbear (==23.7.10) ; extra == 'lint'",
- "pre-commit (<4.0,>=2.4) ; extra == 'lint'",
- "pytest ; extra == 'tests'",
- "pytz ; extra == 'tests'",
- "simplejson ; extra == 'tests'"
- ],
- "requires_python": ">=3.8",
- "project_url": [
- "Changelog, https://marshmallow.readthedocs.io/en/latest/changelog.html",
- "Issues, https://github.com/marshmallow-code/marshmallow/issues",
- "Funding, https://opencollective.com/marshmallow",
- "Tidelift, https://tidelift.com/subscription/pkg/pypi-marshmallow?utm_source=pypi-marshmallow&utm_medium=pypi"
- ],
- "provides_extra": [
- "dev",
- "docs",
- "lint",
- "tests"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/ca/eb/3f6d90ba82b2dd319c7d3534a90ba3f4bdf2e332e89c2399fdc818051589/marshmallow_oneofschema-3.0.1-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=bd29410a9f2f7457a2b428286e2a80ef76b8ddc3701527dc1f935a88914b02f2",
- "hashes": {
- "sha256": "bd29410a9f2f7457a2b428286e2a80ef76b8ddc3701527dc1f935a88914b02f2"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "marshmallow-oneofschema",
- "version": "3.0.1",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "marshmallow multiplexing schema",
- "description": "=======================\nmarshmallow-oneofschema\n=======================\n\n.. image:: https://dev.azure.com/sloria/sloria/_apis/build/status/marshmallow-code.marshmallow-oneofschema?branchName=master\n :target: https://dev.azure.com/sloria/sloria/_build/latest?definitionId=13&branchName=master\n :alt: Build Status\n\n.. image:: https://badgen.net/badge/marshmallow/3\n :target: https://marshmallow.readthedocs.io/en/latest/upgrading.html\n :alt: marshmallow 3 compatible\n\nAn extension to marshmallow to support schema (de)multiplexing.\n\nmarshmallow is a fantastic library for serialization and deserialization of data.\nFor more on that project see its `GitHub <https://github.com/marshmallow-code/marshmallow>`_\npage or its `Documentation <http://marshmallow.readthedocs.org/en/latest/>`_.\n\nThis library adds a special kind of schema that actually multiplexes other schemas\nbased on object type. When serializing values, it uses get_obj_type() method\nto get object type name. Then it uses ``type_schemas`` name-to-Schema mapping\nto get schema for that particular object type, serializes object using that\nschema and adds an extra field with name of object type. Deserialization is reverse.\n\nInstalling\n----------\n\n::\n\n $ pip install marshmallow-oneofschema\n\nExample\n-------\n\nThe code below demonstrates how to set up a polymorphic schema. For the full context check out the tests.\nOnce setup the schema should act like any other schema. If it does not then please file an Issue.\n\n.. code:: python\n\n import marshmallow\n import marshmallow.fields\n from marshmallow_oneofschema import OneOfSchema\n\n\n class Foo:\n def __init__(self, foo):\n self.foo = foo\n\n\n class Bar:\n def __init__(self, bar):\n self.bar = bar\n\n\n class FooSchema(marshmallow.Schema):\n foo = marshmallow.fields.String(required=True)\n\n @marshmallow.post_load\n def make_foo(self, data, **kwargs):\n return Foo(**data)\n\n\n class BarSchema(marshmallow.Schema):\n bar = marshmallow.fields.Integer(required=True)\n\n @marshmallow.post_load\n def make_bar(self, data, **kwargs):\n return Bar(**data)\n\n\n class MyUberSchema(OneOfSchema):\n type_schemas = {\"foo\": FooSchema, \"bar\": BarSchema}\n\n def get_obj_type(self, obj):\n if isinstance(obj, Foo):\n return \"foo\"\n elif isinstance(obj, Bar):\n return \"bar\"\n else:\n raise Exception(\"Unknown object type: {}\".format(obj.__class__.__name__))\n\n\n MyUberSchema().dump([Foo(foo=\"hello\"), Bar(bar=123)], many=True)\n # => [{'type': 'foo', 'foo': 'hello'}, {'type': 'bar', 'bar': 123}]\n\n MyUberSchema().load(\n [{\"type\": \"foo\", \"foo\": \"hello\"}, {\"type\": \"bar\", \"bar\": 123}], many=True\n )\n # => [Foo('hello'), Bar(123)]\n\nBy default get_obj_type() returns obj.__class__.__name__, so you can just reuse that\nto save some typing:\n\n.. code:: python\n\n class MyUberSchema(OneOfSchema):\n type_schemas = {\"Foo\": FooSchema, \"Bar\": BarSchema}\n\nYou can customize type field with `type_field` class property:\n\n.. code:: python\n\n class MyUberSchema(OneOfSchema):\n type_field = \"object_type\"\n type_schemas = {\"Foo\": FooSchema, \"Bar\": BarSchema}\n\n\n MyUberSchema().dump([Foo(foo=\"hello\"), Bar(bar=123)], many=True)\n # => [{'object_type': 'Foo', 'foo': 'hello'}, {'object_type': 'Bar', 'bar': 123}]\n\nYou can use resulting schema everywhere marshmallow.Schema can be used, e.g.\n\n.. code:: python\n\n import marshmallow as m\n import marshmallow.fields as f\n\n\n class MyOtherSchema(m.Schema):\n items = f.List(f.Nested(MyUberSchema))\n\nLicense\n-------\n\nMIT licensed. See the bundled `LICENSE <https://github.com/marshmallow-code/marshmallow-oneofschema/blob/master/LICENSE>`_ file for more details.\n\n\n",
- "keywords": [
- "serialization",
- "deserialization",
- "json",
- "marshal",
- "marshalling",
- "schema",
- "validation",
- "multiplexing",
- "demultiplexing",
- "polymorphic"
- ],
- "home_page": "https://github.com/marshmallow-code/marshmallow-oneofschema",
- "author": "Maxim Kulkin",
- "author_email": "maxim.kulkin@gmail.com",
- "maintainer": "Steven Loria",
- "maintainer_email": "sloria1@gmail.com",
- "license": "MIT",
- "classifier": [
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9"
- ],
- "requires_dist": [
- "marshmallow (<4.0.0,>=3.0.0)",
- "pytest ; extra == 'dev'",
- "mock ; extra == 'dev'",
- "flake8 (==3.9.2) ; extra == 'dev'",
- "flake8-bugbear (==21.4.3) ; extra == 'dev'",
- "pre-commit (~=2.7) ; extra == 'dev'",
- "tox ; extra == 'dev'",
- "flake8 (==3.9.2) ; extra == 'lint'",
- "flake8-bugbear (==21.4.3) ; extra == 'lint'",
- "pre-commit (~=2.7) ; extra == 'lint'",
- "pytest ; extra == 'tests'",
- "mock ; extra == 'tests'"
- ],
- "requires_python": ">=3.6",
- "provides_extra": [
- "dev",
- "lint",
- "tests"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/d1/84/1f4d7393d04f2ae0d4098791d1901a713f45ba70ff6f3c35ff2f7fd81f7b/marshmallow_sqlalchemy-0.26.1-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=ba7493eeb8669a3bf00d8f906b657feaa87a740ae9e4ecf829cfd6ddf763d276",
- "hashes": {
- "sha256": "ba7493eeb8669a3bf00d8f906b657feaa87a740ae9e4ecf829cfd6ddf763d276"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "marshmallow-sqlalchemy",
- "version": "0.26.1",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "SQLAlchemy integration with the marshmallow (de)serialization library",
- "description": "**********************\nmarshmallow-sqlalchemy\n**********************\n\n|pypi-package| |build-status| |docs| |marshmallow3| |black|\n\nHomepage: https://marshmallow-sqlalchemy.readthedocs.io/\n\n`SQLAlchemy <http://www.sqlalchemy.org/>`_ integration with the `marshmallow <https://marshmallow.readthedocs.io/en/latest/>`_ (de)serialization library.\n\nDeclare your models\n===================\n\n.. code-block:: python\n\n import sqlalchemy as sa\n from sqlalchemy.ext.declarative import declarative_base\n from sqlalchemy.orm import scoped_session, sessionmaker, relationship, backref\n\n engine = sa.create_engine(\"sqlite:///:memory:\")\n session = scoped_session(sessionmaker(bind=engine))\n Base = declarative_base()\n\n\n class Author(Base):\n __tablename__ = \"authors\"\n id = sa.Column(sa.Integer, primary_key=True)\n name = sa.Column(sa.String, nullable=False)\n\n def __repr__(self):\n return \"<Author(name={self.name!r})>\".format(self=self)\n\n\n class Book(Base):\n __tablename__ = \"books\"\n id = sa.Column(sa.Integer, primary_key=True)\n title = sa.Column(sa.String)\n author_id = sa.Column(sa.Integer, sa.ForeignKey(\"authors.id\"))\n author = relationship(\"Author\", backref=backref(\"books\"))\n\n\n Base.metadata.create_all(engine)\n\nGenerate marshmallow schemas\n============================\n\n.. code-block:: python\n\n from marshmallow_sqlalchemy import SQLAlchemySchema, auto_field\n\n\n class AuthorSchema(SQLAlchemySchema):\n class Meta:\n model = Author\n load_instance = True # Optional: deserialize to model instances\n\n id = auto_field()\n name = auto_field()\n books = auto_field()\n\n\n class BookSchema(SQLAlchemySchema):\n class Meta:\n model = Book\n load_instance = True\n\n id = auto_field()\n title = auto_field()\n author_id = auto_field()\n\nYou can automatically generate fields for a model's columns using `SQLAlchemyAutoSchema`.\nThe following schema classes are equivalent to the above.\n\n.. code-block:: python\n\n from marshmallow_sqlalchemy import SQLAlchemyAutoSchema\n\n\n class AuthorSchema(SQLAlchemyAutoSchema):\n class Meta:\n model = Author\n include_relationships = True\n load_instance = True\n\n\n class BookSchema(SQLAlchemyAutoSchema):\n class Meta:\n model = Book\n include_fk = True\n load_instance = True\n\n\nMake sure to declare `Models` before instantiating `Schemas`. Otherwise `sqlalchemy.orm.configure_mappers() <https://docs.sqlalchemy.org/en/latest/orm/mapping_api.html>`_ will run too soon and fail.\n\n(De)serialize your data\n=======================\n\n.. code-block:: python\n\n author = Author(name=\"Chuck Paluhniuk\")\n author_schema = AuthorSchema()\n book = Book(title=\"Fight Club\", author=author)\n session.add(author)\n session.add(book)\n session.commit()\n\n dump_data = author_schema.dump(author)\n print(dump_data)\n # {'id': 1, 'name': 'Chuck Paluhniuk', 'books': [1]}\n\n load_data = author_schema.load(dump_data, session=session)\n print(load_data)\n # <Author(name='Chuck Paluhniuk')>\n\nGet it now\n==========\n::\n\n pip install -U marshmallow-sqlalchemy\n\n\nRequires Python >= 3.6, marshmallow >= 3.0.0, and SQLAlchemy >= 1.2.0.\n\nDocumentation\n=============\n\nDocumentation is available at https://marshmallow-sqlalchemy.readthedocs.io/ .\n\nProject Links\n=============\n\n- Docs: https://marshmallow-sqlalchemy.readthedocs.io/\n- Changelog: https://marshmallow-sqlalchemy.readthedocs.io/en/latest/changelog.html\n- Contributing Guidelines: https://marshmallow-sqlalchemy.readthedocs.io/en/latest/contributing.html\n- PyPI: https://pypi.python.org/pypi/marshmallow-sqlalchemy\n- Issues: https://github.com/marshmallow-code/marshmallow-sqlalchemy/issues\n\nLicense\n=======\n\nMIT licensed. See the bundled `LICENSE <https://github.com/marshmallow-code/marshmallow-sqlalchemy/blob/dev/LICENSE>`_ file for more details.\n\n\n.. |pypi-package| image:: https://badgen.net/pypi/v/marshmallow-sqlalchemy\n :target: https://pypi.org/project/marshmallow-sqlalchemy/\n :alt: Latest version\n.. |build-status| image:: https://dev.azure.com/sloria/sloria/_apis/build/status/marshmallow-code.marshmallow-sqlalchemy?branchName=dev\n :target: https://dev.azure.com/sloria/sloria/_build/latest?definitionId=10&branchName=dev\n :alt: Build status\n.. |docs| image:: https://readthedocs.org/projects/marshmallow-sqlalchemy/badge/\n :target: http://marshmallow-sqlalchemy.readthedocs.io/\n :alt: Documentation\n.. |marshmallow3| image:: https://badgen.net/badge/marshmallow/3\n :target: https://marshmallow.readthedocs.io/en/latest/upgrading.html\n :alt: marshmallow 3 compatible\n.. |black| image:: https://badgen.net/badge/code%20style/black/000\n :target: https://github.com/ambv/black\n :alt: code style: black\n\n\n",
- "keywords": [
- "sqlalchemy",
- "marshmallow"
- ],
- "home_page": "https://github.com/marshmallow-code/marshmallow-sqlalchemy",
- "author": "Steven Loria",
- "author_email": "sloria1@gmail.com",
- "license": "MIT",
- "classifier": [
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Natural Language :: English",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9"
- ],
- "requires_dist": [
- "marshmallow (>=3.0.0)",
- "SQLAlchemy (>=1.2.0)",
- "pytest ; extra == 'dev'",
- "pytest-lazy-fixture ; extra == 'dev'",
- "flake8 (==3.9.2) ; extra == 'dev'",
- "flake8-bugbear (==21.4.3) ; extra == 'dev'",
- "pre-commit (~=2.0) ; extra == 'dev'",
- "tox ; extra == 'dev'",
- "sphinx (==4.0.2) ; extra == 'docs'",
- "alabaster (==0.7.12) ; extra == 'docs'",
- "sphinx-issues (==1.2.0) ; extra == 'docs'",
- "flake8 (==3.9.2) ; extra == 'lint'",
- "flake8-bugbear (==21.4.3) ; extra == 'lint'",
- "pre-commit (~=2.0) ; extra == 'lint'",
- "pytest ; extra == 'tests'",
- "pytest-lazy-fixture ; extra == 'tests'"
- ],
- "requires_python": ">=3.6",
- "project_url": [
- "Changelog, https://marshmallow-sqlalchemy.readthedocs.io/en/latest/changelog.html",
- "Issues, https://github.com/marshmallow-code/marshmallow-sqlalchemy/issues",
- "Funding, https://opencollective.com/marshmallow"
- ],
- "provides_extra": [
- "dev",
- "docs",
- "lint",
- "tests"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/e5/3c/fe85f19699a7b40c8f9ce8ecee7e269b9b3c94099306df6f9891bdefeedd/mdit_py_plugins-0.4.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9",
- "hashes": {
- "sha256": "b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "mdit-py-plugins",
- "version": "0.4.0",
- "summary": "Collection of plugins for markdown-it-py",
- "description": "# mdit-py-plugins\n\n[![Github-CI][github-ci]][github-link]\n[![Coverage Status][codecov-badge]][codecov-link]\n[![PyPI][pypi-badge]][pypi-link]\n[![Conda][conda-badge]][conda-link]\n[![Code style: black][black-badge]][black-link]\n\nCollection of core plugins for [markdown-it-py](https://github.com/executablebooks/markdown-it-py).\n\n[github-ci]: https://github.com/executablebooks/mdit-py-plugins/workflows/continuous-integration/badge.svg\n[github-link]: https://github.com/executablebooks/mdit-py-plugins\n[pypi-badge]: https://img.shields.io/pypi/v/mdit-py-plugins.svg\n[pypi-link]: https://pypi.org/project/mdit-py-plugins\n[conda-badge]: https://anaconda.org/conda-forge/mdit-py-plugins/badges/version.svg\n[conda-link]: https://anaconda.org/conda-forge/mdit-py-plugins\n[codecov-badge]: https://codecov.io/gh/executablebooks/mdit-py-plugins/branch/master/graph/badge.svg\n[codecov-link]: https://codecov.io/gh/executablebooks/mdit-py-plugins\n[black-badge]: https://img.shields.io/badge/code%20style-black-000000.svg\n[black-link]: https://github.com/ambv/black\n[install-badge]: https://img.shields.io/pypi/dw/mdit-py-plugins?label=pypi%20installs\n[install-link]: https://pypistats.org/packages/mdit-py-plugins\n\n",
- "description_content_type": "text/markdown",
- "keywords": [
- "markdown",
- "markdown-it",
- "lexer",
- "parser",
- "development"
- ],
- "author_email": "Chris Sewell <chrisj_sewell@hotmail.com>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "Topic :: Text Processing :: Markup"
- ],
- "requires_dist": [
- "markdown-it-py>=1.0.0,<4.0.0",
- "pre-commit ; extra == \"code_style\"",
- "myst-parser ; extra == \"rtd\"",
- "sphinx-book-theme ; extra == \"rtd\"",
- "coverage ; extra == \"testing\"",
- "pytest ; extra == \"testing\"",
- "pytest-cov ; extra == \"testing\"",
- "pytest-regressions ; extra == \"testing\""
- ],
- "requires_python": ">=3.8",
- "project_url": [
- "Documentation, https://mdit-py-plugins.readthedocs.io",
- "Homepage, https://github.com/executablebooks/mdit-py-plugins"
- ],
- "provides_extra": [
- "code_style",
- "rtd",
- "testing"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8",
- "hashes": {
- "sha256": "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "mdurl",
- "version": "0.1.2",
- "summary": "Markdown URL utilities",
- "description": "# mdurl\n\n[](https://github.com/executablebooks/mdurl/actions?query=workflow%3ATests+branch%3Amaster+event%3Apush)\n[](https://codecov.io/gh/executablebooks/mdurl)\n[](https://pypi.org/project/mdurl)\n\nThis is a Python port of the JavaScript [mdurl](https://www.npmjs.com/package/mdurl) package.\nSee the [upstream README.md file](https://github.com/markdown-it/mdurl/blob/master/README.md) for API documentation.\n\n",
- "description_content_type": "text/markdown",
- "keywords": [
- "markdown",
- "commonmark"
- ],
- "author_email": "Taneli Hukkinen <hukkin@users.noreply.github.com>",
- "classifier": [
- "License :: OSI Approved :: MIT License",
- "Operating System :: MacOS",
- "Operating System :: Microsoft :: Windows",
- "Operating System :: POSIX :: Linux",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "Typing :: Typed"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Homepage, https://github.com/executablebooks/mdurl"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/41/01/85c059d495679bb9ae50be223d6bd56d94bd050f51b25deffde2e6437463/opentelemetry_api-1.20.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=982b76036fec0fdaf490ae3dfd9f28c81442a33414f737abc687a32758cdcba5",
- "hashes": {
- "sha256": "982b76036fec0fdaf490ae3dfd9f28c81442a33414f737abc687a32758cdcba5"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "opentelemetry-api",
- "version": "1.20.0",
- "summary": "OpenTelemetry Python API",
- "description": "OpenTelemetry Python API\n============================================================================\n\n|pypi|\n\n.. |pypi| image:: https://badge.fury.io/py/opentelemetry-api.svg\n :target: https://pypi.org/project/opentelemetry-api/\n\nInstallation\n------------\n\n::\n\n pip install opentelemetry-api\n\nReferences\n----------\n\n* `OpenTelemetry Project <https://opentelemetry.io/>`_\n",
- "description_content_type": "text/x-rst",
- "author_email": "OpenTelemetry Authors <cncf-opentelemetry-contributors@lists.cncf.io>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Typing :: Typed"
- ],
- "requires_dist": [
- "deprecated>=1.2.6",
- "importlib-metadata<7.0,>=6.0"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Homepage, https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-api"
- ],
- "provides_extra": [
- "test"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/04/ba/4e22b13ff0ebaa30ea6e1b568463dc3fa53ed7076b2fc3de263682b69a5d/opentelemetry_exporter_otlp-1.20.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=3b4d47726da83fef84467bdf96da4f8f3d1a61b35db3c16354c391ce8e9decf6",
- "hashes": {
- "sha256": "3b4d47726da83fef84467bdf96da4f8f3d1a61b35db3c16354c391ce8e9decf6"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "opentelemetry-exporter-otlp",
- "version": "1.20.0",
- "summary": "OpenTelemetry Collector Exporters",
- "description": "OpenTelemetry Collector Exporters\n=================================\n\n|pypi|\n\n.. |pypi| image:: https://badge.fury.io/py/opentelemetry-exporter-otlp.svg\n :target: https://pypi.org/project/opentelemetry-exporter-otlp/\n\nThis library is provided as a convenience to install all supported OpenTelemetry Collector Exporters. Currently it installs:\n\n* opentelemetry-exporter-otlp-proto-grpc\n* opentelemetry-exporter-otlp-proto-http\n\nIn the future, additional packages will be available:\n* opentelemetry-exporter-otlp-json-http\n\nTo avoid unnecessary dependencies, users should install the specific package once they've determined their\npreferred serialization and protocol method.\n\nInstallation\n------------\n\n::\n\n pip install opentelemetry-exporter-otlp\n\n\nReferences\n----------\n\n* `OpenTelemetry Collector Exporter <https://opentelemetry-python.readthedocs.io/en/latest/exporter/otlp/otlp.html>`_\n* `OpenTelemetry Collector <https://github.com/open-telemetry/opentelemetry-collector/>`_\n* `OpenTelemetry <https://opentelemetry.io/>`_\n* `OpenTelemetry Protocol Specification <https://github.com/open-telemetry/oteps/blob/main/text/0035-opentelemetry-protocol.md>`_\n",
- "description_content_type": "text/x-rst",
- "author_email": "OpenTelemetry Authors <cncf-opentelemetry-contributors@lists.cncf.io>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Typing :: Typed"
- ],
- "requires_dist": [
- "opentelemetry-exporter-otlp-proto-grpc==1.20.0",
- "opentelemetry-exporter-otlp-proto-http==1.20.0"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Homepage, https://github.com/open-telemetry/opentelemetry-python/tree/main/exporter/opentelemetry-exporter-otlp"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/89/13/1c6f7f1d81839ecfd4b61f8648c3d1843362e9c927a9b4e59fe4c29cec14/opentelemetry_exporter_otlp_proto_common-1.20.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=dd63209b40702636ab6ae76a06b401b646ad7b008a906ecb41222d4af24fbdef",
- "hashes": {
- "sha256": "dd63209b40702636ab6ae76a06b401b646ad7b008a906ecb41222d4af24fbdef"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "opentelemetry-exporter-otlp-proto-common",
- "version": "1.20.0",
- "summary": "OpenTelemetry Protobuf encoding",
- "description": "OpenTelemetry Protobuf Encoding\n===============================\n\n|pypi|\n\n.. |pypi| image:: https://badge.fury.io/py/opentelemetry-exporter-otlp-proto-common.svg\n :target: https://pypi.org/project/opentelemetry-exporter-otlp-proto-common/\n\nThis library is provided as a convenience to encode to Protobuf. Currently used by:\n\n* opentelemetry-exporter-otlp-proto-grpc\n* opentelemetry-exporter-otlp-proto-http\n\n\nInstallation\n------------\n\n::\n\n pip install opentelemetry-exporter-otlp-proto-common\n\n\nReferences\n----------\n\n* `OpenTelemetry <https://opentelemetry.io/>`_\n* `OpenTelemetry Protocol Specification <https://github.com/open-telemetry/oteps/blob/main/text/0035-opentelemetry-protocol.md>`_\n",
- "description_content_type": "text/x-rst",
- "author_email": "OpenTelemetry Authors <cncf-opentelemetry-contributors@lists.cncf.io>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11"
- ],
- "requires_dist": [
- "backoff<2.0.0,>=1.10.0; python_version < '3.7'",
- "backoff<3.0.0,>=1.10.0; python_version >= '3.7'",
- "opentelemetry-proto==1.20.0"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Homepage, https://github.com/open-telemetry/opentelemetry-python/tree/main/exporter/opentelemetry-exporter-otlp-proto-common"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/9e/a7/ce3ba7618887c08835c2f9c2fcfc4fcc46d9af7b62e2d2c9ea80d6604cf7/opentelemetry_exporter_otlp_proto_grpc-1.20.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=7c3f066065891b56348ba2c7f9df6ec635a712841cae0a36f2f6a81642ae7dec",
- "hashes": {
- "sha256": "7c3f066065891b56348ba2c7f9df6ec635a712841cae0a36f2f6a81642ae7dec"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "opentelemetry-exporter-otlp-proto-grpc",
- "version": "1.20.0",
- "summary": "OpenTelemetry Collector Protobuf over gRPC Exporter",
- "description": "OpenTelemetry Collector Protobuf over gRPC Exporter\n===================================================\n\n|pypi|\n\n.. |pypi| image:: https://badge.fury.io/py/opentelemetry-exporter-otlp-proto-grpc.svg\n :target: https://pypi.org/project/opentelemetry-exporter-otlp-proto-grpc/\n\nThis library allows to export data to the OpenTelemetry Collector using the OpenTelemetry Protocol using Protobuf over gRPC.\n\nInstallation\n------------\n\n::\n\n pip install opentelemetry-exporter-otlp-proto-grpc\n\n\nReferences\n----------\n\n* `OpenTelemetry Collector Exporter <https://opentelemetry-python.readthedocs.io/en/latest/exporter/otlp/otlp.html>`_\n* `OpenTelemetry Collector <https://github.com/open-telemetry/opentelemetry-collector/>`_\n* `OpenTelemetry <https://opentelemetry.io/>`_\n* `OpenTelemetry Protocol Specification <https://github.com/open-telemetry/oteps/blob/main/text/0035-opentelemetry-protocol.md>`_\n",
- "description_content_type": "text/x-rst",
- "author_email": "OpenTelemetry Authors <cncf-opentelemetry-contributors@lists.cncf.io>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11"
- ],
- "requires_dist": [
- "backoff<2.0.0,>=1.10.0; python_version < '3.7'",
- "backoff<3.0.0,>=1.10.0; python_version >= '3.7'",
- "deprecated>=1.2.6",
- "googleapis-common-protos~=1.52",
- "grpcio<2.0.0,>=1.0.0",
- "opentelemetry-api~=1.15",
- "opentelemetry-exporter-otlp-proto-common==1.20.0",
- "opentelemetry-proto==1.20.0",
- "opentelemetry-sdk~=1.20.0",
- "pytest-grpc; extra == 'test'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Homepage, https://github.com/open-telemetry/opentelemetry-python/tree/main/exporter/opentelemetry-exporter-otlp-proto-grpc"
- ],
- "provides_extra": [
- "test"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/d8/05/764b6ff9a70d9c5f749cea38072f830f577b0e01e144522522258924b626/opentelemetry_exporter_otlp_proto_http-1.20.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=03f6e768ad25f1c3a9586e8c695db4a4adf978f8546a1285fa962e16bfbb0bd6",
- "hashes": {
- "sha256": "03f6e768ad25f1c3a9586e8c695db4a4adf978f8546a1285fa962e16bfbb0bd6"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "opentelemetry-exporter-otlp-proto-http",
- "version": "1.20.0",
- "summary": "OpenTelemetry Collector Protobuf over HTTP Exporter",
- "description": "OpenTelemetry Collector Protobuf over HTTP Exporter\n===================================================\n\n|pypi|\n\n.. |pypi| image:: https://badge.fury.io/py/opentelemetry-exporter-otlp-proto-http.svg\n :target: https://pypi.org/project/opentelemetry-exporter-otlp-proto-http/\n\nThis library allows to export data to the OpenTelemetry Collector using the OpenTelemetry Protocol using Protobuf over HTTP.\n\nInstallation\n------------\n\n::\n\n pip install opentelemetry-exporter-otlp-proto-http\n\n\nReferences\n----------\n\n* `OpenTelemetry Collector Exporter <https://opentelemetry-python.readthedocs.io/en/latest/exporter/otlp/otlp.html>`_\n* `OpenTelemetry Collector <https://github.com/open-telemetry/opentelemetry-collector/>`_\n* `OpenTelemetry <https://opentelemetry.io/>`_\n* `OpenTelemetry Protocol Specification <https://github.com/open-telemetry/oteps/blob/main/text/0035-opentelemetry-protocol.md>`_\n",
- "description_content_type": "text/x-rst",
- "author_email": "OpenTelemetry Authors <cncf-opentelemetry-contributors@lists.cncf.io>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11"
- ],
- "requires_dist": [
- "backoff<2.0.0,>=1.10.0; python_version < '3.7'",
- "backoff<3.0.0,>=1.10.0; python_version >= '3.7'",
- "deprecated>=1.2.6",
- "googleapis-common-protos~=1.52",
- "opentelemetry-api~=1.15",
- "opentelemetry-exporter-otlp-proto-common==1.20.0",
- "opentelemetry-proto==1.20.0",
- "opentelemetry-sdk~=1.20.0",
- "requests~=2.7",
- "responses==0.22.0; extra == 'test'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Homepage, https://github.com/open-telemetry/opentelemetry-python/tree/main/exporter/opentelemetry-exporter-otlp-proto-http"
- ],
- "provides_extra": [
- "test"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/68/8b/90f0672651e80fca84eb4952ae48b6d5776b2329c6d7bf70d937535719d2/opentelemetry_proto-1.20.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=512c3d2c6864fb7547a69577c3907348e6c985b7a204533563cb4c4c5046203b",
- "hashes": {
- "sha256": "512c3d2c6864fb7547a69577c3907348e6c985b7a204533563cb4c4c5046203b"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "opentelemetry-proto",
- "version": "1.20.0",
- "summary": "OpenTelemetry Python Proto",
- "description": "OpenTelemetry Python Proto\n==========================\n\n|pypi|\n\n.. |pypi| image:: https://badge.fury.io/py/opentelemetry-proto.svg\n :target: https://pypi.org/project/opentelemetry-proto/\n\nThis library contains the generated code for OpenTelemetry protobuf data model. The code in the current\npackage was generated using the v0.17.0 release_ of opentelemetry-proto.\n\n.. _release: https://github.com/open-telemetry/opentelemetry-proto/releases/tag/v0.17.0\n\nInstallation\n------------\n\n::\n\n pip install opentelemetry-proto\n\nCode Generation\n---------------\n\nThese files were generated automatically from code in opentelemetry-proto_.\nTo regenerate the code, run ``../scripts/proto_codegen.sh``.\n\nTo build against a new release or specific commit of opentelemetry-proto_,\nupdate the ``PROTO_REPO_BRANCH_OR_COMMIT`` variable in\n``../scripts/proto_codegen.sh``. Then run the script and commit the changes\nas well as any fixes needed in the OTLP exporter.\n\n.. _opentelemetry-proto: https://github.com/open-telemetry/opentelemetry-proto\n\n\nReferences\n----------\n\n* `OpenTelemetry Project <https://opentelemetry.io/>`_\n* `OpenTelemetry Proto <https://github.com/open-telemetry/opentelemetry-proto>`_\n* `proto_codegen.sh script <https://github.com/open-telemetry/opentelemetry-python/blob/main/scripts/proto_codegen.sh>`_\n",
- "description_content_type": "text/x-rst",
- "author_email": "OpenTelemetry Authors <cncf-opentelemetry-contributors@lists.cncf.io>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11"
- ],
- "requires_dist": [
- "protobuf<5.0,>=3.19"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Homepage, https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-proto"
- ],
- "provides_extra": [
- "test"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/fa/0a/ffb64bc8177fef5fdb97e4e5dcce9924184090620b3fc97b9c656e06b2e8/opentelemetry_sdk-1.20.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=f2230c276ff4c63ea09b3cb2e2ac6b1265f90af64e8d16bbf275c81a9ce8e804",
- "hashes": {
- "sha256": "f2230c276ff4c63ea09b3cb2e2ac6b1265f90af64e8d16bbf275c81a9ce8e804"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "opentelemetry-sdk",
- "version": "1.20.0",
- "summary": "OpenTelemetry Python SDK",
- "description": "OpenTelemetry Python SDK\n============================================================================\n\n|pypi|\n\n.. |pypi| image:: https://badge.fury.io/py/opentelemetry-sdk.svg\n :target: https://pypi.org/project/opentelemetry-sdk/\n\nInstallation\n------------\n\n::\n\n pip install opentelemetry-sdk\n\nReferences\n----------\n\n* `OpenTelemetry Project <https://opentelemetry.io/>`_\n",
- "description_content_type": "text/x-rst",
- "author_email": "OpenTelemetry Authors <cncf-opentelemetry-contributors@lists.cncf.io>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Typing :: Typed"
- ],
- "requires_dist": [
- "opentelemetry-api==1.20.0",
- "opentelemetry-semantic-conventions==0.41b0",
- "typing-extensions>=3.7.4"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Homepage, https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-sdk"
- ],
- "provides_extra": [
- "test"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/aa/78/7a7508d16d32f92d6b206b2e367c5f044b3e652e7f385bbf17f49baad189/opentelemetry_semantic_conventions-0.41b0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=45404391ed9e50998183a4925ad1b497c01c143f06500c3b9c3d0013492bb0f2",
- "hashes": {
- "sha256": "45404391ed9e50998183a4925ad1b497c01c143f06500c3b9c3d0013492bb0f2"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "opentelemetry-semantic-conventions",
- "version": "0.41b0",
- "summary": "OpenTelemetry Semantic Conventions",
- "description": "OpenTelemetry Semantic Conventions\n==================================\n\n|pypi|\n\n.. |pypi| image:: https://badge.fury.io/py/opentelemetry-semantic-conventions.svg\n :target: https://pypi.org/project/opentelemetry-semantic-conventions/\n\nThis library contains generated code for the semantic conventions defined by the OpenTelemetry specification.\n\nInstallation\n------------\n\n::\n\n pip install opentelemetry-semantic-conventions\n\nCode Generation\n---------------\n\nThese files were generated automatically from code in semconv_.\nTo regenerate the code, run ``../scripts/semconv/generate.sh``.\n\nTo build against a new release or specific commit of opentelemetry-specification_,\nupdate the ``SPEC_VERSION`` variable in\n``../scripts/semconv/generate.sh``. Then run the script and commit the changes.\n\n.. _opentelemetry-specification: https://github.com/open-telemetry/opentelemetry-specification\n.. _semconv: https://github.com/open-telemetry/opentelemetry-python/tree/main/scripts/semconv\n\n\nReferences\n----------\n\n* `OpenTelemetry Project <https://opentelemetry.io/>`_\n* `OpenTelemetry Semantic Conventions YAML Definitions <https://github.com/open-telemetry/opentelemetry-specification/tree/main/semantic_conventions>`_\n* `generate.sh script <https://github.com/open-telemetry/opentelemetry-python/blob/main/scripts/semconv/generate.sh>`_\n",
- "description_content_type": "text/x-rst",
- "author_email": "OpenTelemetry Authors <cncf-opentelemetry-contributors@lists.cncf.io>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Homepage, https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-semantic-conventions"
- ],
- "provides_extra": [
- "test"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/33/55/af02708f230eb77084a299d7b08175cff006dea4f2721074b92cdb0296c0/ordered_set-4.1.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562",
- "hashes": {
- "sha256": "046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "ordered-set",
- "version": "4.1.0",
- "summary": "An OrderedSet is a custom MutableSet that remembers its order, so that every",
- "description": "[](https://pypi.python.org/pypi/ordered-set)\n\nAn OrderedSet is a mutable data structure that is a hybrid of a list and a set.\nIt remembers the order of its entries, and every entry has an index number that\ncan be looked up.\n\n## Installation\n\n`ordered_set` is available on PyPI and packaged as a wheel. You can list it\nas a dependency of your project, in whatever form that takes.\n\nTo install it into your current Python environment:\n\n pip install ordered-set\n\nTo install the code for development, after checking out the repository:\n\n pip install flit\n flit install\n\n## Usage examples\n\nAn OrderedSet is created and used like a set:\n\n >>> from ordered_set import OrderedSet\n\n >>> letters = OrderedSet('abracadabra')\n\n >>> letters\n OrderedSet(['a', 'b', 'r', 'c', 'd'])\n\n >>> 'r' in letters\n True\n\nIt is efficient to find the index of an entry in an OrderedSet, or find an\nentry by its index. To help with this use case, the `.add()` method returns\nthe index of the added item, whether it was already in the set or not.\n\n >>> letters.index('r')\n 2\n\n >>> letters[2]\n 'r'\n\n >>> letters.add('r')\n 2\n\n >>> letters.add('x')\n 5\n\nOrderedSets implement the union (`|`), intersection (`&`), and difference (`-`)\noperators like sets do.\n\n >>> letters |= OrderedSet('shazam')\n\n >>> letters\n OrderedSet(['a', 'b', 'r', 'c', 'd', 'x', 's', 'h', 'z', 'm'])\n\n >>> letters & set('aeiou')\n OrderedSet(['a'])\n\n >>> letters -= 'abcd'\n\n >>> letters\n OrderedSet(['r', 'x', 's', 'h', 'z', 'm'])\n\nThe `__getitem__()` and `index()` methods have been extended to accept any\niterable except a string, returning a list, to perform NumPy-like \"fancy\nindexing\".\n\n >>> letters = OrderedSet('abracadabra')\n\n >>> letters[[0, 2, 3]]\n ['a', 'r', 'c']\n\n >>> letters.index(['a', 'r', 'c'])\n [0, 2, 3]\n\nOrderedSet implements `__getstate__` and `__setstate__` so it can be pickled,\nand implements the abstract base classes `collections.MutableSet` and\n`collections.Sequence`.\n\nOrderedSet can be used as a generic collection type, similar to the collections\nin the `typing` module like List, Dict, and Set. For example, you can annotate\na variable as having the type `OrderedSet[str]` or `OrderedSet[Tuple[int,\nstr]]`.\n\n\n## OrderedSet in data science applications\n\nAn OrderedSet can be used as a bi-directional mapping between a sparse\nvocabulary and dense index numbers. As of version 3.1, it accepts NumPy arrays\nof index numbers as well as lists.\n\nThis combination of features makes OrderedSet a simple implementation of many\nof the things that `pandas.Index` is used for, and many of its operations are\nfaster than the equivalent pandas operations.\n\nFor further compatibility with pandas.Index, `get_loc` (the pandas method for\nlooking up a single index) and `get_indexer` (the pandas method for fancy\nindexing in reverse) are both aliases for `index` (which handles both cases\nin OrderedSet).\n\n\n## Authors\n\nOrderedSet was implemented by Elia Robyn Lake (maiden name: Robyn Speer).\nJon Crall contributed changes and tests to make it fit the Python set API.\nRoman Inflianskas added the original type annotations.\n\n\n## Comparisons\n\nThe original implementation of OrderedSet was a [recipe posted to ActiveState\nRecipes][recipe] by Raymond Hettiger, released under the MIT license.\n\n[recipe]: https://code.activestate.com/recipes/576694-orderedset/\n\nHettiger's implementation kept its content in a doubly-linked list referenced by a\ndict. As a result, looking up an item by its index was an O(N) operation, while\ndeletion was O(1).\n\nThis version makes different trade-offs for the sake of efficient lookups. Its\ncontent is a standard Python list instead of a doubly-linked list. This\nprovides O(1) lookups by index at the expense of O(N) deletion, as well as\nslightly faster iteration.\n\nIn Python 3.6 and later, the built-in `dict` type is inherently ordered. If you\nignore the dictionary values, that also gives you a simple ordered set, with\nfast O(1) insertion, deletion, iteration and membership testing. However, `dict`\ndoes not provide the list-like random access features of OrderedSet. You\nwould have to convert it to a list in O(N) to look up the index of an entry or\nlook up an entry by its index.\n\n",
- "description_content_type": "text/markdown",
- "author_email": "Elia Robyn Lake <gh@arborelia.net>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy"
- ],
- "requires_dist": [
- "pytest ; extra == \"dev\"",
- "black ; extra == \"dev\"",
- "mypy ; extra == \"dev\""
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Home, https://github.com/rspeer/ordered-set"
- ],
- "provides_extra": [
- "dev"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7",
- "hashes": {
- "sha256": "8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "packaging",
- "version": "23.2",
- "summary": "Core utilities for Python packages",
- "description": "packaging\n=========\n\n.. start-intro\n\nReusable core utilities for various Python Packaging\n`interoperability specifications <https://packaging.python.org/specifications/>`_.\n\nThis library provides utilities that implement the interoperability\nspecifications which have clearly one correct behaviour (eg: :pep:`440`)\nor benefit greatly from having a single shared implementation (eg: :pep:`425`).\n\n.. end-intro\n\nThe ``packaging`` project includes the following: version handling, specifiers,\nmarkers, requirements, tags, utilities.\n\nDocumentation\n-------------\n\nThe `documentation`_ provides information and the API for the following:\n\n- Version Handling\n- Specifiers\n- Markers\n- Requirements\n- Tags\n- Utilities\n\nInstallation\n------------\n\nUse ``pip`` to install these utilities::\n\n pip install packaging\n\nThe ``packaging`` library uses calendar-based versioning (``YY.N``).\n\nDiscussion\n----------\n\nIf you run into bugs, you can file them in our `issue tracker`_.\n\nYou can also join ``#pypa`` on Freenode to ask questions or get involved.\n\n\n.. _`documentation`: https://packaging.pypa.io/\n.. _`issue tracker`: https://github.com/pypa/packaging/issues\n\n\nCode of Conduct\n---------------\n\nEveryone interacting in the packaging project's codebases, issue trackers, chat\nrooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.\n\n.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md\n\nContributing\n------------\n\nThe ``CONTRIBUTING.rst`` file outlines how to contribute to this project as\nwell as how to report a potential security issue. The documentation for this\nproject also covers information about `project development`_ and `security`_.\n\n.. _`project development`: https://packaging.pypa.io/en/latest/development/\n.. _`security`: https://packaging.pypa.io/en/latest/security/\n\nProject History\n---------------\n\nPlease review the ``CHANGELOG.rst`` file or the `Changelog documentation`_ for\nrecent changes and project history.\n\n.. _`Changelog documentation`: https://packaging.pypa.io/en/latest/changelog/\n\n",
- "description_content_type": "text/x-rst",
- "author_email": "Donald Stufft <donald@stufft.io>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Apache Software License",
- "License :: OSI Approved :: BSD License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Typing :: Typed"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Documentation, https://packaging.pypa.io/",
- "Source, https://github.com/pypa/packaging"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/3c/29/c07c3a976dbe37c56e381e058c11e8738cb3a0416fc842a310461f8bb695/pathspec-0.10.3-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=3c95343af8b756205e2aba76e843ba9520a24dd84f68c22b9f93251507509dd6",
- "hashes": {
- "sha256": "3c95343af8b756205e2aba76e843ba9520a24dd84f68c22b9f93251507509dd6"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "pathspec",
- "version": "0.10.3",
- "summary": "Utility library for gitignore style pattern matching of file paths.",
- "description": "\nPathSpec\n========\n\n*pathspec* is a utility library for pattern matching of file paths. So\nfar this only includes Git's wildmatch pattern matching which itself is\nderived from Rsync's wildmatch. Git uses wildmatch for its `gitignore`_\nfiles.\n\n.. _`gitignore`: http://git-scm.com/docs/gitignore\n\n\nTutorial\n--------\n\nSay you have a \"Projects\" directory and you want to back it up, but only\ncertain files, and ignore others depending on certain conditions::\n\n\t>>> import pathspec\n\t>>> # The gitignore-style patterns for files to select, but we're including\n\t>>> # instead of ignoring.\n\t>>> spec_text = \"\"\"\n\t...\n\t... # This is a comment because the line begins with a hash: \"#\"\n\t...\n\t... # Include several project directories (and all descendants) relative to\n\t... # the current directory. To reference a directory you must end with a\n\t... # slash: \"/\"\n\t... /project-a/\n\t... /project-b/\n\t... /project-c/\n\t...\n\t... # Patterns can be negated by prefixing with exclamation mark: \"!\"\n\t...\n\t... # Ignore temporary files beginning or ending with \"~\" and ending with\n\t... # \".swp\".\n\t... !~*\n\t... !*~\n\t... !*.swp\n\t...\n\t... # These are python projects so ignore compiled python files from\n\t... # testing.\n\t... !*.pyc\n\t...\n\t... # Ignore the build directories but only directly under the project\n\t... # directories.\n\t... !/*/build/\n\t...\n\t... \"\"\"\n\nWe want to use the ``GitWildMatchPattern`` class to compile our patterns. The\n``PathSpec`` class provides an interface around pattern implementations::\n\n\t>>> spec = pathspec.PathSpec.from_lines(pathspec.patterns.GitWildMatchPattern, spec_text.splitlines())\n\nThat may be a mouthful but it allows for additional patterns to be implemented\nin the future without them having to deal with anything but matching the paths\nsent to them. ``GitWildMatchPattern`` is the implementation of the actual\npattern which internally gets converted into a regular expression. ``PathSpec``\nis a simple wrapper around a list of compiled patterns.\n\nTo make things simpler, we can use the registered name for a pattern class\ninstead of always having to provide a reference to the class itself. The\n``GitWildMatchPattern`` class is registered as **gitwildmatch**::\n\n\t>>> spec = pathspec.PathSpec.from_lines('gitwildmatch', spec_text.splitlines())\n\nIf we wanted to manually compile the patterns we can just do the following::\n\n\t>>> patterns = map(pathspec.patterns.GitWildMatchPattern, spec_text.splitlines())\n\t>>> spec = PathSpec(patterns)\n\n``PathSpec.from_lines()`` is simply a class method which does just that.\n\nIf you want to load the patterns from file, you can pass the file instance\ndirectly as well::\n\n\t>>> with open('patterns.list', 'r') as fh:\n\t>>> spec = pathspec.PathSpec.from_lines('gitwildmatch', fh)\n\nYou can perform matching on a whole directory tree with::\n\n\t>>> matches = spec.match_tree('path/to/directory')\n\nOr you can perform matching on a specific set of file paths with::\n\n\t>>> matches = spec.match_files(file_paths)\n\nOr check to see if an individual file matches::\n\n\t>>> is_matched = spec.match_file(file_path)\n\nThere is a specialized class, ``pathspec.GitIgnoreSpec``, which more closely\nimplements the behavior of **gitignore**. This uses ``GitWildMatchPattern``\npattern by default and handles some edge cases differently from the generic\n``PathSpec`` class. ``GitIgnoreSpec`` can be used without specifying the pattern\nfactory::\n\n\t>>> spec = pathspec.GitIgnoreSpec.from_lines(spec_text.splitlines())\n\n\nLicense\n-------\n\n*pathspec* is licensed under the `Mozilla Public License Version 2.0`_. See\n`LICENSE`_ or the `FAQ`_ for more information.\n\nIn summary, you may use *pathspec* with any closed or open source project\nwithout affecting the license of the larger work so long as you:\n\n- give credit where credit is due,\n\n- and release any custom changes made to *pathspec*.\n\n.. _`Mozilla Public License Version 2.0`: http://www.mozilla.org/MPL/2.0\n.. _`LICENSE`: LICENSE\n.. _`FAQ`: http://www.mozilla.org/MPL/2.0/FAQ.html\n\n\nSource\n------\n\nThe source code for *pathspec* is available from the GitHub repo\n`cpburnz/python-pathspec`_.\n\n.. _`cpburnz/python-pathspec`: https://github.com/cpburnz/python-pathspec\n\n\nInstallation\n------------\n\n*pathspec* is available for install through `PyPI`_::\n\n\tpip install pathspec\n\n*pathspec* can also be built from source. The following packages will be\nrequired:\n\n- `build`_ (>=0.6.0)\n- `setuptools`_ (>=40.8.0)\n\n*pathspec* can then be built and installed with::\n\n\tpython -m build\n\tpip install dist/pathspec-*-py3-none-any.whl\n\n.. _`PyPI`: http://pypi.python.org/pypi/pathspec\n.. _`build`: https://pypi.org/project/build/\n.. _`setuptools`: https://pypi.org/project/setuptools/\n\n\nDocumentation\n-------------\n\nDocumentation for *pathspec* is available on `Read the Docs`_.\n\n.. _`Read the Docs`: https://python-path-specification.readthedocs.io\n\n\nOther Languages\n---------------\n\nThe related project `pathspec-ruby`_ (by *highb*) provides a similar library as\na `Ruby gem`_.\n\n.. _`pathspec-ruby`: https://github.com/highb/pathspec-ruby\n.. _`Ruby gem`: https://rubygems.org/gems/pathspec\n\n\n\nChange History\n==============\n\n\n0.10.3 (2022-12-09)\n-------------------\n\nNew features:\n\n- Added utility function `pathspec.util.append_dir_sep()` to aid in distinguishing between directories and files on the file-system. See `Issue #65`_.\n\nBug fixes:\n\n- `Issue #66`_/`Pull #67`_: Package not marked as py.typed.\n- `Issue #68`_: Exports are considered private.\n- `Issue #70`_/`Pull #71`_: 'Self' string literal type is Unknown in pyright.\n\nImprovements:\n\n- `Issue #65`_: Checking directories via match_file() does not work on Path objects.\n\n\n.. _`Issue #65`: https://github.com/cpburnz/python-pathspec/issues/65\n.. _`Issue #66`: https://github.com/cpburnz/python-pathspec/issues/66\n.. _`Pull #67`: https://github.com/cpburnz/python-pathspec/pull/67\n.. _`Issue #68`: https://github.com/cpburnz/python-pathspec/issues/68\n.. _`Issue #70`: https://github.com/cpburnz/python-pathspec/issues/70\n.. _`Pull #71`: https://github.com/cpburnz/python-pathspec/pull/71\n\n\n0.10.2 (2022-11-12)\n-------------------\n\nBug fixes:\n\n- Fix failing tests on Windows.\n- Type hint on *root* parameter on `pathspec.pathspec.PathSpec.match_tree_entries()`.\n- Type hint on *root* parameter on `pathspec.pathspec.PathSpec.match_tree_files()`.\n- Type hint on *root* parameter on `pathspec.util.iter_tree_entries()`.\n- Type hint on *root* parameter on `pathspec.util.iter_tree_files()`.\n- `Issue #64`_: IndexError with my .gitignore file when trying to build a Python package.\n\nImprovements:\n\n- `Pull #58`_: CI: add GitHub Actions test workflow.\n\n\n.. _`Pull #58`: https://github.com/cpburnz/python-pathspec/pull/58\n.. _`Issue #64`: https://github.com/cpburnz/python-pathspec/issues/64\n\n\n0.10.1 (2022-09-02)\n-------------------\n\nBug fixes:\n\n- Fix documentation on `pathspec.pattern.RegexPattern.match_file()`.\n- `Pull #60`_: Remove redundant wheel dep from pyproject.toml.\n- `Issue #61`_: Dist failure for Fedora, CentOS, EPEL.\n- `Issue #62`_: Since version 0.10.0 pure wildcard does not work in some cases.\n\nImprovements:\n\n- Restore support for legacy installations using `setup.py`. See `Issue #61`_.\n\n\n.. _`Pull #60`: https://github.com/cpburnz/python-pathspec/pull/60\n.. _`Issue #61`: https://github.com/cpburnz/python-pathspec/issues/61\n.. _`Issue #62`: https://github.com/cpburnz/python-pathspec/issues/62\n\n\n0.10.0 (2022-08-30)\n-------------------\n\nMajor changes:\n\n- Dropped support of EOL Python 2.7, 3.5, 3.6. See `Issue #47`_.\n- The *gitwildmatch* pattern `dir/*` is now handled the same as `dir/`. This means `dir/*` will now match all descendants rather than only direct children. See `Issue #19`_.\n- Added `pathspec.GitIgnoreSpec` class (see new features).\n- Changed build system to `pyproject.toml`_ and build backend to `setuptools.build_meta`_ which may have unforeseen consequences.\n- Renamed GitHub project from `python-path-specification`_ to `python-pathspec`_. See `Issue #35`_.\n\nAPI changes:\n\n- Deprecated: `pathspec.util.match_files()` is an old function no longer used.\n- Deprecated: `pathspec.match_files()` is an old function no longer used.\n- Deprecated: `pathspec.util.normalize_files()` is no longer used.\n- Deprecated: `pathspec.util.iter_tree()` is an alias for `pathspec.util.iter_tree_files()`.\n- Deprecated: `pathspec.iter_tree()` is an alias for `pathspec.util.iter_tree_files()`.\n-\tDeprecated: `pathspec.pattern.Pattern.match()` is no longer used. Use or implement\n\t`pathspec.pattern.Pattern.match_file()`.\n\nNew features:\n\n- Added class `pathspec.gitignore.GitIgnoreSpec` (with alias `pathspec.GitIgnoreSpec`) to implement *gitignore* behavior not possible with standard `PathSpec` class. The particular *gitignore* behavior implemented is prioritizing patterns matching the file directly over matching an ancestor directory.\n\nBug fixes:\n\n- `Issue #19`_: Files inside an ignored sub-directory are not matched.\n- `Issue #41`_: Incorrectly (?) matches files inside directories that do match.\n- `Pull #51`_: Refactor deprecated unittest aliases for Python 3.11 compatibility.\n- `Issue #53`_: Symlink pathspec_meta.py breaks Windows.\n- `Issue #54`_: test_util.py uses os.symlink which can fail on Windows.\n- `Issue #55`_: Backslashes at start of pattern not handled correctly.\n- `Pull #56`_: pyproject.toml: include subpackages in setuptools config\n- `Issue #57`_: `!` doesn't exclude files in directories if the pattern doesn't have a trailing slash.\n\nImprovements:\n\n- Support Python 3.10, 3.11.\n- Modernize code to Python 3.7.\n- `Issue #52`_: match_files() is not a pure generator function, and it impacts tree_*() gravely.\n\n\n.. _`python-path-specification`: https://github.com/cpburnz/python-path-specification\n.. _`python-pathspec`: https://github.com/cpburnz/python-pathspec\n.. _`pyproject.toml`: https://pip.pypa.io/en/stable/reference/build-system/pyproject-toml/\n.. _`setuptools.build_meta`: https://setuptools.pypa.io/en/latest/build_meta.html\n.. _`Issue #19`: https://github.com/cpburnz/python-pathspec/issues/19\n.. _`Issue #35`: https://github.com/cpburnz/python-pathspec/issues/35\n.. _`Issue #41`: https://github.com/cpburnz/python-pathspec/issues/41\n.. _`Issue #47`: https://github.com/cpburnz/python-pathspec/issues/47\n.. _`Pull #51`: https://github.com/cpburnz/python-pathspec/pull/51\n.. _`Issue #52`: https://github.com/cpburnz/python-pathspec/issues/52\n.. _`Issue #53`: https://github.com/cpburnz/python-pathspec/issues/53\n.. _`Issue #54`: https://github.com/cpburnz/python-pathspec/issues/54\n.. _`Issue #55`: https://github.com/cpburnz/python-pathspec/issues/55\n.. _`Pull #56`: https://github.com/cpburnz/python-pathspec/pull/56\n.. _`Issue #57`: https://github.com/cpburnz/python-pathspec/issues/57\n\n\n0.9.0 (2021-07-17)\n------------------\n\n- `Issue #44`_/`Pull #50`_: Raise `GitWildMatchPatternError` for invalid git patterns.\n- `Pull #45`_: Fix for duplicate leading double-asterisk, and edge cases.\n- `Issue #46`_: Fix matching absolute paths.\n- API change: `util.normalize_files()` now returns a `Dict[str, List[pathlike]]` instead of a `Dict[str, pathlike]`.\n- Added type hinting.\n\n.. _`Issue #44`: https://github.com/cpburnz/python-pathspec/issues/44\n.. _`Pull #45`: https://github.com/cpburnz/python-pathspec/pull/45\n.. _`Issue #46`: https://github.com/cpburnz/python-pathspec/issues/46\n.. _`Pull #50`: https://github.com/cpburnz/python-pathspec/pull/50\n\n\n0.8.1 (2020-11-07)\n------------------\n\n- `Pull #43`_: Add support for addition operator.\n\n.. _`Pull #43`: https://github.com/cpburnz/python-pathspec/pull/43\n\n\n0.8.0 (2020-04-09)\n------------------\n\n- `Issue #30`_: Expose what patterns matched paths. Added `util.detailed_match_files()`.\n- `Issue #31`_: `match_tree()` doesn't return symlinks.\n- `Issue #34`_: Support `pathlib.Path`\\ s.\n- Add `PathSpec.match_tree_entries` and `util.iter_tree_entries()` to support directories and symlinks.\n- API change: `match_tree()` has been renamed to `match_tree_files()`. The old name `match_tree()` is still available as an alias.\n- API change: `match_tree_files()` now returns symlinks. This is a bug fix but it will change the returned results.\n\n.. _`Issue #30`: https://github.com/cpburnz/python-pathspec/issues/30\n.. _`Issue #31`: https://github.com/cpburnz/python-pathspec/issues/31\n.. _`Issue #34`: https://github.com/cpburnz/python-pathspec/issues/34\n\n\n0.7.0 (2019-12-27)\n------------------\n\n- `Pull #28`_: Add support for Python 3.8, and drop Python 3.4.\n- `Pull #29`_: Publish bdist wheel.\n\n.. _`Pull #28`: https://github.com/cpburnz/python-pathspec/pull/28\n.. _`Pull #29`: https://github.com/cpburnz/python-pathspec/pull/29\n\n\n0.6.0 (2019-10-03)\n------------------\n\n- `Pull #24`_: Drop support for Python 2.6, 3.2, and 3.3.\n- `Pull #25`_: Update README.rst.\n- `Pull #26`_: Method to escape gitwildmatch.\n\n.. _`Pull #24`: https://github.com/cpburnz/python-pathspec/pull/24\n.. _`Pull #25`: https://github.com/cpburnz/python-pathspec/pull/25\n.. _`Pull #26`: https://github.com/cpburnz/python-pathspec/pull/26\n\n\n0.5.9 (2018-09-15)\n------------------\n\n- Fixed file system error handling.\n\n\n0.5.8 (2018-09-15)\n------------------\n\n- Improved type checking.\n- Created scripts to test Python 2.6 because Tox removed support for it.\n- Improved byte string handling in Python 3.\n- `Issue #22`_: Handle dangling symlinks.\n\n.. _`Issue #22`: https://github.com/cpburnz/python-pathspec/issues/22\n\n\n0.5.7 (2018-08-14)\n------------------\n\n- `Issue #21`_: Fix collections deprecation warning.\n\n.. _`Issue #21`: https://github.com/cpburnz/python-pathspec/issues/21\n\n\n0.5.6 (2018-04-06)\n------------------\n\n- Improved unit tests.\n- Improved type checking.\n- `Issue #20`_: Support current directory prefix.\n\n.. _`Issue #20`: https://github.com/cpburnz/python-pathspec/issues/20\n\n\n0.5.5 (2017-09-09)\n------------------\n\n- Add documentation link to README.\n\n\n0.5.4 (2017-09-09)\n------------------\n\n- `Pull #17`_: Add link to Ruby implementation of *pathspec*.\n- Add sphinx documentation.\n\n.. _`Pull #17`: https://github.com/cpburnz/python-pathspec/pull/17\n\n\n0.5.3 (2017-07-01)\n------------------\n\n- `Issue #14`_: Fix byte strings for Python 3.\n- `Pull #15`_: Include \"LICENSE\" in source package.\n- `Issue #16`_: Support Python 2.6.\n\n.. _`Issue #14`: https://github.com/cpburnz/python-pathspec/issues/14\n.. _`Pull #15`: https://github.com/cpburnz/python-pathspec/pull/15\n.. _`Issue #16`: https://github.com/cpburnz/python-pathspec/issues/16\n\n\n0.5.2 (2017-04-04)\n------------------\n\n- Fixed change log.\n\n\n0.5.1 (2017-04-04)\n------------------\n\n- `Pull #13`_: Add equality methods to `PathSpec` and `RegexPattern`.\n\n.. _`Pull #13`: https://github.com/cpburnz/python-pathspec/pull/13\n\n\n0.5.0 (2016-08-22)\n------------------\n\n- `Issue #12`_: Add `PathSpec.match_file()`.\n- Renamed `gitignore.GitIgnorePattern` to `patterns.gitwildmatch.GitWildMatchPattern`.\n- Deprecated `gitignore.GitIgnorePattern`.\n\n.. _`Issue #12`: https://github.com/cpburnz/python-pathspec/issues/12\n\n\n0.4.0 (2016-07-15)\n------------------\n\n- `Issue #11`_: Support converting patterns into regular expressions without compiling them.\n- API change: Subclasses of `RegexPattern` should implement `pattern_to_regex()`.\n\n.. _`Issue #11`: https://github.com/cpburnz/python-pathspec/issues/11\n\n\n0.3.4 (2015-08-24)\n------------------\n\n- `Pull #7`_: Fixed non-recursive links.\n- `Pull #8`_: Fixed edge cases in gitignore patterns.\n- `Pull #9`_: Fixed minor usage documentation.\n- Fixed recursion detection.\n- Fixed trivial incompatibility with Python 3.2.\n\n.. _`Pull #7`: https://github.com/cpburnz/python-pathspec/pull/7\n.. _`Pull #8`: https://github.com/cpburnz/python-pathspec/pull/8\n.. _`Pull #9`: https://github.com/cpburnz/python-pathspec/pull/9\n\n\n0.3.3 (2014-11-21)\n------------------\n\n- Improved documentation.\n\n\n0.3.2 (2014-11-08)\n------------------\n\n- `Pull #5`_: Use tox for testing.\n- `Issue #6`_: Fixed matching Windows paths.\n- Improved documentation.\n- API change: `spec.match_tree()` and `spec.match_files()` now return iterators instead of sets.\n\n.. _`Pull #5`: https://github.com/cpburnz/python-pathspec/pull/5\n.. _`Issue #6`: https://github.com/cpburnz/python-pathspec/issues/6\n\n\n0.3.1 (2014-09-17)\n------------------\n\n- Updated README.\n\n\n0.3.0 (2014-09-17)\n------------------\n\n- `Pull #3`_: Fixed trailing slash in gitignore patterns.\n- `Pull #4`_: Fixed test for trailing slash in gitignore patterns.\n- Added registered patterns.\n\n.. _`Pull #3`: https://github.com/cpburnz/python-pathspec/pull/3\n.. _`Pull #4`: https://github.com/cpburnz/python-pathspec/pull/4\n\n\n0.2.2 (2013-12-17)\n------------------\n\n- Fixed setup.py.\n\n\n0.2.1 (2013-12-17)\n------------------\n\n- Added tests.\n- Fixed comment gitignore patterns.\n- Fixed relative path gitignore patterns.\n\n\n0.2.0 (2013-12-07)\n------------------\n\n- Initial release.\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://github.com/cpburnz/python-pathspec",
- "author": "Caleb P. Burns",
- "author_email": "\"Caleb P. Burns\" <cpburnz@gmail.com>",
- "license": "MPL 2.0",
- "classifier": [
- "Development Status :: 4 - Beta",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "Topic :: Utilities"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Source Code, https://github.com/cpburnz/python-pathspec",
- "Documentation, https://python-path-specification.readthedocs.io/en/latest/index.html",
- "Issue Tracker, https://github.com/cpburnz/python-pathspec/issues"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/db/15/6e89ae7cde7907118769ed3d2481566d05b5fd362724025198bb95faf599/pendulum-2.1.2.tar.gz",
- "archive_info": {
- "hash": "sha256=b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207",
- "hashes": {
- "sha256": "b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "pendulum",
- "version": "2.1.2",
- "summary": "Python datetimes made easy",
- "description": "Pendulum\n########\n\n.. image:: https://img.shields.io/pypi/v/pendulum.svg\n :target: https://pypi.python.org/pypi/pendulum\n\n.. image:: https://img.shields.io/pypi/l/pendulum.svg\n :target: https://pypi.python.org/pypi/pendulum\n\n.. image:: https://img.shields.io/codecov/c/github/sdispater/pendulum/master.svg\n :target: https://codecov.io/gh/sdispater/pendulum/branch/master\n\n.. image:: https://travis-ci.org/sdispater/pendulum.svg\n :alt: Pendulum Build status\n :target: https://travis-ci.org/sdispater/pendulum\n\nPython datetimes made easy.\n\nSupports Python **2.7** and **3.4+**.\n\n\n.. code-block:: python\n\n >>> import pendulum\n\n >>> now_in_paris = pendulum.now('Europe/Paris')\n >>> now_in_paris\n '2016-07-04T00:49:58.502116+02:00'\n\n # Seamless timezone switching\n >>> now_in_paris.in_timezone('UTC')\n '2016-07-03T22:49:58.502116+00:00'\n\n >>> tomorrow = pendulum.now().add(days=1)\n >>> last_week = pendulum.now().subtract(weeks=1)\n\n >>> past = pendulum.now().subtract(minutes=2)\n >>> past.diff_for_humans()\n >>> '2 minutes ago'\n\n >>> delta = past - last_week\n >>> delta.hours\n 23\n >>> delta.in_words(locale='en')\n '6 days 23 hours 58 minutes'\n\n # Proper handling of datetime normalization\n >>> pendulum.datetime(2013, 3, 31, 2, 30, tz='Europe/Paris')\n '2013-03-31T03:30:00+02:00' # 2:30 does not exist (Skipped time)\n\n # Proper handling of dst transitions\n >>> just_before = pendulum.datetime(2013, 3, 31, 1, 59, 59, 999999, tz='Europe/Paris')\n '2013-03-31T01:59:59.999999+01:00'\n >>> just_before.add(microseconds=1)\n '2013-03-31T03:00:00+02:00'\n\n\nWhy Pendulum?\n=============\n\nNative ``datetime`` instances are enough for basic cases but when you face more complex use-cases\nthey often show limitations and are not so intuitive to work with.\n``Pendulum`` provides a cleaner and more easy to use API while still relying on the standard library.\nSo it's still ``datetime`` but better.\n\nUnlike other datetime libraries for Python, Pendulum is a drop-in replacement\nfor the standard ``datetime`` class (it inherits from it), so, basically, you can replace all your ``datetime``\ninstances by ``DateTime`` instances in you code (exceptions exist for libraries that check\nthe type of the objects by using the ``type`` function like ``sqlite3`` or ``PyMySQL`` for instance).\n\nIt also removes the notion of naive datetimes: each ``Pendulum`` instance is timezone-aware\nand by default in ``UTC`` for ease of use.\n\nPendulum also improves the standard ``timedelta`` class by providing more intuitive methods and properties.\n\n\nWhy not Arrow?\n==============\n\nArrow is the most popular datetime library for Python right now, however its behavior\nand API can be erratic and unpredictable. The ``get()`` method can receive pretty much anything\nand it will try its best to return something while silently failing to handle some cases:\n\n.. code-block:: python\n\n arrow.get('2016-1-17')\n # <Arrow [2016-01-01T00:00:00+00:00]>\n\n pendulum.parse('2016-1-17')\n # <Pendulum [2016-01-17T00:00:00+00:00]>\n\n arrow.get('20160413')\n # <Arrow [1970-08-22T08:06:53+00:00]>\n\n pendulum.parse('20160413')\n # <Pendulum [2016-04-13T00:00:00+00:00]>\n\n arrow.get('2016-W07-5')\n # <Arrow [2016-01-01T00:00:00+00:00]>\n\n pendulum.parse('2016-W07-5')\n # <Pendulum [2016-02-19T00:00:00+00:00]>\n\n # Working with DST\n just_before = arrow.Arrow(2013, 3, 31, 1, 59, 59, 999999, 'Europe/Paris')\n just_after = just_before.replace(microseconds=1)\n '2013-03-31T02:00:00+02:00'\n # Should be 2013-03-31T03:00:00+02:00\n\n (just_after.to('utc') - just_before.to('utc')).total_seconds()\n -3599.999999\n # Should be 1e-06\n\n just_before = pendulum.datetime(2013, 3, 31, 1, 59, 59, 999999, 'Europe/Paris')\n just_after = just_before.add(microseconds=1)\n '2013-03-31T03:00:00+02:00'\n\n (just_after.in_timezone('utc') - just_before.in_timezone('utc')).total_seconds()\n 1e-06\n\nThose are a few examples showing that Arrow cannot always be trusted to have a consistent\nbehavior with the data you are passing to it.\n\n\nLimitations\n===========\n\nEven though the ``DateTime`` class is a subclass of ``datetime`` there are some rare cases where\nit can't replace the native class directly. Here is a list (non-exhaustive) of the reported cases with\na possible solution, if any:\n\n* ``sqlite3`` will use the ``type()`` function to determine the type of the object by default. To work around it you can register a new adapter:\n\n.. code-block:: python\n\n from pendulum import DateTime\n from sqlite3 import register_adapter\n\n register_adapter(DateTime, lambda val: val.isoformat(' '))\n\n* ``mysqlclient`` (former ``MySQLdb``) and ``PyMySQL`` will use the ``type()`` function to determine the type of the object by default. To work around it you can register a new adapter:\n\n.. code-block:: python\n\n import MySQLdb.converters\n import pymysql.converters\n\n from pendulum import DateTime\n\n MySQLdb.converters.conversions[DateTime] = MySQLdb.converters.DateTime2literal\n pymysql.converters.conversions[DateTime] = pymysql.converters.escape_datetime\n\n* ``django`` will use the ``isoformat()`` method to store datetimes in the database. However since ``pendulum`` is always timezone aware the offset information will always be returned by ``isoformat()`` raising an error, at least for MySQL databases. To work around it you can either create your own ``DateTimeField`` or use the previous workaround for ``MySQLdb``:\n\n.. code-block:: python\n\n from django.db.models import DateTimeField as BaseDateTimeField\n from pendulum import DateTime\n\n\n class DateTimeField(BaseDateTimeField):\n\n def value_to_string(self, obj):\n val = self.value_from_object(obj)\n\n if isinstance(value, DateTime):\n return value.to_datetime_string()\n\n return '' if val is None else val.isoformat()\n\n\nResources\n=========\n\n* `Official Website <https://pendulum.eustace.io>`_\n* `Documentation <https://pendulum.eustace.io/docs/>`_\n* `Issue Tracker <https://github.com/sdispater/pendulum/issues>`_\n\n\nContributing\n============\n\nContributions are welcome, especially with localization.\n\nGetting started\n---------------\n\nTo work on the Pendulum codebase, you'll want to clone the project locally\nand install the required depedendencies via `poetry <https://poetry.eustace.io>`_.\n\n.. code-block:: bash\n\n $ git clone git@github.com:sdispater/pendulum.git\n $ poetry install\n\nLocalization\n------------\n\nIf you want to help with localization, there are two different cases: the locale already exists\nor not.\n\nIf the locale does not exist you will need to create it by using the ``clock`` utility:\n\n.. code-block:: bash\n\n ./clock locale create <your-locale>\n\nIt will generate a directory in ``pendulum/locales`` named after your locale, with the following\nstructure:\n\n.. code-block:: text\n\n <your-locale>/\n - custom.py\n - locale.py\n\nThe ``locale.py`` file must not be modified. It contains the translations provided by\nthe CLDR database.\n\nThe ``custom.py`` file is the one you want to modify. It contains the data needed\nby Pendulum that are not provided by the CLDR database. You can take the `en <https://github.com/sdispater/pendulum/tree/master/pendulum/locales/en/custom.py>`_\ndata as a reference to see which data is needed.\n\nYou should also add tests for the created or modified locale.\n\n",
- "description_content_type": "text/x-rst",
- "keywords": [
- "datetime",
- "date",
- "time"
- ],
- "home_page": "https://pendulum.eustace.io",
- "author": "Sébastien Eustace",
- "author_email": "sebastien@eustace.io",
- "license": "MIT",
- "classifier": [
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11"
- ],
- "requires_dist": [
- "python-dateutil (>=2.6,<3.0)",
- "pytzdata (>=2020.1)",
- "typing (>=3.6,<4.0) ; python_version < \"3.5\""
- ],
- "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
- "project_url": [
- "Documentation, https://pendulum.eustace.io/docs",
- "Repository, https://github.com/sdispater/pendulum"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/05/b8/42ed91898d4784546c5f06c60506400548db3f7a4b3fb441cba4e5c17952/pluggy-1.3.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7",
- "hashes": {
- "sha256": "d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "pluggy",
- "version": "1.3.0",
- "platform": [
- "unix",
- "linux",
- "osx",
- "win32"
- ],
- "summary": "plugin and hook calling mechanisms for python",
- "description": "====================================================\npluggy - A minimalist production ready plugin system\n====================================================\n\n|pypi| |conda-forge| |versions| |github-actions| |gitter| |black| |codecov|\n\nThis is the core framework used by the `pytest`_, `tox`_, and `devpi`_ projects.\n\nPlease `read the docs`_ to learn more!\n\nA definitive example\n====================\n.. code-block:: python\n\n import pluggy\n\n hookspec = pluggy.HookspecMarker(\"myproject\")\n hookimpl = pluggy.HookimplMarker(\"myproject\")\n\n\n class MySpec:\n \"\"\"A hook specification namespace.\"\"\"\n\n @hookspec\n def myhook(self, arg1, arg2):\n \"\"\"My special little hook that you can customize.\"\"\"\n\n\n class Plugin_1:\n \"\"\"A hook implementation namespace.\"\"\"\n\n @hookimpl\n def myhook(self, arg1, arg2):\n print(\"inside Plugin_1.myhook()\")\n return arg1 + arg2\n\n\n class Plugin_2:\n \"\"\"A 2nd hook implementation namespace.\"\"\"\n\n @hookimpl\n def myhook(self, arg1, arg2):\n print(\"inside Plugin_2.myhook()\")\n return arg1 - arg2\n\n\n # create a manager and add the spec\n pm = pluggy.PluginManager(\"myproject\")\n pm.add_hookspecs(MySpec)\n\n # register plugins\n pm.register(Plugin_1())\n pm.register(Plugin_2())\n\n # call our ``myhook`` hook\n results = pm.hook.myhook(arg1=1, arg2=2)\n print(results)\n\n\nRunning this directly gets us::\n\n $ python docs/examples/toy-example.py\n inside Plugin_2.myhook()\n inside Plugin_1.myhook()\n [-1, 3]\n\n\n.. badges\n\n.. |pypi| image:: https://img.shields.io/pypi/v/pluggy.svg\n :target: https://pypi.org/pypi/pluggy\n\n.. |versions| image:: https://img.shields.io/pypi/pyversions/pluggy.svg\n :target: https://pypi.org/pypi/pluggy\n\n.. |github-actions| image:: https://github.com/pytest-dev/pluggy/workflows/main/badge.svg\n :target: https://github.com/pytest-dev/pluggy/actions\n\n.. |conda-forge| image:: https://img.shields.io/conda/vn/conda-forge/pluggy.svg\n :target: https://anaconda.org/conda-forge/pytest\n\n.. |gitter| image:: https://badges.gitter.im/pytest-dev/pluggy.svg\n :alt: Join the chat at https://gitter.im/pytest-dev/pluggy\n :target: https://gitter.im/pytest-dev/pluggy?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge\n\n.. |black| image:: https://img.shields.io/badge/code%20style-black-000000.svg\n :target: https://github.com/ambv/black\n\n.. |codecov| image:: https://codecov.io/gh/pytest-dev/pluggy/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/pytest-dev/pluggy\n :alt: Code coverage Status\n\n.. links\n.. _pytest:\n http://pytest.org\n.. _tox:\n https://tox.readthedocs.org\n.. _devpi:\n http://doc.devpi.net\n.. _read the docs:\n https://pluggy.readthedocs.io/en/latest/\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://github.com/pytest-dev/pluggy",
- "author": "Holger Krekel",
- "author_email": "holger@merlinux.eu",
- "license": "MIT",
- "classifier": [
- "Development Status :: 6 - Mature",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: POSIX",
- "Operating System :: Microsoft :: Windows",
- "Operating System :: MacOS :: MacOS X",
- "Topic :: Software Development :: Testing",
- "Topic :: Software Development :: Libraries",
- "Topic :: Utilities",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11"
- ],
- "requires_dist": [
- "pre-commit ; extra == 'dev'",
- "tox ; extra == 'dev'",
- "pytest ; extra == 'testing'",
- "pytest-benchmark ; extra == 'testing'"
- ],
- "requires_python": ">=3.8",
- "provides_extra": [
- "dev",
- "testing"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/f1/bd/e55e14cd213174100be0353824f2add41e8996c6f32081888897e8ec48b5/prison-0.2.1-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=f90bab63fca497aa0819a852f64fb21a4e181ed9f6114deaa5dc04001a7555c5",
- "hashes": {
- "sha256": "f90bab63fca497aa0819a852f64fb21a4e181ed9f6114deaa5dc04001a7555c5"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "prison",
- "version": "0.2.1",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "Rison encoder/decoder",
- "description": "UNKNOWN\n\n\n",
- "home_page": "https://github.com/betodealmeida/python-rison",
- "author": "Beto Dealmeida",
- "author_email": "beto@dealmeida.net",
- "license": "MIT",
- "classifier": [
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 2.6",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.3",
- "Programming Language :: Python :: 3.4",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy"
- ],
- "requires_dist": [
- "six",
- "nose ; extra == 'dev'",
- "pipreqs ; extra == 'dev'",
- "twine ; extra == 'dev'"
- ],
- "provides_extra": [
- "dev"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/c8/2c/03046cac73f46bfe98fc846ef629cf4f84c2f59258216aa2cc0d22bfca8f/protobuf-4.24.4-cp37-abi3-manylinux2014_x86_64.whl",
- "archive_info": {
- "hash": "sha256=b493cb590960ff863743b9ff1452c413c2ee12b782f48beca77c8da3e2ffe9d9",
- "hashes": {
- "sha256": "b493cb590960ff863743b9ff1452c413c2ee12b782f48beca77c8da3e2ffe9d9"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "protobuf",
- "version": "4.24.4",
- "description": "UNKNOWN\n",
- "home_page": "https://developers.google.com/protocol-buffers/",
- "author": "protobuf@googlegroups.com",
- "author_email": "protobuf@googlegroups.com",
- "license": "3-Clause BSD License",
- "classifier": [
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10"
- ],
- "requires_python": ">=3.7"
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/19/06/4e3fa3c1b79271e933c5ddbad3a48aa2c3d5f592a0fb7c037f3e0f619f4d/psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "archive_info": {
- "hash": "sha256=748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4",
- "hashes": {
- "sha256": "748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "psutil",
- "version": "5.9.6",
- "platform": [
- "Platform Independent"
- ],
- "summary": "Cross-platform lib for process and system monitoring in Python.",
- "description": "| |downloads| |stars| |forks| |contributors| |coverage|\n| |version| |py-versions| |packages| |license|\n| |github-actions-wheels| |github-actions-bsd| |appveyor| |doc| |twitter| |tidelift|\n\n.. |downloads| image:: https://img.shields.io/pypi/dm/psutil.svg\n :target: https://pepy.tech/project/psutil\n :alt: Downloads\n\n.. |stars| image:: https://img.shields.io/github/stars/giampaolo/psutil.svg\n :target: https://github.com/giampaolo/psutil/stargazers\n :alt: Github stars\n\n.. |forks| image:: https://img.shields.io/github/forks/giampaolo/psutil.svg\n :target: https://github.com/giampaolo/psutil/network/members\n :alt: Github forks\n\n.. |contributors| image:: https://img.shields.io/github/contributors/giampaolo/psutil.svg\n :target: https://github.com/giampaolo/psutil/graphs/contributors\n :alt: Contributors\n\n.. |github-actions-wheels| image:: https://img.shields.io/github/actions/workflow/status/giampaolo/psutil/.github/workflows/build.yml?label=Linux%2C%20macOS%2C%20Windows\n :target: https://github.com/giampaolo/psutil/actions?query=workflow%3Abuild\n :alt: Linux, macOS, Windows\n\n.. |github-actions-bsd| image:: https://img.shields.io/github/actions/workflow/status/giampaolo/psutil/.github/workflows/bsd.yml?label=FreeBSD,%20NetBSD,%20OpenBSD\n :target: https://github.com/giampaolo/psutil/actions?query=workflow%3Absd-tests\n :alt: FreeBSD, NetBSD, OpenBSD\n\n.. |appveyor| image:: https://img.shields.io/appveyor/build/giampaolo/psutil/master.svg?maxAge=3600&label=Windows%20(py2)\n :target: https://ci.appveyor.com/project/giampaolo/psutil\n :alt: Windows (Appveyor)\n\n.. |coverage| image:: https://coveralls.io/repos/github/giampaolo/psutil/badge.svg?branch=master\n :target: https://coveralls.io/github/giampaolo/psutil?branch=master\n :alt: Test coverage (coverall.io)\n\n.. |doc| image:: https://readthedocs.org/projects/psutil/badge/?version=latest\n :target: https://psutil.readthedocs.io/en/latest/\n :alt: Documentation Status\n\n.. |version| image:: https://img.shields.io/pypi/v/psutil.svg?label=pypi\n :target: https://pypi.org/project/psutil\n :alt: Latest version\n\n.. |py-versions| image:: https://img.shields.io/pypi/pyversions/psutil.svg\n :alt: Supported Python versions\n\n.. |packages| image:: https://repology.org/badge/tiny-repos/python:psutil.svg\n :target: https://repology.org/metapackage/python:psutil/versions\n :alt: Binary packages\n\n.. |license| image:: https://img.shields.io/pypi/l/psutil.svg\n :target: https://github.com/giampaolo/psutil/blob/master/LICENSE\n :alt: License\n\n.. |twitter| image:: https://img.shields.io/twitter/follow/grodola.svg?label=follow&style=flat&logo=twitter&logoColor=4FADFF\n :target: https://twitter.com/grodola\n :alt: Twitter Follow\n\n.. |tidelift| image:: https://tidelift.com/badges/github/giampaolo/psutil?style=flat\n :target: https://tidelift.com/subscription/pkg/pypi-psutil?utm_source=pypi-psutil&utm_medium=referral&utm_campaign=readme\n :alt: Tidelift\n\n-----\n\nQuick links\n===========\n\n- `Home page <https://github.com/giampaolo/psutil>`_\n- `Install <https://github.com/giampaolo/psutil/blob/master/INSTALL.rst>`_\n- `Documentation <http://psutil.readthedocs.io>`_\n- `Download <https://pypi.org/project/psutil/#files>`_\n- `Forum <http://groups.google.com/group/psutil/topics>`_\n- `StackOverflow <https://stackoverflow.com/questions/tagged/psutil>`_\n- `Blog <https://gmpy.dev/tags/psutil>`_\n- `What's new <https://github.com/giampaolo/psutil/blob/master/HISTORY.rst>`_\n\n\nSummary\n=======\n\npsutil (process and system utilities) is a cross-platform library for\nretrieving information on **running processes** and **system utilization**\n(CPU, memory, disks, network, sensors) in Python.\nIt is useful mainly for **system monitoring**, **profiling and limiting process\nresources** and **management of running processes**.\nIt implements many functionalities offered by classic UNIX command line tools\nsuch as *ps, top, iotop, lsof, netstat, ifconfig, free* and others.\npsutil currently supports the following platforms:\n\n- **Linux**\n- **Windows**\n- **macOS**\n- **FreeBSD, OpenBSD**, **NetBSD**\n- **Sun Solaris**\n- **AIX**\n\nSupported Python versions are **2.7**, **3.6+** and\n`PyPy <http://pypy.org/>`__.\n\nFunding\n=======\n\nWhile psutil is free software and will always be, the project would benefit\nimmensely from some funding.\nKeeping up with bug reports and maintenance has become hardly sustainable for\nme alone in terms of time.\nIf you're a company that's making significant use of psutil you can consider\nbecoming a sponsor via `GitHub Sponsors <https://github.com/sponsors/giampaolo>`__,\n`Open Collective <https://opencollective.com/psutil>`__ or\n`PayPal <https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A9ZS7PKKRM3S8>`__\nand have your logo displayed in here and psutil `doc <https://psutil.readthedocs.io>`__.\n\nSponsors\n========\n\n.. image:: https://github.com/giampaolo/psutil/raw/master/docs/_static/tidelift-logo.png\n :width: 200\n :alt: Alternative text\n\n`Add your logo <https://github.com/sponsors/giampaolo>`__.\n\nExample usages\n==============\n\nThis represents pretty much the whole psutil API.\n\nCPU\n---\n\n.. code-block:: python\n\n >>> import psutil\n >>>\n >>> psutil.cpu_times()\n scputimes(user=3961.46, nice=169.729, system=2150.659, idle=16900.540, iowait=629.59, irq=0.0, softirq=19.42, steal=0.0, guest=0, nice=0.0)\n >>>\n >>> for x in range(3):\n ... psutil.cpu_percent(interval=1)\n ...\n 4.0\n 5.9\n 3.8\n >>>\n >>> for x in range(3):\n ... psutil.cpu_percent(interval=1, percpu=True)\n ...\n [4.0, 6.9, 3.7, 9.2]\n [7.0, 8.5, 2.4, 2.1]\n [1.2, 9.0, 9.9, 7.2]\n >>>\n >>> for x in range(3):\n ... psutil.cpu_times_percent(interval=1, percpu=False)\n ...\n scputimes(user=1.5, nice=0.0, system=0.5, idle=96.5, iowait=1.5, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)\n scputimes(user=1.0, nice=0.0, system=0.0, idle=99.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)\n scputimes(user=2.0, nice=0.0, system=0.0, idle=98.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)\n >>>\n >>> psutil.cpu_count()\n 4\n >>> psutil.cpu_count(logical=False)\n 2\n >>>\n >>> psutil.cpu_stats()\n scpustats(ctx_switches=20455687, interrupts=6598984, soft_interrupts=2134212, syscalls=0)\n >>>\n >>> psutil.cpu_freq()\n scpufreq(current=931.42925, min=800.0, max=3500.0)\n >>>\n >>> psutil.getloadavg() # also on Windows (emulated)\n (3.14, 3.89, 4.67)\n\nMemory\n------\n\n.. code-block:: python\n\n >>> psutil.virtual_memory()\n svmem(total=10367352832, available=6472179712, percent=37.6, used=8186245120, free=2181107712, active=4748992512, inactive=2758115328, buffers=790724608, cached=3500347392, shared=787554304)\n >>> psutil.swap_memory()\n sswap(total=2097147904, used=296128512, free=1801019392, percent=14.1, sin=304193536, sout=677842944)\n >>>\n\nDisks\n-----\n\n.. code-block:: python\n\n >>> psutil.disk_partitions()\n [sdiskpart(device='/dev/sda1', mountpoint='/', fstype='ext4', opts='rw,nosuid', maxfile=255, maxpath=4096),\n sdiskpart(device='/dev/sda2', mountpoint='/home', fstype='ext', opts='rw', maxfile=255, maxpath=4096)]\n >>>\n >>> psutil.disk_usage('/')\n sdiskusage(total=21378641920, used=4809781248, free=15482871808, percent=22.5)\n >>>\n >>> psutil.disk_io_counters(perdisk=False)\n sdiskio(read_count=719566, write_count=1082197, read_bytes=18626220032, write_bytes=24081764352, read_time=5023392, write_time=63199568, read_merged_count=619166, write_merged_count=812396, busy_time=4523412)\n >>>\n\nNetwork\n-------\n\n.. code-block:: python\n\n >>> psutil.net_io_counters(pernic=True)\n {'eth0': netio(bytes_sent=485291293, bytes_recv=6004858642, packets_sent=3251564, packets_recv=4787798, errin=0, errout=0, dropin=0, dropout=0),\n 'lo': netio(bytes_sent=2838627, bytes_recv=2838627, packets_sent=30567, packets_recv=30567, errin=0, errout=0, dropin=0, dropout=0)}\n >>>\n >>> psutil.net_connections(kind='tcp')\n [sconn(fd=115, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED', pid=1254),\n sconn(fd=117, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING', pid=2987),\n ...]\n >>>\n >>> psutil.net_if_addrs()\n {'lo': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast='127.0.0.1', ptp=None),\n snicaddr(family=<AddressFamily.AF_INET6: 10>, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None),\n snicaddr(family=<AddressFamily.AF_LINK: 17>, address='00:00:00:00:00:00', netmask=None, broadcast='00:00:00:00:00:00', ptp=None)],\n 'wlan0': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.1.3', netmask='255.255.255.0', broadcast='192.168.1.255', ptp=None),\n snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::c685:8ff:fe45:641%wlan0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None),\n snicaddr(family=<AddressFamily.AF_LINK: 17>, address='c4:85:08:45:06:41', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}\n >>>\n >>> psutil.net_if_stats()\n {'lo': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=65536, flags='up,loopback,running'),\n 'wlan0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=100, mtu=1500, flags='up,broadcast,running,multicast')}\n >>>\n\nSensors\n-------\n\n.. code-block:: python\n\n >>> import psutil\n >>> psutil.sensors_temperatures()\n {'acpitz': [shwtemp(label='', current=47.0, high=103.0, critical=103.0)],\n 'asus': [shwtemp(label='', current=47.0, high=None, critical=None)],\n 'coretemp': [shwtemp(label='Physical id 0', current=52.0, high=100.0, critical=100.0),\n shwtemp(label='Core 0', current=45.0, high=100.0, critical=100.0)]}\n >>>\n >>> psutil.sensors_fans()\n {'asus': [sfan(label='cpu_fan', current=3200)]}\n >>>\n >>> psutil.sensors_battery()\n sbattery(percent=93, secsleft=16628, power_plugged=False)\n >>>\n\nOther system info\n-----------------\n\n.. code-block:: python\n\n >>> import psutil\n >>> psutil.users()\n [suser(name='giampaolo', terminal='pts/2', host='localhost', started=1340737536.0, pid=1352),\n suser(name='giampaolo', terminal='pts/3', host='localhost', started=1340737792.0, pid=1788)]\n >>>\n >>> psutil.boot_time()\n 1365519115.0\n >>>\n\nProcess management\n------------------\n\n.. code-block:: python\n\n >>> import psutil\n >>> psutil.pids()\n [1, 2, 3, 4, 5, 6, 7, 46, 48, 50, 51, 178, 182, 222, 223, 224, 268, 1215,\n 1216, 1220, 1221, 1243, 1244, 1301, 1601, 2237, 2355, 2637, 2774, 3932,\n 4176, 4177, 4185, 4187, 4189, 4225, 4243, 4245, 4263, 4282, 4306, 4311,\n 4312, 4313, 4314, 4337, 4339, 4357, 4358, 4363, 4383, 4395, 4408, 4433,\n 4443, 4445, 4446, 5167, 5234, 5235, 5252, 5318, 5424, 5644, 6987, 7054,\n 7055, 7071]\n >>>\n >>> p = psutil.Process(7055)\n >>> p\n psutil.Process(pid=7055, name='python3', status='running', started='09:04:44')\n >>> p.pid\n 7055\n >>> p.name()\n 'python3'\n >>> p.exe()\n '/usr/bin/python3'\n >>> p.cwd()\n '/home/giampaolo'\n >>> p.cmdline()\n ['/usr/bin/python3', 'main.py']\n >>>\n >>> p.ppid()\n 7054\n >>> p.parent()\n psutil.Process(pid=4699, name='bash', status='sleeping', started='09:06:44')\n >>> p.parents()\n [psutil.Process(pid=4699, name='bash', started='09:06:44'),\n psutil.Process(pid=4689, name='gnome-terminal-server', status='sleeping', started='0:06:44'),\n psutil.Process(pid=1, name='systemd', status='sleeping', started='05:56:55')]\n >>> p.children(recursive=True)\n [psutil.Process(pid=29835, name='python3', status='sleeping', started='11:45:38'),\n psutil.Process(pid=29836, name='python3', status='waking', started='11:43:39')]\n >>>\n >>> p.status()\n 'running'\n >>> p.create_time()\n 1267551141.5019531\n >>> p.terminal()\n '/dev/pts/0'\n >>>\n >>> p.username()\n 'giampaolo'\n >>> p.uids()\n puids(real=1000, effective=1000, saved=1000)\n >>> p.gids()\n pgids(real=1000, effective=1000, saved=1000)\n >>>\n >>> p.cpu_times()\n pcputimes(user=1.02, system=0.31, children_user=0.32, children_system=0.1, iowait=0.0)\n >>> p.cpu_percent(interval=1.0)\n 12.1\n >>> p.cpu_affinity()\n [0, 1, 2, 3]\n >>> p.cpu_affinity([0, 1]) # set\n >>> p.cpu_num()\n 1\n >>>\n >>> p.memory_info()\n pmem(rss=10915840, vms=67608576, shared=3313664, text=2310144, lib=0, data=7262208, dirty=0)\n >>> p.memory_full_info() # \"real\" USS memory usage (Linux, macOS, Win only)\n pfullmem(rss=10199040, vms=52133888, shared=3887104, text=2867200, lib=0, data=5967872, dirty=0, uss=6545408, pss=6872064, swap=0)\n >>> p.memory_percent()\n 0.7823\n >>> p.memory_maps()\n [pmmap_grouped(path='/lib/x8664-linux-gnu/libutil-2.15.so', rss=32768, size=2125824, pss=32768, shared_clean=0, shared_dirty=0, private_clean=20480, private_dirty=12288, referenced=32768, anonymous=12288, swap=0),\n pmmap_grouped(path='/lib/x8664-linux-gnu/libc-2.15.so', rss=3821568, size=3842048, pss=3821568, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=3821568, referenced=3575808, anonymous=3821568, swap=0),\n pmmap_grouped(path='[heap]', rss=32768, size=139264, pss=32768, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=32768, referenced=32768, anonymous=32768, swap=0),\n pmmap_grouped(path='[stack]', rss=2465792, size=2494464, pss=2465792, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=2465792, referenced=2277376, anonymous=2465792, swap=0),\n ...]\n >>>\n >>> p.io_counters()\n pio(read_count=478001, write_count=59371, read_bytes=700416, write_bytes=69632, read_chars=456232, write_chars=517543)\n >>>\n >>> p.open_files()\n [popenfile(path='/home/giampaolo/monit.py', fd=3, position=0, mode='r', flags=32768),\n popenfile(path='/var/log/monit.log', fd=4, position=235542, mode='a', flags=33793)]\n >>>\n >>> p.connections(kind='tcp')\n [pconn(fd=115, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED'),\n pconn(fd=117, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING')]\n >>>\n >>> p.threads()\n [pthread(id=5234, user_time=22.5, system_time=9.2891),\n pthread(id=5237, user_time=0.0707, system_time=1.1)]\n >>>\n >>> p.num_threads()\n 4\n >>> p.num_fds()\n 8\n >>> p.num_ctx_switches()\n pctxsw(voluntary=78, involuntary=19)\n >>>\n >>> p.nice()\n 0\n >>> p.nice(10) # set\n >>>\n >>> p.ionice(psutil.IOPRIO_CLASS_IDLE) # IO priority (Win and Linux only)\n >>> p.ionice()\n pionice(ioclass=<IOPriority.IOPRIO_CLASS_IDLE: 3>, value=0)\n >>>\n >>> p.rlimit(psutil.RLIMIT_NOFILE, (5, 5)) # set resource limits (Linux only)\n >>> p.rlimit(psutil.RLIMIT_NOFILE)\n (5, 5)\n >>>\n >>> p.environ()\n {'LC_PAPER': 'it_IT.UTF-8', 'SHELL': '/bin/bash', 'GREP_OPTIONS': '--color=auto',\n 'XDG_CONFIG_DIRS': '/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg',\n ...}\n >>>\n >>> p.as_dict()\n {'status': 'running', 'num_ctx_switches': pctxsw(voluntary=63, involuntary=1), 'pid': 5457, ...}\n >>> p.is_running()\n True\n >>> p.suspend()\n >>> p.resume()\n >>>\n >>> p.terminate()\n >>> p.kill()\n >>> p.wait(timeout=3)\n <Exitcode.EX_OK: 0>\n >>>\n >>> psutil.test()\n USER PID %CPU %MEM VSZ RSS TTY START TIME COMMAND\n root 1 0.0 0.0 24584 2240 Jun17 00:00 init\n root 2 0.0 0.0 0 0 Jun17 00:00 kthreadd\n ...\n giampaolo 31475 0.0 0.0 20760 3024 /dev/pts/0 Jun19 00:00 python2.4\n giampaolo 31721 0.0 2.2 773060 181896 00:04 10:30 chrome\n root 31763 0.0 0.0 0 0 00:05 00:00 kworker/0:1\n >>>\n\nFurther process APIs\n--------------------\n\n.. code-block:: python\n\n >>> import psutil\n >>> for proc in psutil.process_iter(['pid', 'name']):\n ... print(proc.info)\n ...\n {'pid': 1, 'name': 'systemd'}\n {'pid': 2, 'name': 'kthreadd'}\n {'pid': 3, 'name': 'ksoftirqd/0'}\n ...\n >>>\n >>> psutil.pid_exists(3)\n True\n >>>\n >>> def on_terminate(proc):\n ... print(\"process {} terminated\".format(proc))\n ...\n >>> # waits for multiple processes to terminate\n >>> gone, alive = psutil.wait_procs(procs_list, timeout=3, callback=on_terminate)\n >>>\n\nWindows services\n----------------\n\n.. code-block:: python\n\n >>> list(psutil.win_service_iter())\n [<WindowsService(name='AeLookupSvc', display_name='Application Experience') at 38850096>,\n <WindowsService(name='ALG', display_name='Application Layer Gateway Service') at 38850128>,\n <WindowsService(name='APNMCP', display_name='Ask Update Service') at 38850160>,\n <WindowsService(name='AppIDSvc', display_name='Application Identity') at 38850192>,\n ...]\n >>> s = psutil.win_service_get('alg')\n >>> s.as_dict()\n {'binpath': 'C:\\\\Windows\\\\System32\\\\alg.exe',\n 'description': 'Provides support for 3rd party protocol plug-ins for Internet Connection Sharing',\n 'display_name': 'Application Layer Gateway Service',\n 'name': 'alg',\n 'pid': None,\n 'start_type': 'manual',\n 'status': 'stopped',\n 'username': 'NT AUTHORITY\\\\LocalService'}\n\nProjects using psutil\n=====================\n\nHere's some I find particularly interesting:\n\n- https://github.com/google/grr\n- https://github.com/facebook/osquery/\n- https://github.com/nicolargo/glances\n- https://github.com/aristocratos/bpytop\n- https://github.com/Jahaja/psdash\n- https://github.com/ajenti/ajenti\n- https://github.com/home-assistant/home-assistant/\n\nPortings\n========\n\n- Go: https://github.com/shirou/gopsutil\n- C: https://github.com/hamon-in/cpslib\n- Rust: https://github.com/rust-psutil/rust-psutil\n- Nim: https://github.com/johnscillieri/psutil-nim\n\n\n\n",
- "description_content_type": "text/x-rst",
- "keywords": [
- "ps",
- "top",
- "kill",
- "free",
- "lsof",
- "netstat",
- "nice",
- "tty",
- "ionice",
- "uptime",
- "taskmgr",
- "process",
- "df",
- "iotop",
- "iostat",
- "ifconfig",
- "taskset",
- "who",
- "pidof",
- "pmap",
- "smem",
- "pstree",
- "monitoring",
- "ulimit",
- "prlimit",
- "smem",
- "performance",
- "metrics",
- "agent",
- "observability"
- ],
- "home_page": "https://github.com/giampaolo/psutil",
- "author": "Giampaolo Rodola",
- "author_email": "g.rodola@gmail.com",
- "license": "BSD-3-Clause",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Console",
- "Environment :: Win32 (MS Windows)",
- "Intended Audience :: Developers",
- "Intended Audience :: Information Technology",
- "Intended Audience :: System Administrators",
- "License :: OSI Approved :: BSD License",
- "Operating System :: MacOS :: MacOS X",
- "Operating System :: Microsoft :: Windows :: Windows 10",
- "Operating System :: Microsoft :: Windows :: Windows 7",
- "Operating System :: Microsoft :: Windows :: Windows 8",
- "Operating System :: Microsoft :: Windows :: Windows 8.1",
- "Operating System :: Microsoft :: Windows :: Windows Server 2003",
- "Operating System :: Microsoft :: Windows :: Windows Server 2008",
- "Operating System :: Microsoft :: Windows :: Windows Vista",
- "Operating System :: Microsoft",
- "Operating System :: OS Independent",
- "Operating System :: POSIX :: AIX",
- "Operating System :: POSIX :: BSD :: FreeBSD",
- "Operating System :: POSIX :: BSD :: NetBSD",
- "Operating System :: POSIX :: BSD :: OpenBSD",
- "Operating System :: POSIX :: BSD",
- "Operating System :: POSIX :: Linux",
- "Operating System :: POSIX :: SunOS/Solaris",
- "Operating System :: POSIX",
- "Programming Language :: C",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Programming Language :: Python",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "Topic :: Software Development :: Libraries",
- "Topic :: System :: Benchmark",
- "Topic :: System :: Hardware :: Hardware Drivers",
- "Topic :: System :: Hardware",
- "Topic :: System :: Monitoring",
- "Topic :: System :: Networking :: Monitoring :: Hardware Watchdog",
- "Topic :: System :: Networking :: Monitoring",
- "Topic :: System :: Networking",
- "Topic :: System :: Operating System",
- "Topic :: System :: Systems Administration",
- "Topic :: Utilities"
- ],
- "requires_dist": [
- "ipaddress ; (python_version < \"3.0\") and extra == 'test'",
- "mock ; (python_version < \"3.0\") and extra == 'test'",
- "enum34 ; (python_version <= \"3.4\") and extra == 'test'",
- "pywin32 ; (sys_platform == \"win32\") and extra == 'test'",
- "wmi ; (sys_platform == \"win32\") and extra == 'test'"
- ],
- "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*",
- "provides_extra": [
- "test"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/62/d5/5f610ebe421e85889f2e55e33b7f9a6795bd982198517d912eb1c76e1a53/pycparser-2.21-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9",
- "hashes": {
- "sha256": "8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "pycparser",
- "version": "2.21",
- "platform": [
- "Cross Platform"
- ],
- "summary": "C parser in Python",
- "description": "\npycparser is a complete parser of the C language, written in\npure Python using the PLY parsing library.\nIt parses C code into an AST and can serve as a front-end for\nC compilers or analysis tools.\n\n\n",
- "home_page": "https://github.com/eliben/pycparser",
- "author": "Eli Bendersky",
- "author_email": "eliben@gmail.com",
- "maintainer": "Eli Bendersky",
- "license": "BSD",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "License :: OSI Approved :: BSD License",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.4",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10"
- ],
- "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/73/66/0a72c9fcde42e5650c8d8d5c5c1873b9a3893018020c77ca8eb62708b923/pydantic-2.4.2-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=bc3ddf669d234f4220e6e1c4d96b061abe0998185a8d7855c0126782b7abc8c1",
- "hashes": {
- "sha256": "bc3ddf669d234f4220e6e1c4d96b061abe0998185a8d7855c0126782b7abc8c1"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "pydantic",
- "version": "2.4.2",
- "summary": "Data validation using Python type hints",
- "description": "# Pydantic\n\n[](https://github.com/pydantic/pydantic/actions?query=event%3Apush+branch%3Amain+workflow%3ACI)\n[](https://coverage-badge.samuelcolvin.workers.dev/redirect/pydantic/pydantic)\n[](https://pypi.python.org/pypi/pydantic)\n[](https://anaconda.org/conda-forge/pydantic)\n[](https://pepy.tech/project/pydantic)\n[](https://github.com/pydantic/pydantic)\n[](https://github.com/pydantic/pydantic/blob/main/LICENSE)\n[](https://docs.pydantic.dev/latest/contributing/#badges)\n\nData validation using Python type hints.\n\nFast and extensible, Pydantic plays nicely with your linters/IDE/brain.\nDefine how data should be in pure, canonical Python 3.7+; validate it with Pydantic.\n\n## Pydantic Company :rocket:\n\nWe've started a company based on the principles that I believe have led to Pydantic's success.\nLearning more from the [Company Announcement](https://pydantic.dev/announcement/).\n\n## Pydantic V1.10 vs. V2\n\nPydantic V2 is a ground-up rewrite that offers many new features, performance improvements, and some breaking changes compared to Pydantic V1.\n\nIf you're using Pydantic V1 you may want to look at the\n[pydantic V1.10 Documentation](https://docs.pydantic.dev/) or,\n[`1.10.X-fixes` git branch](https://github.com/pydantic/pydantic/tree/1.10.X-fixes). Pydantic V2 also ships with the latest version of Pydantic V1 built in so that you can incrementally upgrade your code base and projects: `from pydantic import v1 as pydantic_v1`.\n\n## Help\n\nSee [documentation](https://docs.pydantic.dev/) for more details.\n\n## Installation\n\nInstall using `pip install -U pydantic` or `conda install pydantic -c conda-forge`.\nFor more installation options to make Pydantic even faster,\nsee the [Install](https://docs.pydantic.dev/install/) section in the documentation.\n\n## A Simple Example\n\n```py\nfrom datetime import datetime\nfrom typing import List, Optional\nfrom pydantic import BaseModel\n\nclass User(BaseModel):\n id: int\n name: str = 'John Doe'\n signup_ts: Optional[datetime] = None\n friends: List[int] = []\n\nexternal_data = {'id': '123', 'signup_ts': '2017-06-01 12:22', 'friends': [1, '2', b'3']}\nuser = User(**external_data)\nprint(user)\n#> User id=123 name='John Doe' signup_ts=datetime.datetime(2017, 6, 1, 12, 22) friends=[1, 2, 3]\nprint(user.id)\n#> 123\n```\n\n## Contributing\n\nFor guidance on setting up a development environment and how to make a\ncontribution to Pydantic, see\n[Contributing to Pydantic](https://docs.pydantic.dev/contributing/).\n\n## Reporting a Security Vulnerability\n\nSee our [security policy](https://github.com/pydantic/pydantic/security/policy).\n\n## Changelog\n\n## v2.4.2 (2023-09-27)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.4.2)\n\n### What's Changed\n\n#### Fixes\n\n* Fix bug with JSON schema for sequence of discriminated union by [@dmontagu](https://github.com/dmontagu) in [#7647](https://github.com/pydantic/pydantic/pull/7647)\n* Fix schema references in discriminated unions by [@adriangb](https://github.com/adriangb) in [#7646](https://github.com/pydantic/pydantic/pull/7646)\n* Fix json schema generation for recursive models by [@adriangb](https://github.com/adriangb) in [#7653](https://github.com/pydantic/pydantic/pull/7653)\n* Fix `models_json_schema` for generic models by [@adriangb](https://github.com/adriangb) in [#7654](https://github.com/pydantic/pydantic/pull/7654)\n* Fix xfailed test for generic model signatures by [@adriangb](https://github.com/adriangb) in [#7658](https://github.com/pydantic/pydantic/pull/7658)\n\n### New Contributors\n\n* [@austinorr](https://github.com/austinorr) made their first contribution in [#7657](https://github.com/pydantic/pydantic/pull/7657)\n* [@peterHoburg](https://github.com/peterHoburg) made their first contribution in [#7670](https://github.com/pydantic/pydantic/pull/7670)\n\n## v2.4.1 (2023-09-26)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.4.1)\n\n### What's Changed\n\n#### Packaging\n\n* Update pydantic-core to 2.10.1 by [@davidhewitt](https://github.com/davidhewitt) in [#7633](https://github.com/pydantic/pydantic/pull/7633)\n\n#### Fixes\n\n* Serialize unsubstituted type vars as `Any` by [@adriangb](https://github.com/adriangb) in [#7606](https://github.com/pydantic/pydantic/pull/7606)\n* Remove schema building caches by [@adriangb](https://github.com/adriangb) in [#7624](https://github.com/pydantic/pydantic/pull/7624)\n* Fix an issue where JSON schema extras weren't JSON encoded by [@dmontagu](https://github.com/dmontagu) in [#7625](https://github.com/pydantic/pydantic/pull/7625)\n\n## v2.4.0 (2023-09-22)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.4.0)\n\n### What's Changed\n\n#### Packaging\n\n* Update pydantic-core to 2.10.0 by [@samuelcolvin](https://github.com/samuelcolvin) in [#7542](https://github.com/pydantic/pydantic/pull/7542)\n\n#### New Features\n\n* Add `Base64Url` types by [@dmontagu](https://github.com/dmontagu) in [#7286](https://github.com/pydantic/pydantic/pull/7286)\n* Implement optional `number` to `str` coercion by [@lig](https://github.com/lig) in [#7508](https://github.com/pydantic/pydantic/pull/7508)\n* Allow access to `field_name` and `data` in all validators if there is data and a field name by [@samuelcolvin](https://github.com/samuelcolvin) in [#7542](https://github.com/pydantic/pydantic/pull/7542)\n* Add `BaseModel.model_validate_strings` and `TypeAdapter.validate_strings` by [@hramezani](https://github.com/hramezani) in [#7552](https://github.com/pydantic/pydantic/pull/7552)\n* Add Pydantic `plugins` experimental implementation by [@lig](https://github.com/lig) [@samuelcolvin](https://github.com/samuelcolvin) and [@Kludex](https://github.com/Kludex) in [#6820](https://github.com/pydantic/pydantic/pull/6820)\n\n#### Changes\n\n* Do not override `model_post_init` in subclass with private attrs by [@Viicos](https://github.com/Viicos) in [#7302](https://github.com/pydantic/pydantic/pull/7302)\n* Make fields with defaults not required in the serialization schema by default by [@dmontagu](https://github.com/dmontagu) in [#7275](https://github.com/pydantic/pydantic/pull/7275)\n* Mark `Extra` as deprecated by [@disrupted](https://github.com/disrupted) in [#7299](https://github.com/pydantic/pydantic/pull/7299)\n* Make `EncodedStr` a dataclass by [@Kludex](https://github.com/Kludex) in [#7396](https://github.com/pydantic/pydantic/pull/7396)\n* Move `annotated_handlers` to be public by [@samuelcolvin](https://github.com/samuelcolvin) in [#7569](https://github.com/pydantic/pydantic/pull/7569)\n\n#### Performance\n\n* Simplify flattening and inlining of `CoreSchema` by [@adriangb](https://github.com/adriangb) in [#7523](https://github.com/pydantic/pydantic/pull/7523)\n* Remove unused copies in `CoreSchema` walking by [@adriangb](https://github.com/adriangb) in [#7528](https://github.com/pydantic/pydantic/pull/7528)\n* Add caches for collecting definitions and invalid schemas from a CoreSchema by [@adriangb](https://github.com/adriangb) in [#7527](https://github.com/pydantic/pydantic/pull/7527)\n* Eagerly resolve discriminated unions and cache cases where we can't by [@adriangb](https://github.com/adriangb) in [#7529](https://github.com/pydantic/pydantic/pull/7529)\n* Replace `dict.get` and `dict.setdefault` with more verbose versions in `CoreSchema` building hot paths by [@adriangb](https://github.com/adriangb) in [#7536](https://github.com/pydantic/pydantic/pull/7536)\n* Cache invalid `CoreSchema` discovery by [@adriangb](https://github.com/adriangb) in [#7535](https://github.com/pydantic/pydantic/pull/7535)\n* Allow disabling `CoreSchema` validation for faster startup times by [@adriangb](https://github.com/adriangb) in [#7565](https://github.com/pydantic/pydantic/pull/7565)\n\n#### Fixes\n\n* Fix config detection for `TypedDict` from grandparent classes by [@dmontagu](https://github.com/dmontagu) in [#7272](https://github.com/pydantic/pydantic/pull/7272)\n* Fix hash function generation for frozen models with unusual MRO by [@dmontagu](https://github.com/dmontagu) in [#7274](https://github.com/pydantic/pydantic/pull/7274)\n* Make `strict` config overridable in field for Path by [@hramezani](https://github.com/hramezani) in [#7281](https://github.com/pydantic/pydantic/pull/7281)\n* Use `ser_json_<timedelta|bytes>` on default in `GenerateJsonSchema` by [@Kludex](https://github.com/Kludex) in [#7269](https://github.com/pydantic/pydantic/pull/7269)\n* Adding a check that alias is validated as an identifier for Python by [@andree0](https://github.com/andree0) in [#7319](https://github.com/pydantic/pydantic/pull/7319)\n* Raise an error when computed field overrides field by [@sydney-runkle](https://github.com/sydney-runkle) in [#7346](https://github.com/pydantic/pydantic/pull/7346)\n* Fix applying `SkipValidation` to referenced schemas by [@adriangb](https://github.com/adriangb) in [#7381](https://github.com/pydantic/pydantic/pull/7381)\n* Enforce behavior of private attributes having double leading underscore by [@lig](https://github.com/lig) in [#7265](https://github.com/pydantic/pydantic/pull/7265)\n* Standardize `__get_pydantic_core_schema__` signature by [@hramezani](https://github.com/hramezani) in [#7415](https://github.com/pydantic/pydantic/pull/7415)\n* Fix generic dataclass fields mutation bug (when using `TypeAdapter`) by [@sydney-runkle](https://github.com/sydney-runkle) in [#7435](https://github.com/pydantic/pydantic/pull/7435)\n* Fix `TypeError` on `model_validator` in `wrap` mode by [@pmmmwh](https://github.com/pmmmwh) in [#7496](https://github.com/pydantic/pydantic/pull/7496)\n* Improve enum error message by [@hramezani](https://github.com/hramezani) in [#7506](https://github.com/pydantic/pydantic/pull/7506)\n* Make `repr` work for instances that failed initialization when handling `ValidationError`s by [@dmontagu](https://github.com/dmontagu) in [#7439](https://github.com/pydantic/pydantic/pull/7439)\n* Fixed a regular expression denial of service issue by limiting whitespaces by [@prodigysml](https://github.com/prodigysml) in [#7360](https://github.com/pydantic/pydantic/pull/7360)\n* Fix handling of `UUID` values having `UUID.version=None` by [@lig](https://github.com/lig) in [#7566](https://github.com/pydantic/pydantic/pull/7566)\n* Fix `__iter__` returning private `cached_property` info by [@sydney-runkle](https://github.com/sydney-runkle) in [#7570](https://github.com/pydantic/pydantic/pull/7570)\n* Improvements to version info message by [@samuelcolvin](https://github.com/samuelcolvin) in [#7594](https://github.com/pydantic/pydantic/pull/7594)\n\n### New Contributors\n* [@15498th](https://github.com/15498th) made their first contribution in [#7238](https://github.com/pydantic/pydantic/pull/7238)\n* [@GabrielCappelli](https://github.com/GabrielCappelli) made their first contribution in [#7213](https://github.com/pydantic/pydantic/pull/7213)\n* [@tobni](https://github.com/tobni) made their first contribution in [#7184](https://github.com/pydantic/pydantic/pull/7184)\n* [@redruin1](https://github.com/redruin1) made their first contribution in [#7282](https://github.com/pydantic/pydantic/pull/7282)\n* [@FacerAin](https://github.com/FacerAin) made their first contribution in [#7288](https://github.com/pydantic/pydantic/pull/7288)\n* [@acdha](https://github.com/acdha) made their first contribution in [#7297](https://github.com/pydantic/pydantic/pull/7297)\n* [@andree0](https://github.com/andree0) made their first contribution in [#7319](https://github.com/pydantic/pydantic/pull/7319)\n* [@gordonhart](https://github.com/gordonhart) made their first contribution in [#7375](https://github.com/pydantic/pydantic/pull/7375)\n* [@pmmmwh](https://github.com/pmmmwh) made their first contribution in [#7496](https://github.com/pydantic/pydantic/pull/7496)\n* [@disrupted](https://github.com/disrupted) made their first contribution in [#7299](https://github.com/pydantic/pydantic/pull/7299)\n* [@prodigysml](https://github.com/prodigysml) made their first contribution in [#7360](https://github.com/pydantic/pydantic/pull/7360)\n\n## v2.3.0 (2023-08-23)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.3.0)\n\n* 🔥 Remove orphaned changes file from repo by [@lig](https://github.com/lig) in [#7168](https://github.com/pydantic/pydantic/pull/7168)\n* Add copy button on documentation by [@Kludex](https://github.com/Kludex) in [#7190](https://github.com/pydantic/pydantic/pull/7190)\n* Fix docs on JSON type by [@Kludex](https://github.com/Kludex) in [#7189](https://github.com/pydantic/pydantic/pull/7189)\n* Update mypy 1.5.0 to 1.5.1 in CI by [@hramezani](https://github.com/hramezani) in [#7191](https://github.com/pydantic/pydantic/pull/7191)\n* fix download links badge by [@samuelcolvin](https://github.com/samuelcolvin) in [#7200](https://github.com/pydantic/pydantic/pull/7200)\n* add 2.2.1 to changelog by [@samuelcolvin](https://github.com/samuelcolvin) in [#7212](https://github.com/pydantic/pydantic/pull/7212)\n* Make ModelWrapValidator protocols generic by [@dmontagu](https://github.com/dmontagu) in [#7154](https://github.com/pydantic/pydantic/pull/7154)\n* Correct `Field(..., exclude: bool)` docs by [@samuelcolvin](https://github.com/samuelcolvin) in [#7214](https://github.com/pydantic/pydantic/pull/7214)\n* Make shadowing attributes a warning instead of an error by [@adriangb](https://github.com/adriangb) in [#7193](https://github.com/pydantic/pydantic/pull/7193)\n* Document `Base64Str` and `Base64Bytes` by [@Kludex](https://github.com/Kludex) in [#7192](https://github.com/pydantic/pydantic/pull/7192)\n* Fix `config.defer_build` for serialization first cases by [@samuelcolvin](https://github.com/samuelcolvin) in [#7024](https://github.com/pydantic/pydantic/pull/7024)\n* clean Model docstrings in JSON Schema by [@samuelcolvin](https://github.com/samuelcolvin) in [#7210](https://github.com/pydantic/pydantic/pull/7210)\n* fix [#7228](https://github.com/pydantic/pydantic/pull/7228) (typo): docs in `validators.md` to correct `validate_default` kwarg by [@lmmx](https://github.com/lmmx) in [#7229](https://github.com/pydantic/pydantic/pull/7229)\n* ✅ Implement `tzinfo.fromutc` method for `TzInfo` in `pydantic-core` by [@lig](https://github.com/lig) in [#7019](https://github.com/pydantic/pydantic/pull/7019)\n* Support `__get_validators__` by [@hramezani](https://github.com/hramezani) in [#7197](https://github.com/pydantic/pydantic/pull/7197)\n\n## v2.2.1 (2023-08-18)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.2.1)\n\n* Make `xfail`ing test for root model extra stop `xfail`ing by [@dmontagu](https://github.com/dmontagu) in [#6937](https://github.com/pydantic/pydantic/pull/6937)\n* Optimize recursion detection by stopping on the second visit for the same object by [@mciucu](https://github.com/mciucu) in [#7160](https://github.com/pydantic/pydantic/pull/7160)\n* fix link in docs by [@tlambert03](https://github.com/tlambert03) in [#7166](https://github.com/pydantic/pydantic/pull/7166)\n* Replace MiMalloc w/ default allocator by [@adriangb](https://github.com/adriangb) in [pydantic/pydantic-core#900](https://github.com/pydantic/pydantic-core/pull/900)\n* Bump pydantic-core to 2.6.1 and prepare 2.2.1 release by [@adriangb](https://github.com/adriangb) in [#7176](https://github.com/pydantic/pydantic/pull/7176)\n\n## v2.2.0 (2023-08-17)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.2.0)\n\n* Split \"pipx install\" setup command into two commands on the documentation site by [@nomadmtb](https://github.com/nomadmtb) in [#6869](https://github.com/pydantic/pydantic/pull/6869)\n* Deprecate `Field.include` by [@hramezani](https://github.com/hramezani) in [#6852](https://github.com/pydantic/pydantic/pull/6852)\n* Fix typo in default factory error msg by [@hramezani](https://github.com/hramezani) in [#6880](https://github.com/pydantic/pydantic/pull/6880)\n* Simplify handling of typing.Annotated in GenerateSchema by [@dmontagu](https://github.com/dmontagu) in [#6887](https://github.com/pydantic/pydantic/pull/6887)\n* Re-enable fastapi tests in CI by [@dmontagu](https://github.com/dmontagu) in [#6883](https://github.com/pydantic/pydantic/pull/6883)\n* Make it harder to hit collisions with json schema defrefs by [@dmontagu](https://github.com/dmontagu) in [#6566](https://github.com/pydantic/pydantic/pull/6566)\n* Cleaner error for invalid input to `Path` fields by [@samuelcolvin](https://github.com/samuelcolvin) in [#6903](https://github.com/pydantic/pydantic/pull/6903)\n* :memo: support Coordinate Type by [@yezz123](https://github.com/yezz123) in [#6906](https://github.com/pydantic/pydantic/pull/6906)\n* Fix `ForwardRef` wrapper for py 3.10.0 (shim until bpo-45166) by [@randomir](https://github.com/randomir) in [#6919](https://github.com/pydantic/pydantic/pull/6919)\n* Fix misbehavior related to copying of RootModel by [@dmontagu](https://github.com/dmontagu) in [#6918](https://github.com/pydantic/pydantic/pull/6918)\n* Fix issue with recursion error caused by ParamSpec by [@dmontagu](https://github.com/dmontagu) in [#6923](https://github.com/pydantic/pydantic/pull/6923)\n* Add section about Constrained classes to the Migration Guide by [@Kludex](https://github.com/Kludex) in [#6924](https://github.com/pydantic/pydantic/pull/6924)\n* Use `main` branch for badge links by [@Viicos](https://github.com/Viicos) in [#6925](https://github.com/pydantic/pydantic/pull/6925)\n* Add test for v1/v2 Annotated discrepancy by [@carlbordum](https://github.com/carlbordum) in [#6926](https://github.com/pydantic/pydantic/pull/6926)\n* Make the v1 mypy plugin work with both v1 and v2 by [@dmontagu](https://github.com/dmontagu) in [#6921](https://github.com/pydantic/pydantic/pull/6921)\n* Fix issue where generic models couldn't be parametrized with BaseModel by [@dmontagu](https://github.com/dmontagu) in [#6933](https://github.com/pydantic/pydantic/pull/6933)\n* Remove xfail for discriminated union with alias by [@dmontagu](https://github.com/dmontagu) in [#6938](https://github.com/pydantic/pydantic/pull/6938)\n* add field_serializer to computed_field by [@andresliszt](https://github.com/andresliszt) in [#6965](https://github.com/pydantic/pydantic/pull/6965)\n* Use union_schema with Type[Union[...]] by [@JeanArhancet](https://github.com/JeanArhancet) in [#6952](https://github.com/pydantic/pydantic/pull/6952)\n* Fix inherited typeddict attributes / config by [@adriangb](https://github.com/adriangb) in [#6981](https://github.com/pydantic/pydantic/pull/6981)\n* fix dataclass annotated before validator called twice by [@davidhewitt](https://github.com/davidhewitt) in [#6998](https://github.com/pydantic/pydantic/pull/6998)\n* Update test-fastapi deselected tests by [@hramezani](https://github.com/hramezani) in [#7014](https://github.com/pydantic/pydantic/pull/7014)\n* Fix validator doc format by [@hramezani](https://github.com/hramezani) in [#7015](https://github.com/pydantic/pydantic/pull/7015)\n* Fix typo in docstring of model_json_schema by [@AdamVinch-Federated](https://github.com/AdamVinch-Federated) in [#7032](https://github.com/pydantic/pydantic/pull/7032)\n* remove unused \"type ignores\" with pyright by [@samuelcolvin](https://github.com/samuelcolvin) in [#7026](https://github.com/pydantic/pydantic/pull/7026)\n* Add benchmark representing FastAPI startup time by [@adriangb](https://github.com/adriangb) in [#7030](https://github.com/pydantic/pydantic/pull/7030)\n* Fix json_encoders for Enum subclasses by [@adriangb](https://github.com/adriangb) in [#7029](https://github.com/pydantic/pydantic/pull/7029)\n* Update docstring of `ser_json_bytes` regarding base64 encoding by [@Viicos](https://github.com/Viicos) in [#7052](https://github.com/pydantic/pydantic/pull/7052)\n* Allow `@validate_call` to work on async methods by [@adriangb](https://github.com/adriangb) in [#7046](https://github.com/pydantic/pydantic/pull/7046)\n* Fix: mypy error with `Settings` and `SettingsConfigDict` by [@JeanArhancet](https://github.com/JeanArhancet) in [#7002](https://github.com/pydantic/pydantic/pull/7002)\n* Fix some typos (repeated words and it's/its) by [@eumiro](https://github.com/eumiro) in [#7063](https://github.com/pydantic/pydantic/pull/7063)\n* Fix the typo in docstring by [@harunyasar](https://github.com/harunyasar) in [#7062](https://github.com/pydantic/pydantic/pull/7062)\n* Docs: Fix broken URL in the pydantic-settings package recommendation by [@swetjen](https://github.com/swetjen) in [#6995](https://github.com/pydantic/pydantic/pull/6995)\n* Handle constraints being applied to schemas that don't accept it by [@adriangb](https://github.com/adriangb) in [#6951](https://github.com/pydantic/pydantic/pull/6951)\n* Replace almost_equal_floats with math.isclose by [@eumiro](https://github.com/eumiro) in [#7082](https://github.com/pydantic/pydantic/pull/7082)\n* bump pydantic-core to 2.5.0 by [@davidhewitt](https://github.com/davidhewitt) in [#7077](https://github.com/pydantic/pydantic/pull/7077)\n* Add `short_version` and use it in links by [@hramezani](https://github.com/hramezani) in [#7115](https://github.com/pydantic/pydantic/pull/7115)\n* 📝 Add usage link to `RootModel` by [@Kludex](https://github.com/Kludex) in [#7113](https://github.com/pydantic/pydantic/pull/7113)\n* Revert \"Fix default port for mongosrv DSNs (#6827)\" by [@Kludex](https://github.com/Kludex) in [#7116](https://github.com/pydantic/pydantic/pull/7116)\n* Clarify validate_default and _Unset handling in usage docs and migration guide by [@benbenbang](https://github.com/benbenbang) in [#6950](https://github.com/pydantic/pydantic/pull/6950)\n* Tweak documentation of `Field.exclude` by [@Viicos](https://github.com/Viicos) in [#7086](https://github.com/pydantic/pydantic/pull/7086)\n* Do not require `validate_assignment` to use `Field.frozen` by [@Viicos](https://github.com/Viicos) in [#7103](https://github.com/pydantic/pydantic/pull/7103)\n* tweaks to `_core_utils` by [@samuelcolvin](https://github.com/samuelcolvin) in [#7040](https://github.com/pydantic/pydantic/pull/7040)\n* Make DefaultDict working with set by [@hramezani](https://github.com/hramezani) in [#7126](https://github.com/pydantic/pydantic/pull/7126)\n* Don't always require typing.Generic as a base for partially parametrized models by [@dmontagu](https://github.com/dmontagu) in [#7119](https://github.com/pydantic/pydantic/pull/7119)\n* Fix issue with JSON schema incorrectly using parent class core schema by [@dmontagu](https://github.com/dmontagu) in [#7020](https://github.com/pydantic/pydantic/pull/7020)\n* Fix xfailed test related to TypedDict and alias_generator by [@dmontagu](https://github.com/dmontagu) in [#6940](https://github.com/pydantic/pydantic/pull/6940)\n* Improve error message for NameEmail by [@dmontagu](https://github.com/dmontagu) in [#6939](https://github.com/pydantic/pydantic/pull/6939)\n* Fix generic computed fields by [@dmontagu](https://github.com/dmontagu) in [#6988](https://github.com/pydantic/pydantic/pull/6988)\n* Reflect namedtuple default values during validation by [@dmontagu](https://github.com/dmontagu) in [#7144](https://github.com/pydantic/pydantic/pull/7144)\n* Update dependencies, fix pydantic-core usage, fix CI issues by [@dmontagu](https://github.com/dmontagu) in [#7150](https://github.com/pydantic/pydantic/pull/7150)\n* Add mypy 1.5.0 by [@hramezani](https://github.com/hramezani) in [#7118](https://github.com/pydantic/pydantic/pull/7118)\n* Handle non-json native enum values by [@adriangb](https://github.com/adriangb) in [#7056](https://github.com/pydantic/pydantic/pull/7056)\n* document `round_trip` in Json type documentation by [@jc-louis](https://github.com/jc-louis) in [#7137](https://github.com/pydantic/pydantic/pull/7137)\n* Relax signature checks to better support builtins and C extension functions as validators by [@adriangb](https://github.com/adriangb) in [#7101](https://github.com/pydantic/pydantic/pull/7101)\n* add union_mode='left_to_right' by [@davidhewitt](https://github.com/davidhewitt) in [#7151](https://github.com/pydantic/pydantic/pull/7151)\n* Include an error message hint for inherited ordering by [@yvalencia91](https://github.com/yvalencia91) in [#7124](https://github.com/pydantic/pydantic/pull/7124)\n* Fix one docs link and resolve some warnings for two others by [@dmontagu](https://github.com/dmontagu) in [#7153](https://github.com/pydantic/pydantic/pull/7153)\n* Include Field extra keys name in warning by [@hramezani](https://github.com/hramezani) in [#7136](https://github.com/pydantic/pydantic/pull/7136)\n\n## v2.1.1 (2023-07-25)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.1.1)\n\n* Skip FieldInfo merging when unnecessary by [@dmontagu](https://github.com/dmontagu) in [#6862](https://github.com/pydantic/pydantic/pull/6862)\n\n## v2.1.0 (2023-07-25)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.1.0)\n\n* Add `StringConstraints` for use as Annotated metadata by [@adriangb](https://github.com/adriangb) in [#6605](https://github.com/pydantic/pydantic/pull/6605)\n* Try to fix intermittently failing CI by [@adriangb](https://github.com/adriangb) in [#6683](https://github.com/pydantic/pydantic/pull/6683)\n* Remove redundant example of optional vs default. by [@ehiggs-deliverect](https://github.com/ehiggs-deliverect) in [#6676](https://github.com/pydantic/pydantic/pull/6676)\n* Docs update by [@samuelcolvin](https://github.com/samuelcolvin) in [#6692](https://github.com/pydantic/pydantic/pull/6692)\n* Remove the Validate always section in validator docs by [@adriangb](https://github.com/adriangb) in [#6679](https://github.com/pydantic/pydantic/pull/6679)\n* Fix recursion error in json schema generation by [@adriangb](https://github.com/adriangb) in [#6720](https://github.com/pydantic/pydantic/pull/6720)\n* Fix incorrect subclass check for secretstr by [@AlexVndnblcke](https://github.com/AlexVndnblcke) in [#6730](https://github.com/pydantic/pydantic/pull/6730)\n* update pdm / pdm lockfile to 2.8.0 by [@davidhewitt](https://github.com/davidhewitt) in [#6714](https://github.com/pydantic/pydantic/pull/6714)\n* unpin pdm on more CI jobs by [@davidhewitt](https://github.com/davidhewitt) in [#6755](https://github.com/pydantic/pydantic/pull/6755)\n* improve source locations for auxiliary packages in docs by [@davidhewitt](https://github.com/davidhewitt) in [#6749](https://github.com/pydantic/pydantic/pull/6749)\n* Assume builtins don't accept an info argument by [@adriangb](https://github.com/adriangb) in [#6754](https://github.com/pydantic/pydantic/pull/6754)\n* Fix bug where calling `help(BaseModelSubclass)` raises errors by [@hramezani](https://github.com/hramezani) in [#6758](https://github.com/pydantic/pydantic/pull/6758)\n* Fix mypy plugin handling of `@model_validator(mode=\"after\")` by [@ljodal](https://github.com/ljodal) in [#6753](https://github.com/pydantic/pydantic/pull/6753)\n* update pydantic-core to 2.3.1 by [@davidhewitt](https://github.com/davidhewitt) in [#6756](https://github.com/pydantic/pydantic/pull/6756)\n* Mypy plugin for settings by [@hramezani](https://github.com/hramezani) in [#6760](https://github.com/pydantic/pydantic/pull/6760)\n* Use `contentSchema` keyword for JSON schema by [@dmontagu](https://github.com/dmontagu) in [#6715](https://github.com/pydantic/pydantic/pull/6715)\n* fast-path checking finite decimals by [@davidhewitt](https://github.com/davidhewitt) in [#6769](https://github.com/pydantic/pydantic/pull/6769)\n* Docs update by [@samuelcolvin](https://github.com/samuelcolvin) in [#6771](https://github.com/pydantic/pydantic/pull/6771)\n* Improve json schema doc by [@hramezani](https://github.com/hramezani) in [#6772](https://github.com/pydantic/pydantic/pull/6772)\n* Update validator docs by [@adriangb](https://github.com/adriangb) in [#6695](https://github.com/pydantic/pydantic/pull/6695)\n* Fix typehint for wrap validator by [@dmontagu](https://github.com/dmontagu) in [#6788](https://github.com/pydantic/pydantic/pull/6788)\n* 🐛 Fix validation warning for unions of Literal and other type by [@lig](https://github.com/lig) in [#6628](https://github.com/pydantic/pydantic/pull/6628)\n* Update documentation for generics support in V2 by [@tpdorsey](https://github.com/tpdorsey) in [#6685](https://github.com/pydantic/pydantic/pull/6685)\n* add pydantic-core build info to `version_info()` by [@samuelcolvin](https://github.com/samuelcolvin) in [#6785](https://github.com/pydantic/pydantic/pull/6785)\n* Fix pydantic dataclasses that use slots with default values by [@dmontagu](https://github.com/dmontagu) in [#6796](https://github.com/pydantic/pydantic/pull/6796)\n* Fix inheritance of hash function for frozen models by [@dmontagu](https://github.com/dmontagu) in [#6789](https://github.com/pydantic/pydantic/pull/6789)\n* ✨ Add `SkipJsonSchema` annotation by [@Kludex](https://github.com/Kludex) in [#6653](https://github.com/pydantic/pydantic/pull/6653)\n* Error if an invalid field name is used with Field by [@dmontagu](https://github.com/dmontagu) in [#6797](https://github.com/pydantic/pydantic/pull/6797)\n* Add `GenericModel` to `MOVED_IN_V2` by [@adriangb](https://github.com/adriangb) in [#6776](https://github.com/pydantic/pydantic/pull/6776)\n* Remove unused code from `docs/usage/types/custom.md` by [@hramezani](https://github.com/hramezani) in [#6803](https://github.com/pydantic/pydantic/pull/6803)\n* Fix `float` -> `Decimal` coercion precision loss by [@adriangb](https://github.com/adriangb) in [#6810](https://github.com/pydantic/pydantic/pull/6810)\n* remove email validation from the north star benchmark by [@davidhewitt](https://github.com/davidhewitt) in [#6816](https://github.com/pydantic/pydantic/pull/6816)\n* Fix link to mypy by [@progsmile](https://github.com/progsmile) in [#6824](https://github.com/pydantic/pydantic/pull/6824)\n* Improve initialization hooks example by [@hramezani](https://github.com/hramezani) in [#6822](https://github.com/pydantic/pydantic/pull/6822)\n* Fix default port for mongosrv DSNs by [@dmontagu](https://github.com/dmontagu) in [#6827](https://github.com/pydantic/pydantic/pull/6827)\n* Improve API documentation, in particular more links between usage and API docs by [@samuelcolvin](https://github.com/samuelcolvin) in [#6780](https://github.com/pydantic/pydantic/pull/6780)\n* update pydantic-core to 2.4.0 by [@davidhewitt](https://github.com/davidhewitt) in [#6831](https://github.com/pydantic/pydantic/pull/6831)\n* Fix `annotated_types.MaxLen` validator for custom sequence types by [@ImogenBits](https://github.com/ImogenBits) in [#6809](https://github.com/pydantic/pydantic/pull/6809)\n* Update V1 by [@hramezani](https://github.com/hramezani) in [#6833](https://github.com/pydantic/pydantic/pull/6833)\n* Make it so callable JSON schema extra works by [@dmontagu](https://github.com/dmontagu) in [#6798](https://github.com/pydantic/pydantic/pull/6798)\n* Fix serialization issue with `InstanceOf` by [@dmontagu](https://github.com/dmontagu) in [#6829](https://github.com/pydantic/pydantic/pull/6829)\n* Add back support for `json_encoders` by [@adriangb](https://github.com/adriangb) in [#6811](https://github.com/pydantic/pydantic/pull/6811)\n* Update field annotations when building the schema by [@dmontagu](https://github.com/dmontagu) in [#6838](https://github.com/pydantic/pydantic/pull/6838)\n* Use `WeakValueDictionary` to fix generic memory leak by [@dmontagu](https://github.com/dmontagu) in [#6681](https://github.com/pydantic/pydantic/pull/6681)\n* Add `config.defer_build` to optionally make model building lazy by [@samuelcolvin](https://github.com/samuelcolvin) in [#6823](https://github.com/pydantic/pydantic/pull/6823)\n* delegate `UUID` serialization to pydantic-core by [@davidhewitt](https://github.com/davidhewitt) in [#6850](https://github.com/pydantic/pydantic/pull/6850)\n* Update `json_encoders` docs by [@adriangb](https://github.com/adriangb) in [#6848](https://github.com/pydantic/pydantic/pull/6848)\n* Fix error message for `staticmethod`/`classmethod` order with validate_call by [@dmontagu](https://github.com/dmontagu) in [#6686](https://github.com/pydantic/pydantic/pull/6686)\n* Improve documentation for `Config` by [@samuelcolvin](https://github.com/samuelcolvin) in [#6847](https://github.com/pydantic/pydantic/pull/6847)\n* Update serialization doc to mention `Field.exclude` takes priority over call-time `include/exclude` by [@hramezani](https://github.com/hramezani) in [#6851](https://github.com/pydantic/pydantic/pull/6851)\n* Allow customizing core schema generation by making `GenerateSchema` public by [@adriangb](https://github.com/adriangb) in [#6737](https://github.com/pydantic/pydantic/pull/6737)\n\n## v2.0.3 (2023-07-05)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.0.3)\n\n* Mention PyObject (v1) moving to ImportString (v2) in migration doc by [@slafs](https://github.com/slafs) in [#6456](https://github.com/pydantic/pydantic/pull/6456)\n* Fix release-tweet CI by [@Kludex](https://github.com/Kludex) in [#6461](https://github.com/pydantic/pydantic/pull/6461)\n* Revise the section on required / optional / nullable fields. by [@ybressler](https://github.com/ybressler) in [#6468](https://github.com/pydantic/pydantic/pull/6468)\n* Warn if a type hint is not in fact a type by [@adriangb](https://github.com/adriangb) in [#6479](https://github.com/pydantic/pydantic/pull/6479)\n* Replace TransformSchema with GetPydanticSchema by [@dmontagu](https://github.com/dmontagu) in [#6484](https://github.com/pydantic/pydantic/pull/6484)\n* Fix the un-hashability of various annotation types, for use in caching generic containers by [@dmontagu](https://github.com/dmontagu) in [#6480](https://github.com/pydantic/pydantic/pull/6480)\n* PYD-164: Rework custom types docs by [@adriangb](https://github.com/adriangb) in [#6490](https://github.com/pydantic/pydantic/pull/6490)\n* Fix ci by [@adriangb](https://github.com/adriangb) in [#6507](https://github.com/pydantic/pydantic/pull/6507)\n* Fix forward ref in generic by [@adriangb](https://github.com/adriangb) in [#6511](https://github.com/pydantic/pydantic/pull/6511)\n* Fix generation of serialization JSON schemas for core_schema.ChainSchema by [@dmontagu](https://github.com/dmontagu) in [#6515](https://github.com/pydantic/pydantic/pull/6515)\n* Document the change in `Field.alias` behavior in Pydantic V2 by [@hramezani](https://github.com/hramezani) in [#6508](https://github.com/pydantic/pydantic/pull/6508)\n* Give better error message attempting to compute the json schema of a model with undefined fields by [@dmontagu](https://github.com/dmontagu) in [#6519](https://github.com/pydantic/pydantic/pull/6519)\n* Document `alias_priority` by [@tpdorsey](https://github.com/tpdorsey) in [#6520](https://github.com/pydantic/pydantic/pull/6520)\n* Add redirect for types documentation by [@tpdorsey](https://github.com/tpdorsey) in [#6513](https://github.com/pydantic/pydantic/pull/6513)\n* Allow updating docs without release by [@samuelcolvin](https://github.com/samuelcolvin) in [#6551](https://github.com/pydantic/pydantic/pull/6551)\n* Ensure docs tests always run in the right folder by [@dmontagu](https://github.com/dmontagu) in [#6487](https://github.com/pydantic/pydantic/pull/6487)\n* Defer evaluation of return type hints for serializer functions by [@dmontagu](https://github.com/dmontagu) in [#6516](https://github.com/pydantic/pydantic/pull/6516)\n* Disable E501 from Ruff and rely on just Black by [@adriangb](https://github.com/adriangb) in [#6552](https://github.com/pydantic/pydantic/pull/6552)\n* Update JSON Schema documentation for V2 by [@tpdorsey](https://github.com/tpdorsey) in [#6492](https://github.com/pydantic/pydantic/pull/6492)\n* Add documentation of cyclic reference handling by [@dmontagu](https://github.com/dmontagu) in [#6493](https://github.com/pydantic/pydantic/pull/6493)\n* Remove the need for change files by [@samuelcolvin](https://github.com/samuelcolvin) in [#6556](https://github.com/pydantic/pydantic/pull/6556)\n* add \"north star\" benchmark by [@davidhewitt](https://github.com/davidhewitt) in [#6547](https://github.com/pydantic/pydantic/pull/6547)\n* Update Dataclasses docs by [@tpdorsey](https://github.com/tpdorsey) in [#6470](https://github.com/pydantic/pydantic/pull/6470)\n* ♻️ Use different error message on v1 redirects by [@Kludex](https://github.com/Kludex) in [#6595](https://github.com/pydantic/pydantic/pull/6595)\n* ⬆ Upgrade `pydantic-core` to v2.2.0 by [@lig](https://github.com/lig) in [#6589](https://github.com/pydantic/pydantic/pull/6589)\n* Fix serialization for IPvAny by [@dmontagu](https://github.com/dmontagu) in [#6572](https://github.com/pydantic/pydantic/pull/6572)\n* Improve CI by using PDM instead of pip to install typing-extensions by [@adriangb](https://github.com/adriangb) in [#6602](https://github.com/pydantic/pydantic/pull/6602)\n* Add `enum` error type docs by [@lig](https://github.com/lig) in [#6603](https://github.com/pydantic/pydantic/pull/6603)\n* 🐛 Fix `max_length` for unicode strings by [@lig](https://github.com/lig) in [#6559](https://github.com/pydantic/pydantic/pull/6559)\n* Add documentation for accessing features via `pydantic.v1` by [@tpdorsey](https://github.com/tpdorsey) in [#6604](https://github.com/pydantic/pydantic/pull/6604)\n* Include extra when iterating over a model by [@adriangb](https://github.com/adriangb) in [#6562](https://github.com/pydantic/pydantic/pull/6562)\n* Fix typing of model_validator by [@adriangb](https://github.com/adriangb) in [#6514](https://github.com/pydantic/pydantic/pull/6514)\n* Touch up Decimal validator by [@adriangb](https://github.com/adriangb) in [#6327](https://github.com/pydantic/pydantic/pull/6327)\n* Fix various docstrings using fixed pytest-examples by [@dmontagu](https://github.com/dmontagu) in [#6607](https://github.com/pydantic/pydantic/pull/6607)\n* Handle function validators in a discriminated union by [@dmontagu](https://github.com/dmontagu) in [#6570](https://github.com/pydantic/pydantic/pull/6570)\n* Review json_schema.md by [@tpdorsey](https://github.com/tpdorsey) in [#6608](https://github.com/pydantic/pydantic/pull/6608)\n* Make validate_call work on basemodel methods by [@dmontagu](https://github.com/dmontagu) in [#6569](https://github.com/pydantic/pydantic/pull/6569)\n* add test for big int json serde by [@davidhewitt](https://github.com/davidhewitt) in [#6614](https://github.com/pydantic/pydantic/pull/6614)\n* Fix pydantic dataclass problem with dataclasses.field default_factory by [@hramezani](https://github.com/hramezani) in [#6616](https://github.com/pydantic/pydantic/pull/6616)\n* Fixed mypy type inference for TypeAdapter by [@zakstucke](https://github.com/zakstucke) in [#6617](https://github.com/pydantic/pydantic/pull/6617)\n* Make it work to use None as a generic parameter by [@dmontagu](https://github.com/dmontagu) in [#6609](https://github.com/pydantic/pydantic/pull/6609)\n* Make it work to use `$ref` as an alias by [@dmontagu](https://github.com/dmontagu) in [#6568](https://github.com/pydantic/pydantic/pull/6568)\n* add note to migration guide about changes to `AnyUrl` etc by [@davidhewitt](https://github.com/davidhewitt) in [#6618](https://github.com/pydantic/pydantic/pull/6618)\n* 🐛 Support defining `json_schema_extra` on `RootModel` using `Field` by [@lig](https://github.com/lig) in [#6622](https://github.com/pydantic/pydantic/pull/6622)\n* Update pre-commit to prevent commits to main branch on accident by [@dmontagu](https://github.com/dmontagu) in [#6636](https://github.com/pydantic/pydantic/pull/6636)\n* Fix PDM CI for python 3.7 on MacOS/windows by [@dmontagu](https://github.com/dmontagu) in [#6627](https://github.com/pydantic/pydantic/pull/6627)\n* Produce more accurate signatures for pydantic dataclasses by [@dmontagu](https://github.com/dmontagu) in [#6633](https://github.com/pydantic/pydantic/pull/6633)\n* Updates to Url types for Pydantic V2 by [@tpdorsey](https://github.com/tpdorsey) in [#6638](https://github.com/pydantic/pydantic/pull/6638)\n* Fix list markdown in `transform` docstring by [@StefanBRas](https://github.com/StefanBRas) in [#6649](https://github.com/pydantic/pydantic/pull/6649)\n* simplify slots_dataclass construction to appease mypy by [@davidhewitt](https://github.com/davidhewitt) in [#6639](https://github.com/pydantic/pydantic/pull/6639)\n* Update TypedDict schema generation docstring by [@adriangb](https://github.com/adriangb) in [#6651](https://github.com/pydantic/pydantic/pull/6651)\n* Detect and lint-error for prints by [@dmontagu](https://github.com/dmontagu) in [#6655](https://github.com/pydantic/pydantic/pull/6655)\n* Add xfailing test for pydantic-core PR 766 by [@dmontagu](https://github.com/dmontagu) in [#6641](https://github.com/pydantic/pydantic/pull/6641)\n* Ignore unrecognized fields from dataclasses metadata by [@dmontagu](https://github.com/dmontagu) in [#6634](https://github.com/pydantic/pydantic/pull/6634)\n* Make non-existent class getattr a mypy error by [@dmontagu](https://github.com/dmontagu) in [#6658](https://github.com/pydantic/pydantic/pull/6658)\n* Update pydantic-core to 2.3.0 by [@hramezani](https://github.com/hramezani) in [#6648](https://github.com/pydantic/pydantic/pull/6648)\n* Use OrderedDict from typing_extensions by [@dmontagu](https://github.com/dmontagu) in [#6664](https://github.com/pydantic/pydantic/pull/6664)\n* Fix typehint for JSON schema extra callable by [@dmontagu](https://github.com/dmontagu) in [#6659](https://github.com/pydantic/pydantic/pull/6659)\n\n## v2.0.2 (2023-07-05)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.0.2)\n\n* Fix bug where round-trip pickling/unpickling a `RootModel` would change the value of `__dict__`, [#6457](https://github.com/pydantic/pydantic/pull/6457) by [@dmontagu](https://github.com/dmontagu)\n* Allow single-item discriminated unions, [#6405](https://github.com/pydantic/pydantic/pull/6405) by [@dmontagu](https://github.com/dmontagu)\n* Fix issue with union parsing of enums, [#6440](https://github.com/pydantic/pydantic/pull/6440) by [@dmontagu](https://github.com/dmontagu)\n* Docs: Fixed `constr` documentation, renamed old `regex` to new `pattern`, [#6452](https://github.com/pydantic/pydantic/pull/6452) by [@miili](https://github.com/miili)\n* Change `GenerateJsonSchema.generate_definitions` signature, [#6436](https://github.com/pydantic/pydantic/pull/6436) by [@dmontagu](https://github.com/dmontagu)\n\nSee the full changelog [here](https://github.com/pydantic/pydantic/releases/tag/v2.0.2)\n\n## v2.0.1 (2023-07-04)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.0.1)\n\nFirst patch release of Pydantic V2\n\n* Extra fields added via `setattr` (i.e. `m.some_extra_field = 'extra_value'`)\n are added to `.model_extra` if `model_config` `extra='allowed'`. Fixed [#6333](https://github.com/pydantic/pydantic/pull/6333), [#6365](https://github.com/pydantic/pydantic/pull/6365) by [@aaraney](https://github.com/aaraney)\n* Automatically unpack JSON schema '$ref' for custom types, [#6343](https://github.com/pydantic/pydantic/pull/6343) by [@adriangb](https://github.com/adriangb)\n* Fix tagged unions multiple processing in submodels, [#6340](https://github.com/pydantic/pydantic/pull/6340) by [@suharnikov](https://github.com/suharnikov)\n\nSee the full changelog [here](https://github.com/pydantic/pydantic/releases/tag/v2.0.1)\n\n## v2.0 (2023-06-30)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.0)\n\nPydantic V2 is here! :tada:\n\nSee [this post](https://docs.pydantic.dev/2.0/blog/pydantic-v2-final/) for more details.\n\n## v2.0b3 (2023-06-16)\n\nThird beta pre-release of Pydantic V2\n\nSee the full changelog [here](https://github.com/pydantic/pydantic/releases/tag/v2.0b3)\n\n## v2.0b2 (2023-06-03)\n\nAdd `from_attributes` runtime flag to `TypeAdapter.validate_python` and `BaseModel.model_validate`.\n\nSee the full changelog [here](https://github.com/pydantic/pydantic/releases/tag/v2.0b2)\n\n## v2.0b1 (2023-06-01)\n\nFirst beta pre-release of Pydantic V2\n\nSee the full changelog [here](https://github.com/pydantic/pydantic/releases/tag/v2.0b1)\n\n## v2.0a4 (2023-05-05)\n\nFourth pre-release of Pydantic V2\n\nSee the full changelog [here](https://github.com/pydantic/pydantic/releases/tag/v2.0a4)\n\n## v2.0a3 (2023-04-20)\n\nThird pre-release of Pydantic V2\n\nSee the full changelog [here](https://github.com/pydantic/pydantic/releases/tag/v2.0a3)\n\n## v2.0a2 (2023-04-12)\n\nSecond pre-release of Pydantic V2\n\nSee the full changelog [here](https://github.com/pydantic/pydantic/releases/tag/v2.0a2)\n\n## v2.0a1 (2023-04-03)\n\nFirst pre-release of Pydantic V2!\n\nSee [this post](https://docs.pydantic.dev/blog/pydantic-v2-alpha/) for more details.\n\n## v1.10.13 (2023-09-27)\n\n* Fix: Add max length check to `pydantic.validate_email`, [#7673](https://github.com/pydantic/pydantic/issues/7673) by [@hramezani](https://github.com/hramezani)\n* Docs: Fix pip commands to install v1, [#6930](https://github.com/pydantic/pydantic/issues/6930) by [@chbndrhnns](https://github.com/chbndrhnns)\n\n## v1.10.12 (2023-07-24)\n\n* Fixes the `maxlen` property being dropped on `deque` validation. Happened only if the deque item has been typed. Changes the `_validate_sequence_like` func, [#6581](https://github.com/pydantic/pydantic/pull/6581) by [@maciekglowka](https://github.com/maciekglowka)\n\n## v1.10.11 (2023-07-04)\n\n* Importing create_model in tools.py through relative path instead of absolute path - so that it doesn't import V2 code when copied over to V2 branch, [#6361](https://github.com/pydantic/pydantic/pull/6361) by [@SharathHuddar](https://github.com/SharathHuddar)\n\n## v1.10.10 (2023-06-30)\n\n* Add Pydantic `Json` field support to settings management, [#6250](https://github.com/pydantic/pydantic/pull/6250) by [@hramezani](https://github.com/hramezani)\n* Fixed literal validator errors for unhashable values, [#6188](https://github.com/pydantic/pydantic/pull/6188) by [@markus1978](https://github.com/markus1978)\n* Fixed bug with generics receiving forward refs, [#6130](https://github.com/pydantic/pydantic/pull/6130) by [@mark-todd](https://github.com/mark-todd)\n* Update install method of FastAPI for internal tests in CI, [#6117](https://github.com/pydantic/pydantic/pull/6117) by [@Kludex](https://github.com/Kludex)\n\n## v1.10.9 (2023-06-07)\n\n* Fix trailing zeros not ignored in Decimal validation, [#5968](https://github.com/pydantic/pydantic/pull/5968) by [@hramezani](https://github.com/hramezani)\n* Fix mypy plugin for v1.4.0, [#5928](https://github.com/pydantic/pydantic/pull/5928) by [@cdce8p](https://github.com/cdce8p)\n* Add future and past date hypothesis strategies, [#5850](https://github.com/pydantic/pydantic/pull/5850) by [@bschoenmaeckers](https://github.com/bschoenmaeckers)\n* Discourage usage of Cython 3 with Pydantic 1.x, [#5845](https://github.com/pydantic/pydantic/pull/5845) by [@lig](https://github.com/lig)\n\n## v1.10.8 (2023-05-23)\n\n* Fix a bug in `Literal` usage with `typing-extension==4.6.0`, [#5826](https://github.com/pydantic/pydantic/pull/5826) by [@hramezani](https://github.com/hramezani)\n* This solves the (closed) issue [#3849](https://github.com/pydantic/pydantic/pull/3849) where aliased fields that use discriminated union fail to validate when the data contains the non-aliased field name, [#5736](https://github.com/pydantic/pydantic/pull/5736) by [@benwah](https://github.com/benwah)\n* Update email-validator dependency to >=2.0.0post2, [#5627](https://github.com/pydantic/pydantic/pull/5627) by [@adriangb](https://github.com/adriangb)\n* update `AnyClassMethod` for changes in [python/typeshed#9771](https://github.com/python/typeshed/issues/9771), [#5505](https://github.com/pydantic/pydantic/pull/5505) by [@ITProKyle](https://github.com/ITProKyle)\n\n## v1.10.7 (2023-03-22)\n\n* Fix creating schema from model using `ConstrainedStr` with `regex` as dict key, [#5223](https://github.com/pydantic/pydantic/pull/5223) by [@matejetz](https://github.com/matejetz)\n* Address bug in mypy plugin caused by explicit_package_bases=True, [#5191](https://github.com/pydantic/pydantic/pull/5191) by [@dmontagu](https://github.com/dmontagu)\n* Add implicit defaults in the mypy plugin for Field with no default argument, [#5190](https://github.com/pydantic/pydantic/pull/5190) by [@dmontagu](https://github.com/dmontagu)\n* Fix schema generated for Enum values used as Literals in discriminated unions, [#5188](https://github.com/pydantic/pydantic/pull/5188) by [@javibookline](https://github.com/javibookline)\n* Fix mypy failures caused by the pydantic mypy plugin when users define `from_orm` in their own classes, [#5187](https://github.com/pydantic/pydantic/pull/5187) by [@dmontagu](https://github.com/dmontagu)\n* Fix `InitVar` usage with pydantic dataclasses, mypy version `1.1.1` and the custom mypy plugin, [#5162](https://github.com/pydantic/pydantic/pull/5162) by [@cdce8p](https://github.com/cdce8p)\n\n## v1.10.6 (2023-03-08)\n\n* Implement logic to support creating validators from non standard callables by using defaults to identify them and unwrapping `functools.partial` and `functools.partialmethod` when checking the signature, [#5126](https://github.com/pydantic/pydantic/pull/5126) by [@JensHeinrich](https://github.com/JensHeinrich)\n* Fix mypy plugin for v1.1.1, and fix `dataclass_transform` decorator for pydantic dataclasses, [#5111](https://github.com/pydantic/pydantic/pull/5111) by [@cdce8p](https://github.com/cdce8p)\n* Raise `ValidationError`, not `ConfigError`, when a discriminator value is unhashable, [#4773](https://github.com/pydantic/pydantic/pull/4773) by [@kurtmckee](https://github.com/kurtmckee)\n\n## v1.10.5 (2023-02-15)\n\n* Fix broken parametrized bases handling with `GenericModel`s with complex sets of models, [#5052](https://github.com/pydantic/pydantic/pull/5052) by [@MarkusSintonen](https://github.com/MarkusSintonen)\n* Invalidate mypy cache if plugin config changes, [#5007](https://github.com/pydantic/pydantic/pull/5007) by [@cdce8p](https://github.com/cdce8p)\n* Fix `RecursionError` when deep-copying dataclass types wrapped by pydantic, [#4949](https://github.com/pydantic/pydantic/pull/4949) by [@mbillingr](https://github.com/mbillingr)\n* Fix `X | Y` union syntax breaking `GenericModel`, [#4146](https://github.com/pydantic/pydantic/pull/4146) by [@thenx](https://github.com/thenx)\n* Switch coverage badge to show coverage for this branch/release, [#5060](https://github.com/pydantic/pydantic/pull/5060) by [@samuelcolvin](https://github.com/samuelcolvin)\n\n## v1.10.4 (2022-12-30)\n\n* Change dependency to `typing-extensions>=4.2.0`, [#4885](https://github.com/pydantic/pydantic/pull/4885) by [@samuelcolvin](https://github.com/samuelcolvin)\n\n## v1.10.3 (2022-12-29)\n\n**NOTE: v1.10.3 was [\"yanked\"](https://pypi.org/help/#yanked) from PyPI due to [#4885](https://github.com/pydantic/pydantic/pull/4885) which is fixed in v1.10.4**\n\n* fix parsing of custom root models, [#4883](https://github.com/pydantic/pydantic/pull/4883) by [@gou177](https://github.com/gou177)\n* fix: use dataclass proxy for frozen or empty dataclasses, [#4878](https://github.com/pydantic/pydantic/pull/4878) by [@PrettyWood](https://github.com/PrettyWood)\n* Fix `schema` and `schema_json` on models where a model instance is a one of default values, [#4781](https://github.com/pydantic/pydantic/pull/4781) by [@Bobronium](https://github.com/Bobronium)\n* Add Jina AI to sponsors on docs index page, [#4767](https://github.com/pydantic/pydantic/pull/4767) by [@samuelcolvin](https://github.com/samuelcolvin)\n* fix: support assignment on `DataclassProxy`, [#4695](https://github.com/pydantic/pydantic/pull/4695) by [@PrettyWood](https://github.com/PrettyWood)\n* Add `postgresql+psycopg` as allowed scheme for `PostgreDsn` to make it usable with SQLAlchemy 2, [#4689](https://github.com/pydantic/pydantic/pull/4689) by [@morian](https://github.com/morian)\n* Allow dict schemas to have both `patternProperties` and `additionalProperties`, [#4641](https://github.com/pydantic/pydantic/pull/4641) by [@jparise](https://github.com/jparise)\n* Fixes error passing None for optional lists with `unique_items`, [#4568](https://github.com/pydantic/pydantic/pull/4568) by [@mfulgo](https://github.com/mfulgo)\n* Fix `GenericModel` with `Callable` param raising a `TypeError`, [#4551](https://github.com/pydantic/pydantic/pull/4551) by [@mfulgo](https://github.com/mfulgo)\n* Fix field regex with `StrictStr` type annotation, [#4538](https://github.com/pydantic/pydantic/pull/4538) by [@sisp](https://github.com/sisp)\n* Correct `dataclass_transform` keyword argument name from `field_descriptors` to `field_specifiers`, [#4500](https://github.com/pydantic/pydantic/pull/4500) by [@samuelcolvin](https://github.com/samuelcolvin)\n* fix: avoid multiple calls of `__post_init__` when dataclasses are inherited, [#4487](https://github.com/pydantic/pydantic/pull/4487) by [@PrettyWood](https://github.com/PrettyWood)\n* Reduce the size of binary wheels, [#2276](https://github.com/pydantic/pydantic/pull/2276) by [@samuelcolvin](https://github.com/samuelcolvin)\n\n## v1.10.2 (2022-09-05)\n\n* **Revert Change:** Revert percent encoding of URL parts which was originally added in [#4224](https://github.com/pydantic/pydantic/pull/4224), [#4470](https://github.com/pydantic/pydantic/pull/4470) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Prevent long (length > `4_300`) strings/bytes as input to int fields, see\n [python/cpython#95778](https://github.com/python/cpython/issues/95778) and\n [CVE-2020-10735](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10735), [#1477](https://github.com/pydantic/pydantic/pull/1477) by [@samuelcolvin](https://github.com/samuelcolvin)\n* fix: dataclass wrapper was not always called, [#4477](https://github.com/pydantic/pydantic/pull/4477) by [@PrettyWood](https://github.com/PrettyWood)\n* Use `tomllib` on Python 3.11 when parsing `mypy` configuration, [#4476](https://github.com/pydantic/pydantic/pull/4476) by [@hauntsaninja](https://github.com/hauntsaninja)\n* Basic fix of `GenericModel` cache to detect order of arguments in `Union` models, [#4474](https://github.com/pydantic/pydantic/pull/4474) by [@sveinugu](https://github.com/sveinugu)\n* Fix mypy plugin when using bare types like `list` and `dict` as `default_factory`, [#4457](https://github.com/pydantic/pydantic/pull/4457) by [@samuelcolvin](https://github.com/samuelcolvin)\n\n## v1.10.1 (2022-08-31)\n\n* Add `__hash__` method to `pydancic.color.Color` class, [#4454](https://github.com/pydantic/pydantic/pull/4454) by [@czaki](https://github.com/czaki)\n\n## v1.10.0 (2022-08-30)\n\n* Refactor the whole _pydantic_ `dataclass` decorator to really act like its standard lib equivalent.\n It hence keeps `__eq__`, `__hash__`, ... and makes comparison with its non-validated version possible.\n It also fixes usage of `frozen` dataclasses in fields and usage of `default_factory` in nested dataclasses.\n The support of `Config.extra` has been added.\n Finally, config customization directly via a `dict` is now possible, [#2557](https://github.com/pydantic/pydantic/pull/2557) by [@PrettyWood](https://github.com/PrettyWood)\n <br/><br/>\n **BREAKING CHANGES:**\n - The `compiled` boolean (whether _pydantic_ is compiled with cython) has been moved from `main.py` to `version.py`\n - Now that `Config.extra` is supported, `dataclass` ignores by default extra arguments (like `BaseModel`)\n* Fix PEP487 `__set_name__` protocol in `BaseModel` for PrivateAttrs, [#4407](https://github.com/pydantic/pydantic/pull/4407) by [@tlambert03](https://github.com/tlambert03)\n* Allow for custom parsing of environment variables via `parse_env_var` in `Config`, [#4406](https://github.com/pydantic/pydantic/pull/4406) by [@acmiyaguchi](https://github.com/acmiyaguchi)\n* Rename `master` to `main`, [#4405](https://github.com/pydantic/pydantic/pull/4405) by [@hramezani](https://github.com/hramezani)\n* Fix `StrictStr` does not raise `ValidationError` when `max_length` is present in `Field`, [#4388](https://github.com/pydantic/pydantic/pull/4388) by [@hramezani](https://github.com/hramezani)\n* Make `SecretStr` and `SecretBytes` hashable, [#4387](https://github.com/pydantic/pydantic/pull/4387) by [@chbndrhnns](https://github.com/chbndrhnns)\n* Fix `StrictBytes` does not raise `ValidationError` when `max_length` is present in `Field`, [#4380](https://github.com/pydantic/pydantic/pull/4380) by [@JeanArhancet](https://github.com/JeanArhancet)\n* Add support for bare `type`, [#4375](https://github.com/pydantic/pydantic/pull/4375) by [@hramezani](https://github.com/hramezani)\n* Support Python 3.11, including binaries for 3.11 in PyPI, [#4374](https://github.com/pydantic/pydantic/pull/4374) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Add support for `re.Pattern`, [#4366](https://github.com/pydantic/pydantic/pull/4366) by [@hramezani](https://github.com/hramezani)\n* Fix `__post_init_post_parse__` is incorrectly passed keyword arguments when no `__post_init__` is defined, [#4361](https://github.com/pydantic/pydantic/pull/4361) by [@hramezani](https://github.com/hramezani)\n* Fix implicitly importing `ForwardRef` and `Callable` from `pydantic.typing` instead of `typing` and also expose `MappingIntStrAny`, [#4358](https://github.com/pydantic/pydantic/pull/4358) by [@aminalaee](https://github.com/aminalaee)\n* remove `Any` types from the `dataclass` decorator so it can be used with the `disallow_any_expr` mypy option, [#4356](https://github.com/pydantic/pydantic/pull/4356) by [@DetachHead](https://github.com/DetachHead)\n* moved repo to `pydantic/pydantic`, [#4348](https://github.com/pydantic/pydantic/pull/4348) by [@yezz123](https://github.com/yezz123)\n* fix \"extra fields not permitted\" error when dataclass with `Extra.forbid` is validated multiple times, [#4343](https://github.com/pydantic/pydantic/pull/4343) by [@detachhead](https://github.com/detachhead)\n* Add Python 3.9 and 3.10 examples to docs, [#4339](https://github.com/pydantic/pydantic/pull/4339) by [@Bobronium](https://github.com/Bobronium)\n* Discriminated union models now use `oneOf` instead of `anyOf` when generating OpenAPI schema definitions, [#4335](https://github.com/pydantic/pydantic/pull/4335) by [@MaxwellPayne](https://github.com/MaxwellPayne)\n* Allow type checkers to infer inner type of `Json` type. `Json[list[str]]` will be now inferred as `list[str]`,\n `Json[Any]` should be used instead of plain `Json`.\n Runtime behaviour is not changed, [#4332](https://github.com/pydantic/pydantic/pull/4332) by [@Bobronium](https://github.com/Bobronium)\n* Allow empty string aliases by using a `alias is not None` check, rather than `bool(alias)`, [#4253](https://github.com/pydantic/pydantic/pull/4253) by [@sergeytsaplin](https://github.com/sergeytsaplin)\n* Update `ForwardRef`s in `Field.outer_type_`, [#4249](https://github.com/pydantic/pydantic/pull/4249) by [@JacobHayes](https://github.com/JacobHayes)\n* The use of `__dataclass_transform__` has been replaced by `typing_extensions.dataclass_transform`, which is the preferred way to mark pydantic models as a dataclass under [PEP 681](https://peps.python.org/pep-0681/), [#4241](https://github.com/pydantic/pydantic/pull/4241) by [@multimeric](https://github.com/multimeric)\n* Use parent model's `Config` when validating nested `NamedTuple` fields, [#4219](https://github.com/pydantic/pydantic/pull/4219) by [@synek](https://github.com/synek)\n* Update `BaseModel.construct` to work with aliased Fields, [#4192](https://github.com/pydantic/pydantic/pull/4192) by [@kylebamos](https://github.com/kylebamos)\n* Catch certain raised errors in `smart_deepcopy` and revert to `deepcopy` if so, [#4184](https://github.com/pydantic/pydantic/pull/4184) by [@coneybeare](https://github.com/coneybeare)\n* Add `Config.anystr_upper` and `to_upper` kwarg to constr and conbytes, [#4165](https://github.com/pydantic/pydantic/pull/4165) by [@satheler](https://github.com/satheler)\n* Fix JSON schema for `set` and `frozenset` when they include default values, [#4155](https://github.com/pydantic/pydantic/pull/4155) by [@aminalaee](https://github.com/aminalaee)\n* Teach the mypy plugin that methods decorated by `@validator` are classmethods, [#4102](https://github.com/pydantic/pydantic/pull/4102) by [@DMRobertson](https://github.com/DMRobertson)\n* Improve mypy plugin's ability to detect required fields, [#4086](https://github.com/pydantic/pydantic/pull/4086) by [@richardxia](https://github.com/richardxia)\n* Support fields of type `Type[]` in schema, [#4051](https://github.com/pydantic/pydantic/pull/4051) by [@aminalaee](https://github.com/aminalaee)\n* Add `default` value in JSON Schema when `const=True`, [#4031](https://github.com/pydantic/pydantic/pull/4031) by [@aminalaee](https://github.com/aminalaee)\n* Adds reserved word check to signature generation logic, [#4011](https://github.com/pydantic/pydantic/pull/4011) by [@strue36](https://github.com/strue36)\n* Fix Json strategy failure for the complex nested field, [#4005](https://github.com/pydantic/pydantic/pull/4005) by [@sergiosim](https://github.com/sergiosim)\n* Add JSON-compatible float constraint `allow_inf_nan`, [#3994](https://github.com/pydantic/pydantic/pull/3994) by [@tiangolo](https://github.com/tiangolo)\n* Remove undefined behaviour when `env_prefix` had characters in common with `env_nested_delimiter`, [#3975](https://github.com/pydantic/pydantic/pull/3975) by [@arsenron](https://github.com/arsenron)\n* Support generics model with `create_model`, [#3945](https://github.com/pydantic/pydantic/pull/3945) by [@hot123s](https://github.com/hot123s)\n* allow submodels to overwrite extra field info, [#3934](https://github.com/pydantic/pydantic/pull/3934) by [@PrettyWood](https://github.com/PrettyWood)\n* Document and test structural pattern matching ([PEP 636](https://peps.python.org/pep-0636/)) on `BaseModel`, [#3920](https://github.com/pydantic/pydantic/pull/3920) by [@irgolic](https://github.com/irgolic)\n* Fix incorrect deserialization of python timedelta object to ISO 8601 for negative time deltas.\n Minus was serialized in incorrect place (\"P-1DT23H59M59.888735S\" instead of correct \"-P1DT23H59M59.888735S\"), [#3899](https://github.com/pydantic/pydantic/pull/3899) by [@07pepa](https://github.com/07pepa)\n* Fix validation of discriminated union fields with an alias when passing a model instance, [#3846](https://github.com/pydantic/pydantic/pull/3846) by [@chornsby](https://github.com/chornsby)\n* Add a CockroachDsn type to validate CockroachDB connection strings. The type\n supports the following schemes: `cockroachdb`, `cockroachdb+psycopg2` and `cockroachdb+asyncpg`, [#3839](https://github.com/pydantic/pydantic/pull/3839) by [@blubber](https://github.com/blubber)\n* Fix MyPy plugin to not override pre-existing `__init__` method in models, [#3824](https://github.com/pydantic/pydantic/pull/3824) by [@patrick91](https://github.com/patrick91)\n* Fix mypy version checking, [#3783](https://github.com/pydantic/pydantic/pull/3783) by [@KotlinIsland](https://github.com/KotlinIsland)\n* support overwriting dunder attributes of `BaseModel` instances, [#3777](https://github.com/pydantic/pydantic/pull/3777) by [@PrettyWood](https://github.com/PrettyWood)\n* Added `ConstrainedDate` and `condate`, [#3740](https://github.com/pydantic/pydantic/pull/3740) by [@hottwaj](https://github.com/hottwaj)\n* Support `kw_only` in dataclasses, [#3670](https://github.com/pydantic/pydantic/pull/3670) by [@detachhead](https://github.com/detachhead)\n* Add comparison method for `Color` class, [#3646](https://github.com/pydantic/pydantic/pull/3646) by [@aminalaee](https://github.com/aminalaee)\n* Drop support for python3.6, associated cleanup, [#3605](https://github.com/pydantic/pydantic/pull/3605) by [@samuelcolvin](https://github.com/samuelcolvin)\n* created new function `to_lower_camel()` for \"non pascal case\" camel case, [#3463](https://github.com/pydantic/pydantic/pull/3463) by [@schlerp](https://github.com/schlerp)\n* Add checks to `default` and `default_factory` arguments in Mypy plugin, [#3430](https://github.com/pydantic/pydantic/pull/3430) by [@klaa97](https://github.com/klaa97)\n* fix mangling of `inspect.signature` for `BaseModel`, [#3413](https://github.com/pydantic/pydantic/pull/3413) by [@fix-inspect-signature](https://github.com/fix-inspect-signature)\n* Adds the `SecretField` abstract class so that all the current and future secret fields like `SecretStr` and `SecretBytes` will derive from it, [#3409](https://github.com/pydantic/pydantic/pull/3409) by [@expobrain](https://github.com/expobrain)\n* Support multi hosts validation in `PostgresDsn`, [#3337](https://github.com/pydantic/pydantic/pull/3337) by [@rglsk](https://github.com/rglsk)\n* Fix parsing of very small numeric timedelta values, [#3315](https://github.com/pydantic/pydantic/pull/3315) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Update `SecretsSettingsSource` to respect `config.case_sensitive`, [#3273](https://github.com/pydantic/pydantic/pull/3273) by [@JeanArhancet](https://github.com/JeanArhancet)\n* Add MongoDB network data source name (DSN) schema, [#3229](https://github.com/pydantic/pydantic/pull/3229) by [@snosratiershad](https://github.com/snosratiershad)\n* Add support for multiple dotenv files, [#3222](https://github.com/pydantic/pydantic/pull/3222) by [@rekyungmin](https://github.com/rekyungmin)\n* Raise an explicit `ConfigError` when multiple fields are incorrectly set for a single validator, [#3215](https://github.com/pydantic/pydantic/pull/3215) by [@SunsetOrange](https://github.com/SunsetOrange)\n* Allow ellipsis on `Field`s inside `Annotated` for `TypedDicts` required, [#3133](https://github.com/pydantic/pydantic/pull/3133) by [@ezegomez](https://github.com/ezegomez)\n* Catch overflow errors in `int_validator`, [#3112](https://github.com/pydantic/pydantic/pull/3112) by [@ojii](https://github.com/ojii)\n* Adds a `__rich_repr__` method to `Representation` class which enables pretty printing with [Rich](https://github.com/willmcgugan/rich), [#3099](https://github.com/pydantic/pydantic/pull/3099) by [@willmcgugan](https://github.com/willmcgugan)\n* Add percent encoding in `AnyUrl` and descendent types, [#3061](https://github.com/pydantic/pydantic/pull/3061) by [@FaresAhmedb](https://github.com/FaresAhmedb)\n* `validate_arguments` decorator now supports `alias`, [#3019](https://github.com/pydantic/pydantic/pull/3019) by [@MAD-py](https://github.com/MAD-py)\n* Avoid `__dict__` and `__weakref__` attributes in `AnyUrl` and IP address fields, [#2890](https://github.com/pydantic/pydantic/pull/2890) by [@nuno-andre](https://github.com/nuno-andre)\n* Add ability to use `Final` in a field type annotation, [#2766](https://github.com/pydantic/pydantic/pull/2766) by [@uriyyo](https://github.com/uriyyo)\n* Update requirement to `typing_extensions>=4.1.0` to guarantee `dataclass_transform` is available, [#4424](https://github.com/pydantic/pydantic/pull/4424) by [@commonism](https://github.com/commonism)\n* Add Explosion and AWS to main sponsors, [#4413](https://github.com/pydantic/pydantic/pull/4413) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Update documentation for `copy_on_model_validation` to reflect recent changes, [#4369](https://github.com/pydantic/pydantic/pull/4369) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Runtime warning if `__slots__` is passed to `create_model`, `__slots__` is then ignored, [#4432](https://github.com/pydantic/pydantic/pull/4432) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Add type hints to `BaseSettings.Config` to avoid mypy errors, also correct mypy version compatibility notice in docs, [#4450](https://github.com/pydantic/pydantic/pull/4450) by [@samuelcolvin](https://github.com/samuelcolvin)\n\n## v1.10.0b1 (2022-08-24)\n\nPre-release, see [the GitHub release](https://github.com/pydantic/pydantic/releases/tag/v1.10.0b1) for details.\n\n## v1.10.0a2 (2022-08-24)\n\nPre-release, see [the GitHub release](https://github.com/pydantic/pydantic/releases/tag/v1.10.0a2) for details.\n\n## v1.10.0a1 (2022-08-22)\n\nPre-release, see [the GitHub release](https://github.com/pydantic/pydantic/releases/tag/v1.10.0a1) for details.\n\n## v1.9.2 (2022-08-11)\n\n**Revert Breaking Change**: _v1.9.1_ introduced a breaking change where model fields were\ndeep copied by default, this release reverts the default behaviour to match _v1.9.0_ and before,\nwhile also allow deep-copy behaviour via `copy_on_model_validation = 'deep'`. See [#4092](https://github.com/pydantic/pydantic/pull/4092) for more information.\n\n* Allow for shallow copies of model fields, `Config.copy_on_model_validation` is now a str which must be\n `'none'`, `'deep'`, or `'shallow'` corresponding to not copying, deep copy & shallow copy; default `'shallow'`,\n [#4093](https://github.com/pydantic/pydantic/pull/4093) by [@timkpaine](https://github.com/timkpaine)\n\n## v1.9.1 (2022-05-19)\n\nThank you to pydantic's sponsors:\n[@tiangolo](https://github.com/tiangolo), [@stellargraph](https://github.com/stellargraph), [@JonasKs](https://github.com/JonasKs), [@grillazz](https://github.com/grillazz), [@Mazyod](https://github.com/Mazyod), [@kevinalh](https://github.com/kevinalh), [@chdsbd](https://github.com/chdsbd), [@povilasb](https://github.com/povilasb), [@povilasb](https://github.com/povilasb), [@jina-ai](https://github.com/jina-ai),\n[@mainframeindustries](https://github.com/mainframeindustries), [@robusta-dev](https://github.com/robusta-dev), [@SendCloud](https://github.com/SendCloud), [@rszamszur](https://github.com/rszamszur), [@jodal](https://github.com/jodal), [@hardbyte](https://github.com/hardbyte), [@corleyma](https://github.com/corleyma), [@daddycocoaman](https://github.com/daddycocoaman),\n[@Rehket](https://github.com/Rehket), [@jokull](https://github.com/jokull), [@reillysiemens](https://github.com/reillysiemens), [@westonsteimel](https://github.com/westonsteimel), [@primer-io](https://github.com/primer-io), [@koxudaxi](https://github.com/koxudaxi), [@browniebroke](https://github.com/browniebroke), [@stradivari96](https://github.com/stradivari96),\n[@adriangb](https://github.com/adriangb), [@kamalgill](https://github.com/kamalgill), [@jqueguiner](https://github.com/jqueguiner), [@dev-zero](https://github.com/dev-zero), [@datarootsio](https://github.com/datarootsio), [@RedCarpetUp](https://github.com/RedCarpetUp)\nfor their kind support.\n\n* Limit the size of `generics._generic_types_cache` and `generics._assigned_parameters`\n to avoid unlimited increase in memory usage, [#4083](https://github.com/pydantic/pydantic/pull/4083) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Add Jupyverse and FPS as Jupyter projects using pydantic, [#4082](https://github.com/pydantic/pydantic/pull/4082) by [@davidbrochart](https://github.com/davidbrochart)\n* Speedup `__isinstancecheck__` on pydantic models when the type is not a model, may also avoid memory \"leaks\", [#4081](https://github.com/pydantic/pydantic/pull/4081) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Fix in-place modification of `FieldInfo` that caused problems with PEP 593 type aliases, [#4067](https://github.com/pydantic/pydantic/pull/4067) by [@adriangb](https://github.com/adriangb)\n* Add support for autocomplete in VS Code via `__dataclass_transform__` when using `pydantic.dataclasses.dataclass`, [#4006](https://github.com/pydantic/pydantic/pull/4006) by [@giuliano-oliveira](https://github.com/giuliano-oliveira)\n* Remove benchmarks from codebase and docs, [#3973](https://github.com/pydantic/pydantic/pull/3973) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Typing checking with pyright in CI, improve docs on vscode/pylance/pyright, [#3972](https://github.com/pydantic/pydantic/pull/3972) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Fix nested Python dataclass schema regression, [#3819](https://github.com/pydantic/pydantic/pull/3819) by [@himbeles](https://github.com/himbeles)\n* Update documentation about lazy evaluation of sources for Settings, [#3806](https://github.com/pydantic/pydantic/pull/3806) by [@garyd203](https://github.com/garyd203)\n* Prevent subclasses of bytes being converted to bytes, [#3706](https://github.com/pydantic/pydantic/pull/3706) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Fixed \"error checking inheritance of\" when using PEP585 and PEP604 type hints, [#3681](https://github.com/pydantic/pydantic/pull/3681) by [@aleksul](https://github.com/aleksul)\n* Allow self referencing `ClassVar`s in models, [#3679](https://github.com/pydantic/pydantic/pull/3679) by [@samuelcolvin](https://github.com/samuelcolvin)\n* **Breaking Change, see [#4106](https://github.com/pydantic/pydantic/pull/4106)**: Fix issue with self-referencing dataclass, [#3675](https://github.com/pydantic/pydantic/pull/3675) by [@uriyyo](https://github.com/uriyyo)\n* Include non-standard port numbers in rendered URLs, [#3652](https://github.com/pydantic/pydantic/pull/3652) by [@dolfinus](https://github.com/dolfinus)\n* `Config.copy_on_model_validation` does a deep copy and not a shallow one, [#3641](https://github.com/pydantic/pydantic/pull/3641) by [@PrettyWood](https://github.com/PrettyWood)\n* fix: clarify that discriminated unions do not support singletons, [#3636](https://github.com/pydantic/pydantic/pull/3636) by [@tommilligan](https://github.com/tommilligan)\n* Add `read_text(encoding='utf-8')` for `setup.py`, [#3625](https://github.com/pydantic/pydantic/pull/3625) by [@hswong3i](https://github.com/hswong3i)\n* Fix JSON Schema generation for Discriminated Unions within lists, [#3608](https://github.com/pydantic/pydantic/pull/3608) by [@samuelcolvin](https://github.com/samuelcolvin)\n\n## v1.9.0 (2021-12-31)\n\nThank you to pydantic's sponsors:\n[@sthagen](https://github.com/sthagen), [@timdrijvers](https://github.com/timdrijvers), [@toinbis](https://github.com/toinbis), [@koxudaxi](https://github.com/koxudaxi), [@ginomempin](https://github.com/ginomempin), [@primer-io](https://github.com/primer-io), [@and-semakin](https://github.com/and-semakin), [@westonsteimel](https://github.com/westonsteimel), [@reillysiemens](https://github.com/reillysiemens),\n[@es3n1n](https://github.com/es3n1n), [@jokull](https://github.com/jokull), [@JonasKs](https://github.com/JonasKs), [@Rehket](https://github.com/Rehket), [@corleyma](https://github.com/corleyma), [@daddycocoaman](https://github.com/daddycocoaman), [@hardbyte](https://github.com/hardbyte), [@datarootsio](https://github.com/datarootsio), [@jodal](https://github.com/jodal), [@aminalaee](https://github.com/aminalaee), [@rafsaf](https://github.com/rafsaf),\n[@jqueguiner](https://github.com/jqueguiner), [@chdsbd](https://github.com/chdsbd), [@kevinalh](https://github.com/kevinalh), [@Mazyod](https://github.com/Mazyod), [@grillazz](https://github.com/grillazz), [@JonasKs](https://github.com/JonasKs), [@simw](https://github.com/simw), [@leynier](https://github.com/leynier), [@xfenix](https://github.com/xfenix)\nfor their kind support.\n\n### Highlights\n\n* add Python 3.10 support, [#2885](https://github.com/pydantic/pydantic/pull/2885) by [@PrettyWood](https://github.com/PrettyWood)\n* [Discriminated unions](https://docs.pydantic.dev/usage/types/#discriminated-unions-aka-tagged-unions), [#619](https://github.com/pydantic/pydantic/pull/619) by [@PrettyWood](https://github.com/PrettyWood)\n* [`Config.smart_union` for better union logic](https://docs.pydantic.dev/usage/model_config/#smart-union), [#2092](https://github.com/pydantic/pydantic/pull/2092) by [@PrettyWood](https://github.com/PrettyWood)\n* Binaries for Macos M1 CPUs, [#3498](https://github.com/pydantic/pydantic/pull/3498) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Complex types can be set via [nested environment variables](https://docs.pydantic.dev/usage/settings/#parsing-environment-variable-values), e.g. `foo___bar`, [#3159](https://github.com/pydantic/pydantic/pull/3159) by [@Air-Mark](https://github.com/Air-Mark)\n* add a dark mode to _pydantic_ documentation, [#2913](https://github.com/pydantic/pydantic/pull/2913) by [@gbdlin](https://github.com/gbdlin)\n* Add support for autocomplete in VS Code via `__dataclass_transform__`, [#2721](https://github.com/pydantic/pydantic/pull/2721) by [@tiangolo](https://github.com/tiangolo)\n* Add \"exclude\" as a field parameter so that it can be configured using model config, [#660](https://github.com/pydantic/pydantic/pull/660) by [@daviskirk](https://github.com/daviskirk)\n\n### v1.9.0 (2021-12-31) Changes\n\n* Apply `update_forward_refs` to `Config.json_encodes` prevent name clashes in types defined via strings, [#3583](https://github.com/pydantic/pydantic/pull/3583) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Extend pydantic's mypy plugin to support mypy versions `0.910`, `0.920`, `0.921` & `0.930`, [#3573](https://github.com/pydantic/pydantic/pull/3573) & [#3594](https://github.com/pydantic/pydantic/pull/3594) by [@PrettyWood](https://github.com/PrettyWood), [@christianbundy](https://github.com/christianbundy), [@samuelcolvin](https://github.com/samuelcolvin)\n\n### v1.9.0a2 (2021-12-24) Changes\n\n* support generic models with discriminated union, [#3551](https://github.com/pydantic/pydantic/pull/3551) by [@PrettyWood](https://github.com/PrettyWood)\n* keep old behaviour of `json()` by default, [#3542](https://github.com/pydantic/pydantic/pull/3542) by [@PrettyWood](https://github.com/PrettyWood)\n* Removed typing-only `__root__` attribute from `BaseModel`, [#3540](https://github.com/pydantic/pydantic/pull/3540) by [@layday](https://github.com/layday)\n* Build Python 3.10 wheels, [#3539](https://github.com/pydantic/pydantic/pull/3539) by [@mbachry](https://github.com/mbachry)\n* Fix display of `extra` fields with model `__repr__`, [#3234](https://github.com/pydantic/pydantic/pull/3234) by [@cocolman](https://github.com/cocolman)\n* models copied via `Config.copy_on_model_validation` always have all fields, [#3201](https://github.com/pydantic/pydantic/pull/3201) by [@PrettyWood](https://github.com/PrettyWood)\n* nested ORM from nested dictionaries, [#3182](https://github.com/pydantic/pydantic/pull/3182) by [@PrettyWood](https://github.com/PrettyWood)\n* fix link to discriminated union section by [@PrettyWood](https://github.com/PrettyWood)\n\n### v1.9.0a1 (2021-12-18) Changes\n\n* Add support for `Decimal`-specific validation configurations in `Field()`, additionally to using `condecimal()`,\n to allow better support from editors and tooling, [#3507](https://github.com/pydantic/pydantic/pull/3507) by [@tiangolo](https://github.com/tiangolo)\n* Add `arm64` binaries suitable for MacOS with an M1 CPU to PyPI, [#3498](https://github.com/pydantic/pydantic/pull/3498) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Fix issue where `None` was considered invalid when using a `Union` type containing `Any` or `object`, [#3444](https://github.com/pydantic/pydantic/pull/3444) by [@tharradine](https://github.com/tharradine)\n* When generating field schema, pass optional `field` argument (of type\n `pydantic.fields.ModelField`) to `__modify_schema__()` if present, [#3434](https://github.com/pydantic/pydantic/pull/3434) by [@jasujm](https://github.com/jasujm)\n* Fix issue when pydantic fail to parse `typing.ClassVar` string type annotation, [#3401](https://github.com/pydantic/pydantic/pull/3401) by [@uriyyo](https://github.com/uriyyo)\n* Mention Python >= 3.9.2 as an alternative to `typing_extensions.TypedDict`, [#3374](https://github.com/pydantic/pydantic/pull/3374) by [@BvB93](https://github.com/BvB93)\n* Changed the validator method name in the [Custom Errors example](https://docs.pydantic.dev/usage/models/#custom-errors)\n to more accurately describe what the validator is doing; changed from `name_must_contain_space` to ` value_must_equal_bar`, [#3327](https://github.com/pydantic/pydantic/pull/3327) by [@michaelrios28](https://github.com/michaelrios28)\n* Add `AmqpDsn` class, [#3254](https://github.com/pydantic/pydantic/pull/3254) by [@kludex](https://github.com/kludex)\n* Always use `Enum` value as default in generated JSON schema, [#3190](https://github.com/pydantic/pydantic/pull/3190) by [@joaommartins](https://github.com/joaommartins)\n* Add support for Mypy 0.920, [#3175](https://github.com/pydantic/pydantic/pull/3175) by [@christianbundy](https://github.com/christianbundy)\n* `validate_arguments` now supports `extra` customization (used to always be `Extra.forbid`), [#3161](https://github.com/pydantic/pydantic/pull/3161) by [@PrettyWood](https://github.com/PrettyWood)\n* Complex types can be set by nested environment variables, [#3159](https://github.com/pydantic/pydantic/pull/3159) by [@Air-Mark](https://github.com/Air-Mark)\n* Fix mypy plugin to collect fields based on `pydantic.utils.is_valid_field` so that it ignores untyped private variables, [#3146](https://github.com/pydantic/pydantic/pull/3146) by [@hi-ogawa](https://github.com/hi-ogawa)\n* fix `validate_arguments` issue with `Config.validate_all`, [#3135](https://github.com/pydantic/pydantic/pull/3135) by [@PrettyWood](https://github.com/PrettyWood)\n* avoid dict coercion when using dict subclasses as field type, [#3122](https://github.com/pydantic/pydantic/pull/3122) by [@PrettyWood](https://github.com/PrettyWood)\n* add support for `object` type, [#3062](https://github.com/pydantic/pydantic/pull/3062) by [@PrettyWood](https://github.com/PrettyWood)\n* Updates pydantic dataclasses to keep `_special` properties on parent classes, [#3043](https://github.com/pydantic/pydantic/pull/3043) by [@zulrang](https://github.com/zulrang)\n* Add a `TypedDict` class for error objects, [#3038](https://github.com/pydantic/pydantic/pull/3038) by [@matthewhughes934](https://github.com/matthewhughes934)\n* Fix support for using a subclass of an annotation as a default, [#3018](https://github.com/pydantic/pydantic/pull/3018) by [@JacobHayes](https://github.com/JacobHayes)\n* make `create_model_from_typeddict` mypy compliant, [#3008](https://github.com/pydantic/pydantic/pull/3008) by [@PrettyWood](https://github.com/PrettyWood)\n* Make multiple inheritance work when using `PrivateAttr`, [#2989](https://github.com/pydantic/pydantic/pull/2989) by [@hmvp](https://github.com/hmvp)\n* Parse environment variables as JSON, if they have a `Union` type with a complex subfield, [#2936](https://github.com/pydantic/pydantic/pull/2936) by [@cbartz](https://github.com/cbartz)\n* Prevent `StrictStr` permitting `Enum` values where the enum inherits from `str`, [#2929](https://github.com/pydantic/pydantic/pull/2929) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Make `SecretsSettingsSource` parse values being assigned to fields of complex types when sourced from a secrets file,\n just as when sourced from environment variables, [#2917](https://github.com/pydantic/pydantic/pull/2917) by [@davidmreed](https://github.com/davidmreed)\n* add a dark mode to _pydantic_ documentation, [#2913](https://github.com/pydantic/pydantic/pull/2913) by [@gbdlin](https://github.com/gbdlin)\n* Make `pydantic-mypy` plugin compatible with `pyproject.toml` configuration, consistent with `mypy` changes.\n See the [doc](https://docs.pydantic.dev/mypy_plugin/#configuring-the-plugin) for more information, [#2908](https://github.com/pydantic/pydantic/pull/2908) by [@jrwalk](https://github.com/jrwalk)\n* add Python 3.10 support, [#2885](https://github.com/pydantic/pydantic/pull/2885) by [@PrettyWood](https://github.com/PrettyWood)\n* Correctly parse generic models with `Json[T]`, [#2860](https://github.com/pydantic/pydantic/pull/2860) by [@geekingfrog](https://github.com/geekingfrog)\n* Update contrib docs re: Python version to use for building docs, [#2856](https://github.com/pydantic/pydantic/pull/2856) by [@paxcodes](https://github.com/paxcodes)\n* Clarify documentation about _pydantic_'s support for custom validation and strict type checking,\n despite _pydantic_ being primarily a parsing library, [#2855](https://github.com/pydantic/pydantic/pull/2855) by [@paxcodes](https://github.com/paxcodes)\n* Fix schema generation for `Deque` fields, [#2810](https://github.com/pydantic/pydantic/pull/2810) by [@sergejkozin](https://github.com/sergejkozin)\n* fix an edge case when mixing constraints and `Literal`, [#2794](https://github.com/pydantic/pydantic/pull/2794) by [@PrettyWood](https://github.com/PrettyWood)\n* Fix postponed annotation resolution for `NamedTuple` and `TypedDict` when they're used directly as the type of fields\n within Pydantic models, [#2760](https://github.com/pydantic/pydantic/pull/2760) by [@jameysharp](https://github.com/jameysharp)\n* Fix bug when `mypy` plugin fails on `construct` method call for `BaseSettings` derived classes, [#2753](https://github.com/pydantic/pydantic/pull/2753) by [@uriyyo](https://github.com/uriyyo)\n* Add function overloading for a `pydantic.create_model` function, [#2748](https://github.com/pydantic/pydantic/pull/2748) by [@uriyyo](https://github.com/uriyyo)\n* Fix mypy plugin issue with self field declaration, [#2743](https://github.com/pydantic/pydantic/pull/2743) by [@uriyyo](https://github.com/uriyyo)\n* The colon at the end of the line \"The fields which were supplied when user was initialised:\" suggests that the code following it is related.\n Changed it to a period, [#2733](https://github.com/pydantic/pydantic/pull/2733) by [@krisaoe](https://github.com/krisaoe)\n* Renamed variable `schema` to `schema_` to avoid shadowing of global variable name, [#2724](https://github.com/pydantic/pydantic/pull/2724) by [@shahriyarr](https://github.com/shahriyarr)\n* Add support for autocomplete in VS Code via `__dataclass_transform__`, [#2721](https://github.com/pydantic/pydantic/pull/2721) by [@tiangolo](https://github.com/tiangolo)\n* add missing type annotations in `BaseConfig` and handle `max_length = 0`, [#2719](https://github.com/pydantic/pydantic/pull/2719) by [@PrettyWood](https://github.com/PrettyWood)\n* Change `orm_mode` checking to allow recursive ORM mode parsing with dicts, [#2718](https://github.com/pydantic/pydantic/pull/2718) by [@nuno-andre](https://github.com/nuno-andre)\n* Add episode 313 of the *Talk Python To Me* podcast, where Michael Kennedy and Samuel Colvin discuss Pydantic, to the docs, [#2712](https://github.com/pydantic/pydantic/pull/2712) by [@RatulMaharaj](https://github.com/RatulMaharaj)\n* fix JSON schema generation when a field is of type `NamedTuple` and has a default value, [#2707](https://github.com/pydantic/pydantic/pull/2707) by [@PrettyWood](https://github.com/PrettyWood)\n* `Enum` fields now properly support extra kwargs in schema generation, [#2697](https://github.com/pydantic/pydantic/pull/2697) by [@sammchardy](https://github.com/sammchardy)\n* **Breaking Change, see [#3780](https://github.com/pydantic/pydantic/pull/3780)**: Make serialization of referenced pydantic models possible, [#2650](https://github.com/pydantic/pydantic/pull/2650) by [@PrettyWood](https://github.com/PrettyWood)\n* Add `uniqueItems` option to `ConstrainedList`, [#2618](https://github.com/pydantic/pydantic/pull/2618) by [@nuno-andre](https://github.com/nuno-andre)\n* Try to evaluate forward refs automatically at model creation, [#2588](https://github.com/pydantic/pydantic/pull/2588) by [@uriyyo](https://github.com/uriyyo)\n* Switch docs preview and coverage display to use [smokeshow](https://smokeshow.helpmanual.io/), [#2580](https://github.com/pydantic/pydantic/pull/2580) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Add `__version__` attribute to pydantic module, [#2572](https://github.com/pydantic/pydantic/pull/2572) by [@paxcodes](https://github.com/paxcodes)\n* Add `postgresql+asyncpg`, `postgresql+pg8000`, `postgresql+psycopg2`, `postgresql+psycopg2cffi`, `postgresql+py-postgresql`\n and `postgresql+pygresql` schemes for `PostgresDsn`, [#2567](https://github.com/pydantic/pydantic/pull/2567) by [@postgres-asyncpg](https://github.com/postgres-asyncpg)\n* Enable the Hypothesis plugin to generate a constrained decimal when the `decimal_places` argument is specified, [#2524](https://github.com/pydantic/pydantic/pull/2524) by [@cwe5590](https://github.com/cwe5590)\n* Allow `collections.abc.Callable` to be used as type in Python 3.9, [#2519](https://github.com/pydantic/pydantic/pull/2519) by [@daviskirk](https://github.com/daviskirk)\n* Documentation update how to custom compile pydantic when using pip install, small change in `setup.py`\n to allow for custom CFLAGS when compiling, [#2517](https://github.com/pydantic/pydantic/pull/2517) by [@peterroelants](https://github.com/peterroelants)\n* remove side effect of `default_factory` to run it only once even if `Config.validate_all` is set, [#2515](https://github.com/pydantic/pydantic/pull/2515) by [@PrettyWood](https://github.com/PrettyWood)\n* Add lookahead to ip regexes for `AnyUrl` hosts. This allows urls with DNS labels\n looking like IPs to validate as they are perfectly valid host names, [#2512](https://github.com/pydantic/pydantic/pull/2512) by [@sbv-csis](https://github.com/sbv-csis)\n* Set `minItems` and `maxItems` in generated JSON schema for fixed-length tuples, [#2497](https://github.com/pydantic/pydantic/pull/2497) by [@PrettyWood](https://github.com/PrettyWood)\n* Add `strict` argument to `conbytes`, [#2489](https://github.com/pydantic/pydantic/pull/2489) by [@koxudaxi](https://github.com/koxudaxi)\n* Support user defined generic field types in generic models, [#2465](https://github.com/pydantic/pydantic/pull/2465) by [@daviskirk](https://github.com/daviskirk)\n* Add an example and a short explanation of subclassing `GetterDict` to docs, [#2463](https://github.com/pydantic/pydantic/pull/2463) by [@nuno-andre](https://github.com/nuno-andre)\n* add `KafkaDsn` type, `HttpUrl` now has default port 80 for http and 443 for https, [#2447](https://github.com/pydantic/pydantic/pull/2447) by [@MihanixA](https://github.com/MihanixA)\n* Add `PastDate` and `FutureDate` types, [#2425](https://github.com/pydantic/pydantic/pull/2425) by [@Kludex](https://github.com/Kludex)\n* Support generating schema for `Generic` fields with subtypes, [#2375](https://github.com/pydantic/pydantic/pull/2375) by [@maximberg](https://github.com/maximberg)\n* fix(encoder): serialize `NameEmail` to str, [#2341](https://github.com/pydantic/pydantic/pull/2341) by [@alecgerona](https://github.com/alecgerona)\n* add `Config.smart_union` to prevent coercion in `Union` if possible, see\n [the doc](https://docs.pydantic.dev/usage/model_config/#smart-union) for more information, [#2092](https://github.com/pydantic/pydantic/pull/2092) by [@PrettyWood](https://github.com/PrettyWood)\n* Add ability to use `typing.Counter` as a model field type, [#2060](https://github.com/pydantic/pydantic/pull/2060) by [@uriyyo](https://github.com/uriyyo)\n* Add parameterised subclasses to `__bases__` when constructing new parameterised classes, so that `A <: B => A[int] <: B[int]`, [#2007](https://github.com/pydantic/pydantic/pull/2007) by [@diabolo-dan](https://github.com/diabolo-dan)\n* Create `FileUrl` type that allows URLs that conform to [RFC 8089](https://tools.ietf.org/html/rfc8089#section-2).\n Add `host_required` parameter, which is `True` by default (`AnyUrl` and subclasses), `False` in `RedisDsn`, `FileUrl`, [#1983](https://github.com/pydantic/pydantic/pull/1983) by [@vgerak](https://github.com/vgerak)\n* add `confrozenset()`, analogous to `conset()` and `conlist()`, [#1897](https://github.com/pydantic/pydantic/pull/1897) by [@PrettyWood](https://github.com/PrettyWood)\n* stop calling parent class `root_validator` if overridden, [#1895](https://github.com/pydantic/pydantic/pull/1895) by [@PrettyWood](https://github.com/PrettyWood)\n* Add `repr` (defaults to `True`) parameter to `Field`, to hide it from the default representation of the `BaseModel`, [#1831](https://github.com/pydantic/pydantic/pull/1831) by [@fnep](https://github.com/fnep)\n* Accept empty query/fragment URL parts, [#1807](https://github.com/pydantic/pydantic/pull/1807) by [@xavier](https://github.com/xavier)\n\n## v1.8.2 (2021-05-11)\n\n!!! warning\n A security vulnerability, level \"moderate\" is fixed in v1.8.2. Please upgrade **ASAP**.\n See security advisory [CVE-2021-29510](https://github.com/pydantic/pydantic/security/advisories/GHSA-5jqp-qgf6-3pvh)\n\n* **Security fix:** Fix `date` and `datetime` parsing so passing either `'infinity'` or `float('inf')`\n (or their negative values) does not cause an infinite loop,\n see security advisory [CVE-2021-29510](https://github.com/pydantic/pydantic/security/advisories/GHSA-5jqp-qgf6-3pvh)\n* fix schema generation with Enum by generating a valid name, [#2575](https://github.com/pydantic/pydantic/pull/2575) by [@PrettyWood](https://github.com/PrettyWood)\n* fix JSON schema generation with a `Literal` of an enum member, [#2536](https://github.com/pydantic/pydantic/pull/2536) by [@PrettyWood](https://github.com/PrettyWood)\n* Fix bug with configurations declarations that are passed as\n keyword arguments during class creation, [#2532](https://github.com/pydantic/pydantic/pull/2532) by [@uriyyo](https://github.com/uriyyo)\n* Allow passing `json_encoders` in class kwargs, [#2521](https://github.com/pydantic/pydantic/pull/2521) by [@layday](https://github.com/layday)\n* support arbitrary types with custom `__eq__`, [#2483](https://github.com/pydantic/pydantic/pull/2483) by [@PrettyWood](https://github.com/PrettyWood)\n* support `Annotated` in `validate_arguments` and in generic models with Python 3.9, [#2483](https://github.com/pydantic/pydantic/pull/2483) by [@PrettyWood](https://github.com/PrettyWood)\n\n## v1.8.1 (2021-03-03)\n\nBug fixes for regressions and new features from `v1.8`\n\n* allow elements of `Config.field` to update elements of a `Field`, [#2461](https://github.com/pydantic/pydantic/pull/2461) by [@samuelcolvin](https://github.com/samuelcolvin)\n* fix validation with a `BaseModel` field and a custom root type, [#2449](https://github.com/pydantic/pydantic/pull/2449) by [@PrettyWood](https://github.com/PrettyWood)\n* expose `Pattern` encoder to `fastapi`, [#2444](https://github.com/pydantic/pydantic/pull/2444) by [@PrettyWood](https://github.com/PrettyWood)\n* enable the Hypothesis plugin to generate a constrained float when the `multiple_of` argument is specified, [#2442](https://github.com/pydantic/pydantic/pull/2442) by [@tobi-lipede-oodle](https://github.com/tobi-lipede-oodle)\n* Avoid `RecursionError` when using some types like `Enum` or `Literal` with generic models, [#2436](https://github.com/pydantic/pydantic/pull/2436) by [@PrettyWood](https://github.com/PrettyWood)\n* do not overwrite declared `__hash__` in subclasses of a model, [#2422](https://github.com/pydantic/pydantic/pull/2422) by [@PrettyWood](https://github.com/PrettyWood)\n* fix `mypy` complaints on `Path` and `UUID` related custom types, [#2418](https://github.com/pydantic/pydantic/pull/2418) by [@PrettyWood](https://github.com/PrettyWood)\n* Support properly variable length tuples of compound types, [#2416](https://github.com/pydantic/pydantic/pull/2416) by [@PrettyWood](https://github.com/PrettyWood)\n\n## v1.8 (2021-02-26)\n\nThank you to pydantic's sponsors:\n[@jorgecarleitao](https://github.com/jorgecarleitao), [@BCarley](https://github.com/BCarley), [@chdsbd](https://github.com/chdsbd), [@tiangolo](https://github.com/tiangolo), [@matin](https://github.com/matin), [@linusg](https://github.com/linusg), [@kevinalh](https://github.com/kevinalh), [@koxudaxi](https://github.com/koxudaxi), [@timdrijvers](https://github.com/timdrijvers), [@mkeen](https://github.com/mkeen), [@meadsteve](https://github.com/meadsteve),\n[@ginomempin](https://github.com/ginomempin), [@primer-io](https://github.com/primer-io), [@and-semakin](https://github.com/and-semakin), [@tomthorogood](https://github.com/tomthorogood), [@AjitZK](https://github.com/AjitZK), [@westonsteimel](https://github.com/westonsteimel), [@Mazyod](https://github.com/Mazyod), [@christippett](https://github.com/christippett), [@CarlosDomingues](https://github.com/CarlosDomingues),\n[@Kludex](https://github.com/Kludex), [@r-m-n](https://github.com/r-m-n)\nfor their kind support.\n\n### Highlights\n\n* [Hypothesis plugin](https://docs.pydantic.dev/hypothesis_plugin/) for testing, [#2097](https://github.com/pydantic/pydantic/pull/2097) by [@Zac-HD](https://github.com/Zac-HD)\n* support for [`NamedTuple` and `TypedDict`](https://docs.pydantic.dev/usage/types/#annotated-types), [#2216](https://github.com/pydantic/pydantic/pull/2216) by [@PrettyWood](https://github.com/PrettyWood)\n* Support [`Annotated` hints on model fields](https://docs.pydantic.dev/usage/schema/#typingannotated-fields), [#2147](https://github.com/pydantic/pydantic/pull/2147) by [@JacobHayes](https://github.com/JacobHayes)\n* [`frozen` parameter on `Config`](https://docs.pydantic.dev/usage/model_config/) to allow models to be hashed, [#1880](https://github.com/pydantic/pydantic/pull/1880) by [@rhuille](https://github.com/rhuille)\n\n### Changes\n\n* **Breaking Change**, remove old deprecation aliases from v1, [#2415](https://github.com/pydantic/pydantic/pull/2415) by [@samuelcolvin](https://github.com/samuelcolvin):\n * remove notes on migrating to v1 in docs\n * remove `Schema` which was replaced by `Field`\n * remove `Config.case_insensitive` which was replaced by `Config.case_sensitive` (default `False`)\n * remove `Config.allow_population_by_alias` which was replaced by `Config.allow_population_by_field_name`\n * remove `model.fields` which was replaced by `model.__fields__`\n * remove `model.to_string()` which was replaced by `str(model)`\n * remove `model.__values__` which was replaced by `model.__dict__`\n* **Breaking Change:** always validate only first sublevel items with `each_item`.\n There were indeed some edge cases with some compound types where the validated items were the last sublevel ones, [#1933](https://github.com/pydantic/pydantic/pull/1933) by [@PrettyWood](https://github.com/PrettyWood)\n* Update docs extensions to fix local syntax highlighting, [#2400](https://github.com/pydantic/pydantic/pull/2400) by [@daviskirk](https://github.com/daviskirk)\n* fix: allow `utils.lenient_issubclass` to handle `typing.GenericAlias` objects like `list[str]` in Python >= 3.9, [#2399](https://github.com/pydantic/pydantic/pull/2399) by [@daviskirk](https://github.com/daviskirk)\n* Improve field declaration for _pydantic_ `dataclass` by allowing the usage of _pydantic_ `Field` or `'metadata'` kwarg of `dataclasses.field`, [#2384](https://github.com/pydantic/pydantic/pull/2384) by [@PrettyWood](https://github.com/PrettyWood)\n* Making `typing-extensions` a required dependency, [#2368](https://github.com/pydantic/pydantic/pull/2368) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Make `resolve_annotations` more lenient, allowing for missing modules, [#2363](https://github.com/pydantic/pydantic/pull/2363) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Allow configuring models through class kwargs, [#2356](https://github.com/pydantic/pydantic/pull/2356) by [@Bobronium](https://github.com/Bobronium)\n* Prevent `Mapping` subclasses from always being coerced to `dict`, [#2325](https://github.com/pydantic/pydantic/pull/2325) by [@ofek](https://github.com/ofek)\n* fix: allow `None` for type `Optional[conset / conlist]`, [#2320](https://github.com/pydantic/pydantic/pull/2320) by [@PrettyWood](https://github.com/PrettyWood)\n* Support empty tuple type, [#2318](https://github.com/pydantic/pydantic/pull/2318) by [@PrettyWood](https://github.com/PrettyWood)\n* fix: `python_requires` metadata to require >=3.6.1, [#2306](https://github.com/pydantic/pydantic/pull/2306) by [@hukkinj1](https://github.com/hukkinj1)\n* Properly encode `Decimal` with, or without any decimal places, [#2293](https://github.com/pydantic/pydantic/pull/2293) by [@hultner](https://github.com/hultner)\n* fix: update `__fields_set__` in `BaseModel.copy(update=…)`, [#2290](https://github.com/pydantic/pydantic/pull/2290) by [@PrettyWood](https://github.com/PrettyWood)\n* fix: keep order of fields with `BaseModel.construct()`, [#2281](https://github.com/pydantic/pydantic/pull/2281) by [@PrettyWood](https://github.com/PrettyWood)\n* Support generating schema for Generic fields, [#2262](https://github.com/pydantic/pydantic/pull/2262) by [@maximberg](https://github.com/maximberg)\n* Fix `validate_decorator` so `**kwargs` doesn't exclude values when the keyword\n has the same name as the `*args` or `**kwargs` names, [#2251](https://github.com/pydantic/pydantic/pull/2251) by [@cybojenix](https://github.com/cybojenix)\n* Prevent overriding positional arguments with keyword arguments in\n `validate_arguments`, as per behaviour with native functions, [#2249](https://github.com/pydantic/pydantic/pull/2249) by [@cybojenix](https://github.com/cybojenix)\n* add documentation for `con*` type functions, [#2242](https://github.com/pydantic/pydantic/pull/2242) by [@tayoogunbiyi](https://github.com/tayoogunbiyi)\n* Support custom root type (aka `__root__`) when using `parse_obj()` with nested models, [#2238](https://github.com/pydantic/pydantic/pull/2238) by [@PrettyWood](https://github.com/PrettyWood)\n* Support custom root type (aka `__root__`) with `from_orm()`, [#2237](https://github.com/pydantic/pydantic/pull/2237) by [@PrettyWood](https://github.com/PrettyWood)\n* ensure cythonized functions are left untouched when creating models, based on [#1944](https://github.com/pydantic/pydantic/pull/1944) by [@kollmats](https://github.com/kollmats), [#2228](https://github.com/pydantic/pydantic/pull/2228) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Resolve forward refs for stdlib dataclasses converted into _pydantic_ ones, [#2220](https://github.com/pydantic/pydantic/pull/2220) by [@PrettyWood](https://github.com/PrettyWood)\n* Add support for `NamedTuple` and `TypedDict` types.\n Those two types are now handled and validated when used inside `BaseModel` or _pydantic_ `dataclass`.\n Two utils are also added `create_model_from_namedtuple` and `create_model_from_typeddict`, [#2216](https://github.com/pydantic/pydantic/pull/2216) by [@PrettyWood](https://github.com/PrettyWood)\n* Do not ignore annotated fields when type is `Union[Type[...], ...]`, [#2213](https://github.com/pydantic/pydantic/pull/2213) by [@PrettyWood](https://github.com/PrettyWood)\n* Raise a user-friendly `TypeError` when a `root_validator` does not return a `dict` (e.g. `None`), [#2209](https://github.com/pydantic/pydantic/pull/2209) by [@masalim2](https://github.com/masalim2)\n* Add a `FrozenSet[str]` type annotation to the `allowed_schemes` argument on the `strict_url` field type, [#2198](https://github.com/pydantic/pydantic/pull/2198) by [@Midnighter](https://github.com/Midnighter)\n* add `allow_mutation` constraint to `Field`, [#2195](https://github.com/pydantic/pydantic/pull/2195) by [@sblack-usu](https://github.com/sblack-usu)\n* Allow `Field` with a `default_factory` to be used as an argument to a function\n decorated with `validate_arguments`, [#2176](https://github.com/pydantic/pydantic/pull/2176) by [@thomascobb](https://github.com/thomascobb)\n* Allow non-existent secrets directory by only issuing a warning, [#2175](https://github.com/pydantic/pydantic/pull/2175) by [@davidolrik](https://github.com/davidolrik)\n* fix URL regex to parse fragment without query string, [#2168](https://github.com/pydantic/pydantic/pull/2168) by [@andrewmwhite](https://github.com/andrewmwhite)\n* fix: ensure to always return one of the values in `Literal` field type, [#2166](https://github.com/pydantic/pydantic/pull/2166) by [@PrettyWood](https://github.com/PrettyWood)\n* Support `typing.Annotated` hints on model fields. A `Field` may now be set in the type hint with `Annotated[..., Field(...)`; all other annotations are ignored but still visible with `get_type_hints(..., include_extras=True)`, [#2147](https://github.com/pydantic/pydantic/pull/2147) by [@JacobHayes](https://github.com/JacobHayes)\n* Added `StrictBytes` type as well as `strict=False` option to `ConstrainedBytes`, [#2136](https://github.com/pydantic/pydantic/pull/2136) by [@rlizzo](https://github.com/rlizzo)\n* added `Config.anystr_lower` and `to_lower` kwarg to `constr` and `conbytes`, [#2134](https://github.com/pydantic/pydantic/pull/2134) by [@tayoogunbiyi](https://github.com/tayoogunbiyi)\n* Support plain `typing.Tuple` type, [#2132](https://github.com/pydantic/pydantic/pull/2132) by [@PrettyWood](https://github.com/PrettyWood)\n* Add a bound method `validate` to functions decorated with `validate_arguments`\n to validate parameters without actually calling the function, [#2127](https://github.com/pydantic/pydantic/pull/2127) by [@PrettyWood](https://github.com/PrettyWood)\n* Add the ability to customize settings sources (add / disable / change priority order), [#2107](https://github.com/pydantic/pydantic/pull/2107) by [@kozlek](https://github.com/kozlek)\n* Fix mypy complaints about most custom _pydantic_ types, [#2098](https://github.com/pydantic/pydantic/pull/2098) by [@PrettyWood](https://github.com/PrettyWood)\n* Add a [Hypothesis](https://hypothesis.readthedocs.io/) plugin for easier [property-based testing](https://increment.com/testing/in-praise-of-property-based-testing/) with Pydantic's custom types - [usage details here](https://docs.pydantic.dev/hypothesis_plugin/), [#2097](https://github.com/pydantic/pydantic/pull/2097) by [@Zac-HD](https://github.com/Zac-HD)\n* add validator for `None`, `NoneType` or `Literal[None]`, [#2095](https://github.com/pydantic/pydantic/pull/2095) by [@PrettyWood](https://github.com/PrettyWood)\n* Handle properly fields of type `Callable` with a default value, [#2094](https://github.com/pydantic/pydantic/pull/2094) by [@PrettyWood](https://github.com/PrettyWood)\n* Updated `create_model` return type annotation to return type which inherits from `__base__` argument, [#2071](https://github.com/pydantic/pydantic/pull/2071) by [@uriyyo](https://github.com/uriyyo)\n* Add merged `json_encoders` inheritance, [#2064](https://github.com/pydantic/pydantic/pull/2064) by [@art049](https://github.com/art049)\n* allow overwriting `ClassVar`s in sub-models without having to re-annotate them, [#2061](https://github.com/pydantic/pydantic/pull/2061) by [@layday](https://github.com/layday)\n* add default encoder for `Pattern` type, [#2045](https://github.com/pydantic/pydantic/pull/2045) by [@PrettyWood](https://github.com/PrettyWood)\n* Add `NonNegativeInt`, `NonPositiveInt`, `NonNegativeFloat`, `NonPositiveFloat`, [#1975](https://github.com/pydantic/pydantic/pull/1975) by [@mdavis-xyz](https://github.com/mdavis-xyz)\n* Use % for percentage in string format of colors, [#1960](https://github.com/pydantic/pydantic/pull/1960) by [@EdwardBetts](https://github.com/EdwardBetts)\n* Fixed issue causing `KeyError` to be raised when building schema from multiple `BaseModel` with the same names declared in separate classes, [#1912](https://github.com/pydantic/pydantic/pull/1912) by [@JSextonn](https://github.com/JSextonn)\n* Add `rediss` (Redis over SSL) protocol to `RedisDsn`\n Allow URLs without `user` part (e.g., `rediss://:pass@localhost`), [#1911](https://github.com/pydantic/pydantic/pull/1911) by [@TrDex](https://github.com/TrDex)\n* Add a new `frozen` boolean parameter to `Config` (default: `False`).\n Setting `frozen=True` does everything that `allow_mutation=False` does, and also generates a `__hash__()` method for the model. This makes instances of the model potentially hashable if all the attributes are hashable, [#1880](https://github.com/pydantic/pydantic/pull/1880) by [@rhuille](https://github.com/rhuille)\n* fix schema generation with multiple Enums having the same name, [#1857](https://github.com/pydantic/pydantic/pull/1857) by [@PrettyWood](https://github.com/PrettyWood)\n* Added support for 13/19 digits VISA credit cards in `PaymentCardNumber` type, [#1416](https://github.com/pydantic/pydantic/pull/1416) by [@AlexanderSov](https://github.com/AlexanderSov)\n* fix: prevent `RecursionError` while using recursive `GenericModel`s, [#1370](https://github.com/pydantic/pydantic/pull/1370) by [@xppt](https://github.com/xppt)\n* use `enum` for `typing.Literal` in JSON schema, [#1350](https://github.com/pydantic/pydantic/pull/1350) by [@PrettyWood](https://github.com/PrettyWood)\n* Fix: some recursive models did not require `update_forward_refs` and silently behaved incorrectly, [#1201](https://github.com/pydantic/pydantic/pull/1201) by [@PrettyWood](https://github.com/PrettyWood)\n* Fix bug where generic models with fields where the typevar is nested in another type `a: List[T]` are considered to be concrete. This allows these models to be subclassed and composed as expected, [#947](https://github.com/pydantic/pydantic/pull/947) by [@daviskirk](https://github.com/daviskirk)\n* Add `Config.copy_on_model_validation` flag. When set to `False`, _pydantic_ will keep models used as fields\n untouched on validation instead of reconstructing (copying) them, [#265](https://github.com/pydantic/pydantic/pull/265) by [@PrettyWood](https://github.com/PrettyWood)\n\n## v1.7.4 (2021-05-11)\n\n* **Security fix:** Fix `date` and `datetime` parsing so passing either `'infinity'` or `float('inf')`\n (or their negative values) does not cause an infinite loop,\n See security advisory [CVE-2021-29510](https://github.com/pydantic/pydantic/security/advisories/GHSA-5jqp-qgf6-3pvh)\n\n## v1.7.3 (2020-11-30)\n\nThank you to pydantic's sponsors:\n[@timdrijvers](https://github.com/timdrijvers), [@BCarley](https://github.com/BCarley), [@chdsbd](https://github.com/chdsbd), [@tiangolo](https://github.com/tiangolo), [@matin](https://github.com/matin), [@linusg](https://github.com/linusg), [@kevinalh](https://github.com/kevinalh), [@jorgecarleitao](https://github.com/jorgecarleitao), [@koxudaxi](https://github.com/koxudaxi), [@primer-api](https://github.com/primer-api),\n[@mkeen](https://github.com/mkeen), [@meadsteve](https://github.com/meadsteve) for their kind support.\n\n* fix: set right default value for required (optional) fields, [#2142](https://github.com/pydantic/pydantic/pull/2142) by [@PrettyWood](https://github.com/PrettyWood)\n* fix: support `underscore_attrs_are_private` with generic models, [#2138](https://github.com/pydantic/pydantic/pull/2138) by [@PrettyWood](https://github.com/PrettyWood)\n* fix: update all modified field values in `root_validator` when `validate_assignment` is on, [#2116](https://github.com/pydantic/pydantic/pull/2116) by [@PrettyWood](https://github.com/PrettyWood)\n* Allow pickling of `pydantic.dataclasses.dataclass` dynamically created from a built-in `dataclasses.dataclass`, [#2111](https://github.com/pydantic/pydantic/pull/2111) by [@aimestereo](https://github.com/aimestereo)\n* Fix a regression where Enum fields would not propagate keyword arguments to the schema, [#2109](https://github.com/pydantic/pydantic/pull/2109) by [@bm424](https://github.com/bm424)\n* Ignore `__doc__` as private attribute when `Config.underscore_attrs_are_private` is set, [#2090](https://github.com/pydantic/pydantic/pull/2090) by [@PrettyWood](https://github.com/PrettyWood)\n\n## v1.7.2 (2020-11-01)\n\n* fix slow `GenericModel` concrete model creation, allow `GenericModel` concrete name reusing in module, [#2078](https://github.com/pydantic/pydantic/pull/2078) by [@Bobronium](https://github.com/Bobronium)\n* keep the order of the fields when `validate_assignment` is set, [#2073](https://github.com/pydantic/pydantic/pull/2073) by [@PrettyWood](https://github.com/PrettyWood)\n* forward all the params of the stdlib `dataclass` when converted into _pydantic_ `dataclass`, [#2065](https://github.com/pydantic/pydantic/pull/2065) by [@PrettyWood](https://github.com/PrettyWood)\n\n## v1.7.1 (2020-10-28)\n\nThank you to pydantic's sponsors:\n[@timdrijvers](https://github.com/timdrijvers), [@BCarley](https://github.com/BCarley), [@chdsbd](https://github.com/chdsbd), [@tiangolo](https://github.com/tiangolo), [@matin](https://github.com/matin), [@linusg](https://github.com/linusg), [@kevinalh](https://github.com/kevinalh), [@jorgecarleitao](https://github.com/jorgecarleitao), [@koxudaxi](https://github.com/koxudaxi), [@primer-api](https://github.com/primer-api), [@mkeen](https://github.com/mkeen)\nfor their kind support.\n\n* fix annotation of `validate_arguments` when passing configuration as argument, [#2055](https://github.com/pydantic/pydantic/pull/2055) by [@layday](https://github.com/layday)\n* Fix mypy assignment error when using `PrivateAttr`, [#2048](https://github.com/pydantic/pydantic/pull/2048) by [@aphedges](https://github.com/aphedges)\n* fix `underscore_attrs_are_private` causing `TypeError` when overriding `__init__`, [#2047](https://github.com/pydantic/pydantic/pull/2047) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Fixed regression introduced in v1.7 involving exception handling in field validators when `validate_assignment=True`, [#2044](https://github.com/pydantic/pydantic/pull/2044) by [@johnsabath](https://github.com/johnsabath)\n* fix: _pydantic_ `dataclass` can inherit from stdlib `dataclass`\n and `Config.arbitrary_types_allowed` is supported, [#2042](https://github.com/pydantic/pydantic/pull/2042) by [@PrettyWood](https://github.com/PrettyWood)\n\n## v1.7 (2020-10-26)\n\nThank you to pydantic's sponsors:\n[@timdrijvers](https://github.com/timdrijvers), [@BCarley](https://github.com/BCarley), [@chdsbd](https://github.com/chdsbd), [@tiangolo](https://github.com/tiangolo), [@matin](https://github.com/matin), [@linusg](https://github.com/linusg), [@kevinalh](https://github.com/kevinalh), [@jorgecarleitao](https://github.com/jorgecarleitao), [@koxudaxi](https://github.com/koxudaxi), [@primer-api](https://github.com/primer-api)\nfor their kind support.\n\n### Highlights\n\n* Python 3.9 support, thanks [@PrettyWood](https://github.com/PrettyWood)\n* [Private model attributes](https://docs.pydantic.dev/usage/models/#private-model-attributes), thanks [@Bobronium](https://github.com/Bobronium)\n* [\"secrets files\" support in `BaseSettings`](https://docs.pydantic.dev/usage/settings/#secret-support), thanks [@mdgilene](https://github.com/mdgilene)\n* [convert stdlib dataclasses to pydantic dataclasses and use stdlib dataclasses in models](https://docs.pydantic.dev/usage/dataclasses/#stdlib-dataclasses-and-pydantic-dataclasses), thanks [@PrettyWood](https://github.com/PrettyWood)\n\n### Changes\n\n* **Breaking Change:** remove `__field_defaults__`, add `default_factory` support with `BaseModel.construct`.\n Use `.get_default()` method on fields in `__fields__` attribute instead, [#1732](https://github.com/pydantic/pydantic/pull/1732) by [@PrettyWood](https://github.com/PrettyWood)\n* Rearrange CI to run linting as a separate job, split install recipes for different tasks, [#2020](https://github.com/pydantic/pydantic/pull/2020) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Allows subclasses of generic models to make some, or all, of the superclass's type parameters concrete, while\n also defining new type parameters in the subclass, [#2005](https://github.com/pydantic/pydantic/pull/2005) by [@choogeboom](https://github.com/choogeboom)\n* Call validator with the correct `values` parameter type in `BaseModel.__setattr__`,\n when `validate_assignment = True` in model config, [#1999](https://github.com/pydantic/pydantic/pull/1999) by [@me-ransh](https://github.com/me-ransh)\n* Force `fields.Undefined` to be a singleton object, fixing inherited generic model schemas, [#1981](https://github.com/pydantic/pydantic/pull/1981) by [@daviskirk](https://github.com/daviskirk)\n* Include tests in source distributions, [#1976](https://github.com/pydantic/pydantic/pull/1976) by [@sbraz](https://github.com/sbraz)\n* Add ability to use `min_length/max_length` constraints with secret types, [#1974](https://github.com/pydantic/pydantic/pull/1974) by [@uriyyo](https://github.com/uriyyo)\n* Also check `root_validators` when `validate_assignment` is on, [#1971](https://github.com/pydantic/pydantic/pull/1971) by [@PrettyWood](https://github.com/PrettyWood)\n* Fix const validators not running when custom validators are present, [#1957](https://github.com/pydantic/pydantic/pull/1957) by [@hmvp](https://github.com/hmvp)\n* add `deque` to field types, [#1935](https://github.com/pydantic/pydantic/pull/1935) by [@wozniakty](https://github.com/wozniakty)\n* add basic support for Python 3.9, [#1832](https://github.com/pydantic/pydantic/pull/1832) by [@PrettyWood](https://github.com/PrettyWood)\n* Fix typo in the anchor of exporting_models.md#modelcopy and incorrect description, [#1821](https://github.com/pydantic/pydantic/pull/1821) by [@KimMachineGun](https://github.com/KimMachineGun)\n* Added ability for `BaseSettings` to read \"secret files\", [#1820](https://github.com/pydantic/pydantic/pull/1820) by [@mdgilene](https://github.com/mdgilene)\n* add `parse_raw_as` utility function, [#1812](https://github.com/pydantic/pydantic/pull/1812) by [@PrettyWood](https://github.com/PrettyWood)\n* Support home directory relative paths for `dotenv` files (e.g. `~/.env`), [#1803](https://github.com/pydantic/pydantic/pull/1803) by [@PrettyWood](https://github.com/PrettyWood)\n* Clarify documentation for `parse_file` to show that the argument\n should be a file *path* not a file-like object, [#1794](https://github.com/pydantic/pydantic/pull/1794) by [@mdavis-xyz](https://github.com/mdavis-xyz)\n* Fix false positive from mypy plugin when a class nested within a `BaseModel` is named `Model`, [#1770](https://github.com/pydantic/pydantic/pull/1770) by [@selimb](https://github.com/selimb)\n* add basic support of Pattern type in schema generation, [#1767](https://github.com/pydantic/pydantic/pull/1767) by [@PrettyWood](https://github.com/PrettyWood)\n* Support custom title, description and default in schema of enums, [#1748](https://github.com/pydantic/pydantic/pull/1748) by [@PrettyWood](https://github.com/PrettyWood)\n* Properly represent `Literal` Enums when `use_enum_values` is True, [#1747](https://github.com/pydantic/pydantic/pull/1747) by [@noelevans](https://github.com/noelevans)\n* Allows timezone information to be added to strings to be formatted as time objects. Permitted formats are `Z` for UTC\n or an offset for absolute positive or negative time shifts. Or the timezone data can be omitted, [#1744](https://github.com/pydantic/pydantic/pull/1744) by [@noelevans](https://github.com/noelevans)\n* Add stub `__init__` with Python 3.6 signature for `ForwardRef`, [#1738](https://github.com/pydantic/pydantic/pull/1738) by [@sirtelemak](https://github.com/sirtelemak)\n* Fix behaviour with forward refs and optional fields in nested models, [#1736](https://github.com/pydantic/pydantic/pull/1736) by [@PrettyWood](https://github.com/PrettyWood)\n* add `Enum` and `IntEnum` as valid types for fields, [#1735](https://github.com/pydantic/pydantic/pull/1735) by [@PrettyWood](https://github.com/PrettyWood)\n* Change default value of `__module__` argument of `create_model` from `None` to `'pydantic.main'`.\n Set reference of created concrete model to it's module to allow pickling (not applied to models created in\n functions), [#1686](https://github.com/pydantic/pydantic/pull/1686) by [@Bobronium](https://github.com/Bobronium)\n* Add private attributes support, [#1679](https://github.com/pydantic/pydantic/pull/1679) by [@Bobronium](https://github.com/Bobronium)\n* add `config` to `@validate_arguments`, [#1663](https://github.com/pydantic/pydantic/pull/1663) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Allow descendant Settings models to override env variable names for the fields defined in parent Settings models with\n `env` in their `Config`. Previously only `env_prefix` configuration option was applicable, [#1561](https://github.com/pydantic/pydantic/pull/1561) by [@ojomio](https://github.com/ojomio)\n* Support `ref_template` when creating schema `$ref`s, [#1479](https://github.com/pydantic/pydantic/pull/1479) by [@kilo59](https://github.com/kilo59)\n* Add a `__call__` stub to `PyObject` so that mypy will know that it is callable, [#1352](https://github.com/pydantic/pydantic/pull/1352) by [@brianmaissy](https://github.com/brianmaissy)\n* `pydantic.dataclasses.dataclass` decorator now supports built-in `dataclasses.dataclass`.\n It is hence possible to convert an existing `dataclass` easily to add Pydantic validation.\n Moreover nested dataclasses are also supported, [#744](https://github.com/pydantic/pydantic/pull/744) by [@PrettyWood](https://github.com/PrettyWood)\n\n## v1.6.2 (2021-05-11)\n\n* **Security fix:** Fix `date` and `datetime` parsing so passing either `'infinity'` or `float('inf')`\n (or their negative values) does not cause an infinite loop,\n See security advisory [CVE-2021-29510](https://github.com/pydantic/pydantic/security/advisories/GHSA-5jqp-qgf6-3pvh)\n\n## v1.6.1 (2020-07-15)\n\n* fix validation and parsing of nested models with `default_factory`, [#1710](https://github.com/pydantic/pydantic/pull/1710) by [@PrettyWood](https://github.com/PrettyWood)\n\n## v1.6 (2020-07-11)\n\nThank you to pydantic's sponsors: [@matin](https://github.com/matin), [@tiangolo](https://github.com/tiangolo), [@chdsbd](https://github.com/chdsbd), [@jorgecarleitao](https://github.com/jorgecarleitao), and 1 anonymous sponsor for their kind support.\n\n* Modify validators for `conlist` and `conset` to not have `always=True`, [#1682](https://github.com/pydantic/pydantic/pull/1682) by [@samuelcolvin](https://github.com/samuelcolvin)\n* add port check to `AnyUrl` (can't exceed 65536) ports are 16 insigned bits: `0 <= port <= 2**16-1` src: [rfc793 header format](https://tools.ietf.org/html/rfc793#section-3.1), [#1654](https://github.com/pydantic/pydantic/pull/1654) by [@flapili](https://github.com/flapili)\n* Document default `regex` anchoring semantics, [#1648](https://github.com/pydantic/pydantic/pull/1648) by [@yurikhan](https://github.com/yurikhan)\n* Use `chain.from_iterable` in class_validators.py. This is a faster and more idiomatic way of using `itertools.chain`.\n Instead of computing all the items in the iterable and storing them in memory, they are computed one-by-one and never\n stored as a huge list. This can save on both runtime and memory space, [#1642](https://github.com/pydantic/pydantic/pull/1642) by [@cool-RR](https://github.com/cool-RR)\n* Add `conset()`, analogous to `conlist()`, [#1623](https://github.com/pydantic/pydantic/pull/1623) by [@patrickkwang](https://github.com/patrickkwang)\n* make Pydantic errors (un)pickable, [#1616](https://github.com/pydantic/pydantic/pull/1616) by [@PrettyWood](https://github.com/PrettyWood)\n* Allow custom encoding for `dotenv` files, [#1615](https://github.com/pydantic/pydantic/pull/1615) by [@PrettyWood](https://github.com/PrettyWood)\n* Ensure `SchemaExtraCallable` is always defined to get type hints on BaseConfig, [#1614](https://github.com/pydantic/pydantic/pull/1614) by [@PrettyWood](https://github.com/PrettyWood)\n* Update datetime parser to support negative timestamps, [#1600](https://github.com/pydantic/pydantic/pull/1600) by [@mlbiche](https://github.com/mlbiche)\n* Update mypy, remove `AnyType` alias for `Type[Any]`, [#1598](https://github.com/pydantic/pydantic/pull/1598) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Adjust handling of root validators so that errors are aggregated from _all_ failing root validators, instead of reporting on only the first root validator to fail, [#1586](https://github.com/pydantic/pydantic/pull/1586) by [@beezee](https://github.com/beezee)\n* Make `__modify_schema__` on Enums apply to the enum schema rather than fields that use the enum, [#1581](https://github.com/pydantic/pydantic/pull/1581) by [@therefromhere](https://github.com/therefromhere)\n* Fix behavior of `__all__` key when used in conjunction with index keys in advanced include/exclude of fields that are sequences, [#1579](https://github.com/pydantic/pydantic/pull/1579) by [@xspirus](https://github.com/xspirus)\n* Subclass validators do not run when referencing a `List` field defined in a parent class when `each_item=True`. Added an example to the docs illustrating this, [#1566](https://github.com/pydantic/pydantic/pull/1566) by [@samueldeklund](https://github.com/samueldeklund)\n* change `schema.field_class_to_schema` to support `frozenset` in schema, [#1557](https://github.com/pydantic/pydantic/pull/1557) by [@wangpeibao](https://github.com/wangpeibao)\n* Call `__modify_schema__` only for the field schema, [#1552](https://github.com/pydantic/pydantic/pull/1552) by [@PrettyWood](https://github.com/PrettyWood)\n* Move the assignment of `field.validate_always` in `fields.py` so the `always` parameter of validators work on inheritance, [#1545](https://github.com/pydantic/pydantic/pull/1545) by [@dcHHH](https://github.com/dcHHH)\n* Added support for UUID instantiation through 16 byte strings such as `b'\\x12\\x34\\x56\\x78' * 4`. This was done to support `BINARY(16)` columns in sqlalchemy, [#1541](https://github.com/pydantic/pydantic/pull/1541) by [@shawnwall](https://github.com/shawnwall)\n* Add a test assertion that `default_factory` can return a singleton, [#1523](https://github.com/pydantic/pydantic/pull/1523) by [@therefromhere](https://github.com/therefromhere)\n* Add `NameEmail.__eq__` so duplicate `NameEmail` instances are evaluated as equal, [#1514](https://github.com/pydantic/pydantic/pull/1514) by [@stephen-bunn](https://github.com/stephen-bunn)\n* Add datamodel-code-generator link in pydantic document site, [#1500](https://github.com/pydantic/pydantic/pull/1500) by [@koxudaxi](https://github.com/koxudaxi)\n* Added a \"Discussion of Pydantic\" section to the documentation, with a link to \"Pydantic Introduction\" video by Alexander Hultnér, [#1499](https://github.com/pydantic/pydantic/pull/1499) by [@hultner](https://github.com/hultner)\n* Avoid some side effects of `default_factory` by calling it only once\n if possible and by not setting a default value in the schema, [#1491](https://github.com/pydantic/pydantic/pull/1491) by [@PrettyWood](https://github.com/PrettyWood)\n* Added docs about dumping dataclasses to JSON, [#1487](https://github.com/pydantic/pydantic/pull/1487) by [@mikegrima](https://github.com/mikegrima)\n* Make `BaseModel.__signature__` class-only, so getting `__signature__` from model instance will raise `AttributeError`, [#1466](https://github.com/pydantic/pydantic/pull/1466) by [@Bobronium](https://github.com/Bobronium)\n* include `'format': 'password'` in the schema for secret types, [#1424](https://github.com/pydantic/pydantic/pull/1424) by [@atheuz](https://github.com/atheuz)\n* Modify schema constraints on `ConstrainedFloat` so that `exclusiveMinimum` and\n minimum are not included in the schema if they are equal to `-math.inf` and\n `exclusiveMaximum` and `maximum` are not included if they are equal to `math.inf`, [#1417](https://github.com/pydantic/pydantic/pull/1417) by [@vdwees](https://github.com/vdwees)\n* Squash internal `__root__` dicts in `.dict()` (and, by extension, in `.json()`), [#1414](https://github.com/pydantic/pydantic/pull/1414) by [@patrickkwang](https://github.com/patrickkwang)\n* Move `const` validator to post-validators so it validates the parsed value, [#1410](https://github.com/pydantic/pydantic/pull/1410) by [@selimb](https://github.com/selimb)\n* Fix model validation to handle nested literals, e.g. `Literal['foo', Literal['bar']]`, [#1364](https://github.com/pydantic/pydantic/pull/1364) by [@DBCerigo](https://github.com/DBCerigo)\n* Remove `user_required = True` from `RedisDsn`, neither user nor password are required, [#1275](https://github.com/pydantic/pydantic/pull/1275) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Remove extra `allOf` from schema for fields with `Union` and custom `Field`, [#1209](https://github.com/pydantic/pydantic/pull/1209) by [@mostaphaRoudsari](https://github.com/mostaphaRoudsari)\n* Updates OpenAPI schema generation to output all enums as separate models.\n Instead of inlining the enum values in the model schema, models now use a `$ref`\n property to point to the enum definition, [#1173](https://github.com/pydantic/pydantic/pull/1173) by [@calvinwyoung](https://github.com/calvinwyoung)\n\n## v1.5.1 (2020-04-23)\n\n* Signature generation with `extra: allow` never uses a field name, [#1418](https://github.com/pydantic/pydantic/pull/1418) by [@prettywood](https://github.com/prettywood)\n* Avoid mutating `Field` default value, [#1412](https://github.com/pydantic/pydantic/pull/1412) by [@prettywood](https://github.com/prettywood)\n\n## v1.5 (2020-04-18)\n\n* Make includes/excludes arguments for `.dict()`, `._iter()`, ..., immutable, [#1404](https://github.com/pydantic/pydantic/pull/1404) by [@AlexECX](https://github.com/AlexECX)\n* Always use a field's real name with includes/excludes in `model._iter()`, regardless of `by_alias`, [#1397](https://github.com/pydantic/pydantic/pull/1397) by [@AlexECX](https://github.com/AlexECX)\n* Update constr regex example to include start and end lines, [#1396](https://github.com/pydantic/pydantic/pull/1396) by [@lmcnearney](https://github.com/lmcnearney)\n* Confirm that shallow `model.copy()` does make a shallow copy of attributes, [#1383](https://github.com/pydantic/pydantic/pull/1383) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Renaming `model_name` argument of `main.create_model()` to `__model_name` to allow using `model_name` as a field name, [#1367](https://github.com/pydantic/pydantic/pull/1367) by [@kittipatv](https://github.com/kittipatv)\n* Replace raising of exception to silent passing for non-Var attributes in mypy plugin, [#1345](https://github.com/pydantic/pydantic/pull/1345) by [@b0g3r](https://github.com/b0g3r)\n* Remove `typing_extensions` dependency for Python 3.8, [#1342](https://github.com/pydantic/pydantic/pull/1342) by [@prettywood](https://github.com/prettywood)\n* Make `SecretStr` and `SecretBytes` initialization idempotent, [#1330](https://github.com/pydantic/pydantic/pull/1330) by [@atheuz](https://github.com/atheuz)\n* document making secret types dumpable using the json method, [#1328](https://github.com/pydantic/pydantic/pull/1328) by [@atheuz](https://github.com/atheuz)\n* Move all testing and build to github actions, add windows and macos binaries,\n thank you [@StephenBrown2](https://github.com/StephenBrown2) for much help, [#1326](https://github.com/pydantic/pydantic/pull/1326) by [@samuelcolvin](https://github.com/samuelcolvin)\n* fix card number length check in `PaymentCardNumber`, `PaymentCardBrand` now inherits from `str`, [#1317](https://github.com/pydantic/pydantic/pull/1317) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Have `BaseModel` inherit from `Representation` to make mypy happy when overriding `__str__`, [#1310](https://github.com/pydantic/pydantic/pull/1310) by [@FuegoFro](https://github.com/FuegoFro)\n* Allow `None` as input to all optional list fields, [#1307](https://github.com/pydantic/pydantic/pull/1307) by [@prettywood](https://github.com/prettywood)\n* Add `datetime` field to `default_factory` example, [#1301](https://github.com/pydantic/pydantic/pull/1301) by [@StephenBrown2](https://github.com/StephenBrown2)\n* Allow subclasses of known types to be encoded with superclass encoder, [#1291](https://github.com/pydantic/pydantic/pull/1291) by [@StephenBrown2](https://github.com/StephenBrown2)\n* Exclude exported fields from all elements of a list/tuple of submodels/dicts with `'__all__'`, [#1286](https://github.com/pydantic/pydantic/pull/1286) by [@masalim2](https://github.com/masalim2)\n* Add pydantic.color.Color objects as available input for Color fields, [#1258](https://github.com/pydantic/pydantic/pull/1258) by [@leosussan](https://github.com/leosussan)\n* In examples, type nullable fields as `Optional`, so that these are valid mypy annotations, [#1248](https://github.com/pydantic/pydantic/pull/1248) by [@kokes](https://github.com/kokes)\n* Make `pattern_validator()` accept pre-compiled `Pattern` objects. Fix `str_validator()` return type to `str`, [#1237](https://github.com/pydantic/pydantic/pull/1237) by [@adamgreg](https://github.com/adamgreg)\n* Document how to manage Generics and inheritance, [#1229](https://github.com/pydantic/pydantic/pull/1229) by [@esadruhn](https://github.com/esadruhn)\n* `update_forward_refs()` method of BaseModel now copies `__dict__` of class module instead of modyfying it, [#1228](https://github.com/pydantic/pydantic/pull/1228) by [@paul-ilyin](https://github.com/paul-ilyin)\n* Support instance methods and class methods with `@validate_arguments`, [#1222](https://github.com/pydantic/pydantic/pull/1222) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Add `default_factory` argument to `Field` to create a dynamic default value by passing a zero-argument callable, [#1210](https://github.com/pydantic/pydantic/pull/1210) by [@prettywood](https://github.com/prettywood)\n* add support for `NewType` of `List`, `Optional`, etc, [#1207](https://github.com/pydantic/pydantic/pull/1207) by [@Kazy](https://github.com/Kazy)\n* fix mypy signature for `root_validator`, [#1192](https://github.com/pydantic/pydantic/pull/1192) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Fixed parsing of nested 'custom root type' models, [#1190](https://github.com/pydantic/pydantic/pull/1190) by [@Shados](https://github.com/Shados)\n* Add `validate_arguments` function decorator which checks the arguments to a function matches type annotations, [#1179](https://github.com/pydantic/pydantic/pull/1179) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Add `__signature__` to models, [#1034](https://github.com/pydantic/pydantic/pull/1034) by [@Bobronium](https://github.com/Bobronium)\n* Refactor `._iter()` method, 10x speed boost for `dict(model)`, [#1017](https://github.com/pydantic/pydantic/pull/1017) by [@Bobronium](https://github.com/Bobronium)\n\n## v1.4 (2020-01-24)\n\n* **Breaking Change:** alias precedence logic changed so aliases on a field always take priority over\n an alias from `alias_generator` to avoid buggy/unexpected behaviour,\n see [here](https://docs.pydantic.dev/usage/model_config/#alias-precedence) for details, [#1178](https://github.com/pydantic/pydantic/pull/1178) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Add support for unicode and punycode in TLDs, [#1182](https://github.com/pydantic/pydantic/pull/1182) by [@jamescurtin](https://github.com/jamescurtin)\n* Fix `cls` argument in validators during assignment, [#1172](https://github.com/pydantic/pydantic/pull/1172) by [@samuelcolvin](https://github.com/samuelcolvin)\n* completing Luhn algorithm for `PaymentCardNumber`, [#1166](https://github.com/pydantic/pydantic/pull/1166) by [@cuencandres](https://github.com/cuencandres)\n* add support for generics that implement `__get_validators__` like a custom data type, [#1159](https://github.com/pydantic/pydantic/pull/1159) by [@tiangolo](https://github.com/tiangolo)\n* add support for infinite generators with `Iterable`, [#1152](https://github.com/pydantic/pydantic/pull/1152) by [@tiangolo](https://github.com/tiangolo)\n* fix `url_regex` to accept schemas with `+`, `-` and `.` after the first character, [#1142](https://github.com/pydantic/pydantic/pull/1142) by [@samuelcolvin](https://github.com/samuelcolvin)\n* move `version_info()` to `version.py`, suggest its use in issues, [#1138](https://github.com/pydantic/pydantic/pull/1138) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Improve pydantic import time by roughly 50% by deferring some module loading and regex compilation, [#1127](https://github.com/pydantic/pydantic/pull/1127) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Fix `EmailStr` and `NameEmail` to accept instances of themselves in cython, [#1126](https://github.com/pydantic/pydantic/pull/1126) by [@koxudaxi](https://github.com/koxudaxi)\n* Pass model class to the `Config.schema_extra` callable, [#1125](https://github.com/pydantic/pydantic/pull/1125) by [@therefromhere](https://github.com/therefromhere)\n* Fix regex for username and password in URLs, [#1115](https://github.com/pydantic/pydantic/pull/1115) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Add support for nested generic models, [#1104](https://github.com/pydantic/pydantic/pull/1104) by [@dmontagu](https://github.com/dmontagu)\n* add `__all__` to `__init__.py` to prevent \"implicit reexport\" errors from mypy, [#1072](https://github.com/pydantic/pydantic/pull/1072) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Add support for using \"dotenv\" files with `BaseSettings`, [#1011](https://github.com/pydantic/pydantic/pull/1011) by [@acnebs](https://github.com/acnebs)\n\n## v1.3 (2019-12-21)\n\n* Change `schema` and `schema_model` to handle dataclasses by using their `__pydantic_model__` feature, [#792](https://github.com/pydantic/pydantic/pull/792) by [@aviramha](https://github.com/aviramha)\n* Added option for `root_validator` to be skipped if values validation fails using keyword `skip_on_failure=True`, [#1049](https://github.com/pydantic/pydantic/pull/1049) by [@aviramha](https://github.com/aviramha)\n* Allow `Config.schema_extra` to be a callable so that the generated schema can be post-processed, [#1054](https://github.com/pydantic/pydantic/pull/1054) by [@selimb](https://github.com/selimb)\n* Update mypy to version 0.750, [#1057](https://github.com/pydantic/pydantic/pull/1057) by [@dmontagu](https://github.com/dmontagu)\n* Trick Cython into allowing str subclassing, [#1061](https://github.com/pydantic/pydantic/pull/1061) by [@skewty](https://github.com/skewty)\n* Prevent type attributes being added to schema unless the attribute `__schema_attributes__` is `True`, [#1064](https://github.com/pydantic/pydantic/pull/1064) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Change `BaseModel.parse_file` to use `Config.json_loads`, [#1067](https://github.com/pydantic/pydantic/pull/1067) by [@kierandarcy](https://github.com/kierandarcy)\n* Fix for optional `Json` fields, [#1073](https://github.com/pydantic/pydantic/pull/1073) by [@volker48](https://github.com/volker48)\n* Change the default number of threads used when compiling with cython to one,\n allow override via the `CYTHON_NTHREADS` environment variable, [#1074](https://github.com/pydantic/pydantic/pull/1074) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Run FastAPI tests during Pydantic's CI tests, [#1075](https://github.com/pydantic/pydantic/pull/1075) by [@tiangolo](https://github.com/tiangolo)\n* My mypy strictness constraints, and associated tweaks to type annotations, [#1077](https://github.com/pydantic/pydantic/pull/1077) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Add `__eq__` to SecretStr and SecretBytes to allow \"value equals\", [#1079](https://github.com/pydantic/pydantic/pull/1079) by [@sbv-trueenergy](https://github.com/sbv-trueenergy)\n* Fix schema generation for nested None case, [#1088](https://github.com/pydantic/pydantic/pull/1088) by [@lutostag](https://github.com/lutostag)\n* Consistent checks for sequence like objects, [#1090](https://github.com/pydantic/pydantic/pull/1090) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Fix `Config` inheritance on `BaseSettings` when used with `env_prefix`, [#1091](https://github.com/pydantic/pydantic/pull/1091) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Fix for `__modify_schema__` when it conflicted with `field_class_to_schema*`, [#1102](https://github.com/pydantic/pydantic/pull/1102) by [@samuelcolvin](https://github.com/samuelcolvin)\n* docs: Fix explanation of case sensitive environment variable names when populating `BaseSettings` subclass attributes, [#1105](https://github.com/pydantic/pydantic/pull/1105) by [@tribals](https://github.com/tribals)\n* Rename django-rest-framework benchmark in documentation, [#1119](https://github.com/pydantic/pydantic/pull/1119) by [@frankie567](https://github.com/frankie567)\n\n## v1.2 (2019-11-28)\n\n* **Possible Breaking Change:** Add support for required `Optional` with `name: Optional[AnyType] = Field(...)`\n and refactor `ModelField` creation to preserve `required` parameter value, [#1031](https://github.com/pydantic/pydantic/pull/1031) by [@tiangolo](https://github.com/tiangolo);\n see [here](https://docs.pydantic.dev/usage/models/#required-optional-fields) for details\n* Add benchmarks for `cattrs`, [#513](https://github.com/pydantic/pydantic/pull/513) by [@sebastianmika](https://github.com/sebastianmika)\n* Add `exclude_none` option to `dict()` and friends, [#587](https://github.com/pydantic/pydantic/pull/587) by [@niknetniko](https://github.com/niknetniko)\n* Add benchmarks for `valideer`, [#670](https://github.com/pydantic/pydantic/pull/670) by [@gsakkis](https://github.com/gsakkis)\n* Add `parse_obj_as` and `parse_file_as` functions for ad-hoc parsing of data into arbitrary pydantic-compatible types, [#934](https://github.com/pydantic/pydantic/pull/934) by [@dmontagu](https://github.com/dmontagu)\n* Add `allow_reuse` argument to validators, thus allowing validator reuse, [#940](https://github.com/pydantic/pydantic/pull/940) by [@dmontagu](https://github.com/dmontagu)\n* Add support for mapping types for custom root models, [#958](https://github.com/pydantic/pydantic/pull/958) by [@dmontagu](https://github.com/dmontagu)\n* Mypy plugin support for dataclasses, [#966](https://github.com/pydantic/pydantic/pull/966) by [@koxudaxi](https://github.com/koxudaxi)\n* Add support for dataclasses default factory, [#968](https://github.com/pydantic/pydantic/pull/968) by [@ahirner](https://github.com/ahirner)\n* Add a `ByteSize` type for converting byte string (`1GB`) to plain bytes, [#977](https://github.com/pydantic/pydantic/pull/977) by [@dgasmith](https://github.com/dgasmith)\n* Fix mypy complaint about `@root_validator(pre=True)`, [#984](https://github.com/pydantic/pydantic/pull/984) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Add manylinux binaries for Python 3.8 to pypi, also support manylinux2010, [#994](https://github.com/pydantic/pydantic/pull/994) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Adds ByteSize conversion to another unit, [#995](https://github.com/pydantic/pydantic/pull/995) by [@dgasmith](https://github.com/dgasmith)\n* Fix `__str__` and `__repr__` inheritance for models, [#1022](https://github.com/pydantic/pydantic/pull/1022) by [@samuelcolvin](https://github.com/samuelcolvin)\n* add testimonials section to docs, [#1025](https://github.com/pydantic/pydantic/pull/1025) by [@sullivancolin](https://github.com/sullivancolin)\n* Add support for `typing.Literal` for Python 3.8, [#1026](https://github.com/pydantic/pydantic/pull/1026) by [@dmontagu](https://github.com/dmontagu)\n\n## v1.1.1 (2019-11-20)\n\n* Fix bug where use of complex fields on sub-models could cause fields to be incorrectly configured, [#1015](https://github.com/pydantic/pydantic/pull/1015) by [@samuelcolvin](https://github.com/samuelcolvin)\n\n## v1.1 (2019-11-07)\n\n* Add a mypy plugin for type checking `BaseModel.__init__` and more, [#722](https://github.com/pydantic/pydantic/pull/722) by [@dmontagu](https://github.com/dmontagu)\n* Change return type typehint for `GenericModel.__class_getitem__` to prevent PyCharm warnings, [#936](https://github.com/pydantic/pydantic/pull/936) by [@dmontagu](https://github.com/dmontagu)\n* Fix usage of `Any` to allow `None`, also support `TypeVar` thus allowing use of un-parameterised collection types\n e.g. `Dict` and `List`, [#962](https://github.com/pydantic/pydantic/pull/962) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Set `FieldInfo` on subfields to fix schema generation for complex nested types, [#965](https://github.com/pydantic/pydantic/pull/965) by [@samuelcolvin](https://github.com/samuelcolvin)\n\n## v1.0 (2019-10-23)\n\n* **Breaking Change:** deprecate the `Model.fields` property, use `Model.__fields__` instead, [#883](https://github.com/pydantic/pydantic/pull/883) by [@samuelcolvin](https://github.com/samuelcolvin)\n* **Breaking Change:** Change the precedence of aliases so child model aliases override parent aliases,\n including using `alias_generator`, [#904](https://github.com/pydantic/pydantic/pull/904) by [@samuelcolvin](https://github.com/samuelcolvin)\n* **Breaking change:** Rename `skip_defaults` to `exclude_unset`, and add ability to exclude actual defaults, [#915](https://github.com/pydantic/pydantic/pull/915) by [@dmontagu](https://github.com/dmontagu)\n* Add `**kwargs` to `pydantic.main.ModelMetaclass.__new__` so `__init_subclass__` can take custom parameters on extended\n `BaseModel` classes, [#867](https://github.com/pydantic/pydantic/pull/867) by [@retnikt](https://github.com/retnikt)\n* Fix field of a type that has a default value, [#880](https://github.com/pydantic/pydantic/pull/880) by [@koxudaxi](https://github.com/koxudaxi)\n* Use `FutureWarning` instead of `DeprecationWarning` when `alias` instead of `env` is used for settings models, [#881](https://github.com/pydantic/pydantic/pull/881) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Fix issue with `BaseSettings` inheritance and `alias` getting set to `None`, [#882](https://github.com/pydantic/pydantic/pull/882) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Modify `__repr__` and `__str__` methods to be consistent across all public classes, add `__pretty__` to support\n python-devtools, [#884](https://github.com/pydantic/pydantic/pull/884) by [@samuelcolvin](https://github.com/samuelcolvin)\n* deprecation warning for `case_insensitive` on `BaseSettings` config, [#885](https://github.com/pydantic/pydantic/pull/885) by [@samuelcolvin](https://github.com/samuelcolvin)\n* For `BaseSettings` merge environment variables and in-code values recursively, as long as they create a valid object\n when merged together, to allow splitting init arguments, [#888](https://github.com/pydantic/pydantic/pull/888) by [@idmitrievsky](https://github.com/idmitrievsky)\n* change secret types example, [#890](https://github.com/pydantic/pydantic/pull/890) by [@ashears](https://github.com/ashears)\n* Change the signature of `Model.construct()` to be more user-friendly, document `construct()` usage, [#898](https://github.com/pydantic/pydantic/pull/898) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Add example for the `construct()` method, [#907](https://github.com/pydantic/pydantic/pull/907) by [@ashears](https://github.com/ashears)\n* Improve use of `Field` constraints on complex types, raise an error if constraints are not enforceable,\n also support tuples with an ellipsis `Tuple[X, ...]`, `Sequence` and `FrozenSet` in schema, [#909](https://github.com/pydantic/pydantic/pull/909) by [@samuelcolvin](https://github.com/samuelcolvin)\n* update docs for bool missing valid value, [#911](https://github.com/pydantic/pydantic/pull/911) by [@trim21](https://github.com/trim21)\n* Better `str`/`repr` logic for `ModelField`, [#912](https://github.com/pydantic/pydantic/pull/912) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Fix `ConstrainedList`, update schema generation to reflect `min_items` and `max_items` `Field()` arguments, [#917](https://github.com/pydantic/pydantic/pull/917) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Allow abstracts sets (eg. dict keys) in the `include` and `exclude` arguments of `dict()`, [#921](https://github.com/pydantic/pydantic/pull/921) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Fix JSON serialization errors on `ValidationError.json()` by using `pydantic_encoder`, [#922](https://github.com/pydantic/pydantic/pull/922) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Clarify usage of `remove_untouched`, improve error message for types with no validators, [#926](https://github.com/pydantic/pydantic/pull/926) by [@retnikt](https://github.com/retnikt)\n\n## v1.0b2 (2019-10-07)\n\n* Mark `StrictBool` typecheck as `bool` to allow for default values without mypy errors, [#690](https://github.com/pydantic/pydantic/pull/690) by [@dmontagu](https://github.com/dmontagu)\n* Transfer the documentation build from sphinx to mkdocs, re-write much of the documentation, [#856](https://github.com/pydantic/pydantic/pull/856) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Add support for custom naming schemes for `GenericModel` subclasses, [#859](https://github.com/pydantic/pydantic/pull/859) by [@dmontagu](https://github.com/dmontagu)\n* Add `if TYPE_CHECKING:` to the excluded lines for test coverage, [#874](https://github.com/pydantic/pydantic/pull/874) by [@dmontagu](https://github.com/dmontagu)\n* Rename `allow_population_by_alias` to `allow_population_by_field_name`, remove unnecessary warning about it, [#875](https://github.com/pydantic/pydantic/pull/875) by [@samuelcolvin](https://github.com/samuelcolvin)\n\n## v1.0b1 (2019-10-01)\n\n* **Breaking Change:** rename `Schema` to `Field`, make it a function to placate mypy, [#577](https://github.com/pydantic/pydantic/pull/577) by [@samuelcolvin](https://github.com/samuelcolvin)\n* **Breaking Change:** modify parsing behavior for `bool`, [#617](https://github.com/pydantic/pydantic/pull/617) by [@dmontagu](https://github.com/dmontagu)\n* **Breaking Change:** `get_validators` is no longer recognised, use `__get_validators__`.\n `Config.ignore_extra` and `Config.allow_extra` are no longer recognised, use `Config.extra`, [#720](https://github.com/pydantic/pydantic/pull/720) by [@samuelcolvin](https://github.com/samuelcolvin)\n* **Breaking Change:** modify default config settings for `BaseSettings`; `case_insensitive` renamed to `case_sensitive`,\n default changed to `case_sensitive = False`, `env_prefix` default changed to `''` - e.g. no prefix, [#721](https://github.com/pydantic/pydantic/pull/721) by [@dmontagu](https://github.com/dmontagu)\n* **Breaking change:** Implement `root_validator` and rename root errors from `__obj__` to `__root__`, [#729](https://github.com/pydantic/pydantic/pull/729) by [@samuelcolvin](https://github.com/samuelcolvin)\n* **Breaking Change:** alter the behaviour of `dict(model)` so that sub-models are nolonger\n converted to dictionaries, [#733](https://github.com/pydantic/pydantic/pull/733) by [@samuelcolvin](https://github.com/samuelcolvin)\n* **Breaking change:** Added `initvars` support to `post_init_post_parse`, [#748](https://github.com/pydantic/pydantic/pull/748) by [@Raphael-C-Almeida](https://github.com/Raphael-C-Almeida)\n* **Breaking Change:** Make `BaseModel.json()` only serialize the `__root__` key for models with custom root, [#752](https://github.com/pydantic/pydantic/pull/752) by [@dmontagu](https://github.com/dmontagu)\n* **Breaking Change:** complete rewrite of `URL` parsing logic, [#755](https://github.com/pydantic/pydantic/pull/755) by [@samuelcolvin](https://github.com/samuelcolvin)\n* **Breaking Change:** preserve superclass annotations for field-determination when not provided in subclass, [#757](https://github.com/pydantic/pydantic/pull/757) by [@dmontagu](https://github.com/dmontagu)\n* **Breaking Change:** `BaseSettings` now uses the special `env` settings to define which environment variables to\n read, not aliases, [#847](https://github.com/pydantic/pydantic/pull/847) by [@samuelcolvin](https://github.com/samuelcolvin)\n* add support for `assert` statements inside validators, [#653](https://github.com/pydantic/pydantic/pull/653) by [@abdusco](https://github.com/abdusco)\n* Update documentation to specify the use of `pydantic.dataclasses.dataclass` and subclassing `pydantic.BaseModel`, [#710](https://github.com/pydantic/pydantic/pull/710) by [@maddosaurus](https://github.com/maddosaurus)\n* Allow custom JSON decoding and encoding via `json_loads` and `json_dumps` `Config` properties, [#714](https://github.com/pydantic/pydantic/pull/714) by [@samuelcolvin](https://github.com/samuelcolvin)\n* make all annotated fields occur in the order declared, [#715](https://github.com/pydantic/pydantic/pull/715) by [@dmontagu](https://github.com/dmontagu)\n* use pytest to test `mypy` integration, [#735](https://github.com/pydantic/pydantic/pull/735) by [@dmontagu](https://github.com/dmontagu)\n* add `__repr__` method to `ErrorWrapper`, [#738](https://github.com/pydantic/pydantic/pull/738) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Added support for `FrozenSet` members in dataclasses, and a better error when attempting to use types from the `typing` module that are not supported by Pydantic, [#745](https://github.com/pydantic/pydantic/pull/745) by [@djpetti](https://github.com/djpetti)\n* add documentation for Pycharm Plugin, [#750](https://github.com/pydantic/pydantic/pull/750) by [@koxudaxi](https://github.com/koxudaxi)\n* fix broken examples in the docs, [#753](https://github.com/pydantic/pydantic/pull/753) by [@dmontagu](https://github.com/dmontagu)\n* moving typing related objects into `pydantic.typing`, [#761](https://github.com/pydantic/pydantic/pull/761) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Minor performance improvements to `ErrorWrapper`, `ValidationError` and datetime parsing, [#763](https://github.com/pydantic/pydantic/pull/763) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Improvements to `datetime`/`date`/`time`/`timedelta` types: more descriptive errors,\n change errors to `value_error` not `type_error`, support bytes, [#766](https://github.com/pydantic/pydantic/pull/766) by [@samuelcolvin](https://github.com/samuelcolvin)\n* fix error messages for `Literal` types with multiple allowed values, [#770](https://github.com/pydantic/pydantic/pull/770) by [@dmontagu](https://github.com/dmontagu)\n* Improved auto-generated `title` field in JSON schema by converting underscore to space, [#772](https://github.com/pydantic/pydantic/pull/772) by [@skewty](https://github.com/skewty)\n* support `mypy --no-implicit-reexport` for dataclasses, also respect `--no-implicit-reexport` in pydantic itself, [#783](https://github.com/pydantic/pydantic/pull/783) by [@samuelcolvin](https://github.com/samuelcolvin)\n* add the `PaymentCardNumber` type, [#790](https://github.com/pydantic/pydantic/pull/790) by [@matin](https://github.com/matin)\n* Fix const validations for lists, [#794](https://github.com/pydantic/pydantic/pull/794) by [@hmvp](https://github.com/hmvp)\n* Set `additionalProperties` to false in schema for models with extra fields disallowed, [#796](https://github.com/pydantic/pydantic/pull/796) by [@Code0x58](https://github.com/Code0x58)\n* `EmailStr` validation method now returns local part case-sensitive per RFC 5321, [#798](https://github.com/pydantic/pydantic/pull/798) by [@henriklindgren](https://github.com/henriklindgren)\n* Added ability to validate strictness to `ConstrainedFloat`, `ConstrainedInt` and `ConstrainedStr` and added\n `StrictFloat` and `StrictInt` classes, [#799](https://github.com/pydantic/pydantic/pull/799) by [@DerRidda](https://github.com/DerRidda)\n* Improve handling of `None` and `Optional`, replace `whole` with `each_item` (inverse meaning, default `False`)\n on validators, [#803](https://github.com/pydantic/pydantic/pull/803) by [@samuelcolvin](https://github.com/samuelcolvin)\n* add support for `Type[T]` type hints, [#807](https://github.com/pydantic/pydantic/pull/807) by [@timonbimon](https://github.com/timonbimon)\n* Performance improvements from removing `change_exceptions`, change how pydantic error are constructed, [#819](https://github.com/pydantic/pydantic/pull/819) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Fix the error message arising when a `BaseModel`-type model field causes a `ValidationError` during parsing, [#820](https://github.com/pydantic/pydantic/pull/820) by [@dmontagu](https://github.com/dmontagu)\n* allow `getter_dict` on `Config`, modify `GetterDict` to be more like a `Mapping` object and thus easier to work with, [#821](https://github.com/pydantic/pydantic/pull/821) by [@samuelcolvin](https://github.com/samuelcolvin)\n* Only check `TypeVar` param on base `GenericModel` class, [#842](https://github.com/pydantic/pydantic/pull/842) by [@zpencerq](https://github.com/zpencerq)\n* rename `Model._schema_cache` -> `Model.__schema_cache__`, `Model._json_encoder` -> `Model.__json_encoder__`,\n `Model._custom_root_type` -> `Model.__custom_root_type__`, [#851](https://github.com/pydantic/pydantic/pull/851) by [@samuelcolvin](https://github.com/samuelcolvin)\n\n\n... see [here](https://docs.pydantic.dev/changelog/#v0322-2019-08-17) for earlier changes.\n",
- "description_content_type": "text/markdown",
- "author_email": "Samuel Colvin <s@muelcolvin.com>, Eric Jolibois <em.jolibois@gmail.com>, Hasan Ramezani <hasan.r67@gmail.com>, Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Terrence Dorsey <terry@pydantic.dev>, David Montague <david@pydantic.dev>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Console",
- "Environment :: MacOS X",
- "Framework :: Hypothesis",
- "Framework :: Pydantic",
- "Intended Audience :: Developers",
- "Intended Audience :: Information Technology",
- "Intended Audience :: System Administrators",
- "License :: OSI Approved :: MIT License",
- "Operating System :: POSIX :: Linux",
- "Operating System :: Unix",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Internet",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ],
- "requires_dist": [
- "annotated-types>=0.4.0",
- "pydantic-core==2.10.1",
- "typing-extensions>=4.6.1",
- "email-validator>=2.0.0; extra == 'email'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Homepage, https://github.com/pydantic/pydantic",
- "Documentation, https://docs.pydantic.dev",
- "Funding, https://github.com/sponsors/samuelcolvin",
- "Source, https://github.com/pydantic/pydantic",
- "Changelog, https://docs.pydantic.dev/latest/changelog/"
- ],
- "provides_extra": [
- "email"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/39/09/120c06a52ed4bb1022d060bec0a16e5deb4ce79a1c4c11ef9519bc32b59f/pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "archive_info": {
- "hash": "sha256=caa48fc31fc7243e50188197b5f0c4228956f97b954f76da157aae7f67269ae8",
- "hashes": {
- "sha256": "caa48fc31fc7243e50188197b5f0c4228956f97b954f76da157aae7f67269ae8"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "pydantic_core",
- "version": "2.10.1",
- "description": "# pydantic-core\n\n[](https://github.com/pydantic/pydantic-core/actions?query=event%3Apush+branch%3Amain+workflow%3Aci)\n[](https://codecov.io/gh/pydantic/pydantic-core)\n[](https://pypi.python.org/pypi/pydantic-core)\n[](https://github.com/pydantic/pydantic-core)\n[](https://github.com/pydantic/pydantic-core/blob/main/LICENSE)\n\nThis package provides the core functionality for [pydantic](https://docs.pydantic.dev) validation and serialization.\n\nPydantic-core is currently around 17x faster than pydantic V1.\nSee [`tests/benchmarks/`](./tests/benchmarks/) for details.\n\n## Example of direct usage\n\n_NOTE: You should not need to use pydantic-core directly; instead, use pydantic, which in turn uses pydantic-core._\n\n```py\nfrom pydantic_core import SchemaValidator, ValidationError\n\n\nv = SchemaValidator(\n {\n 'type': 'typed-dict',\n 'fields': {\n 'name': {\n 'type': 'typed-dict-field',\n 'schema': {\n 'type': 'str',\n },\n },\n 'age': {\n 'type': 'typed-dict-field',\n 'schema': {\n 'type': 'int',\n 'ge': 18,\n },\n },\n 'is_developer': {\n 'type': 'typed-dict-field',\n 'schema': {\n 'type': 'default',\n 'schema': {'type': 'bool'},\n 'default': True,\n },\n },\n },\n }\n)\n\nr1 = v.validate_python({'name': 'Samuel', 'age': 35})\nassert r1 == {'name': 'Samuel', 'age': 35, 'is_developer': True}\n\n# pydantic-core can also validate JSON directly\nr2 = v.validate_json('{\"name\": \"Samuel\", \"age\": 35}')\nassert r1 == r2\n\ntry:\n v.validate_python({'name': 'Samuel', 'age': 11})\nexcept ValidationError as e:\n print(e)\n \"\"\"\n 1 validation error for model\n age\n Input should be greater than or equal to 18\n [type=greater_than_equal, context={ge: 18}, input_value=11, input_type=int]\n \"\"\"\n```\n\n## Getting Started\n\nYou'll need rust stable [installed](https://rustup.rs/), or rust nightly if you want to generate accurate coverage.\n\nWith rust and python 3.7+ installed, compiling pydantic-core should be possible with roughly the following:\n\n```bash\n# clone this repo or your fork\ngit clone git@github.com:pydantic/pydantic-core.git\ncd pydantic-core\n# create a new virtual env\npython3 -m venv env\nsource env/bin/activate\n# install dependencies and install pydantic-core\nmake install\n```\n\nThat should be it, the example shown above should now run.\n\nYou might find it useful to look at [`python/pydantic_core/_pydantic_core.pyi`](./python/pydantic_core/_pydantic_core.pyi) and\n[`python/pydantic_core/core_schema.py`](./python/pydantic_core/core_schema.py) for more information on the python API,\nbeyond that, [`tests/`](./tests) provide a large number of examples of usage.\n\nIf you want to contribute to pydantic-core, you'll want to use some other make commands:\n* `make build-dev` to build the package during development\n* `make build-prod` to perform an optimised build for benchmarking\n* `make test` to run the tests\n* `make testcov` to run the tests and generate a coverage report\n* `make lint` to run the linter\n* `make format` to format python and rust code\n* `make` to run `format build-dev lint test`\n\n## Profiling\n\nIt's possible to profile the code using the [`flamegraph` utility from `flamegraph-rs`](https://github.com/flamegraph-rs/flamegraph). (Tested on Linux.) You can install this with `cargo install flamegraph`.\n\nRun `make build-profiling` to install a release build with debugging symbols included (needed for profiling).\n\nOnce that is built, you can profile pytest benchmarks with (e.g.):\n\n```bash\nflamegraph -- pytest tests/benchmarks/test_micro_benchmarks.py -k test_list_of_ints_core_py --benchmark-enable\n```\nThe `flamegraph` command will produce an interactive SVG at `flamegraph.svg`.\n\n## Releasing\n\n1. Bump package version locally. Do not just edit `Cargo.toml` on Github, you need both `Cargo.toml` and `Cargo.lock` to be updated.\n2. Make a PR for the version bump and merge it.\n3. Go to https://github.com/pydantic/pydantic-core/releases and click \"Draft a new release\"\n4. In the \"Choose a tag\" dropdown enter the new tag `v<the.new.version>` and select \"Create new tag on publish\" when the option appears.\n5. Enter the release title in the form \"v<the.new.version> <YYYY-MM-DD>\"\n6. Click Generate release notes button\n7. Click Publish release\n8. Go to https://github.com/pydantic/pydantic-core/actions and ensure that all build for release are done successfully.\n9. Go to https://pypi.org/project/pydantic-core/ and ensure that the latest release is published.\n10. Done 🎉\n\n",
- "description_content_type": "text/markdown; charset=UTF-8; variant=GFM",
- "home_page": "https://github.com/pydantic/pydantic-core",
- "author_email": "Samuel Colvin <s@muelcolvin.com>",
- "license": "MIT",
- "classifier": [
- "Development Status :: 3 - Alpha",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Programming Language :: Rust",
- "Framework :: Pydantic",
- "Intended Audience :: Developers",
- "Intended Audience :: Information Technology",
- "License :: OSI Approved :: MIT License",
- "Operating System :: POSIX :: Linux",
- "Operating System :: Microsoft :: Windows",
- "Operating System :: MacOS",
- "Typing :: Typed"
- ],
- "requires_dist": [
- "typing-extensions >=4.6.0, !=4.7.0"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Homepage, https://github.com/pydantic/pydantic-core",
- "Funding, https://github.com/sponsors/samuelcolvin",
- "Source, https://github.com/pydantic/pydantic-core"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/43/88/29adf0b44ba6ac85045e63734ae0997d3c58d8b1a91c914d240828d0d73d/Pygments-2.16.1-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692",
- "hashes": {
- "sha256": "13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "Pygments",
- "version": "2.16.1",
- "summary": "Pygments is a syntax highlighting package written in Python.",
- "description": "Pygments\n~~~~~~~~\n\nPygments is a syntax highlighting package written in Python.\n\nIt is a generic syntax highlighter suitable for use in code hosting, forums,\nwikis or other applications that need to prettify source code. Highlights\nare:\n\n* a wide range of over 500 languages and other text formats is supported\n* special attention is paid to details, increasing quality by a fair amount\n* support for new languages and formats are added easily\n* a number of output formats, presently HTML, LaTeX, RTF, SVG, all image\n formats that PIL supports and ANSI sequences\n* it is usable as a command-line tool and as a library\n\nCopyright 2006-2023 by the Pygments team, see ``AUTHORS``.\nLicensed under the BSD, see ``LICENSE`` for details.\n",
- "description_content_type": "text/x-rst",
- "keywords": [
- "syntax",
- "highlighting"
- ],
- "author_email": "Georg Brandl <georg@python.org>",
- "maintainer": "Matthäus G. Chajdas",
- "maintainer_email": "Georg Brandl <georg@python.org>, Jean Abou Samra <jean@abou-samra.fr>",
- "license": "BSD-2-Clause",
- "classifier": [
- "Development Status :: 6 - Mature",
- "Intended Audience :: Developers",
- "Intended Audience :: End Users/Desktop",
- "Intended Audience :: System Administrators",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Text Processing :: Filters",
- "Topic :: Utilities"
- ],
- "requires_dist": [
- "importlib-metadata ; (python_version < \"3.8\") and extra == 'plugins'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Homepage, https://pygments.org",
- "Documentation, https://pygments.org/docs",
- "Source, https://github.com/pygments/pygments",
- "Bug Tracker, https://github.com/pygments/pygments/issues",
- "Changelog, https://github.com/pygments/pygments/blob/master/CHANGES"
- ],
- "provides_extra": [
- "plugins"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/2b/4f/e04a8067c7c96c364cef7ef73906504e2f40d690811c021e1a1901473a19/PyJWT-2.8.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320",
- "hashes": {
- "sha256": "59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "PyJWT",
- "version": "2.8.0",
- "summary": "JSON Web Token implementation in Python",
- "description": "PyJWT\n=====\n\n.. image:: https://github.com/jpadilla/pyjwt/workflows/CI/badge.svg\n :target: https://github.com/jpadilla/pyjwt/actions?query=workflow%3ACI\n\n.. image:: https://img.shields.io/pypi/v/pyjwt.svg\n :target: https://pypi.python.org/pypi/pyjwt\n\n.. image:: https://codecov.io/gh/jpadilla/pyjwt/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/jpadilla/pyjwt\n\n.. image:: https://readthedocs.org/projects/pyjwt/badge/?version=stable\n :target: https://pyjwt.readthedocs.io/en/stable/\n\nA Python implementation of `RFC 7519 <https://tools.ietf.org/html/rfc7519>`_. Original implementation was written by `@progrium <https://github.com/progrium>`_.\n\nSponsor\n-------\n\n+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n| |auth0-logo| | If you want to quickly add secure token-based authentication to Python projects, feel free to check Auth0's Python SDK and free plan at `auth0.com/developers <https://auth0.com/developers?utm_source=GHsponsor&utm_medium=GHsponsor&utm_campaign=pyjwt&utm_content=auth>`_. |\n+--------------+-----------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n\n.. |auth0-logo| image:: https://user-images.githubusercontent.com/83319/31722733-de95bbde-b3ea-11e7-96bf-4f4e8f915588.png\n\nInstalling\n----------\n\nInstall with **pip**:\n\n.. code-block:: console\n\n $ pip install PyJWT\n\n\nUsage\n-----\n\n.. code-block:: pycon\n\n >>> import jwt\n >>> encoded = jwt.encode({\"some\": \"payload\"}, \"secret\", algorithm=\"HS256\")\n >>> print(encoded)\n eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg\n >>> jwt.decode(encoded, \"secret\", algorithms=[\"HS256\"])\n {'some': 'payload'}\n\nDocumentation\n-------------\n\nView the full docs online at https://pyjwt.readthedocs.io/en/stable/\n\n\nTests\n-----\n\nYou can run tests from the project root after cloning with:\n\n.. code-block:: console\n\n $ tox\n",
- "description_content_type": "text/x-rst",
- "keywords": [
- "json",
- "jwt",
- "security",
- "signing",
- "token",
- "web"
- ],
- "home_page": "https://github.com/jpadilla/pyjwt",
- "author": "Jose Padilla",
- "author_email": "hello@jpadilla.com",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "Natural Language :: English",
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Topic :: Utilities"
- ],
- "requires_dist": [
- "typing-extensions ; python_version <= \"3.7\"",
- "cryptography (>=3.4.0) ; extra == 'crypto'",
- "sphinx (<5.0.0,>=4.5.0) ; extra == 'dev'",
- "sphinx-rtd-theme ; extra == 'dev'",
- "zope.interface ; extra == 'dev'",
- "cryptography (>=3.4.0) ; extra == 'dev'",
- "pytest (<7.0.0,>=6.0.0) ; extra == 'dev'",
- "coverage[toml] (==5.0.4) ; extra == 'dev'",
- "pre-commit ; extra == 'dev'",
- "sphinx (<5.0.0,>=4.5.0) ; extra == 'docs'",
- "sphinx-rtd-theme ; extra == 'docs'",
- "zope.interface ; extra == 'docs'",
- "pytest (<7.0.0,>=6.0.0) ; extra == 'tests'",
- "coverage[toml] (==5.0.4) ; extra == 'tests'"
- ],
- "requires_python": ">=3.7",
- "provides_extra": [
- "crypto",
- "dev",
- "docs",
- "tests"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/83/7f/feffd97af851e2a837b5ca9bfbe570002c45397734724e4abfd4c62fdd0d/python_daemon-3.0.1-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=42bb848a3260a027fa71ad47ecd959e471327cb34da5965962edd5926229f341",
- "hashes": {
- "sha256": "42bb848a3260a027fa71ad47ecd959e471327cb34da5965962edd5926229f341"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "python-daemon",
- "version": "3.0.1",
- "summary": "Library to implement a well-behaved Unix daemon process.",
- "description": "This library implements the well-behaved daemon specification of\n:pep:`3143`, “Standard daemon process library”.\n\nA well-behaved Unix daemon process is tricky to get right, but the\nrequired steps are much the same for every daemon program. A\n`DaemonContext` instance holds the behaviour and configured\nprocess environment for the program; use the instance as a context\nmanager to enter a daemon state.\n\nSimple example of usage::\n\n import daemon\n\n from spam import do_main_program\n\n with daemon.DaemonContext():\n do_main_program()\n\nCustomisation of the steps to become a daemon is available by\nsetting options on the `DaemonContext` instance; see the\ndocumentation for that class for each option.\n",
- "description_content_type": "text/x-rst",
- "keywords": [
- "daemon",
- "fork",
- "unix"
- ],
- "home_page": "https://pagure.io/python-daemon/",
- "author": "Ben Finney",
- "author_email": "ben+python@benfinney.id.au",
- "license": "Apache-2",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "License :: OSI Approved :: Apache Software License",
- "Operating System :: POSIX",
- "Programming Language :: Python :: 3",
- "Intended Audience :: Developers",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ],
- "requires_dist": [
- "docutils",
- "lockfile (>=0.10)",
- "setuptools (>=62.4.0)",
- "coverage ; extra == 'devel'",
- "docutils ; extra == 'devel'",
- "isort ; extra == 'devel'",
- "testscenarios (>=0.4) ; extra == 'devel'",
- "testtools ; extra == 'devel'",
- "twine ; extra == 'devel'",
- "coverage ; extra == 'test'",
- "docutils ; extra == 'test'",
- "testscenarios (>=0.4) ; extra == 'test'",
- "testtools ; extra == 'test'"
- ],
- "requires_python": ">=3",
- "project_url": [
- "Change Log, https://pagure.io/python-daemon/blob/main/f/ChangeLog",
- "Source, https://pagure.io/python-daemon/",
- "Issue Tracker, https://pagure.io/python-daemon/issues"
- ],
- "provides_extra": [
- "devel",
- "test"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9",
- "hashes": {
- "sha256": "961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "python-dateutil",
- "version": "2.8.2",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "Extensions to the standard Python datetime module",
- "description": "dateutil - powerful extensions to datetime\n==========================================\n\n|pypi| |support| |licence|\n\n|gitter| |readthedocs|\n\n|travis| |appveyor| |pipelines| |coverage|\n\n.. |pypi| image:: https://img.shields.io/pypi/v/python-dateutil.svg?style=flat-square\n :target: https://pypi.org/project/python-dateutil/\n :alt: pypi version\n\n.. |support| image:: https://img.shields.io/pypi/pyversions/python-dateutil.svg?style=flat-square\n :target: https://pypi.org/project/python-dateutil/\n :alt: supported Python version\n\n.. |travis| image:: https://img.shields.io/travis/dateutil/dateutil/master.svg?style=flat-square&label=Travis%20Build\n :target: https://travis-ci.org/dateutil/dateutil\n :alt: travis build status\n\n.. |appveyor| image:: https://img.shields.io/appveyor/ci/dateutil/dateutil/master.svg?style=flat-square&logo=appveyor\n :target: https://ci.appveyor.com/project/dateutil/dateutil\n :alt: appveyor build status\n\n.. |pipelines| image:: https://dev.azure.com/pythondateutilazure/dateutil/_apis/build/status/dateutil.dateutil?branchName=master\n :target: https://dev.azure.com/pythondateutilazure/dateutil/_build/latest?definitionId=1&branchName=master\n :alt: azure pipelines build status\n\n.. |coverage| image:: https://codecov.io/gh/dateutil/dateutil/branch/master/graphs/badge.svg?branch=master\n :target: https://codecov.io/gh/dateutil/dateutil?branch=master\n :alt: Code coverage\n\n.. |gitter| image:: https://badges.gitter.im/dateutil/dateutil.svg\n :alt: Join the chat at https://gitter.im/dateutil/dateutil\n :target: https://gitter.im/dateutil/dateutil\n\n.. |licence| image:: https://img.shields.io/pypi/l/python-dateutil.svg?style=flat-square\n :target: https://pypi.org/project/python-dateutil/\n :alt: licence\n\n.. |readthedocs| image:: https://img.shields.io/readthedocs/dateutil/latest.svg?style=flat-square&label=Read%20the%20Docs\n :alt: Read the documentation at https://dateutil.readthedocs.io/en/latest/\n :target: https://dateutil.readthedocs.io/en/latest/\n\nThe `dateutil` module provides powerful extensions to\nthe standard `datetime` module, available in Python.\n\nInstallation\n============\n`dateutil` can be installed from PyPI using `pip` (note that the package name is\ndifferent from the importable name)::\n\n pip install python-dateutil\n\nDownload\n========\ndateutil is available on PyPI\nhttps://pypi.org/project/python-dateutil/\n\nThe documentation is hosted at:\nhttps://dateutil.readthedocs.io/en/stable/\n\nCode\n====\nThe code and issue tracker are hosted on GitHub:\nhttps://github.com/dateutil/dateutil/\n\nFeatures\n========\n\n* Computing of relative deltas (next month, next year,\n next Monday, last week of month, etc);\n* Computing of relative deltas between two given\n date and/or datetime objects;\n* Computing of dates based on very flexible recurrence rules,\n using a superset of the `iCalendar <https://www.ietf.org/rfc/rfc2445.txt>`_\n specification. Parsing of RFC strings is supported as well.\n* Generic parsing of dates in almost any string format;\n* Timezone (tzinfo) implementations for tzfile(5) format\n files (/etc/localtime, /usr/share/zoneinfo, etc), TZ\n environment string (in all known formats), iCalendar\n format files, given ranges (with help from relative deltas),\n local machine timezone, fixed offset timezone, UTC timezone,\n and Windows registry-based time zones.\n* Internal up-to-date world timezone information based on\n Olson's database.\n* Computing of Easter Sunday dates for any given year,\n using Western, Orthodox or Julian algorithms;\n* A comprehensive test suite.\n\nQuick example\n=============\nHere's a snapshot, just to give an idea about the power of the\npackage. For more examples, look at the documentation.\n\nSuppose you want to know how much time is left, in\nyears/months/days/etc, before the next easter happening on a\nyear with a Friday 13th in August, and you want to get today's\ndate out of the \"date\" unix system command. Here is the code:\n\n.. code-block:: python3\n\n >>> from dateutil.relativedelta import *\n >>> from dateutil.easter import *\n >>> from dateutil.rrule import *\n >>> from dateutil.parser import *\n >>> from datetime import *\n >>> now = parse(\"Sat Oct 11 17:13:46 UTC 2003\")\n >>> today = now.date()\n >>> year = rrule(YEARLY,dtstart=now,bymonth=8,bymonthday=13,byweekday=FR)[0].year\n >>> rdelta = relativedelta(easter(year), today)\n >>> print(\"Today is: %s\" % today)\n Today is: 2003-10-11\n >>> print(\"Year with next Aug 13th on a Friday is: %s\" % year)\n Year with next Aug 13th on a Friday is: 2004\n >>> print(\"How far is the Easter of that year: %s\" % rdelta)\n How far is the Easter of that year: relativedelta(months=+6)\n >>> print(\"And the Easter of that year is: %s\" % (today+rdelta))\n And the Easter of that year is: 2004-04-11\n\nBeing exactly 6 months ahead was **really** a coincidence :)\n\nContributing\n============\n\nWe welcome many types of contributions - bug reports, pull requests (code, infrastructure or documentation fixes). For more information about how to contribute to the project, see the ``CONTRIBUTING.md`` file in the repository.\n\n\nAuthor\n======\nThe dateutil module was written by Gustavo Niemeyer <gustavo@niemeyer.net>\nin 2003.\n\nIt is maintained by:\n\n* Gustavo Niemeyer <gustavo@niemeyer.net> 2003-2011\n* Tomi Pieviläinen <tomi.pievilainen@iki.fi> 2012-2014\n* Yaron de Leeuw <me@jarondl.net> 2014-2016\n* Paul Ganssle <paul@ganssle.io> 2015-\n\nStarting with version 2.4.1 and running until 2.8.2, all source and binary\ndistributions will be signed by a PGP key that has, at the very least, been\nsigned by the key which made the previous release. A table of release signing\nkeys can be found below:\n\n=========== ============================\nReleases Signing key fingerprint\n=========== ============================\n2.4.1-2.8.2 `6B49 ACBA DCF6 BD1C A206 67AB CD54 FCE3 D964 BEFB`_ \n=========== ============================\n\nNew releases *may* have signed tags, but binary and source distributions\nuploaded to PyPI will no longer have GPG signatures attached.\n\nContact\n=======\nOur mailing list is available at `dateutil@python.org <https://mail.python.org/mailman/listinfo/dateutil>`_. As it is hosted by the PSF, it is subject to the `PSF code of\nconduct <https://www.python.org/psf/conduct/>`_.\n\nLicense\n=======\n\nAll contributions after December 1, 2017 released under dual license - either `Apache 2.0 License <https://www.apache.org/licenses/LICENSE-2.0>`_ or the `BSD 3-Clause License <https://opensource.org/licenses/BSD-3-Clause>`_. Contributions before December 1, 2017 - except those those explicitly relicensed - are released only under the BSD 3-Clause License.\n\n\n.. _6B49 ACBA DCF6 BD1C A206 67AB CD54 FCE3 D964 BEFB:\n https://pgp.mit.edu/pks/lookup?op=vindex&search=0xCD54FCE3D964BEFB\n\n\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://github.com/dateutil/dateutil",
- "author": "Gustavo Niemeyer",
- "author_email": "gustavo@niemeyer.net",
- "maintainer": "Paul Ganssle",
- "maintainer_email": "dateutil@python.org",
- "license": "Dual License",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.3",
- "Programming Language :: Python :: 3.4",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Topic :: Software Development :: Libraries"
- ],
- "requires_dist": [
- "six (>=1.5)"
- ],
- "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7",
- "project_url": [
- "Documentation, https://dateutil.readthedocs.io/en/stable/",
- "Source, https://github.com/dateutil/dateutil"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/6c/73/9f872cb81fc5c3bb48f7227872c28975f998f3e7c2b1c16e95e6432bbb90/python_magic-0.4.27-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3",
- "hashes": {
- "sha256": "c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "python-magic",
- "version": "0.4.27",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "File type identification using libmagic",
- "description": "# python-magic\n[](https://badge.fury.io/py/python-magic)\n[](https://travis-ci.org/ahupp/python-magic) [](https://gitter.im/ahupp/python-magic?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n\npython-magic is a Python interface to the libmagic file type\nidentification library. libmagic identifies file types by checking\ntheir headers according to a predefined list of file types. This\nfunctionality is exposed to the command line by the Unix command\n`file`.\n\n## Usage\n\n```python\n>>> import magic\n>>> magic.from_file(\"testdata/test.pdf\")\n'PDF document, version 1.2'\n# recommend using at least the first 2048 bytes, as less can produce incorrect identification\n>>> magic.from_buffer(open(\"testdata/test.pdf\", \"rb\").read(2048))\n'PDF document, version 1.2'\n>>> magic.from_file(\"testdata/test.pdf\", mime=True)\n'application/pdf'\n```\n\nThere is also a `Magic` class that provides more direct control,\nincluding overriding the magic database file and turning on character\nencoding detection. This is not recommended for general use. In\nparticular, it's not safe for sharing across multiple threads and\nwill fail throw if this is attempted.\n\n```python\n>>> f = magic.Magic(uncompress=True)\n>>> f.from_file('testdata/test.gz')\n'ASCII text (gzip compressed data, was \"test\", last modified: Sat Jun 28\n21:32:52 2008, from Unix)'\n```\n\nYou can also combine the flag options:\n\n```python\n>>> f = magic.Magic(mime=True, uncompress=True)\n>>> f.from_file('testdata/test.gz')\n'text/plain'\n```\n\n## Installation\n\nThe current stable version of python-magic is available on PyPI and\ncan be installed by running `pip install python-magic`.\n\nOther sources:\n\n- PyPI: http://pypi.python.org/pypi/python-magic/\n- GitHub: https://github.com/ahupp/python-magic\n\nThis module is a simple wrapper around the libmagic C library, and\nthat must be installed as well:\n\n### Debian/Ubuntu\n\n```\nsudo apt-get install libmagic1\n```\n\n### Windows\n\nYou'll need DLLs for libmagic. @julian-r maintains a pypi package with the DLLs, you can fetch it with:\n\n```\npip install python-magic-bin\n```\n\n### OSX\n\n- When using Homebrew: `brew install libmagic`\n- When using macports: `port install file`\n\n### Troubleshooting\n\n- 'MagicException: could not find any magic files!': some\n installations of libmagic do not correctly point to their magic\n database file. Try specifying the path to the file explicitly in the\n constructor: `magic.Magic(magic_file=\"path_to_magic_file\")`.\n\n- 'WindowsError: [Error 193] %1 is not a valid Win32 application':\n Attempting to run the 32-bit libmagic DLL in a 64-bit build of\n python will fail with this error. Here are 64-bit builds of libmagic for windows: https://github.com/pidydx/libmagicwin64.\n Newer version can be found here: https://github.com/nscaife/file-windows.\n\n- 'WindowsError: exception: access violation writing 0x00000000 ' This may indicate you are mixing\n Windows Python and Cygwin Python. Make sure your libmagic and python builds are consistent.\n\n\n## Bug Reports\n\npython-magic is a thin layer over the libmagic C library.\nHistorically, most bugs that have been reported against python-magic\nare actually bugs in libmagic; libmagic bugs can be reported on their\ntracker here: https://bugs.astron.com/my_view_page.php. If you're not\nsure where the bug lies feel free to file an issue on GitHub and I can\ntriage it.\n\n## Running the tests\n\nTo run the tests across a variety of linux distributions (depends on Docker):\n\n```\n./test_docker.sh\n```\n\nTo run tests locally across all available python versions:\n\n```\n./test/run.py\n```\n\nTo run against a specific python version:\n\n```\nLC_ALL=en_US.UTF-8 python3 test/test.py\n```\n\n## libmagic python API compatibility\n\nThe python bindings shipped with libmagic use a module name that conflicts with this package. To work around this, python-magic includes a compatibility layer for the libmagic API. See [COMPAT.md](COMPAT.md) for a guide to libmagic / python-magic compatibility.\n\n## Versioning\n\nMinor version bumps should be backwards compatible. Major bumps are not.\n\n## Author\n\nWritten by Adam Hupp in 2001 for a project that never got off the\nground. It originally used SWIG for the C library bindings, but\nswitched to ctypes once that was part of the python standard library.\n\nYou can contact me via my [website](http://hupp.org/adam) or\n[GitHub](http://github.com/ahupp).\n\n## License\n\npython-magic is distributed under the MIT license. See the included\nLICENSE file for details.\n\nI am providing code in the repository to you under an open source license. Because this is my personal repository, the license you receive to my code is from me and not my employer (Facebook).\n\n\n",
- "description_content_type": "text/markdown",
- "keywords": [
- "mime",
- "magic",
- "file"
- ],
- "home_page": "http://github.com/ahupp/python-magic",
- "author": "Adam Hupp",
- "author_email": "adam@hupp.org",
- "license": "MIT",
- "classifier": [
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: Implementation :: CPython"
- ],
- "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/0b/aa/97165daa6e319409c5c2582e62736a7353bda3c90d90fdcb0b11e116dd2d/python-nvd3-0.15.0.tar.gz",
- "archive_info": {
- "hash": "sha256=fbd75ff47e0ef255b4aa4f3a8b10dc8b4024aa5a9a7abed5b2406bd3cb817715",
- "hashes": {
- "sha256": "fbd75ff47e0ef255b4aa4f3a8b10dc8b4024aa5a9a7abed5b2406bd3cb817715"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "python-nvd3",
- "version": "0.15.0",
- "summary": "Python NVD3 - Chart Library for d3.js",
- "description": "Python Wrapper for NVD3 - It's time for beautiful charts\n========================================================\n\n:Description: Python-nvd3 is a wrapper for NVD3 graph library\n:NVD3: NVD3 http://nvd3.org/\n:D3: Data-Driven Documents http://d3js.org/\n:Maintainers: Areski_ & Oz_\n:Contributors: `list of contributors <https://github.com/areski/python-nvd3/graphs/contributors>`_\n\n.. _Areski: https://github.com/areski/\n.. _Oz: https://github.com/oz123/\n\n.. image:: https://api.travis-ci.org/areski/python-nvd3.png?branch=develop\n :target: https://travis-ci.org/areski/python-nvd3\n\n.. image:: https://coveralls.io/repos/areski/python-nvd3/badge.png?branch=develop\n :target: https://coveralls.io/r/areski/python-nvd3?branch=develop\n\n.. image:: https://img.shields.io/pypi/v/python-nvd3.svg\n :target: https://pypi.python.org/pypi/python-nvd3/\n :alt: Latest Version\n\n.. image:: https://img.shields.io/pypi/dm/python-nvd3.svg\n :target: https://pypi.python.org/pypi/python-nvd3/\n :alt: Downloads\n\n.. image:: https://img.shields.io/pypi/pyversions/python-nvd3.svg\n :target: https://pypi.python.org/pypi/python-nvd3/\n :alt: Supported Python versions\n\n.. image:: https://img.shields.io/pypi/l/python-nvd3.svg\n :target: https://pypi.python.org/pypi/python-nvd3/\n :alt: License\n\n.. image:: https://requires.io/github/areski/python-nvd3/requirements.svg?branch=develop\n :target: https://requires.io/github/areski/python-nvd3/requirements/?branch=develop\n :alt: Requirements Status\n\nNVD3 is an attempt to build re-usable charts and chart components\nfor d3.js without taking away the power that d3.js offers you.\n\nPython-NVD3 makes your life easy! You write Python and the library\nrenders JavaScript for you!\nThese graphs can be part of your web application:\n\n .. image:: https://raw.githubusercontent.com/areski/python-nvd3/develop/docs/showcase/multiple-charts.png\n\n\n\n\nWant to try it yourself? Install python-nvd3, enter your python shell and try this quick demo::\n\n >>> from nvd3 import pieChart\n >>> type = 'pieChart'\n >>> chart = pieChart(name=type, color_category='category20c', height=450, width=450)\n >>> xdata = [\"Orange\", \"Banana\", \"Pear\", \"Kiwi\", \"Apple\", \"Strawberry\", \"Pineapple\"]\n >>> ydata = [3, 4, 0, 1, 5, 7, 3]\n >>> extra_serie = {\"tooltip\": {\"y_start\": \"\", \"y_end\": \" cal\"}}\n >>> chart.add_serie(y=ydata, x=xdata, extra=extra_serie)\n >>> chart.buildcontent()\n >>> print chart.htmlcontent\n\n\nThis will output the following HTML to render a live chart. The HTML could be\nstored into a HTML file, used in a Web application, or even used via Ipython Notebook::\n\n <div id=\"pieChart\"><svg style=\"width:450px;height:450px;\"></svg></div>\n <script>\n data_pieChart=[{\"values\": [{\"value\": 3, \"label\": \"Orange\"},\n {\"value\": 4, \"label\": \"Banana\"},\n {\"value\": 0, \"label\": \"Pear\"},\n {\"value\": 1, \"label\": \"Kiwi\"},\n {\"value\": 5, \"label\": \"Apple\"},\n {\"value\": 7, \"label\": \"Strawberry\"},\n {\"value\": 3, \"label\": \"Pineapple\"}], \"key\": \"Serie 1\"}];\n\n nv.addGraph(function() {\n var chart = nv.models.pieChart();\n chart.margin({top: 30, right: 60, bottom: 20, left: 60});\n var datum = data_pieChart[0].values;\n chart.tooltipContent(function(key, y, e, graph) {\n var x = String(key);\n var y = String(y) + ' cal';\n tooltip_str = '<center><b>'+x+'</b></center>' + y;\n return tooltip_str;\n });\n chart.showLegend(true);\n chart.showLabels(true);\n chart.donut(false);\n chart\n .x(function(d) { return d.label })\n .y(function(d) { return d.value });\n chart.width(450);\n chart.height(450);\n d3.select('#pieChart svg')\n .datum(datum)\n .transition().duration(500)\n .attr('width', 450)\n .attr('height', 450)\n .call(chart);\n });\n </script>\n\n\nDocumentation\n-------------\n\nCheck out the documentation on `Read the Docs`_ for some live Chart examples!\n\n.. _Read the Docs: http://python-nvd3.readthedocs.org\n\nInstallation\n------------\n\nInstall, upgrade and uninstall python-nvd3 with these commands::\n\n $ pip install python-nvd3\n $ pip install --upgrade python-nvd3\n $ pip uninstall python-nvd3\n\n\nDependecies\n-----------\n\nD3 and NvD3 can be installed through bower (which itself can be installed through npm).\nSee http://bower.io/ and https://npmjs.org for further information.\nTo install bower globally execute::\n\n $ npm install -g bower\n\nNote : you might prefer to save your npm dependencies locally in a ``package.json`` file.\n\nThen in the directory where you will use python-nvd3, just execute the following commands::\n\n $ bower install d3#3.3.8\n $ bower install nvd3#1.1.12-beta\n\nThis will create a directory \"bower_components\" where d3 & nvd3 will be saved.\n\nNote : you might prefer to save your bower dependencies locally in a ``bower.json`` file.\nYou can also configure the directory where your bower dependencies will be\nsaved adding a ``.bowerrc`` file in your project root directory.\n\n\nDjango Wrapper\n--------------\n\nThere is also a django wrapper for nvd3 available:\nhttps://github.com/areski/django-nvd3\n\n\nIPython Notebooks\n-----------------\n\nPython-NVD3 works nicely within IPython Notebooks (thanks to @jdavidheiser)\n\nSee the examples directory for an Ipython notebook with python-nvd3.\n\n\nLicense\n-------\n\nPython-nvd3 is licensed under MIT, see `MIT-LICENSE.txt`.\n\n\n\n\nHistory\n-------\n\n\n0.14.0 - (2015-12-09)\n---------------------\n\n* update project structure\n* remove setuptools from requirements\n\n\n0.13.8 - (2015-04-12)\n---------------------\n\n* fix scatterChart\n\n\n0.13.7 - (2015-04-06)\n---------------------\n\n* set format on x2Axis for focus\n\n\n0.13.6 - (2015-04-06)\n---------------------\n\n* add support for focusEnable\n\n* remove linePlusBarWithFocusChart as this is replaced by linePlusBarChart with option FocusEnable():\n http://nvd3-community.github.io/nvd3/examples/documentation.html#linePlusBarChart\n\n* Sourcing JS assets over https when appropriate\n\n\n0.13.5 (2014-11-13)\n-------------------\n\n* Fix: color_list extra arguments is not mandatory on piechart\n\n\n0.13.0 (2014-08-04)\n-------------------\n\n* User Jinja2 to create the JS charts\n\n\n0.11.0 (2013-10-09)\n-------------------\n\n* allow chart_attr to be set as follow 'xAxis': '.rotateLabels(-25)'\n this will turn into calling chart.xAxis.rotateLabels(-25)\n\n\n0.11.0 (2013-10-09)\n-------------------\n\n* date setting is replaced by x_is_date\n* refactoring\n\n\n0.10.2 (2013-10-04)\n-------------------\n\n* discreteBarChart support date on xAxis\n\n\n0.10.1 (2013-10-03)\n-------------------\n\n* Remove $ sign in linePlusBarWithFocusChart\n\n\n0.10.0 (2013-10-02)\n------------------\n\n* Support new chart linePlusBarWithFocusChart\n\n\n0.9.0 (2013-09-30)\n------------------\n\n* Use Bower to install D3 and NVD3\n\n\n0.8.0 (2013-08-15)\n------------------\n\n* add NVD3Chart.buildcontent() by cmorgan (Chris Morgan)\n* Add show_labels parameter for Piechart by RaD (Ruslan Popov)\n\n\n0.7.0 (2013-07-09)\n------------------\n\n* Generalise the axis_formatting & add support for hiding the legend by nzjrs (John Stowers)\n* Fix #7 from DanMeakin, wrong str conversion of x-axis dates\n\n\n0.6.0 (2013-06-05)\n------------------\n\n* Add AM_PM function for x-axis on lineChart\n\n\n0.5.2 (2013-05-31)\n------------------\n\n* ScatterChat option to pass 'size': '10' as argument of the series\n* Fix in setup.py for python3\n\n\n0.5.1 (2013-05-30)\n------------------\n\n* Fix multiChart with date\n\n\n0.5.0 (2013-05-28)\n------------------\n\n* Add color_list option on piechart\n\n\n0.4.1 (2013-05-06)\n------------------\n\n* Fix removed forced sorted on x-axis\n\n\n0.4.0 (2013-04-28)\n------------------\n\n* Add support for Python3\n\n\n0.3.6 (2013-04-24)\n------------------\n\n* Add custom dateformat var for tooltip\n\n\n0.3.5 (2013-04-23)\n------------------\n\n* Fix style\n\n\n0.3.4 (2013-04-23)\n------------------\n\n* Support for px and % on height and width\n* Add tag_script_js property to disable tag <script>\n\n\n0.3.3 (2013-04-23)\n------------------\n\n* Data series it now in javascript format\n\n\n0.3.2 (2013-04-22)\n------------------\n\n* Fix lineChart tooltip\n\n\n0.3.1 (2013-04-19)\n------------------\n\n* Option to change the color schemes\n* Set a specific color per serie\n\n\n0.3 (2013-04-19)\n----------------\n\n* Add tooltip support\n* Mix enhancement of APIs\n\n\n0.2 (2013-04-16)\n----------------\n\n* Proper project release including support for the following chart:\n\n lineWithFocusChart\n lineChart\n multiBarChart\n pieChart\n stackedAreaChart\n multiBarHorizontalChart\n linePlusBarChart\n cumulativeLineChart\n discreteBarChart\n scatterChart\n\n\n0.1 (2013-04-08)\n----------------\n\n* First release\n",
- "keywords": [
- "plot",
- "graph",
- "nvd3",
- "d3"
- ],
- "home_page": "http://github.com/areski/python-nvd3",
- "author": "Belaid Arezqui",
- "author_email": "areski@gmail.com",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Console",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.3",
- "Programming Language :: Python :: 3.4",
- "Programming Language :: Python :: 3.5",
- "Topic :: Multimedia :: Graphics :: Presentation",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ],
- "requires_dist": [
- "python-slugify>=1.2.5",
- "Jinja2>=2.8"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/b4/85/6aa722a11307ec572682023b76cad4c52cda708dfc25fcb4b4a6051da7ab/python_slugify-8.0.1-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395",
- "hashes": {
- "sha256": "70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "python-slugify",
- "version": "8.0.1",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "A Python slugify application that also handles Unicode",
- "description": "# Python Slugify\n\n**A Python slugify application that handles unicode**.\n\n[![status-image]][status-link]\n[![version-image]][version-link]\n[![coverage-image]][coverage-link]\n\n# Overview\n\n**Best attempt** to create slugs from unicode strings while keeping it **DRY**.\n\n# Notice\n\nThis module, by default installs and uses [text-unidecode](https://github.com/kmike/text-unidecode) _(GPL & Perl Artistic)_ for its decoding needs.\n\nHowever, there is an alternative decoding package called [Unidecode](https://github.com/avian2/unidecode) _(GPL)_. It can be installed as `python-slugify[unidecode]` for those who prefer it. `Unidecode` is believed to be more advanced.\n\n### `Official` Support Matrix\n\n| Python | Slugify |\n| -------------- | ------------------ |\n| `>= 2.7 < 3.6` | `< 5.0.0` |\n| `>= 3.6 < 3.7` | `>= 5.0.0 < 7.0.0` |\n| `>= 3.7` | `>= 7.0.0` |\n\n# How to install\n\n easy_install python-slugify |OR| easy_install python-slugify[unidecode]\n -- OR --\n pip install python-slugify |OR| pip install python-slugify[unidecode]\n\n# Options\n\n```python\ndef slugify(\n text,\n entities=True,\n decimal=True,\n hexadecimal=True,\n max_length=0,\n word_boundary=False,\n separator='-',\n save_order=False,\n stopwords=(),\n regex_pattern=None,\n lowercase=True,\n replacements=(),\n allow_unicode=False\n ):\n \"\"\"\n Make a slug from the given text.\n :param text (str): initial text\n :param entities (bool): converts html entities to unicode (foo & bar -> foo-bar)\n :param decimal (bool): converts html decimal to unicode (Ž -> Ž -> z)\n :param hexadecimal (bool): converts html hexadecimal to unicode (Ž -> Ž -> z)\n :param max_length (int): output string length\n :param word_boundary (bool): truncates to end of full words (length may be shorter than max_length)\n :param save_order (bool): if parameter is True and max_length > 0 return whole words in the initial order\n :param separator (str): separator between words\n :param stopwords (iterable): words to discount\n :param regex_pattern (str): regex pattern for disallowed characters\n :param lowercase (bool): activate case sensitivity by setting it to False\n :param replacements (iterable): list of replacement rules e.g. [['|', 'or'], ['%', 'percent']]\n :param allow_unicode (bool): allow unicode characters\n :return (str): slugify text\n \"\"\"\n```\n\n# How to use\n\n```python\nfrom slugify import slugify\n\ntxt = \"This is a test ---\"\nr = slugify(txt)\nself.assertEqual(r, \"this-is-a-test\")\n\ntxt = '影師嗎'\nr = slugify(txt)\nself.assertEqual(r, \"ying-shi-ma\")\n\ntxt = '影師嗎'\nr = slugify(txt, allow_unicode=True)\nself.assertEqual(r, \"影師嗎\")\n\ntxt = 'C\\'est déjà l\\'été.'\nr = slugify(txt)\nself.assertEqual(r, \"c-est-deja-l-ete\")\n\ntxt = 'Nín hǎo. Wǒ shì zhōng guó rén'\nr = slugify(txt)\nself.assertEqual(r, \"nin-hao-wo-shi-zhong-guo-ren\")\n\ntxt = 'Компьютер'\nr = slugify(txt)\nself.assertEqual(r, \"kompiuter\")\n\ntxt = 'jaja---lol-méméméoo--a'\nr = slugify(txt, max_length=9)\nself.assertEqual(r, \"jaja-lol\")\n\ntxt = 'jaja---lol-méméméoo--a'\nr = slugify(txt, max_length=15, word_boundary=True)\nself.assertEqual(r, \"jaja-lol-a\")\n\ntxt = 'jaja---lol-méméméoo--a'\nr = slugify(txt, max_length=20, word_boundary=True, separator=\".\")\nself.assertEqual(r, \"jaja.lol.mememeoo.a\")\n\ntxt = 'one two three four five'\nr = slugify(txt, max_length=13, word_boundary=True, save_order=True)\nself.assertEqual(r, \"one-two-three\")\n\ntxt = 'the quick brown fox jumps over the lazy dog'\nr = slugify(txt, stopwords=['the'])\nself.assertEqual(r, 'quick-brown-fox-jumps-over-lazy-dog')\n\ntxt = 'the quick brown fox jumps over the lazy dog in a hurry'\nr = slugify(txt, stopwords=['the', 'in', 'a', 'hurry'])\nself.assertEqual(r, 'quick-brown-fox-jumps-over-lazy-dog')\n\ntxt = 'thIs Has a stopword Stopword'\nr = slugify(txt, stopwords=['Stopword'], lowercase=False)\nself.assertEqual(r, 'thIs-Has-a-stopword')\n\ntxt = \"___This is a test___\"\nregex_pattern = r'[^-a-z0-9_]+'\nr = slugify(txt, regex_pattern=regex_pattern)\nself.assertEqual(r, \"___this-is-a-test___\")\n\ntxt = \"___This is a test___\"\nregex_pattern = r'[^-a-z0-9_]+'\nr = slugify(txt, separator='_', regex_pattern=regex_pattern)\nself.assertNotEqual(r, \"_this_is_a_test_\")\n\ntxt = '10 | 20 %'\nr = slugify(txt, replacements=[['|', 'or'], ['%', 'percent']])\nself.assertEqual(r, \"10-or-20-percent\")\n\ntxt = 'ÜBER Über German Umlaut'\nr = slugify(txt, replacements=[['Ü', 'UE'], ['ü', 'ue']])\nself.assertEqual(r, \"ueber-ueber-german-umlaut\")\n\ntxt = 'i love 🦄'\nr = slugify(txt, allow_unicode=True)\nself.assertEqual(r, \"i-love\")\n\ntxt = 'i love 🦄'\nr = slugify(txt, allow_unicode=True, regex_pattern=r'[^🦄]+')\nself.assertEqual(r, \"🦄\")\n\n```\n\nFor more examples, have a look at the [test.py](test.py) file.\n\n# Command Line Options\n\nWith the package, a command line tool called `slugify` is also installed.\n\nIt allows convenient command line access to all the features the `slugify` function supports. Call it with `-h` for help.\n\nThe command can take its input directly on the command line or from STDIN (when the `--stdin` flag is passed):\n\n```\n$ echo \"Taking input from STDIN\" | slugify --stdin\ntaking-input-from-stdin\n```\n\n```\n$ slugify taking input from the command line\ntaking-input-from-the-command-line\n```\n\nPlease note that when a multi-valued option such as `--stopwords` or `--replacements` is passed, you need to use `--` as separator before you start with the input:\n\n```\n$ slugify --stopwords the in a hurry -- the quick brown fox jumps over the lazy dog in a hurry\nquick-brown-fox-jumps-over-lazy-dog\n```\n\n# Running the tests\n\nTo run the tests against the current environment:\n\n python test.py\n\n# Contribution\n\nPlease read the ([wiki](https://github.com/un33k/python-slugify/wiki/Python-Slugify-Wiki)) page prior to raising any PRs.\n\n# License\n\nReleased under a ([MIT](LICENSE)) license.\n\n### Notes on GPL dependencies\nThough the dependencies may be GPL licensed, `python-slugify` itself is not considered a derivative work and will remain under the MIT license. \nIf you wish to avoid installation of any GPL licensed packages, please note that the default dependency `text-unidecode` explicitly lets you choose to use the [Artistic License](https://opensource.org/license/artistic-perl-1-0-2/) instead. Use without concern.\n\n# Version\n\nX.Y.Z Version\n\n `MAJOR` version -- when you make incompatible API changes,\n `MINOR` version -- when you add functionality in a backwards-compatible manner, and\n `PATCH` version -- when you make backwards-compatible bug fixes.\n\n[status-image]: https://github.com/un33k/python-slugify/actions/workflows/ci.yml/badge.svg\n[status-link]: https://github.com/un33k/python-slugify/actions/workflows/ci.yml\n[version-image]: https://img.shields.io/pypi/v/python-slugify.svg\n[version-link]: https://pypi.python.org/pypi/python-slugify\n[coverage-image]: https://coveralls.io/repos/un33k/python-slugify/badge.svg\n[coverage-link]: https://coveralls.io/r/un33k/python-slugify\n[download-image]: https://img.shields.io/pypi/dm/python-slugify.svg\n[download-link]: https://pypi.python.org/pypi/python-slugify\n\n# Sponsors\n\n[Neekware Inc.](http://neekware.com)\n\n\n",
- "description_content_type": "text/markdown",
- "home_page": "https://github.com/un33k/python-slugify",
- "author": "Val Neekman",
- "author_email": "info@neekware.com",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "Natural Language :: English",
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11"
- ],
- "requires_dist": [
- "text-unidecode (>=1.3)",
- "Unidecode (>=1.1.1) ; extra == 'unidecode'"
- ],
- "requires_python": ">=3.7",
- "provides_extra": [
- "unidecode"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/32/4d/aaf7eff5deb402fd9a24a1449a8119f00d74ae9c2efa79f8ef9994261fc2/pytz-2023.3.post1-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7",
- "hashes": {
- "sha256": "ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "pytz",
- "version": "2023.3.post1",
- "platform": [
- "Independent"
- ],
- "summary": "World timezone definitions, modern and historical",
- "description": "pytz - World Timezone Definitions for Python\n============================================\n\n:Author: Stuart Bishop <stuart@stuartbishop.net>\n\nIntroduction\n~~~~~~~~~~~~\n\npytz brings the Olson tz database into Python. This library allows\naccurate and cross platform timezone calculations using Python 2.4\nor higher. It also solves the issue of ambiguous times at the end\nof daylight saving time, which you can read more about in the Python\nLibrary Reference (``datetime.tzinfo``).\n\nAlmost all of the Olson timezones are supported.\n\n.. note::\n\n Projects using Python 3.9 or later should be using the support\n now included as part of the standard library, and third party\n packages work with it such as `tzdata <https://pypi.org/project/tzdata/>`_.\n pytz offers no advantages beyond backwards compatibility with\n code written for earlier versions of Python.\n\n.. note::\n\n This library differs from the documented Python API for\n tzinfo implementations; if you want to create local wallclock\n times you need to use the ``localize()`` method documented in this\n document. In addition, if you perform date arithmetic on local\n times that cross DST boundaries, the result may be in an incorrect\n timezone (ie. subtract 1 minute from 2002-10-27 1:00 EST and you get\n 2002-10-27 0:59 EST instead of the correct 2002-10-27 1:59 EDT). A\n ``normalize()`` method is provided to correct this. Unfortunately these\n issues cannot be resolved without modifying the Python datetime\n implementation (see PEP-431).\n\n\nInstallation\n~~~~~~~~~~~~\n\nThis package can either be installed using ``pip`` or from a tarball using the\nstandard Python distutils.\n\nIf you are installing using ``pip``, you don't need to download anything as the\nlatest version will be downloaded for you from PyPI::\n\n pip install pytz\n\nIf you are installing from a tarball, run the following command as an\nadministrative user::\n\n python setup.py install\n\n\npytz for Enterprise\n~~~~~~~~~~~~~~~~~~~\n\nAvailable as part of the Tidelift Subscription.\n\nThe maintainers of pytz and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. `Learn more. <https://tidelift.com/subscription/pkg/pypi-pytz?utm_source=pypi-pytz&utm_medium=referral&utm_campaign=enterprise&utm_term=repo>`_.\n\n\nExample & Usage\n~~~~~~~~~~~~~~~\n\nLocalized times and date arithmetic\n-----------------------------------\n\n>>> from datetime import datetime, timedelta\n>>> from pytz import timezone\n>>> import pytz\n>>> utc = pytz.utc\n>>> utc.zone\n'UTC'\n>>> eastern = timezone('US/Eastern')\n>>> eastern.zone\n'US/Eastern'\n>>> amsterdam = timezone('Europe/Amsterdam')\n>>> fmt = '%Y-%m-%d %H:%M:%S %Z%z'\n\nThis library only supports two ways of building a localized time. The\nfirst is to use the ``localize()`` method provided by the pytz library.\nThis is used to localize a naive datetime (datetime with no timezone\ninformation):\n\n>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))\n>>> print(loc_dt.strftime(fmt))\n2002-10-27 06:00:00 EST-0500\n\nThe second way of building a localized time is by converting an existing\nlocalized time using the standard ``astimezone()`` method:\n\n>>> ams_dt = loc_dt.astimezone(amsterdam)\n>>> ams_dt.strftime(fmt)\n'2002-10-27 12:00:00 CET+0100'\n\nUnfortunately using the tzinfo argument of the standard datetime\nconstructors ''does not work'' with pytz for many timezones.\n\n>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=amsterdam).strftime(fmt) # /!\\ Does not work this way!\n'2002-10-27 12:00:00 LMT+0018'\n\nIt is safe for timezones without daylight saving transitions though, such\nas UTC:\n\n>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=pytz.utc).strftime(fmt) # /!\\ Not recommended except for UTC\n'2002-10-27 12:00:00 UTC+0000'\n\nThe preferred way of dealing with times is to always work in UTC,\nconverting to localtime only when generating output to be read\nby humans.\n\n>>> utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc)\n>>> loc_dt = utc_dt.astimezone(eastern)\n>>> loc_dt.strftime(fmt)\n'2002-10-27 01:00:00 EST-0500'\n\nThis library also allows you to do date arithmetic using local\ntimes, although it is more complicated than working in UTC as you\nneed to use the ``normalize()`` method to handle daylight saving time\nand other timezone transitions. In this example, ``loc_dt`` is set\nto the instant when daylight saving time ends in the US/Eastern\ntimezone.\n\n>>> before = loc_dt - timedelta(minutes=10)\n>>> before.strftime(fmt)\n'2002-10-27 00:50:00 EST-0500'\n>>> eastern.normalize(before).strftime(fmt)\n'2002-10-27 01:50:00 EDT-0400'\n>>> after = eastern.normalize(before + timedelta(minutes=20))\n>>> after.strftime(fmt)\n'2002-10-27 01:10:00 EST-0500'\n\nCreating local times is also tricky, and the reason why working with\nlocal times is not recommended. Unfortunately, you cannot just pass\na ``tzinfo`` argument when constructing a datetime (see the next\nsection for more details)\n\n>>> dt = datetime(2002, 10, 27, 1, 30, 0)\n>>> dt1 = eastern.localize(dt, is_dst=True)\n>>> dt1.strftime(fmt)\n'2002-10-27 01:30:00 EDT-0400'\n>>> dt2 = eastern.localize(dt, is_dst=False)\n>>> dt2.strftime(fmt)\n'2002-10-27 01:30:00 EST-0500'\n\nConverting between timezones is more easily done, using the\nstandard astimezone method.\n\n>>> utc_dt = datetime.fromtimestamp(1143408899, tz=utc)\n>>> utc_dt.strftime(fmt)\n'2006-03-26 21:34:59 UTC+0000'\n>>> au_tz = timezone('Australia/Sydney')\n>>> au_dt = utc_dt.astimezone(au_tz)\n>>> au_dt.strftime(fmt)\n'2006-03-27 08:34:59 AEDT+1100'\n>>> utc_dt2 = au_dt.astimezone(utc)\n>>> utc_dt2.strftime(fmt)\n'2006-03-26 21:34:59 UTC+0000'\n>>> utc_dt == utc_dt2\nTrue\n\nYou can take shortcuts when dealing with the UTC side of timezone\nconversions. ``normalize()`` and ``localize()`` are not really\nnecessary when there are no daylight saving time transitions to\ndeal with.\n\n>>> utc_dt = datetime.fromtimestamp(1143408899, tz=utc)\n>>> utc_dt.strftime(fmt)\n'2006-03-26 21:34:59 UTC+0000'\n>>> au_tz = timezone('Australia/Sydney')\n>>> au_dt = au_tz.normalize(utc_dt.astimezone(au_tz))\n>>> au_dt.strftime(fmt)\n'2006-03-27 08:34:59 AEDT+1100'\n>>> utc_dt2 = au_dt.astimezone(utc)\n>>> utc_dt2.strftime(fmt)\n'2006-03-26 21:34:59 UTC+0000'\n\n\n``tzinfo`` API\n--------------\n\nThe ``tzinfo`` instances returned by the ``timezone()`` function have\nbeen extended to cope with ambiguous times by adding an ``is_dst``\nparameter to the ``utcoffset()``, ``dst()`` && ``tzname()`` methods.\n\n>>> tz = timezone('America/St_Johns')\n\n>>> normal = datetime(2009, 9, 1)\n>>> ambiguous = datetime(2009, 10, 31, 23, 30)\n\nThe ``is_dst`` parameter is ignored for most timestamps. It is only used\nduring DST transition ambiguous periods to resolve that ambiguity.\n\n>>> print(tz.utcoffset(normal, is_dst=True))\n-1 day, 21:30:00\n>>> print(tz.dst(normal, is_dst=True))\n1:00:00\n>>> tz.tzname(normal, is_dst=True)\n'NDT'\n\n>>> print(tz.utcoffset(ambiguous, is_dst=True))\n-1 day, 21:30:00\n>>> print(tz.dst(ambiguous, is_dst=True))\n1:00:00\n>>> tz.tzname(ambiguous, is_dst=True)\n'NDT'\n\n>>> print(tz.utcoffset(normal, is_dst=False))\n-1 day, 21:30:00\n>>> tz.dst(normal, is_dst=False).seconds\n3600\n>>> tz.tzname(normal, is_dst=False)\n'NDT'\n\n>>> print(tz.utcoffset(ambiguous, is_dst=False))\n-1 day, 20:30:00\n>>> tz.dst(ambiguous, is_dst=False)\ndatetime.timedelta(0)\n>>> tz.tzname(ambiguous, is_dst=False)\n'NST'\n\nIf ``is_dst`` is not specified, ambiguous timestamps will raise\nan ``pytz.exceptions.AmbiguousTimeError`` exception.\n\n>>> print(tz.utcoffset(normal))\n-1 day, 21:30:00\n>>> print(tz.dst(normal))\n1:00:00\n>>> tz.tzname(normal)\n'NDT'\n\n>>> import pytz.exceptions\n>>> try:\n... tz.utcoffset(ambiguous)\n... except pytz.exceptions.AmbiguousTimeError:\n... print('pytz.exceptions.AmbiguousTimeError: %s' % ambiguous)\npytz.exceptions.AmbiguousTimeError: 2009-10-31 23:30:00\n>>> try:\n... tz.dst(ambiguous)\n... except pytz.exceptions.AmbiguousTimeError:\n... print('pytz.exceptions.AmbiguousTimeError: %s' % ambiguous)\npytz.exceptions.AmbiguousTimeError: 2009-10-31 23:30:00\n>>> try:\n... tz.tzname(ambiguous)\n... except pytz.exceptions.AmbiguousTimeError:\n... print('pytz.exceptions.AmbiguousTimeError: %s' % ambiguous)\npytz.exceptions.AmbiguousTimeError: 2009-10-31 23:30:00\n\n\nProblems with Localtime\n~~~~~~~~~~~~~~~~~~~~~~~\n\nThe major problem we have to deal with is that certain datetimes\nmay occur twice in a year. For example, in the US/Eastern timezone\non the last Sunday morning in October, the following sequence\nhappens:\n\n - 01:00 EDT occurs\n - 1 hour later, instead of 2:00am the clock is turned back 1 hour\n and 01:00 happens again (this time 01:00 EST)\n\nIn fact, every instant between 01:00 and 02:00 occurs twice. This means\nthat if you try and create a time in the 'US/Eastern' timezone\nthe standard datetime syntax, there is no way to specify if you meant\nbefore of after the end-of-daylight-saving-time transition. Using the\npytz custom syntax, the best you can do is make an educated guess:\n\n>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 1, 30, 00))\n>>> loc_dt.strftime(fmt)\n'2002-10-27 01:30:00 EST-0500'\n\nAs you can see, the system has chosen one for you and there is a 50%\nchance of it being out by one hour. For some applications, this does\nnot matter. However, if you are trying to schedule meetings with people\nin different timezones or analyze log files it is not acceptable.\n\nThe best and simplest solution is to stick with using UTC. The pytz\npackage encourages using UTC for internal timezone representation by\nincluding a special UTC implementation based on the standard Python\nreference implementation in the Python documentation.\n\nThe UTC timezone unpickles to be the same instance, and pickles to a\nsmaller size than other pytz tzinfo instances. The UTC implementation\ncan be obtained as pytz.utc, pytz.UTC, or pytz.timezone('UTC').\n\n>>> import pickle, pytz\n>>> dt = datetime(2005, 3, 1, 14, 13, 21, tzinfo=utc)\n>>> naive = dt.replace(tzinfo=None)\n>>> p = pickle.dumps(dt, 1)\n>>> naive_p = pickle.dumps(naive, 1)\n>>> len(p) - len(naive_p)\n17\n>>> new = pickle.loads(p)\n>>> new == dt\nTrue\n>>> new is dt\nFalse\n>>> new.tzinfo is dt.tzinfo\nTrue\n>>> pytz.utc is pytz.UTC is pytz.timezone('UTC')\nTrue\n\nNote that some other timezones are commonly thought of as the same (GMT,\nGreenwich, Universal, etc.). The definition of UTC is distinct from these\nother timezones, and they are not equivalent. For this reason, they will\nnot compare the same in Python.\n\n>>> utc == pytz.timezone('GMT')\nFalse\n\nSee the section `What is UTC`_, below.\n\nIf you insist on working with local times, this library provides a\nfacility for constructing them unambiguously:\n\n>>> loc_dt = datetime(2002, 10, 27, 1, 30, 00)\n>>> est_dt = eastern.localize(loc_dt, is_dst=True)\n>>> edt_dt = eastern.localize(loc_dt, is_dst=False)\n>>> print(est_dt.strftime(fmt) + ' / ' + edt_dt.strftime(fmt))\n2002-10-27 01:30:00 EDT-0400 / 2002-10-27 01:30:00 EST-0500\n\nIf you pass None as the is_dst flag to localize(), pytz will refuse to\nguess and raise exceptions if you try to build ambiguous or non-existent\ntimes.\n\nFor example, 1:30am on 27th Oct 2002 happened twice in the US/Eastern\ntimezone when the clocks where put back at the end of Daylight Saving\nTime:\n\n>>> dt = datetime(2002, 10, 27, 1, 30, 00)\n>>> try:\n... eastern.localize(dt, is_dst=None)\n... except pytz.exceptions.AmbiguousTimeError:\n... print('pytz.exceptions.AmbiguousTimeError: %s' % dt)\npytz.exceptions.AmbiguousTimeError: 2002-10-27 01:30:00\n\nSimilarly, 2:30am on 7th April 2002 never happened at all in the\nUS/Eastern timezone, as the clocks where put forward at 2:00am skipping\nthe entire hour:\n\n>>> dt = datetime(2002, 4, 7, 2, 30, 00)\n>>> try:\n... eastern.localize(dt, is_dst=None)\n... except pytz.exceptions.NonExistentTimeError:\n... print('pytz.exceptions.NonExistentTimeError: %s' % dt)\npytz.exceptions.NonExistentTimeError: 2002-04-07 02:30:00\n\nBoth of these exceptions share a common base class to make error handling\neasier:\n\n>>> isinstance(pytz.AmbiguousTimeError(), pytz.InvalidTimeError)\nTrue\n>>> isinstance(pytz.NonExistentTimeError(), pytz.InvalidTimeError)\nTrue\n\n\nA special case is where countries change their timezone definitions\nwith no daylight savings time switch. For example, in 1915 Warsaw\nswitched from Warsaw time to Central European time with no daylight savings\ntransition. So at the stroke of midnight on August 5th 1915 the clocks\nwere wound back 24 minutes creating an ambiguous time period that cannot\nbe specified without referring to the timezone abbreviation or the\nactual UTC offset. In this case midnight happened twice, neither time\nduring a daylight saving time period. pytz handles this transition by\ntreating the ambiguous period before the switch as daylight savings\ntime, and the ambiguous period after as standard time.\n\n\n>>> warsaw = pytz.timezone('Europe/Warsaw')\n>>> amb_dt1 = warsaw.localize(datetime(1915, 8, 4, 23, 59, 59), is_dst=True)\n>>> amb_dt1.strftime(fmt)\n'1915-08-04 23:59:59 WMT+0124'\n>>> amb_dt2 = warsaw.localize(datetime(1915, 8, 4, 23, 59, 59), is_dst=False)\n>>> amb_dt2.strftime(fmt)\n'1915-08-04 23:59:59 CET+0100'\n>>> switch_dt = warsaw.localize(datetime(1915, 8, 5, 00, 00, 00), is_dst=False)\n>>> switch_dt.strftime(fmt)\n'1915-08-05 00:00:00 CET+0100'\n>>> str(switch_dt - amb_dt1)\n'0:24:01'\n>>> str(switch_dt - amb_dt2)\n'0:00:01'\n\nThe best way of creating a time during an ambiguous time period is\nby converting from another timezone such as UTC:\n\n>>> utc_dt = datetime(1915, 8, 4, 22, 36, tzinfo=pytz.utc)\n>>> utc_dt.astimezone(warsaw).strftime(fmt)\n'1915-08-04 23:36:00 CET+0100'\n\nThe standard Python way of handling all these ambiguities is not to\nhandle them, such as demonstrated in this example using the US/Eastern\ntimezone definition from the Python documentation (Note that this\nimplementation only works for dates between 1987 and 2006 - it is\nincluded for tests only!):\n\n>>> from pytz.reference import Eastern # pytz.reference only for tests\n>>> dt = datetime(2002, 10, 27, 0, 30, tzinfo=Eastern)\n>>> str(dt)\n'2002-10-27 00:30:00-04:00'\n>>> str(dt + timedelta(hours=1))\n'2002-10-27 01:30:00-05:00'\n>>> str(dt + timedelta(hours=2))\n'2002-10-27 02:30:00-05:00'\n>>> str(dt + timedelta(hours=3))\n'2002-10-27 03:30:00-05:00'\n\nNotice the first two results? At first glance you might think they are\ncorrect, but taking the UTC offset into account you find that they are\nactually two hours appart instead of the 1 hour we asked for.\n\n>>> from pytz.reference import UTC # pytz.reference only for tests\n>>> str(dt.astimezone(UTC))\n'2002-10-27 04:30:00+00:00'\n>>> str((dt + timedelta(hours=1)).astimezone(UTC))\n'2002-10-27 06:30:00+00:00'\n\n\nCountry Information\n~~~~~~~~~~~~~~~~~~~\n\nA mechanism is provided to access the timezones commonly in use\nfor a particular country, looked up using the ISO 3166 country code.\nIt returns a list of strings that can be used to retrieve the relevant\ntzinfo instance using ``pytz.timezone()``:\n\n>>> print(' '.join(pytz.country_timezones['nz']))\nPacific/Auckland Pacific/Chatham\n\nThe Olson database comes with a ISO 3166 country code to English country\nname mapping that pytz exposes as a dictionary:\n\n>>> print(pytz.country_names['nz'])\nNew Zealand\n\n\nWhat is UTC\n~~~~~~~~~~~\n\n'UTC' is `Coordinated Universal Time`_. It is a successor to, but distinct\nfrom, Greenwich Mean Time (GMT) and the various definitions of Universal\nTime. UTC is now the worldwide standard for regulating clocks and time\nmeasurement.\n\nAll other timezones are defined relative to UTC, and include offsets like\nUTC+0800 - hours to add or subtract from UTC to derive the local time. No\ndaylight saving time occurs in UTC, making it a useful timezone to perform\ndate arithmetic without worrying about the confusion and ambiguities caused\nby daylight saving time transitions, your country changing its timezone, or\nmobile computers that roam through multiple timezones.\n\n.. _Coordinated Universal Time: https://en.wikipedia.org/wiki/Coordinated_Universal_Time\n\n\nHelpers\n~~~~~~~\n\nThere are two lists of timezones provided.\n\n``all_timezones`` is the exhaustive list of the timezone names that can\nbe used.\n\n>>> from pytz import all_timezones\n>>> len(all_timezones) >= 500\nTrue\n>>> 'Etc/Greenwich' in all_timezones\nTrue\n\n``common_timezones`` is a list of useful, current timezones. It doesn't\ncontain deprecated zones or historical zones, except for a few I've\ndeemed in common usage, such as US/Eastern (open a bug report if you\nthink other timezones are deserving of being included here). It is also\na sequence of strings.\n\n>>> from pytz import common_timezones\n>>> len(common_timezones) < len(all_timezones)\nTrue\n>>> 'Etc/Greenwich' in common_timezones\nFalse\n>>> 'Australia/Melbourne' in common_timezones\nTrue\n>>> 'US/Eastern' in common_timezones\nTrue\n>>> 'Canada/Eastern' in common_timezones\nTrue\n>>> 'Australia/Yancowinna' in all_timezones\nTrue\n>>> 'Australia/Yancowinna' in common_timezones\nFalse\n\nBoth ``common_timezones`` and ``all_timezones`` are alphabetically\nsorted:\n\n>>> common_timezones_dupe = common_timezones[:]\n>>> common_timezones_dupe.sort()\n>>> common_timezones == common_timezones_dupe\nTrue\n>>> all_timezones_dupe = all_timezones[:]\n>>> all_timezones_dupe.sort()\n>>> all_timezones == all_timezones_dupe\nTrue\n\n``all_timezones`` and ``common_timezones`` are also available as sets.\n\n>>> from pytz import all_timezones_set, common_timezones_set\n>>> 'US/Eastern' in all_timezones_set\nTrue\n>>> 'US/Eastern' in common_timezones_set\nTrue\n>>> 'Australia/Victoria' in common_timezones_set\nFalse\n\nYou can also retrieve lists of timezones used by particular countries\nusing the ``country_timezones()`` function. It requires an ISO-3166\ntwo letter country code.\n\n>>> from pytz import country_timezones\n>>> print(' '.join(country_timezones('ch')))\nEurope/Zurich\n>>> print(' '.join(country_timezones('CH')))\nEurope/Zurich\n\n\nInternationalization - i18n/l10n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nPytz is an interface to the IANA database, which uses ASCII names. The `Unicode Consortium's Unicode Locales (CLDR) <http://cldr.unicode.org>`_\nproject provides translations. Python packages such as\n`Babel <https://babel.pocoo.org/en/latest/api/dates.html#timezone-functionality>`_\nand Thomas Khyn's `l18n <https://pypi.org/project/l18n/>`_ package can be used\nto access these translations from Python.\n\n\nLicense\n~~~~~~~\n\nMIT license.\n\nThis code is also available as part of Zope 3 under the Zope Public\nLicense, Version 2.1 (ZPL).\n\nI'm happy to relicense this code if necessary for inclusion in other\nopen source projects.\n\n\nLatest Versions\n~~~~~~~~~~~~~~~\n\nThis package will be updated after releases of the Olson timezone\ndatabase. The latest version can be downloaded from the `Python Package\nIndex <https://pypi.org/project/pytz/>`_. The code that is used\nto generate this distribution is hosted on Github and available\nusing git::\n\n git clone https://github.com/stub42/pytz.git\n\nAnnouncements of new releases are made on\n`Launchpad <https://launchpad.net/pytz>`_, and the\n`Atom feed <http://feeds.launchpad.net/pytz/announcements.atom>`_\nhosted there.\n\n\nBugs, Feature Requests & Patches\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nBugs should be reported on `Github <https://github.com/stub42/pytz/issues>`_.\nFeature requests are unlikely to be considered, and efforts instead directed\nto timezone support now built into Python or packages that work with it.\n\n\nSecurity Issues\n~~~~~~~~~~~~~~~\n\nReports about security issues can be made via `Tidelift <https://tidelift.com/security>`_.\n\n\nIssues & Limitations\n~~~~~~~~~~~~~~~~~~~~\n\n- This project is in maintenance mode. Projects using Python 3.9 or later\n are best served by using the timezone functionaly now included in core\n Python and packages that work with it such as `tzdata <https://pypi.org/project/tzdata/>`_.\n\n- Offsets from UTC are rounded to the nearest whole minute, so timezones\n such as Europe/Amsterdam pre 1937 will be up to 30 seconds out. This\n was a limitation of the Python datetime library.\n\n- If you think a timezone definition is incorrect, I probably can't fix\n it. pytz is a direct translation of the Olson timezone database, and\n changes to the timezone definitions need to be made to this source.\n If you find errors they should be reported to the time zone mailing\n list, linked from http://www.iana.org/time-zones.\n\n\nFurther Reading\n~~~~~~~~~~~~~~~\n\nMore info than you want to know about timezones:\nhttps://data.iana.org/time-zones/tz-link.html\n\n\nContact\n~~~~~~~\n\nStuart Bishop <stuart@stuartbishop.net>\n\n\n",
- "keywords": [
- "timezone",
- "tzinfo",
- "datetime",
- "olson",
- "time"
- ],
- "home_page": "http://pythonhosted.org/pytz",
- "download_url": "https://pypi.org/project/pytz/",
- "author": "Stuart Bishop",
- "author_email": "stuart@stuartbishop.net",
- "maintainer": "Stuart Bishop",
- "maintainer_email": "stuart@stuartbishop.net",
- "license": "MIT",
- "classifier": [
- "Development Status :: 6 - Mature",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Natural Language :: English",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.4",
- "Programming Language :: Python :: 2.5",
- "Programming Language :: Python :: 2.6",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.1",
- "Programming Language :: Python :: 3.2",
- "Programming Language :: Python :: 3.3",
- "Programming Language :: Python :: 3.4",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/e0/4f/4474bda990ee740a020cbc3eb271925ef7daa7c8444240d34ff62c8442a3/pytzdata-2020.1-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f",
- "hashes": {
- "sha256": "e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "pytzdata",
- "version": "2020.1",
- "summary": "The Olson timezone database for Python.",
- "description": "Pytzdata\n########\n\n.. image:: https://travis-ci.org/sdispater/pytzdata.png\n :alt: Pytzdata Build status\n :target: https://travis-ci.org/sdispater/pytzdata\n\nThe Olson timezone database for Python.\n\nSupports Python **2.7+** and **3.5+**.\n\n\nInstallation\n============\n\n pip install pytzdata\n\n\nUsage\n=====\n\nYou can access the content of a specific timezone file by using the `tz_file()` function:\n\n.. code-block:: python\n\n from pytzdata import tz_file\n\n with tz_file('Europe/Paris') as f:\n # Do something with the file\n\nIf you just want to know the path to a specific timezone file, you may use the `tz_path()` function:\n\n.. code-block:: python\n\n from pytzdata import tz_path\n\n tz_path('Europe/Paris')\n\nBy default, ``pytzdata`` will use the bundled timezone database, however you can set\na custom directory that holds the timezone files using the ``set_directory`` function:\n\n.. code-block:: python\n\n import pytzdata\n\n pytzdata.set_directory('/custom/zoneinfo')\n\nYou can also set the ``PYTZDATA_TZDATADIR`` environment variable to set a custom directory.\n\n\nRelease\n=======\n\nTo make a new release just follow these steps:\n\n- ``make data``\n- Update version numbers in ``pytzdata/version.py`` and ``tests/test_version.py``\n- ``make tox``\n\n\nResources\n=========\n\n* `Issue Tracker <https://github.com/sdispater/pytzdata/issues>`_\n\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://github.com/sdispater/pytzdata",
- "author": "Sébastien Eustace",
- "author_email": "sebastien@eustace.io",
- "license": "MIT",
- "classifier": [
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.4",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ],
- "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
- "project_url": [
- "Repository, https://github.com/sdispater/pytzdata"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/56/8f/e8b49ad21d26111493dc2d5cae4d7efbd0e2e065440665f5023515f87f64/PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "archive_info": {
- "hash": "sha256=432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782",
- "hashes": {
- "sha256": "432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "PyYAML",
- "version": "6.0",
- "platform": [
- "Any"
- ],
- "summary": "YAML parser and emitter for Python",
- "description": "YAML is a data serialization format designed for human readability\nand interaction with scripting languages. PyYAML is a YAML parser\nand emitter for Python.\n\nPyYAML features a complete YAML 1.1 parser, Unicode support, pickle\nsupport, capable extension API, and sensible error messages. PyYAML\nsupports standard YAML tags and provides Python-specific tags that\nallow to represent an arbitrary Python object.\n\nPyYAML is applicable for a broad range of tasks from complex\nconfiguration files to object serialization and persistence.\n",
- "home_page": "https://pyyaml.org/",
- "download_url": "https://pypi.org/project/PyYAML/",
- "author": "Kirill Simonov",
- "author_email": "xi@resolvent.net",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Cython",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "Topic :: Text Processing :: Markup"
- ],
- "requires_python": ">=3.6",
- "project_url": [
- "Bug Tracker, https://github.com/yaml/pyyaml/issues",
- "CI, https://github.com/yaml/pyyaml/actions",
- "Documentation, https://pyyaml.org/wiki/PyYAMLDocumentation",
- "Mailing lists, http://lists.sourceforge.net/lists/listinfo/yaml-core",
- "Source Code, https://github.com/yaml/pyyaml"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/be/8e/56d6f1e2d591f4d6cbcba446cac4a1b0dc4f584537e2071d9bcee8eeab6b/referencing-0.30.2-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf",
- "hashes": {
- "sha256": "449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "referencing",
- "version": "0.30.2",
- "summary": "JSON Referencing + Python",
- "description": "===============\n``referencing``\n===============\n\n|PyPI| |Pythons| |CI| |ReadTheDocs| |pre-commit|\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/referencing.svg\n :alt: PyPI version\n :target: https://pypi.org/project/referencing/\n\n.. |Pythons| image:: https://img.shields.io/pypi/pyversions/referencing.svg\n :alt: Supported Python versions\n :target: https://pypi.org/project/referencing/\n\n.. |CI| image:: https://github.com/python-jsonschema/referencing/workflows/CI/badge.svg\n :alt: Build status\n :target: https://github.com/python-jsonschema/referencing/actions?query=workflow%3ACI\n\n.. |ReadTheDocs| image:: https://readthedocs.org/projects/referencing/badge/?version=stable&style=flat\n :alt: ReadTheDocs status\n :target: https://referencing.readthedocs.io/en/stable/\n\n.. |pre-commit| image:: https://results.pre-commit.ci/badge/github/python-jsonschema/referencing/main.svg\n :alt: pre-commit.ci status\n :target: https://results.pre-commit.ci/latest/github/python-jsonschema/referencing/main\n\n\nAn implementation-agnostic implementation of JSON reference resolution.\n\nSee `the documentation <https://referencing.readthedocs.io/>`_ for more details.\n",
- "description_content_type": "text/x-rst",
- "keywords": [
- "asyncapi",
- "json",
- "jsonschema",
- "openapi",
- "referencing"
- ],
- "author": "Julian Berman",
- "author_email": "Julian+referencing@GrayVines.com",
- "license": "MIT",
- "classifier": [
- "Development Status :: 3 - Alpha",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: File Formats :: JSON",
- "Topic :: File Formats :: JSON :: JSON Schema"
- ],
- "requires_dist": [
- "attrs>=22.2.0",
- "rpds-py>=0.7.0"
- ],
- "requires_python": ">=3.8",
- "project_url": [
- "Documentation, https://referencing.readthedocs.io/",
- "Homepage, https://github.com/python-jsonschema/referencing",
- "Issues, https://github.com/python-jsonschema/referencing/issues/",
- "Funding, https://github.com/sponsors/Julian",
- "Source, https://github.com/python-jsonschema/referencing"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/29/c1/24814557f1d22c56d50280771a17307e6bf87b70727d975fd6b2ce6b014a/requests-2.25.1-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e",
- "hashes": {
- "sha256": "c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "requests",
- "version": "2.25.1",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "Python HTTP for Humans.",
- "description": "# Requests\n\n**Requests** is a simple, yet elegant HTTP library.\n\n```python\n>>> import requests\n>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))\n>>> r.status_code\n200\n>>> r.headers['content-type']\n'application/json; charset=utf8'\n>>> r.encoding\n'utf-8'\n>>> r.text\n'{\"type\":\"User\"...'\n>>> r.json()\n{'disk_usage': 368627, 'private_gists': 484, ...}\n```\n\nRequests allows you to send HTTP/1.1 requests extremely easily. There’s no need to manually add query strings to your URLs, or to form-encode your `PUT` & `POST` data — but nowadays, just use the `json` method!\n\nRequests is one of the most downloaded Python package today, pulling in around `14M downloads / week`— according to GitHub, Requests is currently [depended upon](https://github.com/psf/requests/network/dependents?package_id=UGFja2FnZS01NzA4OTExNg%3D%3D) by `500,000+` repositories. You may certainly put your trust in this code.\n\n[](https://pepy.tech/project/requests/month)\n[](https://pypi.org/project/requests)\n[](https://github.com/psf/requests/graphs/contributors)\n\n## Installing Requests and Supported Versions\n\nRequests is available on PyPI:\n\n```console\n$ python -m pip install requests\n```\n\nRequests officially supports Python 2.7 & 3.5+.\n\n## Supported Features & Best–Practices\n\nRequests is ready for the demands of building robust and reliable HTTP–speaking applications, for the needs of today.\n\n- Keep-Alive & Connection Pooling\n- International Domains and URLs\n- Sessions with Cookie Persistence\n- Browser-style TLS/SSL Verification\n- Basic & Digest Authentication\n- Familiar `dict`–like Cookies\n- Automatic Content Decompression and Decoding\n- Multi-part File Uploads\n- SOCKS Proxy Support\n- Connection Timeouts\n- Streaming Downloads\n- Automatic honoring of `.netrc`\n- Chunked HTTP Requests\n\n## API Reference and User Guide available on [Read the Docs](https://requests.readthedocs.io)\n\n[](https://requests.readthedocs.io)\n\n---\n\n[](https://kennethreitz.org) [](https://www.python.org/psf)\n\n\n",
- "description_content_type": "text/markdown",
- "home_page": "https://requests.readthedocs.io",
- "author": "Kenneth Reitz",
- "author_email": "me@kennethreitz.org",
- "license": "Apache 2.0",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "Natural Language :: English",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy"
- ],
- "requires_dist": [
- "chardet (<5,>=3.0.2)",
- "idna (<3,>=2.5)",
- "urllib3 (<1.27,>=1.21.1)",
- "certifi (>=2017.4.17)",
- "pyOpenSSL (>=0.14) ; extra == 'security'",
- "cryptography (>=1.3.4) ; extra == 'security'",
- "PySocks (!=1.5.7,>=1.5.6) ; extra == 'socks'",
- "win-inet-pton ; (sys_platform == \"win32\" and python_version == \"2.7\") and extra == 'socks'"
- ],
- "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
- "project_url": [
- "Documentation, https://requests.readthedocs.io",
- "Source, https://github.com/psf/requests"
- ],
- "provides_extra": [
- "security",
- "socks"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa",
- "hashes": {
- "sha256": "24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "rfc3339-validator",
- "version": "0.1.4",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "A pure python RFC3339 validator",
- "description": "# rfc3339-validator\n\nA pure python RFC3339 validator\n\n\n[](https://pypi.python.org/pypi/rfc3339_validator)\n[](https://travis-ci.org/naimetti/rfc3339-validator)\n\n# Install\n\n```shell script\npip install rfc3339-validator\n```\n\n# Usage\n\n```python\nfrom rfc3339_validator import validate_rfc3339\n\nvalidate_rfc3339('1424-45-93T15:32:12.9023368Z')\n>>> False\n\nvalidate_rfc3339('2001-10-23T15:32:12.9023368Z')\n>>> True\n```\n\n\n - Free software: MIT license\n\n\n",
- "description_content_type": "text/markdown",
- "keywords": [
- "rfc3339",
- "validator"
- ],
- "home_page": "https://github.com/naimetti/rfc3339-validator",
- "author": "Nicolas Aimetti",
- "author_email": "naimetti@yahoo.com.ar",
- "license": "MIT license",
- "classifier": [
- "Development Status :: 2 - Pre-Alpha",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Natural Language :: English",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8"
- ],
- "requires_dist": [
- "six"
- ],
- "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/be/2a/4e62ff633612f746f88618852a626bbe24226eba5e7ac90e91dcfd6a414e/rich-13.6.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=2b38e2fe9ca72c9a00170a1a2d20c63c790d0e10ef1fe35eba76e1e7b1d7d245",
- "hashes": {
- "sha256": "2b38e2fe9ca72c9a00170a1a2d20c63c790d0e10ef1fe35eba76e1e7b1d7d245"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "rich",
- "version": "13.6.0",
- "summary": "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal",
- "description": "[](https://pypi.org/project/rich/) [](https://badge.fury.io/py/rich)\n\n[](https://pepy.tech/project/rich)\n[](https://codecov.io/gh/Textualize/rich)\n[](https://www.willmcgugan.com/tag/rich/)\n[](https://twitter.com/willmcgugan)\n\n\n\n[English readme](https://github.com/textualize/rich/blob/master/README.md)\n • [简体中文 readme](https://github.com/textualize/rich/blob/master/README.cn.md)\n • [正體中文 readme](https://github.com/textualize/rich/blob/master/README.zh-tw.md)\n • [Lengua española readme](https://github.com/textualize/rich/blob/master/README.es.md)\n • [Deutsche readme](https://github.com/textualize/rich/blob/master/README.de.md)\n • [Läs på svenska](https://github.com/textualize/rich/blob/master/README.sv.md)\n • [日本語 readme](https://github.com/textualize/rich/blob/master/README.ja.md)\n • [한국어 readme](https://github.com/textualize/rich/blob/master/README.kr.md)\n • [Français readme](https://github.com/textualize/rich/blob/master/README.fr.md)\n • [Schwizerdütsch readme](https://github.com/textualize/rich/blob/master/README.de-ch.md)\n • [हिन्दी readme](https://github.com/textualize/rich/blob/master/README.hi.md)\n • [Português brasileiro readme](https://github.com/textualize/rich/blob/master/README.pt-br.md)\n • [Italian readme](https://github.com/textualize/rich/blob/master/README.it.md)\n • [Русский readme](https://github.com/textualize/rich/blob/master/README.ru.md)\n • [Indonesian readme](https://github.com/textualize/rich/blob/master/README.id.md)\n • [فارسی readme](https://github.com/textualize/rich/blob/master/README.fa.md)\n • [Türkçe readme](https://github.com/textualize/rich/blob/master/README.tr.md)\n • [Polskie readme](https://github.com/textualize/rich/blob/master/README.pl.md)\n\n\nRich is a Python library for _rich_ text and beautiful formatting in the terminal.\n\nThe [Rich API](https://rich.readthedocs.io/en/latest/) makes it easy to add color and style to terminal output. Rich can also render pretty tables, progress bars, markdown, syntax highlighted source code, tracebacks, and more — out of the box.\n\n\n\nFor a video introduction to Rich see [calmcode.io](https://calmcode.io/rich/introduction.html) by [@fishnets88](https://twitter.com/fishnets88).\n\nSee what [people are saying about Rich](https://www.willmcgugan.com/blog/pages/post/rich-tweets/).\n\n## Compatibility\n\nRich works with Linux, OSX, and Windows. True color / emoji works with new Windows Terminal, classic terminal is limited to 16 colors. Rich requires Python 3.7 or later.\n\nRich works with [Jupyter notebooks](https://jupyter.org/) with no additional configuration required.\n\n## Installing\n\nInstall with `pip` or your favorite PyPI package manager.\n\n```sh\npython -m pip install rich\n```\n\nRun the following to test Rich output on your terminal:\n\n```sh\npython -m rich\n```\n\n## Rich Print\n\nTo effortlessly add rich output to your application, you can import the [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start) method, which has the same signature as the builtin Python function. Try this:\n\n```python\nfrom rich import print\n\nprint(\"Hello, [bold magenta]World[/bold magenta]!\", \":vampire:\", locals())\n```\n\n\n\n## Rich REPL\n\nRich can be installed in the Python REPL, so that any data structures will be pretty printed and highlighted.\n\n```python\n>>> from rich import pretty\n>>> pretty.install()\n```\n\n\n\n## Using the Console\n\nFor more control over rich terminal content, import and construct a [Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console) object.\n\n```python\nfrom rich.console import Console\n\nconsole = Console()\n```\n\nThe Console object has a `print` method which has an intentionally similar interface to the builtin `print` function. Here's an example of use:\n\n```python\nconsole.print(\"Hello\", \"World!\")\n```\n\nAs you might expect, this will print `\"Hello World!\"` to the terminal. Note that unlike the builtin `print` function, Rich will word-wrap your text to fit within the terminal width.\n\nThere are a few ways of adding color and style to your output. You can set a style for the entire output by adding a `style` keyword argument. Here's an example:\n\n```python\nconsole.print(\"Hello\", \"World!\", style=\"bold red\")\n```\n\nThe output will be something like the following:\n\n\n\nThat's fine for styling a line of text at a time. For more finely grained styling, Rich renders a special markup which is similar in syntax to [bbcode](https://en.wikipedia.org/wiki/BBCode). Here's an example:\n\n```python\nconsole.print(\"Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].\")\n```\n\n\n\nYou can use a Console object to generate sophisticated output with minimal effort. See the [Console API](https://rich.readthedocs.io/en/latest/console.html) docs for details.\n\n## Rich Inspect\n\nRich has an [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) function which can produce a report on any Python object, such as class, instance, or builtin.\n\n```python\n>>> my_list = [\"foo\", \"bar\"]\n>>> from rich import inspect\n>>> inspect(my_list, methods=True)\n```\n\n\n\nSee the [inspect docs](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) for details.\n\n# Rich Library\n\nRich contains a number of builtin _renderables_ you can use to create elegant output in your CLI and help you debug your code.\n\nClick the following headings for details:\n\n<details>\n<summary>Log</summary>\n\nThe Console object has a `log()` method which has a similar interface to `print()`, but also renders a column for the current time and the file and line which made the call. By default Rich will do syntax highlighting for Python structures and for repr strings. If you log a collection (i.e. a dict or a list) Rich will pretty print it so that it fits in the available space. Here's an example of some of these features.\n\n```python\nfrom rich.console import Console\nconsole = Console()\n\ntest_data = [\n {\"jsonrpc\": \"2.0\", \"method\": \"sum\", \"params\": [None, 1, 2, 4, False, True], \"id\": \"1\",},\n {\"jsonrpc\": \"2.0\", \"method\": \"notify_hello\", \"params\": [7]},\n {\"jsonrpc\": \"2.0\", \"method\": \"subtract\", \"params\": [42, 23], \"id\": \"2\"},\n]\n\ndef test_log():\n enabled = False\n context = {\n \"foo\": \"bar\",\n }\n movies = [\"Deadpool\", \"Rise of the Skywalker\"]\n console.log(\"Hello from\", console, \"!\")\n console.log(test_data, log_locals=True)\n\n\ntest_log()\n```\n\nThe above produces the following output:\n\n\n\nNote the `log_locals` argument, which outputs a table containing the local variables where the log method was called.\n\nThe log method could be used for logging to the terminal for long running applications such as servers, but is also a very nice debugging aid.\n\n</details>\n<details>\n<summary>Logging Handler</summary>\n\nYou can also use the builtin [Handler class](https://rich.readthedocs.io/en/latest/logging.html) to format and colorize output from Python's logging module. Here's an example of the output:\n\n\n\n</details>\n\n<details>\n<summary>Emoji</summary>\n\nTo insert an emoji in to console output place the name between two colons. Here's an example:\n\n```python\n>>> console.print(\":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:\")\n😃 🧛 💩 👍 🦝\n```\n\nPlease use this feature wisely.\n\n</details>\n\n<details>\n<summary>Tables</summary>\n\nRich can render flexible [tables](https://rich.readthedocs.io/en/latest/tables.html) with unicode box characters. There is a large variety of formatting options for borders, styles, cell alignment etc.\n\n\n\nThe animation above was generated with [table_movie.py](https://github.com/textualize/rich/blob/master/examples/table_movie.py) in the examples directory.\n\nHere's a simpler table example:\n\n```python\nfrom rich.console import Console\nfrom rich.table import Table\n\nconsole = Console()\n\ntable = Table(show_header=True, header_style=\"bold magenta\")\ntable.add_column(\"Date\", style=\"dim\", width=12)\ntable.add_column(\"Title\")\ntable.add_column(\"Production Budget\", justify=\"right\")\ntable.add_column(\"Box Office\", justify=\"right\")\ntable.add_row(\n \"Dec 20, 2019\", \"Star Wars: The Rise of Skywalker\", \"$275,000,000\", \"$375,126,118\"\n)\ntable.add_row(\n \"May 25, 2018\",\n \"[red]Solo[/red]: A Star Wars Story\",\n \"$275,000,000\",\n \"$393,151,347\",\n)\ntable.add_row(\n \"Dec 15, 2017\",\n \"Star Wars Ep. VIII: The Last Jedi\",\n \"$262,000,000\",\n \"[bold]$1,332,539,889[/bold]\",\n)\n\nconsole.print(table)\n```\n\nThis produces the following output:\n\n\n\nNote that console markup is rendered in the same way as `print()` and `log()`. In fact, anything that is renderable by Rich may be included in the headers / rows (even other tables).\n\nThe `Table` class is smart enough to resize columns to fit the available width of the terminal, wrapping text as required. Here's the same example, with the terminal made smaller than the table above:\n\n\n\n</details>\n\n<details>\n<summary>Progress Bars</summary>\n\nRich can render multiple flicker-free [progress](https://rich.readthedocs.io/en/latest/progress.html) bars to track long-running tasks.\n\nFor basic usage, wrap any sequence in the `track` function and iterate over the result. Here's an example:\n\n```python\nfrom rich.progress import track\n\nfor step in track(range(100)):\n do_step(step)\n```\n\nIt's not much harder to add multiple progress bars. Here's an example taken from the docs:\n\n\n\nThe columns may be configured to show any details you want. Built-in columns include percentage complete, file size, file speed, and time remaining. Here's another example showing a download in progress:\n\n\n\nTo try this out yourself, see [examples/downloader.py](https://github.com/textualize/rich/blob/master/examples/downloader.py) which can download multiple URLs simultaneously while displaying progress.\n\n</details>\n\n<details>\n<summary>Status</summary>\n\nFor situations where it is hard to calculate progress, you can use the [status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) method which will display a 'spinner' animation and message. The animation won't prevent you from using the console as normal. Here's an example:\n\n```python\nfrom time import sleep\nfrom rich.console import Console\n\nconsole = Console()\ntasks = [f\"task {n}\" for n in range(1, 11)]\n\nwith console.status(\"[bold green]Working on tasks...\") as status:\n while tasks:\n task = tasks.pop(0)\n sleep(1)\n console.log(f\"{task} complete\")\n```\n\nThis generates the following output in the terminal.\n\n\n\nThe spinner animations were borrowed from [cli-spinners](https://www.npmjs.com/package/cli-spinners). You can select a spinner by specifying the `spinner` parameter. Run the following command to see the available values:\n\n```\npython -m rich.spinner\n```\n\nThe above command generates the following output in the terminal:\n\n\n\n</details>\n\n<details>\n<summary>Tree</summary>\n\nRich can render a [tree](https://rich.readthedocs.io/en/latest/tree.html) with guide lines. A tree is ideal for displaying a file structure, or any other hierarchical data.\n\nThe labels of the tree can be simple text or anything else Rich can render. Run the following for a demonstration:\n\n```\npython -m rich.tree\n```\n\nThis generates the following output:\n\n\n\nSee the [tree.py](https://github.com/textualize/rich/blob/master/examples/tree.py) example for a script that displays a tree view of any directory, similar to the linux `tree` command.\n\n</details>\n\n<details>\n<summary>Columns</summary>\n\nRich can render content in neat [columns](https://rich.readthedocs.io/en/latest/columns.html) with equal or optimal width. Here's a very basic clone of the (MacOS / Linux) `ls` command which displays a directory listing in columns:\n\n```python\nimport os\nimport sys\n\nfrom rich import print\nfrom rich.columns import Columns\n\ndirectory = os.listdir(sys.argv[1])\nprint(Columns(directory))\n```\n\nThe following screenshot is the output from the [columns example](https://github.com/textualize/rich/blob/master/examples/columns.py) which displays data pulled from an API in columns:\n\n\n\n</details>\n\n<details>\n<summary>Markdown</summary>\n\nRich can render [markdown](https://rich.readthedocs.io/en/latest/markdown.html) and does a reasonable job of translating the formatting to the terminal.\n\nTo render markdown import the `Markdown` class and construct it with a string containing markdown code. Then print it to the console. Here's an example:\n\n```python\nfrom rich.console import Console\nfrom rich.markdown import Markdown\n\nconsole = Console()\nwith open(\"README.md\") as readme:\n markdown = Markdown(readme.read())\nconsole.print(markdown)\n```\n\nThis will produce output something like the following:\n\n\n\n</details>\n\n<details>\n<summary>Syntax Highlighting</summary>\n\nRich uses the [pygments](https://pygments.org/) library to implement [syntax highlighting](https://rich.readthedocs.io/en/latest/syntax.html). Usage is similar to rendering markdown; construct a `Syntax` object and print it to the console. Here's an example:\n\n```python\nfrom rich.console import Console\nfrom rich.syntax import Syntax\n\nmy_code = '''\ndef iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]:\n \"\"\"Iterate and generate a tuple with a flag for first and last value.\"\"\"\n iter_values = iter(values)\n try:\n previous_value = next(iter_values)\n except StopIteration:\n return\n first = True\n for value in iter_values:\n yield first, False, previous_value\n first = False\n previous_value = value\n yield first, True, previous_value\n'''\nsyntax = Syntax(my_code, \"python\", theme=\"monokai\", line_numbers=True)\nconsole = Console()\nconsole.print(syntax)\n```\n\nThis will produce the following output:\n\n\n\n</details>\n\n<details>\n<summary>Tracebacks</summary>\n\nRich can render [beautiful tracebacks](https://rich.readthedocs.io/en/latest/traceback.html) which are easier to read and show more code than standard Python tracebacks. You can set Rich as the default traceback handler so all uncaught exceptions will be rendered by Rich.\n\nHere's what it looks like on OSX (similar on Linux):\n\n\n\n</details>\n\nAll Rich renderables make use of the [Console Protocol](https://rich.readthedocs.io/en/latest/protocol.html), which you can also use to implement your own Rich content.\n\n# Rich CLI\n\n\nSee also [Rich CLI](https://github.com/textualize/rich-cli) for a command line application powered by Rich. Syntax highlight code, render markdown, display CSVs in tables, and more, directly from the command prompt.\n\n\n\n\n# Textual\n\nSee also Rich's sister project, [Textual](https://github.com/Textualize/textual), which you can use to build sophisticated User Interfaces in the terminal.\n\n\n\n# Projects using Rich\n\nFor some examples of projects using Rich, see the [Rich Gallery](https://www.textualize.io/rich/gallery) on [Textualize.io](https://www.textualize.io).\n\nWould you like to add your own project to the gallery? You can! Follow [these instructions](https://www.textualize.io/gallery-instructions).\n\n<!-- This is a test, no need to translate -->\n\n",
- "description_content_type": "text/markdown",
- "home_page": "https://github.com/Textualize/rich",
- "author": "Will McGugan",
- "author_email": "willmcgugan@gmail.com",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Console",
- "Framework :: IPython",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: MacOS",
- "Operating System :: Microsoft :: Windows",
- "Operating System :: POSIX :: Linux",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Typing :: Typed"
- ],
- "requires_dist": [
- "ipywidgets (>=7.5.1,<9) ; extra == \"jupyter\"",
- "markdown-it-py (>=2.2.0)",
- "pygments (>=2.13.0,<3.0.0)",
- "typing-extensions (>=4.0.0,<5.0) ; python_version < \"3.9\""
- ],
- "requires_python": ">=3.7.0",
- "project_url": [
- "Documentation, https://rich.readthedocs.io/en/latest/"
- ],
- "provides_extra": [
- "jupyter"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/c2/f6/19c1208dd565f13ff6062db31006b6ddf4c68c1946d5ee7bc0fec0592f1d/rich_argparse-1.4.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=68b263d3628d07b1d27cfe6ad896da2f5a5583ee2ba226aeeb24459840023b38",
- "hashes": {
- "sha256": "68b263d3628d07b1d27cfe6ad896da2f5a5583ee2ba226aeeb24459840023b38"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "rich-argparse",
- "version": "1.4.0",
- "summary": "Rich help formatters for argparse and optparse",
- "description": "# rich-argparse\n\n\n\n[\n](https://github.com/hamdanal/rich-argparse/actions/workflows/tests.yml)\n[\n](https://results.pre-commit.ci/latest/github/hamdanal/rich-argparse/main)\n[](https://pypistats.org/packages/rich-argparse)\n[\n\n](https://pypi.org/project/rich-argparse/)\n\nFormat argparse and optparse help using [rich](https://pypi.org/project/rich).\n\n*rich-argparse* improves the look and readability of argparse's help while requiring minimal\nchanges to the code.\n\n## Table of contents\n\n* [Installation](#installation)\n* [Usage](#usage)\n* [Output styles](#output-styles)\n * [Colors](#customize-the-colors)\n * [Group names](#customize-the-group-name-format)\n * [Highlighting patterns](#special-text-highlighting)\n * [\"usage\"](#colors-in-the-usage)\n * [--version](#colors-in---version)\n * [Rich renderables](#rich-descriptions-and-epilog)\n* [Subparsers](#working-with-subparsers)\n* [Documenting your CLI](#generate-help-preview)\n* [Third party formatters](#working-with-third-party-formatters) (ft. django)\n* [Optparse](#optparse-support) (experimental)\n* [Legacy Windows](#legacy-windows-support)\n\n## Installation\n\nInstall from PyPI with pip or your favorite tool.\n\n```sh\npip install rich-argparse\n```\n\n## Usage\n\nSimply pass `formatter_class` to the argument parser\n```python\nimport argparse\nfrom rich_argparse import RichHelpFormatter\n\nparser = argparse.ArgumentParser(..., formatter_class=RichHelpFormatter)\n...\n```\n\n*rich-argparse* defines equivalents to argparse's [built-in formatters](\nhttps://docs.python.org/3/library/argparse.html#formatter-class):\n\n| `rich_argparse` formatter | equivalent in `argparse` |\n|---------------------------|--------------------------|\n| `RichHelpFormatter` | `HelpFormatter` |\n| `RawDescriptionRichHelpFormatter` | `RawDescriptionHelpFormatter` |\n| `RawTextRichHelpFormatter` | `RawTextHelpFormatter` |\n| `ArgumentDefaultsRichHelpFormatter` | `ArgumentDefaultsHelpFormatter` |\n| `MetavarTypeRichHelpFormatter` | `MetavarTypeHelpFormatter` |\n\n## Output styles\n\nThe default styles used by *rich-argparse* are carefully chosen to work in different light and dark\nthemes.\n\n### Customize the colors\n\nYou can customize the colors in the output by modifying the `styles` dictionary on the formatter\nclass. *rich-argparse* defines the following styles:\n\n```python\n{\n 'argparse.args': 'cyan', # for positional-arguments and --options (e.g \"--help\")\n 'argparse.groups': 'dark_orange', # for group names (e.g. \"positional arguments\")\n 'argparse.help': 'default', # for argument's help text (e.g. \"show this help message and exit\")\n 'argparse.metavar': 'dark_cyan', # for metavariables (e.g. \"FILE\" in \"--file FILE\")\n 'argparse.prog': 'grey50', # for %(prog)s in the usage (e.g. \"foo\" in \"Usage: foo [options]\")\n 'argparse.syntax': 'bold', # for highlights of back-tick quoted text (e.g. \"`some text`\")\n 'argparse.text': 'default', # for descriptions, epilog, and --version (e.g. \"A program to foo\")\n 'argparse.default': 'italic', # for %(default)s in the help (e.g. \"Value\" in \"(default: Value)\")\n}\n```\n\nFor example, to make the description and epilog *italic*, change the `argparse.text` style:\n\n```python\nRichHelpFormatter.styles[\"argparse.text\"] = \"italic\"\n```\n\n### Customize the group name format\n\nYou can change how the names of the groups (like `'positional arguments'` and `'options'`) are\nformatted by setting the `RichHelpFormatter.group_name_formatter` which is set to `str.title` by\ndefault. Any callable that takes the group name as an input and returns a str works:\n\n```python\nRichHelpFormatter.group_name_formatter = str.upper # Make group names UPPERCASE\n```\n\n### Special text highlighting\n\nYou can [highlight patterns](https://rich.readthedocs.io/en/stable/highlighting.html) in the\narguments help and the description and epilog using regular expressions. By default,\n*rich-argparse* highlights patterns of `--options-with-hyphens` using the `argparse.args` style\nand patterns of `` `back tick quoted text` `` using the `argparse.syntax` style. You can control\nwhat patterns are highlighted by modifying the `RichHelpFormatter.highlights` list. To disable all\nhighlights, you can clear this list using `RichHelpFormatter.highlights.clear()`.\n\nYou can also add custom highlight patterns and styles. The following example highlights all\noccurrences of `pyproject.toml` in green:\n\n```python\n# Add a style called `pyproject` which applies a green style (any rich style works)\nRichHelpFormatter.styles[\"argparse.pyproject\"] = \"green\"\n# Add the highlight regex (the regex group name must match an existing style name)\nRichHelpFormatter.highlights.append(r\"\\b(?P<pyproject>pyproject\\.toml)\\b\")\n# Pass the formatter class to argparse\nparser = argparse.ArgumentParser(..., formatter_class=RichHelpFormatter)\n...\n```\n\n### Colors in the `usage`\n\nThe usage **generated by the formatter** is colored using the `argparse.args` and `argparse.metavar`\nstyles. If you use a custom `usage` message in the parser, it will treated as \"plain text\" and will\n**not** be colored by default. You can enable colors in user defined usage message through\n[console markup](https://rich.readthedocs.io/en/stable/markup.html) by setting\n`RichHelpFormatter.usage_markup = True`. If you enable this option, make sure to [escape](\nhttps://rich.readthedocs.io/en/stable/markup.html#escaping) any square brackets in the usage text.\n\n### Colors in `--version`\n\nIf you use the `\"version\"` action from argparse, you can use console markup in the `version` string:\n\n```python\nparser.add_argument(\n \"--version\", action=\"version\", version=\"[argparse.prog]%(prog)s[/] version [i]1.0.0[/]\"\n)\n```\n\nNote that the `argparse.text` style is applied to the `version` string similar to the description\nand epilog.\n\n### Rich descriptions and epilog\n\nYou can use any rich renderable in the descriptions and epilog. This includes all built-in rich\nrenderables like `Table` and `Markdown` and any custom renderables defined using the\n[Console Protcol](https://rich.readthedocs.io/en/stable/protocol.html#console-protocol).\n\n```python\nimport argparse\nfrom rich.markdown import Markdown\nfrom rich_argparse import RichHelpFormatter\n\ndescription = \"\"\"\n# My program\n\nThis is a markdown description of my program.\n\n* It has a list\n* And a table\n\n| Column 1 | Column 2 |\n| -------- | -------- |\n| Value 1 | Value 2 |\n\"\"\"\nparser = argparse.ArgumentParser(\n description=Markdown(description, style=\"argparse.text\"),\n formatter_class=RichHelpFormatter,\n)\n...\n```\nCertain features are **disabled** for arbitrary renderables other than strings, including:\n\n* Syntax highlighting with `RichHelpFormatter.highlights`\n* Styling with the `\"argparse.text\"` style defined in `RichHelpFormatter.styles`\n* Replacement of `%(prog)s` with the program name\n\nArbitrary renderables are displayed \"as is\" except for long runs of empty lines that get truncated\nto two empty lines following the behavior of argparse.\n\n## Working with subparsers\n\nSubparsers do not inherit the formatter class from the parent parser by default. You have to pass\nthe formatter class explicitly:\n\n```python\nsubparsers = parser.add_subparsers(...)\np1 = subparsers.add_parser(..., formatter_class=parser.formatter_class)\np2 = subparsers.add_parser(..., formatter_class=parser.formatter_class)\n```\n\n## Generate help preview\n\nYou can generate a preview of the help message for your CLI in SVG, HTML, or TXT formats using the\n`HelpPreviewAction` action. This is useful for including the help message in the documentation of\nyour app. The action uses the\n[rich exporting API](https://rich.readthedocs.io/en/stable/console.html#exporting) internally.\n\n```python\nimport argparse\nfrom rich.terminal_theme import DIMMED_MONOKAI\nfrom rich_argparse import HelpPreviewAction, RichHelpFormatter\n\nparser = argparse.ArgumentParser(..., formatter_class=RichHelpFormatter)\n...\nparser.add_argument(\n \"--generate-help-preview\",\n action=HelpPreviewAction,\n path=\"help-preview.svg\", # (optional) or \"help-preview.html\" or \"help-preview.txt\"\n export_kwds={\"theme\": DIMMED_MONOKAI}, # (optional) keywords passed to console.save_... methods\n)\n```\nThis action is hidden, it won't show up in the help message or in the parsed arguments namespace.\n\nUse it like this:\n\n```sh\npython my_cli.py --generate-help-preview # generates help-preview.svg (default path specified above)\n# or\npython my_cli.py --generate-help-preview my-help.svg # generates my-help.svg\n# or\nCOLUMNS=120 python my_cli.py --generate-help-preview # force the width of the output to 120 columns\n```\n\n## Working with third party formatters\n\n*rich-argparse* can be used with other formatters that **do not rely on the private internals**\nof `argparse.HelpFormatter`. A popular example is [django](https://pypi.org/project/django) that\ndefines a custom help formatter that is used with its built in commands as well as with extension\nlibraries and user defined commands. To use *rich-argparse* in your django project, change your\n`manage.py` file as follows:\n\n```diff\ndiff --git a/my_project/manage.py b/my_project/manage.py\nindex 7fb6855..5e5d48a 100755\n--- a/my_project/manage.py\n+++ b/my_project/manage.py\n@@ -1,22 +1,38 @@\n #!/usr/bin/env python\n \"\"\"Django's command-line utility for administrative tasks.\"\"\"\n import os\n import sys\n\n\n def main():\n \"\"\"Run administrative tasks.\"\"\"\n os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_project.settings')\n try:\n from django.core.management import execute_from_command_line\n except ImportError as exc:\n raise ImportError(\n \"Couldn't import Django. Are you sure it's installed and \"\n \"available on your PYTHONPATH environment variable? Did you \"\n \"forget to activate a virtual environment?\"\n ) from exc\n+\n+ from django.core.management.base import BaseCommand, DjangoHelpFormatter\n+ from rich_argparse import RichHelpFormatter\n+\n+ class DjangoRichHelpFormatter(DjangoHelpFormatter, RichHelpFormatter): # django first\n+ \"\"\"A rich-based help formatter for django commands.\"\"\"\n+\n+ original_create_parser = BaseCommand.create_parser\n+\n+ def create_parser(*args, **kwargs):\n+ parser = original_create_parser(*args, **kwargs)\n+ parser.formatter_class = DjangoRichHelpFormatter # set the formatter_class\n+ return parser\n+\n+ BaseCommand.create_parser = create_parser\n+\n execute_from_command_line(sys.argv)\n\n\n if __name__ == '__main__':\n main()\n```\n\nNow try out some command like `python manage.py runserver --help` and notice how the special\nordering of the arguments applied by django is respected by the new help formatter.\n\n## Optparse support\n\n*rich-argparse* now ships with experimental support for [optparse](\nhttps://docs.python.org/3/library/optparse.html).\n\nImport optparse help formatters from `rich_argparse.optparse`:\n\n```python\nimport optparse\nfrom rich_argparse.optparse import IndentedRichHelpFormatter # or TitledRichHelpFormatter\n\nparser = optparse.OptionParser(formatter=IndentedRichHelpFormatter())\n...\n```\n\nYou can also generated a more helpful usage message by passing `usage=GENERATE_USAGE` to the\nparser. This is similar to the default behavior of `argparse`.\n\n```python\nfrom rich_argparse.optparse import GENERATE_USAGE, IndentedRichHelpFormatter\n\nparser = optparse.OptionParser(usage=GENERATE_USAGE, formatter=IndentedRichHelpFormatter())\n```\n\nSimilar to `argparse`, you can customize the styles used by the formatter by modifying the\n`RichHelpFormatter.styles` dictionary. These are the same styles used by `argparse` but with\nthe `optparse.` prefix instead:\n\n```python\nRichHelpFormatter.styles[\"optparse.metavar\"] = \"bold magenta\"\n```\n\nSyntax highlighting works the same as with `argparse`.\n\nColors in the `usage` are only supported when using `GENERATE_USAGE`.\n\nCustomizing the group name format is not supported. optparse uses Title Case format by default.\n\n## Legacy Windows support\n\nIf your application still runs on legacy Windows versions (older than Windows 10), you'll need to\nenable ANSI escape sequences by calling `colorama.init()` otherwise colors will be disabled:\n\n```python\nimport argparse\nimport colorama\nfrom rich_argparse import RichHelpFormatter\n\ncolorama.init()\nparser = argparse.ArgumentParser(..., formatter_class=RichHelpFormatter)\n...\n```\nThis is **not** required on Windows 10 and newer or on other operating systems.\n",
- "description_content_type": "text/markdown",
- "keywords": [
- "argparse",
- "help-formatter",
- "optparse",
- "rich"
- ],
- "author_email": "Ali Hamdan <ali.hamdan.dev@gmail.com>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Console",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Topic :: Software Development :: User Interfaces"
- ],
- "requires_dist": [
- "rich>=11.0.0"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Homepage, https://github.com/hamdanal/rich-argparse",
- "Documentation, https://github.com/hamdanal/rich-argparse#rich-argparse",
- "Issue-Tracker, https://github.com/hamdanal/rich-argparse/issues",
- "Changelog, https://github.com/hamdanal/rich-argparse/blob/main/CHANGELOG.md"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/ae/40/1904de90ca6d27fa05a47ff455e751da6ad3933de2dbadd31776f8c48101/rpds_py-0.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "archive_info": {
- "hash": "sha256=7bf347b495b197992efc81a7408e9a83b931b2f056728529956a4d0858608b80",
- "hashes": {
- "sha256": "7bf347b495b197992efc81a7408e9a83b931b2f056728529956a4d0858608b80"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "rpds-py",
- "version": "0.10.6",
- "summary": "Python bindings to Rust's persistent data structures (rpds)",
- "description": "===========\n``rpds.py``\n===========\n\n|PyPI| |Pythons| |CI|\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/rpds-py.svg\n :alt: PyPI version\n :target: https://pypi.org/project/rpds-py/\n\n.. |Pythons| image:: https://img.shields.io/pypi/pyversions/rpds-py.svg\n :alt: Supported Python versions\n :target: https://pypi.org/project/rpds-py/\n\n.. |CI| image:: https://github.com/crate-py/rpds/workflows/CI/badge.svg\n :alt: Build status\n :target: https://github.com/crate-py/rpds/actions?query=workflow%3ACI\n\n\nPython bindings to the `Rust rpds crate <https://docs.rs/rpds/>`_ for persistent data structures.\n\nWhat's here is quite minimal (in transparency, it was written initially to support replacing ``pyrsistent`` in the `referencing library <https://github.com/python-jsonschema/referencing>`_).\nIf you see something missing (which is very likely), a PR is definitely welcome to add it.\n\nInstallation\n------------\n\nThe distribution on PyPI is named ``rpds.py`` (equivalently ``rpds-py``), and thus can be installed via e.g.:\n\n.. code:: sh\n\n $ pip install rpds-py\n\nNote that if you install ``rpds-py`` from source, you will need a Rust toolchain installed, as it is a build-time dependency.\nAn example of how to do so in a ``Dockerfile`` can be found `here <https://github.com/bowtie-json-schema/bowtie/blob/e77fd93598cb6e7dc1b8b1f53c00e5aa410c201a/implementations/python-jsonschema/Dockerfile#L1-L8>`_.\n\nIf you believe you are on a common platform which should have wheels built (i.e. and not need to compile from source), feel free to file an issue or pull request modifying the GitHub action used here to build wheels via ``maturin``.\n\nUsage\n-----\n\nMethods in general are named similarly to their ``rpds`` counterparts (rather than ``pyrsistent``\\ 's conventions, though probably a full drop-in ``pyrsistent``\\ -compatible wrapper module is a good addition at some point).\n\n.. code:: python\n\n >>> from rpds import HashTrieMap, HashTrieSet, List\n\n >>> m = HashTrieMap({\"foo\": \"bar\", \"baz\": \"quux\"})\n >>> m.insert(\"spam\", 37) == HashTrieMap({\"foo\": \"bar\", \"baz\": \"quux\", \"spam\": 37})\n True\n >>> m.remove(\"foo\") == HashTrieMap({\"baz\": \"quux\"})\n True\n\n >>> s = HashTrieSet({\"foo\", \"bar\", \"baz\", \"quux\"})\n >>> s.insert(\"spam\") == HashTrieSet({\"foo\", \"bar\", \"baz\", \"quux\", \"spam\"})\n True\n >>> s.remove(\"foo\") == HashTrieSet({\"bar\", \"baz\", \"quux\"})\n True\n\n >>> L = List([1, 3, 5])\n >>> L.push_front(-1) == List([-1, 1, 3, 5])\n True\n >>> L.rest == List([3, 5])\n True\n\n",
- "description_content_type": "text/x-rst; charset=UTF-8",
- "keywords": [
- "data structures",
- "rust",
- "persistent"
- ],
- "author": "Julian Berman",
- "author_email": "Julian+rpds@GrayVines.com",
- "license": "MIT",
- "classifier": [
- "Development Status :: 3 - Alpha",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Rust",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy"
- ],
- "requires_python": ">=3.8",
- "project_url": [
- "Homepage, https://github.com/crate-py/rpds",
- "Issues, https://github.com/crate-py/rpds/issues/",
- "Funding, https://github.com/sponsors/Julian",
- "Source, https://github.com/crate-py/rpds"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/26/44/19e08f69b2169003f7307565f19449d997895251c6a6566ce21d5d636435/s3cmd-2.1.0-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=49cd23d516b17974b22b611a95ce4d93fe326feaa07320bd1d234fed68cbccfa",
- "hashes": {
- "sha256": "49cd23d516b17974b22b611a95ce4d93fe326feaa07320bd1d234fed68cbccfa"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "s3cmd",
- "version": "2.1.0",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "Command line tool for managing Amazon S3 and CloudFront services",
- "description": "\n\nS3cmd lets you copy files from/to Amazon S3\n(Simple Storage Service) using a simple to use\ncommand line client. Supports rsync-like backup,\nGPG encryption, and more. Also supports management\nof Amazon's CloudFront content delivery network.\n\n\nAuthors:\n--------\n Florent Viard <florent@sodria.com>\n Michal Ludvig <michal@logix.cz>\n Matt Domsch (github.com/mdomsch)\n\n\n",
- "home_page": "http://s3tools.org",
- "author": "Michal Ludvig",
- "author_email": "michal@logix.cz",
- "maintainer": "github.com/fviard, github.com/matteobar",
- "maintainer_email": "s3tools-bugs@lists.sourceforge.net",
- "license": "GNU GPL v2+",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Console",
- "Environment :: MacOS X",
- "Environment :: Win32 (MS Windows)",
- "Intended Audience :: End Users/Desktop",
- "Intended Audience :: System Administrators",
- "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)",
- "Natural Language :: English",
- "Operating System :: MacOS :: MacOS X",
- "Operating System :: Microsoft :: Windows",
- "Operating System :: POSIX",
- "Operating System :: Unix",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.6",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.3",
- "Programming Language :: Python :: 3.4",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Topic :: System :: Archiving",
- "Topic :: Utilities"
- ],
- "requires_dist": [
- "python-dateutil",
- "python-magic"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/fd/df/44b267cb8f073a4ae77e120f0705ab3a07165ad90cecd4881b34c7e1e37b/setproctitle-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "archive_info": {
- "hash": "sha256=64286f8a995f2cd934082b398fc63fca7d5ffe31f0e27e75b3ca6b4efda4e353",
- "hashes": {
- "sha256": "64286f8a995f2cd934082b398fc63fca7d5ffe31f0e27e75b3ca6b4efda4e353"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "setproctitle",
- "version": "1.3.3",
- "platform": [
- "GNU/Linux",
- "BSD",
- "MacOS X",
- "Windows"
- ],
- "summary": "A Python module to customize the process title",
- "description": "A Python module to customize the process title\n==============================================\n\n.. image:: https://github.com/dvarrazzo/py-setproctitle/workflows/Tests/badge.svg\n :target: https://github.com/dvarrazzo/py-setproctitle/actions?query=workflow%3ATests\n :alt: Tests\n\n:author: Daniele Varrazzo\n\nThe ``setproctitle`` module allows a process to change its title (as displayed\nby system tools such as ``ps``, ``top`` or MacOS Activity Monitor).\n\nChanging the title is mostly useful in multi-process systems, for example\nwhen a master process is forked: changing the children's title allows to\nidentify the task each process is busy with. The technique is used by\nPostgreSQL_ and the `OpenSSH Server`_ for example.\n\nThe procedure is hardly portable across different systems. PostgreSQL provides\na good `multi-platform implementation`__: this package was born as a wrapper\naround PostgreSQL code.\n\n- `Homepage <https://github.com/dvarrazzo/py-setproctitle>`__\n- `Download <http://pypi.python.org/pypi/setproctitle/>`__\n- `Bug tracker <https://github.com/dvarrazzo/py-setproctitle/issues>`__\n\n\n.. _PostgreSQL: http://www.postgresql.org\n.. _OpenSSH Server: http://www.openssh.com/\n.. __: http://doxygen.postgresql.org/ps__status_8c_source.html\n\n\nInstallation\n------------\n\n``setproctitle`` is a C extension: in order to build it you will need a C\ncompiler and the Python development support (the ``python-dev`` or\n``python3-dev`` package in most Linux distributions). No further external\ndependencies are required.\n\nYou can use ``pip`` to install the module::\n\n pip install setproctitle\n\nYou can use ``pip -t`` or ``virtualenv`` for local installations, ``sudo pip``\nfor a system-wide one... the usual stuff. Read pip_ or virtualenv_ docs for\nall the details.\n\n.. _pip: https://pip.readthedocs.org/\n.. _virtualenv: https://virtualenv.readthedocs.org/\n\n\nUsage\n-----\n\n.. note::\n You should import and use the module (even just calling ``getproctitle()``)\n pretty early in your program lifetime: code writing env vars `may\n interfere`__ with the module initialisation.\n\n .. __: https://github.com/dvarrazzo/py-setproctitle/issues/42\n\n\nThe ``setproctitle`` module exports the following functions:\n\n``setproctitle(title)``\n Set *title* as the title for the current process.\n\n``getproctitle()``\n Return the current process title.\n\nThe process title is usually visible in files such as ``/proc/PID/cmdline``,\n``/proc/PID/status``, ``/proc/PID/comm``, depending on the operating system\nand kernel version. These information are used by user-space tools such as\n``ps`` and ``top``.\n\n\n``setthreadtitle(title)``\n Set *title* as the title for the current thread.\n\n``getthreadtitle()``\n Get the current thread title.\n\nThe thread title is exposed by some operating systems as the file\n``/proc/PID/task/TID/comm``, which is used by certain tools such as ``htop``.\n\n\nEnvironment variables\n~~~~~~~~~~~~~~~~~~~~~\n\nA few environment variables can be used to customize the module behavior:\n\n``SPT_NOENV``\n Avoid clobbering ``/proc/PID/environ``.\n\n On many platforms, setting the process title will clobber the\n ``environ`` memory area. ``os.environ`` will work as expected from within\n the Python process, but the content of the file ``/proc/PID/environ`` will\n be overwritten. If you require this file not to be broken you can set the\n ``SPT_NOENV`` environment variable to any non-empty value: in this case\n the maximum length for the title will be limited to the length of the\n command line.\n\n``SPT_DEBUG``\n Print debug information on ``stderr``.\n\n If the module doesn't work as expected you can set this variable to a\n non-empty value to generate information useful for debugging. Note that\n the most useful information is printed when the module is imported, not\n when the functions are called.\n\n\nModule status\n-------------\n\nThe module can be currently compiled and effectively used on the following\nplatforms:\n\n- GNU/Linux\n- BSD\n- MacOS X\n- Windows\n\nNote that on Windows there is no way to change the process string:\nwhat the module does is to create a *Named Object* whose value can be read\nusing a tool such as `Process Explorer`_ (contribution of a more useful tool\nto be used together with ``setproctitle`` would be well accepted).\n\nThe module can probably work on HP-UX, but I haven't found any to test with.\nIt is unlikely that it can work on Solaris instead.\n\n.. _Process Explorer: http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx\n\nReleases history\n----------------\n\nVersion 1.3.2\n-------------\n\n- Restore import-time initialization of macOS to avoid crash on thread+fork\n (issue #113).\n\n\nVersion 1.3.1\n-------------\n\n- Fixed segfault on macOS 12.5 in forked processes (issue #111).\n Note that, as a workaround, Activity Monitor will show the title of the\n parent.\n\n\nVersion 1.3.0\n-------------\n\n- Added fallback no-op implementation if building the extension fails.\n- Added support for displaying title as the process name in MacOS Activity\n Monitor (issue #10).\n- Fixed \"Symbol not found: _Py_GetArgcArgv\" error when using Xcode provided\n Python (issues #82, #103).\n- Fixed FreeBSD support, broken in 1.2 (issue #94).\n- Added package type annotations (issue #101).\n- Dropped support for Python 3.6.\n\n\nVersion 1.2.3\n-------------\n\n- Added Python 3.10 packages (issue #102).\n- Added Wheel packages for macOS (issue #96).\n- Package build moved to cibuildwheel, other wheels provided (issue #47).\n\n\nVersion 1.2.2\n-------------\n\n- Fixed Windows build (issues #89, #90).\n- Added wheel packages for Windows (issues #47, #90).\n- Added wheel packages for aarch64 (issue #95).\n\n\nVersion 1.2.1\n-------------\n\n- Fixed segfault after ``os.environ.clear()`` (issue #88).\n\n\nVersion 1.2\n~~~~~~~~~~~\n\n- added ``getthreadtitle()`` and ``setthreadtitle()``.\n- Initialisation of the module moved to the first usage: importing the module\n doesn't cause side effects.\n- Manage much longer command lines (issue #52)\n- Improved build on BSD, dropped ancient versions (issue #67).\n- Fixed build for Python 3.8 (issues #66, #72)\n- Added support for Python 3.9\n- Dropped support for Python < 3.6\n\n\nVersion 1.1.10\n~~~~~~~~~~~~~~\n\n- Fixed building with certain ``prctl.h`` implementations (issue #44).\n- Use ``setuptools`` if available (issue #48).\n\n\nVersion 1.1.9\n~~~~~~~~~~~~~\n\n- Fixed build on VC (issues #20, #33).\n- Added ``MANIFEST.in`` to the source distribution to help with RPM building\n (issue #30).\n\n\nVersion 1.1.8\n~~~~~~~~~~~~~\n\n- Added support for Python \"diehard\" 2.4 (pull request #3).\n- Fixed build on Mac OS X 10.9 Maverick (issue #27).\n\n\nVersion 1.1.7\n~~~~~~~~~~~~~\n\n- Added PyPy support, courtesy of Ozan Turksever - http://www.logsign.net\n (pull request #2).\n\n\nVersion 1.1.6\n~~~~~~~~~~~~~\n\n- The module can be compiled again on Windows (issue #21).\n\n\nVersion 1.1.5\n~~~~~~~~~~~~~\n\n- No module bug, but a packaging issue: files ``README`` and ``HISTORY``\n added back into the distribution.\n\n\nVersion 1.1.4\n~~~~~~~~~~~~~\n\n- The module works correctly in embedded Python.\n- ``setproctitle()`` accepts a keyword argument.\n- Debug output support always compiled in: the variable ``SPT_DEBUG`` can be\n used to emit debug log.\n\n\nVersion 1.1.3\n~~~~~~~~~~~~~\n\n- Don't clobber environ if the variable ``SPT_NOENV`` is set (issue #16).\n\n\nVersion 1.1.2\n~~~~~~~~~~~~~\n\n- Find the setproctitle include file on OpenBSD (issue #11).\n- Skip test with unicode if the file system encoding wouldn't make it pass\n (issue #13).\n\n\nVersion 1.1.1\n~~~~~~~~~~~~~\n\n- Fixed segfault when the module is imported under mod_wsgi (issue #9).\n\n\nVersion 1.1\n~~~~~~~~~~~\n\n- The module works correctly with Python 3.\n\n\nVersion 1.0.1\n~~~~~~~~~~~~~\n\n- ``setproctitle()`` works even when Python messes up with argv, e.g. when run\n with the -m option (issue #8).\n\n\nVersion 1.0\n~~~~~~~~~~~\n\nNo major change since the previous version. The module has been heavily used\nin production environment without any problem reported, so it's time to declare\nit stable.\n\n\nVersion 0.4\n~~~~~~~~~~~\n\n- Module works on BSD (tested on FreeBSD 7.2).\n\n- Module works on Windows. Many thanks to `Develer`_ for providing a neat `GCC\n package for Windows with Python integration`__ that made the Windows porting\n painless.\n\n .. _Develer: http://www.develer.com/\n .. __: http://www.develer.com/oss/GccWinBinaries\n\n\nVersion 0.3\n~~~~~~~~~~~\n\n- Module works on Mac OS X 10.2. Reported working on OS X 10.6 too.\n\n\nVersion 0.2\n~~~~~~~~~~~\n\n- Added ``prctl()`` call on Linux >= 2.6.9 to update ``/proc/self/status``.\n\n\nVersion 0.1\n~~~~~~~~~~~\n\n- Initial public release.\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://github.com/dvarrazzo/py-setproctitle",
- "download_url": "http://pypi.python.org/pypi/setproctitle/",
- "author": "Daniele Varrazzo",
- "author_email": "daniele.varrazzo@gmail.com",
- "license": "BSD-3-Clause",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Programming Language :: C",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Operating System :: POSIX :: Linux",
- "Operating System :: POSIX :: BSD",
- "Operating System :: MacOS :: MacOS X",
- "Operating System :: Microsoft :: Windows",
- "Topic :: Software Development"
- ],
- "requires_dist": [
- "pytest ; extra == 'test'"
- ],
- "requires_python": ">=3.7",
- "provides_extra": [
- "test"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254",
- "hashes": {
- "sha256": "8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "six",
- "version": "1.16.0",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "Python 2 and 3 compatibility utilities",
- "description": ".. image:: https://img.shields.io/pypi/v/six.svg\n :target: https://pypi.org/project/six/\n :alt: six on PyPI\n\n.. image:: https://travis-ci.org/benjaminp/six.svg?branch=master\n :target: https://travis-ci.org/benjaminp/six\n :alt: six on TravisCI\n\n.. image:: https://readthedocs.org/projects/six/badge/?version=latest\n :target: https://six.readthedocs.io/\n :alt: six's documentation on Read the Docs\n\n.. image:: https://img.shields.io/badge/license-MIT-green.svg\n :target: https://github.com/benjaminp/six/blob/master/LICENSE\n :alt: MIT License badge\n\nSix is a Python 2 and 3 compatibility library. It provides utility functions\nfor smoothing over the differences between the Python versions with the goal of\nwriting Python code that is compatible on both Python versions. See the\ndocumentation for more information on what is provided.\n\nSix supports Python 2.7 and 3.3+. It is contained in only one Python\nfile, so it can be easily copied into your project. (The copyright and license\nnotice must be retained.)\n\nOnline documentation is at https://six.readthedocs.io/.\n\nBugs can be reported to https://github.com/benjaminp/six. The code can also\nbe found there.\n\n\n",
- "home_page": "https://github.com/benjaminp/six",
- "author": "Benjamin Peterson",
- "author_email": "benjamin@python.org",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 3",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Topic :: Software Development :: Libraries",
- "Topic :: Utilities"
- ],
- "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/c3/a0/5dba8ed157b0136607c7f2151db695885606968d1fae123dc3391e0cfdbf/sniffio-1.3.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384",
- "hashes": {
- "sha256": "eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "sniffio",
- "version": "1.3.0",
- "summary": "Sniff out which async library your code is running under",
- "description": ".. image:: https://img.shields.io/badge/chat-join%20now-blue.svg\n :target: https://gitter.im/python-trio/general\n :alt: Join chatroom\n\n.. image:: https://img.shields.io/badge/docs-read%20now-blue.svg\n :target: https://sniffio.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\n.. image:: https://img.shields.io/pypi/v/sniffio.svg\n :target: https://pypi.org/project/sniffio\n :alt: Latest PyPi version\n \n.. image:: https://img.shields.io/conda/vn/conda-forge/sniffio.svg\n :target: https://anaconda.org/conda-forge/sniffio \n :alt: Latest conda-forge version \n\n.. image:: https://travis-ci.org/python-trio/sniffio.svg?branch=master\n :target: https://travis-ci.org/python-trio/sniffio\n :alt: Automated test status\n\n.. image:: https://codecov.io/gh/python-trio/sniffio/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/python-trio/sniffio\n :alt: Test coverage\n\n=================================================================\nsniffio: Sniff out which async library your code is running under\n=================================================================\n\nYou're writing a library. You've decided to be ambitious, and support\nmultiple async I/O packages, like `Trio\n<https://trio.readthedocs.io>`__, and `asyncio\n<https://docs.python.org/3/library/asyncio.html>`__, and ... You've\nwritten a bunch of clever code to handle all the differences. But...\nhow do you know *which* piece of clever code to run?\n\nThis is a tiny package whose only purpose is to let you detect which\nasync library your code is running under.\n\n* Documentation: https://sniffio.readthedocs.io\n\n* Bug tracker and source code: https://github.com/python-trio/sniffio\n\n* License: MIT or Apache License 2.0, your choice\n\n* Contributor guide: https://trio.readthedocs.io/en/latest/contributing.html\n\n* Code of conduct: Contributors are requested to follow our `code of\n conduct\n <https://trio.readthedocs.io/en/latest/code-of-conduct.html>`_\n in all project spaces.\n\nThis library is maintained by the Trio project, as a service to the\nasync Python community as a whole.\n\n\nQuickstart\n----------\n\n.. code-block:: python3\n\n from sniffio import current_async_library\n import trio\n import asyncio\n\n async def print_library():\n library = current_async_library()\n print(\"This is:\", library)\n\n # Prints \"This is trio\"\n trio.run(print_library)\n\n # Prints \"This is asyncio\"\n asyncio.run(print_library())\n\nFor more details, including how to add support to new async libraries,\n`please peruse our fine manual <https://sniffio.readthedocs.io>`__.\n",
- "keywords": [
- "async",
- "trio",
- "asyncio"
- ],
- "home_page": "https://github.com/python-trio/sniffio",
- "author": "Nathaniel J. Smith",
- "author_email": "njs@pobox.com",
- "license": "MIT OR Apache-2.0",
- "classifier": [
- "License :: OSI Approved :: MIT License",
- "License :: OSI Approved :: Apache Software License",
- "Framework :: Trio",
- "Framework :: AsyncIO",
- "Operating System :: POSIX :: Linux",
- "Operating System :: MacOS :: MacOS X",
- "Operating System :: Microsoft :: Windows",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Intended Audience :: Developers",
- "Development Status :: 5 - Production/Stable"
- ],
- "requires_python": ">=3.7"
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/10/68/09f08f931a8f4277a25feab191bbdaa443a6275184b3842aaae4bb486392/SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "archive_info": {
- "hash": "sha256=5debe7d49b8acf1f3035317e63d9ec8d5e4d904c6e75a2a9246a119f5f2fdf3d",
- "hashes": {
- "sha256": "5debe7d49b8acf1f3035317e63d9ec8d5e4d904c6e75a2a9246a119f5f2fdf3d"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "SQLAlchemy",
- "version": "1.4.49",
- "summary": "Database Abstraction Library",
- "description": "SQLAlchemy\n==========\n\n|PyPI| |Python| |Downloads|\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/sqlalchemy\n :target: https://pypi.org/project/sqlalchemy\n :alt: PyPI\n\n.. |Python| image:: https://img.shields.io/pypi/pyversions/sqlalchemy\n :target: https://pypi.org/project/sqlalchemy\n :alt: PyPI - Python Version\n\n.. |Downloads| image:: https://img.shields.io/pypi/dm/sqlalchemy\n :target: https://pypi.org/project/sqlalchemy\n :alt: PyPI - Downloads\n\n\nThe Python SQL Toolkit and Object Relational Mapper\n\nIntroduction\n-------------\n\nSQLAlchemy is the Python SQL toolkit and Object Relational Mapper\nthat gives application developers the full power and\nflexibility of SQL. SQLAlchemy provides a full suite\nof well known enterprise-level persistence patterns,\ndesigned for efficient and high-performing database\naccess, adapted into a simple and Pythonic domain\nlanguage.\n\nMajor SQLAlchemy features include:\n\n* An industrial strength ORM, built\n from the core on the identity map, unit of work,\n and data mapper patterns. These patterns\n allow transparent persistence of objects\n using a declarative configuration system.\n Domain models\n can be constructed and manipulated naturally,\n and changes are synchronized with the\n current transaction automatically.\n* A relationally-oriented query system, exposing\n the full range of SQL's capabilities\n explicitly, including joins, subqueries,\n correlation, and most everything else,\n in terms of the object model.\n Writing queries with the ORM uses the same\n techniques of relational composition you use\n when writing SQL. While you can drop into\n literal SQL at any time, it's virtually never\n needed.\n* A comprehensive and flexible system\n of eager loading for related collections and objects.\n Collections are cached within a session,\n and can be loaded on individual access, all\n at once using joins, or by query per collection\n across the full result set.\n* A Core SQL construction system and DBAPI\n interaction layer. The SQLAlchemy Core is\n separate from the ORM and is a full database\n abstraction layer in its own right, and includes\n an extensible Python-based SQL expression\n language, schema metadata, connection pooling,\n type coercion, and custom types.\n* All primary and foreign key constraints are\n assumed to be composite and natural. Surrogate\n integer primary keys are of course still the\n norm, but SQLAlchemy never assumes or hardcodes\n to this model.\n* Database introspection and generation. Database\n schemas can be \"reflected\" in one step into\n Python structures representing database metadata;\n those same structures can then generate\n CREATE statements right back out - all within\n the Core, independent of the ORM.\n\nSQLAlchemy's philosophy:\n\n* SQL databases behave less and less like object\n collections the more size and performance start to\n matter; object collections behave less and less like\n tables and rows the more abstraction starts to matter.\n SQLAlchemy aims to accommodate both of these\n principles.\n* An ORM doesn't need to hide the \"R\". A relational\n database provides rich, set-based functionality\n that should be fully exposed. SQLAlchemy's\n ORM provides an open-ended set of patterns\n that allow a developer to construct a custom\n mediation layer between a domain model and\n a relational schema, turning the so-called\n \"object relational impedance\" issue into\n a distant memory.\n* The developer, in all cases, makes all decisions\n regarding the design, structure, and naming conventions\n of both the object model as well as the relational\n schema. SQLAlchemy only provides the means\n to automate the execution of these decisions.\n* With SQLAlchemy, there's no such thing as\n \"the ORM generated a bad query\" - you\n retain full control over the structure of\n queries, including how joins are organized,\n how subqueries and correlation is used, what\n columns are requested. Everything SQLAlchemy\n does is ultimately the result of a developer-\n initiated decision.\n* Don't use an ORM if the problem doesn't need one.\n SQLAlchemy consists of a Core and separate ORM\n component. The Core offers a full SQL expression\n language that allows Pythonic construction\n of SQL constructs that render directly to SQL\n strings for a target database, returning\n result sets that are essentially enhanced DBAPI\n cursors.\n* Transactions should be the norm. With SQLAlchemy's\n ORM, nothing goes to permanent storage until\n commit() is called. SQLAlchemy encourages applications\n to create a consistent means of delineating\n the start and end of a series of operations.\n* Never render a literal value in a SQL statement.\n Bound parameters are used to the greatest degree\n possible, allowing query optimizers to cache\n query plans effectively and making SQL injection\n attacks a non-issue.\n\nDocumentation\n-------------\n\nLatest documentation is at:\n\nhttps://www.sqlalchemy.org/docs/\n\nInstallation / Requirements\n---------------------------\n\nFull documentation for installation is at\n`Installation <https://www.sqlalchemy.org/docs/intro.html#installation>`_.\n\nGetting Help / Development / Bug reporting\n------------------------------------------\n\nPlease refer to the `SQLAlchemy Community Guide <https://www.sqlalchemy.org/support.html>`_.\n\nCode of Conduct\n---------------\n\nAbove all, SQLAlchemy places great emphasis on polite, thoughtful, and\nconstructive communication between users and developers.\nPlease see our current Code of Conduct at\n`Code of Conduct <https://www.sqlalchemy.org/codeofconduct.html>`_.\n\nLicense\n-------\n\nSQLAlchemy is distributed under the `MIT license\n<https://www.opensource.org/licenses/mit-license.php>`_.\n\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://www.sqlalchemy.org",
- "author": "Mike Bayer",
- "author_email": "mike_mp@zzzcomputing.com",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Database :: Front-Ends"
- ],
- "requires_dist": [
- "importlib-metadata ; python_version < \"3.8\"",
- "greenlet (!=0.4.17) ; python_version >= \"3\" and (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\"))))))",
- "greenlet (!=0.4.17) ; (python_version >= \"3\") and extra == 'aiomysql'",
- "aiomysql ; (python_version >= \"3\") and extra == 'aiomysql'",
- "typing-extensions (!=3.10.0.1) ; extra == 'aiosqlite'",
- "greenlet (!=0.4.17) ; (python_version >= \"3\") and extra == 'aiosqlite'",
- "aiosqlite ; (python_version >= \"3\") and extra == 'aiosqlite'",
- "greenlet (!=0.4.17) ; (python_version >= \"3\") and extra == 'asyncio'",
- "greenlet (!=0.4.17) ; (python_version >= \"3\") and extra == 'asyncmy'",
- "asyncmy (!=0.2.4,>=0.2.3) ; (python_version >= \"3\") and extra == 'asyncmy'",
- "mariadb (!=1.1.2,>=1.0.1) ; (python_version >= \"3\") and extra == 'mariadb_connector'",
- "pyodbc ; extra == 'mssql'",
- "pymssql ; extra == 'mssql_pymssql'",
- "pyodbc ; extra == 'mssql_pyodbc'",
- "sqlalchemy2-stubs ; extra == 'mypy'",
- "mypy (>=0.910) ; (python_version >= \"3\") and extra == 'mypy'",
- "mysqlclient (<2,>=1.4.0) ; (python_version < \"3\") and extra == 'mysql'",
- "mysqlclient (>=1.4.0) ; (python_version >= \"3\") and extra == 'mysql'",
- "mysql-connector-python ; extra == 'mysql_connector'",
- "cx-oracle (<8,>=7) ; (python_version < \"3\") and extra == 'oracle'",
- "cx-oracle (>=7) ; (python_version >= \"3\") and extra == 'oracle'",
- "psycopg2 (>=2.7) ; extra == 'postgresql'",
- "greenlet (!=0.4.17) ; (python_version >= \"3\") and extra == 'postgresql_asyncpg'",
- "asyncpg ; (python_version >= \"3\") and extra == 'postgresql_asyncpg'",
- "pg8000 (!=1.29.0,>=1.16.6) ; extra == 'postgresql_pg8000'",
- "psycopg2-binary ; extra == 'postgresql_psycopg2binary'",
- "psycopg2cffi ; extra == 'postgresql_psycopg2cffi'",
- "pymysql (<1) ; (python_version < \"3\") and extra == 'pymysql'",
- "pymysql ; (python_version >= \"3\") and extra == 'pymysql'",
- "sqlcipher3-binary ; (python_version >= \"3\") and extra == 'sqlcipher'"
- ],
- "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7",
- "project_url": [
- "Documentation, https://docs.sqlalchemy.org",
- "Issue Tracker, https://github.com/sqlalchemy/sqlalchemy/"
- ],
- "provides_extra": [
- "aiomysql",
- "aiosqlite",
- "asyncio",
- "asyncmy",
- "mariadb_connector",
- "mssql",
- "mssql_pymssql",
- "mssql_pyodbc",
- "mypy",
- "mysql",
- "mysql_connector",
- "oracle",
- "postgresql",
- "postgresql_asyncpg",
- "postgresql_pg8000",
- "postgresql_psycopg2binary",
- "postgresql_psycopg2cffi",
- "pymysql",
- "sqlcipher"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/38/1c/283e6216c21827fb1358f2f409432828f9df4e402182cf590a1cc5a8874f/SQLAlchemy_JSONField-1.0.1.post0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=d6f1e5ee329a3c0d9d164e40d81a2143ac8332e09988fbbaff84179dac5503d4",
- "hashes": {
- "sha256": "d6f1e5ee329a3c0d9d164e40d81a2143ac8332e09988fbbaff84179dac5503d4"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "SQLAlchemy-JSONField",
- "version": "1.0.1.post0",
- "summary": "SQLALchemy JSONField implementation for storing dicts at SQL",
- "description": "SQLAlchemy-JSONField\n====================\n\n.. image:: https://github.com/penguinolog/sqlalchemy_jsonfield/workflows/Python%20package/badge.svg\n :target: https://github.com/penguinolog/sqlalchemy_jsonfield/actions\n.. image:: https://img.shields.io/pypi/v/sqlalchemy_jsonfield.svg\n :target: https://pypi.python.org/pypi/sqlalchemy_jsonfield\n.. image:: https://img.shields.io/pypi/pyversions/sqlalchemy_jsonfield.svg\n :target: https://pypi.python.org/pypi/sqlalchemy_jsonfield\n.. image:: https://img.shields.io/pypi/status/sqlalchemy_jsonfield.svg\n :target: https://pypi.python.org/pypi/sqlalchemy_jsonfield\n.. image:: https://img.shields.io/github/license/penguinolog/sqlalchemy_jsonfield.svg\n :target: https://raw.githubusercontent.com/penguinolog/sqlalchemy_jsonfield/master/LICENSE\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n :target: https://github.com/ambv/black\n\nSQLALchemy JSONField implementation for storing dicts at SQL independently from JSON type support.\n\nWhy?\n----\n\nSqlAlchemy provides JSON field support for several database types (PostgreSQL and MySQL for now)\nand semi-working dict <-> JSON <-> VARCHAR example, but...\nIn real scenarios we have tests on sqlite, production on MySQL/MariaDB/Percona/PostgreSQL\nand some of them (modern Oracle MySQL & PostgreSQL) support JSON,\nsome of them (SQLite, Percona & MariaDB) requires data conversion to Text (not VARCHAR).\n\nAs addition, we have different levels of Unicode support on database and connector side,\nso we may be interested to switch JSON encoding between deployments.\n\n.. note:: SQLite 3.9 supports JSON natively and SQLAlchemy can handle this.\n\nSolution:\n---------\n\nSQLALchemy JSONField has API with suport for automatic switch between native JSON and JSON encoded data,\nand encoding to JSON string can be enforced.\n\nPros:\n-----\n\n* Free software: Apache license\n* Open Source: https://github.com/penguinolog/sqlalchemy_jsonfield\n* Self-documented code: docstrings with types in comments\n* Uses native JSON by default, but allows to specify different library.\n* Support multiple Python versions\n\nUsage\n=====\nDirect usage with MariaDB (example extracted from functional tests):\n\n.. code-block:: python\n\n import sqlalchemy_jsonfield\n\n class ExampleTable(Base):\n __tablename__ = table_name\n id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)\n row_name = sqlalchemy.Column(\n sqlalchemy.Unicode(64),\n unique=True,\n )\n json_record = sqlalchemy.Column(\n sqlalchemy_jsonfield.JSONField(\n # MariaDB does not support JSON for now\n enforce_string=True,\n # MariaDB connector requires additional parameters for correct UTF-8\n enforce_unicode=False\n ),\n nullable=False\n )\n\nUsage with alternate JSON library:\n\n.. code-block:: python\n\n import sqlalchemy_jsonfield\n import ujson\n\n class ExampleTable(Base):\n __tablename__ = table_name\n id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)\n row_name = sqlalchemy.Column(\n sqlalchemy.Unicode(64),\n unique=True,\n )\n json_record = sqlalchemy.Column(\n sqlalchemy_jsonfield.JSONField(\n enforce_string=True,\n enforce_unicode=False,\n json=ujson, # Use ujson instead of standard json.\n ),\n nullable=False\n )\n\nUsage on PostgreSQL/Oracle MySQL(modern version)/SQLite(testing) environments allows to set `enforce_string=False`\nand use native JSON fields.\n\nTesting\n=======\nThe main test mechanism for the package `sqlalchemy_jsonfield` is using `tox`.\nAvailable environments can be collected via `tox -l`\n\nCI systems\n==========\nFor code checking several CI systems is used in parallel:\n\n1. `GitHub actions: <https://github.com/penguinolog/sqlalchemy_jsonfield/actions>`_ is used for checking: PEP8, pylint, bandit, installation possibility and unit tests.\n",
- "description_content_type": "text/x-rst",
- "keywords": [
- "sql",
- "sqlalchemy",
- "json",
- "jsonfield",
- "development"
- ],
- "author_email": "Alexey Stepanov <penguinolog@gmail.com>",
- "license": "Apache License, Version 2.0",
- "classifier": [
- "Development Status :: 4 - Beta",
- "Intended Audience :: Developers",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy"
- ],
- "requires_dist": [
- "sqlalchemy"
- ],
- "requires_python": ">=3.7.0",
- "project_url": [
- "Bug Tracker, https://github.com/penguinolog/sqlalchemy_jsonfield/issues"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/73/d8/3863fdfe6b27f6c0dffc650aaa2929f313b33aea615b102279fd46ab550b/SQLAlchemy_Utils-0.41.1-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=6c96b0768ea3f15c0dc56b363d386138c562752b84f647fb8d31a2223aaab801",
- "hashes": {
- "sha256": "6c96b0768ea3f15c0dc56b363d386138c562752b84f647fb8d31a2223aaab801"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "SQLAlchemy-Utils",
- "version": "0.41.1",
- "platform": [
- "any"
- ],
- "summary": "Various utility functions for SQLAlchemy.",
- "description": "\nSQLAlchemy-Utils\n----------------\n\nVarious utility functions and custom data types for SQLAlchemy.\n",
- "home_page": "https://github.com/kvesteri/sqlalchemy-utils",
- "author": "Konsta Vesterinen, Ryan Leckey, Janne Vanhala, Vesa Uimonen",
- "author_email": "konsta@fastmonkeys.com",
- "license": "BSD",
- "classifier": [
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ],
- "requires_dist": [
- "SQLAlchemy (>=1.3)",
- "importlib-metadata ; python_version < \"3.8\"",
- "arrow (>=0.3.4) ; extra == 'arrow'",
- "Babel (>=1.3) ; extra == 'babel'",
- "colour (>=0.0.4) ; extra == 'color'",
- "cryptography (>=0.6) ; extra == 'encrypted'",
- "intervals (>=0.7.1) ; extra == 'intervals'",
- "passlib (<2.0,>=1.6) ; extra == 'password'",
- "pendulum (>=2.0.5) ; extra == 'pendulum'",
- "phonenumbers (>=5.9.2) ; extra == 'phone'",
- "pytest (>=2.7.1) ; extra == 'test'",
- "Pygments (>=1.2) ; extra == 'test'",
- "Jinja2 (>=2.3) ; extra == 'test'",
- "docutils (>=0.10) ; extra == 'test'",
- "flexmock (>=0.9.7) ; extra == 'test'",
- "psycopg (>=3.1.8) ; extra == 'test'",
- "psycopg2 (>=2.5.1) ; extra == 'test'",
- "psycopg2cffi (>=2.8.1) ; extra == 'test'",
- "pg8000 (>=1.12.4) ; extra == 'test'",
- "pytz (>=2014.2) ; extra == 'test'",
- "python-dateutil (>=2.6) ; extra == 'test'",
- "pymysql ; extra == 'test'",
- "flake8 (>=2.4.0) ; extra == 'test'",
- "isort (>=4.2.2) ; extra == 'test'",
- "pyodbc ; extra == 'test'",
- "backports.zoneinfo ; (python_version < \"3.9\") and extra == 'test'",
- "Babel (>=1.3) ; extra == 'test_all'",
- "Jinja2 (>=2.3) ; extra == 'test_all'",
- "Pygments (>=1.2) ; extra == 'test_all'",
- "arrow (>=0.3.4) ; extra == 'test_all'",
- "colour (>=0.0.4) ; extra == 'test_all'",
- "cryptography (>=0.6) ; extra == 'test_all'",
- "docutils (>=0.10) ; extra == 'test_all'",
- "flake8 (>=2.4.0) ; extra == 'test_all'",
- "flexmock (>=0.9.7) ; extra == 'test_all'",
- "furl (>=0.4.1) ; extra == 'test_all'",
- "intervals (>=0.7.1) ; extra == 'test_all'",
- "isort (>=4.2.2) ; extra == 'test_all'",
- "passlib (<2.0,>=1.6) ; extra == 'test_all'",
- "pendulum (>=2.0.5) ; extra == 'test_all'",
- "pg8000 (>=1.12.4) ; extra == 'test_all'",
- "phonenumbers (>=5.9.2) ; extra == 'test_all'",
- "psycopg2 (>=2.5.1) ; extra == 'test_all'",
- "psycopg2cffi (>=2.8.1) ; extra == 'test_all'",
- "psycopg (>=3.1.8) ; extra == 'test_all'",
- "pymysql ; extra == 'test_all'",
- "pyodbc ; extra == 'test_all'",
- "pytest (>=2.7.1) ; extra == 'test_all'",
- "python-dateutil ; extra == 'test_all'",
- "python-dateutil (>=2.6) ; extra == 'test_all'",
- "pytz (>=2014.2) ; extra == 'test_all'",
- "backports.zoneinfo ; (python_version < \"3.9\") and extra == 'test_all'",
- "python-dateutil ; extra == 'timezone'",
- "furl (>=0.4.1) ; extra == 'url'"
- ],
- "requires_python": ">=3.6",
- "provides_extra": [
- "arrow",
- "babel",
- "color",
- "encrypted",
- "intervals",
- "password",
- "pendulum",
- "phone",
- "test",
- "test_all",
- "timezone",
- "url"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/98/5a/66d7c9305baa9f11857f247d4ba761402cea75db6058ff850ed7128957b7/sqlparse-0.4.4-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3",
- "hashes": {
- "sha256": "5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "sqlparse",
- "version": "0.4.4",
- "summary": "A non-validating SQL parser.",
- "description": "python-sqlparse - Parse SQL statements\n======================================\n\n|buildstatus|_\n|coverage|_\n|docs|_\n|packageversion|_\n\n.. docincludebegin\n\nsqlparse is a non-validating SQL parser for Python.\nIt provides support for parsing, splitting and formatting SQL statements.\n\nThe module is compatible with Python 3.5+ and released under the terms of the\n`New BSD license <https://opensource.org/licenses/BSD-3-Clause>`_.\n\nVisit the project page at https://github.com/andialbrecht/sqlparse for\nfurther information about this project.\n\n\nQuick Start\n-----------\n\n.. code-block:: sh\n\n $ pip install sqlparse\n\n.. code-block:: python\n\n >>> import sqlparse\n\n >>> # Split a string containing two SQL statements:\n >>> raw = 'select * from foo; select * from bar;'\n >>> statements = sqlparse.split(raw)\n >>> statements\n ['select * from foo;', 'select * from bar;']\n\n >>> # Format the first statement and print it out:\n >>> first = statements[0]\n >>> print(sqlparse.format(first, reindent=True, keyword_case='upper'))\n SELECT *\n FROM foo;\n\n >>> # Parsing a SQL statement:\n >>> parsed = sqlparse.parse('select * from foo')[0]\n >>> parsed.tokens\n [<DML 'select' at 0x7f22c5e15368>, <Whitespace ' ' at 0x7f22c5e153b0>, <Wildcard '*' … ]\n >>>\n\nLinks\n-----\n\nProject page\n https://github.com/andialbrecht/sqlparse\n\nBug tracker\n https://github.com/andialbrecht/sqlparse/issues\n\nDocumentation\n https://sqlparse.readthedocs.io/\n\nOnline Demo\n https://sqlformat.org/\n\n\nsqlparse is licensed under the BSD license.\n\nParts of the code are based on pygments written by Georg Brandl and others.\npygments-Homepage: http://pygments.org/\n\n.. |buildstatus| image:: https://github.com/andialbrecht/sqlparse/actions/workflows/python-app.yml/badge.svg\n.. _buildstatus: https://github.com/andialbrecht/sqlparse/actions/workflows/python-app.yml\n.. |coverage| image:: https://codecov.io/gh/andialbrecht/sqlparse/branch/master/graph/badge.svg\n.. _coverage: https://codecov.io/gh/andialbrecht/sqlparse\n.. |docs| image:: https://readthedocs.org/projects/sqlparse/badge/?version=latest\n.. _docs: https://sqlparse.readthedocs.io/en/latest/?badge=latest\n.. |packageversion| image:: https://img.shields.io/pypi/v/sqlparse?color=%2334D058&label=pypi%20package\n.. _packageversion: https://pypi.org/project/sqlparse\n\n",
- "description_content_type": "text/x-rst",
- "author_email": "Andi Albrecht <albrecht.andi@gmail.com>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Database",
- "Topic :: Software Development"
- ],
- "requires_dist": [
- "flake8 ; extra == \"dev\"",
- "build ; extra == \"dev\"",
- "sphinx ; extra == \"doc\"",
- "pytest ; extra == \"test\"",
- "pytest-cov ; extra == \"test\""
- ],
- "requires_python": ">=3.5",
- "project_url": [
- "Documentation, https://sqlparse.readthedocs.io/",
- "Home, https://github.com/andialbrecht/sqlparse",
- "Release Notes, https://sqlparse.readthedocs.io/en/latest/changes/",
- "Source, https://github.com/andialbrecht/sqlparse",
- "Tracker, https://github.com/andialbrecht/sqlparse/issues"
- ],
- "provides_extra": [
- "dev",
- "doc",
- "test"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f",
- "hashes": {
- "sha256": "024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "tabulate",
- "version": "0.9.0",
- "summary": "Pretty-print tabular data",
- "description": "python-tabulate\n===============\n\nPretty-print tabular data in Python, a library and a command-line\nutility.\n\nThe main use cases of the library are:\n\n- printing small tables without hassle: just one function call,\n formatting is guided by the data itself\n- authoring tabular data for lightweight plain-text markup: multiple\n output formats suitable for further editing or transformation\n- readable presentation of mixed textual and numeric data: smart\n column alignment, configurable number formatting, alignment by a\n decimal point\n\nInstallation\n------------\n\nTo install the Python library and the command line utility, run:\n\n```shell\npip install tabulate\n```\n\nThe command line utility will be installed as `tabulate` to `bin` on\nLinux (e.g. `/usr/bin`); or as `tabulate.exe` to `Scripts` in your\nPython installation on Windows (e.g. `C:\\Python39\\Scripts\\tabulate.exe`).\n\nYou may consider installing the library only for the current user:\n\n```shell\npip install tabulate --user\n```\n\nIn this case the command line utility will be installed to\n`~/.local/bin/tabulate` on Linux and to\n`%APPDATA%\\Python\\Scripts\\tabulate.exe` on Windows.\n\nTo install just the library on Unix-like operating systems:\n\n```shell\nTABULATE_INSTALL=lib-only pip install tabulate\n```\n\nOn Windows:\n\n```shell\nset TABULATE_INSTALL=lib-only\npip install tabulate\n```\n\nBuild status\n------------\n\n[](https://circleci.com/gh/astanin/python-tabulate/tree/master) [](https://ci.appveyor.com/project/astanin/python-tabulate/branch/master)\n\nLibrary usage\n-------------\n\nThe module provides just one function, `tabulate`, which takes a list of\nlists or another tabular data type as the first argument, and outputs a\nnicely formatted plain-text table:\n\n```pycon\n>>> from tabulate import tabulate\n\n>>> table = [[\"Sun\",696000,1989100000],[\"Earth\",6371,5973.6],\n... [\"Moon\",1737,73.5],[\"Mars\",3390,641.85]]\n>>> print(tabulate(table))\n----- ------ -------------\nSun 696000 1.9891e+09\nEarth 6371 5973.6\nMoon 1737 73.5\nMars 3390 641.85\n----- ------ -------------\n```\n\nThe following tabular data types are supported:\n\n- list of lists or another iterable of iterables\n- list or another iterable of dicts (keys as columns)\n- dict of iterables (keys as columns)\n- list of dataclasses (Python 3.7+ only, field names as columns)\n- two-dimensional NumPy array\n- NumPy record arrays (names as columns)\n- pandas.DataFrame\n\nTabulate is a Python3 library.\n\n### Headers\n\nThe second optional argument named `headers` defines a list of column\nheaders to be used:\n\n```pycon\n>>> print(tabulate(table, headers=[\"Planet\",\"R (km)\", \"mass (x 10^29 kg)\"]))\nPlanet R (km) mass (x 10^29 kg)\n-------- -------- -------------------\nSun 696000 1.9891e+09\nEarth 6371 5973.6\nMoon 1737 73.5\nMars 3390 641.85\n```\n\nIf `headers=\"firstrow\"`, then the first row of data is used:\n\n```pycon\n>>> print(tabulate([[\"Name\",\"Age\"],[\"Alice\",24],[\"Bob\",19]],\n... headers=\"firstrow\"))\nName Age\n------ -----\nAlice 24\nBob 19\n```\n\nIf `headers=\"keys\"`, then the keys of a dictionary/dataframe, or column\nindices are used. It also works for NumPy record arrays and lists of\ndictionaries or named tuples:\n\n```pycon\n>>> print(tabulate({\"Name\": [\"Alice\", \"Bob\"],\n... \"Age\": [24, 19]}, headers=\"keys\"))\n Age Name\n----- ------\n 24 Alice\n 19 Bob\n```\n\n### Row Indices\n\nBy default, only pandas.DataFrame tables have an additional column\ncalled row index. To add a similar column to any other type of table,\npass `showindex=\"always\"` or `showindex=True` argument to `tabulate()`.\nTo suppress row indices for all types of data, pass `showindex=\"never\"`\nor `showindex=False`. To add a custom row index column, pass\n`showindex=rowIDs`, where `rowIDs` is some iterable:\n\n```pycon\n>>> print(tabulate([[\"F\",24],[\"M\",19]], showindex=\"always\"))\n- - --\n0 F 24\n1 M 19\n- - --\n```\n\n### Table format\n\nThere is more than one way to format a table in plain text. The third\noptional argument named `tablefmt` defines how the table is formatted.\n\nSupported table formats are:\n\n- \"plain\"\n- \"simple\"\n- \"github\"\n- \"grid\"\n- \"simple\\_grid\"\n- \"rounded\\_grid\"\n- \"heavy\\_grid\"\n- \"mixed\\_grid\"\n- \"double\\_grid\"\n- \"fancy\\_grid\"\n- \"outline\"\n- \"simple\\_outline\"\n- \"rounded\\_outline\"\n- \"heavy\\_outline\"\n- \"mixed\\_outline\"\n- \"double\\_outline\"\n- \"fancy\\_outline\"\n- \"pipe\"\n- \"orgtbl\"\n- \"asciidoc\"\n- \"jira\"\n- \"presto\"\n- \"pretty\"\n- \"psql\"\n- \"rst\"\n- \"mediawiki\"\n- \"moinmoin\"\n- \"youtrack\"\n- \"html\"\n- \"unsafehtml\"\n- \"latex\"\n- \"latex\\_raw\"\n- \"latex\\_booktabs\"\n- \"latex\\_longtable\"\n- \"textile\"\n- \"tsv\"\n\n`plain` tables do not use any pseudo-graphics to draw lines:\n\n```pycon\n>>> table = [[\"spam\",42],[\"eggs\",451],[\"bacon\",0]]\n>>> headers = [\"item\", \"qty\"]\n>>> print(tabulate(table, headers, tablefmt=\"plain\"))\nitem qty\nspam 42\neggs 451\nbacon 0\n```\n\n`simple` is the default format (the default may change in future\nversions). It corresponds to `simple_tables` in [Pandoc Markdown\nextensions](http://johnmacfarlane.net/pandoc/README.html#tables):\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"simple\"))\nitem qty\n------ -----\nspam 42\neggs 451\nbacon 0\n```\n\n`github` follows the conventions of GitHub flavored Markdown. It\ncorresponds to the `pipe` format without alignment colons:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"github\"))\n| item | qty |\n|--------|-------|\n| spam | 42 |\n| eggs | 451 |\n| bacon | 0 |\n```\n\n`grid` is like tables formatted by Emacs'\n[table.el](http://table.sourceforge.net/) package. It corresponds to\n`grid_tables` in Pandoc Markdown extensions:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"grid\"))\n+--------+-------+\n| item | qty |\n+========+=======+\n| spam | 42 |\n+--------+-------+\n| eggs | 451 |\n+--------+-------+\n| bacon | 0 |\n+--------+-------+\n```\n\n`simple_grid` draws a grid using single-line box-drawing characters:\n\n >>> print(tabulate(table, headers, tablefmt=\"simple_grid\"))\n ┌────────┬───────┐\n │ item │ qty │\n ├────────┼───────┤\n │ spam │ 42 │\n ├────────┼───────┤\n │ eggs │ 451 │\n ├────────┼───────┤\n │ bacon │ 0 │\n └────────┴───────┘\n\n`rounded_grid` draws a grid using single-line box-drawing characters with rounded corners:\n\n >>> print(tabulate(table, headers, tablefmt=\"rounded_grid\"))\n ╭────────┬───────╮\n │ item │ qty │\n ├────────┼───────┤\n │ spam │ 42 │\n ├────────┼───────┤\n │ eggs │ 451 │\n ├────────┼───────┤\n │ bacon │ 0 │\n ╰────────┴───────╯\n\n`heavy_grid` draws a grid using bold (thick) single-line box-drawing characters:\n\n >>> print(tabulate(table, headers, tablefmt=\"heavy_grid\"))\n ┏━━━━━━━━┳━━━━━━━┓\n ┃ item ┃ qty ┃\n ┣━━━━━━━━╋━━━━━━━┫\n ┃ spam ┃ 42 ┃\n ┣━━━━━━━━╋━━━━━━━┫\n ┃ eggs ┃ 451 ┃\n ┣━━━━━━━━╋━━━━━━━┫\n ┃ bacon ┃ 0 ┃\n ┗━━━━━━━━┻━━━━━━━┛\n\n`mixed_grid` draws a grid using a mix of light (thin) and heavy (thick) lines box-drawing characters:\n\n >>> print(tabulate(table, headers, tablefmt=\"mixed_grid\"))\n ┍━━━━━━━━┯━━━━━━━┑\n │ item │ qty │\n ┝━━━━━━━━┿━━━━━━━┥\n │ spam │ 42 │\n ├────────┼───────┤\n │ eggs │ 451 │\n ├────────┼───────┤\n │ bacon │ 0 │\n ┕━━━━━━━━┷━━━━━━━┙\n\n`double_grid` draws a grid using double-line box-drawing characters:\n\n >>> print(tabulate(table, headers, tablefmt=\"double_grid\"))\n ╔════════╦═══════╗\n ║ item ║ qty ║\n ╠════════╬═══════╣\n ║ spam ║ 42 ║\n ╠════════╬═══════╣\n ║ eggs ║ 451 ║\n ╠════════╬═══════╣\n ║ bacon ║ 0 ║\n ╚════════╩═══════╝\n\n`fancy_grid` draws a grid using a mix of single and\n double-line box-drawing characters:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"fancy_grid\"))\n╒════════╤═══════╕\n│ item │ qty │\n╞════════╪═══════╡\n│ spam │ 42 │\n├────────┼───────┤\n│ eggs │ 451 │\n├────────┼───────┤\n│ bacon │ 0 │\n╘════════╧═══════╛\n```\n\n`outline` is the same as the `grid` format but doesn't draw lines between rows:\n\n >>> print(tabulate(table, headers, tablefmt=\"outline\"))\n +--------+-------+\n | item | qty |\n +========+=======+\n | spam | 42 |\n | eggs | 451 |\n | bacon | 0 |\n +--------+-------+\n\n`simple_outline` is the same as the `simple_grid` format but doesn't draw lines between rows:\n\n >>> print(tabulate(table, headers, tablefmt=\"simple_outline\"))\n ┌────────┬───────┐\n │ item │ qty │\n ├────────┼───────┤\n │ spam │ 42 │\n │ eggs │ 451 │\n │ bacon │ 0 │\n └────────┴───────┘\n\n`rounded_outline` is the same as the `rounded_grid` format but doesn't draw lines between rows:\n\n >>> print(tabulate(table, headers, tablefmt=\"rounded_outline\"))\n ╭────────┬───────╮\n │ item │ qty │\n ├────────┼───────┤\n │ spam │ 42 │\n │ eggs │ 451 │\n │ bacon │ 0 │\n ╰────────┴───────╯\n\n`heavy_outline` is the same as the `heavy_grid` format but doesn't draw lines between rows:\n\n >>> print(tabulate(table, headers, tablefmt=\"heavy_outline\"))\n ┏━━━━━━━━┳━━━━━━━┓\n ┃ item ┃ qty ┃\n ┣━━━━━━━━╋━━━━━━━┫\n ┃ spam ┃ 42 ┃\n ┃ eggs ┃ 451 ┃\n ┃ bacon ┃ 0 ┃\n ┗━━━━━━━━┻━━━━━━━┛\n\n`mixed_outline` is the same as the `mixed_grid` format but doesn't draw lines between rows:\n\n >>> print(tabulate(table, headers, tablefmt=\"mixed_outline\"))\n ┍━━━━━━━━┯━━━━━━━┑\n │ item │ qty │\n ┝━━━━━━━━┿━━━━━━━┥\n │ spam │ 42 │\n │ eggs │ 451 │\n │ bacon │ 0 │\n ┕━━━━━━━━┷━━━━━━━┙\n\n`double_outline` is the same as the `double_grid` format but doesn't draw lines between rows:\n\n >>> print(tabulate(table, headers, tablefmt=\"double_outline\"))\n ╔════════╦═══════╗\n ║ item ║ qty ║\n ╠════════╬═══════╣\n ║ spam ║ 42 ║\n ║ eggs ║ 451 ║\n ║ bacon ║ 0 ║\n ╚════════╩═══════╝\n\n`fancy_outline` is the same as the `fancy_grid` format but doesn't draw lines between rows:\n\n >>> print(tabulate(table, headers, tablefmt=\"fancy_outline\"))\n ╒════════╤═══════╕\n │ item │ qty │\n ╞════════╪═══════╡\n │ spam │ 42 │\n │ eggs │ 451 │\n │ bacon │ 0 │\n ╘════════╧═══════╛\n\n`presto` is like tables formatted by Presto cli:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"presto\"))\n item | qty\n--------+-------\n spam | 42\n eggs | 451\n bacon | 0\n```\n\n`pretty` attempts to be close to the format emitted by the PrettyTables\nlibrary:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"pretty\"))\n+-------+-----+\n| item | qty |\n+-------+-----+\n| spam | 42 |\n| eggs | 451 |\n| bacon | 0 |\n+-------+-----+\n```\n\n`psql` is like tables formatted by Postgres' psql cli:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"psql\"))\n+--------+-------+\n| item | qty |\n|--------+-------|\n| spam | 42 |\n| eggs | 451 |\n| bacon | 0 |\n+--------+-------+\n```\n\n`pipe` follows the conventions of [PHP Markdown\nExtra](http://michelf.ca/projects/php-markdown/extra/#table) extension.\nIt corresponds to `pipe_tables` in Pandoc. This format uses colons to\nindicate column alignment:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"pipe\"))\n| item | qty |\n|:-------|------:|\n| spam | 42 |\n| eggs | 451 |\n| bacon | 0 |\n```\n\n`asciidoc` formats data like a simple table of the\n[AsciiDoctor](https://docs.asciidoctor.org/asciidoc/latest/syntax-quick-reference/#tables)\nformat:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"asciidoc\"))\n[cols=\"8<,7>\",options=\"header\"]\n|====\n| item | qty\n| spam | 42\n| eggs | 451\n| bacon | 0\n|====\n```\n\n`orgtbl` follows the conventions of Emacs\n[org-mode](http://orgmode.org/manual/Tables.html), and is editable also\nin the minor orgtbl-mode. Hence its name:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"orgtbl\"))\n| item | qty |\n|--------+-------|\n| spam | 42 |\n| eggs | 451 |\n| bacon | 0 |\n```\n\n`jira` follows the conventions of Atlassian Jira markup language:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"jira\"))\n|| item || qty ||\n| spam | 42 |\n| eggs | 451 |\n| bacon | 0 |\n```\n\n`rst` formats data like a simple table of the\n[reStructuredText](http://docutils.sourceforge.net/docs/user/rst/quickref.html#tables)\nformat:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"rst\"))\n====== =====\nitem qty\n====== =====\nspam 42\neggs 451\nbacon 0\n====== =====\n```\n\n`mediawiki` format produces a table markup used in\n[Wikipedia](http://www.mediawiki.org/wiki/Help:Tables) and on other\nMediaWiki-based sites:\n\n ```pycon\n>>> print(tabulate(table, headers, tablefmt=\"mediawiki\"))\n{| class=\"wikitable\" style=\"text-align: left;\"\n|+ <!-- caption -->\n|-\n! item !! align=\"right\"| qty\n|-\n| spam || align=\"right\"| 42\n|-\n| eggs || align=\"right\"| 451\n|-\n| bacon || align=\"right\"| 0\n|}\n```\n\n`moinmoin` format produces a table markup used in\n[MoinMoin](https://moinmo.in/) wikis:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"moinmoin\"))\n|| ''' item ''' || ''' quantity ''' ||\n|| spam || 41.999 ||\n|| eggs || 451 ||\n|| bacon || ||\n```\n\n`youtrack` format produces a table markup used in Youtrack tickets:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"youtrack\"))\n|| item || quantity ||\n| spam | 41.999 |\n| eggs | 451 |\n| bacon | |\n```\n\n`textile` format produces a table markup used in\n[Textile](http://redcloth.org/hobix.com/textile/) format:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"textile\"))\n|_. item |_. qty |\n|<. spam |>. 42 |\n|<. eggs |>. 451 |\n|<. bacon |>. 0 |\n```\n\n`html` produces standard HTML markup as an html.escape'd str\nwith a ._repr_html_ method so that Jupyter Lab and Notebook display the HTML\nand a .str property so that the raw HTML remains accessible.\n`unsafehtml` table format can be used if an unescaped HTML is required:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"html\"))\n<table>\n<tbody>\n<tr><th>item </th><th style=\"text-align: right;\"> qty</th></tr>\n<tr><td>spam </td><td style=\"text-align: right;\"> 42</td></tr>\n<tr><td>eggs </td><td style=\"text-align: right;\"> 451</td></tr>\n<tr><td>bacon </td><td style=\"text-align: right;\"> 0</td></tr>\n</tbody>\n</table>\n```\n\n`latex` format creates a `tabular` environment for LaTeX markup,\nreplacing special characters like `_` or `\\` to their LaTeX\ncorrespondents:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"latex\"))\n\\begin{tabular}{lr}\n\\hline\n item & qty \\\\\n\\hline\n spam & 42 \\\\\n eggs & 451 \\\\\n bacon & 0 \\\\\n\\hline\n\\end{tabular}\n```\n\n`latex_raw` behaves like `latex` but does not escape LaTeX commands and\nspecial characters.\n\n`latex_booktabs` creates a `tabular` environment for LaTeX markup using\nspacing and style from the `booktabs` package.\n\n`latex_longtable` creates a table that can stretch along multiple pages,\nusing the `longtable` package.\n\n### Column alignment\n\n`tabulate` is smart about column alignment. It detects columns which\ncontain only numbers, and aligns them by a decimal point (or flushes\nthem to the right if they appear to be integers). Text columns are\nflushed to the left.\n\nYou can override the default alignment with `numalign` and `stralign`\nnamed arguments. Possible column alignments are: `right`, `center`,\n`left`, `decimal` (only for numbers), and `None` (to disable alignment).\n\nAligning by a decimal point works best when you need to compare numbers\nat a glance:\n\n```pycon\n>>> print(tabulate([[1.2345],[123.45],[12.345],[12345],[1234.5]]))\n----------\n 1.2345\n 123.45\n 12.345\n12345\n 1234.5\n----------\n```\n\nCompare this with a more common right alignment:\n\n```pycon\n>>> print(tabulate([[1.2345],[123.45],[12.345],[12345],[1234.5]], numalign=\"right\"))\n------\n1.2345\n123.45\n12.345\n 12345\n1234.5\n------\n```\n\nFor `tabulate`, anything which can be parsed as a number is a number.\nEven numbers represented as strings are aligned properly. This feature\ncomes in handy when reading a mixed table of text and numbers from a\nfile:\n\n```pycon\n>>> import csv ; from StringIO import StringIO\n>>> table = list(csv.reader(StringIO(\"spam, 42\\neggs, 451\\n\")))\n>>> table\n[['spam', ' 42'], ['eggs', ' 451']]\n>>> print(tabulate(table))\n---- ----\nspam 42\neggs 451\n---- ----\n```\n\nTo disable this feature use `disable_numparse=True`.\n\n```pycon\n>>> print(tabulate.tabulate([[\"Ver1\", \"18.0\"], [\"Ver2\",\"19.2\"]], tablefmt=\"simple\", disable_numparse=True))\n---- ----\nVer1 18.0\nVer2 19.2\n---- ----\n```\n\n### Custom column alignment\n\n`tabulate` allows a custom column alignment to override the above. The\n`colalign` argument can be a list or a tuple of `stralign` named\narguments. Possible column alignments are: `right`, `center`, `left`,\n`decimal` (only for numbers), and `None` (to disable alignment).\nOmitting an alignment uses the default. For example:\n\n```pycon\n>>> print(tabulate([[\"one\", \"two\"], [\"three\", \"four\"]], colalign=(\"right\",))\n----- ----\n one two\nthree four\n----- ----\n```\n\n### Number formatting\n\n`tabulate` allows to define custom number formatting applied to all\ncolumns of decimal numbers. Use `floatfmt` named argument:\n\n```pycon\n>>> print(tabulate([[\"pi\",3.141593],[\"e\",2.718282]], floatfmt=\".4f\"))\n-- ------\npi 3.1416\ne 2.7183\n-- ------\n```\n\n`floatfmt` argument can be a list or a tuple of format strings, one per\ncolumn, in which case every column may have different number formatting:\n\n```pycon\n>>> print(tabulate([[0.12345, 0.12345, 0.12345]], floatfmt=(\".1f\", \".3f\")))\n--- ----- -------\n0.1 0.123 0.12345\n--- ----- -------\n```\n\n`intfmt` works similarly for integers\n\n >>> print(tabulate([[\"a\",1000],[\"b\",90000]], intfmt=\",\"))\n - ------\n a 1,000\n b 90,000\n - ------\n\n### Text formatting\n\nBy default, `tabulate` removes leading and trailing whitespace from text\ncolumns. To disable whitespace removal, set the global module-level flag\n`PRESERVE_WHITESPACE`:\n\n```python\nimport tabulate\ntabulate.PRESERVE_WHITESPACE = True\n```\n\n### Wide (fullwidth CJK) symbols\n\nTo properly align tables which contain wide characters (typically\nfullwidth glyphs from Chinese, Japanese or Korean languages), the user\nshould install `wcwidth` library. To install it together with\n`tabulate`:\n\n```shell\npip install tabulate[widechars]\n```\n\nWide character support is enabled automatically if `wcwidth` library is\nalready installed. To disable wide characters support without\nuninstalling `wcwidth`, set the global module-level flag\n`WIDE_CHARS_MODE`:\n\n```python\nimport tabulate\ntabulate.WIDE_CHARS_MODE = False\n```\n\n### Multiline cells\n\nMost table formats support multiline cell text (text containing newline\ncharacters). The newline characters are honored as line break\ncharacters.\n\nMultiline cells are supported for data rows and for header rows.\n\nFurther automatic line breaks are not inserted. Of course, some output\nformats such as latex or html handle automatic formatting of the cell\ncontent on their own, but for those that don't, the newline characters\nin the input cell text are the only means to break a line in cell text.\n\nNote that some output formats (e.g. simple, or plain) do not represent\nrow delimiters, so that the representation of multiline cells in such\nformats may be ambiguous to the reader.\n\nThe following examples of formatted output use the following table with\na multiline cell, and headers with a multiline cell:\n\n```pycon\n>>> table = [[\"eggs\",451],[\"more\\nspam\",42]]\n>>> headers = [\"item\\nname\", \"qty\"]\n```\n\n`plain` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"plain\"))\nitem qty\nname\neggs 451\nmore 42\nspam\n```\n\n`simple` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"simple\"))\nitem qty\nname\n------ -----\neggs 451\nmore 42\nspam\n```\n\n`grid` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"grid\"))\n+--------+-------+\n| item | qty |\n| name | |\n+========+=======+\n| eggs | 451 |\n+--------+-------+\n| more | 42 |\n| spam | |\n+--------+-------+\n```\n\n`fancy_grid` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"fancy_grid\"))\n╒════════╤═══════╕\n│ item │ qty │\n│ name │ │\n╞════════╪═══════╡\n│ eggs │ 451 │\n├────────┼───────┤\n│ more │ 42 │\n│ spam │ │\n╘════════╧═══════╛\n```\n\n`pipe` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"pipe\"))\n| item | qty |\n| name | |\n|:-------|------:|\n| eggs | 451 |\n| more | 42 |\n| spam | |\n```\n\n`orgtbl` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"orgtbl\"))\n| item | qty |\n| name | |\n|--------+-------|\n| eggs | 451 |\n| more | 42 |\n| spam | |\n```\n\n`jira` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"jira\"))\n| item | qty |\n| name | |\n|:-------|------:|\n| eggs | 451 |\n| more | 42 |\n| spam | |\n```\n\n`presto` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"presto\"))\n item | qty\n name |\n--------+-------\n eggs | 451\n more | 42\n spam |\n```\n\n`pretty` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"pretty\"))\n+------+-----+\n| item | qty |\n| name | |\n+------+-----+\n| eggs | 451 |\n| more | 42 |\n| spam | |\n+------+-----+\n```\n\n`psql` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"psql\"))\n+--------+-------+\n| item | qty |\n| name | |\n|--------+-------|\n| eggs | 451 |\n| more | 42 |\n| spam | |\n+--------+-------+\n```\n\n`rst` tables:\n\n```pycon\n>>> print(tabulate(table, headers, tablefmt=\"rst\"))\n====== =====\nitem qty\nname\n====== =====\neggs 451\nmore 42\nspam\n====== =====\n```\n\nMultiline cells are not well-supported for the other table formats.\n\n### Automating Multilines\nWhile tabulate supports data passed in with multilines entries explicitly provided,\nit also provides some support to help manage this work internally.\n\nThe `maxcolwidths` argument is a list where each entry specifies the max width for\nit's respective column. Any cell that will exceed this will automatically wrap the content.\nTo assign the same max width for all columns, a singular int scaler can be used.\n\nUse `None` for any columns where an explicit maximum does not need to be provided,\nand thus no automate multiline wrapping will take place.\n\nThe wrapping uses the python standard [textwrap.wrap](https://docs.python.org/3/library/textwrap.html#textwrap.wrap)\nfunction with default parameters - aside from width.\n\nThis example demonstrates usage of automatic multiline wrapping, though typically\nthe lines being wrapped would probably be significantly longer than this.\n\n```pycon\n>>> print(tabulate([[\"John Smith\", \"Middle Manager\"]], headers=[\"Name\", \"Title\"], tablefmt=\"grid\", maxcolwidths=[None, 8]))\n+------------+---------+\n| Name | Title |\n+============+=========+\n| John Smith | Middle |\n| | Manager |\n+------------+---------+\n```\n\n### Adding Separating lines\nOne might want to add one or more separating lines to highlight different sections in a table.\n\nThe separating lines will be of the same type as the one defined by the specified formatter as either the\nlinebetweenrows, linebelowheader, linebelow, lineabove or just a simple empty line when none is defined for the formatter\n\n\n >>> from tabulate import tabulate, SEPARATING_LINE\n\n table = [[\"Earth\",6371],\n [\"Mars\",3390],\n SEPARATING_LINE,\n [\"Moon\",1737]]\n print(tabulate(table, tablefmt=\"simple\"))\n ----- ----\n Earth 6371\n Mars 3390\n ----- ----\n Moon 1737\n ----- ----\n\n### ANSI support\nANSI escape codes are non-printable byte sequences usually used for terminal operations like setting\ncolor output or modifying cursor positions. Because multi-byte ANSI sequences are inherently non-printable,\nthey can still introduce unwanted extra length to strings. For example:\n\n >>> len('\\033[31mthis text is red\\033[0m') # printable length is 16\n 25\n\nTo deal with this, string lengths are calculated after first removing all ANSI escape sequences. This ensures\nthat the actual printable length is used for column widths, rather than the byte length. In the final, printable\ntable, however, ANSI escape sequences are not removed so the original styling is preserved.\n\nSome terminals support a special grouping of ANSI escape sequences that are intended to display hyperlinks\nmuch in the same way they are shown in browsers. These are handled just as mentioned before: non-printable\nANSI escape sequences are removed prior to string length calculation. The only diifference with escaped\nhyperlinks is that column width will be based on the length of the URL _text_ rather than the URL\nitself (terminals would show this text). For example:\n\n >>> len('\\x1b]8;;https://example.com\\x1b\\\\example\\x1b]8;;\\x1b\\\\') # display length is 7, showing 'example'\n 45\n\n\nUsage of the command line utility\n---------------------------------\n\n Usage: tabulate [options] [FILE ...]\n\n FILE a filename of the file with tabular data;\n if \"-\" or missing, read data from stdin.\n\n Options:\n\n -h, --help show this message\n -1, --header use the first row of data as a table header\n -o FILE, --output FILE print table to FILE (default: stdout)\n -s REGEXP, --sep REGEXP use a custom column separator (default: whitespace)\n -F FPFMT, --float FPFMT floating point number format (default: g)\n -I INTFMT, --int INTFMT integer point number format (default: \"\")\n -f FMT, --format FMT set output table format; supported formats:\n plain, simple, github, grid, fancy_grid, pipe,\n orgtbl, rst, mediawiki, html, latex, latex_raw,\n latex_booktabs, latex_longtable, tsv\n (default: simple)\n\nPerformance considerations\n--------------------------\n\nSuch features as decimal point alignment and trying to parse everything\nas a number imply that `tabulate`:\n\n- has to \"guess\" how to print a particular tabular data type\n- needs to keep the entire table in-memory\n- has to \"transpose\" the table twice\n- does much more work than it may appear\n\nIt may not be suitable for serializing really big tables (but who's\ngoing to do that, anyway?) or printing tables in performance sensitive\napplications. `tabulate` is about two orders of magnitude slower than\nsimply joining lists of values with a tab, comma, or other separator.\n\nAt the same time, `tabulate` is comparable to other table\npretty-printers. Given a 10x10 table (a list of lists) of mixed text and\nnumeric data, `tabulate` appears to be slower than `asciitable`, and\nfaster than `PrettyTable` and `texttable` The following mini-benchmark\nwas run in Python 3.9.13 on Windows 10:\n\n ================================= ========== ===========\n Table formatter time, μs rel. time\n ================================= ========== ===========\n csv to StringIO 12.5 1.0\n join with tabs and newlines 14.6 1.2\n asciitable (0.8.0) 192.0 15.4\n tabulate (0.9.0) 483.5 38.7\n tabulate (0.9.0, WIDE_CHARS_MODE) 637.6 51.1\n PrettyTable (3.4.1) 1080.6 86.6\n texttable (1.6.4) 1390.3 111.4\n ================================= ========== ===========\n\n\nVersion history\n---------------\n\nThe full version history can be found at the [changelog](https://github.com/astanin/python-tabulate/blob/master/CHANGELOG).\n\nHow to contribute\n-----------------\n\nContributions should include tests and an explanation for the changes\nthey propose. Documentation (examples, docstrings, README.md) should be\nupdated accordingly.\n\nThis project uses [pytest](https://docs.pytest.org/) testing\nframework and [tox](https://tox.readthedocs.io/) to automate testing in\ndifferent environments. Add tests to one of the files in the `test/`\nfolder.\n\nTo run tests on all supported Python versions, make sure all Python\ninterpreters, `pytest` and `tox` are installed, then run `tox` in the root\nof the project source tree.\n\nOn Linux `tox` expects to find executables like `python3.7`, `python3.8` etc.\nOn Windows it looks for `C:\\Python37\\python.exe`, `C:\\Python38\\python.exe` etc. respectively.\n\nOne way to install all the required versions of the Python interpreter is to use [pyenv](https://github.com/pyenv/pyenv).\nAll versions can then be easily installed with something like:\n\n pyenv install 3.7.12\n pyenv install 3.8.12\n ...\n\nDon't forget to change your `PATH` so that `tox` knows how to find all the installed versions. Something like\n\n export PATH=\"${PATH}:${HOME}/.pyenv/shims\"\n\nTo test only some Python environments, use `-e` option. For example, to\ntest only against Python 3.7 and Python 3.10, run:\n\n```shell\ntox -e py37,py310\n```\n\nin the root of the project source tree.\n\nTo enable NumPy and Pandas tests, run:\n\n```shell\ntox -e py37-extra,py310-extra\n```\n\n(this may take a long time the first time, because NumPy and Pandas will\nhave to be installed in the new virtual environments)\n\nTo fix code formatting:\n\n```shell\ntox -e lint\n```\n\nSee `tox.ini` file to learn how to use to test\nindividual Python versions.\n\nContributors\n------------\n\nSergey Astanin, Pau Tallada Crespí, Erwin Marsi, Mik Kocikowski, Bill\nRyder, Zach Dwiel, Frederik Rietdijk, Philipp Bogensberger, Greg\n(anonymous), Stefan Tatschner, Emiel van Miltenburg, Brandon Bennett,\nAmjith Ramanujam, Jan Schulz, Simon Percivall, Javier Santacruz\nLópez-Cepero, Sam Denton, Alexey Ziyangirov, acaird, Cesar Sanchez,\nnaught101, John Vandenberg, Zack Dever, Christian Clauss, Benjamin\nMaier, Andy MacKinlay, Thomas Roten, Jue Wang, Joe King, Samuel Phan,\nNick Satterly, Daniel Robbins, Dmitry B, Lars Butler, Andreas Maier,\nDick Marinus, Sébastien Celles, Yago González, Andrew Gaul, Wim Glenn,\nJean Michel Rouly, Tim Gates, John Vandenberg, Sorin Sbarnea,\nWes Turner, Andrew Tija, Marco Gorelli, Sean McGinnis, danja100,\nendolith, Dominic Davis-Foster, pavlocat, Daniel Aslau, paulc,\nFelix Yan, Shane Loretz, Frank Busse, Harsh Singh, Derek Weitzel,\nVladimir Vrzić, 서승우 (chrd5273), Georgy Frolov, Christian Cwienk,\nBart Broere, Vilhelm Prytz, Alexander Gažo, Hugo van Kemenade,\njamescooke, Matt Warner, Jérôme Provensal, Kevin Deldycke,\nKian-Meng Ang, Kevin Patterson, Shodhan Save, cleoold, KOLANICH,\nVijaya Krishna Kasula, Furcy Pin, Christian Fibich, Shaun Duncan,\nDimitri Papadopoulos.\n\n",
- "description_content_type": "text/markdown",
- "author_email": "Sergey Astanin <s.astanin@gmail.com>",
- "license": "MIT",
- "classifier": [
- "Development Status :: 4 - Beta",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Topic :: Software Development :: Libraries"
- ],
- "requires_dist": [
- "wcwidth ; extra == 'widechars'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Homepage, https://github.com/astanin/python-tabulate"
- ],
- "provides_extra": [
- "widechars"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/f4/f1/990741d5bb2487d529d20a433210ffa136a367751e454214013b441c4575/tenacity-8.2.3-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c",
- "hashes": {
- "sha256": "ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "tenacity",
- "version": "8.2.3",
- "summary": "Retry code until it succeeds",
- "description": "Tenacity is a general-purpose retrying library to simplify the task of adding retry behavior to just about anything.\n",
- "home_page": "https://github.com/jd/tenacity",
- "author": "Julien Danjou",
- "author_email": "julien@danjou.info",
- "license": "Apache 2.0",
- "classifier": [
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Apache Software License",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Topic :: Utilities"
- ],
- "requires_dist": [
- "reno ; extra == 'doc'",
- "sphinx ; extra == 'doc'",
- "tornado >=4.5 ; extra == 'doc'"
- ],
- "requires_python": ">=3.7",
- "provides_extra": [
- "doc"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/67/e1/434566ffce04448192369c1a282931cf4ae593e91907558eaecd2e9f2801/termcolor-2.3.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475",
- "hashes": {
- "sha256": "3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "termcolor",
- "version": "2.3.0",
- "summary": "ANSI color formatting for output in terminal",
- "description": "# termcolor\n\n[](https://pypi.org/project/termcolor)\n[](https://pypi.org/project/termcolor)\n[](https://pypistats.org/packages/termcolor)\n[](https://github.com/termcolor/termcolor/actions)\n[](https://codecov.io/gh/termcolor/termcolor)\n[](COPYING.txt)\n[](https://github.com/psf/black)\n[](https://tidelift.com/subscription/pkg/pypi-termcolor?utm_source=pypi-termcolor&utm_medium=referral&utm_campaign=readme)\n\n## Installation\n\n### From PyPI\n\n```bash\npython3 -m pip install --upgrade termcolor\n```\n\n### From source\n\n```bash\ngit clone https://github.com/termcolor/termcolor\ncd termcolor\npython3 -m pip install .\n```\n\n### Demo\n\nTo see demo output, run:\n\n```bash\npython3 -m termcolor\n```\n\n## Example\n\n```python\nimport sys\n\nfrom termcolor import colored, cprint\n\ntext = colored(\"Hello, World!\", \"red\", attrs=[\"reverse\", \"blink\"])\nprint(text)\ncprint(\"Hello, World!\", \"green\", \"on_red\")\n\nprint_red_on_cyan = lambda x: cprint(x, \"red\", \"on_cyan\")\nprint_red_on_cyan(\"Hello, World!\")\nprint_red_on_cyan(\"Hello, Universe!\")\n\nfor i in range(10):\n cprint(i, \"magenta\", end=\" \")\n\ncprint(\"Attention!\", \"red\", attrs=[\"bold\"], file=sys.stderr)\n```\n\n## Text properties\n\n| Text colors | Text highlights | Attributes |\n| --------------- | ------------------ | ----------- |\n| `black` | `on_black` | `bold` |\n| `red` | `on_red` | `dark` |\n| `green` | `on_green` | `underline` |\n| `yellow` | `on_yellow` | `blink` |\n| `blue` | `on_blue` | `reverse` |\n| `magenta` | `on_magenta` | `concealed` |\n| `cyan` | `on_cyan` | |\n| `white` | `on_white` | |\n| `light_grey` | `on_light_grey` | |\n| `dark_grey` | `on_dark_grey` | |\n| `light_red` | `on_light_red` | |\n| `light_green` | `on_light_green` | |\n| `light_yellow` | `on_light_yellow` | |\n| `light_blue` | `on_light_blue` | |\n| `light_magenta` | `on_light_magenta` | |\n| `light_cyan` | `on_light_cyan` | |\n\n## Terminal properties\n\n| Terminal | bold | dark | underline | blink | reverse | concealed |\n| ------------ | ------- | ---- | --------- | ---------- | ------- | --------- |\n| xterm | yes | no | yes | bold | yes | yes |\n| linux | yes | yes | bold | yes | yes | no |\n| rxvt | yes | no | yes | bold/black | yes | no |\n| dtterm | yes | yes | yes | reverse | yes | yes |\n| teraterm | reverse | no | yes | rev/red | yes | no |\n| aixterm | normal | no | yes | no | yes | yes |\n| PuTTY | color | no | yes | no | yes | no |\n| Windows | no | no | no | no | yes | no |\n| Cygwin SSH | yes | no | color | color | color | yes |\n| Mac Terminal | yes | no | yes | yes | yes | yes |\n",
- "description_content_type": "text/markdown",
- "keywords": [
- "ANSI",
- "ANSI color",
- "ANSI colour",
- "color",
- "colour",
- "formatting",
- "termcolor",
- "terminal"
- ],
- "author_email": "Konstantin Lepa <konstantin.lepa@gmail.com>",
- "maintainer": "Hugo van Kemenade",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Console",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Terminals"
- ],
- "requires_dist": [
- "pytest; extra == 'tests'",
- "pytest-cov; extra == 'tests'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Changelog, https://github.com/termcolor/termcolor/releases",
- "Homepage, https://github.com/termcolor/termcolor",
- "Source, https://github.com/termcolor/termcolor"
- ],
- "provides_extra": [
- "tests"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8",
- "hashes": {
- "sha256": "1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.0",
- "name": "text-unidecode",
- "version": "1.3",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "The most basic Text::Unidecode port",
- "description": "Text-Unidecode\n==============\n\n.. image:: https://travis-ci.org/kmike/text-unidecode.svg?branch=master\n :target: https://travis-ci.org/kmike/text-unidecode\n :alt: Build Status\n\ntext-unidecode is the most basic port of the\n`Text::Unidecode <http://search.cpan.org/~sburke/Text-Unidecode-0.04/lib/Text/Unidecode.pm>`_\nPerl library.\n\nThere are other Python ports of Text::Unidecode (unidecode_\nand isounidecode_). unidecode_ is GPL; isounidecode_ uses too much memory,\nand it didn't support Python 3 when this package was created.\n\nYou can redistribute it and/or modify this port under the terms of either:\n\n* `Artistic License`_, or\n* GPL or GPLv2+\n\nIf you're OK with GPL-only, use unidecode_ (it has better memory usage and\nbetter transliteration quality).\n\n``text-unidecode`` supports Python 2.7 and 3.4+.\n\n.. _unidecode: https://pypi.python.org/pypi/Unidecode/\n.. _isounidecode: https://pypi.python.org/pypi/isounidecode/\n.. _Artistic License: https://opensource.org/licenses/Artistic-Perl-1.0\n\nInstallation\n------------\n\n::\n\n pip install text-unidecode\n\nUsage\n-----\n\n::\n\n >>> from text_unidecode import unidecode\n >>> unidecode(u'какой-то текст')\n 'kakoi-to tekst'\n\n\n",
- "home_page": "https://github.com/kmike/text-unidecode/",
- "author": "Mikhail Korobov",
- "author_email": "kmike84@gmail.com",
- "license": "Artistic License",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Artistic License",
- "License :: OSI Approved :: GNU General Public License (GPL)",
- "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)",
- "Programming Language :: Python",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.4",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "Topic :: Text Processing :: Linguistic"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/24/21/7d397a4b7934ff4028987914ac1044d3b7d52712f30e2ac7a2ae5bc86dd0/typing_extensions-4.8.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0",
- "hashes": {
- "sha256": "8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "typing_extensions",
- "version": "4.8.0",
- "summary": "Backported and Experimental Type Hints for Python 3.8+",
- "description": "# Typing Extensions\n\n[](https://gitter.im/python/typing)\n\n[Documentation](https://typing-extensions.readthedocs.io/en/latest/#) –\n[PyPI](https://pypi.org/project/typing-extensions/)\n\n## Overview\n\nThe `typing_extensions` module serves two related purposes:\n\n- Enable use of new type system features on older Python versions. For example,\n `typing.TypeGuard` is new in Python 3.10, but `typing_extensions` allows\n users on previous Python versions to use it too.\n- Enable experimentation with new type system PEPs before they are accepted and\n added to the `typing` module.\n\n`typing_extensions` is treated specially by static type checkers such as\nmypy and pyright. Objects defined in `typing_extensions` are treated the same\nway as equivalent forms in `typing`.\n\n`typing_extensions` uses\n[Semantic Versioning](https://semver.org/). The\nmajor version will be incremented only for backwards-incompatible changes.\nTherefore, it's safe to depend\non `typing_extensions` like this: `typing_extensions >=x.y, <(x+1)`,\nwhere `x.y` is the first version that includes all features you need.\n\n## Included items\n\nSee [the documentation](https://typing-extensions.readthedocs.io/en/latest/#) for a\ncomplete listing of module contents.\n\n## Contributing\n\nSee [CONTRIBUTING.md](https://github.com/python/typing_extensions/blob/main/CONTRIBUTING.md)\nfor how to contribute to `typing_extensions`.\n\n",
- "description_content_type": "text/markdown",
- "keywords": [
- "annotations",
- "backport",
- "checker",
- "checking",
- "function",
- "hinting",
- "hints",
- "type",
- "typechecking",
- "typehinting",
- "typehints",
- "typing"
- ],
- "author_email": "\"Guido van Rossum, Jukka Lehtosalo, Łukasz Langa, Michael Lee\" <levkivskyi@gmail.com>",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Console",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: Python Software Foundation License",
- "Operating System :: OS Independent",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: 3.12",
- "Topic :: Software Development"
- ],
- "requires_python": ">=3.8",
- "project_url": [
- "Bug Tracker, https://github.com/python/typing_extensions/issues",
- "Changes, https://github.com/python/typing_extensions/blob/main/CHANGELOG.md",
- "Documentation, https://typing-extensions.readthedocs.io/",
- "Home, https://github.com/python/typing_extensions",
- "Q & A, https://github.com/python/typing/discussions",
- "Repository, https://github.com/python/typing_extensions"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/d1/1c/5aeb94aa980da111e4fd0c0fbe5ad95ed5bf9bd957f8e2a6178b85ff4da8/uc_micro_py-1.0.2-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=8c9110c309db9d9e87302e2f4ad2c3152770930d88ab385cd544e7a7e75f3de0",
- "hashes": {
- "sha256": "8c9110c309db9d9e87302e2f4ad2c3152770930d88ab385cd544e7a7e75f3de0"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "uc-micro-py",
- "version": "1.0.2",
- "summary": "Micro subset of unicode data files for linkify-it-py projects.",
- "description": "# uc.micro-py\n\n[](https://pypi.org/project/uc-micro-py/)\n[](https://anaconda.org/conda-forge/uc-micro-py)\n[](https://github.com/tsutsu3/uc.micro-py/actions)\n[](https://codecov.io/gh/tsutsu3/uc.micro-py)\n\nThis is a Python port of [uc.micro](https://github.com/markdown-it/uc.micro).\n\n> Micro subset of unicode data files for [linkify-it-py](https://github.com/tsutsu3/linkify-it-py) projects.\n\n**This package content is ONLY for [linkify-it-py](https://github.com/tsutsu3/linkify-it-py)projects needs.**\n\n## install\n\n```bash\npip install uc-micro-py\n```\n\nor\n\n```bash\nconda install -c conda-forge uc-micro-py\n```\n",
- "description_content_type": "text/markdown",
- "keywords": [
- "unicode"
- ],
- "author": "tsutsu3",
- "license": "MIT",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Intended Audience :: Developers",
- "Topic :: Software Development :: Libraries :: Python Modules"
- ],
- "requires_dist": [
- "pytest ; extra == 'test'",
- "coverage ; extra == 'test'",
- "pytest-cov ; extra == 'test'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Homepage, https://github.com/tsutsu3/uc.micro-py"
- ],
- "provides_extra": [
- "test"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/6f/a4/691ab63b17505a26096608cc309960b5a6bdf39e4ba1a793d5f9b1a53270/unicodecsv-0.14.1.tar.gz",
- "archive_info": {
- "hash": "sha256=018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc",
- "hashes": {
- "sha256": "018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "unicodecsv",
- "version": "0.14.1",
- "summary": "Python2's stdlib csv module is nice, but it doesn't support unicode. This module is a drop-in replacement which *does*.",
- "description": "unicodecsv\n==========\n\nThe unicodecsv is a drop-in replacement for Python 2.7's csv module which supports unicode strings without a hassle. Supported versions are python 2.7, 3.3, 3.4, 3.5, and pypy 2.4.0.\n\nMore fully\n----------\n\nPython 2's csv module doesn't easily deal with unicode strings, leading to the dreaded \"'ascii' codec can't encode characters in position ...\" exception.\n\nYou can work around it by encoding everything just before calling write (or just after read), but why not add support to the serializer?\n\n.. code-block:: pycon\n\n >>> import unicodecsv as csv\n >>> from io import BytesIO\n >>> f = BytesIO()\n >>> w = csv.writer(f, encoding='utf-8')\n >>> _ = w.writerow((u'é', u'ñ'))\n >>> _ = f.seek(0)\n >>> r = csv.reader(f, encoding='utf-8')\n >>> next(r) == [u'é', u'ñ']\n True\n\nNote that unicodecsv expects a bytestream, not unicode -- so there's no need to use `codecs.open` or similar wrappers. Plain `open(..., 'rb')` will do.\n\n(Version 0.14.0 dropped support for python 2.6, but 0.14.1 added it back. See c0b7655248c4249 for the mistaken, breaking change.)\n",
- "home_page": "https://github.com/jdunck/python-unicodecsv",
- "author": "Jeremy Dunck",
- "author_email": "jdunck@gmail.com",
- "license": "BSD License",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Natural Language :: English",
- "Programming Language :: Python :: 2.6",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3.3",
- "Programming Language :: Python :: 3.4",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Programming Language :: Python :: Implementation :: CPython"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/b0/53/aa91e163dcfd1e5b82d8a890ecf13314e3e149c05270cc644581f77f17fd/urllib3-1.26.18-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07",
- "hashes": {
- "sha256": "34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "urllib3",
- "version": "1.26.18",
- "summary": "HTTP library with thread-safe connection pooling, file post, and more.",
- "description": "\nurllib3 is a powerful, *user-friendly* HTTP client for Python. Much of the\nPython ecosystem already uses urllib3 and you should too.\nurllib3 brings many critical features that are missing from the Python\nstandard libraries:\n\n- Thread safety.\n- Connection pooling.\n- Client-side SSL/TLS verification.\n- File uploads with multipart encoding.\n- Helpers for retrying requests and dealing with HTTP redirects.\n- Support for gzip, deflate, and brotli encoding.\n- Proxy support for HTTP and SOCKS.\n- 100% test coverage.\n\nurllib3 is powerful and easy to use:\n\n.. code-block:: python\n\n >>> import urllib3\n >>> http = urllib3.PoolManager()\n >>> r = http.request('GET', 'http://httpbin.org/robots.txt')\n >>> r.status\n 200\n >>> r.data\n 'User-agent: *\\nDisallow: /deny\\n'\n\n\nInstalling\n----------\n\nurllib3 can be installed with `pip <https://pip.pypa.io>`_::\n\n $ python -m pip install urllib3\n\nAlternatively, you can grab the latest source code from `GitHub <https://github.com/urllib3/urllib3>`_::\n\n $ git clone https://github.com/urllib3/urllib3.git\n $ cd urllib3\n $ git checkout 1.26.x\n $ pip install .\n\n\nDocumentation\n-------------\n\nurllib3 has usage and reference documentation at `urllib3.readthedocs.io <https://urllib3.readthedocs.io>`_.\n\n\nContributing\n------------\n\nurllib3 happily accepts contributions. Please see our\n`contributing documentation <https://urllib3.readthedocs.io/en/latest/contributing.html>`_\nfor some tips on getting started.\n\n\nSecurity Disclosures\n--------------------\n\nTo report a security vulnerability, please use the\n`Tidelift security contact <https://tidelift.com/security>`_.\nTidelift will coordinate the fix and disclosure with maintainers.\n\n\nMaintainers\n-----------\n\n- `@sethmlarson <https://github.com/sethmlarson>`__ (Seth M. Larson)\n- `@pquentin <https://github.com/pquentin>`__ (Quentin Pradet)\n- `@theacodes <https://github.com/theacodes>`__ (Thea Flowers)\n- `@haikuginger <https://github.com/haikuginger>`__ (Jess Shapiro)\n- `@lukasa <https://github.com/lukasa>`__ (Cory Benfield)\n- `@sigmavirus24 <https://github.com/sigmavirus24>`__ (Ian Stapleton Cordasco)\n- `@shazow <https://github.com/shazow>`__ (Andrey Petrov)\n\n👋\n\n\nSponsorship\n-----------\n\nIf your company benefits from this library, please consider `sponsoring its\ndevelopment <https://urllib3.readthedocs.io/en/latest/sponsors.html>`_.\n\n\nFor Enterprise\n--------------\n\n.. |tideliftlogo| image:: https://nedbatchelder.com/pix/Tidelift_Logos_RGB_Tidelift_Shorthand_On-White_small.png\n :width: 75\n :alt: Tidelift\n\n.. list-table::\n :widths: 10 100\n\n * - |tideliftlogo|\n - Professional support for urllib3 is available as part of the `Tidelift\n Subscription`_. Tidelift gives software development teams a single source for\n purchasing and maintaining their software, with professional grade assurances\n from the experts who know it best, while seamlessly integrating with existing\n tools.\n\n.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=readme\n\n\nChanges\n=======\n\n1.26.18 (2023-10-17)\n--------------------\n\n* Made body stripped from HTTP requests changing the request method to GET after HTTP 303 \"See Other\" redirect responses.\n\n\n1.26.17 (2023-10-02)\n--------------------\n\n* Added the ``Cookie`` header to the list of headers to strip from requests when redirecting to a different host. As before, different headers can be set via ``Retry.remove_headers_on_redirect``.\n\n\n1.26.16 (2023-05-23)\n--------------------\n\n* Fixed thread-safety issue where accessing a ``PoolManager`` with many distinct origins\n would cause connection pools to be closed while requests are in progress (`#2954 <https://github.com/urllib3/urllib3/pull/2954>`_)\n\n\n1.26.15 (2023-03-10)\n--------------------\n\n* Fix socket timeout value when ``HTTPConnection`` is reused (`#2645 <https://github.com/urllib3/urllib3/issues/2645>`__)\n* Remove \"!\" character from the unreserved characters in IPv6 Zone ID parsing\n (`#2899 <https://github.com/urllib3/urllib3/issues/2899>`__)\n* Fix IDNA handling of '\\x80' byte (`#2901 <https://github.com/urllib3/urllib3/issues/2901>`__)\n\n1.26.14 (2023-01-11)\n--------------------\n\n* Fixed parsing of port 0 (zero) returning None, instead of 0. (`#2850 <https://github.com/urllib3/urllib3/issues/2850>`__)\n* Removed deprecated getheaders() calls in contrib module.\n\n1.26.13 (2022-11-23)\n--------------------\n\n* Deprecated the ``HTTPResponse.getheaders()`` and ``HTTPResponse.getheader()`` methods.\n* Fixed an issue where parsing a URL with leading zeroes in the port would be rejected\n even when the port number after removing the zeroes was valid.\n* Fixed a deprecation warning when using cryptography v39.0.0.\n* Removed the ``<4`` in the ``Requires-Python`` packaging metadata field.\n\n\n1.26.12 (2022-08-22)\n--------------------\n\n* Deprecated the `urllib3[secure]` extra and the `urllib3.contrib.pyopenssl` module.\n Both will be removed in v2.x. See this `GitHub issue <https://github.com/urllib3/urllib3/issues/2680>`_\n for justification and info on how to migrate.\n\n\n1.26.11 (2022-07-25)\n--------------------\n\n* Fixed an issue where reading more than 2 GiB in a call to ``HTTPResponse.read`` would\n raise an ``OverflowError`` on Python 3.9 and earlier.\n\n\n1.26.10 (2022-07-07)\n--------------------\n\n* Removed support for Python 3.5\n* Fixed an issue where a ``ProxyError`` recommending configuring the proxy as HTTP\n instead of HTTPS could appear even when an HTTPS proxy wasn't configured.\n\n\n1.26.9 (2022-03-16)\n-------------------\n\n* Changed ``urllib3[brotli]`` extra to favor installing Brotli libraries that are still\n receiving updates like ``brotli`` and ``brotlicffi`` instead of ``brotlipy``.\n This change does not impact behavior of urllib3, only which dependencies are installed.\n* Fixed a socket leaking when ``HTTPSConnection.connect()`` raises an exception.\n* Fixed ``server_hostname`` being forwarded from ``PoolManager`` to ``HTTPConnectionPool``\n when requesting an HTTP URL. Should only be forwarded when requesting an HTTPS URL.\n\n\n1.26.8 (2022-01-07)\n-------------------\n\n* Added extra message to ``urllib3.exceptions.ProxyError`` when urllib3 detects that\n a proxy is configured to use HTTPS but the proxy itself appears to only use HTTP.\n* Added a mention of the size of the connection pool when discarding a connection due to the pool being full.\n* Added explicit support for Python 3.11.\n* Deprecated the ``Retry.MAX_BACKOFF`` class property in favor of ``Retry.DEFAULT_MAX_BACKOFF``\n to better match the rest of the default parameter names. ``Retry.MAX_BACKOFF`` is removed in v2.0.\n* Changed location of the vendored ``ssl.match_hostname`` function from ``urllib3.packages.ssl_match_hostname``\n to ``urllib3.util.ssl_match_hostname`` to ensure Python 3.10+ compatibility after being repackaged\n by downstream distributors.\n* Fixed absolute imports, all imports are now relative.\n\n\n1.26.7 (2021-09-22)\n-------------------\n\n* Fixed a bug with HTTPS hostname verification involving IP addresses and lack\n of SNI. (Issue #2400)\n* Fixed a bug where IPv6 braces weren't stripped during certificate hostname\n matching. (Issue #2240)\n\n\n1.26.6 (2021-06-25)\n-------------------\n\n* Deprecated the ``urllib3.contrib.ntlmpool`` module. urllib3 is not able to support\n it properly due to `reasons listed in this issue <https://github.com/urllib3/urllib3/issues/2282>`_.\n If you are a user of this module please leave a comment.\n* Changed ``HTTPConnection.request_chunked()`` to not erroneously emit multiple\n ``Transfer-Encoding`` headers in the case that one is already specified.\n* Fixed typo in deprecation message to recommend ``Retry.DEFAULT_ALLOWED_METHODS``.\n\n\n1.26.5 (2021-05-26)\n-------------------\n\n* Fixed deprecation warnings emitted in Python 3.10.\n* Updated vendored ``six`` library to 1.16.0.\n* Improved performance of URL parser when splitting\n the authority component.\n\n\n1.26.4 (2021-03-15)\n-------------------\n\n* Changed behavior of the default ``SSLContext`` when connecting to HTTPS proxy\n during HTTPS requests. The default ``SSLContext`` now sets ``check_hostname=True``.\n\n\n1.26.3 (2021-01-26)\n-------------------\n\n* Fixed bytes and string comparison issue with headers (Pull #2141)\n\n* Changed ``ProxySchemeUnknown`` error message to be\n more actionable if the user supplies a proxy URL without\n a scheme. (Pull #2107)\n\n\n1.26.2 (2020-11-12)\n-------------------\n\n* Fixed an issue where ``wrap_socket`` and ``CERT_REQUIRED`` wouldn't\n be imported properly on Python 2.7.8 and earlier (Pull #2052)\n\n\n1.26.1 (2020-11-11)\n-------------------\n\n* Fixed an issue where two ``User-Agent`` headers would be sent if a\n ``User-Agent`` header key is passed as ``bytes`` (Pull #2047)\n\n\n1.26.0 (2020-11-10)\n-------------------\n\n* **NOTE: urllib3 v2.0 will drop support for Python 2**.\n `Read more in the v2.0 Roadmap <https://urllib3.readthedocs.io/en/latest/v2-roadmap.html>`_.\n\n* Added support for HTTPS proxies contacting HTTPS servers (Pull #1923, Pull #1806)\n\n* Deprecated negotiating TLSv1 and TLSv1.1 by default. Users that\n still wish to use TLS earlier than 1.2 without a deprecation warning\n should opt-in explicitly by setting ``ssl_version=ssl.PROTOCOL_TLSv1_1`` (Pull #2002)\n **Starting in urllib3 v2.0: Connections that receive a ``DeprecationWarning`` will fail**\n\n* Deprecated ``Retry`` options ``Retry.DEFAULT_METHOD_WHITELIST``, ``Retry.DEFAULT_REDIRECT_HEADERS_BLACKLIST``\n and ``Retry(method_whitelist=...)`` in favor of ``Retry.DEFAULT_ALLOWED_METHODS``,\n ``Retry.DEFAULT_REMOVE_HEADERS_ON_REDIRECT``, and ``Retry(allowed_methods=...)``\n (Pull #2000) **Starting in urllib3 v2.0: Deprecated options will be removed**\n\n* Added default ``User-Agent`` header to every request (Pull #1750)\n\n* Added ``urllib3.util.SKIP_HEADER`` for skipping ``User-Agent``, ``Accept-Encoding``, \n and ``Host`` headers from being automatically emitted with requests (Pull #2018)\n\n* Collapse ``transfer-encoding: chunked`` request data and framing into\n the same ``socket.send()`` call (Pull #1906)\n\n* Send ``http/1.1`` ALPN identifier with every TLS handshake by default (Pull #1894)\n\n* Properly terminate SecureTransport connections when CA verification fails (Pull #1977)\n\n* Don't emit an ``SNIMissingWarning`` when passing ``server_hostname=None``\n to SecureTransport (Pull #1903)\n\n* Disabled requesting TLSv1.2 session tickets as they weren't being used by urllib3 (Pull #1970)\n\n* Suppress ``BrokenPipeError`` when writing request body after the server\n has closed the socket (Pull #1524)\n\n* Wrap ``ssl.SSLError`` that can be raised from reading a socket (e.g. \"bad MAC\")\n into an ``urllib3.exceptions.SSLError`` (Pull #1939)\n\n\n1.25.11 (2020-10-19)\n--------------------\n\n* Fix retry backoff time parsed from ``Retry-After`` header when given\n in the HTTP date format. The HTTP date was parsed as the local timezone\n rather than accounting for the timezone in the HTTP date (typically\n UTC) (Pull #1932, Pull #1935, Pull #1938, Pull #1949)\n\n* Fix issue where an error would be raised when the ``SSLKEYLOGFILE``\n environment variable was set to the empty string. Now ``SSLContext.keylog_file``\n is not set in this situation (Pull #2016)\n\n\n1.25.10 (2020-07-22)\n--------------------\n\n* Added support for ``SSLKEYLOGFILE`` environment variable for\n logging TLS session keys with use with programs like\n Wireshark for decrypting captured web traffic (Pull #1867)\n\n* Fixed loading of SecureTransport libraries on macOS Big Sur\n due to the new dynamic linker cache (Pull #1905)\n\n* Collapse chunked request bodies data and framing into one\n call to ``send()`` to reduce the number of TCP packets by 2-4x (Pull #1906)\n\n* Don't insert ``None`` into ``ConnectionPool`` if the pool\n was empty when requesting a connection (Pull #1866)\n\n* Avoid ``hasattr`` call in ``BrotliDecoder.decompress()`` (Pull #1858)\n\n\n1.25.9 (2020-04-16)\n-------------------\n\n* Added ``InvalidProxyConfigurationWarning`` which is raised when\n erroneously specifying an HTTPS proxy URL. urllib3 doesn't currently\n support connecting to HTTPS proxies but will soon be able to\n and we would like users to migrate properly without much breakage.\n\n See `this GitHub issue <https://github.com/urllib3/urllib3/issues/1850>`_\n for more information on how to fix your proxy config. (Pull #1851)\n\n* Drain connection after ``PoolManager`` redirect (Pull #1817)\n\n* Ensure ``load_verify_locations`` raises ``SSLError`` for all backends (Pull #1812)\n\n* Rename ``VerifiedHTTPSConnection`` to ``HTTPSConnection`` (Pull #1805)\n\n* Allow the CA certificate data to be passed as a string (Pull #1804)\n\n* Raise ``ValueError`` if method contains control characters (Pull #1800)\n\n* Add ``__repr__`` to ``Timeout`` (Pull #1795)\n\n\n1.25.8 (2020-01-20)\n-------------------\n\n* Drop support for EOL Python 3.4 (Pull #1774)\n\n* Optimize _encode_invalid_chars (Pull #1787)\n\n\n1.25.7 (2019-11-11)\n-------------------\n\n* Preserve ``chunked`` parameter on retries (Pull #1715, Pull #1734)\n\n* Allow unset ``SERVER_SOFTWARE`` in App Engine (Pull #1704, Issue #1470)\n\n* Fix issue where URL fragment was sent within the request target. (Pull #1732)\n\n* Fix issue where an empty query section in a URL would fail to parse. (Pull #1732)\n\n* Remove TLS 1.3 support in SecureTransport due to Apple removing support (Pull #1703)\n\n\n1.25.6 (2019-09-24)\n-------------------\n\n* Fix issue where tilde (``~``) characters were incorrectly\n percent-encoded in the path. (Pull #1692)\n\n\n1.25.5 (2019-09-19)\n-------------------\n\n* Add mitigation for BPO-37428 affecting Python <3.7.4 and OpenSSL 1.1.1+ which\n caused certificate verification to be enabled when using ``cert_reqs=CERT_NONE``.\n (Issue #1682)\n\n\n1.25.4 (2019-09-19)\n-------------------\n\n* Propagate Retry-After header settings to subsequent retries. (Pull #1607)\n\n* Fix edge case where Retry-After header was still respected even when\n explicitly opted out of. (Pull #1607)\n\n* Remove dependency on ``rfc3986`` for URL parsing.\n\n* Fix issue where URLs containing invalid characters within ``Url.auth`` would\n raise an exception instead of percent-encoding those characters.\n\n* Add support for ``HTTPResponse.auto_close = False`` which makes HTTP responses\n work well with BufferedReaders and other ``io`` module features. (Pull #1652)\n\n* Percent-encode invalid characters in URL for ``HTTPConnectionPool.request()`` (Pull #1673)\n\n\n1.25.3 (2019-05-23)\n-------------------\n\n* Change ``HTTPSConnection`` to load system CA certificates\n when ``ca_certs``, ``ca_cert_dir``, and ``ssl_context`` are\n unspecified. (Pull #1608, Issue #1603)\n\n* Upgrade bundled rfc3986 to v1.3.2. (Pull #1609, Issue #1605)\n\n\n1.25.2 (2019-04-28)\n-------------------\n\n* Change ``is_ipaddress`` to not detect IPvFuture addresses. (Pull #1583)\n\n* Change ``parse_url`` to percent-encode invalid characters within the\n path, query, and target components. (Pull #1586)\n\n\n1.25.1 (2019-04-24)\n-------------------\n\n* Add support for Google's ``Brotli`` package. (Pull #1572, Pull #1579)\n\n* Upgrade bundled rfc3986 to v1.3.1 (Pull #1578)\n\n\n1.25 (2019-04-22)\n-----------------\n\n* Require and validate certificates by default when using HTTPS (Pull #1507)\n\n* Upgraded ``urllib3.utils.parse_url()`` to be RFC 3986 compliant. (Pull #1487)\n\n* Added support for ``key_password`` for ``HTTPSConnectionPool`` to use\n encrypted ``key_file`` without creating your own ``SSLContext`` object. (Pull #1489)\n\n* Add TLSv1.3 support to CPython, pyOpenSSL, and SecureTransport ``SSLContext``\n implementations. (Pull #1496)\n\n* Switched the default multipart header encoder from RFC 2231 to HTML 5 working draft. (Issue #303, Pull #1492)\n\n* Fixed issue where OpenSSL would block if an encrypted client private key was\n given and no password was given. Instead an ``SSLError`` is raised. (Pull #1489)\n\n* Added support for Brotli content encoding. It is enabled automatically if\n ``brotlipy`` package is installed which can be requested with\n ``urllib3[brotli]`` extra. (Pull #1532)\n\n* Drop ciphers using DSS key exchange from default TLS cipher suites.\n Improve default ciphers when using SecureTransport. (Pull #1496)\n\n* Implemented a more efficient ``HTTPResponse.__iter__()`` method. (Issue #1483)\n\n1.24.3 (2019-05-01)\n-------------------\n\n* Apply fix for CVE-2019-9740. (Pull #1591)\n\n1.24.2 (2019-04-17)\n-------------------\n\n* Don't load system certificates by default when any other ``ca_certs``, ``ca_certs_dir`` or\n ``ssl_context`` parameters are specified.\n\n* Remove Authorization header regardless of case when redirecting to cross-site. (Issue #1510)\n\n* Add support for IPv6 addresses in subjectAltName section of certificates. (Issue #1269)\n\n\n1.24.1 (2018-11-02)\n-------------------\n\n* Remove quadratic behavior within ``GzipDecoder.decompress()`` (Issue #1467)\n\n* Restored functionality of ``ciphers`` parameter for ``create_urllib3_context()``. (Issue #1462)\n\n\n1.24 (2018-10-16)\n-----------------\n\n* Allow key_server_hostname to be specified when initializing a PoolManager to allow custom SNI to be overridden. (Pull #1449)\n\n* Test against Python 3.7 on AppVeyor. (Pull #1453)\n\n* Early-out ipv6 checks when running on App Engine. (Pull #1450)\n\n* Change ambiguous description of backoff_factor (Pull #1436)\n\n* Add ability to handle multiple Content-Encodings (Issue #1441 and Pull #1442)\n\n* Skip DNS names that can't be idna-decoded when using pyOpenSSL (Issue #1405).\n\n* Add a server_hostname parameter to HTTPSConnection which allows for\n overriding the SNI hostname sent in the handshake. (Pull #1397)\n\n* Drop support for EOL Python 2.6 (Pull #1429 and Pull #1430)\n\n* Fixed bug where responses with header Content-Type: message/* erroneously\n raised HeaderParsingError, resulting in a warning being logged. (Pull #1439)\n\n* Move urllib3 to src/urllib3 (Pull #1409)\n\n\n1.23 (2018-06-04)\n-----------------\n\n* Allow providing a list of headers to strip from requests when redirecting\n to a different host. Defaults to the ``Authorization`` header. Different\n headers can be set via ``Retry.remove_headers_on_redirect``. (Issue #1316)\n\n* Fix ``util.selectors._fileobj_to_fd`` to accept ``long`` (Issue #1247).\n\n* Dropped Python 3.3 support. (Pull #1242)\n\n* Put the connection back in the pool when calling stream() or read_chunked() on\n a chunked HEAD response. (Issue #1234)\n\n* Fixed pyOpenSSL-specific ssl client authentication issue when clients\n attempted to auth via certificate + chain (Issue #1060)\n\n* Add the port to the connectionpool connect print (Pull #1251)\n\n* Don't use the ``uuid`` module to create multipart data boundaries. (Pull #1380)\n\n* ``read_chunked()`` on a closed response returns no chunks. (Issue #1088)\n\n* Add Python 2.6 support to ``contrib.securetransport`` (Pull #1359)\n\n* Added support for auth info in url for SOCKS proxy (Pull #1363)\n\n\n1.22 (2017-07-20)\n-----------------\n\n* Fixed missing brackets in ``HTTP CONNECT`` when connecting to IPv6 address via\n IPv6 proxy. (Issue #1222)\n\n* Made the connection pool retry on ``SSLError``. The original ``SSLError``\n is available on ``MaxRetryError.reason``. (Issue #1112)\n\n* Drain and release connection before recursing on retry/redirect. Fixes\n deadlocks with a blocking connectionpool. (Issue #1167)\n\n* Fixed compatibility for cookiejar. (Issue #1229)\n\n* pyopenssl: Use vendored version of ``six``. (Issue #1231)\n\n\n1.21.1 (2017-05-02)\n-------------------\n\n* Fixed SecureTransport issue that would cause long delays in response body\n delivery. (Pull #1154)\n\n* Fixed regression in 1.21 that threw exceptions when users passed the\n ``socket_options`` flag to the ``PoolManager``. (Issue #1165)\n\n* Fixed regression in 1.21 that threw exceptions when users passed the\n ``assert_hostname`` or ``assert_fingerprint`` flag to the ``PoolManager``.\n (Pull #1157)\n\n\n1.21 (2017-04-25)\n-----------------\n\n* Improved performance of certain selector system calls on Python 3.5 and\n later. (Pull #1095)\n\n* Resolved issue where the PyOpenSSL backend would not wrap SysCallError\n exceptions appropriately when sending data. (Pull #1125)\n\n* Selectors now detects a monkey-patched select module after import for modules\n that patch the select module like eventlet, greenlet. (Pull #1128)\n\n* Reduced memory consumption when streaming zlib-compressed responses\n (as opposed to raw deflate streams). (Pull #1129)\n\n* Connection pools now use the entire request context when constructing the\n pool key. (Pull #1016)\n\n* ``PoolManager.connection_from_*`` methods now accept a new keyword argument,\n ``pool_kwargs``, which are merged with the existing ``connection_pool_kw``.\n (Pull #1016)\n\n* Add retry counter for ``status_forcelist``. (Issue #1147)\n\n* Added ``contrib`` module for using SecureTransport on macOS:\n ``urllib3.contrib.securetransport``. (Pull #1122)\n\n* urllib3 now only normalizes the case of ``http://`` and ``https://`` schemes:\n for schemes it does not recognise, it assumes they are case-sensitive and\n leaves them unchanged.\n (Issue #1080)\n\n\n1.20 (2017-01-19)\n-----------------\n\n* Added support for waiting for I/O using selectors other than select,\n improving urllib3's behaviour with large numbers of concurrent connections.\n (Pull #1001)\n\n* Updated the date for the system clock check. (Issue #1005)\n\n* ConnectionPools now correctly consider hostnames to be case-insensitive.\n (Issue #1032)\n\n* Outdated versions of PyOpenSSL now cause the PyOpenSSL contrib module\n to fail when it is injected, rather than at first use. (Pull #1063)\n\n* Outdated versions of cryptography now cause the PyOpenSSL contrib module\n to fail when it is injected, rather than at first use. (Issue #1044)\n\n* Automatically attempt to rewind a file-like body object when a request is\n retried or redirected. (Pull #1039)\n\n* Fix some bugs that occur when modules incautiously patch the queue module.\n (Pull #1061)\n\n* Prevent retries from occurring on read timeouts for which the request method\n was not in the method whitelist. (Issue #1059)\n\n* Changed the PyOpenSSL contrib module to lazily load idna to avoid\n unnecessarily bloating the memory of programs that don't need it. (Pull\n #1076)\n\n* Add support for IPv6 literals with zone identifiers. (Pull #1013)\n\n* Added support for socks5h:// and socks4a:// schemes when working with SOCKS\n proxies, and controlled remote DNS appropriately. (Issue #1035)\n\n\n1.19.1 (2016-11-16)\n-------------------\n\n* Fixed AppEngine import that didn't function on Python 3.5. (Pull #1025)\n\n\n1.19 (2016-11-03)\n-----------------\n\n* urllib3 now respects Retry-After headers on 413, 429, and 503 responses when\n using the default retry logic. (Pull #955)\n\n* Remove markers from setup.py to assist ancient setuptools versions. (Issue\n #986)\n\n* Disallow superscripts and other integerish things in URL ports. (Issue #989)\n\n* Allow urllib3's HTTPResponse.stream() method to continue to work with\n non-httplib underlying FPs. (Pull #990)\n\n* Empty filenames in multipart headers are now emitted as such, rather than\n being suppressed. (Issue #1015)\n\n* Prefer user-supplied Host headers on chunked uploads. (Issue #1009)\n\n\n1.18.1 (2016-10-27)\n-------------------\n\n* CVE-2016-9015. Users who are using urllib3 version 1.17 or 1.18 along with\n PyOpenSSL injection and OpenSSL 1.1.0 *must* upgrade to this version. This\n release fixes a vulnerability whereby urllib3 in the above configuration\n would silently fail to validate TLS certificates due to erroneously setting\n invalid flags in OpenSSL's ``SSL_CTX_set_verify`` function. These erroneous\n flags do not cause a problem in OpenSSL versions before 1.1.0, which\n interprets the presence of any flag as requesting certificate validation.\n\n There is no PR for this patch, as it was prepared for simultaneous disclosure\n and release. The master branch received the same fix in Pull #1010.\n\n\n1.18 (2016-09-26)\n-----------------\n\n* Fixed incorrect message for IncompleteRead exception. (Pull #973)\n\n* Accept ``iPAddress`` subject alternative name fields in TLS certificates.\n (Issue #258)\n\n* Fixed consistency of ``HTTPResponse.closed`` between Python 2 and 3.\n (Issue #977)\n\n* Fixed handling of wildcard certificates when using PyOpenSSL. (Issue #979)\n\n\n1.17 (2016-09-06)\n-----------------\n\n* Accept ``SSLContext`` objects for use in SSL/TLS negotiation. (Issue #835)\n\n* ConnectionPool debug log now includes scheme, host, and port. (Issue #897)\n\n* Substantially refactored documentation. (Issue #887)\n\n* Used URLFetch default timeout on AppEngine, rather than hardcoding our own.\n (Issue #858)\n\n* Normalize the scheme and host in the URL parser (Issue #833)\n\n* ``HTTPResponse`` contains the last ``Retry`` object, which now also\n contains retries history. (Issue #848)\n\n* Timeout can no longer be set as boolean, and must be greater than zero.\n (Pull #924)\n\n* Removed pyasn1 and ndg-httpsclient from dependencies used for PyOpenSSL. We\n now use cryptography and idna, both of which are already dependencies of\n PyOpenSSL. (Pull #930)\n\n* Fixed infinite loop in ``stream`` when amt=None. (Issue #928)\n\n* Try to use the operating system's certificates when we are using an\n ``SSLContext``. (Pull #941)\n\n* Updated cipher suite list to allow ChaCha20+Poly1305. AES-GCM is preferred to\n ChaCha20, but ChaCha20 is then preferred to everything else. (Pull #947)\n\n* Updated cipher suite list to remove 3DES-based cipher suites. (Pull #958)\n\n* Removed the cipher suite fallback to allow HIGH ciphers. (Pull #958)\n\n* Implemented ``length_remaining`` to determine remaining content\n to be read. (Pull #949)\n\n* Implemented ``enforce_content_length`` to enable exceptions when\n incomplete data chunks are received. (Pull #949)\n\n* Dropped connection start, dropped connection reset, redirect, forced retry,\n and new HTTPS connection log levels to DEBUG, from INFO. (Pull #967)\n\n\n1.16 (2016-06-11)\n-----------------\n\n* Disable IPv6 DNS when IPv6 connections are not possible. (Issue #840)\n\n* Provide ``key_fn_by_scheme`` pool keying mechanism that can be\n overridden. (Issue #830)\n\n* Normalize scheme and host to lowercase for pool keys, and include\n ``source_address``. (Issue #830)\n\n* Cleaner exception chain in Python 3 for ``_make_request``.\n (Issue #861)\n\n* Fixed installing ``urllib3[socks]`` extra. (Issue #864)\n\n* Fixed signature of ``ConnectionPool.close`` so it can actually safely be\n called by subclasses. (Issue #873)\n\n* Retain ``release_conn`` state across retries. (Issues #651, #866)\n\n* Add customizable ``HTTPConnectionPool.ResponseCls``, which defaults to\n ``HTTPResponse`` but can be replaced with a subclass. (Issue #879)\n\n\n1.15.1 (2016-04-11)\n-------------------\n\n* Fix packaging to include backports module. (Issue #841)\n\n\n1.15 (2016-04-06)\n-----------------\n\n* Added Retry(raise_on_status=False). (Issue #720)\n\n* Always use setuptools, no more distutils fallback. (Issue #785)\n\n* Dropped support for Python 3.2. (Issue #786)\n\n* Chunked transfer encoding when requesting with ``chunked=True``.\n (Issue #790)\n\n* Fixed regression with IPv6 port parsing. (Issue #801)\n\n* Append SNIMissingWarning messages to allow users to specify it in\n the PYTHONWARNINGS environment variable. (Issue #816)\n\n* Handle unicode headers in Py2. (Issue #818)\n\n* Log certificate when there is a hostname mismatch. (Issue #820)\n\n* Preserve order of request/response headers. (Issue #821)\n\n\n1.14 (2015-12-29)\n-----------------\n\n* contrib: SOCKS proxy support! (Issue #762)\n\n* Fixed AppEngine handling of transfer-encoding header and bug\n in Timeout defaults checking. (Issue #763)\n\n\n1.13.1 (2015-12-18)\n-------------------\n\n* Fixed regression in IPv6 + SSL for match_hostname. (Issue #761)\n\n\n1.13 (2015-12-14)\n-----------------\n\n* Fixed ``pip install urllib3[secure]`` on modern pip. (Issue #706)\n\n* pyopenssl: Fixed SSL3_WRITE_PENDING error. (Issue #717)\n\n* pyopenssl: Support for TLSv1.1 and TLSv1.2. (Issue #696)\n\n* Close connections more defensively on exception. (Issue #734)\n\n* Adjusted ``read_chunked`` to handle gzipped, chunk-encoded bodies without\n repeatedly flushing the decoder, to function better on Jython. (Issue #743)\n\n* Accept ``ca_cert_dir`` for SSL-related PoolManager configuration. (Issue #758)\n\n\n1.12 (2015-09-03)\n-----------------\n\n* Rely on ``six`` for importing ``httplib`` to work around\n conflicts with other Python 3 shims. (Issue #688)\n\n* Add support for directories of certificate authorities, as supported by\n OpenSSL. (Issue #701)\n\n* New exception: ``NewConnectionError``, raised when we fail to establish\n a new connection, usually ``ECONNREFUSED`` socket error.\n\n\n1.11 (2015-07-21)\n-----------------\n\n* When ``ca_certs`` is given, ``cert_reqs`` defaults to\n ``'CERT_REQUIRED'``. (Issue #650)\n\n* ``pip install urllib3[secure]`` will install Certifi and\n PyOpenSSL as dependencies. (Issue #678)\n\n* Made ``HTTPHeaderDict`` usable as a ``headers`` input value\n (Issues #632, #679)\n\n* Added `urllib3.contrib.appengine <https://urllib3.readthedocs.io/en/latest/contrib.html#google-app-engine>`_\n which has an ``AppEngineManager`` for using ``URLFetch`` in a\n Google AppEngine environment. (Issue #664)\n\n* Dev: Added test suite for AppEngine. (Issue #631)\n\n* Fix performance regression when using PyOpenSSL. (Issue #626)\n\n* Passing incorrect scheme (e.g. ``foo://``) will raise\n ``ValueError`` instead of ``AssertionError`` (backwards\n compatible for now, but please migrate). (Issue #640)\n\n* Fix pools not getting replenished when an error occurs during a\n request using ``release_conn=False``. (Issue #644)\n\n* Fix pool-default headers not applying for url-encoded requests\n like GET. (Issue #657)\n\n* log.warning in Python 3 when headers are skipped due to parsing\n errors. (Issue #642)\n\n* Close and discard connections if an error occurs during read.\n (Issue #660)\n\n* Fix host parsing for IPv6 proxies. (Issue #668)\n\n* Separate warning type SubjectAltNameWarning, now issued once\n per host. (Issue #671)\n\n* Fix ``httplib.IncompleteRead`` not getting converted to\n ``ProtocolError`` when using ``HTTPResponse.stream()``\n (Issue #674)\n\n1.10.4 (2015-05-03)\n-------------------\n\n* Migrate tests to Tornado 4. (Issue #594)\n\n* Append default warning configuration rather than overwrite.\n (Issue #603)\n\n* Fix streaming decoding regression. (Issue #595)\n\n* Fix chunked requests losing state across keep-alive connections.\n (Issue #599)\n\n* Fix hanging when chunked HEAD response has no body. (Issue #605)\n\n\n1.10.3 (2015-04-21)\n-------------------\n\n* Emit ``InsecurePlatformWarning`` when SSLContext object is missing.\n (Issue #558)\n\n* Fix regression of duplicate header keys being discarded.\n (Issue #563)\n\n* ``Response.stream()`` returns a generator for chunked responses.\n (Issue #560)\n\n* Set upper-bound timeout when waiting for a socket in PyOpenSSL.\n (Issue #585)\n\n* Work on platforms without `ssl` module for plain HTTP requests.\n (Issue #587)\n\n* Stop relying on the stdlib's default cipher list. (Issue #588)\n\n\n1.10.2 (2015-02-25)\n-------------------\n\n* Fix file descriptor leakage on retries. (Issue #548)\n\n* Removed RC4 from default cipher list. (Issue #551)\n\n* Header performance improvements. (Issue #544)\n\n* Fix PoolManager not obeying redirect retry settings. (Issue #553)\n\n\n1.10.1 (2015-02-10)\n-------------------\n\n* Pools can be used as context managers. (Issue #545)\n\n* Don't re-use connections which experienced an SSLError. (Issue #529)\n\n* Don't fail when gzip decoding an empty stream. (Issue #535)\n\n* Add sha256 support for fingerprint verification. (Issue #540)\n\n* Fixed handling of header values containing commas. (Issue #533)\n\n\n1.10 (2014-12-14)\n-----------------\n\n* Disabled SSLv3. (Issue #473)\n\n* Add ``Url.url`` property to return the composed url string. (Issue #394)\n\n* Fixed PyOpenSSL + gevent ``WantWriteError``. (Issue #412)\n\n* ``MaxRetryError.reason`` will always be an exception, not string.\n (Issue #481)\n\n* Fixed SSL-related timeouts not being detected as timeouts. (Issue #492)\n\n* Py3: Use ``ssl.create_default_context()`` when available. (Issue #473)\n\n* Emit ``InsecureRequestWarning`` for *every* insecure HTTPS request.\n (Issue #496)\n\n* Emit ``SecurityWarning`` when certificate has no ``subjectAltName``.\n (Issue #499)\n\n* Close and discard sockets which experienced SSL-related errors.\n (Issue #501)\n\n* Handle ``body`` param in ``.request(...)``. (Issue #513)\n\n* Respect timeout with HTTPS proxy. (Issue #505)\n\n* PyOpenSSL: Handle ZeroReturnError exception. (Issue #520)\n\n\n1.9.1 (2014-09-13)\n------------------\n\n* Apply socket arguments before binding. (Issue #427)\n\n* More careful checks if fp-like object is closed. (Issue #435)\n\n* Fixed packaging issues of some development-related files not\n getting included. (Issue #440)\n\n* Allow performing *only* fingerprint verification. (Issue #444)\n\n* Emit ``SecurityWarning`` if system clock is waaay off. (Issue #445)\n\n* Fixed PyOpenSSL compatibility with PyPy. (Issue #450)\n\n* Fixed ``BrokenPipeError`` and ``ConnectionError`` handling in Py3.\n (Issue #443)\n\n\n\n1.9 (2014-07-04)\n----------------\n\n* Shuffled around development-related files. If you're maintaining a distro\n package of urllib3, you may need to tweak things. (Issue #415)\n\n* Unverified HTTPS requests will trigger a warning on the first request. See\n our new `security documentation\n <https://urllib3.readthedocs.io/en/latest/security.html>`_ for details.\n (Issue #426)\n\n* New retry logic and ``urllib3.util.retry.Retry`` configuration object.\n (Issue #326)\n\n* All raised exceptions should now wrapped in a\n ``urllib3.exceptions.HTTPException``-extending exception. (Issue #326)\n\n* All errors during a retry-enabled request should be wrapped in\n ``urllib3.exceptions.MaxRetryError``, including timeout-related exceptions\n which were previously exempt. Underlying error is accessible from the\n ``.reason`` property. (Issue #326)\n\n* ``urllib3.exceptions.ConnectionError`` renamed to\n ``urllib3.exceptions.ProtocolError``. (Issue #326)\n\n* Errors during response read (such as IncompleteRead) are now wrapped in\n ``urllib3.exceptions.ProtocolError``. (Issue #418)\n\n* Requesting an empty host will raise ``urllib3.exceptions.LocationValueError``.\n (Issue #417)\n\n* Catch read timeouts over SSL connections as\n ``urllib3.exceptions.ReadTimeoutError``. (Issue #419)\n\n* Apply socket arguments before connecting. (Issue #427)\n\n\n1.8.3 (2014-06-23)\n------------------\n\n* Fix TLS verification when using a proxy in Python 3.4.1. (Issue #385)\n\n* Add ``disable_cache`` option to ``urllib3.util.make_headers``. (Issue #393)\n\n* Wrap ``socket.timeout`` exception with\n ``urllib3.exceptions.ReadTimeoutError``. (Issue #399)\n\n* Fixed proxy-related bug where connections were being reused incorrectly.\n (Issues #366, #369)\n\n* Added ``socket_options`` keyword parameter which allows to define\n ``setsockopt`` configuration of new sockets. (Issue #397)\n\n* Removed ``HTTPConnection.tcp_nodelay`` in favor of\n ``HTTPConnection.default_socket_options``. (Issue #397)\n\n* Fixed ``TypeError`` bug in Python 2.6.4. (Issue #411)\n\n\n1.8.2 (2014-04-17)\n------------------\n\n* Fix ``urllib3.util`` not being included in the package.\n\n\n1.8.1 (2014-04-17)\n------------------\n\n* Fix AppEngine bug of HTTPS requests going out as HTTP. (Issue #356)\n\n* Don't install ``dummyserver`` into ``site-packages`` as it's only needed\n for the test suite. (Issue #362)\n\n* Added support for specifying ``source_address``. (Issue #352)\n\n\n1.8 (2014-03-04)\n----------------\n\n* Improved url parsing in ``urllib3.util.parse_url`` (properly parse '@' in\n username, and blank ports like 'hostname:').\n\n* New ``urllib3.connection`` module which contains all the HTTPConnection\n objects.\n\n* Several ``urllib3.util.Timeout``-related fixes. Also changed constructor\n signature to a more sensible order. [Backwards incompatible]\n (Issues #252, #262, #263)\n\n* Use ``backports.ssl_match_hostname`` if it's installed. (Issue #274)\n\n* Added ``.tell()`` method to ``urllib3.response.HTTPResponse`` which\n returns the number of bytes read so far. (Issue #277)\n\n* Support for platforms without threading. (Issue #289)\n\n* Expand default-port comparison in ``HTTPConnectionPool.is_same_host``\n to allow a pool with no specified port to be considered equal to to an\n HTTP/HTTPS url with port 80/443 explicitly provided. (Issue #305)\n\n* Improved default SSL/TLS settings to avoid vulnerabilities.\n (Issue #309)\n\n* Fixed ``urllib3.poolmanager.ProxyManager`` not retrying on connect errors.\n (Issue #310)\n\n* Disable Nagle's Algorithm on the socket for non-proxies. A subset of requests\n will send the entire HTTP request ~200 milliseconds faster; however, some of\n the resulting TCP packets will be smaller. (Issue #254)\n\n* Increased maximum number of SubjectAltNames in ``urllib3.contrib.pyopenssl``\n from the default 64 to 1024 in a single certificate. (Issue #318)\n\n* Headers are now passed and stored as a custom\n ``urllib3.collections_.HTTPHeaderDict`` object rather than a plain ``dict``.\n (Issue #329, #333)\n\n* Headers no longer lose their case on Python 3. (Issue #236)\n\n* ``urllib3.contrib.pyopenssl`` now uses the operating system's default CA\n certificates on inject. (Issue #332)\n\n* Requests with ``retries=False`` will immediately raise any exceptions without\n wrapping them in ``MaxRetryError``. (Issue #348)\n\n* Fixed open socket leak with SSL-related failures. (Issue #344, #348)\n\n\n1.7.1 (2013-09-25)\n------------------\n\n* Added granular timeout support with new ``urllib3.util.Timeout`` class.\n (Issue #231)\n\n* Fixed Python 3.4 support. (Issue #238)\n\n\n1.7 (2013-08-14)\n----------------\n\n* More exceptions are now pickle-able, with tests. (Issue #174)\n\n* Fixed redirecting with relative URLs in Location header. (Issue #178)\n\n* Support for relative urls in ``Location: ...`` header. (Issue #179)\n\n* ``urllib3.response.HTTPResponse`` now inherits from ``io.IOBase`` for bonus\n file-like functionality. (Issue #187)\n\n* Passing ``assert_hostname=False`` when creating a HTTPSConnectionPool will\n skip hostname verification for SSL connections. (Issue #194)\n\n* New method ``urllib3.response.HTTPResponse.stream(...)`` which acts as a\n generator wrapped around ``.read(...)``. (Issue #198)\n\n* IPv6 url parsing enforces brackets around the hostname. (Issue #199)\n\n* Fixed thread race condition in\n ``urllib3.poolmanager.PoolManager.connection_from_host(...)`` (Issue #204)\n\n* ``ProxyManager`` requests now include non-default port in ``Host: ...``\n header. (Issue #217)\n\n* Added HTTPS proxy support in ``ProxyManager``. (Issue #170 #139)\n\n* New ``RequestField`` object can be passed to the ``fields=...`` param which\n can specify headers. (Issue #220)\n\n* Raise ``urllib3.exceptions.ProxyError`` when connecting to proxy fails.\n (Issue #221)\n\n* Use international headers when posting file names. (Issue #119)\n\n* Improved IPv6 support. (Issue #203)\n\n\n1.6 (2013-04-25)\n----------------\n\n* Contrib: Optional SNI support for Py2 using PyOpenSSL. (Issue #156)\n\n* ``ProxyManager`` automatically adds ``Host: ...`` header if not given.\n\n* Improved SSL-related code. ``cert_req`` now optionally takes a string like\n \"REQUIRED\" or \"NONE\". Same with ``ssl_version`` takes strings like \"SSLv23\"\n The string values reflect the suffix of the respective constant variable.\n (Issue #130)\n\n* Vendored ``socksipy`` now based on Anorov's fork which handles unexpectedly\n closed proxy connections and larger read buffers. (Issue #135)\n\n* Ensure the connection is closed if no data is received, fixes connection leak\n on some platforms. (Issue #133)\n\n* Added SNI support for SSL/TLS connections on Py32+. (Issue #89)\n\n* Tests fixed to be compatible with Py26 again. (Issue #125)\n\n* Added ability to choose SSL version by passing an ``ssl.PROTOCOL_*`` constant\n to the ``ssl_version`` parameter of ``HTTPSConnectionPool``. (Issue #109)\n\n* Allow an explicit content type to be specified when encoding file fields.\n (Issue #126)\n\n* Exceptions are now pickleable, with tests. (Issue #101)\n\n* Fixed default headers not getting passed in some cases. (Issue #99)\n\n* Treat \"content-encoding\" header value as case-insensitive, per RFC 2616\n Section 3.5. (Issue #110)\n\n* \"Connection Refused\" SocketErrors will get retried rather than raised.\n (Issue #92)\n\n* Updated vendored ``six``, no longer overrides the global ``six`` module\n namespace. (Issue #113)\n\n* ``urllib3.exceptions.MaxRetryError`` contains a ``reason`` property holding\n the exception that prompted the final retry. If ``reason is None`` then it\n was due to a redirect. (Issue #92, #114)\n\n* Fixed ``PoolManager.urlopen()`` from not redirecting more than once.\n (Issue #149)\n\n* Don't assume ``Content-Type: text/plain`` for multi-part encoding parameters\n that are not files. (Issue #111)\n\n* Pass `strict` param down to ``httplib.HTTPConnection``. (Issue #122)\n\n* Added mechanism to verify SSL certificates by fingerprint (md5, sha1) or\n against an arbitrary hostname (when connecting by IP or for misconfigured\n servers). (Issue #140)\n\n* Streaming decompression support. (Issue #159)\n\n\n1.5 (2012-08-02)\n----------------\n\n* Added ``urllib3.add_stderr_logger()`` for quickly enabling STDERR debug\n logging in urllib3.\n\n* Native full URL parsing (including auth, path, query, fragment) available in\n ``urllib3.util.parse_url(url)``.\n\n* Built-in redirect will switch method to 'GET' if status code is 303.\n (Issue #11)\n\n* ``urllib3.PoolManager`` strips the scheme and host before sending the request\n uri. (Issue #8)\n\n* New ``urllib3.exceptions.DecodeError`` exception for when automatic decoding,\n based on the Content-Type header, fails.\n\n* Fixed bug with pool depletion and leaking connections (Issue #76). Added\n explicit connection closing on pool eviction. Added\n ``urllib3.PoolManager.clear()``.\n\n* 99% -> 100% unit test coverage.\n\n\n1.4 (2012-06-16)\n----------------\n\n* Minor AppEngine-related fixes.\n\n* Switched from ``mimetools.choose_boundary`` to ``uuid.uuid4()``.\n\n* Improved url parsing. (Issue #73)\n\n* IPv6 url support. (Issue #72)\n\n\n1.3 (2012-03-25)\n----------------\n\n* Removed pre-1.0 deprecated API.\n\n* Refactored helpers into a ``urllib3.util`` submodule.\n\n* Fixed multipart encoding to support list-of-tuples for keys with multiple\n values. (Issue #48)\n\n* Fixed multiple Set-Cookie headers in response not getting merged properly in\n Python 3. (Issue #53)\n\n* AppEngine support with Py27. (Issue #61)\n\n* Minor ``encode_multipart_formdata`` fixes related to Python 3 strings vs\n bytes.\n\n\n1.2.2 (2012-02-06)\n------------------\n\n* Fixed packaging bug of not shipping ``test-requirements.txt``. (Issue #47)\n\n\n1.2.1 (2012-02-05)\n------------------\n\n* Fixed another bug related to when ``ssl`` module is not available. (Issue #41)\n\n* Location parsing errors now raise ``urllib3.exceptions.LocationParseError``\n which inherits from ``ValueError``.\n\n\n1.2 (2012-01-29)\n----------------\n\n* Added Python 3 support (tested on 3.2.2)\n\n* Dropped Python 2.5 support (tested on 2.6.7, 2.7.2)\n\n* Use ``select.poll`` instead of ``select.select`` for platforms that support\n it.\n\n* Use ``Queue.LifoQueue`` instead of ``Queue.Queue`` for more aggressive\n connection reusing. Configurable by overriding ``ConnectionPool.QueueCls``.\n\n* Fixed ``ImportError`` during install when ``ssl`` module is not available.\n (Issue #41)\n\n* Fixed ``PoolManager`` redirects between schemes (such as HTTP -> HTTPS) not\n completing properly. (Issue #28, uncovered by Issue #10 in v1.1)\n\n* Ported ``dummyserver`` to use ``tornado`` instead of ``webob`` +\n ``eventlet``. Removed extraneous unsupported dummyserver testing backends.\n Added socket-level tests.\n\n* More tests. Achievement Unlocked: 99% Coverage.\n\n\n1.1 (2012-01-07)\n----------------\n\n* Refactored ``dummyserver`` to its own root namespace module (used for\n testing).\n\n* Added hostname verification for ``VerifiedHTTPSConnection`` by vendoring in\n Py32's ``ssl_match_hostname``. (Issue #25)\n\n* Fixed cross-host HTTP redirects when using ``PoolManager``. (Issue #10)\n\n* Fixed ``decode_content`` being ignored when set through ``urlopen``. (Issue\n #27)\n\n* Fixed timeout-related bugs. (Issues #17, #23)\n\n\n1.0.2 (2011-11-04)\n------------------\n\n* Fixed typo in ``VerifiedHTTPSConnection`` which would only present as a bug if\n you're using the object manually. (Thanks pyos)\n\n* Made RecentlyUsedContainer (and consequently PoolManager) more thread-safe by\n wrapping the access log in a mutex. (Thanks @christer)\n\n* Made RecentlyUsedContainer more dict-like (corrected ``__delitem__`` and\n ``__getitem__`` behaviour), with tests. Shouldn't affect core urllib3 code.\n\n\n1.0.1 (2011-10-10)\n------------------\n\n* Fixed a bug where the same connection would get returned into the pool twice,\n causing extraneous \"HttpConnectionPool is full\" log warnings.\n\n\n1.0 (2011-10-08)\n----------------\n\n* Added ``PoolManager`` with LRU expiration of connections (tested and\n documented).\n* Added ``ProxyManager`` (needs tests, docs, and confirmation that it works\n with HTTPS proxies).\n* Added optional partial-read support for responses when\n ``preload_content=False``. You can now make requests and just read the headers\n without loading the content.\n* Made response decoding optional (default on, same as before).\n* Added optional explicit boundary string for ``encode_multipart_formdata``.\n* Convenience request methods are now inherited from ``RequestMethods``. Old\n helpers like ``get_url`` and ``post_url`` should be abandoned in favour of\n the new ``request(method, url, ...)``.\n* Refactored code to be even more decoupled, reusable, and extendable.\n* License header added to ``.py`` files.\n* Embiggened the documentation: Lots of Sphinx-friendly docstrings in the code\n and docs in ``docs/`` and on https://urllib3.readthedocs.io/.\n* Embettered all the things!\n* Started writing this file.\n\n\n0.4.1 (2011-07-17)\n------------------\n\n* Minor bug fixes, code cleanup.\n\n\n0.4 (2011-03-01)\n----------------\n\n* Better unicode support.\n* Added ``VerifiedHTTPSConnection``.\n* Added ``NTLMConnectionPool`` in contrib.\n* Minor improvements.\n\n\n0.3.1 (2010-07-13)\n------------------\n\n* Added ``assert_host_name`` optional parameter. Now compatible with proxies.\n\n\n0.3 (2009-12-10)\n----------------\n\n* Added HTTPS support.\n* Minor bug fixes.\n* Refactored, broken backwards compatibility with 0.2.\n* API to be treated as stable from this version forward.\n\n\n0.2 (2008-11-17)\n----------------\n\n* Added unit tests.\n* Bug fixes.\n\n\n0.1 (2008-11-16)\n----------------\n\n* First release.\n",
- "description_content_type": "text/x-rst",
- "keywords": [
- "urllib",
- "httplib",
- "threadsafe",
- "filepost",
- "http",
- "https",
- "ssl",
- "pooling"
- ],
- "home_page": "https://urllib3.readthedocs.io/",
- "author": "Andrey Petrov",
- "author_email": "andrey.petrov@shazow.net",
- "license": "MIT",
- "classifier": [
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- "Topic :: Internet :: WWW/HTTP",
- "Topic :: Software Development :: Libraries"
- ],
- "requires_dist": [
- "brotlicffi >=0.8.0 ; ((os_name != \"nt\" or python_version >= \"3\") and platform_python_implementation != \"CPython\") and extra == 'brotli'",
- "brotli ==1.0.9 ; (os_name != \"nt\" and python_version < \"3\" and platform_python_implementation == \"CPython\") and extra == 'brotli'",
- "brotlipy >=0.6.0 ; (os_name == \"nt\" and python_version < \"3\") and extra == 'brotli'",
- "brotli >=1.0.9 ; (python_version >= \"3\" and platform_python_implementation == \"CPython\") and extra == 'brotli'",
- "pyOpenSSL >=0.14 ; extra == 'secure'",
- "cryptography >=1.3.4 ; extra == 'secure'",
- "idna >=2.0.0 ; extra == 'secure'",
- "certifi ; extra == 'secure'",
- "urllib3-secure-extra ; extra == 'secure'",
- "ipaddress ; (python_version == \"2.7\") and extra == 'secure'",
- "PySocks !=1.5.7,<2.0,>=1.5.6 ; extra == 'socks'"
- ],
- "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*",
- "project_url": [
- "Documentation, https://urllib3.readthedocs.io/",
- "Code, https://github.com/urllib3/urllib3",
- "Issue tracker, https://github.com/urllib3/urllib3/issues"
- ],
- "provides_extra": [
- "brotli",
- "secure",
- "socks"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/f6/f8/9da63c1617ae2a1dec2fbf6412f3a0cfe9d4ce029eccbda6e1e4258ca45f/Werkzeug-2.2.3-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=56433961bc1f12533306c624f3be5e744389ac61d722175d543e1751285da612",
- "hashes": {
- "sha256": "56433961bc1f12533306c624f3be5e744389ac61d722175d543e1751285da612"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "Werkzeug",
- "version": "2.2.3",
- "summary": "The comprehensive WSGI web application library.",
- "description": "Werkzeug\n========\n\n*werkzeug* German noun: \"tool\". Etymology: *werk* (\"work\"), *zeug* (\"stuff\")\n\nWerkzeug is a comprehensive `WSGI`_ web application library. It began as\na simple collection of various utilities for WSGI applications and has\nbecome one of the most advanced WSGI utility libraries.\n\nIt includes:\n\n- An interactive debugger that allows inspecting stack traces and\n source code in the browser with an interactive interpreter for any\n frame in the stack.\n- A full-featured request object with objects to interact with\n headers, query args, form data, files, and cookies.\n- A response object that can wrap other WSGI applications and handle\n streaming data.\n- A routing system for matching URLs to endpoints and generating URLs\n for endpoints, with an extensible system for capturing variables\n from URLs.\n- HTTP utilities to handle entity tags, cache control, dates, user\n agents, cookies, files, and more.\n- A threaded WSGI server for use while developing applications\n locally.\n- A test client for simulating HTTP requests during testing without\n requiring running a server.\n\nWerkzeug doesn't enforce any dependencies. It is up to the developer to\nchoose a template engine, database adapter, and even how to handle\nrequests. It can be used to build all sorts of end user applications\nsuch as blogs, wikis, or bulletin boards.\n\n`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while\nproviding more structure and patterns for defining powerful\napplications.\n\n.. _WSGI: https://wsgi.readthedocs.io/en/latest/\n.. _Flask: https://www.palletsprojects.com/p/flask/\n\n\nInstalling\n----------\n\nInstall and update using `pip`_:\n\n.. code-block:: text\n\n pip install -U Werkzeug\n\n.. _pip: https://pip.pypa.io/en/stable/getting-started/\n\n\nA Simple Example\n----------------\n\n.. code-block:: python\n\n from werkzeug.wrappers import Request, Response\n\n @Request.application\n def application(request):\n return Response('Hello, World!')\n\n if __name__ == '__main__':\n from werkzeug.serving import run_simple\n run_simple('localhost', 4000, application)\n\n\nDonate\n------\n\nThe Pallets organization develops and supports Werkzeug and other\npopular packages. In order to grow the community of contributors and\nusers, and allow the maintainers to devote more time to the projects,\n`please donate today`_.\n\n.. _please donate today: https://palletsprojects.com/donate\n\n\nLinks\n-----\n\n- Documentation: https://werkzeug.palletsprojects.com/\n- Changes: https://werkzeug.palletsprojects.com/changes/\n- PyPI Releases: https://pypi.org/project/Werkzeug/\n- Source Code: https://github.com/pallets/werkzeug/\n- Issue Tracker: https://github.com/pallets/werkzeug/issues/\n- Website: https://palletsprojects.com/p/werkzeug/\n- Twitter: https://twitter.com/PalletsTeam\n- Chat: https://discord.gg/pallets\n",
- "description_content_type": "text/x-rst",
- "home_page": "https://palletsprojects.com/p/werkzeug/",
- "author": "Armin Ronacher",
- "author_email": "armin.ronacher@active-4.com",
- "maintainer": "Pallets",
- "maintainer_email": "contact@palletsprojects.com",
- "license": "BSD-3-Clause",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
- "Topic :: Internet :: WWW/HTTP :: WSGI",
- "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
- "Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware",
- "Topic :: Software Development :: Libraries :: Application Frameworks"
- ],
- "requires_dist": [
- "MarkupSafe (>=2.1.1)",
- "watchdog ; extra == 'watchdog'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Donate, https://palletsprojects.com/donate",
- "Documentation, https://werkzeug.palletsprojects.com/",
- "Changes, https://werkzeug.palletsprojects.com/changes/",
- "Source Code, https://github.com/pallets/werkzeug/",
- "Issue Tracker, https://github.com/pallets/werkzeug/issues/",
- "Twitter, https://twitter.com/PalletsTeam",
- "Chat, https://discord.gg/pallets"
- ],
- "provides_extra": [
- "watchdog"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/b9/40/975fbb1ab03fa987900bacc365645c4cbead22baddd273b4f5db7f9843d2/wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "archive_info": {
- "hash": "sha256=3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c",
- "hashes": {
- "sha256": "3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "wrapt",
- "version": "1.15.0",
- "platform": [
- "any"
- ],
- "summary": "Module for decorators, wrappers and monkey patching.",
- "description": "wrapt\n=====\n\n|Actions| |PyPI|\n\nThe aim of the **wrapt** module is to provide a transparent object proxy\nfor Python, which can be used as the basis for the construction of function\nwrappers and decorator functions.\n\nThe **wrapt** module focuses very much on correctness. It therefore goes\nway beyond existing mechanisms such as ``functools.wraps()`` to ensure that\ndecorators preserve introspectability, signatures, type checking abilities\netc. The decorators that can be constructed using this module will work in\nfar more scenarios than typical decorators and provide more predictable and\nconsistent behaviour.\n\nTo ensure that the overhead is as minimal as possible, a C extension module\nis used for performance critical components. An automatic fallback to a\npure Python implementation is also provided where a target system does not\nhave a compiler to allow the C extension to be compiled.\n\nDocumentation\n-------------\n\nFor further information on the **wrapt** module see:\n\n* http://wrapt.readthedocs.org/\n\nQuick Start\n-----------\n\nTo implement your decorator you need to first define a wrapper function.\nThis will be called each time a decorated function is called. The wrapper\nfunction needs to take four positional arguments:\n\n* ``wrapped`` - The wrapped function which in turns needs to be called by your wrapper function.\n* ``instance`` - The object to which the wrapped function was bound when it was called.\n* ``args`` - The list of positional arguments supplied when the decorated function was called.\n* ``kwargs`` - The dictionary of keyword arguments supplied when the decorated function was called.\n\nThe wrapper function would do whatever it needs to, but would usually in\nturn call the wrapped function that is passed in via the ``wrapped``\nargument.\n\nThe decorator ``@wrapt.decorator`` then needs to be applied to the wrapper\nfunction to convert it into a decorator which can in turn be applied to\nother functions.\n\n.. code-block:: python\n\n import wrapt\n \n @wrapt.decorator\n def pass_through(wrapped, instance, args, kwargs):\n return wrapped(*args, **kwargs)\n\n @pass_through\n def function():\n pass\n\nIf you wish to implement a decorator which accepts arguments, then wrap the\ndefinition of the decorator in a function closure. Any arguments supplied\nto the outer function when the decorator is applied, will be available to\nthe inner wrapper when the wrapped function is called.\n\n.. code-block:: python\n\n import wrapt\n\n def with_arguments(myarg1, myarg2):\n @wrapt.decorator\n def wrapper(wrapped, instance, args, kwargs):\n return wrapped(*args, **kwargs)\n return wrapper\n\n @with_arguments(1, 2)\n def function():\n pass\n\nWhen applied to a normal function or static method, the wrapper function\nwhen called will be passed ``None`` as the ``instance`` argument.\n\nWhen applied to an instance method, the wrapper function when called will\nbe passed the instance of the class the method is being called on as the\n``instance`` argument. This will be the case even when the instance method\nwas called explicitly via the class and the instance passed as the first\nargument. That is, the instance will never be passed as part of ``args``.\n\nWhen applied to a class method, the wrapper function when called will be\npassed the class type as the ``instance`` argument.\n\nWhen applied to a class, the wrapper function when called will be passed\n``None`` as the ``instance`` argument. The ``wrapped`` argument in this\ncase will be the class.\n\nThe above rules can be summarised with the following example.\n\n.. code-block:: python\n\n import inspect\n \n @wrapt.decorator\n def universal(wrapped, instance, args, kwargs):\n if instance is None:\n if inspect.isclass(wrapped):\n # Decorator was applied to a class.\n return wrapped(*args, **kwargs)\n else:\n # Decorator was applied to a function or staticmethod.\n return wrapped(*args, **kwargs)\n else:\n if inspect.isclass(instance):\n # Decorator was applied to a classmethod.\n return wrapped(*args, **kwargs)\n else:\n # Decorator was applied to an instancemethod.\n return wrapped(*args, **kwargs)\n\nUsing these checks it is therefore possible to create a universal decorator\nthat can be applied in all situations. It is no longer necessary to create\ndifferent variants of decorators for normal functions and instance methods,\nor use additional wrappers to convert a function decorator into one that\nwill work for instance methods.\n\nIn all cases, the wrapped function passed to the wrapper function is called\nin the same way, with ``args`` and ``kwargs`` being passed. The\n``instance`` argument doesn't need to be used in calling the wrapped\nfunction.\n\nRepository\n----------\n\nFull source code for the **wrapt** module, including documentation files\nand unit tests, can be obtained from github.\n\n* https://github.com/GrahamDumpleton/wrapt\n\n.. |Actions| image:: https://img.shields.io/github/workflow/status/GrahamDumpleton/wrapt/Test/develop?logo=github&cacheSeconds=600\n :target: https://github.com/GrahamDumpleton/wrapt/actions\n.. |PyPI| image:: https://img.shields.io/pypi/v/wrapt.svg?logo=python&cacheSeconds=3600\n :target: https://pypi.python.org/pypi/wrapt\n",
- "description_content_type": "text/x-rst",
- "keywords": [
- "wrapper",
- "proxy",
- "decorator"
- ],
- "home_page": "https://github.com/GrahamDumpleton/wrapt",
- "author": "Graham Dumpleton",
- "author_email": "Graham.Dumpleton@gmail.com",
- "license": "BSD",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "License :: OSI Approved :: BSD License",
- "Programming Language :: Python :: 2",
- "Programming Language :: Python :: 2.7",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.5",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: 3.11",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy"
- ],
- "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7",
- "project_url": [
- "Bug Tracker, https://github.com/GrahamDumpleton/wrapt/issues/",
- "Changelog, https://wrapt.readthedocs.io/en/latest/changes.html",
- "Documentation, https://wrapt.readthedocs.io/"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/05/0b/35fb7d652da8d99b7defc58f3a3571ffe5169ad42ca8f2b6628a5a3152a2/wtforms-3.1.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=addd7899004fdf9318eb711d33aae9c1973fe80378257b7383e06de2eff7c559",
- "hashes": {
- "sha256": "addd7899004fdf9318eb711d33aae9c1973fe80378257b7383e06de2eff7c559"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "WTForms",
- "version": "3.1.0",
- "summary": "Form validation and rendering for Python web development.",
- "description": "WTForms\n=======\n\nWTForms is a flexible forms validation and rendering library for Python\nweb development. It can work with whatever web framework and template\nengine you choose. It supports data validation, CSRF protection,\ninternationalization (I18N), and more. There are various community\nlibraries that provide closer integration with popular frameworks.\n\n\nInstallation\n------------\n\nInstall and update using pip:\n\n.. code-block:: text\n\n pip install -U WTForms\n\n\nThird-Party Library Integrations\n--------------------------------\n\nWTForms is designed to work with any web framework and template engine.\nThere are a number of community-provided libraries that make integrating\nwith frameworks even better.\n\n- `Flask-WTF`_ integrates with the Flask framework. It can\n automatically load data from the request, uses Flask-Babel to\n translate based on user-selected locale, provides full-application\n CSRF, and more.\n- `WTForms-Alchemy`_ provides rich support for generating forms from\n SQLAlchemy models, including an expanded set of fields and\n validators.\n- `WTForms-SQLAlchemy`_ provides ORM-backed fields and form generation\n from SQLAlchemy models.\n- `WTForms-AppEngine`_ provides ORM-backed fields and form generation\n from AppEnding db/ndb schema\n- `WTForms-Django`_ provides ORM-backed fields and form generation\n from Django models, as well as integration with Django's I18N\n support.\n- `WTForms-Bootstrap5`_ provides Bootstrap 5 favor renderer with\n great customizability.\n- `Starlette-WTF`_ integrates with Starlette and the FastAPI\n framework, based on the features of Flask-WTF.\n- `Bootstrap-Flask`_ Bootstrap-Flask is a collection of Jinja macros\n for Bootstrap 4 & 5 and Flask using Flask-WTF.\n\n.. _Flask-WTF: https://flask-wtf.readthedocs.io/\n.. _WTForms-Alchemy: https://wtforms-alchemy.readthedocs.io/\n.. _WTForms-SQLAlchemy: https://github.com/wtforms/wtforms-sqlalchemy\n.. _WTForms-AppEngine: https://github.com/wtforms/wtforms-appengine\n.. _WTForms-Django: https://github.com/wtforms/wtforms-django\n.. _WTForms-Bootstrap5: https://github.com/LaunchPlatform/wtforms-bootstrap5\n.. _Starlette-WTF: https://github.com/muicss/starlette-wtf\n.. _Bootstrap-Flask: https://github.com/helloflask/bootstrap-flask\n\n\nLinks\n-----\n\n- Documentation: https://wtforms.readthedocs.io/\n- Releases: https://pypi.org/project/WTForms/\n- Code: https://github.com/wtforms/wtforms\n- Issue tracker: https://github.com/wtforms/wtforms/issues\n- Discord Chat: https://discord.gg/F65P7Z9\n- Translation: https://hosted.weblate.org/projects/wtforms/wtforms/\n",
- "description_content_type": "text/x-rst",
- "maintainer": "WTForms",
- "license": "Copyright 2008 WTForms\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n1. Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Web Environment",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: BSD License",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Topic :: Internet :: WWW/HTTP :: Dynamic Content"
- ],
- "requires_dist": [
- "markupsafe",
- "email-validator; extra == 'email'"
- ],
- "requires_python": ">=3.8",
- "project_url": [
- "Documentation, https://wtforms.readthedocs.io",
- "Changes, https://wtforms.readthedocs.io/changes",
- "Source Code, https://github.com/wtforms/wtforms/",
- "Issue Tracker, https://github.com/wtforms/wtforms/issues",
- "Chat, https://discord.gg/pallets"
- ],
- "provides_extra": [
- "email"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/40/f9/882281af7c40a99bfa5b14585071c5aa13f48961582ebe067ae38221d0d9/yamllint-1.28.0-py2.py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=89bb5b5ac33b1ade059743cf227de73daa34d5e5a474b06a5e17fc16583b0cf2",
- "hashes": {
- "sha256": "89bb5b5ac33b1ade059743cf227de73daa34d5e5a474b06a5e17fc16583b0cf2"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "yamllint",
- "version": "1.28.0",
- "platform": [
- "UNKNOWN"
- ],
- "summary": "A linter for YAML files.",
- "description": "A linter for YAML files.\n\nyamllint does not only check for syntax validity, but for weirdnesses like key\nrepetition and cosmetic problems such as lines length, trailing spaces,\nindentation, etc.\n\n",
- "keywords": [
- "yaml",
- "lint",
- "linter",
- "syntax",
- "checker"
- ],
- "home_page": "https://github.com/adrienverge/yamllint",
- "author": "Adrien Vergé",
- "license": "GPLv3",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Environment :: Console",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Topic :: Software Development",
- "Topic :: Software Development :: Debuggers",
- "Topic :: Software Development :: Quality Assurance",
- "Topic :: Software Development :: Testing"
- ],
- "requires_dist": [
- "pathspec (>=0.5.3)",
- "pyyaml",
- "setuptools"
- ],
- "requires_python": ">=3.6",
- "project_url": [
- "Documentation, https://yamllint.readthedocs.io",
- "Download, https://pypi.org/project/yamllint/#files",
- "Bug Tracker, https://github.com/adrienverge/yamllint/issues",
- "Source Code, https://github.com/adrienverge/yamllint"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/d9/66/48866fc6b158c81cc2bfecc04c480f105c6040e8b077bc54c634b4a67926/zipp-3.17.0-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31",
- "hashes": {
- "sha256": "0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "zipp",
- "version": "3.17.0",
- "summary": "Backport of pathlib-compatible object wrapper for zip files",
- "description": ".. image:: https://img.shields.io/pypi/v/zipp.svg\n :target: https://pypi.org/project/zipp\n\n.. image:: https://img.shields.io/pypi/pyversions/zipp.svg\n\n.. image:: https://github.com/jaraco/zipp/workflows/tests/badge.svg\n :target: https://github.com/jaraco/zipp/actions?query=workflow%3A%22tests%22\n :alt: tests\n\n.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json\n :target: https://github.com/astral-sh/ruff\n :alt: Ruff\n\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n :target: https://github.com/psf/black\n :alt: Code style: Black\n\n.. .. image:: https://readthedocs.org/projects/PROJECT_RTD/badge/?version=latest\n.. :target: https://PROJECT_RTD.readthedocs.io/en/latest/?badge=latest\n\n.. image:: https://img.shields.io/badge/skeleton-2023-informational\n :target: https://blog.jaraco.com/skeleton\n\n.. image:: https://tidelift.com/badges/package/pypi/zipp\n :target: https://tidelift.com/subscription/pkg/pypi-zipp?utm_source=pypi-zipp&utm_medium=readme\n\n\nA pathlib-compatible Zipfile object wrapper. Official backport of the standard library\n`Path object <https://docs.python.org/3.8/library/zipfile.html#path-objects>`_.\n\n\nCompatibility\n=============\n\nNew features are introduced in this third-party library and later merged\ninto CPython. The following table indicates which versions of this library\nwere contributed to different versions in the standard library:\n\n.. list-table::\n :header-rows: 1\n\n * - zipp\n - stdlib\n * - 3.15\n - 3.12\n * - 3.5\n - 3.11\n * - 3.2\n - 3.10\n * - 3.3 ??\n - 3.9\n * - 1.0\n - 3.8\n\n\nUsage\n=====\n\nUse ``zipp.Path`` in place of ``zipfile.Path`` on any Python.\n\nFor Enterprise\n==============\n\nAvailable as part of the Tidelift Subscription.\n\nThis project and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use.\n\n`Learn more <https://tidelift.com/subscription/pkg/pypi-zipp?utm_source=pypi-zipp&utm_medium=referral&utm_campaign=github>`_.\n",
- "home_page": "https://github.com/jaraco/zipp",
- "author": "Jason R. Coombs",
- "author_email": "jaraco@jaraco.com",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only"
- ],
- "requires_dist": [
- "sphinx >=3.5 ; extra == 'docs'",
- "sphinx <7.2.5 ; extra == 'docs'",
- "jaraco.packaging >=9.3 ; extra == 'docs'",
- "rst.linker >=1.9 ; extra == 'docs'",
- "furo ; extra == 'docs'",
- "sphinx-lint ; extra == 'docs'",
- "jaraco.tidelift >=1.4 ; extra == 'docs'",
- "pytest >=6 ; extra == 'testing'",
- "pytest-checkdocs >=2.4 ; extra == 'testing'",
- "pytest-cov ; extra == 'testing'",
- "pytest-enabler >=2.2 ; extra == 'testing'",
- "pytest-ruff ; extra == 'testing'",
- "jaraco.itertools ; extra == 'testing'",
- "jaraco.functools ; extra == 'testing'",
- "more-itertools ; extra == 'testing'",
- "big-O ; extra == 'testing'",
- "pytest-ignore-flaky ; extra == 'testing'",
- "pytest-black >=0.3.7 ; (platform_python_implementation != \"PyPy\") and extra == 'testing'",
- "pytest-mypy >=0.9.1 ; (platform_python_implementation != \"PyPy\") and extra == 'testing'"
- ],
- "requires_python": ">=3.8",
- "provides_extra": [
- "docs",
- "testing"
- ]
- }
- },
- {
- "download_info": {
- "url": "https://files.pythonhosted.org/packages/ef/e3/29d6e1a07e8d90ace4a522d9689d03e833b67b50d1588e693eec15f26251/setuptools-65.6.3-py3-none-any.whl",
- "archive_info": {
- "hash": "sha256=57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54",
- "hashes": {
- "sha256": "57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54"
- }
- }
- },
- "is_direct": false,
- "is_yanked": false,
- "requested": true,
- "metadata": {
- "metadata_version": "2.1",
- "name": "setuptools",
- "version": "65.6.3",
- "summary": "Easily download, build, install, upgrade, and uninstall Python packages",
- "description": ".. image:: https://img.shields.io/pypi/v/setuptools.svg\n :target: https://pypi.org/project/setuptools\n\n.. image:: https://img.shields.io/pypi/pyversions/setuptools.svg\n\n.. image:: https://github.com/pypa/setuptools/workflows/tests/badge.svg\n :target: https://github.com/pypa/setuptools/actions?query=workflow%3A%22tests%22\n :alt: tests\n\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n :target: https://github.com/psf/black\n :alt: Code style: Black\n\n.. image:: https://img.shields.io/readthedocs/setuptools/latest.svg\n :target: https://setuptools.pypa.io\n\n.. image:: https://img.shields.io/badge/skeleton-2022-informational\n :target: https://blog.jaraco.com/skeleton\n\n.. image:: https://img.shields.io/codecov/c/github/pypa/setuptools/master.svg?logo=codecov&logoColor=white\n :target: https://codecov.io/gh/pypa/setuptools\n\n.. image:: https://tidelift.com/badges/github/pypa/setuptools?style=flat\n :target: https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=readme\n\n.. image:: https://img.shields.io/discord/803025117553754132\n :target: https://discord.com/channels/803025117553754132/815945031150993468\n :alt: Discord\n\nSee the `Installation Instructions\n<https://packaging.python.org/installing/>`_ in the Python Packaging\nUser's Guide for instructions on installing, upgrading, and uninstalling\nSetuptools.\n\nQuestions and comments should be directed to `GitHub Discussions\n<https://github.com/pypa/setuptools/discussions>`_.\nBug reports and especially tested patches may be\nsubmitted directly to the `bug tracker\n<https://github.com/pypa/setuptools/issues>`_.\n\n\nCode of Conduct\n===============\n\nEveryone interacting in the setuptools project's codebases, issue trackers,\nchat rooms, and fora is expected to follow the\n`PSF Code of Conduct <https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md>`_.\n\n\nFor Enterprise\n==============\n\nAvailable as part of the Tidelift Subscription.\n\nSetuptools and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use.\n\n`Learn more <https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=referral&utm_campaign=github>`_.\n\n\nSecurity Contact\n================\n\nTo report a security vulnerability, please use the\n`Tidelift security contact <https://tidelift.com/security>`_.\nTidelift will coordinate the fix and disclosure.\n",
- "keywords": [
- "CPAN",
- "PyPI",
- "distutils",
- "eggs",
- "package",
- "management"
- ],
- "home_page": "https://github.com/pypa/setuptools",
- "author": "Python Packaging Authority",
- "author_email": "distutils-sig@python.org",
- "classifier": [
- "Development Status :: 5 - Production/Stable",
- "Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- "Topic :: Software Development :: Libraries :: Python Modules",
- "Topic :: System :: Archiving :: Packaging",
- "Topic :: System :: Systems Administration",
- "Topic :: Utilities"
- ],
- "requires_dist": [
- "sphinx (>=3.5) ; extra == 'docs'",
- "jaraco.packaging (>=9) ; extra == 'docs'",
- "rst.linker (>=1.9) ; extra == 'docs'",
- "furo ; extra == 'docs'",
- "jaraco.tidelift (>=1.4) ; extra == 'docs'",
- "pygments-github-lexers (==0.0.5) ; extra == 'docs'",
- "sphinx-favicon ; extra == 'docs'",
- "sphinx-inline-tabs ; extra == 'docs'",
- "sphinx-reredirects ; extra == 'docs'",
- "sphinxcontrib-towncrier ; extra == 'docs'",
- "sphinx-notfound-page (==0.8.3) ; extra == 'docs'",
- "sphinx-hoverxref (<2) ; extra == 'docs'",
- "pytest (>=6) ; extra == 'testing'",
- "pytest-checkdocs (>=2.4) ; extra == 'testing'",
- "pytest-flake8 ; extra == 'testing'",
- "flake8 (<5) ; extra == 'testing'",
- "pytest-enabler (>=1.3) ; extra == 'testing'",
- "pytest-perf ; extra == 'testing'",
- "flake8-2020 ; extra == 'testing'",
- "virtualenv (>=13.0.0) ; extra == 'testing'",
- "wheel ; extra == 'testing'",
- "pip (>=19.1) ; extra == 'testing'",
- "jaraco.envs (>=2.2) ; extra == 'testing'",
- "pytest-xdist ; extra == 'testing'",
- "jaraco.path (>=3.2.0) ; extra == 'testing'",
- "build[virtualenv] ; extra == 'testing'",
- "filelock (>=3.4.0) ; extra == 'testing'",
- "pip-run (>=8.8) ; extra == 'testing'",
- "ini2toml[lite] (>=0.9) ; extra == 'testing'",
- "tomli-w (>=1.0.0) ; extra == 'testing'",
- "pytest-timeout ; extra == 'testing'",
- "pytest ; extra == 'testing-integration'",
- "pytest-xdist ; extra == 'testing-integration'",
- "pytest-enabler ; extra == 'testing-integration'",
- "virtualenv (>=13.0.0) ; extra == 'testing-integration'",
- "tomli ; extra == 'testing-integration'",
- "wheel ; extra == 'testing-integration'",
- "jaraco.path (>=3.2.0) ; extra == 'testing-integration'",
- "jaraco.envs (>=2.2) ; extra == 'testing-integration'",
- "build[virtualenv] ; extra == 'testing-integration'",
- "filelock (>=3.4.0) ; extra == 'testing-integration'",
- "pytest-black (>=0.3.7) ; (platform_python_implementation != \"PyPy\") and extra == 'testing'",
- "pytest-cov ; (platform_python_implementation != \"PyPy\") and extra == 'testing'",
- "pytest-mypy (>=0.9.1) ; (platform_python_implementation != \"PyPy\") and extra == 'testing'"
- ],
- "requires_python": ">=3.7",
- "project_url": [
- "Documentation, https://setuptools.pypa.io/",
- "Changelog, https://setuptools.pypa.io/en/stable/history.html"
- ],
- "provides_extra": [
- "certs",
- "docs",
- "ssl",
- "testing",
- "testing-integration"
- ]
- }
- }
- ],
- "environment": {
- "implementation_name": "cpython",
- "implementation_version": "3.11.5",
- "os_name": "posix",
- "platform_machine": "x86_64",
- "platform_release": "6.5.8-arch1-1",
- "platform_system": "Linux",
- "platform_version": "#1 SMP PREEMPT_DYNAMIC Thu, 19 Oct 2023 22:52:14 +0000",
- "python_full_version": "3.11.5",
- "platform_python_implementation": "CPython",
- "python_version": "3.11",
- "sys_platform": "linux"
- }
-}
-Would install Babel-2.13.1 ConfigUpdater-3.1.1 Deprecated-1.2.14 Flask-2.2.5 Flask-AppBuilder-4.3.6 Flask-Babel-2.0.0 Flask-Caching-2.1.0 Flask-JWT-Extended-4.5.3 Flask-Limiter-3.5.0 Flask-Login-0.6.2 Flask-SQLAlchemy-2.5.1 Flask-Session-0.5.0 Flask-WTF-1.2.1 Jinja2-3.1.2 Mako-1.2.4 Markdown-3.5 MarkupSafe-2.1.3 PyJWT-2.8.0 PyYAML-6.0 Pygments-2.16.1 SQLAlchemy-1.4.49 SQLAlchemy-JSONField-1.0.1.post0 SQLAlchemy-Utils-0.41.1 WTForms-3.1.0 Werkzeug-2.2.3 alembic-1.12.0 annotated-types-0.6.0 anyio-4.0.0 apache-airflow-2.7.2 apache-airflow-providers-common-sql-1.8.0 apache-airflow-providers-ftp-3.6.0 apache-airflow-providers-http-2.0.0 apache-airflow-providers-imap-3.4.0 apache-airflow-providers-sqlite-3.5.0 apispec-6.3.0 argcomplete-3.1.2 asgiref-3.7.2 attrs-23.1.0 backoff-2.2.1 blinker-1.6.3 cachelib-0.9.0 cattrs-23.1.2 certifi-2022.12.7 cffi-1.16.0 chardet-4.0.0 click-8.1.7 clickclick-20.10.2 colorama-0.4.6 colorlog-4.8.0 connexion-2.14.2 cron-descriptor-1.4.0 croniter-2.0.1 cryptography-41.0.4 dill-0.3.7 dnspython-2.4.2 docutils-0.20.1 email-validator-1.3.1 exceptiongroup-1.1.3 google-re2-1.1 googleapis-common-protos-1.61.0 graphviz-0.20.1 greenlet-3.0.0 grpcio-1.59.0 gunicorn-21.2.0 h11-0.14.0 httpcore-0.18.0 httpx-0.25.0 idna-2.10 importlib-metadata-6.8.0 importlib-resources-6.1.0 inflection-0.5.1 itsdangerous-2.1.2 jsonschema-4.19.1 jsonschema-specifications-2023.7.1 lazy-object-proxy-1.9.0 limits-3.6.0 linkify-it-py-2.0.2 lockfile-0.12.2 markdown-it-py-3.0.0 marshmallow-3.20.1 marshmallow-oneofschema-3.0.1 marshmallow-sqlalchemy-0.26.1 mdit-py-plugins-0.4.0 mdurl-0.1.2 opentelemetry-api-1.20.0 opentelemetry-exporter-otlp-1.20.0 opentelemetry-exporter-otlp-proto-common-1.20.0 opentelemetry-exporter-otlp-proto-grpc-1.20.0 opentelemetry-exporter-otlp-proto-http-1.20.0 opentelemetry-proto-1.20.0 opentelemetry-sdk-1.20.0 opentelemetry-semantic-conventions-0.41b0 ordered-set-4.1.0 packaging-23.2 pathspec-0.10.3 pendulum-2.1.2 pluggy-1.3.0 prison-0.2.1 protobuf-4.24.4 psutil-5.9.6 pycparser-2.21 pydantic-2.4.2 pydantic_core-2.10.1 python-daemon-3.0.1 python-dateutil-2.8.2 python-magic-0.4.27 python-nvd3-0.15.0 python-slugify-8.0.1 pytz-2023.3.post1 pytzdata-2020.1 referencing-0.30.2 requests-2.25.1 rfc3339-validator-0.1.4 rich-13.6.0 rich-argparse-1.4.0 rpds-py-0.10.6 s3cmd-2.1.0 setproctitle-1.3.3 setuptools-65.6.3 six-1.16.0 sniffio-1.3.0 sqlparse-0.4.4 tabulate-0.9.0 tenacity-8.2.3 termcolor-2.3.0 text-unidecode-1.3 typing_extensions-4.8.0 uc-micro-py-1.0.2 unicodecsv-0.14.1 urllib3-1.26.18 wrapt-1.15.0 yamllint-1.28.0 zipp-3.17.0