ss
This commit is contained in:
19
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
19
.idea/inspectionProfiles/Project_Default.xml
generated
Normal 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>
|
||||
1
.venv/Lib/site-packages/Flask-1.1.1.dist-info/INSTALLER
Normal file
1
.venv/Lib/site-packages/Flask-1.1.1.dist-info/INSTALLER
Normal file
@@ -0,0 +1 @@
|
||||
pip
|
||||
28
.venv/Lib/site-packages/Flask-1.1.1.dist-info/LICENSE.rst
Normal file
28
.venv/Lib/site-packages/Flask-1.1.1.dist-info/LICENSE.rst
Normal 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.
|
||||
134
.venv/Lib/site-packages/Flask-1.1.1.dist-info/METADATA
Normal file
134
.venv/Lib/site-packages/Flask-1.1.1.dist-info/METADATA
Normal 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/
|
||||
|
||||
|
||||
49
.venv/Lib/site-packages/Flask-1.1.1.dist-info/RECORD
Normal file
49
.venv/Lib/site-packages/Flask-1.1.1.dist-info/RECORD
Normal 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
|
||||
6
.venv/Lib/site-packages/Flask-1.1.1.dist-info/WHEEL
Normal file
6
.venv/Lib/site-packages/Flask-1.1.1.dist-info/WHEEL
Normal 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
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
[console_scripts]
|
||||
flask = flask.cli:main
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
flask
|
||||
@@ -0,0 +1 @@
|
||||
pip
|
||||
@@ -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.
|
||||
@@ -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/
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1,5 @@
|
||||
Wheel-Version: 1.0
|
||||
Generator: bdist_wheel (0.37.1)
|
||||
Root-Is-Purelib: true
|
||||
Tag: py3-none-any
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
flask_debugtoolbar
|
||||
@@ -0,0 +1 @@
|
||||
pip
|
||||
@@ -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.
|
||||
@@ -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/
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
flask_sqlalchemy
|
||||
@@ -0,0 +1 @@
|
||||
pip
|
||||
32
.venv/Lib/site-packages/Flask_Script-2.0.6.dist-info/LICENSE
Normal file
32
.venv/Lib/site-packages/Flask_Script-2.0.6.dist-info/LICENSE
Normal 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.
|
||||
@@ -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>`_
|
||||
|
||||
|
||||
15
.venv/Lib/site-packages/Flask_Script-2.0.6.dist-info/RECORD
Normal file
15
.venv/Lib/site-packages/Flask_Script-2.0.6.dist-info/RECORD
Normal 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
|
||||
@@ -0,0 +1,5 @@
|
||||
Wheel-Version: 1.0
|
||||
Generator: setuptools (75.8.0)
|
||||
Root-Is-Purelib: true
|
||||
Tag: py3-none-any
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
flask_script
|
||||
@@ -0,0 +1 @@
|
||||
pip
|
||||
28
.venv/Lib/site-packages/Jinja2-2.11.3.dist-info/LICENSE.rst
Normal file
28
.venv/Lib/site-packages/Jinja2-2.11.3.dist-info/LICENSE.rst
Normal 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.
|
||||
106
.venv/Lib/site-packages/Jinja2-2.11.3.dist-info/METADATA
Normal file
106
.venv/Lib/site-packages/Jinja2-2.11.3.dist-info/METADATA
Normal 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
|
||||
|
||||
|
||||
62
.venv/Lib/site-packages/Jinja2-2.11.3.dist-info/RECORD
Normal file
62
.venv/Lib/site-packages/Jinja2-2.11.3.dist-info/RECORD
Normal 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
|
||||
6
.venv/Lib/site-packages/Jinja2-2.11.3.dist-info/WHEEL
Normal file
6
.venv/Lib/site-packages/Jinja2-2.11.3.dist-info/WHEEL
Normal 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
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
[babel.extractors]
|
||||
jinja2 = jinja2.ext:babel_extract [i18n]
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
jinja2
|
||||
@@ -0,0 +1 @@
|
||||
pip
|
||||
@@ -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.
|
||||
112
.venv/Lib/site-packages/MarkupSafe-1.1.1.dist-info/METADATA
Normal file
112
.venv/Lib/site-packages/MarkupSafe-1.1.1.dist-info/METADATA
Normal 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'<script>alert(document.cookie);</script>')
|
||||
>>> # 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>"World"</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
|
||||
16
.venv/Lib/site-packages/MarkupSafe-1.1.1.dist-info/RECORD
Normal file
16
.venv/Lib/site-packages/MarkupSafe-1.1.1.dist-info/RECORD
Normal 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
|
||||
5
.venv/Lib/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL
Normal file
5
.venv/Lib/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL
Normal file
@@ -0,0 +1,5 @@
|
||||
Wheel-Version: 1.0
|
||||
Generator: setuptools (75.8.0)
|
||||
Root-Is-Purelib: true
|
||||
Tag: py3-none-any
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
markupsafe
|
||||
@@ -0,0 +1 @@
|
||||
pip
|
||||
19
.venv/Lib/site-packages/PyMySQL-0.9.3.dist-info/LICENSE
Normal file
19
.venv/Lib/site-packages/PyMySQL-0.9.3.dist-info/LICENSE
Normal 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.
|
||||
181
.venv/Lib/site-packages/PyMySQL-0.9.3.dist-info/METADATA
Normal file
181
.venv/Lib/site-packages/PyMySQL-0.9.3.dist-info/METADATA
Normal 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.
|
||||
|
||||
|
||||
50
.venv/Lib/site-packages/PyMySQL-0.9.3.dist-info/RECORD
Normal file
50
.venv/Lib/site-packages/PyMySQL-0.9.3.dist-info/RECORD
Normal 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
|
||||
6
.venv/Lib/site-packages/PyMySQL-0.9.3.dist-info/WHEEL
Normal file
6
.venv/Lib/site-packages/PyMySQL-0.9.3.dist-info/WHEEL
Normal 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
|
||||
|
||||
1
.venv/Lib/site-packages/PyMySQL-0.9.3.dist-info/pbr.json
Normal file
1
.venv/Lib/site-packages/PyMySQL-0.9.3.dist-info/pbr.json
Normal file
@@ -0,0 +1 @@
|
||||
{"is_release": false, "git_version": "08bac52"}
|
||||
@@ -0,0 +1 @@
|
||||
pymysql
|
||||
@@ -0,0 +1 @@
|
||||
pip
|
||||
19
.venv/Lib/site-packages/SQLAlchemy-1.3.7.dist-info/LICENSE
Normal file
19
.venv/Lib/site-packages/SQLAlchemy-1.3.7.dist-info/LICENSE
Normal 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.
|
||||
201
.venv/Lib/site-packages/SQLAlchemy-1.3.7.dist-info/METADATA
Normal file
201
.venv/Lib/site-packages/SQLAlchemy-1.3.7.dist-info/METADATA
Normal 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>`_.
|
||||
|
||||
393
.venv/Lib/site-packages/SQLAlchemy-1.3.7.dist-info/RECORD
Normal file
393
.venv/Lib/site-packages/SQLAlchemy-1.3.7.dist-info/RECORD
Normal 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
|
||||
5
.venv/Lib/site-packages/SQLAlchemy-1.3.7.dist-info/WHEEL
Normal file
5
.venv/Lib/site-packages/SQLAlchemy-1.3.7.dist-info/WHEEL
Normal file
@@ -0,0 +1,5 @@
|
||||
Wheel-Version: 1.0
|
||||
Generator: setuptools (75.8.0)
|
||||
Root-Is-Purelib: false
|
||||
Tag: cp312-cp312-win_amd64
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
sqlalchemy
|
||||
@@ -0,0 +1 @@
|
||||
pip
|
||||
@@ -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.
|
||||
128
.venv/Lib/site-packages/Werkzeug-0.15.5.dist-info/METADATA
Normal file
128
.venv/Lib/site-packages/Werkzeug-0.15.5.dist-info/METADATA
Normal 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/
|
||||
|
||||
|
||||
120
.venv/Lib/site-packages/Werkzeug-0.15.5.dist-info/RECORD
Normal file
120
.venv/Lib/site-packages/Werkzeug-0.15.5.dist-info/RECORD
Normal 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
|
||||
6
.venv/Lib/site-packages/Werkzeug-0.15.5.dist-info/WHEEL
Normal file
6
.venv/Lib/site-packages/Werkzeug-0.15.5.dist-info/WHEEL
Normal 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
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
werkzeug
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
pip
|
||||
221
.venv/Lib/site-packages/annotated_types-0.5.0.dist-info/METADATA
Normal file
221
.venv/Lib/site-packages/annotated_types-0.5.0.dist-info/METADATA
Normal 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
|
||||
|
||||
[](https://github.com/annotated-types/annotated-types/actions?query=event%3Apush+branch%3Amain+workflow%3ACI)
|
||||
[](https://pypi.python.org/pypi/annotated-types)
|
||||
[](https://github.com/annotated-types/annotated-types)
|
||||
[](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!
|
||||
@@ -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
|
||||
@@ -0,0 +1,4 @@
|
||||
Wheel-Version: 1.0
|
||||
Generator: hatchling 1.17.0
|
||||
Root-Is-Purelib: true
|
||||
Tag: py3-none-any
|
||||
@@ -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.
|
||||
319
.venv/Lib/site-packages/annotated_types/__init__.py
Normal file
319
.venv/Lib/site-packages/annotated_types/__init__.py
Normal 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)]
|
||||
Binary file not shown.
Binary file not shown.
0
.venv/Lib/site-packages/annotated_types/py.typed
Normal file
0
.venv/Lib/site-packages/annotated_types/py.typed
Normal file
133
.venv/Lib/site-packages/annotated_types/test_cases.py
Normal file
133
.venv/Lib/site-packages/annotated_types/test_cases.py
Normal 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])
|
||||
@@ -0,0 +1 @@
|
||||
pip
|
||||
20
.venv/Lib/site-packages/blinker-1.6.2.dist-info/LICENSE.rst
Normal file
20
.venv/Lib/site-packages/blinker-1.6.2.dist-info/LICENSE.rst
Normal 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.
|
||||
63
.venv/Lib/site-packages/blinker-1.6.2.dist-info/METADATA
Normal file
63
.venv/Lib/site-packages/blinker-1.6.2.dist-info/METADATA
Normal 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/
|
||||
16
.venv/Lib/site-packages/blinker-1.6.2.dist-info/RECORD
Normal file
16
.venv/Lib/site-packages/blinker-1.6.2.dist-info/RECORD
Normal 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
|
||||
5
.venv/Lib/site-packages/blinker-1.6.2.dist-info/WHEEL
Normal file
5
.venv/Lib/site-packages/blinker-1.6.2.dist-info/WHEEL
Normal file
@@ -0,0 +1,5 @@
|
||||
Wheel-Version: 1.0
|
||||
Generator: bdist_wheel (0.40.0)
|
||||
Root-Is-Purelib: true
|
||||
Tag: py3-none-any
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
blinker
|
||||
19
.venv/Lib/site-packages/blinker/__init__.py
Normal file
19
.venv/Lib/site-packages/blinker/__init__.py
Normal 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"
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
.venv/Lib/site-packages/blinker/__pycache__/base.cpython-312.pyc
Normal file
BIN
.venv/Lib/site-packages/blinker/__pycache__/base.cpython-312.pyc
Normal file
Binary file not shown.
230
.venv/Lib/site-packages/blinker/_saferef.py
Normal file
230
.venv/Lib/site-packages/blinker/_saferef.py
Normal 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
|
||||
142
.venv/Lib/site-packages/blinker/_utilities.py
Normal file
142
.venv/Lib/site-packages/blinker/_utilities.py
Normal 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
|
||||
551
.venv/Lib/site-packages/blinker/base.py
Normal file
551
.venv/Lib/site-packages/blinker/base.py
Normal 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
|
||||
0
.venv/Lib/site-packages/blinker/py.typed
Normal file
0
.venv/Lib/site-packages/blinker/py.typed
Normal file
@@ -0,0 +1 @@
|
||||
pip
|
||||
21
.venv/Lib/site-packages/certifi-2023.7.22.dist-info/LICENSE
Normal file
21
.venv/Lib/site-packages/certifi-2023.7.22.dist-info/LICENSE
Normal 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 $
|
||||
69
.venv/Lib/site-packages/certifi-2023.7.22.dist-info/METADATA
Normal file
69
.venv/Lib/site-packages/certifi-2023.7.22.dist-info/METADATA
Normal 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.
|
||||
|
||||
|
||||
15
.venv/Lib/site-packages/certifi-2023.7.22.dist-info/RECORD
Normal file
15
.venv/Lib/site-packages/certifi-2023.7.22.dist-info/RECORD
Normal 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
Reference in New Issue
Block a user