This commit is contained in:
2025-08-27 21:11:48 +08:00
parent fe77c5869e
commit 695ec0b000
2490 changed files with 458653 additions and 11 deletions

View File

@@ -0,0 +1,19 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredPackages">
<value>
<list size="6">
<item index="0" class="java.lang.String" itemvalue="uwsgi" />
<item index="1" class="java.lang.String" itemvalue="mysqlclient" />
<item index="2" class="java.lang.String" itemvalue="greenlet" />
<item index="3" class="java.lang.String" itemvalue="uWSGI" />
<item index="4" class="java.lang.String" itemvalue="urllib3" />
<item index="5" class="java.lang.String" itemvalue="Jinja2" />
</list>
</value>
</option>
</inspection_tool>
</profile>
</component>

View File

@@ -0,0 +1 @@
pip

View File

@@ -0,0 +1,28 @@
Copyright 2010 Pallets
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@@ -0,0 +1,134 @@
Metadata-Version: 2.1
Name: Flask
Version: 1.1.1
Summary: A simple framework for building complex web applications.
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
Project-URL: Documentation, https://flask.palletsprojects.com/
Project-URL: Code, https://github.com/pallets/flask
Project-URL: Issue tracker, https://github.com/pallets/flask/issues
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Framework :: Flask
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*
Requires-Dist: Werkzeug (>=0.15)
Requires-Dist: Jinja2 (>=2.10.1)
Requires-Dist: itsdangerous (>=0.24)
Requires-Dist: click (>=5.1)
Provides-Extra: dev
Requires-Dist: pytest ; extra == 'dev'
Requires-Dist: coverage ; extra == 'dev'
Requires-Dist: tox ; extra == 'dev'
Requires-Dist: sphinx ; extra == 'dev'
Requires-Dist: pallets-sphinx-themes ; extra == 'dev'
Requires-Dist: sphinxcontrib-log-cabinet ; extra == 'dev'
Requires-Dist: sphinx-issues ; extra == 'dev'
Provides-Extra: docs
Requires-Dist: sphinx ; extra == 'docs'
Requires-Dist: pallets-sphinx-themes ; extra == 'docs'
Requires-Dist: sphinxcontrib-log-cabinet ; extra == 'docs'
Requires-Dist: sphinx-issues ; extra == 'docs'
Provides-Extra: dotenv
Requires-Dist: python-dotenv ; extra == 'dotenv'
Flask
=====
Flask is a lightweight `WSGI`_ web application framework. It is designed
to make getting started quick and easy, with the ability to scale up to
complex applications. It began as a simple wrapper around `Werkzeug`_
and `Jinja`_ and has become one of the most popular Python web
application frameworks.
Flask offers suggestions, but doesn't enforce any dependencies or
project layout. It is up to the developer to choose the tools and
libraries they want to use. There are many extensions provided by the
community that make adding new functionality easy.
Installing
----------
Install and update using `pip`_:
.. code-block:: text
pip install -U Flask
A Simple Example
----------------
.. code-block:: python
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, World!"
.. code-block:: text
$ env FLASK_APP=hello.py flask run
* Serving Flask app "hello"
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Contributing
------------
For guidance on setting up a development environment and how to make a
contribution to Flask, see the `contributing guidelines`_.
.. _contributing guidelines: https://github.com/pallets/flask/blob/master/CONTRIBUTING.rst
Donate
------
The Pallets organization develops and supports Flask and the libraries
it uses. In order to grow the community of contributors and users, and
allow the maintainers to devote more time to the projects, `please
donate today`_.
.. _please donate today: https://psfmember.org/civicrm/contribute/transact?reset=1&id=20
Links
-----
* Website: https://palletsprojects.com/p/flask/
* Documentation: https://flask.palletsprojects.com/
* Releases: https://pypi.org/project/Flask/
* Code: https://github.com/pallets/flask
* Issue tracker: https://github.com/pallets/flask/issues
* Test status: https://dev.azure.com/pallets/flask/_build
* Official chat: https://discord.gg/t6rrQZH
.. _WSGI: https://wsgi.readthedocs.io
.. _Werkzeug: https://www.palletsprojects.com/p/werkzeug/
.. _Jinja: https://www.palletsprojects.com/p/jinja/
.. _pip: https://pip.pypa.io/en/stable/quickstart/

View File

@@ -0,0 +1,49 @@
../../Scripts/flask.exe,sha256=R126p3UndEVjfv4JfBttof72Qq-XigXuM0EZkv7ImVI,108384
Flask-1.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
Flask-1.1.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475
Flask-1.1.1.dist-info/METADATA,sha256=Ht4R6TpTKOaXOmmQHhEF3A0Obpzde2Ai0kzNdu6-VWQ,4400
Flask-1.1.1.dist-info/RECORD,,
Flask-1.1.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
Flask-1.1.1.dist-info/WHEEL,sha256=h_aVn5OB2IERUjMbi2pucmR_zzWJtk303YXvhh60NJ8,110
Flask-1.1.1.dist-info/entry_points.txt,sha256=gBLA1aKg0OYR8AhbAfg8lnburHtKcgJLDU52BBctN0k,42
Flask-1.1.1.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6
flask/__init__.py,sha256=qaBW4gy9Xxmdc3ygYO0_H214H1VpF7fq8xRR4XbqRjE,1894
flask/__main__.py,sha256=fjVtt3QTANXlpJCOv3Ha7d5H-76MwzSIOab7SFD9TEk,254
flask/__pycache__/__init__.cpython-312.pyc,,
flask/__pycache__/__main__.cpython-312.pyc,,
flask/__pycache__/_compat.cpython-312.pyc,,
flask/__pycache__/app.cpython-312.pyc,,
flask/__pycache__/blueprints.cpython-312.pyc,,
flask/__pycache__/cli.cpython-312.pyc,,
flask/__pycache__/config.cpython-312.pyc,,
flask/__pycache__/ctx.cpython-312.pyc,,
flask/__pycache__/debughelpers.cpython-312.pyc,,
flask/__pycache__/globals.cpython-312.pyc,,
flask/__pycache__/helpers.cpython-312.pyc,,
flask/__pycache__/logging.cpython-312.pyc,,
flask/__pycache__/sessions.cpython-312.pyc,,
flask/__pycache__/signals.cpython-312.pyc,,
flask/__pycache__/templating.cpython-312.pyc,,
flask/__pycache__/testing.cpython-312.pyc,,
flask/__pycache__/views.cpython-312.pyc,,
flask/__pycache__/wrappers.cpython-312.pyc,,
flask/_compat.py,sha256=8KPT54Iig96TuLipdogLRHNYToIcg-xPhnSV5VRERnw,4099
flask/app.py,sha256=gLZInxueeQ9dkBo1wrntZ-bZqiDT4rYxy_AQ1xraFDc,98066
flask/blueprints.py,sha256=vkdm8NusGsfZUeIfPdCluj733QFmiQcT4Sk1tuZLUjw,21400
flask/cli.py,sha256=_WhPG1bggNdrP0QO95Vex6VJpDqTsVK0z54Y5poljKU,30933
flask/config.py,sha256=3dejvQRYfNHw_V7dCLMxU8UNFpL34xIKemN7gHZIZ8Y,10052
flask/ctx.py,sha256=cks-omGedkxawHFo6bKIrdOHsJCAgg1i_NWw_htxb5U,16724
flask/debughelpers.py,sha256=-whvPKuAoU8AZ9c1z_INuOeBgfYDqE1J2xNBsoriugU,6475
flask/globals.py,sha256=OgcHb6_NCyX6-TldciOdKcyj4PNfyQwClxdMhvov6aA,1637
flask/helpers.py,sha256=x2Pa85R5dV6uA5f5423JTb6x4u6ZaMGf8sfosUZ76dQ,43004
flask/json/__init__.py,sha256=6nITbZYiYOPB8Qfi1-dvsblwn01KRz8VOsMBIZyaYek,11988
flask/json/__pycache__/__init__.cpython-312.pyc,,
flask/json/__pycache__/tag.cpython-312.pyc,,
flask/json/tag.py,sha256=vq9GOllg_0kTWKuVFrwmkeOQzR-jdBD23x-89JyCCQI,8306
flask/logging.py,sha256=WcY5UkqTysGfmosyygSlXyZYGwOp3y-VsE6ehoJ48dk,3250
flask/sessions.py,sha256=G0KsEkr_i1LG_wOINwFSOW3ts7Xbv4bNgEZKc7TRloc,14360
flask/signals.py,sha256=yYLOed2x8WnQ7pirGalQYfpYpCILJ0LJhmNSrnWvjqw,2212
flask/templating.py,sha256=F8E_IZXn9BGsjMzUJ5N_ACMyZdiFBp_SSEaUunvfZ7g,4939
flask/testing.py,sha256=b0QaEejx0UcXqfSFP43k5W57bTVeDyrNK3uPD8JUpCk,10146
flask/views.py,sha256=eeWnadLAj0QdQPLtjKipDetRZyG62CT2y7fNOFDJz0g,5802
flask/wrappers.py,sha256=kgsvtZuMM6RQaDqhRbc5Pcj9vqTnaERl2pmXcdGL7LU,4736

View File

@@ -0,0 +1,6 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.33.4)
Root-Is-Purelib: true
Tag: py2-none-any
Tag: py3-none-any

View File

@@ -0,0 +1,3 @@
[console_scripts]
flask = flask.cli:main

View File

@@ -0,0 +1 @@
flask

View File

@@ -0,0 +1,27 @@
Copyright (c) Rob Hudson and individual contributors.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of Django nor the names of its contributors may be used
to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@@ -0,0 +1,76 @@
Metadata-Version: 2.1
Name: Flask-DebugToolbar
Version: 0.13.1
Summary: A toolbar overlay for debugging Flask applications.
Home-page: https://github.com/flask-debugtoolbar/flask-debugtoolbar
Author: Michael van Tellingen
Author-email: michaelvantellingen@gmail.com
Maintainer: Matt Good
Maintainer-email: matt@matt-good.net
License: UNKNOWN
Project-URL: Changelog, https://github.com/flask-debugtoolbar/flask-debugtoolbar/blob/master/CHANGES.rst
Project-URL: Documentation, https://flask-debugtoolbar.readthedocs.io/
Keywords: flask,debug,toolbar
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Web Environment
Classifier: Framework :: Flask
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=2.7
Description-Content-Type: text/x-rst
License-File: LICENSE
Requires-Dist: Flask (>=0.8)
Requires-Dist: Blinker
Requires-Dist: itsdangerous
Requires-Dist: werkzeug
Flask Debug-toolbar
===================
This is a port of the excellent `django-debug-toolbar <https://github.com/django-debug-toolbar/django-debug-toolbar>`_
for Flask applications.
.. image:: https://travis-ci.org/flask-debugtoolbar/flask-debugtoolbar.png?branch=master
:target: https://travis-ci.org/flask-debugtoolbar/flask-debugtoolbar
Installation
------------
Installing is simple with pip::
$ pip install flask-debugtoolbar
Usage
-----
Setting up the debug toolbar is simple::
from flask import Flask
from flask_debugtoolbar import DebugToolbarExtension
app = Flask(__name__)
# the toolbar is only enabled in debug mode:
app.debug = True
# set a 'SECRET_KEY' to enable the Flask session cookies
app.config['SECRET_KEY'] = '<replace with a secret key>'
toolbar = DebugToolbarExtension(app)
The toolbar will automatically be injected into Jinja templates when debug mode is on.
In production, setting ``app.debug = False`` will disable the toolbar.
See the `documentation`_ for more information.
.. _documentation: https://flask-debugtoolbar.readthedocs.io/

View File

@@ -0,0 +1,201 @@
Flask_DebugToolbar-0.13.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
Flask_DebugToolbar-0.13.1.dist-info/LICENSE,sha256=POJDLyHOgE_zUE4FHPlUtp9iPRvML6keKW5gBp5ojJc,1542
Flask_DebugToolbar-0.13.1.dist-info/METADATA,sha256=i6CIVWLODBWWNgTb4xZ6TVlnPYwJ5hYkoN9MG9lR4tU,2312
Flask_DebugToolbar-0.13.1.dist-info/RECORD,,
Flask_DebugToolbar-0.13.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
Flask_DebugToolbar-0.13.1.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
Flask_DebugToolbar-0.13.1.dist-info/top_level.txt,sha256=q_rGzSvh4On1p6rOCXTE2RZECzuunUC7vpqYKrA9pZU,19
flask_debugtoolbar/__init__.py,sha256=TIbE0tVKlgT0Lbfp56M9poognWetaKbk9TMITVMzaio,9337
flask_debugtoolbar/__pycache__/__init__.cpython-312.pyc,,
flask_debugtoolbar/__pycache__/compat.cpython-312.pyc,,
flask_debugtoolbar/__pycache__/toolbar.cpython-312.pyc,,
flask_debugtoolbar/__pycache__/utils.cpython-312.pyc,,
flask_debugtoolbar/compat.py,sha256=V8GTKyTeNSVyGw2yv3Va6qFGiu11L9evvH8bi7Tmnm0,141
flask_debugtoolbar/panels/__init__.py,sha256=w9Q4rhvdT2G7C6DTRXKcgbWjizdF-mmcMpXFcxqPesI,1524
flask_debugtoolbar/panels/__pycache__/__init__.cpython-312.pyc,,
flask_debugtoolbar/panels/__pycache__/config_vars.cpython-312.pyc,,
flask_debugtoolbar/panels/__pycache__/g.cpython-312.pyc,,
flask_debugtoolbar/panels/__pycache__/headers.cpython-312.pyc,,
flask_debugtoolbar/panels/__pycache__/logger.cpython-312.pyc,,
flask_debugtoolbar/panels/__pycache__/profiler.cpython-312.pyc,,
flask_debugtoolbar/panels/__pycache__/request_vars.cpython-312.pyc,,
flask_debugtoolbar/panels/__pycache__/route_list.cpython-312.pyc,,
flask_debugtoolbar/panels/__pycache__/sqlalchemy.cpython-312.pyc,,
flask_debugtoolbar/panels/__pycache__/template.cpython-312.pyc,,
flask_debugtoolbar/panels/__pycache__/timer.cpython-312.pyc,,
flask_debugtoolbar/panels/__pycache__/versions.cpython-312.pyc,,
flask_debugtoolbar/panels/config_vars.py,sha256=bekytuj6V-FdfVK46rPzUzGpQ_H5cx6OOPDKsg1FCAo,607
flask_debugtoolbar/panels/g.py,sha256=bWhQRA_nc7nqoHHgmwzmQUMCUV8n3kWa1ae60f1un5s,555
flask_debugtoolbar/panels/headers.py,sha256=FrsaTwDNowsrsuuFyjV2Q9bgv2E_gY8y3gOc8Yyhu74,1317
flask_debugtoolbar/panels/logger.py,sha256=VDtnvi5vANrZItQZby4hQozFCmqKS_mrGt2tTjNEc1s,3262
flask_debugtoolbar/panels/profiler.py,sha256=Wb3smAcpRfvol6zd-n8B6kq8nsXiSsOz5GhLOLEm8y4,3583
flask_debugtoolbar/panels/request_vars.py,sha256=OLe9eKQ9Ljuer5SQqXcEABKa6VHZcCwskYbXE2Qakzk,1385
flask_debugtoolbar/panels/route_list.py,sha256=CNiEpDN-vStFcAU7ld5qdk8zG_17GBtgMOCDdTkMlB8,875
flask_debugtoolbar/panels/sqlalchemy.py,sha256=PhSdFB5MfljoG-GcLFasKLjLXCq6nF6NhwbP2pKZo0g,4029
flask_debugtoolbar/panels/template.py,sha256=443H0Hk8Z3ck61Z-06GQXrRj5xxxHZQhgLb4dVLRIC0,3870
flask_debugtoolbar/panels/timer.py,sha256=oX9RRimNK-HOoPklb7a2th5GfKo8jTUfwS1VEKsOv3Q,3282
flask_debugtoolbar/panels/versions.py,sha256=uR0-4GZ8Bsm-p1tJwYAsZ6pFn5NzT8u9lZUZmNy3oyE,1259
flask_debugtoolbar/static/codemirror/codemirror.css,sha256=bkYX-TCq6l5mBoZ0EKmhr60gnZ-BYfXO4Vm4Obfg4C0,2980
flask_debugtoolbar/static/codemirror/codemirror.js,sha256=iE3QiP1Z3VpUJRMIAktJuzJ7FYwRaLb9HxV_Te-vBnI,121448
flask_debugtoolbar/static/codemirror/mode/clike/clike.js,sha256=brdvEhN56fviSqdf7AeHCrV-uHUVhumjvtkhawMlYu0,8404
flask_debugtoolbar/static/codemirror/mode/clike/index.html,sha256=abGTCs97DnVpiiofmsBOkA3FfLYHo3tM4l326O8hBV8,3054
flask_debugtoolbar/static/codemirror/mode/clojure/clojure.js,sha256=2DZptIXjW-szaWtA3BY0V-V9q_esxZdD9CaF91_1aYM,12435
flask_debugtoolbar/static/codemirror/mode/clojure/index.html,sha256=fw2RYivQZAyoCpY8qt_euz0fWcOFc410gl9jd8S9QfE,1981
flask_debugtoolbar/static/codemirror/mode/coffeescript/LICENSE,sha256=m_yh8wN8Qv-na2F0nA4Ewq2ioFM2DBwIDoCSxTpp2s8,1151
flask_debugtoolbar/static/codemirror/mode/coffeescript/coffeescript.js,sha256=zOKBuJr-Fw6CH69YCOwIxWAfApt_2QgiFfXHSztkwt8,10731
flask_debugtoolbar/static/codemirror/mode/coffeescript/index.html,sha256=im_fzK1d1OAxzzJXyIlUGf509JgR6xgvMqBTJKrtQIc,21995
flask_debugtoolbar/static/codemirror/mode/css/css.js,sha256=WMRr23af66tQQrFfAPmAeasrray5OwMkCULFJq3JSjU,3646
flask_debugtoolbar/static/codemirror/mode/css/index.html,sha256=JS-89nIc33LgVgDB6gaBlPdhNw-BRUlom9zTW_-ZNiM,1051
flask_debugtoolbar/static/codemirror/mode/diff/diff.css,sha256=X6j4F-niK_XSlnI-Z_31FLuHKPZidrFPgOUUPqDjdok,89
flask_debugtoolbar/static/codemirror/mode/diff/diff.js,sha256=FGJQBA9A1PNpHrnWsvONE4Vx60KhVUFjdYAYZYydozw,316
flask_debugtoolbar/static/codemirror/mode/diff/index.html,sha256=GSuhTbDRFC8SueAMGDBBtbUcsTsfwh4w3VFdNOERPwk,3860
flask_debugtoolbar/static/codemirror/mode/ecl/ecl.js,sha256=CP3rL5tafopXR5XVZCat-fkYyamxxtq4iXWcjh-o4XY,8721
flask_debugtoolbar/static/codemirror/mode/ecl/index.html,sha256=HNyF0nnr1wDtgqe0u2VP2GnWMgARaQalyVrbPEbjqhA,1164
flask_debugtoolbar/static/codemirror/mode/gfm/gfm.js,sha256=1RtCItYtflLcOLo_I7kfHqZ6kbafAOtEeDoUR-5B5O0,3023
flask_debugtoolbar/static/codemirror/mode/gfm/index.html,sha256=cm6tllLtuab0JHjpqGt5Ck4YL8hk4C0SZXkPgR3QjiE,1297
flask_debugtoolbar/static/codemirror/mode/go/go.js,sha256=XkYVU0H93KA-qwZAe0dSImeZlb1C7TZrcM0YzeqPVxg,5471
flask_debugtoolbar/static/codemirror/mode/go/index.html,sha256=34va1l2MZm8r0R0oww2u-76hs9P_68ykt_K4sScWtRA,1765
flask_debugtoolbar/static/codemirror/mode/groovy/groovy.js,sha256=6ESI4OzA5uHAfQZRiR5fDfCQ-X-JmBq8sZuyyGx0A30,7154
flask_debugtoolbar/static/codemirror/mode/groovy/index.html,sha256=J9s6mCxOTBmD7_TGxjkO7ZSI-p7oQwIlsVZbA5bDSco,1760
flask_debugtoolbar/static/codemirror/mode/haskell/haskell.js,sha256=R2plUYPJYl_wQ3Qcquobt-4sHnsGTg4M1uzTK2Qu74Q,7478
flask_debugtoolbar/static/codemirror/mode/haskell/index.html,sha256=iwiovq5jH6kKh_9VtNNT-W4eB8lvaVEEUrKIaBSZycs,1780
flask_debugtoolbar/static/codemirror/mode/htmlembedded/htmlembedded.js,sha256=DpDzRY299hGAnYuFOj5li4p3xK8HIQBjjZjSRqedqws,2280
flask_debugtoolbar/static/codemirror/mode/htmlembedded/index.html,sha256=ev6GGuhm5teOn8BthM0U9RT8sve9Y9zshNnuvfTWlp0,1703
flask_debugtoolbar/static/codemirror/mode/htmlmixed/htmlmixed.js,sha256=4XE7EOp59ckmYx0cVQ4jTD_HzVUOU0Ox6x5PdF6-SIg,2839
flask_debugtoolbar/static/codemirror/mode/htmlmixed/index.html,sha256=rpKtyGaHdO02M4ewZX-itfTAo8aBqOG4MUu7tv3qBj0,1558
flask_debugtoolbar/static/codemirror/mode/javascript/index.html,sha256=iWdVgOQ2Ft3sdM21ZYjqyW15tdpbmw41Ld-Qk4RDZH0,2539
flask_debugtoolbar/static/codemirror/mode/javascript/javascript.js,sha256=hjMGL1qMJzpD9sEyGCnxU3WVFdYecWhL30zrPP-saIs,12693
flask_debugtoolbar/static/codemirror/mode/jinja2/index.html,sha256=H6FIH0FQlyk740cf-MwkInW2dK5asCosTRm4pMo5KjI,1040
flask_debugtoolbar/static/codemirror/mode/jinja2/jinja2.js,sha256=ZqD0FS3vQ4v22ZYDaFoShyQlBY2Zg_9TBJomJEwquJo,1909
flask_debugtoolbar/static/codemirror/mode/less/index.html,sha256=CxPTi98vf7a9oSFCiNKlWEVpD-t1CenQUM2lsvnY5yo,14320
flask_debugtoolbar/static/codemirror/mode/less/less.js,sha256=f1jb3XJzXPQl1Lz5PUBuuJG4NNa8_guC6dMzjLiX-c8,8250
flask_debugtoolbar/static/codemirror/mode/lua/index.html,sha256=teZp1ofzRK1ekG7Y8RIrtavEDmPINOIT5aMp7lYfygE,1693
flask_debugtoolbar/static/codemirror/mode/lua/lua.js,sha256=MlUvdPpWVY6txJ--nbXHx4kYDoTtsUQtVscDIM1_PNs,5347
flask_debugtoolbar/static/codemirror/mode/markdown/index.html,sha256=16H0fTmSn_QR3HMRFPNvohCAiprwRVSJxAwUq_XQMuQ,9858
flask_debugtoolbar/static/codemirror/mode/markdown/markdown.js,sha256=Z1n6Cz_jWvfddISeK7SIc-0BjdNmQ2hmH3_Pe2S6I5U,6140
flask_debugtoolbar/static/codemirror/mode/mysql/index.html,sha256=dC_UjQHwJSWLt28AXaoPLrhpOy-FuCpY-FDs0VNIWZw,1132
flask_debugtoolbar/static/codemirror/mode/mysql/mysql.js,sha256=sQCxdi8Bb3foTUM9hzK01-tBEqYBYMUnSZJyZ8vw-Qw,7776
flask_debugtoolbar/static/codemirror/mode/ntriples/index.html,sha256=vLTYbYBNVBg0OCa7kRAyzrzNY8JzUeuCThEijvdJhkE,998
flask_debugtoolbar/static/codemirror/mode/ntriples/ntriples.js,sha256=TJSNlG54kqicfvbNEF6cgjUB8V9zSokK_Ixvl9QBCdI,6348
flask_debugtoolbar/static/codemirror/mode/pascal/LICENSE,sha256=HsVvHRil2g9SI1PnutXhcwPPia1Ml0dwdtNxa-NnP44,1078
flask_debugtoolbar/static/codemirror/mode/pascal/index.html,sha256=LcrehVl8wNfV4AjsJXfbNS-qV7ABdrulIN89zyaE0cc,1108
flask_debugtoolbar/static/codemirror/mode/pascal/pascal.js,sha256=EJU9fqmHo5Pj7Y4Co-vOQ5oCla5xGGDS0AWf6DgAw9Q,2605
flask_debugtoolbar/static/codemirror/mode/perl/LICENSE,sha256=j24B6yGg6b6hzTpuyA9DwbIzwGUXs-3uARbdnqCMPiY,1094
flask_debugtoolbar/static/codemirror/mode/perl/index.html,sha256=WgFw6DGczZOgx6i5ZRUp4UjkjiQ76nLSdWZa5Idps70,1212
flask_debugtoolbar/static/codemirror/mode/perl/perl.js,sha256=smIzI3r28eP6dCajWrkJm_bzM2sY357aSZUsiXcyc24,29358
flask_debugtoolbar/static/codemirror/mode/php/index.html,sha256=frIia-IV051eJR6XEhj1LQqorr8bpJlMoTm54_vx2y8,1499
flask_debugtoolbar/static/codemirror/mode/php/php.js,sha256=omGuYurj5TcweGLl-kY6Pd8gjR4eK1p2ft0JEAwiAHg,6076
flask_debugtoolbar/static/codemirror/mode/plsql/index.html,sha256=G8V6M4q9f8HWOFZUX3u0dwwMg84qo-_cIVU2ZhurYU8,1553
flask_debugtoolbar/static/codemirror/mode/plsql/plsql.js,sha256=8tnKdcQZJZXOihyzj55EpaWeH7oFJBydWnMQxHNO0yc,8430
flask_debugtoolbar/static/codemirror/mode/properties/index.html,sha256=pQPR-PyCSxoOaGxmVEqWHOQV3dgEZfKEMbylWP6iJNw,1189
flask_debugtoolbar/static/codemirror/mode/properties/properties.js,sha256=bspJdrBR0nk8j04Hs5aUt7OriU75v2mm6LUj2MpSBu8,1734
flask_debugtoolbar/static/codemirror/mode/python/LICENSE.txt,sha256=xtqk6HN9FapxQLT364K51IKb0v0nEyxD4oIgO5xn38Q,1075
flask_debugtoolbar/static/codemirror/mode/python/index.html,sha256=RtCZRHjTtKrOmsmOsTvoUmB_9XzspSUKQe15-u7csDY,2835
flask_debugtoolbar/static/codemirror/mode/python/python.js,sha256=mQ8uMMJ2qsZQisomdyc5pWDlvIJae4WXl9ufh2pV7AU,12178
flask_debugtoolbar/static/codemirror/mode/r/LICENSE,sha256=mwpqtkk74jxHuBUATJbxTL-Pd8VoDA4vsRtp29W-FVw,1486
flask_debugtoolbar/static/codemirror/mode/r/index.html,sha256=ynlk8Hpkbj83XOyL8Gj7BOJaDfQujKHcPDSVxUF5uQc,2263
flask_debugtoolbar/static/codemirror/mode/r/r.js,sha256=XCNEtcSNuS42qDEst3XWVwAHcRuX53yOr5mLeLE2L2I,4936
flask_debugtoolbar/static/codemirror/mode/rpm/changes/changes.js,sha256=4p1Socu0ACxWaz-HKQM54i9dXrUJISBQJR5HJsOk-Hs,654
flask_debugtoolbar/static/codemirror/mode/rpm/changes/index.html,sha256=HyZazY-HnOBHYTMzZW2xuqMxtebNr_BdVVjdZ0AAWpQ,1793
flask_debugtoolbar/static/codemirror/mode/rpm/spec/index.html,sha256=MfNBuS1ivgLSwggFnIG0nnniXqFZSXC4cnDTklkSm7M,3037
flask_debugtoolbar/static/codemirror/mode/rpm/spec/spec.css,sha256=pljBPSn-ly2kpRebOfu4ZOdWx3PwhOO2jA8cl8Hl6Hs,267
flask_debugtoolbar/static/codemirror/mode/rpm/spec/spec.js,sha256=MAPA8AjVpoA3_vPGxnmGD8G_4wQ46NhVZD2Ka9KFWpE,2698
flask_debugtoolbar/static/codemirror/mode/rst/index.html,sha256=fBTY664z7pybd-ZIfHMgJzg2Y-UkEUTNlRlJm1-KQ8M,17578
flask_debugtoolbar/static/codemirror/mode/rst/rst.js,sha256=261gwNq0ll0JRC72Wb4JORQ2fXX22ml4Yw84meuQlZQ,8429
flask_debugtoolbar/static/codemirror/mode/ruby/LICENSE,sha256=X7n9-lCOg2JZND9QmowFpOUY7BT37TQEkWWc9ONkDnM,1487
flask_debugtoolbar/static/codemirror/mode/ruby/index.html,sha256=MTPzJgXQA2bZWawwOFeo1QlN9kT49tmdzQpyX-Xl4-Y,5412
flask_debugtoolbar/static/codemirror/mode/ruby/ruby.js,sha256=I-GQmpvjgqzT03UzZipCQX4yOuFPymLnYEB61lsjVdY,7400
flask_debugtoolbar/static/codemirror/mode/rust/index.html,sha256=KJMqzl2aZ1gW76NekYyaQpE497bAppzKVeKTZawabxA,1071
flask_debugtoolbar/static/codemirror/mode/rust/rust.js,sha256=kWbUSP4ALs8pkeZdP3J4mqLwdVcKpqt13sowq40yVDg,15457
flask_debugtoolbar/static/codemirror/mode/scheme/index.html,sha256=8HSd56RVc0z0b2lznxEpXYFz3PfjCzchk9Z0222tc_8,2198
flask_debugtoolbar/static/codemirror/mode/scheme/scheme.js,sha256=eFo1mjrKfEq2tW8xNwFkiqBHnJYpU8j0FljS3ngF1ng,10562
flask_debugtoolbar/static/codemirror/mode/smalltalk/index.html,sha256=KM9LHkoh5Bxrl1AoPHJSBSJAP5LW-z7HwKgLrmYUpZ0,1484
flask_debugtoolbar/static/codemirror/mode/smalltalk/smalltalk.js,sha256=HTL-xumQPGihbxZR2UzWarBpW8TktA0d71HhdpEG2J0,3448
flask_debugtoolbar/static/codemirror/mode/smarty/index.html,sha256=ROo8f-0oPadhJJ7fSghCsblhkptNOpGB1Dd5_j6F61I,2306
flask_debugtoolbar/static/codemirror/mode/smarty/smarty.js,sha256=NBmbdOuBLhE97ezMfUJyGiCihNt6n_pAXZJ3N7g4f8o,3852
flask_debugtoolbar/static/codemirror/mode/sparql/index.html,sha256=Z7bIpNEeNy-DOE48UWe0lrV8M-JhAF08mE5Uyz1FCyo,1196
flask_debugtoolbar/static/codemirror/mode/sparql/sparql.js,sha256=VX62uWvA8F88NH3yH04KuzXOLJpcIbXTN0bxqGfe56c,4605
flask_debugtoolbar/static/codemirror/mode/stex/index.html,sha256=QkCDnVwf5t_nLofStsk9hkll2Wr6HpDvOvn4kiQ4i_E,3610
flask_debugtoolbar/static/codemirror/mode/stex/stex.js,sha256=0ecm6wJ_Tct5OY4i6hb-0A-iiqiEERYYbzX02OUu48I,4413
flask_debugtoolbar/static/codemirror/mode/stex/test.html,sha256=jNMA74KbtJHjUYxBvKYmTMB68S422Sx2RxmuiJfx7yA,5785
flask_debugtoolbar/static/codemirror/mode/tiddlywiki/index.html,sha256=ua0ycbhcjfcQmqsgyWyK3t6j5r8z-lI5SFNmMg7KyUA,4187
flask_debugtoolbar/static/codemirror/mode/tiddlywiki/tiddlywiki.css,sha256=YxPJLesNx3FgjFhOZDpvpp7w4BgMQerTYYL7HSv7tvQ,840
flask_debugtoolbar/static/codemirror/mode/tiddlywiki/tiddlywiki.js,sha256=NxZDNftQuqiuaz4F0VlO5svM6xitraezDCyRY09nGz0,9500
flask_debugtoolbar/static/codemirror/mode/vbscript/index.html,sha256=dEVpxr4ZVCWUOCd8nNTDmQwG8wLDqQGKrrJUfTcUu2o,1161
flask_debugtoolbar/static/codemirror/mode/vbscript/vbscript.js,sha256=4aIwx1A0rMs4QXnbv3Lp9AZmh_QtECt6FAB5JTsTdzU,867
flask_debugtoolbar/static/codemirror/mode/velocity/index.html,sha256=NZtDev2JPKyny-gsgTc08MfH1KiQvdpKO-Nh70ezwdM,2761
flask_debugtoolbar/static/codemirror/mode/velocity/velocity.js,sha256=mWs5WsO2eSDHKsAFGP9VxWZjqdKH7_ovIeJfutPcj9w,4959
flask_debugtoolbar/static/codemirror/mode/verilog/index.html,sha256=3KWVxJiJ0BayXxYk6di7X5wXXSbeM64hkSg0ymBXqR4,6782
flask_debugtoolbar/static/codemirror/mode/verilog/verilog.js,sha256=8q68ZVbjlRz0DDLg2AWTxCcKDv5YZ4G-2c238Tv6Wjw,6996
flask_debugtoolbar/static/codemirror/mode/xml/index.html,sha256=zlcZJkkmIiYingtQh-diOZwUDYww-Z5BGcA9KhNYjjU,1617
flask_debugtoolbar/static/codemirror/mode/xml/xml.js,sha256=o9O12ycnCdp7q_XMOixDut2fHIWf4RILzLA158tRH9g,7984
flask_debugtoolbar/static/codemirror/mode/xmlpure/index.html,sha256=G1BriqZ753gGXpXAmmDeD1AnYEPYGi8ox3b-Bl69wMA,2332
flask_debugtoolbar/static/codemirror/mode/xmlpure/xmlpure.js,sha256=n1RBJ05iVuiIDg7rviut2wqnhU_RepBDE0KgxAlDgXc,17763
flask_debugtoolbar/static/codemirror/mode/xquery/LICENSE,sha256=K57-OZoMkyOpuTPi0bPcVCM-lBjwviQIrAk3ZoSU-Fc,1109
flask_debugtoolbar/static/codemirror/mode/xquery/index.html,sha256=HECUmptIWHl1x_DSXrhFyOj9wboYXkgoCnLc2HTO6Hw,9447
flask_debugtoolbar/static/codemirror/mode/xquery/test/index.html,sha256=H92OYjzxPy2On740Be5770ZdX7sz4AUJfaRgMz5KO7s,1171
flask_debugtoolbar/static/codemirror/mode/xquery/test/testBase.js,sha256=RXPHsxHZj7hieJWF09Y9LnZOiA82twaKXQ-6pc7Wxtw,6114
flask_debugtoolbar/static/codemirror/mode/xquery/test/testEmptySequenceKeyword.js,sha256=qlOvt1rghAv9zrSRy22fqh-ASWHM6MoRpuo-MlYoDQQ,639
flask_debugtoolbar/static/codemirror/mode/xquery/test/testMultiAttr.js,sha256=ci_26wWVvHWOZNGIEXsBUzQYy7ZflnyQEu62wCAjCX8,789
flask_debugtoolbar/static/codemirror/mode/xquery/test/testNamespaces.js,sha256=RSBSMrxwTBy0G9nf0s3RGoDZNX5q0cBWNQUlZjAkF3M,5494
flask_debugtoolbar/static/codemirror/mode/xquery/test/testProcessingInstructions.js,sha256=ApeHV4ykMjH68Od6OW4avhVET3ZoOClcZl18HNPNl0s,719
flask_debugtoolbar/static/codemirror/mode/xquery/test/testQuotes.js,sha256=9IuYza32NhspvMmpmZhAK9ZvzyhVfqdmyOQwA7R96ts,1070
flask_debugtoolbar/static/codemirror/mode/xquery/xquery.js,sha256=3SLVOG63F2PH09icjBGlffrAcPzN0iUUbLH-FDwnKTI,15976
flask_debugtoolbar/static/codemirror/mode/yaml/index.html,sha256=HRBMWydNdgXUk9Adxkgqv6xaSRwcGZ6A7eK_ShBEOZQ,1744
flask_debugtoolbar/static/codemirror/mode/yaml/yaml.js,sha256=_pvBkh5woQDpWMTHM6ZPBoTudqJUBp71Eo2hk4k7IJk,2677
flask_debugtoolbar/static/codemirror/theme/cobalt.css,sha256=LsuhQUd3LgkeGOLR2qghdq-8MXtpb1IfvYS4J62DfUM,1037
flask_debugtoolbar/static/codemirror/theme/eclipse.css,sha256=08pKU67A0w9FfVoVE-YrAvu-tD2EAMN1j-YqQqeBT1A,1050
flask_debugtoolbar/static/codemirror/theme/elegant.css,sha256=1eLlbADu1jlsgK8KDRtDClABgRnfmrMchSq8zMx5O8k,593
flask_debugtoolbar/static/codemirror/theme/lesser-dark.css,sha256=5yoLXrprW3FH--CR4o1GggpVdYXuL9G4KI_bd-cFTUo,2066
flask_debugtoolbar/static/codemirror/theme/monokai.css,sha256=BberoVQ6eLq9ZE7W1JhhRnNm2rEdyCN1yXBw2_DI0Ik,1151
flask_debugtoolbar/static/codemirror/theme/neat.css,sha256=7uBf7kbbt5QFDlDJA8EYQVVp8TzuXyQl7ReXPJgQIyg,524
flask_debugtoolbar/static/codemirror/theme/night.css,sha256=p9Ss8o0thUhRF2Q8_a_Wet3mW2kpHHRFgDWFrztZT6c,1118
flask_debugtoolbar/static/codemirror/theme/rubyblue.css,sha256=pWe3QoZomcKRVmaG7Dejs1uFkZqqRUBgXakKA6HpKaI,1300
flask_debugtoolbar/static/codemirror/theme/xq-dark.css,sha256=LGLKUKfpI5vJkMqGTIeDQRF5rrlhr_rXhSKkCOLZuBM,2296
flask_debugtoolbar/static/codemirror/util/closetag.js,sha256=55wDULAmej12jt5iNae1JMmnhG871W_NbB4oWHhyJSk,5868
flask_debugtoolbar/static/codemirror/util/dialog.css,sha256=i7347oI_6DFs4UzXxJc4LEtS3ZYr5L2Atff1boHAylU,401
flask_debugtoolbar/static/codemirror/util/dialog.js,sha256=3iaqryr-p6flHe9iwojSx8ap1XCSdZJ8-DqUSYKXRlE,1962
flask_debugtoolbar/static/codemirror/util/foldcode.js,sha256=TpMh0zfBTiC135arTXglSzFVNiF-eLEVunm_PGO2EFs,5950
flask_debugtoolbar/static/codemirror/util/formatting.js,sha256=lhO2G0K3audV7GOQlahKWZPaRrC9ZYfIxBAr7oILK0A,10183
flask_debugtoolbar/static/codemirror/util/javascript-hint.js,sha256=Y_5pEePA6lIQDZUWYROkCBo4_6eRzknzPMn1cp72XYo,5385
flask_debugtoolbar/static/codemirror/util/match-highlighter.js,sha256=eaBDWkG9x5L1_jaUqyhgDQJehcFjmRUfTu54D3hRDDQ,1656
flask_debugtoolbar/static/codemirror/util/overlay.js,sha256=Rv_ZgcC0KwbA0aTmTnARy7eVOg08xpJRAaKA83gQb04,1862
flask_debugtoolbar/static/codemirror/util/runmode.js,sha256=Ho_9Ywb3er-xaBfhkt0J74j0PlM910B8sjqbyU86vRo,1611
flask_debugtoolbar/static/codemirror/util/search.js,sha256=Lr33tCML72uBR8I0qY0LRIM9NG8xj2Da6M7rH9m_RdA,4725
flask_debugtoolbar/static/codemirror/util/searchcursor.js,sha256=B6Zo2Mud4pLU_fMfmAwtIozV7oS-Ec1vOJFlf0M3dd4,4717
flask_debugtoolbar/static/codemirror/util/simple-hint.css,sha256=WvgGdCJ7tQVojADB5xp6JfE6ywCWQFKRQx9eRzlHwQM,368
flask_debugtoolbar/static/codemirror/util/simple-hint.js,sha256=iaK_KRDNjLNPB17mHz3pWmaPzNsfUmzdCZl7UsfU6c4,2943
flask_debugtoolbar/static/css/toolbar.css,sha256=w0PSY4GA5GZIu3Dy9G-BbmTrnStieIjN5KNiIElr3PE,8517
flask_debugtoolbar/static/img/asc.gif,sha256=G_i396_-5n8ZcH01FMVlgF798uWAHqa0GGo77RduGXU,54
flask_debugtoolbar/static/img/back.png,sha256=kTWOX2sb71HebErXqmayprw-dccM2-6ILgwAlFa2Ylc,575
flask_debugtoolbar/static/img/back_hover.png,sha256=Gb8bMaDLITdBEk7R0IODdRyhde6_gbGO_Fx24uGYmLo,614
flask_debugtoolbar/static/img/bg.gif,sha256=QOnCtoj3jAzUPGApjs01P81UdFu26Do_-msPsZ4ZNvs,64
flask_debugtoolbar/static/img/close.png,sha256=5OfEyIQNIKYDjPqgbjCidWxfnwKGbzunmRBU3Jb7Wc8,604
flask_debugtoolbar/static/img/close_hover.png,sha256=lAlfXa33H4YPX9AwmS-R5Fw-jGGOCMvT_nWdovZhVls,711
flask_debugtoolbar/static/img/desc.gif,sha256=2OlhRZBS3GqcpX5YfL2JEFMir2uHy3PRtZ8Oi06kv4E,54
flask_debugtoolbar/static/img/djdt_vertical.png,sha256=oVvjpg4Hrtibzw7t_r_46lm4y055U-n-pRM3-UrIc_0,404
flask_debugtoolbar/static/img/indicator.png,sha256=cX4yuumJ3vF4W6EWWrnPf8gxRX0JaMCKGdQALo00eaM,444
flask_debugtoolbar/static/img/panel_bg.png,sha256=EfP53Fh2E_IvAM_uFKWlD4oC9tDnSKi_W9piH502LlY,70
flask_debugtoolbar/static/img/tick-red.png,sha256=Rvkt4hrTV8tddbAWcMy6BD3IPVkR42kHt-RmZ9uLrQ8,538
flask_debugtoolbar/static/img/tick.png,sha256=r1-pDDWUjDfiioxl9JqZYUqIWf5nAftaV_0QtZa2UzQ,569
flask_debugtoolbar/static/js/jquery.js,sha256=IpJ49qnBwn_FW-xQ8GVI_mTCYp9Z9GLVDKwo5lu5OoM,84362
flask_debugtoolbar/static/js/jquery.tablesorter.js,sha256=jAkZjvxpi2SKGoQHzm3thOKchGGbu_MLWj4ARN4sNWg,40914
flask_debugtoolbar/static/js/toolbar.js,sha256=O5dq00oTbjdq3a904r6ND3VW9zeW9_dyTokBKZoGkOA,7282
flask_debugtoolbar/templates/base.html,sha256=0yB8Z7JscYGq5z_kWk3PHbJU2WbTBbiu8i0HQMxZkEY,2116
flask_debugtoolbar/templates/panels/config_vars.html,sha256=6iBR9fAAbRzd8jNyoSt_VMKHP8Aw3pAJh_zARnBMEhg,398
flask_debugtoolbar/templates/panels/g.html,sha256=MvtUu_rWZMDgt4tcCclvWjQATOodnaATw2s1tYsaR_4,329
flask_debugtoolbar/templates/panels/headers.html,sha256=5yqal2_rYTrvWFP8iGY5XEuxSAAMiFMuD-kvg_uymKE,327
flask_debugtoolbar/templates/panels/logger.html,sha256=MB9RVRRe7ckPv73WXEaV7niRMx-j47K0jCBdqF_XAqU,614
flask_debugtoolbar/templates/panels/profiler.html,sha256=nLka_xQrTeAQd3hIlnkw-7krp-vVG7srT4No4X_S7V8,752
flask_debugtoolbar/templates/panels/request_vars.html,sha256=V36INlPgoChY9nmn3xu-LqkkcKFbTEmkiYwDdy4vQNY,1888
flask_debugtoolbar/templates/panels/route_list.html,sha256=TOqem9K4O27EZ5sGAus1Jxswe8pHqtK6mJUrgljH2xY,646
flask_debugtoolbar/templates/panels/sqlalchemy.html,sha256=yEVNsJhzu6DcsV0q2WA-B7tLGyQhU--1pSKpkEyPgtA,1068
flask_debugtoolbar/templates/panels/sqlalchemy_error.html,sha256=l4qcv1dZVVyfugzBKtJ1B_fB2oKt6FZstIyG3ZmNKoQ,1328
flask_debugtoolbar/templates/panels/sqlalchemy_select.html,sha256=pHHqYm2H_d5s9vVzmRK2dvoSlG-F5GsDIUZvBCultrM,888
flask_debugtoolbar/templates/panels/template.html,sha256=JUiCltvTgZ25TLX7ZnlHeYiNI2gZ45SlxqMrRX8bemk,696
flask_debugtoolbar/templates/panels/template_editor.html,sha256=ekHFOsxy1KG9uv1DNDMCfWH8ZY_swOEdS38XhePWK8c,5984
flask_debugtoolbar/templates/panels/timer.html,sha256=8yaihSVj-pdflILl_6JV3dHW2ruYzHmeDQH5voXxbII,388
flask_debugtoolbar/templates/panels/versions.html,sha256=Mlep0vyo5Bg-kauTr6TFtnBJZKlatj4c_XoCl2dgDrA,716
flask_debugtoolbar/templates/redirect.html,sha256=FZ0U9fkhYPcGSyddNyzkSXlbHnvx0787Lebs77La_cM,575
flask_debugtoolbar/toolbar.py,sha256=a3ORkOPzR-LGdgwG44KI2jHq7J8fimh0wNUTn-W1W0Y,2161
flask_debugtoolbar/utils.py,sha256=jCSDJhFOV3gnlJzeOXfztiv4gV7OnDGlCtKbumKvrLk,2712

View File

@@ -0,0 +1,5 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.37.1)
Root-Is-Purelib: true
Tag: py3-none-any

View File

@@ -0,0 +1 @@
flask_debugtoolbar

View File

@@ -0,0 +1 @@
pip

View File

@@ -0,0 +1,28 @@
Copyright 2010 Pallets
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@@ -0,0 +1,94 @@
Metadata-Version: 2.1
Name: Flask-SQLAlchemy
Version: 2.4.0
Summary: Adds SQLAlchemy support to your Flask application.
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
Project-URL: Documentation, https://flask-sqlalchemy.palletsprojects.com/
Project-URL: Code, https://github.com/pallets/flask-sqlalchemy
Project-URL: Issue tracker, https://github.com/pallets/flask-sqlalchemy/issues
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*
Requires-Dist: Flask (>=0.10)
Requires-Dist: SQLAlchemy (>=0.8.0)
Flask-SQLAlchemy
================
Flask-SQLAlchemy is an extension for `Flask`_ that adds support for
`SQLAlchemy`_ to your application. It aims to simplify using SQLAlchemy
with Flask by providing useful defaults and extra helpers that make it
easier to accomplish common tasks.
Installing
----------
Install and update using `pip`_:
.. code-block:: text
$ pip install -U Flask-SQLAlchemy
A Simple Example
----------------
.. code-block:: python
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///example.sqlite"
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String, unique=True, nullable=False)
email = db.Column(db.String, unique=True, nullable=False)
db.session.add(User(name="Flask", email="example@example.com"))
db.session.commit()
users = User.query.all()
Links
-----
- Documentation: https://flask-sqlalchemy.palletsprojects.com/
- Releases: https://pypi.org/project/Flask-SQLAlchemy/
- Code: https://github.com/pallets/flask-sqlalchemy
- Issue tracker: https://github.com/pallets/flask-sqlalchemy/issues
- Test status: https://travis-ci.org/pallets/flask-sqlalchemy
- Test coverage: https://codecov.io/gh/pallets/flask-sqlalchemy
.. _Flask: https://palletsprojects.com/p/flask/
.. _SQLAlchemy: https://www.sqlalchemy.org
.. _pip: https://pip.pypa.io/en/stable/quickstart/

View File

@@ -0,0 +1,15 @@
Flask_SQLAlchemy-2.4.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
Flask_SQLAlchemy-2.4.0.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475
Flask_SQLAlchemy-2.4.0.dist-info/METADATA,sha256=uvOSlKcGx935ng3QL57DdBnd612KPhCt5dhDX0TBizI,3128
Flask_SQLAlchemy-2.4.0.dist-info/RECORD,,
Flask_SQLAlchemy-2.4.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
Flask_SQLAlchemy-2.4.0.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110
Flask_SQLAlchemy-2.4.0.dist-info/top_level.txt,sha256=w2K4fNNoTh4HItoFfz2FRQShSeLcvHYrzU_sZov21QU,17
flask_sqlalchemy/__init__.py,sha256=8H9-MlSbJjS69CBV8UYNYpDn3EkkU4S3wc7JouFz4eg,39027
flask_sqlalchemy/__pycache__/__init__.cpython-312.pyc,,
flask_sqlalchemy/__pycache__/_compat.cpython-312.pyc,,
flask_sqlalchemy/__pycache__/model.cpython-312.pyc,,
flask_sqlalchemy/__pycache__/utils.cpython-312.pyc,,
flask_sqlalchemy/_compat.py,sha256=yua0ZSgVWwi56QpEgwaPInzkNQ9PFb7YQdvEk3dImXo,821
flask_sqlalchemy/model.py,sha256=7CTvGxxKmLscwcwq9mVT5ny_w301QZvTVjSqMoMx6DI,4974
flask_sqlalchemy/utils.py,sha256=4eHqAbYElnJ3NbSAHhuINckoAHDABoxjleMJD0iKgyg,1390

View File

@@ -0,0 +1,6 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.33.1)
Root-Is-Purelib: true
Tag: py2-none-any
Tag: py3-none-any

View File

@@ -0,0 +1 @@
flask_sqlalchemy

View File

@@ -0,0 +1 @@
pip

View File

@@ -0,0 +1,32 @@
Copyright (c) 2010 by Dan Jacob.
Copyright (c) 2014 by Matthias Urlichs.
Some rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* The names of the contributors may not be used to endorse or
promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@@ -0,0 +1,52 @@
Metadata-Version: 2.2
Name: Flask-Script
Version: 2.0.6
Summary: Scripting support for Flask
Home-page: http://github.com/smurfix/flask-script
Download-URL: https://github.com/smurfix/flask-script/tarball/v2.0.6
Author: Dan Jacob
Author-email: danjac354@gmail.com
Maintainer: Matthias Urlichs
Maintainer-email: matthias@urlichs.de
License: BSD
Platform: any
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Software Development :: Libraries :: Python Modules
License-File: LICENSE
Requires-Dist: Flask
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: download-url
Dynamic: home-page
Dynamic: license
Dynamic: maintainer
Dynamic: maintainer-email
Dynamic: platform
Dynamic: requires-dist
Dynamic: summary
Flask-Script
--------------
Flask support for writing external scripts.
Links
`````
* `documentation <http://flask-script.readthedocs.org>`_

View File

@@ -0,0 +1,15 @@
Flask_Script-2.0.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
Flask_Script-2.0.6.dist-info/LICENSE,sha256=s0RqZm6pkqm3R9AMFYAopr60QsAqh_JQ8isbPIszDCc,1492
Flask_Script-2.0.6.dist-info/METADATA,sha256=17AOHl6uydlGEylKBi33R1tQpEc_9ckyVTFvmSCI-Ns,1506
Flask_Script-2.0.6.dist-info/RECORD,,
Flask_Script-2.0.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
Flask_Script-2.0.6.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
Flask_Script-2.0.6.dist-info/top_level.txt,sha256=jLJ6jJ9Xrc6a6QfLQIDv78qZOaYG2EiFFcV9SVB-fDA,13
flask_script/__init__.py,sha256=K_RSduSOlJM1F8T8AjiUgq_0bg_RYQwqU2wBOS4fjGE,13378
flask_script/__pycache__/__init__.cpython-312.pyc,,
flask_script/__pycache__/_compat.cpython-312.pyc,,
flask_script/__pycache__/cli.cpython-312.pyc,,
flask_script/__pycache__/commands.cpython-312.pyc,,
flask_script/_compat.py,sha256=UzHmvZmCrEHi_JXA35yiwfvsY17fhlqnfbgVhSzFwIo,3151
flask_script/cli.py,sha256=4bRqVID_THVArPVGdYipMBAm_IC85JixO7WRjE54Pyk,2674
flask_script/commands.py,sha256=1-MYFFJsPwy7RnC7lDZgYYrAJn31EANWWUFbxgjOBAQ,20737

View File

@@ -0,0 +1,5 @@
Wheel-Version: 1.0
Generator: setuptools (75.8.0)
Root-Is-Purelib: true
Tag: py3-none-any

View File

@@ -0,0 +1 @@
flask_script

View File

@@ -0,0 +1 @@
pip

View File

@@ -0,0 +1,28 @@
Copyright 2007 Pallets
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@@ -0,0 +1,106 @@
Metadata-Version: 2.1
Name: Jinja2
Version: 2.11.3
Summary: A very fast and expressive template engine.
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
Project-URL: Documentation, https://jinja.palletsprojects.com/
Project-URL: Code, https://github.com/pallets/jinja
Project-URL: Issue tracker, https://github.com/pallets/jinja/issues
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: Text Processing :: Markup :: HTML
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*
Description-Content-Type: text/x-rst
Requires-Dist: MarkupSafe (>=0.23)
Provides-Extra: i18n
Requires-Dist: Babel (>=0.8) ; extra == 'i18n'
Jinja
=====
Jinja is a fast, expressive, extensible templating engine. Special
placeholders in the template allow writing code similar to Python
syntax. Then the template is passed data to render the final document.
It includes:
- Template inheritance and inclusion.
- Define and import macros within templates.
- HTML templates can use autoescaping to prevent XSS from untrusted
user input.
- A sandboxed environment can safely render untrusted templates.
- AsyncIO support for generating templates and calling async
functions.
- I18N support with Babel.
- Templates are compiled to optimized Python code just-in-time and
cached, or can be compiled ahead-of-time.
- Exceptions point to the correct line in templates to make debugging
easier.
- Extensible filters, tests, functions, and even syntax.
Jinja's philosophy is that while application logic belongs in Python if
possible, it shouldn't make the template designer's job difficult by
restricting functionality too much.
Installing
----------
Install and update using `pip`_:
.. code-block:: text
$ pip install -U Jinja2
.. _pip: https://pip.pypa.io/en/stable/quickstart/
In A Nutshell
-------------
.. code-block:: jinja
{% extends "base.html" %}
{% block title %}Members{% endblock %}
{% block content %}
<ul>
{% for user in users %}
<li><a href="{{ user.url }}">{{ user.username }}</a></li>
{% endfor %}
</ul>
{% endblock %}
Links
-----
- Website: https://palletsprojects.com/p/jinja/
- Documentation: https://jinja.palletsprojects.com/
- Releases: https://pypi.org/project/Jinja2/
- Code: https://github.com/pallets/jinja
- Issue tracker: https://github.com/pallets/jinja/issues
- Test status: https://dev.azure.com/pallets/jinja/_build
- Official chat: https://discord.gg/t6rrQZH

View File

@@ -0,0 +1,62 @@
Jinja2-2.11.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
Jinja2-2.11.3.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475
Jinja2-2.11.3.dist-info/METADATA,sha256=PscpJ1C3RSp8xcjV3fAuTz13rKbGxmzJXnMQFH-WKhs,3535
Jinja2-2.11.3.dist-info/RECORD,,
Jinja2-2.11.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
Jinja2-2.11.3.dist-info/WHEEL,sha256=Z-nyYpwrcSqxfdux5Mbn_DQ525iP7J2DG3JgGvOYyTQ,110
Jinja2-2.11.3.dist-info/entry_points.txt,sha256=Qy_DkVo6Xj_zzOtmErrATe8lHZhOqdjpt3e4JJAGyi8,61
Jinja2-2.11.3.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7
jinja2/__init__.py,sha256=LZUXmxJc2GIchfSAeMWsxCWiQYO-w1-736f2Q3I8ms8,1549
jinja2/__pycache__/__init__.cpython-312.pyc,,
jinja2/__pycache__/_compat.cpython-312.pyc,,
jinja2/__pycache__/_identifier.cpython-312.pyc,,
jinja2/__pycache__/asyncfilters.cpython-312.pyc,,
jinja2/__pycache__/asyncsupport.cpython-312.pyc,,
jinja2/__pycache__/bccache.cpython-312.pyc,,
jinja2/__pycache__/compiler.cpython-312.pyc,,
jinja2/__pycache__/constants.cpython-312.pyc,,
jinja2/__pycache__/debug.cpython-312.pyc,,
jinja2/__pycache__/defaults.cpython-312.pyc,,
jinja2/__pycache__/environment.cpython-312.pyc,,
jinja2/__pycache__/exceptions.cpython-312.pyc,,
jinja2/__pycache__/ext.cpython-312.pyc,,
jinja2/__pycache__/filters.cpython-312.pyc,,
jinja2/__pycache__/idtracking.cpython-312.pyc,,
jinja2/__pycache__/lexer.cpython-312.pyc,,
jinja2/__pycache__/loaders.cpython-312.pyc,,
jinja2/__pycache__/meta.cpython-312.pyc,,
jinja2/__pycache__/nativetypes.cpython-312.pyc,,
jinja2/__pycache__/nodes.cpython-312.pyc,,
jinja2/__pycache__/optimizer.cpython-312.pyc,,
jinja2/__pycache__/parser.cpython-312.pyc,,
jinja2/__pycache__/runtime.cpython-312.pyc,,
jinja2/__pycache__/sandbox.cpython-312.pyc,,
jinja2/__pycache__/tests.cpython-312.pyc,,
jinja2/__pycache__/utils.cpython-312.pyc,,
jinja2/__pycache__/visitor.cpython-312.pyc,,
jinja2/_compat.py,sha256=B6Se8HjnXVpzz9-vfHejn-DV2NjaVK-Iewupc5kKlu8,3191
jinja2/_identifier.py,sha256=EdgGJKi7O1yvr4yFlvqPNEqV6M1qHyQr8Gt8GmVTKVM,1775
jinja2/asyncfilters.py,sha256=XJtYXTxFvcJ5xwk6SaDL4S0oNnT0wPYvXBCSzc482fI,4250
jinja2/asyncsupport.py,sha256=ZBFsDLuq3Gtji3Ia87lcyuDbqaHZJRdtShZcqwpFnSQ,7209
jinja2/bccache.py,sha256=3Pmp4jo65M9FQuIxdxoDBbEDFwe4acDMQf77nEJfrHA,12139
jinja2/compiler.py,sha256=Ta9W1Lit542wItAHXlDcg0sEOsFDMirCdlFPHAurg4o,66284
jinja2/constants.py,sha256=RR1sTzNzUmKco6aZicw4JpQpJGCuPuqm1h1YmCNUEFY,1458
jinja2/debug.py,sha256=neR7GIGGjZH3_ILJGVUYy3eLQCCaWJMXOb7o0kGInWc,8529
jinja2/defaults.py,sha256=85B6YUUCyWPSdrSeVhcqFVuu_bHUAQXeey--FIwSeVQ,1126
jinja2/environment.py,sha256=XDSLKc4SqNLMOwTSq3TbWEyA5WyXfuLuVD0wAVjEFwM,50629
jinja2/exceptions.py,sha256=VjNLawcmf2ODffqVMCQK1cRmvFaUfQWF4u8ouP3QPcE,5425
jinja2/ext.py,sha256=AtwL5O5enT_L3HR9-oBvhGyUTdGoyaqG_ICtnR_EVd4,26441
jinja2/filters.py,sha256=9ORilsZrUoydSI9upz8_qGy7gozDWLYoFmlIBFSVRnQ,41439
jinja2/idtracking.py,sha256=J3O4VHsrbf3wzwiBc7Cro26kHb6_5kbULeIOzocchIU,9211
jinja2/lexer.py,sha256=nUFLRKhhKmmEWkLI65nQePgcQs7qsRdjVYZETMt_v0g,30331
jinja2/loaders.py,sha256=C-fST_dmFjgWkp0ZuCkrgICAoOsoSIF28wfAFink0oU,17666
jinja2/meta.py,sha256=QjyYhfNRD3QCXjBJpiPl9KgkEkGXJbAkCUq4-Ur10EQ,4131
jinja2/nativetypes.py,sha256=Ul__gtVw4xH-0qvUvnCNHedQeNDwmEuyLJztzzSPeRg,2753
jinja2/nodes.py,sha256=Mk1oJPVgIjnQw9WOqILvcu3rLepcFZ0ahxQm2mbwDwc,31095
jinja2/optimizer.py,sha256=gQLlMYzvQhluhzmAIFA1tXS0cwgWYOjprN-gTRcHVsc,1457
jinja2/parser.py,sha256=fcfdqePNTNyvosIvczbytVA332qpsURvYnCGcjDHSkA,35660
jinja2/runtime.py,sha256=0y-BRyIEZ9ltByL2Id6GpHe1oDRQAwNeQvI0SKobNMw,30618
jinja2/sandbox.py,sha256=knayyUvXsZ-F0mk15mO2-ehK9gsw04UhB8td-iUOtLc,17127
jinja2/tests.py,sha256=iO_Y-9Vo60zrVe1lMpSl5sKHqAxe2leZHC08OoZ8K24,4799
jinja2/utils.py,sha256=Wy4yC3IByqUWwnKln6SdaixdzgK74P6F5nf-gQZrYnU,22436
jinja2/visitor.py,sha256=DUHupl0a4PGp7nxRtZFttUzAi1ccxzqc2hzetPYUz8U,3240

View File

@@ -0,0 +1,6 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.36.2)
Root-Is-Purelib: true
Tag: py2-none-any
Tag: py3-none-any

View File

@@ -0,0 +1,3 @@
[babel.extractors]
jinja2 = jinja2.ext:babel_extract [i18n]

View File

@@ -0,0 +1 @@
jinja2

View File

@@ -0,0 +1 @@
pip

View File

@@ -0,0 +1,28 @@
Copyright 2010 Pallets
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@@ -0,0 +1,112 @@
Metadata-Version: 2.2
Name: MarkupSafe
Version: 1.1.1
Summary: Safely add untrusted strings to HTML/XML markup.
Home-page: https://palletsprojects.com/p/markupsafe/
Author: Armin Ronacher
Author-email: armin.ronacher@active-4.com
Maintainer: The Pallets Team
Maintainer-email: contact@palletsprojects.com
License: BSD-3-Clause
Project-URL: Documentation, https://markupsafe.palletsprojects.com/
Project-URL: Code, https://github.com/pallets/markupsafe
Project-URL: Issue tracker, https://github.com/pallets/markupsafe/issues
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: Text Processing :: Markup :: HTML
Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*
License-File: LICENSE.rst
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: home-page
Dynamic: license
Dynamic: maintainer
Dynamic: maintainer-email
Dynamic: project-url
Dynamic: requires-python
Dynamic: summary
MarkupSafe
==========
MarkupSafe implements a text object that escapes characters so it is
safe to use in HTML and XML. Characters that have special meanings are
replaced so that they display as the actual characters. This mitigates
injection attacks, meaning untrusted user input can safely be displayed
on a page.
Installing
----------
Install and update using `pip`_:
.. code-block:: text
pip install -U MarkupSafe
.. _pip: https://pip.pypa.io/en/stable/quickstart/
Examples
--------
.. code-block:: pycon
>>> from markupsafe import Markup, escape
>>> # escape replaces special characters and wraps in Markup
>>> escape('<script>alert(document.cookie);</script>')
Markup(u'&lt;script&gt;alert(document.cookie);&lt;/script&gt;')
>>> # wrap in Markup to mark text "safe" and prevent escaping
>>> Markup('<strong>Hello</strong>')
Markup('<strong>hello</strong>')
>>> escape(Markup('<strong>Hello</strong>'))
Markup('<strong>hello</strong>')
>>> # Markup is a text subclass (str on Python 3, unicode on Python 2)
>>> # methods and operators escape their arguments
>>> template = Markup("Hello <em>%s</em>")
>>> template % '"World"'
Markup('Hello <em>&#34;World&#34;</em>')
Donate
------
The Pallets organization develops and supports MarkupSafe and other
libraries that use it. In order to grow the community of contributors
and users, and allow the maintainers to devote more time to the
projects, `please donate today`_.
.. _please donate today: https://palletsprojects.com/donate
Links
-----
* Website: https://palletsprojects.com/p/markupsafe/
* Documentation: https://markupsafe.palletsprojects.com/
* License: `BSD-3-Clause <https://github.com/pallets/markupsafe/blob/master/LICENSE.rst>`_
* Releases: https://pypi.org/project/MarkupSafe/
* Code: https://github.com/pallets/markupsafe
* Issue tracker: https://github.com/pallets/markupsafe/issues
* Test status:
* Linux, Mac: https://travis-ci.org/pallets/markupsafe
* Windows: https://ci.appveyor.com/project/pallets/markupsafe
* Test coverage: https://codecov.io/gh/pallets/markupsafe

View File

@@ -0,0 +1,16 @@
MarkupSafe-1.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
MarkupSafe-1.1.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475
MarkupSafe-1.1.1.dist-info/METADATA,sha256=dioL-bkVSrSB5Oq9T3xF7WC4yTfBDDrjXjf7GPAa9EI,3912
MarkupSafe-1.1.1.dist-info/RECORD,,
MarkupSafe-1.1.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
MarkupSafe-1.1.1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
MarkupSafe-1.1.1.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11
markupsafe/__init__.py,sha256=oTblO5f9KFM-pvnq9bB0HgElnqkJyqHnFN1Nx2NIvnY,10126
markupsafe/__pycache__/__init__.cpython-312.pyc,,
markupsafe/__pycache__/_compat.cpython-312.pyc,,
markupsafe/__pycache__/_constants.cpython-312.pyc,,
markupsafe/__pycache__/_native.cpython-312.pyc,,
markupsafe/_compat.py,sha256=uEW1ybxEjfxIiuTbRRaJpHsPFf4yQUMMKaPgYEC5XbU,558
markupsafe/_constants.py,sha256=zo2ajfScG-l1Sb_52EP3MlDCqO7Y1BVHUXXKRsVDRNk,4690
markupsafe/_native.py,sha256=d-8S_zzYt2y512xYcuSxq0NeG2DUUvG80wVdTn-4KI8,1873
markupsafe/_speedups.c,sha256=k0fzEIK3CP6MmMqeY0ob43TP90mVN0DTyn7BAl3RqSg,9884

View File

@@ -0,0 +1,5 @@
Wheel-Version: 1.0
Generator: setuptools (75.8.0)
Root-Is-Purelib: true
Tag: py3-none-any

View File

@@ -0,0 +1 @@
markupsafe

View File

@@ -0,0 +1 @@
pip

View File

@@ -0,0 +1,19 @@
Copyright (c) 2010, 2013 PyMySQL contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@@ -0,0 +1,181 @@
Metadata-Version: 2.1
Name: PyMySQL
Version: 0.9.3
Summary: Pure Python MySQL Driver
Home-page: https://github.com/PyMySQL/PyMySQL/
Author: yutaka.matsubara
Author-email: yutaka.matsubara@gmail.com
Maintainer: INADA Naoki
Maintainer-email: songofacandy@gmail.com
License: "MIT"
Project-URL: Documentation, https://pymysql.readthedocs.io/
Keywords: MySQL
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Topic :: Database
Provides-Extra: rsa
Requires-Dist: cryptography ; extra == 'rsa'
.. image:: https://readthedocs.org/projects/pymysql/badge/?version=latest
:target: https://pymysql.readthedocs.io/
:alt: Documentation Status
.. image:: https://badge.fury.io/py/PyMySQL.svg
:target: https://badge.fury.io/py/PyMySQL
.. image:: https://travis-ci.org/PyMySQL/PyMySQL.svg?branch=master
:target: https://travis-ci.org/PyMySQL/PyMySQL
.. image:: https://coveralls.io/repos/PyMySQL/PyMySQL/badge.svg?branch=master&service=github
:target: https://coveralls.io/github/PyMySQL/PyMySQL?branch=master
.. image:: https://img.shields.io/badge/license-MIT-blue.svg
:target: https://github.com/PyMySQL/PyMySQL/blob/master/LICENSE
PyMySQL
=======
.. contents:: Table of Contents
:local:
This package contains a pure-Python MySQL client library, based on `PEP 249`_.
Most public APIs are compatible with mysqlclient and MySQLdb.
NOTE: PyMySQL doesn't support low level APIs `_mysql` provides like `data_seek`,
`store_result`, and `use_result`. You should use high level APIs defined in `PEP 249`_.
But some APIs like `autocommit` and `ping` are supported because `PEP 249`_ doesn't cover
their usecase.
.. _`PEP 249`: https://www.python.org/dev/peps/pep-0249/
Requirements
-------------
* Python -- one of the following:
- CPython_ : 2.7 and >= 3.4
- PyPy_ : Latest version
* MySQL Server -- one of the following:
- MySQL_ >= 5.5
- MariaDB_ >= 5.5
.. _CPython: https://www.python.org/
.. _PyPy: https://pypy.org/
.. _MySQL: https://www.mysql.com/
.. _MariaDB: https://mariadb.org/
Installation
------------
Package is uploaded on `PyPI <https://pypi.org/project/PyMySQL>`_.
You can install it with pip::
$ python3 -m pip install PyMySQL
To use "sha256_password" or "caching_sha2_password" for authenticate,
you need to install additional dependency::
$ python3 -m pip install PyMySQL[rsa]
Documentation
-------------
Documentation is available online: https://pymysql.readthedocs.io/
For support, please refer to the `StackOverflow
<https://stackoverflow.com/questions/tagged/pymysql>`_.
Example
-------
The following examples make use of a simple table
.. code:: sql
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(255) COLLATE utf8_bin NOT NULL,
`password` varchar(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
AUTO_INCREMENT=1 ;
.. code:: python
import pymysql.cursors
# Connect to the database
connection = pymysql.connect(host='localhost',
user='user',
password='passwd',
db='db',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
try:
with connection.cursor() as cursor:
# Create a new record
sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
cursor.execute(sql, ('webmaster@python.org', 'very-secret'))
# connection is not autocommit by default. So you must commit to save
# your changes.
connection.commit()
with connection.cursor() as cursor:
# Read a single record
sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s"
cursor.execute(sql, ('webmaster@python.org',))
result = cursor.fetchone()
print(result)
finally:
connection.close()
This example will print:
.. code:: python
{'password': 'very-secret', 'id': 1}
Resources
---------
* DB-API 2.0: https://www.python.org/dev/peps/pep-0249/
* MySQL Reference Manuals: https://dev.mysql.com/doc/
* MySQL client/server protocol:
https://dev.mysql.com/doc/internals/en/client-server-protocol.html
* "Connector" channel in MySQL Community Slack:
https://lefred.be/mysql-community-on-slack/
* PyMySQL mailing list: https://groups.google.com/forum/#!forum/pymysql-users
License
-------
PyMySQL is released under the MIT License. See LICENSE for more information.

View File

@@ -0,0 +1,50 @@
PyMySQL-0.9.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
PyMySQL-0.9.3.dist-info/LICENSE,sha256=MUEg3GXwgA9ziksxQAx27hTezR--d86cNUCkIbhup7Y,1070
PyMySQL-0.9.3.dist-info/METADATA,sha256=8_R1N3H_AmpUu72ctuiQVI1Pk2SMlb9sy1uGlnxXB4U,5212
PyMySQL-0.9.3.dist-info/RECORD,,
PyMySQL-0.9.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
PyMySQL-0.9.3.dist-info/WHEEL,sha256=_wJFdOYk7i3xxT8ElOkUJvOdOvfNGbR9g-bf6UQT6sU,110
PyMySQL-0.9.3.dist-info/pbr.json,sha256=Lqvh8-9N7qS6SLUlEJ5GDLWioQcvR9n1WWjMEfJ5mv8,47
PyMySQL-0.9.3.dist-info/top_level.txt,sha256=IKlV-f4o90sOdnMd6HBvo0l2nqfJOGUzkwZeaEEGuRg,8
pymysql/__init__.py,sha256=ESllVZVoMVkJ0w9FoaMMirjFbWNc6wmHEVHzGKEBefc,4732
pymysql/__pycache__/__init__.cpython-312.pyc,,
pymysql/__pycache__/_auth.cpython-312.pyc,,
pymysql/__pycache__/_compat.cpython-312.pyc,,
pymysql/__pycache__/_socketio.cpython-312.pyc,,
pymysql/__pycache__/charset.cpython-312.pyc,,
pymysql/__pycache__/connections.cpython-312.pyc,,
pymysql/__pycache__/converters.cpython-312.pyc,,
pymysql/__pycache__/cursors.cpython-312.pyc,,
pymysql/__pycache__/err.cpython-312.pyc,,
pymysql/__pycache__/optionfile.cpython-312.pyc,,
pymysql/__pycache__/protocol.cpython-312.pyc,,
pymysql/__pycache__/times.cpython-312.pyc,,
pymysql/__pycache__/util.cpython-312.pyc,,
pymysql/_auth.py,sha256=X2AiuevuDaD2L4wJO5J7rymvJJZm6mND7WYmeIb7wEk,7720
pymysql/_compat.py,sha256=DSxMV2ib-rhIuQIKiXX44yds_0bN2M_RddfYQiSdB6U,481
pymysql/_socketio.py,sha256=smsw4wudNM4CKl85uis8QHfjDhz2iXQRvl8QV4TmB1w,4049
pymysql/charset.py,sha256=tNeEkuzFXM5zeuOYm_XSM8zdt5P_paV2SyUB9B2ibqI,10330
pymysql/connections.py,sha256=98DHxN-h3tupGBIReR98E7LSTR7-OIYh3tulXGlGdvc,49041
pymysql/constants/CLIENT.py,sha256=cPMxnQQbBG6xqaEDwqzggTfWIuJQ1Oy7HrIgw_vgpo4,853
pymysql/constants/COMMAND.py,sha256=ypGdEUmi8m9cdBZ3rDU6mb7bsIyu9ldCDvc4pNF7V70,680
pymysql/constants/CR.py,sha256=5ojVkbisyw7Qo_cTNpnHYvV6xHRZXK39Qqv8tjGbIbg,2228
pymysql/constants/ER.py,sha256=8q1PZOxezbXbRaPZrHrQebyLDx4CvAUkBArJ9xBuW0Y,12297
pymysql/constants/FIELD_TYPE.py,sha256=yHZLSyQewMxTDx4PLrI1H_iwH2FnsrgBZFa56UG2HiQ,372
pymysql/constants/FLAG.py,sha256=Fy-PrCLnUI7fx_o5WypYnUAzWAM0E9d5yL8fFRVKffY,214
pymysql/constants/SERVER_STATUS.py,sha256=KogVCOrV-S5aAFwyVKeKgua13nwdt1WFyHagjCZbcpM,334
pymysql/constants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
pymysql/constants/__pycache__/CLIENT.cpython-312.pyc,,
pymysql/constants/__pycache__/COMMAND.cpython-312.pyc,,
pymysql/constants/__pycache__/CR.cpython-312.pyc,,
pymysql/constants/__pycache__/ER.cpython-312.pyc,,
pymysql/constants/__pycache__/FIELD_TYPE.cpython-312.pyc,,
pymysql/constants/__pycache__/FLAG.cpython-312.pyc,,
pymysql/constants/__pycache__/SERVER_STATUS.cpython-312.pyc,,
pymysql/constants/__pycache__/__init__.cpython-312.pyc,,
pymysql/converters.py,sha256=BWHMbquNFUKfFXyZh6Qwch6mYLyYSQeaeifL4VLuISc,12235
pymysql/cursors.py,sha256=m6MhwWnm3CbTE4JAXzDuo6CYKC7W6JzsY4PN9eDmKJk,17238
pymysql/err.py,sha256=PaXGLqOnDXJoeYjLbMZQE5UQ3MHFqiiHCzaDPP-_NJA,3716
pymysql/optionfile.py,sha256=4yW8A7aAR2Aild7ibLOCzIlTCcYd90PtR8LRGJSZs8o,658
pymysql/protocol.py,sha256=GH2yzGqPwqX2t2G87k3EJQt7bYQOLEN6QoN_m15c4Ak,12024
pymysql/times.py,sha256=_qXgDaYwsHntvpIKSKXp1rrYIgtq6Z9pLyLnO2XNoL0,360
pymysql/util.py,sha256=jKPts8cOMIXDndjsV3783VW-iq9uMxETWqfHP6Bd-Zo,180

View File

@@ -0,0 +1,6 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.32.3)
Root-Is-Purelib: true
Tag: py2-none-any
Tag: py3-none-any

View File

@@ -0,0 +1 @@
{"is_release": false, "git_version": "08bac52"}

View File

@@ -0,0 +1 @@
pymysql

View File

@@ -0,0 +1 @@
pip

View File

@@ -0,0 +1,19 @@
Copyright 2005-2019 SQLAlchemy authors and contributors <see AUTHORS file>.
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,201 @@
Metadata-Version: 2.2
Name: SQLAlchemy
Version: 1.3.7
Summary: Database Abstraction Library
Home-page: http://www.sqlalchemy.org
Author: Mike Bayer
Author-email: mike_mp@zzzcomputing.com
License: MIT
Project-URL: Documentation, https://docs.sqlalchemy.org
Project-URL: Issue Tracker, https://github.com/sqlalchemy/sqlalchemy/
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Database :: Front-Ends
Classifier: Operating System :: OS Independent
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
License-File: LICENSE
Provides-Extra: mysql
Requires-Dist: mysqlclient; extra == "mysql"
Provides-Extra: pymysql
Requires-Dist: pymysql; extra == "pymysql"
Provides-Extra: postgresql
Requires-Dist: psycopg2; extra == "postgresql"
Provides-Extra: postgresql-psycopg2binary
Requires-Dist: psycopg2-binary; extra == "postgresql-psycopg2binary"
Provides-Extra: postgresql-pg8000
Requires-Dist: pg8000; extra == "postgresql-pg8000"
Provides-Extra: postgresql-psycopg2cffi
Requires-Dist: psycopg2cffi; extra == "postgresql-psycopg2cffi"
Provides-Extra: oracle
Requires-Dist: cx_oracle; extra == "oracle"
Provides-Extra: mssql-pyodbc
Requires-Dist: pyodbc; extra == "mssql-pyodbc"
Provides-Extra: mssql-pymssql
Requires-Dist: pymssql; extra == "mssql-pymssql"
Provides-Extra: mssql
Requires-Dist: pyodbc; extra == "mssql"
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: home-page
Dynamic: license
Dynamic: project-url
Dynamic: provides-extra
Dynamic: requires-python
Dynamic: summary
SQLAlchemy
==========
The Python SQL Toolkit and Object Relational Mapper
Introduction
-------------
SQLAlchemy is the Python SQL toolkit and Object Relational Mapper
that gives application developers the full power and
flexibility of SQL. SQLAlchemy provides a full suite
of well known enterprise-level persistence patterns,
designed for efficient and high-performing database
access, adapted into a simple and Pythonic domain
language.
Major SQLAlchemy features include:
* An industrial strength ORM, built
from the core on the identity map, unit of work,
and data mapper patterns. These patterns
allow transparent persistence of objects
using a declarative configuration system.
Domain models
can be constructed and manipulated naturally,
and changes are synchronized with the
current transaction automatically.
* A relationally-oriented query system, exposing
the full range of SQL's capabilities
explicitly, including joins, subqueries,
correlation, and most everything else,
in terms of the object model.
Writing queries with the ORM uses the same
techniques of relational composition you use
when writing SQL. While you can drop into
literal SQL at any time, it's virtually never
needed.
* A comprehensive and flexible system
of eager loading for related collections and objects.
Collections are cached within a session,
and can be loaded on individual access, all
at once using joins, or by query per collection
across the full result set.
* A Core SQL construction system and DBAPI
interaction layer. The SQLAlchemy Core is
separate from the ORM and is a full database
abstraction layer in its own right, and includes
an extensible Python-based SQL expression
language, schema metadata, connection pooling,
type coercion, and custom types.
* All primary and foreign key constraints are
assumed to be composite and natural. Surrogate
integer primary keys are of course still the
norm, but SQLAlchemy never assumes or hardcodes
to this model.
* Database introspection and generation. Database
schemas can be "reflected" in one step into
Python structures representing database metadata;
those same structures can then generate
CREATE statements right back out - all within
the Core, independent of the ORM.
SQLAlchemy's philosophy:
* SQL databases behave less and less like object
collections the more size and performance start to
matter; object collections behave less and less like
tables and rows the more abstraction starts to matter.
SQLAlchemy aims to accommodate both of these
principles.
* An ORM doesn't need to hide the "R". A relational
database provides rich, set-based functionality
that should be fully exposed. SQLAlchemy's
ORM provides an open-ended set of patterns
that allow a developer to construct a custom
mediation layer between a domain model and
a relational schema, turning the so-called
"object relational impedance" issue into
a distant memory.
* The developer, in all cases, makes all decisions
regarding the design, structure, and naming conventions
of both the object model as well as the relational
schema. SQLAlchemy only provides the means
to automate the execution of these decisions.
* With SQLAlchemy, there's no such thing as
"the ORM generated a bad query" - you
retain full control over the structure of
queries, including how joins are organized,
how subqueries and correlation is used, what
columns are requested. Everything SQLAlchemy
does is ultimately the result of a developer-
initiated decision.
* Don't use an ORM if the problem doesn't need one.
SQLAlchemy consists of a Core and separate ORM
component. The Core offers a full SQL expression
language that allows Pythonic construction
of SQL constructs that render directly to SQL
strings for a target database, returning
result sets that are essentially enhanced DBAPI
cursors.
* Transactions should be the norm. With SQLAlchemy's
ORM, nothing goes to permanent storage until
commit() is called. SQLAlchemy encourages applications
to create a consistent means of delineating
the start and end of a series of operations.
* Never render a literal value in a SQL statement.
Bound parameters are used to the greatest degree
possible, allowing query optimizers to cache
query plans effectively and making SQL injection
attacks a non-issue.
Documentation
-------------
Latest documentation is at:
http://www.sqlalchemy.org/docs/
Installation / Requirements
---------------------------
Full documentation for installation is at
`Installation <http://www.sqlalchemy.org/docs/intro.html#installation>`_.
Getting Help / Development / Bug reporting
------------------------------------------
Please refer to the `SQLAlchemy Community Guide <http://www.sqlalchemy.org/support.html>`_.
Code of Conduct
---------------
Above all, SQLAlchemy places great emphasis on polite, thoughtful, and
constructive communication between users and developers.
Please see our current Code of Conduct at
`Code of Conduct <http://www.sqlalchemy.org/codeofconduct.html>`_.
License
-------
SQLAlchemy is distributed under the `MIT license
<http://www.opensource.org/licenses/mit-license.php>`_.

View File

@@ -0,0 +1,393 @@
SQLAlchemy-1.3.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
SQLAlchemy-1.3.7.dist-info/LICENSE,sha256=Cs_6FfNCfpQBQjXjxEN29v5d8P9GGpOpEW7rzOdMBW4,1100
SQLAlchemy-1.3.7.dist-info/METADATA,sha256=nkspSteyBQRg86aUukqk7hSYrD69v9h_nIUbEWGR2Q8,7635
SQLAlchemy-1.3.7.dist-info/RECORD,,
SQLAlchemy-1.3.7.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
SQLAlchemy-1.3.7.dist-info/WHEEL,sha256=cRmSBGD-cl98KkuHMNqv9Ac9L9_VqTvcBYwpIvxN0cg,101
SQLAlchemy-1.3.7.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11
sqlalchemy/__init__.py,sha256=xLlkeks2PWKN5fRZubzyb0DN1aU4IJW6xS4ZpLnxhro,4621
sqlalchemy/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/__pycache__/events.cpython-312.pyc,,
sqlalchemy/__pycache__/exc.cpython-312.pyc,,
sqlalchemy/__pycache__/inspection.cpython-312.pyc,,
sqlalchemy/__pycache__/interfaces.cpython-312.pyc,,
sqlalchemy/__pycache__/log.cpython-312.pyc,,
sqlalchemy/__pycache__/processors.cpython-312.pyc,,
sqlalchemy/__pycache__/schema.cpython-312.pyc,,
sqlalchemy/__pycache__/types.cpython-312.pyc,,
sqlalchemy/connectors/__init__.py,sha256=PmO8JpjouRQDDgTZG6KMmkjuhjNaHKD_mVVmC7BIb3o,278
sqlalchemy/connectors/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/connectors/__pycache__/mxodbc.cpython-312.pyc,,
sqlalchemy/connectors/__pycache__/pyodbc.cpython-312.pyc,,
sqlalchemy/connectors/__pycache__/zxJDBC.cpython-312.pyc,,
sqlalchemy/connectors/mxodbc.py,sha256=shvfYLXjpIfWhzgmAOAmLhgzRuh1cQBviFdlmqsanpQ,5352
sqlalchemy/connectors/pyodbc.py,sha256=7xXTtBwpiInIZY7cHQrt2kdYMWL2wt0BaBpoPrTk6TY,5586
sqlalchemy/connectors/zxJDBC.py,sha256=q_1nkGMdgfpdTirsOFPv5zUwvcLl3eFqPWX8kLlonIU,1878
sqlalchemy/databases/__init__.py,sha256=q48zKLOxc0QAoin17eb3uWgKj8ZKIUn3U-1yCIBxOiA,819
sqlalchemy/databases/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/dialects/__init__.py,sha256=sLp-2CliXi_1-53Ocw3RecyguSFVNcgbnpGbQ_l79CE,1349
sqlalchemy/dialects/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/dialects/firebird/__init__.py,sha256=DIDoybKRq57MbVzxGAEjhlUKOnMxqS_YtqHTqKEqbA8,1152
sqlalchemy/dialects/firebird/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/dialects/firebird/__pycache__/base.cpython-312.pyc,,
sqlalchemy/dialects/firebird/__pycache__/fdb.cpython-312.pyc,,
sqlalchemy/dialects/firebird/__pycache__/kinterbasdb.cpython-312.pyc,,
sqlalchemy/dialects/firebird/base.py,sha256=4KqvtWGFrHKZCIInkSrmInyn_LNGT1gGQL1YbGE9FRU,30566
sqlalchemy/dialects/firebird/fdb.py,sha256=cMR5lkee9uQUW4dLrFJGQwzTqwS0jF7VmFC2-1XHBa0,4071
sqlalchemy/dialects/firebird/kinterbasdb.py,sha256=umuKwPP3yCApLlgP9nFQnAzM33Tfz6yggXTNfL9NJxg,6372
sqlalchemy/dialects/mssql/__init__.py,sha256=M8BL-BWaD86dzXXWrvFx2r61fWV8eB38xfMnB_OOnGM,1812
sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/dialects/mssql/__pycache__/adodbapi.cpython-312.pyc,,
sqlalchemy/dialects/mssql/__pycache__/base.cpython-312.pyc,,
sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-312.pyc,,
sqlalchemy/dialects/mssql/__pycache__/mxodbc.cpython-312.pyc,,
sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-312.pyc,,
sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-312.pyc,,
sqlalchemy/dialects/mssql/__pycache__/zxjdbc.cpython-312.pyc,,
sqlalchemy/dialects/mssql/adodbapi.py,sha256=Xaz4YjlfJzA6ULH4G4qoS-hKviyJ7BZdh6w8KJEEUnE,2719
sqlalchemy/dialects/mssql/base.py,sha256=owUaT0cWM_r61NQmpzUNNUz5H8UTYgUXGjRpiTAQ9BE,86293
sqlalchemy/dialects/mssql/information_schema.py,sha256=hAcPUvSr39CTKQWM7eMXAX10sRRHdCTZktQYfu8I5xs,5343
sqlalchemy/dialects/mssql/mxodbc.py,sha256=bWJLGOj1U58hBnM494NL2bL1xm1mMMe2c5Q4mQ20Pgs,4616
sqlalchemy/dialects/mssql/pymssql.py,sha256=5recm4JtMHCGGycQ3q74eBRvYXXswpfXS8zZG-XuB8E,3913
sqlalchemy/dialects/mssql/pyodbc.py,sha256=dxJb8z4NZX3Rc-yM4rUy3vJSchSSJRV_yuSO2kp067k,12284
sqlalchemy/dialects/mssql/zxjdbc.py,sha256=WWK58AZg_5QvzdcMLYSQiKwkX8Pz0dpIJGFGQhca-ek,2311
sqlalchemy/dialects/mysql/__init__.py,sha256=5sqAvOrhuLe7BUFzAMg7e-3CEh0ACsf6czm-TXHDvJg,2056
sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/dialects/mysql/__pycache__/base.cpython-312.pyc,,
sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-312.pyc,,
sqlalchemy/dialects/mysql/__pycache__/dml.cpython-312.pyc,,
sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-312.pyc,,
sqlalchemy/dialects/mysql/__pycache__/gaerdbms.cpython-312.pyc,,
sqlalchemy/dialects/mysql/__pycache__/json.cpython-312.pyc,,
sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-312.pyc,,
sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-312.pyc,,
sqlalchemy/dialects/mysql/__pycache__/oursql.cpython-312.pyc,,
sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-312.pyc,,
sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-312.pyc,,
sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-312.pyc,,
sqlalchemy/dialects/mysql/__pycache__/types.cpython-312.pyc,,
sqlalchemy/dialects/mysql/__pycache__/zxjdbc.cpython-312.pyc,,
sqlalchemy/dialects/mysql/base.py,sha256=u8UkBw1JACKnILkfqYXDiO-acR37U1Amh0nxW4D5UKU,97424
sqlalchemy/dialects/mysql/cymysql.py,sha256=HkQqKqxdxSPdZL4a99IDgEY0-CEVQUN6T9H5Lzji79U,2245
sqlalchemy/dialects/mysql/dml.py,sha256=Anei51VB2wWAP3G1T4GN6tLh9j04l2aIyHeI9vk5CUs,4559
sqlalchemy/dialects/mysql/enumerated.py,sha256=4knKAcM5JzfgUS15j3602esjLd3op85_DRwav_4Ogok,11307
sqlalchemy/dialects/mysql/gaerdbms.py,sha256=JFtH8MmNcVR9D6kSqCgY4bgPQk8MR_ciO9WRPOzmNAo,3368
sqlalchemy/dialects/mysql/json.py,sha256=mvbQip8qW6b0zs-Kx6JekcWmccqJp3Pt9En1_jsbCac,2050
sqlalchemy/dialects/mysql/mysqlconnector.py,sha256=y3VgZtlYUO2Mnf2XS86V83Zn8nPBF4AaDYkcKDkMdzc,7889
sqlalchemy/dialects/mysql/mysqldb.py,sha256=a8gxsD5_1Jlq1XXegfFFOEHTiFJe5XAVM7Jw6T1H3GA,8383
sqlalchemy/dialects/mysql/oursql.py,sha256=5zFpEY5j3_dg9lwqcAVG24Idv76NESS_BPgx0-T7L1k,8086
sqlalchemy/dialects/mysql/pymysql.py,sha256=ZfTjzAWBchsP3uSzHH3gsOZAJDjEUy86CqLyHPbAfYk,2338
sqlalchemy/dialects/mysql/pyodbc.py,sha256=Z-p_UAqzbdEFBeUYifN1LCfZn4MsQABkq__8Bek-7Sc,2691
sqlalchemy/dialects/mysql/reflection.py,sha256=i4lgW19eafX1pjMz4RZ9Wjlvy1FPMEe5K24J4dvXAq8,17837
sqlalchemy/dialects/mysql/types.py,sha256=vXCGrcs3ubhaGpO3ClHqJdjKlgkkFAKMdeepbgwheU4,24601
sqlalchemy/dialects/mysql/zxjdbc.py,sha256=YwxhLeIHlxcozvo099_sNWl6bUmPK9LBivUQDTRJ6Vc,3970
sqlalchemy/dialects/oracle/__init__.py,sha256=ISElqFGbFJyBKl00a9_eN_JXTOincncCGy0q7qC0Ia0,1257
sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/dialects/oracle/__pycache__/base.cpython-312.pyc,,
sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-312.pyc,,
sqlalchemy/dialects/oracle/__pycache__/zxjdbc.cpython-312.pyc,,
sqlalchemy/dialects/oracle/base.py,sha256=yPqjWLr1_K6RXFbU5VRLN7KCfDBhCbgw7Ip4ywEDFRQ,67114
sqlalchemy/dialects/oracle/cx_oracle.py,sha256=eLKFR5uRhnbv1cxyQwu8olQtQ46FJ28CaNy5Eq4IN6c,40689
sqlalchemy/dialects/oracle/zxjdbc.py,sha256=OOtJlVq3YPkQMrzy7QHUveuWw5fzffSx1SQ73sfh0TI,8207
sqlalchemy/dialects/postgresql/__init__.py,sha256=ICu5C7h84FiVkO5cQp7-GT-a1-XfPagGZ3eV8vFNsws,2461
sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/array.cpython-312.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/base.cpython-312.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-312.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-312.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-312.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/json.cpython-312.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-312.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-312.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-312.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/pygresql.cpython-312.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/pypostgresql.cpython-312.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-312.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/zxjdbc.cpython-312.pyc,,
sqlalchemy/dialects/postgresql/array.py,sha256=mepUcwMclyz7jIGd8LnPsBYV0TxKDh5YEq6vib1MvBk,11089
sqlalchemy/dialects/postgresql/base.py,sha256=qPjWybpPj2DZT2x9qyMfVAgc1cXPtKKsdXS8qoDlDjo,119131
sqlalchemy/dialects/postgresql/dml.py,sha256=OTrr1V4O2aHR-QcWMxrEvNFIpwxtd6gHG_M6tjXiQ2c,7579
sqlalchemy/dialects/postgresql/ext.py,sha256=50vUJeDhqt9eYB-FOOXSwckkbRA-vvf-QGoSbMWL2dE,6823
sqlalchemy/dialects/postgresql/hstore.py,sha256=ziir2ENH-jtGiHHDmqh5LsYQ9wkskYzK4mHhrCseyHs,12510
sqlalchemy/dialects/postgresql/json.py,sha256=MLz3Jen1cKfKvtLKAHl19z02-x3mYk8j_9yFjhS1AYQ,9938
sqlalchemy/dialects/postgresql/pg8000.py,sha256=w3-trNsJWNdaY1YkQVlvCQk9PwRS3s0biFnIQdVJkUo,9719
sqlalchemy/dialects/postgresql/psycopg2.py,sha256=2W-JKHWP27eaiVzMN0oq34nVtsWM5t0kmf_HSSp24is,35528
sqlalchemy/dialects/postgresql/psycopg2cffi.py,sha256=CxJa1kEhcVL89CDofQu5cLCkXi0Kak_3qHtSY28m3D0,1657
sqlalchemy/dialects/postgresql/pygresql.py,sha256=dGQxZvs8JonnwrFggnF2P3h62wtjQWUAeD7FP1j3di0,8129
sqlalchemy/dialects/postgresql/pypostgresql.py,sha256=Q5UEjdWMydD-3CU9eYTdpkuqE3C2lmbl57JhfI76StE,2915
sqlalchemy/dialects/postgresql/ranges.py,sha256=5kXgQWlUUoFaqM4nybF9lXdubPyLuyQ5-Cl1MrW0HY4,4750
sqlalchemy/dialects/postgresql/zxjdbc.py,sha256=EOBSePhEZ5ofxWxpL4pjKrBdH-J0IU7MNI6bfrNg_f8,1415
sqlalchemy/dialects/sqlite/__init__.py,sha256=xf7Jo5xBzd3pM2FskTBvK4GEwe2uKF3615wx5igAJnY,1042
sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/dialects/sqlite/__pycache__/base.cpython-312.pyc,,
sqlalchemy/dialects/sqlite/__pycache__/json.cpython-312.pyc,,
sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-312.pyc,,
sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-312.pyc,,
sqlalchemy/dialects/sqlite/base.py,sha256=wDY0wry5eG1Bf0wE52bGrFS1zT0AIk--_4kjHoPzzbo,70302
sqlalchemy/dialects/sqlite/json.py,sha256=NlSvgukUs7BOK7HAhoHuk5Li1K2UxUgK0DpTkJ449NE,2292
sqlalchemy/dialects/sqlite/pysqlcipher.py,sha256=xVjUM8QfJvXZWVPacptuVUrAvTELmgKk6idlK9yCg8M,4689
sqlalchemy/dialects/sqlite/pysqlite.py,sha256=ZwUGJh3fsxWgEGaxIjkPd4yD33of79iopQRTk7mzaQc,14878
sqlalchemy/dialects/sybase/__init__.py,sha256=E7EalDeHIf7ol6Guvh2fxkUt6db39SMTmpr2BNcFqhA,1363
sqlalchemy/dialects/sybase/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/dialects/sybase/__pycache__/base.cpython-312.pyc,,
sqlalchemy/dialects/sybase/__pycache__/mxodbc.cpython-312.pyc,,
sqlalchemy/dialects/sybase/__pycache__/pyodbc.cpython-312.pyc,,
sqlalchemy/dialects/sybase/__pycache__/pysybase.cpython-312.pyc,,
sqlalchemy/dialects/sybase/base.py,sha256=PBn5aJe5pUjQjrEbvydYvKHql190GNgDmZIXito6lCo,31953
sqlalchemy/dialects/sybase/mxodbc.py,sha256=SAFYjwWM43w5kexxouD9k9ZixvVnjdYgrV-3cFmehtM,902
sqlalchemy/dialects/sybase/pyodbc.py,sha256=GY1ckbvHEyAMsOATiD3l154xBFLbvyEl2DAezuKkK-o,2120
sqlalchemy/dialects/sybase/pysybase.py,sha256=5aDa_EP4TDwD58p78MQCFdL8xEVeUfLgI9TsRL3awcI,3313
sqlalchemy/engine/__init__.py,sha256=L7WYZ-slgiq3VVgE4V7-GMaxwjUjXX5VPA563AfpZPs,22355
sqlalchemy/engine/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/engine/__pycache__/base.cpython-312.pyc,,
sqlalchemy/engine/__pycache__/default.cpython-312.pyc,,
sqlalchemy/engine/__pycache__/interfaces.cpython-312.pyc,,
sqlalchemy/engine/__pycache__/reflection.cpython-312.pyc,,
sqlalchemy/engine/__pycache__/result.cpython-312.pyc,,
sqlalchemy/engine/__pycache__/strategies.cpython-312.pyc,,
sqlalchemy/engine/__pycache__/threadlocal.cpython-312.pyc,,
sqlalchemy/engine/__pycache__/url.cpython-312.pyc,,
sqlalchemy/engine/__pycache__/util.cpython-312.pyc,,
sqlalchemy/engine/base.py,sha256=sEQsA9CpI1qFqU2TQHIQHK1PmVeGb0QRPpsCAndttyY,84126
sqlalchemy/engine/default.py,sha256=YKT3Ke-0unHkjWvIl4udAKgNBShAldzipFBwx9GEtoM,51401
sqlalchemy/engine/interfaces.py,sha256=Qs8a5NdXA31B5_iSBU8VjMqjgo5UyIjQiX7Serbj1P4,42397
sqlalchemy/engine/reflection.py,sha256=x9oNgLSgsszmWE5xoVw_M8SQDKgOyA4CXyVxPvssDPk,33343
sqlalchemy/engine/result.py,sha256=ULlBOIXQwoO99yizhKBaMtZopI40DpUPNgbG66RxqAY,52615
sqlalchemy/engine/strategies.py,sha256=ToskJHHdGuSB1wESESSRTtUxbmC3_LQ3u4CRZn830hI,9750
sqlalchemy/engine/threadlocal.py,sha256=emgAmROgo6SmJkCP8gG8eFViUQHYnd8U3pN1aAt831o,4746
sqlalchemy/engine/url.py,sha256=d25Q-jI8KUqgVD8aGrsW6A3pI3LIP2TiV1Ny8rgZEyM,9411
sqlalchemy/engine/util.py,sha256=pdoqEAzvm1TIIYNQsHP5eeAQZVbdEzyBE69r5rjdo94,2421
sqlalchemy/event/__init__.py,sha256=MEawrpuhgajkBpodIp2BfEmLyHYkCicSoz60dTFJk7A,596
sqlalchemy/event/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/event/__pycache__/api.cpython-312.pyc,,
sqlalchemy/event/__pycache__/attr.cpython-312.pyc,,
sqlalchemy/event/__pycache__/base.cpython-312.pyc,,
sqlalchemy/event/__pycache__/legacy.cpython-312.pyc,,
sqlalchemy/event/__pycache__/registry.cpython-312.pyc,,
sqlalchemy/event/api.py,sha256=P7VRkpZnGZ5BohVDAK81zbGiOyDLo4CVjFlJsIvmQYw,7085
sqlalchemy/event/attr.py,sha256=5TRnPHyWBYg0OgYIZmjwP29iiFfNTTGZQCXDXoIXmh4,12994
sqlalchemy/event/base.py,sha256=1qV9UUIw3FcKc6AjFTiV7wiFRpNv4CFCPGYq2nuqANc,9760
sqlalchemy/event/legacy.py,sha256=N5IF3sonoACbA3zusM6nejBmecdD9r7o5ZrWj7JUfyo,5904
sqlalchemy/event/registry.py,sha256=1wpdKBp8yiQalFJemBBS0Bo0Ikoot1_Tmr_44Jdwh_Q,8066
sqlalchemy/events.py,sha256=q8YUUj9ie-jqHAhpRCSob6U0AWnO97XTXNU4eFMIoqA,51669
sqlalchemy/exc.py,sha256=dj3R5czuI1QW-csTi_QkruQgYd4tkyHQLgBktG1uJ7s,16088
sqlalchemy/ext/__init__.py,sha256=FZuukFICvDXSuR142gLZ7dBWNpRHqASSL2aMtUfachE,322
sqlalchemy/ext/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/ext/__pycache__/associationproxy.cpython-312.pyc,,
sqlalchemy/ext/__pycache__/automap.cpython-312.pyc,,
sqlalchemy/ext/__pycache__/baked.cpython-312.pyc,,
sqlalchemy/ext/__pycache__/compiler.cpython-312.pyc,,
sqlalchemy/ext/__pycache__/horizontal_shard.cpython-312.pyc,,
sqlalchemy/ext/__pycache__/hybrid.cpython-312.pyc,,
sqlalchemy/ext/__pycache__/indexable.cpython-312.pyc,,
sqlalchemy/ext/__pycache__/instrumentation.cpython-312.pyc,,
sqlalchemy/ext/__pycache__/mutable.cpython-312.pyc,,
sqlalchemy/ext/__pycache__/orderinglist.cpython-312.pyc,,
sqlalchemy/ext/__pycache__/serializer.cpython-312.pyc,,
sqlalchemy/ext/associationproxy.py,sha256=8r5JwaKz2zGWo9mXOtvZlxKTo6cPRpTOzj055W5BgU8,49463
sqlalchemy/ext/automap.py,sha256=Sejl92gboBfHYXpw4xn-e1-uCr3DLud8u6MJRU395MU,41710
sqlalchemy/ext/baked.py,sha256=7iK_B9lZX20g08IrC2xg9tidUCxGi1D4TiMQo5x9ZrQ,21469
sqlalchemy/ext/compiler.py,sha256=bnwt9fjMG4_rrwPsX_5Kv96JgqEJM4TKQY4OorHEttc,16850
sqlalchemy/ext/declarative/__init__.py,sha256=vjC-rEQ8py1ai0Gsh47UYHcYNlrhNw3774_u5ffhyws,902
sqlalchemy/ext/declarative/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/ext/declarative/__pycache__/api.cpython-312.pyc,,
sqlalchemy/ext/declarative/__pycache__/base.cpython-312.pyc,,
sqlalchemy/ext/declarative/__pycache__/clsregistry.cpython-312.pyc,,
sqlalchemy/ext/declarative/api.py,sha256=KGnM7bHVyB03WDcd6ToiLCJQifIXxxx0NyDrHmb5XQM,27683
sqlalchemy/ext/declarative/base.py,sha256=5UzkPwx-ICOji3iJi-70bbhfMQ8rcF4tYvC91dYZHA8,32093
sqlalchemy/ext/declarative/clsregistry.py,sha256=jH0vm14_bN7fw_hfkqNNiK0eihkRDpA1YlyS_yjkfIY,11051
sqlalchemy/ext/horizontal_shard.py,sha256=TxazGyRKBY-0q_iYGQ6omdZw96GoRb11Dh5omMH35Lk,9109
sqlalchemy/ext/hybrid.py,sha256=l1qSV6leIR57j3dsSXbCfJMIQH3EYzoEBY7IUnn-4ME,40233
sqlalchemy/ext/indexable.py,sha256=Zsx-ZWUQ4EJOgGIi8fkwqNZ1Z0u234Vx45jcH9zJ1GM,11169
sqlalchemy/ext/instrumentation.py,sha256=7pxb7SDAnFvtHUxXnx8rqg4XKCadnWDGOBzFQHqeBS8,14351
sqlalchemy/ext/mutable.py,sha256=rHTPaTAAiLda-cTAZpW4a1zl8Mqa0pgde0wWc6pGABM,31808
sqlalchemy/ext/orderinglist.py,sha256=HEqlfaUQv5TI6kVchcNuxF_dcwvHHH_uGXY1EvP4GxQ,13888
sqlalchemy/ext/serializer.py,sha256=D7DGYqH_tQsYSB2NFh44Eouud3aaZjclnfA-7lymCdE,5784
sqlalchemy/inspection.py,sha256=Ld16VK6UHHncT6OTk2EF4pb5dVy6UAluKirO_efhJe4,2990
sqlalchemy/interfaces.py,sha256=-hmOQE7bQj97PDqwBLnFbHP8spyq_SdWAsT2jj5V_2w,12721
sqlalchemy/log.py,sha256=p15DWPQsSEbiuM-n9fXpUUKfDcC8DZzR8iVnX9vJyPU,6693
sqlalchemy/orm/__init__.py,sha256=0oVxiEjATefM7AsVfn3GwFVdpoTqClB5v2h3wkoJubs,9542
sqlalchemy/orm/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/attributes.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/base.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/collections.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/dependency.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/deprecated_interfaces.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/descriptor_props.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/dynamic.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/evaluator.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/events.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/exc.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/identity.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/instrumentation.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/interfaces.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/loading.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/mapper.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/path_registry.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/persistence.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/properties.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/query.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/relationships.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/scoping.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/session.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/state.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/strategies.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/strategy_options.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/sync.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/unitofwork.cpython-312.pyc,,
sqlalchemy/orm/__pycache__/util.cpython-312.pyc,,
sqlalchemy/orm/attributes.py,sha256=KZZP9OlxMSXeGUxfYZ-SCcphLAFIAC6ZBx3skSjffSg,67137
sqlalchemy/orm/base.py,sha256=buwPRxecLZ-jlLiE6iMr-Nu5dQapiAjQVhHFzqDlAS4,14864
sqlalchemy/orm/collections.py,sha256=AtwAGy1fBr8Nb6cOE6ErkfbwB04WAMZh02OE5c1ab1M,52614
sqlalchemy/orm/dependency.py,sha256=nOe6kS0U6V_3qQibhK9EDqmqbkcMl9jw9XPmdqZnS0U,46556
sqlalchemy/orm/deprecated_interfaces.py,sha256=Ck4e2jxE09lf0STxFPvJm7XtnrAsCKi26NG2WWgnI4s,20751
sqlalchemy/orm/descriptor_props.py,sha256=uw_3B8zPTXJRw1JjZetl87oHLP70B92enkZTzMyIIGw,28201
sqlalchemy/orm/dynamic.py,sha256=ZIekBr63mDFhhovss0o6h8SW90yQ1ImU1InQiArKXK0,14666
sqlalchemy/orm/evaluator.py,sha256=bKHiPgCfcGlZ48by-j1E2ui5quPjEa3dcjinTpAdaNc,5441
sqlalchemy/orm/events.py,sha256=ny4pvcj-HOaSgIFzO2zyAYIgTvF6hfi_T1kqUrejplI,94409
sqlalchemy/orm/exc.py,sha256=mgjHeg87b0WJ8NGM1Exq39dQ5-nz_Crn61dSXKyHO6Q,6610
sqlalchemy/orm/identity.py,sha256=zQBUIWAto8UBUKsMV74aX3AqYwqYlURjUZ2xiS0Mrj8,10299
sqlalchemy/orm/instrumentation.py,sha256=6UM6L0MGh_4UoGDKMqSoQbuGVc9fQke7qYG5Q_9Ko9A,18131
sqlalchemy/orm/interfaces.py,sha256=JzAQS8ulSBk-AUFPPxIAkBkfPV9HA5WztCL7osBIY9g,25766
sqlalchemy/orm/loading.py,sha256=lQpLChrS32LN5x3YrZhZvyWptx3B6mDPtIUgMKxI_88,32236
sqlalchemy/orm/mapper.py,sha256=_9s0sXXRj0M7ak5kSF_iRXGh--GeUkSd-d8uADNWZzU,128344
sqlalchemy/orm/path_registry.py,sha256=WRQ22J7JGmFYtjXphdEK4uUVl33Hl0TFXPDRX_IIGhY,9262
sqlalchemy/orm/persistence.py,sha256=0-2M5i8hf3Pwxh320Vp3jQyTnwfJ6P_ZZJweaoCr6oQ,65652
sqlalchemy/orm/properties.py,sha256=R_QJCCH1POO3mm6M_TP2UXGhF1tzMZ4T5S1muj1Kmc0,11043
sqlalchemy/orm/query.py,sha256=dZ0kuz9KoRdba9wTRUKbSwPiQDWMH2qfDHl7w65qD2Q,172794
sqlalchemy/orm/relationships.py,sha256=tPaigWDao6IkBjdhfFRV8SE-EGZVy129p-JH0Fchbog,124442
sqlalchemy/orm/scoping.py,sha256=XQbBSdlbNC9kiKFt6RQ4AhR_Ds-zd2dbyEsDYQNzL_E,6393
sqlalchemy/orm/session.py,sha256=dIU4zd22lfQpYIM-P983X3I2cqRquuDaW-A5ZyB53RU,128754
sqlalchemy/orm/state.py,sha256=mK5CslhHSpFFsiXr8Le7OLDZW0Jmh0nc2haLvqSOAtM,31044
sqlalchemy/orm/strategies.py,sha256=6hI25yNC5C3wf55O7_iUZzCbyDD6IuuP5ju1E2LsvZ0,85055
sqlalchemy/orm/strategy_options.py,sha256=0FmD62V1RGfWcjxomIwSirUFDj9iueWcqNTyeh6MkDw,55505
sqlalchemy/orm/sync.py,sha256=M5lWCUhgzxI_CXh3WJvI6xEKLCeQ2F2e42DDri27vZ8,5536
sqlalchemy/orm/unitofwork.py,sha256=qM0DWBlZfI6BkZWH9Ir7xBxUWEXgnV53XytBMHSACq0,24735
sqlalchemy/orm/util.py,sha256=i4DpXzYO7qKYHDzYj2dMjKKc4Javu26NIrz9bDnn5qM,44859
sqlalchemy/pool/__init__.py,sha256=ryTuFoeMcSGBRtGWhkQLgqWBpDW72KRNU7mnEoI6zZs,1483
sqlalchemy/pool/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/pool/__pycache__/base.cpython-312.pyc,,
sqlalchemy/pool/__pycache__/dbapi_proxy.cpython-312.pyc,,
sqlalchemy/pool/__pycache__/impl.cpython-312.pyc,,
sqlalchemy/pool/base.py,sha256=zw3iYOeg-Yz4U95NpviMoVcSImgX-Ld-I1qw8vMQrjw,34609
sqlalchemy/pool/dbapi_proxy.py,sha256=fXfMOhXiphQUXtdUkXyALbSSdTK1rmAl-96UWdt1yi0,4320
sqlalchemy/pool/impl.py,sha256=IlCjSEY0e3TxLIM8Qqt_3kUp0TgQ_dUkFiB60DrRoEw,14594
sqlalchemy/processors.py,sha256=JaohpclZth6hoENx14gSoJ0g6Xtw2hBNYpJB6tDMgh8,5648
sqlalchemy/schema.py,sha256=6WropRk5UfzJ3ux_PW2XM6LF_VKChK3bVuH0CEtkxlE,2377
sqlalchemy/sql/__init__.py,sha256=yYsKlrXrIVLaaohxVqZDQny02FRj5uZ2KwBRtj6nDfE,3789
sqlalchemy/sql/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/sql/__pycache__/annotation.cpython-312.pyc,,
sqlalchemy/sql/__pycache__/base.cpython-312.pyc,,
sqlalchemy/sql/__pycache__/compiler.cpython-312.pyc,,
sqlalchemy/sql/__pycache__/crud.cpython-312.pyc,,
sqlalchemy/sql/__pycache__/ddl.cpython-312.pyc,,
sqlalchemy/sql/__pycache__/default_comparator.cpython-312.pyc,,
sqlalchemy/sql/__pycache__/dml.cpython-312.pyc,,
sqlalchemy/sql/__pycache__/elements.cpython-312.pyc,,
sqlalchemy/sql/__pycache__/expression.cpython-312.pyc,,
sqlalchemy/sql/__pycache__/functions.cpython-312.pyc,,
sqlalchemy/sql/__pycache__/naming.cpython-312.pyc,,
sqlalchemy/sql/__pycache__/operators.cpython-312.pyc,,
sqlalchemy/sql/__pycache__/schema.cpython-312.pyc,,
sqlalchemy/sql/__pycache__/selectable.cpython-312.pyc,,
sqlalchemy/sql/__pycache__/sqltypes.cpython-312.pyc,,
sqlalchemy/sql/__pycache__/type_api.cpython-312.pyc,,
sqlalchemy/sql/__pycache__/util.cpython-312.pyc,,
sqlalchemy/sql/__pycache__/visitors.cpython-312.pyc,,
sqlalchemy/sql/annotation.py,sha256=mEFt4M7DT4SRwDSRwmi5ZR4idRrCsRESITl9jDAU_HE,6651
sqlalchemy/sql/base.py,sha256=JqxZ-yhSWV37SpYxedwKjogOYIqopJy5b6sT4oE_kkU,21506
sqlalchemy/sql/compiler.py,sha256=vFd6x3wEZP3YIcWJpvi_zNLrtyhb7WUTvkQhXOqBKcI,124358
sqlalchemy/sql/crud.py,sha256=lioHSo6Ud4pEZ8H-4LHWgR6AHwPjfoB1PKxJL3EAab8,25840
sqlalchemy/sql/ddl.py,sha256=JWrv5XZNr6NtReXV_M4a4UBg8tACGpJD7EPoRAMWiNM,39549
sqlalchemy/sql/default_comparator.py,sha256=Q4if2ZxvIS0uVWM9sjE03DWSeNCKueuPvx5mfrjb-TM,12234
sqlalchemy/sql/dml.py,sha256=EbCBhs-9aFk1t7aSs9AXkTwOCoc9XfXnUygnU_LPl-A,34420
sqlalchemy/sql/elements.py,sha256=6KBj0jhabpzU0pq3-03fHexC9gC5nvkOzvl1e7j7RqQ,153952
sqlalchemy/sql/expression.py,sha256=ZOFtmLM6gKfC_GGq7jEnCjBntiZoSwfjbIHvbqg-v2M,9037
sqlalchemy/sql/functions.py,sha256=2BHESuoJoq_95h6KF9P_b_FX0LAKybFgmTLyAHPVRy0,33760
sqlalchemy/sql/naming.py,sha256=XhFmVhT4AyXTyfr98Fm1zJXDQWXGyaDSx6pjkFzwe1w,5885
sqlalchemy/sql/operators.py,sha256=z_Dj6FkSaCqb0pgXByRxWXscPuLypjyJuiV7t2n7nnU,42221
sqlalchemy/sql/schema.py,sha256=65jc_njLDfvjagA-oUtR4t-pPXmjycEFc0hCljsqAak,164499
sqlalchemy/sql/selectable.py,sha256=-suJZT84zQcY_FXCzhxbZcEHNVHXmbqECTlBy7U4UqI,132514
sqlalchemy/sql/sqltypes.py,sha256=ShJYIr_aHzwmxoC-0UBKgZaAdHQh4ztkPYs5bLkzuQk,95377
sqlalchemy/sql/type_api.py,sha256=G9T7BV8xdvtNnm8Ow-DJDIfinGJLkchJMsvKKHFeiEc,51485
sqlalchemy/sql/util.py,sha256=RqV2UkXR6TD-TNJp8KunVQnvs5gNVkSU7_pnHtJmA4g,29275
sqlalchemy/sql/visitors.py,sha256=WbHDTEFoIfBCPRPHohZTvG191KSTPVNvCl-yB9ooXKU,10290
sqlalchemy/testing/__init__.py,sha256=AMAb69uUKMaRMWpk-RYade6muNOfqhq-yx0gklK-tDw,2362
sqlalchemy/testing/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/testing/__pycache__/assertions.cpython-312.pyc,,
sqlalchemy/testing/__pycache__/assertsql.cpython-312.pyc,,
sqlalchemy/testing/__pycache__/config.cpython-312.pyc,,
sqlalchemy/testing/__pycache__/engines.cpython-312.pyc,,
sqlalchemy/testing/__pycache__/entities.cpython-312.pyc,,
sqlalchemy/testing/__pycache__/exclusions.cpython-312.pyc,,
sqlalchemy/testing/__pycache__/fixtures.cpython-312.pyc,,
sqlalchemy/testing/__pycache__/mock.cpython-312.pyc,,
sqlalchemy/testing/__pycache__/pickleable.cpython-312.pyc,,
sqlalchemy/testing/__pycache__/profiling.cpython-312.pyc,,
sqlalchemy/testing/__pycache__/provision.cpython-312.pyc,,
sqlalchemy/testing/__pycache__/replay_fixture.cpython-312.pyc,,
sqlalchemy/testing/__pycache__/requirements.cpython-312.pyc,,
sqlalchemy/testing/__pycache__/schema.cpython-312.pyc,,
sqlalchemy/testing/__pycache__/util.cpython-312.pyc,,
sqlalchemy/testing/__pycache__/warnings.cpython-312.pyc,,
sqlalchemy/testing/assertions.py,sha256=k-n4GfA2FHRVazA0d_RgHFG-c8pQZU-ymZEbAeRcuKo,18017
sqlalchemy/testing/assertsql.py,sha256=hex8NrwU4_yQlsd9TrzunWE93mreZq-QatZvyzGqMlc,13398
sqlalchemy/testing/config.py,sha256=xtKFYGVj0dhSlpLupX2nuYv_dqlwSr9h3xULp6GuwwA,2680
sqlalchemy/testing/engines.py,sha256=KLU8Uyy6mCA19c4ha4hnbfSST3OyhYiQWG03qixaeX8,10437
sqlalchemy/testing/entities.py,sha256=qEwjw1GnWPthQLFxtaNzIjth-wJWcPU12k_3_7CnE-k,3203
sqlalchemy/testing/exclusions.py,sha256=kKLxtaE7qXrOXmn5Y_woKod2h7V7DO4vLJ0NRb9TwHM,12765
sqlalchemy/testing/fixtures.py,sha256=6bPUb2yuO-xmvDbF5H1gpgBLnQRGsDxfuRiKXI2-vzQ,10814
sqlalchemy/testing/mock.py,sha256=A5GADY9Iwr7Cbr3OeAZwNl32EzJx1U2OIRPl8hLV3kM,893
sqlalchemy/testing/pickleable.py,sha256=LolLY6wnug3CwcJ701BTPYPm9A_dCNT8r4MT8F0M1N4,2693
sqlalchemy/testing/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
sqlalchemy/testing/plugin/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-312.pyc,,
sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-312.pyc,,
sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-312.pyc,,
sqlalchemy/testing/plugin/bootstrap.py,sha256=0rkror_9S175GPGNnbtbDmfdLEhu9v-AAv715lR8KyU,1468
sqlalchemy/testing/plugin/plugin_base.py,sha256=dbIPpXRX0jxL-zOMvnskHop_M23gNuCvKCBmQ7000DU,19692
sqlalchemy/testing/plugin/pytestplugin.py,sha256=oGYI6vsnSlwarpk4oo0j9nYLgortCvxDqeCk477Z1Ow,7166
sqlalchemy/testing/profiling.py,sha256=lKQLwvTW0H_JnuKaA4riaQOjwdRvW4JX7X2y4Q1m74Y,8513
sqlalchemy/testing/provision.py,sha256=8wno6MSqe2WGfoo_aiDzHmnxmQSi1CF5kIiWjankuBw,13263
sqlalchemy/testing/replay_fixture.py,sha256=W_QZD96t7ichRNvILOjhuoQXTCYnd2usiHBQhPkzUYI,5875
sqlalchemy/testing/requirements.py,sha256=74_qOYzLTexHADWJbplD8g1jzPvfg-DXJnFV3COocE0,27126
sqlalchemy/testing/schema.py,sha256=bDySUn-cFBuly4XZrxZLrWmWF0BO7KKAcV5uSZmM16w,3712
sqlalchemy/testing/suite/__init__.py,sha256=SUWU-LR3asH2hN2YsIhlpqxeuo8fpvej3o6nct-L4xU,358
sqlalchemy/testing/suite/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/testing/suite/__pycache__/test_cte.cpython-312.pyc,,
sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-312.pyc,,
sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-312.pyc,,
sqlalchemy/testing/suite/__pycache__/test_insert.cpython-312.pyc,,
sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-312.pyc,,
sqlalchemy/testing/suite/__pycache__/test_results.cpython-312.pyc,,
sqlalchemy/testing/suite/__pycache__/test_select.cpython-312.pyc,,
sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-312.pyc,,
sqlalchemy/testing/suite/__pycache__/test_types.cpython-312.pyc,,
sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-312.pyc,,
sqlalchemy/testing/suite/test_cte.py,sha256=yRWq8d3q5YJu_PBDaV_mrTcfGhJCaFtjWnL0P6H3p_0,6788
sqlalchemy/testing/suite/test_ddl.py,sha256=zzG8K1NrzTQowMbIqHEV2TjZwk0crEdc8d1u6oHbzwg,2870
sqlalchemy/testing/suite/test_dialect.py,sha256=aZ6b0Jy6OKKVdM9gYs74NNGls8tUfO0oya1RPpTfIME,4572
sqlalchemy/testing/suite/test_insert.py,sha256=Usn0cmLEfn82vOGlVHxaeaq9KH9tO6L_BZWrW-I3XYM,9586
sqlalchemy/testing/suite/test_reflection.py,sha256=lj5ki65Iie3XYxeo2FjyZq6IXktZ0wHFX_6Lq89wqm4,38495
sqlalchemy/testing/suite/test_results.py,sha256=YPNMvnbx9dulwvsa8nuTRx_SHw2XaAZhTTNulmc5_pA,11504
sqlalchemy/testing/suite/test_select.py,sha256=7IKzlpcg18mC3HegLy1-WcZ0wlphFEGGMoj0DTHvCNM,19984
sqlalchemy/testing/suite/test_sequence.py,sha256=oacBvtAqW3Ua3gcqyqnT1U_hpJutEW_EmEbwvf7Xq7E,4661
sqlalchemy/testing/suite/test_types.py,sha256=ox2anw4hbzJUF-9AeoxlDM1pdvRznX_2MIv3lSrjPu8,30448
sqlalchemy/testing/suite/test_update_delete.py,sha256=PA0kY_yeRDELIwvTljpElr8Q6sw_D0bFQqPTODzrL6w,1478
sqlalchemy/testing/util.py,sha256=lxFV07DVuFrTyE7i4DLxa-_ifGi2dX-mQul5gAUC36U,7738
sqlalchemy/testing/warnings.py,sha256=uHN8jNwg7d6D5eEYkI1RcSYk7wfyk7v8zNe5ApN0yIk,1298
sqlalchemy/types.py,sha256=5fqsxdZyh0VSUuKkLaNuvTkZ3Vd6yyXZaMLQ6-DdozU,3377
sqlalchemy/util/__init__.py,sha256=BeuHkC0z7vyYSNPpolkFhlNcQsLAp97kz5ZqI94BeQ0,6580
sqlalchemy/util/__pycache__/__init__.cpython-312.pyc,,
sqlalchemy/util/__pycache__/_collections.cpython-312.pyc,,
sqlalchemy/util/__pycache__/compat.cpython-312.pyc,,
sqlalchemy/util/__pycache__/deprecations.cpython-312.pyc,,
sqlalchemy/util/__pycache__/langhelpers.cpython-312.pyc,,
sqlalchemy/util/__pycache__/queue.cpython-312.pyc,,
sqlalchemy/util/__pycache__/topological.cpython-312.pyc,,
sqlalchemy/util/_collections.py,sha256=BtaTnF9T6DmcwNm_Ppn6bMC5q-DrlMDyqvdWL_5CR9s,29153
sqlalchemy/util/compat.py,sha256=eWgHNJyK3EiDky_TFkooH-4GLROKxw6jPW3AyDl0fq4,11794
sqlalchemy/util/deprecations.py,sha256=f3jR0vDfDzGCmJzrJhLmGFFn-GBlRc7EEMCSFa-s4BE,7128
sqlalchemy/util/langhelpers.py,sha256=1GY_8TJNEIqZR3tWSiryi-CPZIZxcYUXHlNAoePtDq8,49149
sqlalchemy/util/queue.py,sha256=EBxMwtWpxO2od9YlVetESq6-ShQER2ejH1MqmeA8iss,6827
sqlalchemy/util/topological.py,sha256=lymXt3K0HlPlJsZRQCyIyLS9VZNgRFuALXkJiB_e7Bk,2767

View File

@@ -0,0 +1,5 @@
Wheel-Version: 1.0
Generator: setuptools (75.8.0)
Root-Is-Purelib: false
Tag: cp312-cp312-win_amd64

View File

@@ -0,0 +1 @@
sqlalchemy

View File

@@ -0,0 +1 @@
pip

View File

@@ -0,0 +1,28 @@
Copyright 2007 Pallets
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@@ -0,0 +1,128 @@
Metadata-Version: 2.1
Name: Werkzeug
Version: 0.15.5
Summary: The comprehensive WSGI web application library.
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
Project-URL: Documentation, https://werkzeug.palletsprojects.com/
Project-URL: Code, https://github.com/pallets/werkzeug
Project-URL: Issue tracker, https://github.com/pallets/werkzeug/issues
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
Provides-Extra: dev
Requires-Dist: pytest ; extra == 'dev'
Requires-Dist: coverage ; extra == 'dev'
Requires-Dist: tox ; extra == 'dev'
Requires-Dist: sphinx ; extra == 'dev'
Requires-Dist: pallets-sphinx-themes ; extra == 'dev'
Requires-Dist: sphinx-issues ; extra == 'dev'
Provides-Extra: termcolor
Requires-Dist: termcolor ; extra == 'termcolor'
Provides-Extra: watchdog
Requires-Dist: watchdog ; extra == 'watchdog'
Werkzeug
========
*werkzeug* German noun: "tool". Etymology: *werk* ("work"), *zeug* ("stuff")
Werkzeug is a comprehensive `WSGI`_ web application library. It began as
a simple collection of various utilities for WSGI applications and has
become one of the most advanced WSGI utility libraries.
It includes:
- An interactive debugger that allows inspecting stack traces and
source code in the browser with an interactive interpreter for any
frame in the stack.
- A full-featured request object with objects to interact with
headers, query args, form data, files, and cookies.
- A response object that can wrap other WSGI applications and handle
streaming data.
- A routing system for matching URLs to endpoints and generating URLs
for endpoints, with an extensible system for capturing variables
from URLs.
- HTTP utilities to handle entity tags, cache control, dates, user
agents, cookies, files, and more.
- A threaded WSGI server for use while developing applications
locally.
- A test client for simulating HTTP requests during testing without
requiring running a server.
Werkzeug is Unicode aware and doesn't enforce any dependencies. It is up
to the developer to choose a template engine, database adapter, and even
how to handle requests. It can be used to build all sorts of end user
applications such as blogs, wikis, or bulletin boards.
`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while
providing more structure and patterns for defining powerful
applications.
Installing
----------
Install and update using `pip`_:
.. code-block:: text
pip install -U Werkzeug
A Simple Example
----------------
.. code-block:: python
from werkzeug.wrappers import Request, Response
@Request.application
def application(request):
return Response('Hello, World!')
if __name__ == '__main__':
from werkzeug.serving import run_simple
run_simple('localhost', 4000, application)
Links
-----
- Website: https://palletsprojects.com/p/werkzeug/
- Documentation: https://werkzeug.palletsprojects.com/
- Releases: https://pypi.org/project/Werkzeug/
- Code: https://github.com/pallets/werkzeug
- Issue tracker: https://github.com/pallets/werkzeug/issues
- Test status: https://dev.azure.com/pallets/werkzeug/_build
- Official chat: https://discord.gg/t6rrQZH
.. _WSGI: https://wsgi.readthedocs.io/en/latest/
.. _Flask: https://www.palletsprojects.com/p/flask/
.. _pip: https://pip.pypa.io/en/stable/quickstart/

View File

@@ -0,0 +1,120 @@
Werkzeug-0.15.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
Werkzeug-0.15.5.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475
Werkzeug-0.15.5.dist-info/METADATA,sha256=QMmXGaI5L-K5NH-S1q3ATVwWxqU0tQgUCdrJ7_OzqwU,4712
Werkzeug-0.15.5.dist-info/RECORD,,
Werkzeug-0.15.5.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
Werkzeug-0.15.5.dist-info/WHEEL,sha256=h_aVn5OB2IERUjMbi2pucmR_zzWJtk303YXvhh60NJ8,110
Werkzeug-0.15.5.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9
werkzeug/__init__.py,sha256=TqqguxCOVD9JRfiTjo_JNHcEmtQsdK1B9FxwDNchE18,6805
werkzeug/__pycache__/__init__.cpython-312.pyc,,
werkzeug/__pycache__/_compat.cpython-312.pyc,,
werkzeug/__pycache__/_internal.cpython-312.pyc,,
werkzeug/__pycache__/_reloader.cpython-312.pyc,,
werkzeug/__pycache__/datastructures.cpython-312.pyc,,
werkzeug/__pycache__/exceptions.cpython-312.pyc,,
werkzeug/__pycache__/filesystem.cpython-312.pyc,,
werkzeug/__pycache__/formparser.cpython-312.pyc,,
werkzeug/__pycache__/http.cpython-312.pyc,,
werkzeug/__pycache__/local.cpython-312.pyc,,
werkzeug/__pycache__/posixemulation.cpython-312.pyc,,
werkzeug/__pycache__/routing.cpython-312.pyc,,
werkzeug/__pycache__/security.cpython-312.pyc,,
werkzeug/__pycache__/serving.cpython-312.pyc,,
werkzeug/__pycache__/test.cpython-312.pyc,,
werkzeug/__pycache__/testapp.cpython-312.pyc,,
werkzeug/__pycache__/urls.cpython-312.pyc,,
werkzeug/__pycache__/useragents.cpython-312.pyc,,
werkzeug/__pycache__/utils.cpython-312.pyc,,
werkzeug/__pycache__/wsgi.cpython-312.pyc,,
werkzeug/_compat.py,sha256=oBEVVrJT4sqYdIZbUWmgV9T9w257RhTSDBlTjh0Zbb0,6431
werkzeug/_internal.py,sha256=Wx7cpTRWqeBd0LAqobo0lCO4pNUW4oav6XKf7Taumgk,14590
werkzeug/_reloader.py,sha256=J0EYq3YrGtC3bNDRqWCHf4yBPuVYoZBy8qp69eHO3YQ,11281
werkzeug/contrib/__init__.py,sha256=EvNyiiCF49j5P0fZYJ3ZGe82ofXdSBvUNqWFwwBMibQ,553
werkzeug/contrib/__pycache__/__init__.cpython-312.pyc,,
werkzeug/contrib/__pycache__/atom.cpython-312.pyc,,
werkzeug/contrib/__pycache__/cache.cpython-312.pyc,,
werkzeug/contrib/__pycache__/fixers.cpython-312.pyc,,
werkzeug/contrib/__pycache__/iterio.cpython-312.pyc,,
werkzeug/contrib/__pycache__/lint.cpython-312.pyc,,
werkzeug/contrib/__pycache__/profiler.cpython-312.pyc,,
werkzeug/contrib/__pycache__/securecookie.cpython-312.pyc,,
werkzeug/contrib/__pycache__/sessions.cpython-312.pyc,,
werkzeug/contrib/__pycache__/wrappers.cpython-312.pyc,,
werkzeug/contrib/atom.py,sha256=KpPJcTfzNW1J0VNQckCbVtVGBe3V8s451tOUya4qByI,15415
werkzeug/contrib/cache.py,sha256=AEh5UIw-Ui7sHZnlpvrD7ueOKUhCaAD55FXiPtXbbRs,32115
werkzeug/contrib/fixers.py,sha256=peEtAiIWYT5bh00EWEPOGKzGZXivOzVhhzKPvvzk1RM,9193
werkzeug/contrib/iterio.py,sha256=KKHa_8aCF_uhoeQVyPGUwrivuB6y6nNdXYo2D2vzOA8,10928
werkzeug/contrib/lint.py,sha256=NdIxP0E2kVt1xDIxoaIz3Rcl8ZdgmHaFbGTOaybGpN4,296
werkzeug/contrib/profiler.py,sha256=k_oMLU-AtsVvQ9TxNdermY6FuzSTYr-WE-ZmWb_DMyU,1229
werkzeug/contrib/securecookie.py,sha256=xbtElskGmtbiApgOJ5WhGgqGDs_68_PcWzqDIAY_QZY,13076
werkzeug/contrib/sessions.py,sha256=oVXh_7-6_CWOMxDKqcaK05H8RpYoWqAd3al-KzMFPYs,13042
werkzeug/contrib/wrappers.py,sha256=ZmNk0wpzD66yomPnQxapndZQs4c0kNJaRzqI-BVxeQk,13199
werkzeug/datastructures.py,sha256=8HoA4Gu9i7ZWi5OBjx244OLWvDEE4JTQQUUTRoAYKog,91761
werkzeug/debug/__init__.py,sha256=Bo3HvgTNY4NQ_2jROTSk3r1ScZcT_g_4EnuHTjKyrKM,18275
werkzeug/debug/__pycache__/__init__.cpython-312.pyc,,
werkzeug/debug/__pycache__/console.cpython-312.pyc,,
werkzeug/debug/__pycache__/repr.cpython-312.pyc,,
werkzeug/debug/__pycache__/tbtools.cpython-312.pyc,,
werkzeug/debug/console.py,sha256=HoBL21bbcmtiCLqiLDJLZi1LYnWMZxjoXYH5WaZB1XY,5469
werkzeug/debug/repr.py,sha256=lIwuhbyrMwVe3P_cFqNyqzHL7P93TLKod7lw9clydEw,9621
werkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673
werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507
werkzeug/debug/shared/debugger.js,sha256=rOhqZMRfpZnnu6_XCGn6wMWPhtfwRAcyZKksdIxPJas,6400
werkzeug/debug/shared/jquery.js,sha256=CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo,88145
werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191
werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200
werkzeug/debug/shared/source.png,sha256=RoGcBTE4CyCB85GBuDGTFlAnUqxwTBiIfDqW15EpnUQ,818
werkzeug/debug/shared/style.css,sha256=gZ9uhmb5zj3XLuT9RvnMp6jMINgQ-VVBCp-2AZbG3YQ,6604
werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220
werkzeug/debug/tbtools.py,sha256=SkAAA4KKfwsXJinUbf-AEP4GqONTsR4uU7WPUloXcSE,20318
werkzeug/exceptions.py,sha256=UzmMCkt5PCn5-TDNI0iGxGz07d3sKHQoArJrvurqVBE,23638
werkzeug/filesystem.py,sha256=HzKl-j0Hd8Jl66j778UbPTAYNnY6vUZgYLlBZ0e7uw0,2101
werkzeug/formparser.py,sha256=tN6SO4mn6RUsxRZq4qVBWXbNWNuasn2KaBznTieMaVk,21790
werkzeug/http.py,sha256=t0ET2tySAf9ZWdEelVWJoLaZzFViYpjoUmiYHPz10-E,43304
werkzeug/local.py,sha256=USVEcgIg-oCiUJFPIecFIW9jkIejfw4Fjf1u5yN-Np4,14456
werkzeug/middleware/__init__.py,sha256=f1SFZo67IlW4k1uqKzNHxYQlsakUS-D6KK_j0e3jjwQ,549
werkzeug/middleware/__pycache__/__init__.cpython-312.pyc,,
werkzeug/middleware/__pycache__/dispatcher.cpython-312.pyc,,
werkzeug/middleware/__pycache__/http_proxy.cpython-312.pyc,,
werkzeug/middleware/__pycache__/lint.cpython-312.pyc,,
werkzeug/middleware/__pycache__/profiler.cpython-312.pyc,,
werkzeug/middleware/__pycache__/proxy_fix.cpython-312.pyc,,
werkzeug/middleware/__pycache__/shared_data.cpython-312.pyc,,
werkzeug/middleware/dispatcher.py,sha256=_-KoMzHtcISHS7ouWKAOraqlCLprdh83YOAn_8DjLp8,2240
werkzeug/middleware/http_proxy.py,sha256=lRjTdMmghHiZuZrS7_UJ3gZc-vlFizhBbFZ-XZPLwIA,7117
werkzeug/middleware/lint.py,sha256=ItTwuWJnflF8xMT1uqU_Ty1ryhux-CjeUfskqaUpxsw,12967
werkzeug/middleware/profiler.py,sha256=8B_s23d6BGrU_q54gJsm6kcCbOJbTSqrXCsioHON0Xs,4471
werkzeug/middleware/proxy_fix.py,sha256=Y86VcU2oAQ--x0mi4iFVJyEFMzp3Ao8q0zvr_SsrpNw,8506
werkzeug/middleware/shared_data.py,sha256=WtSphPrsUdpEk4E-_09CAILhfOBJ1YtcX1LrxcQfIzw,8224
werkzeug/posixemulation.py,sha256=gSSiv1SCmOyzOM_nq1ZaZCtxP__C5MeDJl_4yXJmi4Q,3541
werkzeug/routing.py,sha256=BSgjrYNwj2j5dAHQtK4INEp2TOf4OJP8hBncYSRO2ps,73410
werkzeug/security.py,sha256=81149MplFq7-hD4RK4sKp9kzXXejjV9D4lWBzaRyeQ8,8106
werkzeug/serving.py,sha256=tUFUMg7Bj9iw3nA8ZgC_czMDJJKN7vFskajEmgEFhzE,36597
werkzeug/test.py,sha256=Cnb5xa3vLDL0hzFCH1fkG_YRpndViGQgCh4D744iSQk,40645
werkzeug/testapp.py,sha256=hcKBzorVlSHC-uGvGXXjCm3FzCwGWq4yjbTG3Pr7MV8,9301
werkzeug/urls.py,sha256=8yHdYI99N__-isoTwvGqvuj9QhOh66dd1Xh1DIp0q0g,39261
werkzeug/useragents.py,sha256=FIonyUF790Ro8OG8cJqG1zixhg5YzXdHmkZbrnK0QRo,5965
werkzeug/utils.py,sha256=O20Y0qWk5O1IWamC_A5gkmzR5cgBd3yDIHviwBTfNB0,27387
werkzeug/wrappers/__init__.py,sha256=S4VioKAmF_av9Ec9zQvG71X1EOkYfPx1TYck9jyDiyY,1384
werkzeug/wrappers/__pycache__/__init__.cpython-312.pyc,,
werkzeug/wrappers/__pycache__/accept.cpython-312.pyc,,
werkzeug/wrappers/__pycache__/auth.cpython-312.pyc,,
werkzeug/wrappers/__pycache__/base_request.cpython-312.pyc,,
werkzeug/wrappers/__pycache__/base_response.cpython-312.pyc,,
werkzeug/wrappers/__pycache__/common_descriptors.cpython-312.pyc,,
werkzeug/wrappers/__pycache__/etag.cpython-312.pyc,,
werkzeug/wrappers/__pycache__/json.cpython-312.pyc,,
werkzeug/wrappers/__pycache__/request.cpython-312.pyc,,
werkzeug/wrappers/__pycache__/response.cpython-312.pyc,,
werkzeug/wrappers/__pycache__/user_agent.cpython-312.pyc,,
werkzeug/wrappers/accept.py,sha256=TIvjUc0g73fhTWX54wg_D9NNzKvpnG1X8u1w26tK1o8,1760
werkzeug/wrappers/auth.py,sha256=Pmn6iaGHBrUyHbJpW0lZhO_q9RVoAa5QalaTqcavdAI,1158
werkzeug/wrappers/base_request.py,sha256=aknREwqVT7WJUxm4weUGdBj90H6rDR3DvsIvmYhaC8A,26943
werkzeug/wrappers/base_response.py,sha256=ZA1XlxtsbvG4SpbdOEMT5--z7aZM0w6C5y33W8wOXa4,27906
werkzeug/wrappers/common_descriptors.py,sha256=OJ8jOwMun4L-BxCuFPkK1vaefx_-Y5IndVXvvn_ems4,12089
werkzeug/wrappers/etag.py,sha256=TwMO1fvluXbBqnFTj2DvrCNa3mYhbHYe1UZAVzfXvuU,12533
werkzeug/wrappers/json.py,sha256=HvK_A4NpO0sLqgb10sTJcoZydYOwyNiPCJPV7SVgcgE,4343
werkzeug/wrappers/request.py,sha256=qPo2zmmBv4HxboywtWZb2pJL8OPXo07BUXBKw2j9Fi8,1338
werkzeug/wrappers/response.py,sha256=vDZFEGzDOG0jjmS0uVVjeT3hqRt1hFaf15npnx7RD28,2329
werkzeug/wrappers/user_agent.py,sha256=4bTgQKTLQmGUyxOREYOzbeiFP2VwIOE7E14AhUB5NqM,444
werkzeug/wsgi.py,sha256=h-zyAeInwE6X6ciSnHI14ImA85adV-F861PmR7UGtRk,36681

View File

@@ -0,0 +1,6 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.33.4)
Root-Is-Purelib: true
Tag: py2-none-any
Tag: py3-none-any

View File

@@ -0,0 +1 @@
werkzeug

View File

@@ -0,0 +1 @@
pip

View File

@@ -0,0 +1,221 @@
Metadata-Version: 2.1
Name: annotated-types
Version: 0.5.0
Summary: Reusable constraint types to use with typing.Annotated
Author-email: Samuel Colvin <s@muelcolvin.com>, Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Zac Hatfield-Dodds <zac@zhd.dev>
License-File: LICENSE
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Environment :: MacOS X
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Information Technology
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: POSIX :: Linux
Classifier: Operating System :: Unix
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: >=3.7
Requires-Dist: typing-extensions>=4.0.0; python_version < '3.9'
Description-Content-Type: text/markdown
# annotated-types
[![CI](https://github.com/annotated-types/annotated-types/workflows/CI/badge.svg?event=push)](https://github.com/annotated-types/annotated-types/actions?query=event%3Apush+branch%3Amain+workflow%3ACI)
[![pypi](https://img.shields.io/pypi/v/annotated-types.svg)](https://pypi.python.org/pypi/annotated-types)
[![versions](https://img.shields.io/pypi/pyversions/annotated-types.svg)](https://github.com/annotated-types/annotated-types)
[![license](https://img.shields.io/github/license/annotated-types/annotated-types.svg)](https://github.com/annotated-types/annotated-types/blob/main/LICENSE)
[PEP-593](https://peps.python.org/pep-0593/) added `typing.Annotated` as a way of
adding context-specific metadata to existing types, and specifies that
`Annotated[T, x]` _should_ be treated as `T` by any tool or library without special
logic for `x`.
This package provides metadata objects which can be used to represent common
constraints such as upper and lower bounds on scalar values and collection sizes,
a `Predicate` marker for runtime checks, and
descriptions of how we intend these metadata to be interpreted. In some cases,
we also note alternative representations which do not require this package.
## Install
```bash
pip install annotated-types
```
## Examples
```python
from typing import Annotated
from annotated_types import Gt, Len, Predicate
class MyClass:
age: Annotated[int, Gt(18)] # Valid: 19, 20, ...
# Invalid: 17, 18, "19", 19.0, ...
factors: list[Annotated[int, Predicate(is_prime)]] # Valid: 2, 3, 5, 7, 11, ...
# Invalid: 4, 8, -2, 5.0, "prime", ...
my_list: Annotated[list[int], Len(0, 10)] # Valid: [], [10, 20, 30, 40, 50]
# Invalid: (1, 2), ["abc"], [0] * 20
```
## Documentation
_While `annotated-types` avoids runtime checks for performance, users should not
construct invalid combinations such as `MultipleOf("non-numeric")` or `Annotated[int, Len(3)]`.
Downstream implementors may choose to raise an error, emit a warning, silently ignore
a metadata item, etc., if the metadata objects described below are used with an
incompatible type - or for any other reason!_
### Gt, Ge, Lt, Le
Express inclusive and/or exclusive bounds on orderable values - which may be numbers,
dates, times, strings, sets, etc. Note that the boundary value need not be of the
same type that was annotated, so long as they can be compared: `Annotated[int, Gt(1.5)]`
is fine, for example, and implies that the value is an integer x such that `x > 1.5`.
We suggest that implementors may also interpret `functools.partial(operator.le, 1.5)`
as being equivalent to `Gt(1.5)`, for users who wish to avoid a runtime dependency on
the `annotated-types` package.
To be explicit, these types have the following meanings:
* `Gt(x)` - value must be "Greater Than" `x` - equivalent to exclusive minimum
* `Ge(x)` - value must be "Greater than or Equal" to `x` - equivalent to inclusive minimum
* `Lt(x)` - value must be "Less Than" `x` - equivalent to exclusive maximum
* `Le(x)` - value must be "Less than or Equal" to `x` - equivalent to inclusive maximum
### Interval
`Interval(gt, ge, lt, le)` allows you to specify an upper and lower bound with a single
metadata object. `None` attributes should be ignored, and non-`None` attributes
treated as per the single bounds above.
### MultipleOf
`MultipleOf(multiple_of=x)` might be interpreted in two ways:
1. Python semantics, implying `value % multiple_of == 0`, or
2. [JSONschema semantics](https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6.2.1),
where `int(value / multiple_of) == value / multiple_of`.
We encourage users to be aware of these two common interpretations and their
distinct behaviours, especially since very large or non-integer numbers make
it easy to cause silent data corruption due to floating-point imprecision.
We encourage libraries to carefully document which interpretation they implement.
### MinLen, MaxLen, Len
`Len()` implies that `min_length <= len(value) <= max_length` - lower and upper bounds are inclusive.
As well as `Len()` which can optionally include upper and lower bounds, we also
provide `MinLen(x)` and `MaxLen(y)` which are equivalent to `Len(min_length=x)`
and `Len(max_length=y)` respectively.
`Len`, `MinLen`, and `MaxLen` may be used with any type which supports `len(value)`.
Examples of usage:
* `Annotated[list, MaxLen(10)]` (or `Annotated[list, Len(max_length=10))`) - list must have a length of 10 or less
* `Annotated[str, MaxLen(10)]` - string must have a length of 10 or less
* `Annotated[list, MinLen(3))` (or `Annotated[list, Len(min_length=3))`) - list must have a length of 3 or more
* `Annotated[list, Len(4, 6)]` - list must have a length of 4, 5, or 6
* `Annotated[list, Len(8, 8)]` - list must have a length of exactly 8
#### Changed in v0.4.0
* `min_inclusive` has been renamed to `min_length`, no change in meaning
* `max_exclusive` has been renamed to `max_length`, upper bound is now **inclusive** instead of **exclusive**
* The recommendation that slices are interpreted as `Len` has been removed due to ambiguity and different semantic
meaning of the upper bound in slices vs. `Len`
See [issue #23](https://github.com/annotated-types/annotated-types/issues/23) for discussion.
### Timezone
`Timezone` can be used with a `datetime` or a `time` to express which timezones
are allowed. `Annotated[datetime, Timezone(None)]` must be a naive datetime.
`Timezone[...]` ([literal ellipsis](https://docs.python.org/3/library/constants.html#Ellipsis))
expresses that any timezone-aware datetime is allowed. You may also pass a specific
timezone string or `timezone` object such as `Timezone(timezone.utc)` or
`Timezone("Africa/Abidjan")` to express that you only allow a specific timezone,
though we note that this is often a symptom of fragile design.
### Predicate
`Predicate(func: Callable)` expresses that `func(value)` is truthy for valid values.
Users should prefer the statically inspectable metadata above, but if you need
the full power and flexibility of arbitrary runtime predicates... here it is.
We provide a few predefined predicates for common string constraints:
`IsLower = Predicate(str.islower)`, `IsUpper = Predicate(str.isupper)`, and
`IsDigit = Predicate(str.isdigit)`.
Some libraries might have special logic to handle known or understandable predicates,
for example by checking for `str.isdigit` and using its presence to both call custom
logic to enforce digit-only strings, and customise some generated external schema.
Users are therefore encouraged to avoid indirection like `lambda s: s.lower()`, in
favor of introspectable methods such as `str.lower` or `re.compile("pattern").search`.
We do not specify what behaviour should be expected for predicates that raise
an exception. For example `Annotated[int, Predicate(str.isdigit)]` might silently
skip invalid constraints, or statically raise an error; or it might try calling it
and then propogate or discard the resulting
`TypeError: descriptor 'isdigit' for 'str' objects doesn't apply to a 'int' object`
exception. We encourage libraries to document the behaviour they choose.
### Integrating downstream types with `GroupedMetadata`
Implementers may choose to provide a convenience wrapper that groups multiple pieces of metadata.
This can help reduce verbosity and cognitive overhead for users.
For example, an implementer like Pydantic might provide a `Field` or `Meta` type that accepts keyword arguments and transforms these into low-level metadata:
```python
from dataclasses import dataclass
from typing import Iterator
from annotated_types import GroupedMetadata, Ge
@dataclass
class Field(GroupedMetadata):
ge: int | None = None
description: str | None = None
def __iter__(self) -> Iterator[object]:
# Iterating over a GroupedMetadata object should yield annotated-types
# constraint metadata objects which describe it as fully as possible,
# and may include other unknown objects too.
if self.ge is not None:
yield Ge(self.ge)
if self.description is not None:
yield Description(self.description)
```
Libraries 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.
Libraries 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.
Our 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`.
### Consuming metadata
We intend to not be perspcriptive 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).
It is up to the implementer to determine how this metadata is used.
You could use the metadata for runtime type checking, for generating schemas or to generate example data, amongst other use cases.
## Design & History
This package was designed at the PyCon 2022 sprints by the maintainers of Pydantic
and Hypothesis, with the goal of making it as easy as possible for end-users to
provide more informative annotations for use by runtime libraries.
It is deliberately minimal, and following PEP-593 allows considerable downstream
discretion in what (if anything!) they choose to support. Nonetheless, we expect
that staying simple and covering _only_ the most common use-cases will give users
and maintainers the best experience we can. If you'd like more constraints for your
types - follow our lead, by defining them and documenting them downstream!

View File

@@ -0,0 +1,11 @@
annotated_types-0.5.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
annotated_types-0.5.0.dist-info/METADATA,sha256=ie2NTBuiFKST5M2yUVgOgymZkQ5iad82BPFcZ07ZKBQ,11685
annotated_types-0.5.0.dist-info/RECORD,,
annotated_types-0.5.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
annotated_types-0.5.0.dist-info/WHEEL,sha256=y1bSCq4r5i4nMmpXeUJMqs3ipKvkZObrIXSvJHm1qCI,87
annotated_types-0.5.0.dist-info/licenses/LICENSE,sha256=_hBJiEsaDZNCkB6I4H8ykl0ksxIdmXK2poBfuYJLCV0,1083
annotated_types/__init__.py,sha256=qQOWO1uHTw0QjOL1Ggcs92oY4OPX0G7srTdq_M5lC-8,9375
annotated_types/__pycache__/__init__.cpython-312.pyc,,
annotated_types/__pycache__/test_cases.cpython-312.pyc,,
annotated_types/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
annotated_types/test_cases.py,sha256=z-ftQXel0GT9FjAN2PVXi8ZUVV7F1T9PvwZ5l-UAqpU,5680

View File

@@ -0,0 +1,4 @@
Wheel-Version: 1.0
Generator: hatchling 1.17.0
Root-Is-Purelib: true
Tag: py3-none-any

View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2022 the contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,319 @@
import sys
from dataclasses import dataclass
from datetime import timezone
from typing import TYPE_CHECKING, Any, Callable, Iterator, Optional, TypeVar, Union
if sys.version_info < (3, 8):
from typing_extensions import Protocol, runtime_checkable
else:
from typing import Protocol, runtime_checkable
if sys.version_info < (3, 9):
from typing_extensions import Annotated, Literal
else:
from typing import Annotated, Literal
if sys.version_info < (3, 10):
EllipsisType = type(Ellipsis)
KW_ONLY = {}
SLOTS = {}
else:
from types import EllipsisType
KW_ONLY = {"kw_only": True}
SLOTS = {"slots": True}
__all__ = (
'BaseMetadata',
'GroupedMetadata',
'Gt',
'Ge',
'Lt',
'Le',
'Interval',
'MultipleOf',
'MinLen',
'MaxLen',
'Len',
'Timezone',
'Predicate',
'LowerCase',
'UpperCase',
'IsDigits',
'__version__',
)
__version__ = '0.5.0'
T = TypeVar('T')
# arguments that start with __ are considered
# positional only
# see https://peps.python.org/pep-0484/#positional-only-arguments
class SupportsGt(Protocol):
def __gt__(self: T, __other: T) -> bool:
...
class SupportsGe(Protocol):
def __ge__(self: T, __other: T) -> bool:
...
class SupportsLt(Protocol):
def __lt__(self: T, __other: T) -> bool:
...
class SupportsLe(Protocol):
def __le__(self: T, __other: T) -> bool:
...
class SupportsMod(Protocol):
def __mod__(self: T, __other: T) -> T:
...
class SupportsDiv(Protocol):
def __div__(self: T, __other: T) -> T:
...
class BaseMetadata:
"""Base class for all metadata.
This exists mainly so that implementers
can do `isinstance(..., BaseMetadata)` while traversing field annotations.
"""
__slots__ = ()
@dataclass(frozen=True, **SLOTS)
class Gt(BaseMetadata):
"""Gt(gt=x) implies that the value must be greater than x.
It can be used with any type that supports the ``>`` operator,
including numbers, dates and times, strings, sets, and so on.
"""
gt: SupportsGt
@dataclass(frozen=True, **SLOTS)
class Ge(BaseMetadata):
"""Ge(ge=x) implies that the value must be greater than or equal to x.
It can be used with any type that supports the ``>=`` operator,
including numbers, dates and times, strings, sets, and so on.
"""
ge: SupportsGe
@dataclass(frozen=True, **SLOTS)
class Lt(BaseMetadata):
"""Lt(lt=x) implies that the value must be less than x.
It can be used with any type that supports the ``<`` operator,
including numbers, dates and times, strings, sets, and so on.
"""
lt: SupportsLt
@dataclass(frozen=True, **SLOTS)
class Le(BaseMetadata):
"""Le(le=x) implies that the value must be less than or equal to x.
It can be used with any type that supports the ``<=`` operator,
including numbers, dates and times, strings, sets, and so on.
"""
le: SupportsLe
@runtime_checkable
class GroupedMetadata(Protocol):
"""A grouping of multiple BaseMetadata objects.
`GroupedMetadata` on its own is not metadata and has no meaning.
All it the the constraint and metadata should be fully expressable
in terms of the `BaseMetadata`'s returned by `GroupedMetadata.__iter__()`.
Concrete implementations should override `GroupedMetadata.__iter__()`
to add their own metadata.
For example:
>>> @dataclass
>>> class Field(GroupedMetadata):
>>> gt: float | None = None
>>> description: str | None = None
...
>>> def __iter__(self) -> Iterable[BaseMetadata]:
>>> if self.gt is not None:
>>> yield Gt(self.gt)
>>> if self.description is not None:
>>> yield Description(self.gt)
Also see the implementation of `Interval` below for an example.
Parsers should recognize this and unpack it so that it can be used
both with and without unpacking:
- `Annotated[int, Field(...)]` (parser must unpack Field)
- `Annotated[int, *Field(...)]` (PEP-646)
""" # noqa: trailing-whitespace
@property
def __is_annotated_types_grouped_metadata__(self) -> Literal[True]:
return True
def __iter__(self) -> Iterator[BaseMetadata]:
...
if not TYPE_CHECKING:
__slots__ = () # allow subclasses to use slots
def __init_subclass__(cls, *args: Any, **kwargs: Any) -> None:
# Basic ABC like functionality without the complexity of an ABC
super().__init_subclass__(*args, **kwargs)
if cls.__iter__ is GroupedMetadata.__iter__:
raise TypeError("Can't subclass GroupedMetadata without implementing __iter__")
def __iter__(self) -> Iterator[BaseMetadata]: # noqa: F811
raise NotImplementedError # more helpful than "None has no attribute..." type errors
@dataclass(frozen=True, **KW_ONLY, **SLOTS)
class Interval(GroupedMetadata):
"""Interval can express inclusive or exclusive bounds with a single object.
It accepts keyword arguments ``gt``, ``ge``, ``lt``, and/or ``le``, which
are interpreted the same way as the single-bound constraints.
"""
gt: Union[SupportsGt, None] = None
ge: Union[SupportsGe, None] = None
lt: Union[SupportsLt, None] = None
le: Union[SupportsLe, None] = None
def __iter__(self) -> Iterator[BaseMetadata]:
"""Unpack an Interval into zero or more single-bounds."""
if self.gt is not None:
yield Gt(self.gt)
if self.ge is not None:
yield Ge(self.ge)
if self.lt is not None:
yield Lt(self.lt)
if self.le is not None:
yield Le(self.le)
@dataclass(frozen=True, **SLOTS)
class MultipleOf(BaseMetadata):
"""MultipleOf(multiple_of=x) might be interpreted in two ways:
1. Python semantics, implying ``value % multiple_of == 0``, or
2. JSONschema semantics, where ``int(value / multiple_of) == value / multiple_of``
We encourage users to be aware of these two common interpretations,
and libraries to carefully document which they implement.
"""
multiple_of: Union[SupportsDiv, SupportsMod]
@dataclass(frozen=True, **SLOTS)
class MinLen(BaseMetadata):
"""
MinLen() implies minimum inclusive length,
e.g. ``len(value) >= min_length``.
"""
min_length: Annotated[int, Ge(0)]
@dataclass(frozen=True, **SLOTS)
class MaxLen(BaseMetadata):
"""
MaxLen() implies maximum inclusive length,
e.g. ``len(value) <= max_length``.
"""
max_length: Annotated[int, Ge(0)]
@dataclass(frozen=True, **SLOTS)
class Len(GroupedMetadata):
"""
Len() implies that ``min_length <= len(value) <= max_length``.
Upper bound may be omitted or ``None`` to indicate no upper length bound.
"""
min_length: Annotated[int, Ge(0)] = 0
max_length: Optional[Annotated[int, Ge(0)]] = None
def __iter__(self) -> Iterator[BaseMetadata]:
"""Unpack a Len into zone or more single-bounds."""
if self.min_length > 0:
yield MinLen(self.min_length)
if self.max_length is not None:
yield MaxLen(self.max_length)
@dataclass(frozen=True, **SLOTS)
class Timezone(BaseMetadata):
"""Timezone(tz=...) requires a datetime to be aware (or ``tz=None``, naive).
``Annotated[datetime, Timezone(None)]`` must be a naive datetime.
``Timezone[...]`` (the ellipsis literal) expresses that the datetime must be
tz-aware but any timezone is allowed.
You may also pass a specific timezone string or timezone object such as
``Timezone(timezone.utc)`` or ``Timezone("Africa/Abidjan")`` to express that
you only allow a specific timezone, though we note that this is often
a symptom of poor design.
"""
tz: Union[str, timezone, EllipsisType, None]
@dataclass(frozen=True, **SLOTS)
class Predicate(BaseMetadata):
"""``Predicate(func: Callable)`` implies `func(value)` is truthy for valid values.
Users should prefer statically inspectable metadata, but if you need the full
power and flexibility of arbitrary runtime predicates... here it is.
We provide a few predefined predicates for common string constraints:
``IsLower = Predicate(str.islower)``, ``IsUpper = Predicate(str.isupper)``, and
``IsDigit = Predicate(str.isdigit)``. Users are encouraged to use methods which
can be given special handling, and avoid indirection like ``lambda s: s.lower()``.
Some libraries might have special logic to handle certain predicates, e.g. by
checking for `str.isdigit` and using its presence to both call custom logic to
enforce digit-only strings, and customise some generated external schema.
We do not specify what behaviour should be expected for predicates that raise
an exception. For example `Annotated[int, Predicate(str.isdigit)]` might silently
skip invalid constraints, or statically raise an error; or it might try calling it
and then propogate or discard the resulting exception.
"""
func: Callable[[Any], bool]
StrType = TypeVar("StrType", bound=str)
LowerCase = Annotated[StrType, Predicate(str.islower)]
UpperCase = Annotated[StrType, Predicate(str.isupper)]
IsDigits = Annotated[StrType, Predicate(str.isdigit)]
IsAscii = Annotated[StrType, Predicate(str.isascii)]

View File

@@ -0,0 +1,133 @@
import sys
from datetime import date, datetime, timedelta, timezone
from decimal import Decimal
from typing import Any, Dict, Iterable, Iterator, List, NamedTuple, Set, Tuple
if sys.version_info < (3, 9):
from typing_extensions import Annotated
else:
from typing import Annotated
import annotated_types as at
class Case(NamedTuple):
"""
A test case for `annotated_types`.
"""
annotation: Any
valid_cases: Iterable[Any]
invalid_cases: Iterable[Any]
def cases() -> Iterable[Case]:
# Gt, Ge, Lt, Le
yield Case(Annotated[int, at.Gt(4)], (5, 6, 1000), (4, 0, -1))
yield Case(Annotated[float, at.Gt(0.5)], (0.6, 0.7, 0.8, 0.9), (0.5, 0.0, -0.1))
yield Case(
Annotated[datetime, at.Gt(datetime(2000, 1, 1))],
[datetime(2000, 1, 2), datetime(2000, 1, 3)],
[datetime(2000, 1, 1), datetime(1999, 12, 31)],
)
yield Case(
Annotated[datetime, at.Gt(date(2000, 1, 1))],
[date(2000, 1, 2), date(2000, 1, 3)],
[date(2000, 1, 1), date(1999, 12, 31)],
)
yield Case(
Annotated[datetime, at.Gt(Decimal('1.123'))],
[Decimal('1.1231'), Decimal('123')],
[Decimal('1.123'), Decimal('0')],
)
yield Case(Annotated[int, at.Ge(4)], (4, 5, 6, 1000, 4), (0, -1))
yield Case(Annotated[float, at.Ge(0.5)], (0.5, 0.6, 0.7, 0.8, 0.9), (0.4, 0.0, -0.1))
yield Case(
Annotated[datetime, at.Ge(datetime(2000, 1, 1))],
[datetime(2000, 1, 2), datetime(2000, 1, 3)],
[datetime(1998, 1, 1), datetime(1999, 12, 31)],
)
yield Case(Annotated[int, at.Lt(4)], (0, -1), (4, 5, 6, 1000, 4))
yield Case(Annotated[float, at.Lt(0.5)], (0.4, 0.0, -0.1), (0.5, 0.6, 0.7, 0.8, 0.9))
yield Case(
Annotated[datetime, at.Lt(datetime(2000, 1, 1))],
[datetime(1999, 12, 31), datetime(1999, 12, 31)],
[datetime(2000, 1, 2), datetime(2000, 1, 3)],
)
yield Case(Annotated[int, at.Le(4)], (4, 0, -1), (5, 6, 1000))
yield Case(Annotated[float, at.Le(0.5)], (0.5, 0.0, -0.1), (0.6, 0.7, 0.8, 0.9))
yield Case(
Annotated[datetime, at.Le(datetime(2000, 1, 1))],
[datetime(2000, 1, 1), datetime(1999, 12, 31)],
[datetime(2000, 1, 2), datetime(2000, 1, 3)],
)
# Interval
yield Case(Annotated[int, at.Interval(gt=4)], (5, 6, 1000), (4, 0, -1))
yield Case(Annotated[int, at.Interval(gt=4, lt=10)], (5, 6), (4, 10, 1000, 0, -1))
yield Case(Annotated[float, at.Interval(ge=0.5, le=1)], (0.5, 0.9, 1), (0.49, 1.1))
yield Case(
Annotated[datetime, at.Interval(gt=datetime(2000, 1, 1), le=datetime(2000, 1, 3))],
[datetime(2000, 1, 2), datetime(2000, 1, 3)],
[datetime(2000, 1, 1), datetime(2000, 1, 4)],
)
yield Case(Annotated[int, at.MultipleOf(multiple_of=3)], (0, 3, 9), (1, 2, 4))
yield Case(Annotated[float, at.MultipleOf(multiple_of=0.5)], (0, 0.5, 1, 1.5), (0.4, 1.1))
# lengths
yield Case(Annotated[str, at.MinLen(3)], ('123', '1234', 'x' * 10), ('', '1', '12'))
yield Case(Annotated[str, at.Len(3)], ('123', '1234', 'x' * 10), ('', '1', '12'))
yield Case(Annotated[List[int], at.MinLen(3)], ([1, 2, 3], [1, 2, 3, 4], [1] * 10), ([], [1], [1, 2]))
yield Case(Annotated[List[int], at.Len(3)], ([1, 2, 3], [1, 2, 3, 4], [1] * 10), ([], [1], [1, 2]))
yield Case(Annotated[str, at.MaxLen(4)], ('', '1234'), ('12345', 'x' * 10))
yield Case(Annotated[str, at.Len(0, 4)], ('', '1234'), ('12345', 'x' * 10))
yield Case(Annotated[List[str], at.MaxLen(4)], ([], ['a', 'bcdef'], ['a', 'b', 'c']), (['a'] * 5, ['b'] * 10))
yield Case(Annotated[List[str], at.Len(0, 4)], ([], ['a', 'bcdef'], ['a', 'b', 'c']), (['a'] * 5, ['b'] * 10))
yield Case(Annotated[str, at.Len(3, 5)], ('123', '12345'), ('', '1', '12', '123456', 'x' * 10))
yield Case(Annotated[str, at.Len(3, 3)], ('123',), ('12', '1234'))
yield Case(Annotated[Dict[int, int], at.Len(2, 3)], [{1: 1, 2: 2}], [{}, {1: 1}, {1: 1, 2: 2, 3: 3, 4: 4}])
yield Case(Annotated[Set[int], at.Len(2, 3)], ({1, 2}, {1, 2, 3}), (set(), {1}, {1, 2, 3, 4}))
yield Case(Annotated[Tuple[int, ...], at.Len(2, 3)], ((1, 2), (1, 2, 3)), ((), (1,), (1, 2, 3, 4)))
# Timezone
yield Case(
Annotated[datetime, at.Timezone(None)], [datetime(2000, 1, 1)], [datetime(2000, 1, 1, tzinfo=timezone.utc)]
)
yield Case(
Annotated[datetime, at.Timezone(...)], [datetime(2000, 1, 1, tzinfo=timezone.utc)], [datetime(2000, 1, 1)]
)
yield Case(
Annotated[datetime, at.Timezone(timezone.utc)],
[datetime(2000, 1, 1, tzinfo=timezone.utc)],
[datetime(2000, 1, 1), datetime(2000, 1, 1, tzinfo=timezone(timedelta(hours=6)))],
)
yield Case(
Annotated[datetime, at.Timezone('Europe/London')],
[datetime(2000, 1, 1, tzinfo=timezone(timedelta(0), name='Europe/London'))],
[datetime(2000, 1, 1), datetime(2000, 1, 1, tzinfo=timezone(timedelta(hours=6)))],
)
# predicate types
yield Case(at.LowerCase[str], ['abc', 'foobar'], ['', 'A', 'Boom'])
yield Case(at.UpperCase[str], ['ABC', 'DEFO'], ['', 'a', 'abc', 'AbC'])
yield Case(at.IsDigits[str], ['123'], ['', 'ab', 'a1b2'])
yield Case(at.IsAscii[str], ['123', 'foo bar'], ['£100', '😊', 'whatever 👀'])
yield Case(Annotated[int, at.Predicate(lambda x: x % 2 == 0)], [0, 2, 4], [1, 3, 5])
# custom GroupedMetadata
class MyCustomGroupedMetadata(at.GroupedMetadata):
def __iter__(self) -> Iterator[at.Predicate]:
yield at.Predicate(lambda x: float(x).is_integer())
yield Case(Annotated[float, MyCustomGroupedMetadata()], [0, 2.0], [0.01, 1.5])

View File

@@ -0,0 +1 @@
pip

View File

@@ -0,0 +1,20 @@
Copyright 2010 Jason Kirtland
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@@ -0,0 +1,63 @@
Metadata-Version: 2.1
Name: blinker
Version: 1.6.2
Summary: Fast, simple object-to-object and broadcast signaling
Author-email: Jason Kirtland <jek@discorporate.us>
Maintainer-email: Pallets Ecosystem <contact@palletsprojects.com>
License: MIT License
Project-URL: Homepage, https://blinker.readthedocs.io
Project-URL: Documentation, https://blinker.readthedocs.io
Project-URL: Source Code, https://github.com/pallets-eco/blinker/
Project-URL: Issue Tracker, https://github.com/pallets-eco/blinker/issues/
Project-URL: Chat, https://discord.gg/pallets
Keywords: signal,emit,events,broadcast
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Topic :: Software Development :: Libraries
Requires-Python: >=3.7
Description-Content-Type: text/x-rst
License-File: LICENSE.rst
Blinker
=======
Blinker provides a fast dispatching system that allows any number of
interested parties to subscribe to events, or "signals".
Signal receivers can subscribe to specific senders or receive signals
sent by any sender.
.. code-block:: pycon
>>> from blinker import signal
>>> started = signal('round-started')
>>> def each(round):
... print(f"Round {round}")
...
>>> started.connect(each)
>>> def round_two(round):
... print("This is round two.")
...
>>> started.connect(round_two, sender=2)
>>> for round in range(1, 4):
... started.send(round)
...
Round 1!
Round 2!
This is round two.
Round 3!
Links
-----
- Documentation: https://blinker.readthedocs.io/
- Changes: https://blinker.readthedocs.io/#changes
- PyPI Releases: https://pypi.org/project/blinker/
- Source Code: https://github.com/pallets-eco/blinker/
- Issue Tracker: https://github.com/pallets-eco/blinker/issues/

View File

@@ -0,0 +1,16 @@
blinker-1.6.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
blinker-1.6.2.dist-info/LICENSE.rst,sha256=nrc6HzhZekqhcCXSrhvjg5Ykx5XphdTw6Xac4p-spGc,1054
blinker-1.6.2.dist-info/METADATA,sha256=7MRskabu2wQvWIMFwgqP3w2LDt8nR5nCxH7Anu1ZrBM,1964
blinker-1.6.2.dist-info/RECORD,,
blinker-1.6.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
blinker-1.6.2.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
blinker-1.6.2.dist-info/top_level.txt,sha256=2NmsENM0J2t9Z8mkjxHDmGMQj7Bm8f5ZTTYe1x1fZtM,8
blinker/__init__.py,sha256=Ko7EbvxyCl_UewgsP8XgDJqJcHZA7EsuhG72R_zDrcY,408
blinker/__pycache__/__init__.cpython-312.pyc,,
blinker/__pycache__/_saferef.cpython-312.pyc,,
blinker/__pycache__/_utilities.cpython-312.pyc,,
blinker/__pycache__/base.cpython-312.pyc,,
blinker/_saferef.py,sha256=kWOTIWnCY3kOb8lZP74Rbx7bR_BLVg4TjwzNCRLhKHs,9096
blinker/_utilities.py,sha256=GPXtJzykzVotoxHC79mgFQMPJtICwpVDCCpus4_JtsA,4110
blinker/base.py,sha256=7Y-C0ZVIe-NrrskPeqj0bLSp4R6Cpq5LrzI1DmLqMEA,20469
blinker/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0

View File

@@ -0,0 +1,5 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.40.0)
Root-Is-Purelib: true
Tag: py3-none-any

View File

@@ -0,0 +1 @@
blinker

View File

@@ -0,0 +1,19 @@
from blinker.base import ANY
from blinker.base import NamedSignal
from blinker.base import Namespace
from blinker.base import receiver_connected
from blinker.base import Signal
from blinker.base import signal
from blinker.base import WeakNamespace
__all__ = [
"ANY",
"NamedSignal",
"Namespace",
"Signal",
"WeakNamespace",
"receiver_connected",
"signal",
]
__version__ = "1.6.2"

View File

@@ -0,0 +1,230 @@
# extracted from Louie, http://pylouie.org/
# updated for Python 3
#
# Copyright (c) 2006 Patrick K. O'Brien, Mike C. Fletcher,
# Matthew R. Scott
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
#
# * Neither the name of the <ORGANIZATION> nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
"""Refactored 'safe reference from dispatcher.py"""
import operator
import sys
import traceback
import weakref
get_self = operator.attrgetter("__self__")
get_func = operator.attrgetter("__func__")
def safe_ref(target, on_delete=None):
"""Return a *safe* weak reference to a callable target.
- ``target``: The object to be weakly referenced, if it's a bound
method reference, will create a BoundMethodWeakref, otherwise
creates a simple weakref.
- ``on_delete``: If provided, will have a hard reference stored to
the callable to be called after the safe reference goes out of
scope with the reference object, (either a weakref or a
BoundMethodWeakref) as argument.
"""
try:
im_self = get_self(target)
except AttributeError:
if callable(on_delete):
return weakref.ref(target, on_delete)
else:
return weakref.ref(target)
else:
if im_self is not None:
# Turn a bound method into a BoundMethodWeakref instance.
# Keep track of these instances for lookup by disconnect().
assert hasattr(target, "im_func") or hasattr(target, "__func__"), (
f"safe_ref target {target!r} has im_self, but no im_func, "
"don't know how to create reference"
)
reference = BoundMethodWeakref(target=target, on_delete=on_delete)
return reference
class BoundMethodWeakref:
"""'Safe' and reusable weak references to instance methods.
BoundMethodWeakref objects provide a mechanism for referencing a
bound method without requiring that the method object itself
(which is normally a transient object) is kept alive. Instead,
the BoundMethodWeakref object keeps weak references to both the
object and the function which together define the instance method.
Attributes:
- ``key``: The identity key for the reference, calculated by the
class's calculate_key method applied to the target instance method.
- ``deletion_methods``: Sequence of callable objects taking single
argument, a reference to this object which will be called when
*either* the target object or target function is garbage
collected (i.e. when this object becomes invalid). These are
specified as the on_delete parameters of safe_ref calls.
- ``weak_self``: Weak reference to the target object.
- ``weak_func``: Weak reference to the target function.
Class Attributes:
- ``_all_instances``: Class attribute pointing to all live
BoundMethodWeakref objects indexed by the class's
calculate_key(target) method applied to the target objects.
This weak value dictionary is used to short-circuit creation so
that multiple references to the same (object, function) pair
produce the same BoundMethodWeakref instance.
"""
_all_instances = weakref.WeakValueDictionary() # type: ignore[var-annotated]
def __new__(cls, target, on_delete=None, *arguments, **named):
"""Create new instance or return current instance.
Basically this method of construction allows us to
short-circuit creation of references to already-referenced
instance methods. The key corresponding to the target is
calculated, and if there is already an existing reference,
that is returned, with its deletion_methods attribute updated.
Otherwise the new instance is created and registered in the
table of already-referenced methods.
"""
key = cls.calculate_key(target)
current = cls._all_instances.get(key)
if current is not None:
current.deletion_methods.append(on_delete)
return current
else:
base = super().__new__(cls)
cls._all_instances[key] = base
base.__init__(target, on_delete, *arguments, **named)
return base
def __init__(self, target, on_delete=None):
"""Return a weak-reference-like instance for a bound method.
- ``target``: The instance-method target for the weak reference,
must have im_self and im_func attributes and be
reconstructable via the following, which is true of built-in
instance methods::
target.im_func.__get__( target.im_self )
- ``on_delete``: Optional callback which will be called when
this weak reference ceases to be valid (i.e. either the
object or the function is garbage collected). Should take a
single argument, which will be passed a pointer to this
object.
"""
def remove(weak, self=self):
"""Set self.isDead to True when method or instance is destroyed."""
methods = self.deletion_methods[:]
del self.deletion_methods[:]
try:
del self.__class__._all_instances[self.key]
except KeyError:
pass
for function in methods:
try:
if callable(function):
function(self)
except Exception:
try:
traceback.print_exc()
except AttributeError:
e = sys.exc_info()[1]
print(
f"Exception during saferef {self} "
f"cleanup function {function}: {e}"
)
self.deletion_methods = [on_delete]
self.key = self.calculate_key(target)
im_self = get_self(target)
im_func = get_func(target)
self.weak_self = weakref.ref(im_self, remove)
self.weak_func = weakref.ref(im_func, remove)
self.self_name = str(im_self)
self.func_name = str(im_func.__name__)
@classmethod
def calculate_key(cls, target):
"""Calculate the reference key for this reference.
Currently this is a two-tuple of the id()'s of the target
object and the target function respectively.
"""
return (id(get_self(target)), id(get_func(target)))
def __str__(self):
"""Give a friendly representation of the object."""
return "{}({}.{})".format(
self.__class__.__name__,
self.self_name,
self.func_name,
)
__repr__ = __str__
def __hash__(self):
return hash((self.self_name, self.key))
def __nonzero__(self):
"""Whether we are still a valid reference."""
return self() is not None
def __eq__(self, other):
"""Compare with another reference."""
if not isinstance(other, self.__class__):
return operator.eq(self.__class__, type(other))
return operator.eq(self.key, other.key)
def __call__(self):
"""Return a strong reference to the bound method.
If the target cannot be retrieved, then will return None,
otherwise returns a bound instance method for our object and
function.
Note: You may call this method any number of times, as it does
not invalidate the reference.
"""
target = self.weak_self()
if target is not None:
function = self.weak_func()
if function is not None:
return function.__get__(target)
return None

View File

@@ -0,0 +1,142 @@
from __future__ import annotations
import asyncio
import inspect
import sys
import typing as t
from functools import partial
from weakref import ref
from blinker._saferef import BoundMethodWeakref
IdentityType = t.Union[t.Tuple[int, int], str, int]
class _symbol:
def __init__(self, name):
"""Construct a new named symbol."""
self.__name__ = self.name = name
def __reduce__(self):
return symbol, (self.name,)
def __repr__(self):
return self.name
_symbol.__name__ = "symbol"
class symbol:
"""A constant symbol.
>>> symbol('foo') is symbol('foo')
True
>>> symbol('foo')
foo
A slight refinement of the MAGICCOOKIE=object() pattern. The primary
advantage of symbol() is its repr(). They are also singletons.
Repeated calls of symbol('name') will all return the same instance.
"""
symbols = {} # type: ignore[var-annotated]
def __new__(cls, name):
try:
return cls.symbols[name]
except KeyError:
return cls.symbols.setdefault(name, _symbol(name))
def hashable_identity(obj: object) -> IdentityType:
if hasattr(obj, "__func__"):
return (id(obj.__func__), id(obj.__self__)) # type: ignore[attr-defined]
elif hasattr(obj, "im_func"):
return (id(obj.im_func), id(obj.im_self)) # type: ignore[attr-defined]
elif isinstance(obj, (int, str)):
return obj
else:
return id(obj)
WeakTypes = (ref, BoundMethodWeakref)
class annotatable_weakref(ref):
"""A weakref.ref that supports custom instance attributes."""
receiver_id: t.Optional[IdentityType]
sender_id: t.Optional[IdentityType]
def reference( # type: ignore[no-untyped-def]
object, callback=None, **annotations
) -> annotatable_weakref:
"""Return an annotated weak ref."""
if callable(object):
weak = callable_reference(object, callback)
else:
weak = annotatable_weakref(object, callback)
for key, value in annotations.items():
setattr(weak, key, value)
return weak # type: ignore[no-any-return]
def callable_reference(object, callback=None):
"""Return an annotated weak ref, supporting bound instance methods."""
if hasattr(object, "im_self") and object.im_self is not None:
return BoundMethodWeakref(target=object, on_delete=callback)
elif hasattr(object, "__self__") and object.__self__ is not None:
return BoundMethodWeakref(target=object, on_delete=callback)
return annotatable_weakref(object, callback)
class lazy_property:
"""A @property that is only evaluated once."""
def __init__(self, deferred):
self._deferred = deferred
self.__doc__ = deferred.__doc__
def __get__(self, obj, cls):
if obj is None:
return self
value = self._deferred(obj)
setattr(obj, self._deferred.__name__, value)
return value
def is_coroutine_function(func: t.Any) -> bool:
# Python < 3.8 does not correctly determine partially wrapped
# coroutine functions are coroutine functions, hence the need for
# this to exist. Code taken from CPython.
if sys.version_info >= (3, 8):
return asyncio.iscoroutinefunction(func)
else:
# Note that there is something special about the AsyncMock
# such that it isn't determined as a coroutine function
# without an explicit check.
try:
from unittest.mock import AsyncMock # type: ignore[attr-defined]
if isinstance(func, AsyncMock):
return True
except ImportError:
# Not testing, no asynctest to import
pass
while inspect.ismethod(func):
func = func.__func__
while isinstance(func, partial):
func = func.func
if not inspect.isfunction(func):
return False
if func.__code__.co_flags & inspect.CO_COROUTINE:
return True
acic = asyncio.coroutines._is_coroutine # type: ignore[attr-defined]
return getattr(func, "_is_coroutine", None) is acic

View File

@@ -0,0 +1,551 @@
"""Signals and events.
A small implementation of signals, inspired by a snippet of Django signal
API client code seen in a blog post. Signals are first-class objects and
each manages its own receivers and message emission.
The :func:`signal` function provides singleton behavior for named signals.
"""
from __future__ import annotations
import typing as t
from collections import defaultdict
from contextlib import contextmanager
from warnings import warn
from weakref import WeakValueDictionary
from blinker._utilities import annotatable_weakref
from blinker._utilities import hashable_identity
from blinker._utilities import IdentityType
from blinker._utilities import is_coroutine_function
from blinker._utilities import lazy_property
from blinker._utilities import reference
from blinker._utilities import symbol
from blinker._utilities import WeakTypes
if t.TYPE_CHECKING:
import typing_extensions as te
T_callable = t.TypeVar("T_callable", bound=t.Callable[..., t.Any])
T = t.TypeVar("T")
P = te.ParamSpec("P")
AsyncWrapperType = t.Callable[[t.Callable[P, T]], t.Callable[P, t.Awaitable[T]]]
SyncWrapperType = t.Callable[[t.Callable[P, t.Awaitable[T]]], t.Callable[P, T]]
ANY = symbol("ANY")
ANY.__doc__ = 'Token for "any sender".'
ANY_ID = 0
class Signal:
"""A notification emitter."""
#: An :obj:`ANY` convenience synonym, allows ``Signal.ANY``
#: without an additional import.
ANY = ANY
@lazy_property
def receiver_connected(self) -> Signal:
"""Emitted after each :meth:`connect`.
The signal sender is the signal instance, and the :meth:`connect`
arguments are passed through: *receiver*, *sender*, and *weak*.
.. versionadded:: 1.2
"""
return Signal(doc="Emitted after a receiver connects.")
@lazy_property
def receiver_disconnected(self) -> Signal:
"""Emitted after :meth:`disconnect`.
The sender is the signal instance, and the :meth:`disconnect` arguments
are passed through: *receiver* and *sender*.
Note, this signal is emitted **only** when :meth:`disconnect` is
called explicitly.
The disconnect signal can not be emitted by an automatic disconnect
(due to a weakly referenced receiver or sender going out of scope),
as the receiver and/or sender instances are no longer available for
use at the time this signal would be emitted.
An alternative approach is available by subscribing to
:attr:`receiver_connected` and setting up a custom weakref cleanup
callback on weak receivers and senders.
.. versionadded:: 1.2
"""
return Signal(doc="Emitted after a receiver disconnects.")
def __init__(self, doc: str | None = None) -> None:
"""
:param doc: optional. If provided, will be assigned to the signal's
__doc__ attribute.
"""
if doc:
self.__doc__ = doc
#: A mapping of connected receivers.
#:
#: The values of this mapping are not meaningful outside of the
#: internal :class:`Signal` implementation, however the boolean value
#: of the mapping is useful as an extremely efficient check to see if
#: any receivers are connected to the signal.
self.receivers: dict[IdentityType, t.Callable | annotatable_weakref] = {}
self.is_muted = False
self._by_receiver: dict[IdentityType, set[IdentityType]] = defaultdict(set)
self._by_sender: dict[IdentityType, set[IdentityType]] = defaultdict(set)
self._weak_senders: dict[IdentityType, annotatable_weakref] = {}
def connect(
self, receiver: T_callable, sender: t.Any = ANY, weak: bool = True
) -> T_callable:
"""Connect *receiver* to signal events sent by *sender*.
:param receiver: A callable. Will be invoked by :meth:`send` with
`sender=` as a single positional argument and any ``kwargs`` that
were provided to a call to :meth:`send`.
:param sender: Any object or :obj:`ANY`, defaults to ``ANY``.
Restricts notifications delivered to *receiver* to only those
:meth:`send` emissions sent by *sender*. If ``ANY``, the receiver
will always be notified. A *receiver* may be connected to
multiple *sender* values on the same Signal through multiple calls
to :meth:`connect`.
:param weak: If true, the Signal will hold a weakref to *receiver*
and automatically disconnect when *receiver* goes out of scope or
is garbage collected. Defaults to True.
"""
receiver_id = hashable_identity(receiver)
receiver_ref: T_callable | annotatable_weakref
if weak:
receiver_ref = reference(receiver, self._cleanup_receiver)
receiver_ref.receiver_id = receiver_id
else:
receiver_ref = receiver
sender_id: IdentityType
if sender is ANY:
sender_id = ANY_ID
else:
sender_id = hashable_identity(sender)
self.receivers.setdefault(receiver_id, receiver_ref)
self._by_sender[sender_id].add(receiver_id)
self._by_receiver[receiver_id].add(sender_id)
del receiver_ref
if sender is not ANY and sender_id not in self._weak_senders:
# wire together a cleanup for weakref-able senders
try:
sender_ref = reference(sender, self._cleanup_sender)
sender_ref.sender_id = sender_id
except TypeError:
pass
else:
self._weak_senders.setdefault(sender_id, sender_ref)
del sender_ref
# broadcast this connection. if receivers raise, disconnect.
if "receiver_connected" in self.__dict__ and self.receiver_connected.receivers:
try:
self.receiver_connected.send(
self, receiver=receiver, sender=sender, weak=weak
)
except TypeError as e:
self.disconnect(receiver, sender)
raise e
if receiver_connected.receivers and self is not receiver_connected:
try:
receiver_connected.send(
self, receiver_arg=receiver, sender_arg=sender, weak_arg=weak
)
except TypeError as e:
self.disconnect(receiver, sender)
raise e
return receiver
def connect_via(
self, sender: t.Any, weak: bool = False
) -> t.Callable[[T_callable], T_callable]:
"""Connect the decorated function as a receiver for *sender*.
:param sender: Any object or :obj:`ANY`. The decorated function
will only receive :meth:`send` emissions sent by *sender*. If
``ANY``, the receiver will always be notified. A function may be
decorated multiple times with differing *sender* values.
:param weak: If true, the Signal will hold a weakref to the
decorated function and automatically disconnect when *receiver*
goes out of scope or is garbage collected. Unlike
:meth:`connect`, this defaults to False.
The decorated function will be invoked by :meth:`send` with
`sender=` as a single positional argument and any ``kwargs`` that
were provided to the call to :meth:`send`.
.. versionadded:: 1.1
"""
def decorator(fn: T_callable) -> T_callable:
self.connect(fn, sender, weak)
return fn
return decorator
@contextmanager
def connected_to(
self, receiver: t.Callable, sender: t.Any = ANY
) -> t.Generator[None, None, None]:
"""Execute a block with the signal temporarily connected to *receiver*.
:param receiver: a receiver callable
:param sender: optional, a sender to filter on
This is a context manager for use in the ``with`` statement. It can
be useful in unit tests. *receiver* is connected to the signal for
the duration of the ``with`` block, and will be disconnected
automatically when exiting the block:
.. code-block:: python
with on_ready.connected_to(receiver):
# do stuff
on_ready.send(123)
.. versionadded:: 1.1
"""
self.connect(receiver, sender=sender, weak=False)
try:
yield None
except Exception as e:
self.disconnect(receiver)
raise e
else:
self.disconnect(receiver)
@contextmanager
def muted(self) -> t.Generator[None, None, None]:
"""Context manager for temporarily disabling signal.
Useful for test purposes.
"""
self.is_muted = True
try:
yield None
except Exception as e:
raise e
finally:
self.is_muted = False
def temporarily_connected_to(
self, receiver: t.Callable, sender: t.Any = ANY
) -> t.ContextManager[None]:
"""An alias for :meth:`connected_to`.
:param receiver: a receiver callable
:param sender: optional, a sender to filter on
.. versionadded:: 0.9
.. versionchanged:: 1.1
Renamed to :meth:`connected_to`. ``temporarily_connected_to`` was
deprecated in 1.2 and will be removed in a subsequent version.
"""
warn(
"temporarily_connected_to is deprecated; use connected_to instead.",
DeprecationWarning,
)
return self.connected_to(receiver, sender)
def send(
self,
*sender: t.Any,
_async_wrapper: AsyncWrapperType | None = None,
**kwargs: t.Any,
) -> list[tuple[t.Callable, t.Any]]:
"""Emit this signal on behalf of *sender*, passing on ``kwargs``.
Returns a list of 2-tuples, pairing receivers with their return
value. The ordering of receiver notification is undefined.
:param sender: Any object or ``None``. If omitted, synonymous
with ``None``. Only accepts one positional argument.
:param _async_wrapper: A callable that should wrap a coroutine
receiver and run it when called synchronously.
:param kwargs: Data to be sent to receivers.
"""
if self.is_muted:
return []
sender = self._extract_sender(sender)
results = []
for receiver in self.receivers_for(sender):
if is_coroutine_function(receiver):
if _async_wrapper is None:
raise RuntimeError("Cannot send to a coroutine function")
receiver = _async_wrapper(receiver)
result = receiver(sender, **kwargs) # type: ignore[call-arg]
results.append((receiver, result))
return results
async def send_async(
self,
*sender: t.Any,
_sync_wrapper: SyncWrapperType | None = None,
**kwargs: t.Any,
) -> list[tuple[t.Callable, t.Any]]:
"""Emit this signal on behalf of *sender*, passing on ``kwargs``.
Returns a list of 2-tuples, pairing receivers with their return
value. The ordering of receiver notification is undefined.
:param sender: Any object or ``None``. If omitted, synonymous
with ``None``. Only accepts one positional argument.
:param _sync_wrapper: A callable that should wrap a synchronous
receiver and run it when awaited.
:param kwargs: Data to be sent to receivers.
"""
if self.is_muted:
return []
sender = self._extract_sender(sender)
results = []
for receiver in self.receivers_for(sender):
if not is_coroutine_function(receiver):
if _sync_wrapper is None:
raise RuntimeError("Cannot send to a non-coroutine function")
receiver = _sync_wrapper(receiver) # type: ignore[arg-type]
result = await receiver(sender, **kwargs) # type: ignore[call-arg, misc]
results.append((receiver, result))
return results
def _extract_sender(self, sender: t.Any) -> t.Any:
if not self.receivers:
# Ensure correct signature even on no-op sends, disable with -O
# for lowest possible cost.
if __debug__ and sender and len(sender) > 1:
raise TypeError(
f"send() accepts only one positional argument, {len(sender)} given"
)
return []
# Using '*sender' rather than 'sender=None' allows 'sender' to be
# used as a keyword argument- i.e. it's an invisible name in the
# function signature.
if len(sender) == 0:
sender = None
elif len(sender) > 1:
raise TypeError(
f"send() accepts only one positional argument, {len(sender)} given"
)
else:
sender = sender[0]
return sender
def has_receivers_for(self, sender: t.Any) -> bool:
"""True if there is probably a receiver for *sender*.
Performs an optimistic check only. Does not guarantee that all
weakly referenced receivers are still alive. See
:meth:`receivers_for` for a stronger search.
"""
if not self.receivers:
return False
if self._by_sender[ANY_ID]:
return True
if sender is ANY:
return False
return hashable_identity(sender) in self._by_sender
def receivers_for(
self, sender: t.Any
) -> t.Generator[t.Callable | annotatable_weakref, None, None]:
"""Iterate all live receivers listening for *sender*."""
# TODO: test receivers_for(ANY)
if self.receivers:
sender_id = hashable_identity(sender)
if sender_id in self._by_sender:
ids = self._by_sender[ANY_ID] | self._by_sender[sender_id]
else:
ids = self._by_sender[ANY_ID].copy()
for receiver_id in ids:
receiver = self.receivers.get(receiver_id)
if receiver is None:
continue
if isinstance(receiver, WeakTypes):
strong = receiver()
if strong is None:
self._disconnect(receiver_id, ANY_ID)
continue
receiver = strong
yield receiver # type: ignore[misc]
def disconnect(self, receiver: t.Callable, sender: t.Any = ANY) -> None:
"""Disconnect *receiver* from this signal's events.
:param receiver: a previously :meth:`connected<connect>` callable
:param sender: a specific sender to disconnect from, or :obj:`ANY`
to disconnect from all senders. Defaults to ``ANY``.
"""
sender_id: IdentityType
if sender is ANY:
sender_id = ANY_ID
else:
sender_id = hashable_identity(sender)
receiver_id = hashable_identity(receiver)
self._disconnect(receiver_id, sender_id)
if (
"receiver_disconnected" in self.__dict__
and self.receiver_disconnected.receivers
):
self.receiver_disconnected.send(self, receiver=receiver, sender=sender)
def _disconnect(self, receiver_id: IdentityType, sender_id: IdentityType) -> None:
if sender_id == ANY_ID:
if self._by_receiver.pop(receiver_id, False):
for bucket in self._by_sender.values():
bucket.discard(receiver_id)
self.receivers.pop(receiver_id, None)
else:
self._by_sender[sender_id].discard(receiver_id)
self._by_receiver[receiver_id].discard(sender_id)
def _cleanup_receiver(self, receiver_ref: annotatable_weakref) -> None:
"""Disconnect a receiver from all senders."""
self._disconnect(t.cast(IdentityType, receiver_ref.receiver_id), ANY_ID)
def _cleanup_sender(self, sender_ref: annotatable_weakref) -> None:
"""Disconnect all receivers from a sender."""
sender_id = t.cast(IdentityType, sender_ref.sender_id)
assert sender_id != ANY_ID
self._weak_senders.pop(sender_id, None)
for receiver_id in self._by_sender.pop(sender_id, ()):
self._by_receiver[receiver_id].discard(sender_id)
def _cleanup_bookkeeping(self) -> None:
"""Prune unused sender/receiver bookkeeping. Not threadsafe.
Connecting & disconnecting leave behind a small amount of bookkeeping
for the receiver and sender values. Typical workloads using Blinker,
for example in most web apps, Flask, CLI scripts, etc., are not
adversely affected by this bookkeeping.
With a long-running Python process performing dynamic signal routing
with high volume- e.g. connecting to function closures, "senders" are
all unique object instances, and doing all of this over and over- you
may see memory usage will grow due to extraneous bookkeeping. (An empty
set() for each stale sender/receiver pair.)
This method will prune that bookkeeping away, with the caveat that such
pruning is not threadsafe. The risk is that cleanup of a fully
disconnected receiver/sender pair occurs while another thread is
connecting that same pair. If you are in the highly dynamic, unique
receiver/sender situation that has lead you to this method, that
failure mode is perhaps not a big deal for you.
"""
for mapping in (self._by_sender, self._by_receiver):
for _id, bucket in list(mapping.items()):
if not bucket:
mapping.pop(_id, None)
def _clear_state(self) -> None:
"""Throw away all signal state. Useful for unit tests."""
self._weak_senders.clear()
self.receivers.clear()
self._by_sender.clear()
self._by_receiver.clear()
receiver_connected = Signal(
"""\
Sent by a :class:`Signal` after a receiver connects.
:argument: the Signal that was connected to
:keyword receiver_arg: the connected receiver
:keyword sender_arg: the sender to connect to
:keyword weak_arg: true if the connection to receiver_arg is a weak reference
.. deprecated:: 1.2
As of 1.2, individual signals have their own private
:attr:`~Signal.receiver_connected` and
:attr:`~Signal.receiver_disconnected` signals with a slightly simplified
call signature. This global signal is planned to be removed in 1.6.
"""
)
class NamedSignal(Signal):
"""A named generic notification emitter."""
def __init__(self, name: str, doc: str | None = None) -> None:
Signal.__init__(self, doc)
#: The name of this signal.
self.name = name
def __repr__(self) -> str:
base = Signal.__repr__(self)
return f"{base[:-1]}; {self.name!r}>"
class Namespace(dict):
"""A mapping of signal names to signals."""
def signal(self, name: str, doc: str | None = None) -> NamedSignal:
"""Return the :class:`NamedSignal` *name*, creating it if required.
Repeated calls to this function will return the same signal object.
"""
try:
return self[name] # type: ignore[no-any-return]
except KeyError:
result = self.setdefault(name, NamedSignal(name, doc))
return result # type: ignore[no-any-return]
class WeakNamespace(WeakValueDictionary):
"""A weak mapping of signal names to signals.
Automatically cleans up unused Signals when the last reference goes out
of scope. This namespace implementation exists for a measure of legacy
compatibility with Blinker <= 1.2, and may be dropped in the future.
.. versionadded:: 1.3
"""
def signal(self, name: str, doc: str | None = None) -> NamedSignal:
"""Return the :class:`NamedSignal` *name*, creating it if required.
Repeated calls to this function will return the same signal object.
"""
try:
return self[name] # type: ignore[no-any-return]
except KeyError:
result = self.setdefault(name, NamedSignal(name, doc))
return result # type: ignore[no-any-return]
signal = Namespace().signal

View File

View File

@@ -0,0 +1 @@
pip

View File

@@ -0,0 +1,21 @@
This package contains a modified version of ca-bundle.crt:
ca-bundle.crt -- Bundle of CA Root Certificates
Certificate data from Mozilla as of: Thu Nov 3 19:04:19 2011#
This is a bundle of X.509 certificates of public Certificate Authorities
(CA). These were automatically extracted from Mozilla's root certificates
file (certdata.txt). This file can be found in the mozilla source tree:
https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt
It contains the certificates in PEM format and therefore
can be directly used with curl / libcurl / php_curl, or with
an Apache+mod_ssl webserver for SSL client authentication.
Just configure this file as the SSLCACertificateFile.#
***** BEGIN LICENSE BLOCK *****
This Source Code Form is subject to the terms of the Mozilla Public License,
v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain
one at http://mozilla.org/MPL/2.0/.
***** END LICENSE BLOCK *****
@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $

View File

@@ -0,0 +1,69 @@
Metadata-Version: 2.1
Name: certifi
Version: 2023.7.22
Summary: Python package for providing Mozilla's CA Bundle.
Home-page: https://github.com/certifi/python-certifi
Author: Kenneth Reitz
Author-email: me@kennethreitz.com
License: MPL-2.0
Project-URL: Source, https://github.com/certifi/python-certifi
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)
Classifier: Natural Language :: English
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Requires-Python: >=3.6
License-File: LICENSE
Certifi: Python SSL Certificates
================================
Certifi provides Mozilla's carefully curated collection of Root Certificates for
validating the trustworthiness of SSL certificates while verifying the identity
of TLS hosts. It has been extracted from the `Requests`_ project.
Installation
------------
``certifi`` is available on PyPI. Simply install it with ``pip``::
$ pip install certifi
Usage
-----
To reference the installed certificate authority (CA) bundle, you can use the
built-in function::
>>> import certifi
>>> certifi.where()
'/usr/local/lib/python3.7/site-packages/certifi/cacert.pem'
Or from the command line::
$ python -m certifi
/usr/local/lib/python3.7/site-packages/certifi/cacert.pem
Enjoy!
.. _`Requests`: https://requests.readthedocs.io/en/master/
Addition/Removal of Certificates
--------------------------------
Certifi does not support any addition/removal or other modification of the
CA trust store content. This project is intended to provide a reliable and
highly portable root of trust to python deployments. Look to upstream projects
for methods to use alternate trust.

View File

@@ -0,0 +1,15 @@
certifi-2023.7.22.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
certifi-2023.7.22.dist-info/LICENSE,sha256=oC9sY4-fuE0G93ZMOrCF2K9-2luTwWbaVDEkeQd8b7A,1052
certifi-2023.7.22.dist-info/METADATA,sha256=oyc8gd32SOVo0IGolt8-bR7FnZ9Z99GoHoGE6ACcvFA,2191
certifi-2023.7.22.dist-info/RECORD,,
certifi-2023.7.22.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
certifi-2023.7.22.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92
certifi-2023.7.22.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8
certifi/__init__.py,sha256=L_j-d0kYuA_MzA2_2hraF1ovf6KT6DTquRdV3paQwOk,94
certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243
certifi/__pycache__/__init__.cpython-312.pyc,,
certifi/__pycache__/__main__.cpython-312.pyc,,
certifi/__pycache__/core.cpython-312.pyc,,
certifi/cacert.pem,sha256=eU0Dn_3yd8BH4m8sfVj4Glhl2KDrcCSg-sEWT-pNJ88,281617
certifi/core.py,sha256=lhewz0zFb2b4ULsQurElmloYwQoecjWzPqY67P8T7iM,4219
certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0

Some files were not shown because too many files have changed in this diff Show More