Initial commit

This commit is contained in:
Christian Loch 2021-07-21 21:33:05 +02:00
commit 19697ea192
2457 changed files with 524893 additions and 0 deletions

8
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/

10
.idea/OpenHome.iml Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

4
.idea/misc.xml Normal file
View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (OpenHome)" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/OpenHome.iml" filepath="$PROJECT_DIR$/.idea/OpenHome.iml" />
</modules>
</component>
</project>

Binary file not shown.

225
cun.py Normal file
View File

@ -0,0 +1,225 @@
from telnetlib import Telnet
import serial
DEBUG = True
class MAXPacketFactory:
def create_packet(rec: str):
pkt_type = int(rec[7:9], 16)
if pkt_type == 0:
return MAXPairPingPacket.from_received(rec)
elif pkt_type == 1:
return MAXPairPongPacket.from_received(rec)
elif pkt_type == 2:
return MAXAckPacket.from_received(rec)
elif pkt_type == 0xF1:
return MAXWakeUpPacket.from_received(rec)
elif pkt_type == 0xF0:
return MAXResetPacket.from_received(rec)
else:
print("Unknown message type: {}".format(pkt_type))
return MAXPacket.from_received(rec)
class MAXPacket:
def __init__(self, length, message_counter: str, message_type: str, message_flag: str, sender_address: str, dest_address: str,
group_id:str):
self.length = length
self.counter = message_counter
self.type = message_type
self.flag = message_flag
self.sender_address = sender_address
self.dest_address = dest_address
self.group_id = group_id
def from_received(rec: str):
return MAXPacket(rec[1:3], rec[3:5], rec[5:7], rec[7:9], rec[9:15], rec[15:21], rec[21:23])
def gen_header(self):
header_str = "{}{}{}{}{}{}".format(self.counter, self.flag, self.type, self.sender_address,
self.dest_address, self.group_id)
return header_str
def to_string(self):
return "MAXPacket: len={}, counter={}, flag={}, type={}, sender_addr={}, dest_addr={}, group_id={}".format(
self.length, self.counter, self.flag, self.type, self.sender_address, self.dest_address, self.group_id
)
class MAXPairPingPacket(MAXPacket):
def from_received(rec: str):
result = MAXPacket.from_received(rec)
firmware_val = int(rec[23:25], 16)
result.firmware_major = firmware_val // 16
result.firmware_minor = firmware_val % 16
result.device_type = rec[25:27]
result.test_result = rec[27:29]
result.serial = rec[29:-2]
return result
def __init__(self, length, message_counter: str, message_type: str, message_flag: str, sender_address: str, dest_address: str,
group_id:str, firmware_major, firmware_minor, device_type, test_result, serial):
MAXPacket.__init__(length, message_counter, message_type, message_flag, sender_address, dest_address, group_id)
self.firmware_major = firmware_major
self.firmware_minor = firmware_minor
self.device_type = device_type
self.test_result = test_result
self.serial = serial
def to_string(self):
result = "{}\nMAXPairPingPacket: firmware_major={} firmware_minor={} device_type={} " \
"test_result={} serial={}".format(super().to_string(), self.firmware_major, self.firmware_minor,
self.device_type, self.test_result, self.serial)
return result
class MAXPairPongPacket(MAXPacket):
# def __init__(self, rec):
# super().__init__(rec)
def __init__(self, message_counter: str, message_flag: str, sender_address: str, dest_address: str,
group_id:str):
MAXPacket.__init__(message_counter, "01", message_flag, sender_address, dest_address, group_id)
self.payload = "00"
def serialize(self):
header = self.gen_header()
length = (len(header) + len(self.payload))/2
return "Zs{}{}{}".format(length, header, self.payload)
class MAXAckPacket(MAXPacket):
def __init__(self, rec):
super().__init__(rec)
class MAXWakeUpPacket(MAXPacket):
def __init__(self, rec):
super().__init__(rec)
class MAXResetPacket(MAXPacket):
def __init__(self, rec):
super().__init__(rec)
class CUL:
def __init__(self):
self.client: serial.Serial = None
def connect(self, port):
if self.client is None:
self.client = serial.Serial(port, 38400, timeout=1)
def disconnect(self):
if self.client is not None:
self.client.close()
self.client = None
def request(self, req):
if self.client is not None:
self.client.write(req.encode())
self.client.write(b"\n")
if DEBUG:
print(">>> {}".format(req))
else:
print("Request while not connected!")
def response(self):
if self.client is not None:
response = self.client.read(100).decode()
if DEBUG:
print("<<< {}".format(response))
return response
else:
print("Waiting for response while not connected!")
return None
def version_string(self):
self.request("V")
return self.response()
def is_connected(self):
return self.client is not None
def set_moritz_mode(self, moritz_mode_enable):
if moritz_mode_enable:
self.request("Zr")
#return self.response()
else:
self.request("Zx")
class CUN:
def __init__(self):
self.client: Telnet = None
def connect(self, host, ip):
if self.client is None:
self.client = Telnet(host, ip)
def disconnect(self):
if self.client is not None:
self.client.close()
self.client = None
def version_string(self):
self.request("V")
return self.response()
def request(self, req):
if self.client is not None:
self.client.write(req.encode())
self.client.write(b"\n")
if DEBUG:
print(">>> {}".format(req))
else:
print("Request while not connected!")
def response(self):
if self.client is not None:
response = self.client.read_some().decode()
if DEBUG:
print("<<< {}".format(response))
return response
else:
print("Waiting for response while not connected!")
return None
def set_moritz_mode(self, moritz_mode_enable):
if moritz_mode_enable:
self.request("Zr")
#return self.response()
else:
self.request("Zx")
def configure(self, ip, netmask, gateway, ):
# ToDo: NYI
pass
def h_request(self):
self.request("H?")
return self.response()
def send_moritz(self, packet: MAXPacket):
# llnnccttssssssddddddpp...
# ll - length
# nn - msg counter
# cc - control byte
# tt - msg type
# ss - sender address(3 byte)
# dd - destination address(3 byte - 000000 for broadcast)
# pp - payload...
len_str = packet.length
msg_counter_str = packet.ms
control_byte_str = "00"
message_type_str = "02"
sender_addr_str = "000000"
dest_addr_str = "000000"
payload = "l:"
self.request("Zs{}{}{}{}{}{}{}".format(packet.length, packet.message_counter, control_byte_str,
message_type_str, sender_addr_str,
dest_addr_str, payload))
#self.request("l:")
return self.response()

35
main.py Normal file
View File

@ -0,0 +1,35 @@
from cun import CUL, MAXPacketFactory, MAXPacket, MAXPairPingPacket, MAXPairPongPacket
import time
if __name__ == '__main__':
#cun = CUN()
#cun.connect("192.168.0.244", 2323)
#cun.request(b"V\n")
#print(cun.response())
#version = cun.version_string()
#print(version)
#cun.set_moritz_mode(True)
#print(cun.send_moritz())
#cun.request("Zsl:")
#print(cun.response())
#cun.disconnect()
cul = CUL()
cul.connect("COM8")
print(cul.version_string())
cul.set_moritz_mode(True)
while cul.is_connected():
resp = cul.response()
if resp is not None and resp[0:1] == "Z":
pkt = MAXPacketFactory.create_packet(resp)
print(pkt.to_string())
if isinstance(pkt, MAXPairPingPacket):
print("Sending Pong!")
pong = MAXPairPongPacket(message_counter="00", message_flag="00", sender_address="FDF7CA",
dest_address=pkt.sender_address, group_id="00")
pong_str = pong.serialize()
cul.request(pong_str)
time.sleep(1)
cul.disconnect()

View File

@ -0,0 +1,146 @@
/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */
/* Greenlet object interface */
#ifndef Py_GREENLETOBJECT_H
#define Py_GREENLETOBJECT_H
#include <Python.h>
#ifdef __cplusplus
extern "C" {
#endif
/* This is deprecated and undocumented. It does not change. */
#define GREENLET_VERSION "1.0.0"
typedef struct _greenlet {
PyObject_HEAD
char* stack_start;
char* stack_stop;
char* stack_copy;
intptr_t stack_saved;
struct _greenlet* stack_prev;
struct _greenlet* parent;
PyObject* run_info;
struct _frame* top_frame;
int recursion_depth;
PyObject* weakreflist;
#if PY_VERSION_HEX >= 0x030700A3
_PyErr_StackItem* exc_info;
_PyErr_StackItem exc_state;
#else
PyObject* exc_type;
PyObject* exc_value;
PyObject* exc_traceback;
#endif
PyObject* dict;
#if PY_VERSION_HEX >= 0x030700A3
PyObject* context;
#endif
#if PY_VERSION_HEX >= 0x30A00B1
CFrame* cframe;
#endif
} PyGreenlet;
#define PyGreenlet_Check(op) PyObject_TypeCheck(op, &PyGreenlet_Type)
#define PyGreenlet_MAIN(op) (((PyGreenlet*)(op))->stack_stop == (char*)-1)
#define PyGreenlet_STARTED(op) (((PyGreenlet*)(op))->stack_stop != NULL)
#define PyGreenlet_ACTIVE(op) (((PyGreenlet*)(op))->stack_start != NULL)
#define PyGreenlet_GET_PARENT(op) (((PyGreenlet*)(op))->parent)
/* C API functions */
/* Total number of symbols that are exported */
#define PyGreenlet_API_pointers 8
#define PyGreenlet_Type_NUM 0
#define PyExc_GreenletError_NUM 1
#define PyExc_GreenletExit_NUM 2
#define PyGreenlet_New_NUM 3
#define PyGreenlet_GetCurrent_NUM 4
#define PyGreenlet_Throw_NUM 5
#define PyGreenlet_Switch_NUM 6
#define PyGreenlet_SetParent_NUM 7
#ifndef GREENLET_MODULE
/* This section is used by modules that uses the greenlet C API */
static void** _PyGreenlet_API = NULL;
# define PyGreenlet_Type \
(*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM])
# define PyExc_GreenletError \
((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM])
# define PyExc_GreenletExit \
((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM])
/*
* PyGreenlet_New(PyObject *args)
*
* greenlet.greenlet(run, parent=None)
*/
# define PyGreenlet_New \
(*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \
_PyGreenlet_API[PyGreenlet_New_NUM])
/*
* PyGreenlet_GetCurrent(void)
*
* greenlet.getcurrent()
*/
# define PyGreenlet_GetCurrent \
(*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM])
/*
* PyGreenlet_Throw(
* PyGreenlet *greenlet,
* PyObject *typ,
* PyObject *val,
* PyObject *tb)
*
* g.throw(...)
*/
# define PyGreenlet_Throw \
(*(PyObject * (*)(PyGreenlet * self, \
PyObject * typ, \
PyObject * val, \
PyObject * tb)) \
_PyGreenlet_API[PyGreenlet_Throw_NUM])
/*
* PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args)
*
* g.switch(*args, **kwargs)
*/
# define PyGreenlet_Switch \
(*(PyObject * \
(*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \
_PyGreenlet_API[PyGreenlet_Switch_NUM])
/*
* PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent)
*
* g.parent = new_parent
*/
# define PyGreenlet_SetParent \
(*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \
_PyGreenlet_API[PyGreenlet_SetParent_NUM])
/* Macro that imports greenlet and initializes C API */
/* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we
keep the older definition to be sure older code that might have a copy of
the header still works. */
# define PyGreenlet_Import() \
{ \
_PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \
}
#endif /* GREENLET_MODULE */
#ifdef __cplusplus
}
#endif
#endif /* !Py_GREENLETOBJECT_H */

View File

@ -0,0 +1 @@
pip

View File

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

View File

@ -0,0 +1,124 @@
Metadata-Version: 2.1
Name: Flask
Version: 2.0.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: Donate, https://palletsprojects.com/donate
Project-URL: Documentation, https://flask.palletsprojects.com/
Project-URL: Changes, https://flask.palletsprojects.com/changes/
Project-URL: Source Code, https://github.com/pallets/flask/
Project-URL: Issue Tracker, https://github.com/pallets/flask/issues/
Project-URL: Twitter, https://twitter.com/PalletsTeam
Project-URL: Chat, https://discord.gg/pallets
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: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
Requires-Python: >=3.6
Description-Content-Type: text/x-rst
Requires-Dist: Werkzeug (>=2.0)
Requires-Dist: Jinja2 (>=3.0)
Requires-Dist: itsdangerous (>=2.0)
Requires-Dist: click (>=7.1.2)
Provides-Extra: async
Requires-Dist: asgiref (>=3.2) ; extra == 'async'
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.
.. _WSGI: https://wsgi.readthedocs.io/
.. _Werkzeug: https://werkzeug.palletsprojects.com/
.. _Jinja: https://jinja.palletsprojects.com/
Installing
----------
Install and update using `pip`_:
.. code-block:: text
$ pip install -U Flask
.. _pip: https://pip.pypa.io/en/stable/quickstart/
A Simple Example
----------------
.. code-block:: python
# save this as app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, World!"
.. code-block:: text
$ flask run
* 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/main/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://palletsprojects.com/donate
Links
-----
- Documentation: https://flask.palletsprojects.com/
- Changes: https://flask.palletsprojects.com/changes/
- PyPI Releases: https://pypi.org/project/Flask/
- Source Code: https://github.com/pallets/flask/
- Issue Tracker: https://github.com/pallets/flask/issues/
- Website: https://palletsprojects.com/p/flask/
- Twitter: https://twitter.com/PalletsTeam
- Chat: https://discord.gg/pallets

View File

@ -0,0 +1,51 @@
../../Scripts/flask.exe,sha256=jAsR3j2HDZxKuPxMa4-KTV_CkpVSHVaFcQeGKvncEIE,106342
Flask-2.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
Flask-2.0.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475
Flask-2.0.1.dist-info/METADATA,sha256=50Jm1647RKw98p4RF64bCqRh0wajk-n3hQ7av2-pniA,3808
Flask-2.0.1.dist-info/RECORD,,
Flask-2.0.1.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92
Flask-2.0.1.dist-info/entry_points.txt,sha256=gBLA1aKg0OYR8AhbAfg8lnburHtKcgJLDU52BBctN0k,42
Flask-2.0.1.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6
flask/__init__.py,sha256=w5v6GCNm8eLDMNWqs2ue7HLHo75aslAwz1h3k3YO9HY,2251
flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30
flask/__pycache__/__init__.cpython-39.pyc,,
flask/__pycache__/__main__.cpython-39.pyc,,
flask/__pycache__/app.cpython-39.pyc,,
flask/__pycache__/blueprints.cpython-39.pyc,,
flask/__pycache__/cli.cpython-39.pyc,,
flask/__pycache__/config.cpython-39.pyc,,
flask/__pycache__/ctx.cpython-39.pyc,,
flask/__pycache__/debughelpers.cpython-39.pyc,,
flask/__pycache__/globals.cpython-39.pyc,,
flask/__pycache__/helpers.cpython-39.pyc,,
flask/__pycache__/logging.cpython-39.pyc,,
flask/__pycache__/scaffold.cpython-39.pyc,,
flask/__pycache__/sessions.cpython-39.pyc,,
flask/__pycache__/signals.cpython-39.pyc,,
flask/__pycache__/templating.cpython-39.pyc,,
flask/__pycache__/testing.cpython-39.pyc,,
flask/__pycache__/typing.cpython-39.pyc,,
flask/__pycache__/views.cpython-39.pyc,,
flask/__pycache__/wrappers.cpython-39.pyc,,
flask/app.py,sha256=q6lpiiWVxjljQRwjjneUBpfllXYPEq0CFAUpTQ5gIeA,82376
flask/blueprints.py,sha256=OjI-dkwx96ZNMUGDDFMKzgcpUJf240WRuMlHkmgI1Lc,23541
flask/cli.py,sha256=iN1pL2SevE5Nmvey-0WwnxG3nipZXIiE__Ed4lx3IuM,32036
flask/config.py,sha256=jj_7JGen_kYuTlKrx8ZPBsZddb8mihC0ODg4gcjXBX8,11068
flask/ctx.py,sha256=EM3W0v1ctuFQAGk_HWtQdoJEg_r2f5Le4xcmElxFwwk,17428
flask/debughelpers.py,sha256=wk5HtLwENsQ4e8tkxfBn6ykUeVRDuMbQCKgtEVe6jxk,6171
flask/globals.py,sha256=cWd-R2hUH3VqPhnmQNww892tQS6Yjqg_wg8UvW1M7NM,1723
flask/helpers.py,sha256=00WqA3wYeyjMrnAOPZTUyrnUf7H8ik3CVT0kqGl_qjk,30589
flask/json/__init__.py,sha256=d-db2DJMASq0G7CI-JvobehRE1asNRGX1rIDQ1GF9WM,11580
flask/json/__pycache__/__init__.cpython-39.pyc,,
flask/json/__pycache__/tag.cpython-39.pyc,,
flask/json/tag.py,sha256=fys3HBLssWHuMAIJuTcf2K0bCtosePBKXIWASZEEjnU,8857
flask/logging.py,sha256=1o_hirVGqdj7SBdETnhX7IAjklG89RXlrwz_2CjzQQE,2273
flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
flask/scaffold.py,sha256=EhQuiFrdcmJHxqPGQkEpqLsEUZ7ULZD0rtED2NrduvM,32400
flask/sessions.py,sha256=Kb7zY4qBIOU2cw1xM5mQ_KmgYUBDFbUYWjlkq0EFYis,15189
flask/signals.py,sha256=HQWgBEXlrLbHwLBoWqAStJKcN-rsB1_AMO8-VZ7LDOo,2126
flask/templating.py,sha256=l96VD39JQ0nue4Bcj7wZ4-FWWs-ppLxvgBCpwDQ4KAk,5626
flask/testing.py,sha256=OsHT-2B70abWH3ulY9IbhLchXIeyj3L-cfcDa88wv5E,10281
flask/typing.py,sha256=zVqhz53KklncAv-WxbpxGZfaRGOqeWAsLdP1tTMaCuE,1684
flask/views.py,sha256=F2PpWPloe4x0906IUjnPcsOqg5YvmQIfk07_lFeAD4s,5865
flask/wrappers.py,sha256=VndbHPRBSUUOejmd2Y3ydkoCVUtsS2OJIdJEVIkBVD8,5604

View File

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

View File

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

View File

@ -0,0 +1 @@
flask

View File

@ -0,0 +1 @@
pip

View File

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

View File

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

View File

@ -0,0 +1,14 @@
Flask_SQLAlchemy-2.5.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
Flask_SQLAlchemy-2.5.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475
Flask_SQLAlchemy-2.5.1.dist-info/METADATA,sha256=vVCeMtTM_xOrUVoVyemeNaTUI5L9iXa16NsiMDDOgFU,3128
Flask_SQLAlchemy-2.5.1.dist-info/RECORD,,
Flask_SQLAlchemy-2.5.1.dist-info/WHEEL,sha256=Z-nyYpwrcSqxfdux5Mbn_DQ525iP7J2DG3JgGvOYyTQ,110
Flask_SQLAlchemy-2.5.1.dist-info/top_level.txt,sha256=w2K4fNNoTh4HItoFfz2FRQShSeLcvHYrzU_sZov21QU,17
flask_sqlalchemy/__init__.py,sha256=IaupgTRkQnY05KPLYvfiNnJdrmwoyfsxaiyGtrEYfO4,40738
flask_sqlalchemy/__pycache__/__init__.cpython-39.pyc,,
flask_sqlalchemy/__pycache__/_compat.cpython-39.pyc,,
flask_sqlalchemy/__pycache__/model.cpython-39.pyc,,
flask_sqlalchemy/__pycache__/utils.cpython-39.pyc,,
flask_sqlalchemy/_compat.py,sha256=yua0ZSgVWwi56QpEgwaPInzkNQ9PFb7YQdvEk3dImXo,821
flask_sqlalchemy/model.py,sha256=bd2mIv9LA1A2MZkQObgnMUCSrxNvyqplaSkCxyxKNxY,4988
flask_sqlalchemy/utils.py,sha256=4eHqAbYElnJ3NbSAHhuINckoAHDABoxjleMJD0iKgyg,1390

View File

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

View File

@ -0,0 +1 @@
flask_sqlalchemy

View File

@ -0,0 +1 @@
pip

View File

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

View File

@ -0,0 +1,112 @@
Metadata-Version: 2.1
Name: Jinja2
Version: 3.0.1
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: Donate, https://palletsprojects.com/donate
Project-URL: Documentation, https://jinja.palletsprojects.com/
Project-URL: Changes, https://jinja.palletsprojects.com/changes/
Project-URL: Source Code, https://github.com/pallets/jinja/
Project-URL: Issue Tracker, https://github.com/pallets/jinja/issues/
Project-URL: Twitter, https://twitter.com/PalletsTeam
Project-URL: Chat, https://discord.gg/pallets
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: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Text Processing :: Markup :: HTML
Requires-Python: >=3.6
Description-Content-Type: text/x-rst
Requires-Dist: MarkupSafe (>=2.0)
Provides-Extra: i18n
Requires-Dist: Babel (>=2.7) ; 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 %}
Donate
------
The Pallets organization develops and supports Jinja and other popular
packages. 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
-----
- Documentation: https://jinja.palletsprojects.com/
- Changes: https://jinja.palletsprojects.com/changes/
- PyPI Releases: https://pypi.org/project/Jinja2/
- Source Code: https://github.com/pallets/jinja/
- Issue Tracker: https://github.com/pallets/jinja/issues/
- Website: https://palletsprojects.com/p/jinja/
- Twitter: https://twitter.com/PalletsTeam
- Chat: https://discord.gg/pallets

View File

@ -0,0 +1,58 @@
Jinja2-3.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
Jinja2-3.0.1.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475
Jinja2-3.0.1.dist-info/METADATA,sha256=k6STiOONbGESP2rEKmjhznuG10vm9sNCHCUQL9AQFM4,3508
Jinja2-3.0.1.dist-info/RECORD,,
Jinja2-3.0.1.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92
Jinja2-3.0.1.dist-info/entry_points.txt,sha256=Qy_DkVo6Xj_zzOtmErrATe8lHZhOqdjpt3e4JJAGyi8,61
Jinja2-3.0.1.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7
jinja2/__init__.py,sha256=fd8jaCRsCATgC7ahuUTD8CyfQoc4aRfALEIny4mwfog,2205
jinja2/__pycache__/__init__.cpython-39.pyc,,
jinja2/__pycache__/_identifier.cpython-39.pyc,,
jinja2/__pycache__/async_utils.cpython-39.pyc,,
jinja2/__pycache__/bccache.cpython-39.pyc,,
jinja2/__pycache__/compiler.cpython-39.pyc,,
jinja2/__pycache__/constants.cpython-39.pyc,,
jinja2/__pycache__/debug.cpython-39.pyc,,
jinja2/__pycache__/defaults.cpython-39.pyc,,
jinja2/__pycache__/environment.cpython-39.pyc,,
jinja2/__pycache__/exceptions.cpython-39.pyc,,
jinja2/__pycache__/ext.cpython-39.pyc,,
jinja2/__pycache__/filters.cpython-39.pyc,,
jinja2/__pycache__/idtracking.cpython-39.pyc,,
jinja2/__pycache__/lexer.cpython-39.pyc,,
jinja2/__pycache__/loaders.cpython-39.pyc,,
jinja2/__pycache__/meta.cpython-39.pyc,,
jinja2/__pycache__/nativetypes.cpython-39.pyc,,
jinja2/__pycache__/nodes.cpython-39.pyc,,
jinja2/__pycache__/optimizer.cpython-39.pyc,,
jinja2/__pycache__/parser.cpython-39.pyc,,
jinja2/__pycache__/runtime.cpython-39.pyc,,
jinja2/__pycache__/sandbox.cpython-39.pyc,,
jinja2/__pycache__/tests.cpython-39.pyc,,
jinja2/__pycache__/utils.cpython-39.pyc,,
jinja2/__pycache__/visitor.cpython-39.pyc,,
jinja2/_identifier.py,sha256=EdgGJKi7O1yvr4yFlvqPNEqV6M1qHyQr8Gt8GmVTKVM,1775
jinja2/async_utils.py,sha256=bY2nCUfBA_4FSnNUsIsJgljBq3hACr6fzLi7LiyMTn8,1751
jinja2/bccache.py,sha256=smAvSDgDSvXdvJzCN_9s0XfkVpQEu8be-QwgeMlrwiM,12677
jinja2/compiler.py,sha256=qq0Fo9EpDAEwHPLAs3sAP7dindUvDrFrbx4AcB8xV5M,72046
jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433
jinja2/debug.py,sha256=uBmrsiwjYH5l14R9STn5mydOOyriBYol5lDGvEqAb3A,9238
jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267
jinja2/environment.py,sha256=T6U4be9mY1CUXXin_EQFwpvpFqCiryweGqzXGRYIoSA,61573
jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071
jinja2/ext.py,sha256=44SjDjeYkkxQTpmC2BetOTxEFMgQ42p2dfSwXmPFcSo,32122
jinja2/filters.py,sha256=LslRsJd0JVFBHtdfU_WraM1eQitotciwawiW-seR42U,52577
jinja2/idtracking.py,sha256=KdFVohVNK-baOwt_INPMco19D7AfLDEN8i3_JoiYnGQ,10713
jinja2/lexer.py,sha256=D5qOKB3KnRqK9gPAZFQvRguomYsQok5-14TKiWTN8Jw,29923
jinja2/loaders.py,sha256=ePpWB0xDrILgLVqNFcxqqSbPizsI0T-JlkNEUFqq9fo,22350
jinja2/meta.py,sha256=GNPEvifmSaU3CMxlbheBOZjeZ277HThOPUTf1RkppKQ,4396
jinja2/nativetypes.py,sha256=62hvvsAxAj0YaxylOHoREYVogJ5JqOlJISgGY3OKd_o,3675
jinja2/nodes.py,sha256=LHF97fu6GW4r2Z9UaOX92MOT1wZpdS9Nx4N-5Fp5ti8,34509
jinja2/optimizer.py,sha256=tHkMwXxfZkbfA1KmLcqmBMSaz7RLIvvItrJcPoXTyD8,1650
jinja2/parser.py,sha256=kHnU8v92GwMYkfr0MVakWv8UlSf_kJPx8LUsgQMof70,39767
jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
jinja2/runtime.py,sha256=bSWdawLjReKpKHhF3-96OIuWYpUy1yxFJCN3jBYyoXc,35013
jinja2/sandbox.py,sha256=-8zxR6TO9kUkciAVFsIKu8Oq-C7PTeYEdZ5TtA55-gw,14600
jinja2/tests.py,sha256=Am5Z6Lmfr2XaH_npIfJJ8MdXtWsbLjMULZJulTAj30E,5905
jinja2/utils.py,sha256=0wGkxDbxlW10y0ac4-kEiy1Bn0AsWXqz8uomK9Ugy1Q,26961
jinja2/visitor.py,sha256=ZmeLuTj66ic35-uFH-1m0EKXiw4ObDDb_WuE6h5vPFg,3572

View File

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

View File

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

View File

@ -0,0 +1 @@
jinja2

View File

@ -0,0 +1 @@
pip

View File

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

View File

@ -0,0 +1,100 @@
Metadata-Version: 2.1
Name: MarkupSafe
Version: 2.0.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: Pallets
Maintainer-email: contact@palletsprojects.com
License: BSD-3-Clause
Project-URL: Donate, https://palletsprojects.com/donate
Project-URL: Documentation, https://markupsafe.palletsprojects.com/
Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/
Project-URL: Source Code, https://github.com/pallets/markupsafe/
Project-URL: Issue Tracker, https://github.com/pallets/markupsafe/issues/
Project-URL: Twitter, https://twitter.com/PalletsTeam
Project-URL: Chat, https://discord.gg/pallets
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: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Text Processing :: Markup :: HTML
Requires-Python: >=3.6
Description-Content-Type: text/x-rst
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('&lt;script&gt;alert(document.cookie);&lt;/script&gt;')
>>> # wrap in Markup to mark text "safe" and prevent escaping
>>> Markup("<strong>Hello</strong>")
Markup('<strong>hello</strong>')
>>> escape(Markup("<strong>Hello</strong>"))
Markup('<strong>hello</strong>')
>>> # Markup is a str subclass
>>> # methods and operators escape their arguments
>>> template = Markup("Hello <em>{name}</em>")
>>> template.format(name='"World"')
Markup('Hello <em>&#34;World&#34;</em>')
Donate
------
The Pallets organization develops and supports MarkupSafe and other
popular packages. 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
-----
- Documentation: https://markupsafe.palletsprojects.com/
- Changes: https://markupsafe.palletsprojects.com/changes/
- PyPI Releases: https://pypi.org/project/MarkupSafe/
- Source Code: https://github.com/pallets/markupsafe/
- Issue Tracker: https://github.com/pallets/markupsafe/issues/
- Website: https://palletsprojects.com/p/markupsafe/
- Twitter: https://twitter.com/PalletsTeam
- Chat: https://discord.gg/pallets

View File

@ -0,0 +1,13 @@
MarkupSafe-2.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
MarkupSafe-2.0.1.dist-info/LICENSE.rst,sha256=RjHsDbX9kKVH4zaBcmTGeYIUM4FG-KyUtKV_lu6MnsQ,1503
MarkupSafe-2.0.1.dist-info/METADATA,sha256=FmPpxBdaqCCjF-XKqoxeEzqAzhetQnrkkSsd3V3X-Jc,3211
MarkupSafe-2.0.1.dist-info/RECORD,,
MarkupSafe-2.0.1.dist-info/WHEEL,sha256=jr7ubY0Lkz_yXH9FfFe9PTtLhGOsf62dZkNvTYrJINE,100
MarkupSafe-2.0.1.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11
markupsafe/__init__.py,sha256=s08KbuFRV3zh4Wh7xjsIphXgp1xf0EUB79wlPj-4scc,9211
markupsafe/__pycache__/__init__.cpython-39.pyc,,
markupsafe/__pycache__/_native.cpython-39.pyc,,
markupsafe/_native.py,sha256=JMXegJtk1ZcnRKrgyCA-CEXmRnOpaIXLyDAM98GbshY,2061
markupsafe/_speedups.cp39-win_amd64.pyd,sha256=hPTsANj9bt7hLYxWLuZcC7E3-EnJQ4GlvIf9Vx0p1p0,16384
markupsafe/_speedups.pyi,sha256=f5QtwIOP0eLrxh2v5p6SmaYmlcHIGIfmz0DovaqL0OU,238
markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0

View File

@ -0,0 +1,5 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.36.2)
Root-Is-Purelib: false
Tag: cp39-cp39-win_amd64

View File

@ -0,0 +1 @@
markupsafe

View File

@ -0,0 +1 @@
pip

View File

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

View File

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

View File

@ -0,0 +1,479 @@
SQLAlchemy-1.4.20.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
SQLAlchemy-1.4.20.dist-info/LICENSE,sha256=YBpAuebmf1_VblyrYHwFdqeATqzBxJ-T6h8-e4s2zW4,1119
SQLAlchemy-1.4.20.dist-info/METADATA,sha256=Jw3VHRkzzDevEV7BfHjLoAigwu92NLmbpX1abbrS8w4,9386
SQLAlchemy-1.4.20.dist-info/RECORD,,
SQLAlchemy-1.4.20.dist-info/WHEEL,sha256=jr7ubY0Lkz_yXH9FfFe9PTtLhGOsf62dZkNvTYrJINE,100
SQLAlchemy-1.4.20.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11
sqlalchemy/__init__.py,sha256=ExIPxvWel4JwxLhYY4m_-B3qZdcD0IIJGfcSP8c11gw,4241
sqlalchemy/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/__pycache__/events.cpython-39.pyc,,
sqlalchemy/__pycache__/exc.cpython-39.pyc,,
sqlalchemy/__pycache__/inspection.cpython-39.pyc,,
sqlalchemy/__pycache__/log.cpython-39.pyc,,
sqlalchemy/__pycache__/processors.cpython-39.pyc,,
sqlalchemy/__pycache__/schema.cpython-39.pyc,,
sqlalchemy/__pycache__/types.cpython-39.pyc,,
sqlalchemy/cimmutabledict.cp39-win_amd64.pyd,sha256=dFj0Cbv6yOjMa3hJzlY5LcEsJlrQC0p5Sonj8AZsYS4,14848
sqlalchemy/connectors/__init__.py,sha256=TBW6z0L_8lga2UXWZBC2kXFkmBj1tyyHGj2zPiwVTnA,288
sqlalchemy/connectors/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/connectors/__pycache__/mxodbc.cpython-39.pyc,,
sqlalchemy/connectors/__pycache__/pyodbc.cpython-39.pyc,,
sqlalchemy/connectors/mxodbc.py,sha256=YPVxoPpPZyCGgZuNG-PXh6vF_y4BT2IJTbhSoSUFgG0,5948
sqlalchemy/connectors/pyodbc.py,sha256=-9snrm-iRg68Zf-3HBGDvJqFQlK17lku5zL03KJbB0I,7005
sqlalchemy/cprocessors.cp39-win_amd64.pyd,sha256=qLenj6vwMu-MHzCk6kaLlSuQf1FQhVHZNmCHhLy5OcE,17408
sqlalchemy/cresultproxy.cp39-win_amd64.pyd,sha256=1tj6189v39vpUK7vBUYkM80Tk72094dU3wzaOtEiL6M,20992
sqlalchemy/databases/__init__.py,sha256=Wr0SaNwZ_U8v65tQ9b0kL8hcpsCMCQ9f8dnfLjg9z1M,1047
sqlalchemy/databases/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/dialects/__init__.py,sha256=Q9SoXJ9mpShD_4lbIXI6wjJqJsmpmDgS-yndzS1aauU,2156
sqlalchemy/dialects/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/dialects/firebird/__init__.py,sha256=99IsIXbvMTkG2KkeQDdsuxdM5eonmd8kN_7_Hwew1TA,1193
sqlalchemy/dialects/firebird/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/dialects/firebird/__pycache__/base.cpython-39.pyc,,
sqlalchemy/dialects/firebird/__pycache__/fdb.cpython-39.pyc,,
sqlalchemy/dialects/firebird/__pycache__/kinterbasdb.cpython-39.pyc,,
sqlalchemy/dialects/firebird/base.py,sha256=SFPEpzpyUTKy4zwIZe1rnM4V8wjuwk0A7RV-XGMGCXc,32167
sqlalchemy/dialects/firebird/fdb.py,sha256=qQf8oSpPCWYrXQCVSZlGMLGn2XiqNloP6opoSrMGkxY,4229
sqlalchemy/dialects/firebird/kinterbasdb.py,sha256=fchGnET7sqXuiNcj-Bim_rmRjhaMPcXyrSkUSuBKVdw,6675
sqlalchemy/dialects/mssql/__init__.py,sha256=8fhQ2dxcuRwcdYrdbI9nzVAel5nNJotnV1btviNhIag,1872
sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/dialects/mssql/__pycache__/base.cpython-39.pyc,,
sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-39.pyc,,
sqlalchemy/dialects/mssql/__pycache__/json.cpython-39.pyc,,
sqlalchemy/dialects/mssql/__pycache__/mxodbc.cpython-39.pyc,,
sqlalchemy/dialects/mssql/__pycache__/provision.cpython-39.pyc,,
sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-39.pyc,,
sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-39.pyc,,
sqlalchemy/dialects/mssql/base.py,sha256=_xMHlPWaOgx7EyTZOklfxSQBQ2Q4ckxm5m9vFfrwnVo,110143
sqlalchemy/dialects/mssql/information_schema.py,sha256=yjE4A6JS0MQnC7mdIFFoh8wIz4TXAfvzBcMSKJvRkYM,7815
sqlalchemy/dialects/mssql/json.py,sha256=bAi9z-htrC6adJUiBRetVj3RwtJ2GNN5I_KGeHFL8_s,4683
sqlalchemy/dialects/mssql/mxodbc.py,sha256=EwR2i5KeL0O_QOoC_w8bB8-Ibmmca07p_Pk-B9V6oXs,4956
sqlalchemy/dialects/mssql/provision.py,sha256=oTGw0l5RNcXIWkA0s2erVgk2XKiNw26IRzZE84tN2uE,4371
sqlalchemy/dialects/mssql/pymssql.py,sha256=KXNWqN_gcJNs4eOcGMUuK2JS0zo3QIZpLtK0Cc2lo10,4979
sqlalchemy/dialects/mssql/pyodbc.py,sha256=dt8bzeusRcfPSrW14tfK1auaLHbIiKyIAL455R_n66c,21198
sqlalchemy/dialects/mysql/__init__.py,sha256=zGUaA54PNMKz_foJOomYcDZ0nRcM0FOBTXeZC4DkjkQ,2261
sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/dialects/mysql/__pycache__/aiomysql.cpython-39.pyc,,
sqlalchemy/dialects/mysql/__pycache__/base.cpython-39.pyc,,
sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-39.pyc,,
sqlalchemy/dialects/mysql/__pycache__/dml.cpython-39.pyc,,
sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-39.pyc,,
sqlalchemy/dialects/mysql/__pycache__/expression.cpython-39.pyc,,
sqlalchemy/dialects/mysql/__pycache__/json.cpython-39.pyc,,
sqlalchemy/dialects/mysql/__pycache__/mariadb.cpython-39.pyc,,
sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-39.pyc,,
sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-39.pyc,,
sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-39.pyc,,
sqlalchemy/dialects/mysql/__pycache__/oursql.cpython-39.pyc,,
sqlalchemy/dialects/mysql/__pycache__/provision.cpython-39.pyc,,
sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-39.pyc,,
sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-39.pyc,,
sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-39.pyc,,
sqlalchemy/dialects/mysql/__pycache__/types.cpython-39.pyc,,
sqlalchemy/dialects/mysql/aiomysql.py,sha256=IIaMMlE5Sa6tNHdBF2_w-quqjSckbSLJLO6yGkqWO4I,9458
sqlalchemy/dialects/mysql/base.py,sha256=PgA-SPgvPsAvwovzNM0jL8MygoeJW1xAzdexHszrM14,121335
sqlalchemy/dialects/mysql/cymysql.py,sha256=u_2t1j9HsNYjHN1W5mcer3VzXKWpy9Ht0U23fmVv4TA,2352
sqlalchemy/dialects/mysql/dml.py,sha256=rRmYkeT-R8ZgfqwSG2uuCPwVMN60AMCJ3IMhVdQNjbw,6355
sqlalchemy/dialects/mysql/enumerated.py,sha256=7Gpd__GD6cqATpJG_exsGzADlV7PmS7Krr4K1KaAYHM,9396
sqlalchemy/dialects/mysql/expression.py,sha256=rinSVZR7GK6S6OpqNwoUIrbNuT671gObXv5OD_Y6qwk,3867
sqlalchemy/dialects/mysql/json.py,sha256=iEKILiRmIpakQcqJt2OzfmVGFsgSyi7gBg63khPggu4,2396
sqlalchemy/dialects/mysql/mariadb.py,sha256=jE1Hpmka_nKJjWsFHcCVRKWvjg7l1mNCjCzvVADMD-k,523
sqlalchemy/dialects/mysql/mariadbconnector.py,sha256=PONgd15UBS5TUZL8OB6hLj0Za_RpRA4VN6vgZoMYnlY,7755
sqlalchemy/dialects/mysql/mysqlconnector.py,sha256=DhI1eAhINj_iWsC61fOCMSvJJOW_D9PKQBjOJUZX7gM,7929
sqlalchemy/dialects/mysql/mysqldb.py,sha256=UFaJzBGFO9ix5oo22IAMQLnVRsETILV8b_zNSAq8drI,10853
sqlalchemy/dialects/mysql/oursql.py,sha256=lJexKOuqiuzYlbbc4qd6oyzn2jQ8QbocDcgixKGnxEU,8794
sqlalchemy/dialects/mysql/provision.py,sha256=-gCG7MwEMtztSmNU107Q563t-nN-oqTVkCiay-HRRQI,2727
sqlalchemy/dialects/mysql/pymysql.py,sha256=QtNLSJ_etMgSoo31A47gyt8lMRXbSOHYPaVyjtS8tjE,2867
sqlalchemy/dialects/mysql/pyodbc.py,sha256=95nwWGTVR-Ym4-R_QrDRuxcH8-pwu21-ZWBVNvZeTcM,4637
sqlalchemy/dialects/mysql/reflection.py,sha256=gCWmTOsvrRDGKAmXh4AGGnO03rClVuXPswASmzALgg0,19110
sqlalchemy/dialects/mysql/types.py,sha256=zMqX3xlwcFf1N4AZhZUeguI3UAn8vEDLJiVBj1TbIYg,25361
sqlalchemy/dialects/oracle/__init__.py,sha256=z_sm511AIB30Vuv1Es-hfkRMHe5-yeqNGpnzE_XkPPo,1286
sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/dialects/oracle/__pycache__/base.cpython-39.pyc,,
sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-39.pyc,,
sqlalchemy/dialects/oracle/__pycache__/provision.cpython-39.pyc,,
sqlalchemy/dialects/oracle/base.py,sha256=yMK4KDqaFhfntVEXtYXOU3RKhgp8yo8vTiIamog9YEU,89010
sqlalchemy/dialects/oracle/cx_oracle.py,sha256=9CBbppRxvJEkptdy6iRBRpKRC8LDEyAvYPd7_q8Va5E,50460
sqlalchemy/dialects/oracle/provision.py,sha256=HCi5hs5fv6rXv-lVQir6gsKrhes9NoAWlChzR3ueq74,5965
sqlalchemy/dialects/postgresql/__init__.py,sha256=WraAOkI7m26v85Pf28M2ONh-3j4SduvqFdefDPpc3EM,2625
sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/array.cpython-39.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/asyncpg.cpython-39.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/base.cpython-39.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-39.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-39.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-39.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/json.cpython-39.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-39.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/provision.cpython-39.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-39.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-39.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/pygresql.cpython-39.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/pypostgresql.cpython-39.pyc,,
sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-39.pyc,,
sqlalchemy/dialects/postgresql/array.py,sha256=3WQ2yBDAhms40MhJ683FELKmN9TL8XLpXDj3-TIaASo,12615
sqlalchemy/dialects/postgresql/asyncpg.py,sha256=SmsjkLFctg51nrJKv3zrPWFNXhp0wRf8vWRa06FvC8A,34474
sqlalchemy/dialects/postgresql/base.py,sha256=m28uVDT3IYxGRKZjeEyilwOAo8o8l_isjF145-Q8zuU,155990
sqlalchemy/dialects/postgresql/dml.py,sha256=Id1QgpOnhLNOpIiF0igYYovdOcPvpHG0KJsD1VvQH60,9828
sqlalchemy/dialects/postgresql/ext.py,sha256=K5huWreKbPLRVuwF7gFRhSPG0CY5sdXF0LiFFmDpMbY,8656
sqlalchemy/dialects/postgresql/hstore.py,sha256=obkZOC84OYVWUC8O4PyMlEGifJAA-AjsgINtrkOj0Ac,12837
sqlalchemy/dialects/postgresql/json.py,sha256=szREjVPlVfpwAc5D6tHqNCBL2UHIfr6yk_CgZqZQ10A,10777
sqlalchemy/dialects/postgresql/pg8000.py,sha256=-KFdYLjDPQapVZ-nth9-NxcDETC7m2wwg3NdXuHtV_g,17390
sqlalchemy/dialects/postgresql/provision.py,sha256=EgdZRObrTzwZ7jaBA_oPkWx3Ly1Cathw4pOfWZm6Pn0,4543
sqlalchemy/dialects/postgresql/psycopg2.py,sha256=hwJ1yjtBiekK2WHr5NHCF6XQWRuL_Wj65oUEBGBgQVs,39900
sqlalchemy/dialects/postgresql/psycopg2cffi.py,sha256=DgxWc4LrxnS3ay2KYr4sYZ76wC2ff1HFc-61Nf9TkpY,1753
sqlalchemy/dialects/postgresql/pygresql.py,sha256=i7H04i1vuc0I8f3nnUmNinsfGGCku_BKGu_6i1j083A,8861
sqlalchemy/dialects/postgresql/pypostgresql.py,sha256=MIEJhCHUwj3JF1PC4dB8dAOuoRaoiF8W0yzAU_L-a-g,3817
sqlalchemy/dialects/postgresql/ranges.py,sha256=b04r-iDteuTMhmVAc5Yf6cGraGTFggZTi0hx61_P3ng,4762
sqlalchemy/dialects/sqlite/__init__.py,sha256=rPgXiMXoA6X1_aeqq4ABU6QDqhGfIHcBaUY89utTQQw,1255
sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/dialects/sqlite/__pycache__/aiosqlite.cpython-39.pyc,,
sqlalchemy/dialects/sqlite/__pycache__/base.cpython-39.pyc,,
sqlalchemy/dialects/sqlite/__pycache__/dml.cpython-39.pyc,,
sqlalchemy/dialects/sqlite/__pycache__/json.cpython-39.pyc,,
sqlalchemy/dialects/sqlite/__pycache__/provision.cpython-39.pyc,,
sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-39.pyc,,
sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-39.pyc,,
sqlalchemy/dialects/sqlite/aiosqlite.py,sha256=pUeydy7OicEYmuYE59LIvcyaN2pPZHEQgq8JCeMtCtw,10179
sqlalchemy/dialects/sqlite/base.py,sha256=J6JqD1JGTYfDWQZZOOKIKdBhb8MQ1naSX44A8RbzTp0,90650
sqlalchemy/dialects/sqlite/dml.py,sha256=9CKXKKpA2e1Xqo6U1gvvHedyfAZvpkRBpZiRQJVF9ZU,7037
sqlalchemy/dialects/sqlite/json.py,sha256=bz_1axFG5YI9kLszE-oiCN3-z95zIPPcLgVwug_-AT4,2602
sqlalchemy/dialects/sqlite/provision.py,sha256=3F5ZX2dYGMFAGra99UVavCihth1_XazJXX9XAet8gbw,4818
sqlalchemy/dialects/sqlite/pysqlcipher.py,sha256=stRIWDxLkq0QATChLf1p3v1P0xlHfGm_sYIrye83vxM,5768
sqlalchemy/dialects/sqlite/pysqlite.py,sha256=ZL7OxYuaX9nf_3QGutZL29x1RRgqCdPo6d_wR4ZKu_w,23896
sqlalchemy/dialects/sybase/__init__.py,sha256=L1T7DkOKeeT4rs_-HMQtT8a6L_yeHNJqtTi8MGd_pbw,1430
sqlalchemy/dialects/sybase/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/dialects/sybase/__pycache__/base.cpython-39.pyc,,
sqlalchemy/dialects/sybase/__pycache__/mxodbc.cpython-39.pyc,,
sqlalchemy/dialects/sybase/__pycache__/pyodbc.cpython-39.pyc,,
sqlalchemy/dialects/sybase/__pycache__/pysybase.cpython-39.pyc,,
sqlalchemy/dialects/sybase/base.py,sha256=4aLf2TrGblF0ojJR54tHifgNkfTD0adC9j_wR_GYU1Y,33519
sqlalchemy/dialects/sybase/mxodbc.py,sha256=5QXZjzxHpne8MKAAwPR32x6YXU5IQPDPKCLaSW23wp8,971
sqlalchemy/dialects/sybase/pyodbc.py,sha256=BNaSGyeAroOrHLc7rLIZ9kkeZxULVDxqHZtzNIjbG6A,2321
sqlalchemy/dialects/sybase/pysybase.py,sha256=AEIbV2egEfWKrXYMkTj74HlB7owPSn7hs8U7M_b_EpE,3474
sqlalchemy/engine/__init__.py,sha256=x8TozgrDsPtS2j-9ByAv0ACrcpUMiFJMpxc0lsGQmo8,2092
sqlalchemy/engine/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/engine/__pycache__/base.cpython-39.pyc,,
sqlalchemy/engine/__pycache__/characteristics.cpython-39.pyc,,
sqlalchemy/engine/__pycache__/create.cpython-39.pyc,,
sqlalchemy/engine/__pycache__/cursor.cpython-39.pyc,,
sqlalchemy/engine/__pycache__/default.cpython-39.pyc,,
sqlalchemy/engine/__pycache__/events.cpython-39.pyc,,
sqlalchemy/engine/__pycache__/interfaces.cpython-39.pyc,,
sqlalchemy/engine/__pycache__/mock.cpython-39.pyc,,
sqlalchemy/engine/__pycache__/reflection.cpython-39.pyc,,
sqlalchemy/engine/__pycache__/result.cpython-39.pyc,,
sqlalchemy/engine/__pycache__/row.cpython-39.pyc,,
sqlalchemy/engine/__pycache__/strategies.cpython-39.pyc,,
sqlalchemy/engine/__pycache__/url.cpython-39.pyc,,
sqlalchemy/engine/__pycache__/util.cpython-39.pyc,,
sqlalchemy/engine/base.py,sha256=cQVJm7LS3VvsdznS_EmthCan6qCyjENX0LFsGFJ5Gls,121303
sqlalchemy/engine/characteristics.py,sha256=DrhLcmpnkMpmgo_kgQpcujoD4nW81vTt-GkuWqW9QaY,1873
sqlalchemy/engine/create.py,sha256=lMQRneFu5OcwkQNxmOgonrgwU-9E1oGh0h7ZlmKk_IQ,31143
sqlalchemy/engine/cursor.py,sha256=B3rcfKd1WHfOQtxkIUCVWZaKFT6AFxKqfNLZHbPYBuU,69686
sqlalchemy/engine/default.py,sha256=WhPeP06ZwFzR6TECsP7AKDhDt2ABOJN1eH017p1m2eA,66314
sqlalchemy/engine/events.py,sha256=Hv0GAy-w8m9xdq8E6vZz0fSuLgbZ_9uXMVO3N-HavN4,33483
sqlalchemy/engine/interfaces.py,sha256=h0i-LWMoBq5f2PFDG1qYQTt87TSAzl4BvIypVgq_MLc,60760
sqlalchemy/engine/mock.py,sha256=eXuMRQawEZFJWpdTELQcljPq5guokWSW9koqySGL-90,3743
sqlalchemy/engine/reflection.py,sha256=dRuXqeVrQXa-24YA45ZuiHDPprdr0d-kGNnt4WZp_v8,39755
sqlalchemy/engine/result.py,sha256=jJ3QGGPeINyfbEnYkaRSvm7e5UArvWaw_u3dYlxVKto,54923
sqlalchemy/engine/row.py,sha256=J0ku18YCc8_DAu-B8oFTTdeLj-5AbylRSrN7eY16AGo,18799
sqlalchemy/engine/strategies.py,sha256=Qqx7Nw6TPJe6KzM58oPHavzbSqaVST4DQGrhTO42R14,430
sqlalchemy/engine/url.py,sha256=kpLkdISaFyNChYyUViXS05hg5m4SYx6vrqj3LEkeClc,26200
sqlalchemy/engine/util.py,sha256=R2fGBk_tpc5LR05Q-mIauF5mGgPDm5IJ9TBl5Brhitg,7875
sqlalchemy/event/__init__.py,sha256=UEArBlnnF0If5n_aohWAmYx3Jjoym-8bBgyZ0Fp7hMI,533
sqlalchemy/event/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/event/__pycache__/api.cpython-39.pyc,,
sqlalchemy/event/__pycache__/attr.cpython-39.pyc,,
sqlalchemy/event/__pycache__/base.cpython-39.pyc,,
sqlalchemy/event/__pycache__/legacy.cpython-39.pyc,,
sqlalchemy/event/__pycache__/registry.cpython-39.pyc,,
sqlalchemy/event/api.py,sha256=zmVEc1OZ2IHUHxRk7QBIQj12NKkXA1_tedtPq1xWpu4,6994
sqlalchemy/event/attr.py,sha256=W_Yy6A5oChf1S1cafSm_lKflMjfxYtZbjEQNTDHU03Y,15092
sqlalchemy/event/base.py,sha256=uL2Vvau-A6b5W9IREO2_jfSz78aP_QH8cjglIbaTBNY,11280
sqlalchemy/event/legacy.py,sha256=spFIf45jAL4hi4ah9_ttIbj0hzpgq5bJlv4lpoA7eRs,6454
sqlalchemy/event/registry.py,sha256=p1ixAawLN7Lssif73SjTsPKHNU6fhTJOwrVtCrSfifE,8567
sqlalchemy/events.py,sha256=08BdPP_ASWqos10aJ_grM8qKKsjKFIupUIwqt3kaH-c,480
sqlalchemy/exc.py,sha256=EzLFC6lCWPchAYYfGFLWCXkNhqxtH7n_FovNx9qgmG8,20959
sqlalchemy/ext/__init__.py,sha256=FFnko4I2iMY2OaeAIJdsu200D68cAfubuqC_2Eeg8BM,332
sqlalchemy/ext/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/ext/__pycache__/associationproxy.cpython-39.pyc,,
sqlalchemy/ext/__pycache__/automap.cpython-39.pyc,,
sqlalchemy/ext/__pycache__/baked.cpython-39.pyc,,
sqlalchemy/ext/__pycache__/compiler.cpython-39.pyc,,
sqlalchemy/ext/__pycache__/horizontal_shard.cpython-39.pyc,,
sqlalchemy/ext/__pycache__/hybrid.cpython-39.pyc,,
sqlalchemy/ext/__pycache__/indexable.cpython-39.pyc,,
sqlalchemy/ext/__pycache__/instrumentation.cpython-39.pyc,,
sqlalchemy/ext/__pycache__/mutable.cpython-39.pyc,,
sqlalchemy/ext/__pycache__/orderinglist.cpython-39.pyc,,
sqlalchemy/ext/__pycache__/serializer.cpython-39.pyc,,
sqlalchemy/ext/associationproxy.py,sha256=QoEz-UR5j43ZnqNl13gZp-cMpdBS7ldv1Wtay-EkTNo,51568
sqlalchemy/ext/asyncio/__init__.py,sha256=D_PoNbVNTdnK6h7keS-ppBSFcjXFs9WhmyuOyvx9EBU,798
sqlalchemy/ext/asyncio/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/ext/asyncio/__pycache__/base.cpython-39.pyc,,
sqlalchemy/ext/asyncio/__pycache__/engine.cpython-39.pyc,,
sqlalchemy/ext/asyncio/__pycache__/events.cpython-39.pyc,,
sqlalchemy/ext/asyncio/__pycache__/exc.cpython-39.pyc,,
sqlalchemy/ext/asyncio/__pycache__/result.cpython-39.pyc,,
sqlalchemy/ext/asyncio/__pycache__/scoping.cpython-39.pyc,,
sqlalchemy/ext/asyncio/__pycache__/session.cpython-39.pyc,,
sqlalchemy/ext/asyncio/base.py,sha256=DQjKnvQPq6d_WwCbks3NSRVt9mcU2u8xojaV3E60Zno,2291
sqlalchemy/ext/asyncio/engine.py,sha256=g1rq30UYH54G9LnXX8xxtmNbtaHgzsGQM-EF8gDCNgY,23751
sqlalchemy/ext/asyncio/events.py,sha256=mXQgkDLsnS6qkQeB_GV-i6VhtmNAve85B-jIGs7cRyg,1270
sqlalchemy/ext/asyncio/exc.py,sha256=0gqT7n-U-p7rLbkzAQKfzQ6_jBZxHweK-2mXFWVYvec,659
sqlalchemy/ext/asyncio/result.py,sha256=aYLMEM5TNsmyAWG4659wyperZrDttKUlToxqo_eOHkE,20531
sqlalchemy/ext/asyncio/scoping.py,sha256=WaTlSFO_J7RNPF7pKVgVZs84D6MmDMZThrFVlyk9P0g,2947
sqlalchemy/ext/asyncio/session.py,sha256=6G4_B-gnbIyMlSaoBNQN_KpUasIwVVGa0lATEpwt0fY,15392
sqlalchemy/ext/automap.py,sha256=s0hAWEawAv94ETxRhXqvAwrKUc3bGBX1PEFEcVv2wbU,46422
sqlalchemy/ext/baked.py,sha256=Yc9t2UY5c8Fu4v_yDWInPFZBeLi657uwXVpGr8g8dwo,20616
sqlalchemy/ext/compiler.py,sha256=Xfq_ONWDQ_mhHNSHH_AY5eIhDF4OEQwqc5018l9fQxU,18496
sqlalchemy/ext/declarative/__init__.py,sha256=4lGjX9yq22BJ3K7ZGvFF_46oWoYStN9pkIKypXNavNQ,1905
sqlalchemy/ext/declarative/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/ext/declarative/__pycache__/extensions.cpython-39.pyc,,
sqlalchemy/ext/declarative/extensions.py,sha256=hwtcP7O8i9le8Lhg_nVH1lDnRxE0psG-oRoq2Kov-kU,16866
sqlalchemy/ext/horizontal_shard.py,sha256=qREdIj09TeY5axbuWsFfrfCZuk9zgjDzcqREd-DxoAo,8990
sqlalchemy/ext/hybrid.py,sha256=MKlGMqD2-7uyYZx05Zq3znS0pCpToyTN-ScQRNE4uek,43102
sqlalchemy/ext/indexable.py,sha256=7GhAsHMFk_q4YiCAbMU0J9_jbQeJa73E-iVzDNB9DNU,11606
sqlalchemy/ext/instrumentation.py,sha256=kx2zn8mN30F-CbWqiBxb7HgnMSJChLcvQhJ8Tb8VIXo,14802
sqlalchemy/ext/mutable.py,sha256=cuiyl1bgu6DSCMMCZcQIHObul1BLUh-jSTXGtZUgwm4,32947
sqlalchemy/ext/mypy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
sqlalchemy/ext/mypy/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/ext/mypy/__pycache__/apply.cpython-39.pyc,,
sqlalchemy/ext/mypy/__pycache__/decl_class.cpython-39.pyc,,
sqlalchemy/ext/mypy/__pycache__/infer.cpython-39.pyc,,
sqlalchemy/ext/mypy/__pycache__/names.cpython-39.pyc,,
sqlalchemy/ext/mypy/__pycache__/plugin.cpython-39.pyc,,
sqlalchemy/ext/mypy/__pycache__/util.cpython-39.pyc,,
sqlalchemy/ext/mypy/apply.py,sha256=AWjlXxc1ZSEKs-KpJfPZ60gGDOzdinls2cc6keW3pxI,9296
sqlalchemy/ext/mypy/decl_class.py,sha256=LUzP227RsiT_Em2wQas-mLdrRxg0Mzqn7bXQcw8hiMY,17040
sqlalchemy/ext/mypy/infer.py,sha256=r9Ceg7FiaUL1HGQCvZRK7RHmGrkmCvFVba_TWLLPwGo,17690
sqlalchemy/ext/mypy/names.py,sha256=Z8tpYE8i6xGBkuRXpme7Yd58wryMILd_TAAWHKy0OFQ,7902
sqlalchemy/ext/mypy/plugin.py,sha256=bjxzxej4w80N315Md3Y_gJECXqaYhN3RwN1jwfNLoNs,9955
sqlalchemy/ext/mypy/util.py,sha256=U5IzfJart5sqq2eM9zhFQQHxoA4w9XJXQmWSImVX_ak,6236
sqlalchemy/ext/orderinglist.py,sha256=sa2PZ06PH8Cs6Zwcgzog3vUg6WjUbGxdGkGkoMCpJxc,14262
sqlalchemy/ext/serializer.py,sha256=rae10NTl3_fm9I_SrXflEioL8GNQnShlH7cUxfSUnds,6132
sqlalchemy/future/__init__.py,sha256=uXl3ElTaXdjRoOBshDEitc07u6IGLfCzLONWerWRF88,542
sqlalchemy/future/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/future/__pycache__/engine.cpython-39.pyc,,
sqlalchemy/future/engine.py,sha256=2Qc97YYmaKSp0jyOF4X6S6efF4btcsuj3c0Wpu1PlNU,16993
sqlalchemy/future/orm/__init__.py,sha256=_g7j2aIWEydf4JHJuJDetdAVACyheROjqXmBkKb2OaQ,298
sqlalchemy/future/orm/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/inspection.py,sha256=vfF9qC0gJSRzn4JLu9CjNENzqCtDdzAIthoLxl8rW50,3143
sqlalchemy/log.py,sha256=MWkG0aStnbomwsE9wqkuQqwQiRyTykirq9_oY2032tg,6994
sqlalchemy/orm/__init__.py,sha256=-IMaSfF-yrtmMGrlFYkXjcA8iAnEAR6UkROHHAXYSpU,10769
sqlalchemy/orm/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/attributes.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/base.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/clsregistry.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/collections.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/context.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/decl_api.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/decl_base.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/dependency.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/descriptor_props.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/dynamic.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/evaluator.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/events.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/exc.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/identity.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/instrumentation.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/interfaces.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/loading.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/mapper.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/path_registry.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/persistence.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/properties.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/query.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/relationships.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/scoping.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/session.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/state.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/strategies.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/strategy_options.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/sync.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/unitofwork.cpython-39.pyc,,
sqlalchemy/orm/__pycache__/util.cpython-39.pyc,,
sqlalchemy/orm/attributes.py,sha256=wGWhtVsCdcev3nl_ucxsAIS7w_iV5_pAccf-iBxHmCM,77884
sqlalchemy/orm/base.py,sha256=JR1bHf9tmjd5Ucb_b4-Yx20p210hkeklUjYeA0ea_XY,15473
sqlalchemy/orm/clsregistry.py,sha256=T_cR_8J6_k8zBAtISYPnjWpKbMKQAbzREdPhBDzG6Z8,13731
sqlalchemy/orm/collections.py,sha256=WxqkreJpyfguYOZtbIqKgx01pdL3ihmNzNNprnUobl8,56416
sqlalchemy/orm/context.py,sha256=ujp5554a0aM-NI6tw99tw03M6DKbMPNRSO_YH74UxwM,106564
sqlalchemy/orm/decl_api.py,sha256=Lbj6w87SXY2q8dzoWFYgZbdStVZ0Ordnw9O6yXH6nuk,35949
sqlalchemy/orm/decl_base.py,sha256=BR85kxbPUf0CDzbiF-_tgfqMIafC0Esl-4B8OTzQcMk,43849
sqlalchemy/orm/dependency.py,sha256=HPQE5POiLq8yUPuFtQ-IrMS9jPw67Z1-05c7xuZbm4Y,48268
sqlalchemy/orm/descriptor_props.py,sha256=S0vw_wnNFB0p3lBM-0RRGcxvyzgGoDYXK4kb4xn_FUo,26701
sqlalchemy/orm/dynamic.py,sha256=INcHvTXxXb17gGW_3HbSuQ53VVUPRANexuUn79g-X0k,16306
sqlalchemy/orm/evaluator.py,sha256=ymKsLcqOwf7OZ98PZINfgp2WUlB-Hv1pAXuoAbWITHU,7092
sqlalchemy/orm/events.py,sha256=MCsdnTPUnhW4ORFAZDrBk4pvGZw6Lr1l8h2jJOLVKtY,113098
sqlalchemy/orm/exc.py,sha256=XQNh69fkGLyeZ3apPiTTRwSO6y_ULbVOBLUACOfWNFc,6735
sqlalchemy/orm/identity.py,sha256=9D0FTwPOsUQ21mTlOkzdMSoIKYPcyn1gvbxee6MqHyI,7040
sqlalchemy/orm/instrumentation.py,sha256=tE5A13NbKUfNvpOEaJuHFbh4BrrQ9JmqA14SKVXBNdA,20998
sqlalchemy/orm/interfaces.py,sha256=Fn0Q-aojEwBlFiad5moTR8OkAgYsHAVO1bIngxqRoGE,29347
sqlalchemy/orm/loading.py,sha256=WNkS0444FA49IzPEvoejbW9DZ6W-pmSz07yzHWfKFCk,50987
sqlalchemy/orm/mapper.py,sha256=Hxn0jmpxhgk_yOlHcUzUVP32nqKHIolcFYpaDh5JW34,139805
sqlalchemy/orm/path_registry.py,sha256=Qe86D6vzluH4rkfnmb3ZpHnTCt7eBri5PtyuhlcCbUQ,15588
sqlalchemy/orm/persistence.py,sha256=rhqAtyFKgJMin6hGFgTAdLgK2kpMowAfBiytkERurkg,81401
sqlalchemy/orm/properties.py,sha256=H0cSlyMOIDvaizxmCoWeKdQWiqImyQb5VLd9I4Sy3pc,15319
sqlalchemy/orm/query.py,sha256=gIAWefHFhHJqfuofCGb6RaJMVm-a-S7Sy1XRPVUk6q8,125217
sqlalchemy/orm/relationships.py,sha256=PHsSUNrlqjrz95pu36DhC10ZHx884nRiDlLXkJR6dls,146477
sqlalchemy/orm/scoping.py,sha256=GPFT5NinEnV49r0gidhRxdzc3LcFWx52VNFZqz-SGQs,6880
sqlalchemy/orm/session.py,sha256=vuX_VvIBp5Enx-a1h7lSSlSOlPiYd0m1ILy-lZjyGJ8,159850
sqlalchemy/orm/state.py,sha256=9jv6AlV8RwoEBkN6Mti3Z84C0hHSTBfHX4Hh8VZEyl8,34431
sqlalchemy/orm/strategies.py,sha256=Cr0PC-PG8X3_L2K3Ieu_EZMOofeZ8OePf-bA1J_1vxc,109896
sqlalchemy/orm/strategy_options.py,sha256=09iyh4ILS7yBxYK8IZWsFuYYWpnYdwALPyqyZY7se8g,63532
sqlalchemy/orm/sync.py,sha256=3WNF_rv2bvq-8w-Umo6WPPMpZR81CCC6lR0LVsdUyyQ,5990
sqlalchemy/orm/unitofwork.py,sha256=XZdTDFw3CHBZstRU1jWDtZ-op0h-Sh_UZUx7h8moQZc,27873
sqlalchemy/orm/util.py,sha256=DZAiAIKYeGtoa8IWS75W7Te4p2v2WvNy9YzFzzEdLFU,70601
sqlalchemy/pool/__init__.py,sha256=vPypHYNtKMNIc2Yrgw6qyVWHvvisQfIC0Gn3AhKi654,1658
sqlalchemy/pool/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/pool/__pycache__/base.cpython-39.pyc,,
sqlalchemy/pool/__pycache__/dbapi_proxy.cpython-39.pyc,,
sqlalchemy/pool/__pycache__/events.cpython-39.pyc,,
sqlalchemy/pool/__pycache__/impl.cpython-39.pyc,,
sqlalchemy/pool/base.py,sha256=BoVrinbry7_706Y6z5HuCUeTevH3tZF6d91JGQRaabY,36657
sqlalchemy/pool/dbapi_proxy.py,sha256=EECXJ-pyG1436lAs5H02gN3ByZIRd54yeVG6EInHmQU,4375
sqlalchemy/pool/events.py,sha256=e9pXO_HEZzsg-8V6jdtV-u6BjW4GCvdvSIJYeNYh8GU,8942
sqlalchemy/pool/impl.py,sha256=ebFDPqQEggH7W43Ld13wd2UV3geMkJEDD66EruvmF1k,16284
sqlalchemy/processors.py,sha256=S-h949YV8k_f3HMoV2ChfwZE5L-e1sDPYTko5M1Gj_o,5920
sqlalchemy/schema.py,sha256=ntWzaOocNzjjFTTGcH2W-OHElZYiAxLFcWUhxVQJ-oE,2471
sqlalchemy/sql/__init__.py,sha256=Ie0LsqfpzMNZN621dtp3LFeF0ySw-FJmMoLrqrL81Z8,4810
sqlalchemy/sql/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/annotation.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/base.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/coercions.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/compiler.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/crud.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/ddl.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/default_comparator.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/dml.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/elements.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/events.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/expression.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/functions.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/lambdas.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/naming.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/operators.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/roles.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/schema.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/selectable.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/sqltypes.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/traversals.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/type_api.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/util.cpython-39.pyc,,
sqlalchemy/sql/__pycache__/visitors.cpython-39.pyc,,
sqlalchemy/sql/annotation.py,sha256=EvDBXH-wt9RRqHNY-8hlXiXYJfl9antb8M3IvB91cqM,11592
sqlalchemy/sql/base.py,sha256=Aue1owXMTXOzO3WXF_QcMtlkBtEJCvRputH7WjbYQnY,56651
sqlalchemy/sql/coercions.py,sha256=PcuTab2Rs91JX3qZQixKjmmTT-oj_A-HIjbmdw_4CrA,33560
sqlalchemy/sql/compiler.py,sha256=BtiVfBp-T7V8FQEmG6EASPwaD_b8EtO9Nz2RcjuqeXg,176837
sqlalchemy/sql/crud.py,sha256=dkdesuCs9Lt5QanQg3vvVT8glavy-b5LK5ABYFm3Dfo,35833
sqlalchemy/sql/ddl.py,sha256=uvUIePaU1oObVGquGcEdrqebIQ8DLz6qstns1Ag5_R0,45336
sqlalchemy/sql/default_comparator.py,sha256=7iC7YGjoXyICcnxjovGA37T_smTSSnMlsf4RJGprF2U,11233
sqlalchemy/sql/dml.py,sha256=lDzS--PzSyEldp0zjjZMbNhUiGy9jjkH5AmefyrsZTg,52695
sqlalchemy/sql/elements.py,sha256=AdCKqNXv2zjCYH3i9HjwkON7LM8T0YiGn_LTpMBkK4Q,175679
sqlalchemy/sql/events.py,sha256=pQJPAeybf1jel2LMq59CU5cYe-_duV9pkUGbDxkSelc,13412
sqlalchemy/sql/expression.py,sha256=xA7Kg_G_oobzVANzXaXRC9Ms96U0g80UxgxH2GrPdmo,9105
sqlalchemy/sql/functions.py,sha256=l9RCbwROk-KtEpzTUsOI72xxO1saJtbNRWx502IEU0E,48502
sqlalchemy/sql/lambdas.py,sha256=kC56163Xqy_FPpZcMUQQ89rJuEN0cGeV6lMOzg2SAuY,44237
sqlalchemy/sql/naming.py,sha256=frPyvaq5BALvRCUcaH7s30e8lTZMoWEBHLkZILUIdi4,6995
sqlalchemy/sql/operators.py,sha256=MexbaWdAztb_Xd6dCLU3oFbe-imrWS96izD8iSVxsKw,49446
sqlalchemy/sql/roles.py,sha256=eiVyxFCACcmCnxf4z5dXxhIHgZLRuETY8xV1zd8fCYc,5625
sqlalchemy/sql/schema.py,sha256=aouTvkn9-Zs7gRPyRDklmidF-4K8RLqa0GRW_BHpugg,191714
sqlalchemy/sql/selectable.py,sha256=2YPclquuN66CXtuD9d9Dcf1EU1j3ww6h1yGmuT7jy9k,224427
sqlalchemy/sql/sqltypes.py,sha256=-0di1pjJubEtr7G5fbiRQoiMxFC4rF979N5EI9dqA3U,113934
sqlalchemy/sql/traversals.py,sha256=eTRuqYptAJ33ihgLPizlc_S5m9zvKqC3V2t2YYtE6Fo,50825
sqlalchemy/sql/type_api.py,sha256=ChLSlTQAeN2beCz7XQeoKkZfvYEBM4_-RlGJoMve-1I,59372
sqlalchemy/sql/util.py,sha256=UhOSuPJ4yGVN8Qal2tDvDMNMd9eOI05DGVUcACmZ8bo,35520
sqlalchemy/sql/visitors.py,sha256=-Yuc-yAKUZBf9XjJ6bvOP8Sy5Zv7mB-gdXKo9JOzHLQ,28063
sqlalchemy/testing/__init__.py,sha256=XCdyR7e5mC5m4fhcmPgjxAGsIe2Vgca7rygudyUryJY,2851
sqlalchemy/testing/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/testing/__pycache__/assertions.cpython-39.pyc,,
sqlalchemy/testing/__pycache__/assertsql.cpython-39.pyc,,
sqlalchemy/testing/__pycache__/asyncio.cpython-39.pyc,,
sqlalchemy/testing/__pycache__/config.cpython-39.pyc,,
sqlalchemy/testing/__pycache__/engines.cpython-39.pyc,,
sqlalchemy/testing/__pycache__/entities.cpython-39.pyc,,
sqlalchemy/testing/__pycache__/exclusions.cpython-39.pyc,,
sqlalchemy/testing/__pycache__/fixtures.cpython-39.pyc,,
sqlalchemy/testing/__pycache__/mock.cpython-39.pyc,,
sqlalchemy/testing/__pycache__/pickleable.cpython-39.pyc,,
sqlalchemy/testing/__pycache__/profiling.cpython-39.pyc,,
sqlalchemy/testing/__pycache__/provision.cpython-39.pyc,,
sqlalchemy/testing/__pycache__/requirements.cpython-39.pyc,,
sqlalchemy/testing/__pycache__/schema.cpython-39.pyc,,
sqlalchemy/testing/__pycache__/util.cpython-39.pyc,,
sqlalchemy/testing/__pycache__/warnings.cpython-39.pyc,,
sqlalchemy/testing/assertions.py,sha256=s2UhwsBzCPa75W8UQRxlR3gfWm9WIfTksdG-zWPtOYg,24466
sqlalchemy/testing/assertsql.py,sha256=2UQGJYRLD4IgFzYm1IwdUDoeJgIDIIeJIcrOit-XGLE,14689
sqlalchemy/testing/asyncio.py,sha256=4qUnZPDR7omIo3FLoRWy6hBJbne1KbyMELbdIWEZddk,3800
sqlalchemy/testing/config.py,sha256=IxwIEAW7_1b88yUOX_wjivjuS9PvlCJVEpIScmtQh7Y,6751
sqlalchemy/testing/engines.py,sha256=TU32-pY1rHRiWR3zrXr6_sRXYMuh1CkF9AyoPCbNm8s,13098
sqlalchemy/testing/entities.py,sha256=BzhnwvfZ_NkNn4xtvFbLzPvQw2T9gEBNc7hMay2cG5s,3363
sqlalchemy/testing/exclusions.py,sha256=2X5m5QCLO0W0D6GmI7cw6BuMIclsBoMnnjaqAY2Hclc,13793
sqlalchemy/testing/fixtures.py,sha256=DyIAvYvavTI3Qs3oYtHT8TGqwFaFevEguc4gNApUGi0,25977
sqlalchemy/testing/mock.py,sha256=krEfc7Vz1EEjkPb1D07yRZXX1ehaCCT2uFoQiXz9EOM,925
sqlalchemy/testing/pickleable.py,sha256=5Dlu3OP7s5DKAI1c4XP6UCz_17MOJsM3E0zqQWesZFA,2847
sqlalchemy/testing/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
sqlalchemy/testing/plugin/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-39.pyc,,
sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-39.pyc,,
sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-39.pyc,,
sqlalchemy/testing/plugin/__pycache__/reinvent_fixtures_py2k.cpython-39.pyc,,
sqlalchemy/testing/plugin/bootstrap.py,sha256=0104b_dYFUT5WsZU-NL44wlMo1LrKByBtPQYaFt6CTQ,1738
sqlalchemy/testing/plugin/plugin_base.py,sha256=t0PKr1XE2GiH5zb6Z5lXV_abu3rZva6v8DLQglTTF00,22349
sqlalchemy/testing/plugin/pytestplugin.py,sha256=Tj-wscMJ9yuPsS74U1AiJ-4UTrxNT-ZI89qHAAcv0-Y,24973
sqlalchemy/testing/plugin/reinvent_fixtures_py2k.py,sha256=b9fWp5RXdePykrNviZPXaGDIjOEOfovchez2Ovr4IRQ,3400
sqlalchemy/testing/profiling.py,sha256=K4Kn3o4GMbdb-1YMu1E4tPkpuHxbnJIWEqypsv_nY2s,10900
sqlalchemy/testing/provision.py,sha256=J9PWi7i7Xmr-sALBrmK4OTXH9ur4rpFXKHhnhrjcQcs,12461
sqlalchemy/testing/requirements.py,sha256=-69hbEEuVSCVdNC3KiHJL2xC7fbSguoL66f_li1Nq50,42209
sqlalchemy/testing/schema.py,sha256=2MNf-qPPUqEtxtCfVjZpwaoOBZEToUOHfW-egM2Nov4,6761
sqlalchemy/testing/suite/__init__.py,sha256=u3lEc0j47s7Dad_2SVWOZ6EU2aOMRWqE_WrQ17HmBsA,489
sqlalchemy/testing/suite/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/testing/suite/__pycache__/test_cte.cpython-39.pyc,,
sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-39.pyc,,
sqlalchemy/testing/suite/__pycache__/test_deprecations.cpython-39.pyc,,
sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-39.pyc,,
sqlalchemy/testing/suite/__pycache__/test_insert.cpython-39.pyc,,
sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-39.pyc,,
sqlalchemy/testing/suite/__pycache__/test_results.cpython-39.pyc,,
sqlalchemy/testing/suite/__pycache__/test_rowcount.cpython-39.pyc,,
sqlalchemy/testing/suite/__pycache__/test_select.cpython-39.pyc,,
sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-39.pyc,,
sqlalchemy/testing/suite/__pycache__/test_types.cpython-39.pyc,,
sqlalchemy/testing/suite/__pycache__/test_unicode_ddl.cpython-39.pyc,,
sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-39.pyc,,
sqlalchemy/testing/suite/test_cte.py,sha256=shi2WJZpzAzDCdkmzx0IDEu-URsLLBsdyFdzDqsfpyw,6387
sqlalchemy/testing/suite/test_ddl.py,sha256=BZuYkKaG_tNUkZcFLNd6o1qnfbzU0IYiedCw_NhOJBg,12143
sqlalchemy/testing/suite/test_deprecations.py,sha256=0LUmXIiK8hHUr6tY8cJJC7VErOj9YNGNN-c324k08Dw,5204
sqlalchemy/testing/suite/test_dialect.py,sha256=XpwZxIXlMVsZlP74khuPW2wZskinT0IOT9S6PM5PyE8,11256
sqlalchemy/testing/suite/test_insert.py,sha256=QlMovNeDU-GB5UvTEumce3LLK94PAduKlWe2TqCcLF4,11501
sqlalchemy/testing/suite/test_reflection.py,sha256=kZI4xcVR7_Ft_8kYYF58FjM7IIeuFzS0yXDj7lVfwbA,56815
sqlalchemy/testing/suite/test_results.py,sha256=qa_V37VKFRfi2xoI8d5bW9EzB_E_oPFhShBo9VPjCss,14396
sqlalchemy/testing/suite/test_rowcount.py,sha256=M6E-d4JuoVVfbBC-z59hB1accmoh4yARRJsD4yVFP60,4944
sqlalchemy/testing/suite/test_select.py,sha256=hZfNo0bTFQodHg2PB4_dqdnJ2mnXq3Fs_mdp17409uk,54167
sqlalchemy/testing/suite/test_sequence.py,sha256=2KBcs0FtoL3gk37IN2PnRZSnQwt7RKkShAbYQHFTBcw,8713
sqlalchemy/testing/suite/test_types.py,sha256=kiVqATGP79gKi3LNvjCFpWF2qFNCjvy8svv68peQU8E,45445
sqlalchemy/testing/suite/test_unicode_ddl.py,sha256=T9Bkkj7Cm2mIQW5BQFU2NnJVnvBhZyEQXcuHRO3AhKc,6937
sqlalchemy/testing/suite/test_update_delete.py,sha256=q3AoCPMKhxYVUi4n7YBjf8v8nb9obXmUXqnFsVxpZLY,1646
sqlalchemy/testing/util.py,sha256=pF1e_qH8eH1LVN4xB0hgL3XNfsbb5A2iRvNG8c_IgVc,12960
sqlalchemy/testing/warnings.py,sha256=n7poYJsx6YspiD9RIp2QiYxWbnWG7OQMLkjrmWqn85g,6010
sqlalchemy/types.py,sha256=xd4i1Yi0zY9lb6jZuy70TOkdKwP_deLpB20IQ3nx_zw,2997
sqlalchemy/util/__init__.py,sha256=Eklvf318BEPscpatTBry6K7hQU9JfragXEX_clr-Fm0,6434
sqlalchemy/util/__pycache__/__init__.cpython-39.pyc,,
sqlalchemy/util/__pycache__/_collections.cpython-39.pyc,,
sqlalchemy/util/__pycache__/_concurrency_py3k.cpython-39.pyc,,
sqlalchemy/util/__pycache__/_preloaded.cpython-39.pyc,,
sqlalchemy/util/__pycache__/compat.cpython-39.pyc,,
sqlalchemy/util/__pycache__/concurrency.cpython-39.pyc,,
sqlalchemy/util/__pycache__/deprecations.cpython-39.pyc,,
sqlalchemy/util/__pycache__/langhelpers.cpython-39.pyc,,
sqlalchemy/util/__pycache__/queue.cpython-39.pyc,,
sqlalchemy/util/__pycache__/topological.cpython-39.pyc,,
sqlalchemy/util/_collections.py,sha256=vQ5XrglAq0tVxIQtay9WVuQSgnKJ-L_bF4bRflNgEew,30227
sqlalchemy/util/_concurrency_py3k.py,sha256=iE8ZnXzkIVXWIwR7In5bwIK1esv_vrlP2Nm2fhBose8,6728
sqlalchemy/util/_preloaded.py,sha256=B7sQrjHOamdgOWZ1EAFWPOvlXH59ose5KoOwFMkhFe0,2463
sqlalchemy/util/compat.py,sha256=S4vHlw295cr9gH4dmUYxCjKjCh9poB7e7-5hlF1Mwc8,18786
sqlalchemy/util/concurrency.py,sha256=tdD998NG1XOOC4m8Ml0mB2xuHzHy9UlVGMpNftMelbk,1826
sqlalchemy/util/deprecations.py,sha256=oz5oLKUYL7WOMq8WudNdr4olB9KJycR1B88FuyN_BFU,11894
sqlalchemy/util/langhelpers.py,sha256=5eFZacBOGQoWvnBjVU5ItoOgkWjz7Q05PSMi0vbLDSk,58174
sqlalchemy/util/queue.py,sha256=SoUrtd6cw5ncTUk2FN1-YEvetBHcZzo5Zbr2l-9VJGw,9583
sqlalchemy/util/topological.py,sha256=w9_UvLP0Gf8wsCjpBxNwspXdoll_7kqO-rYVb-I5AU8,2957

View File

@ -0,0 +1,5 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.36.2)
Root-Is-Purelib: false
Tag: cp39-cp39-win_amd64

View File

@ -0,0 +1 @@
sqlalchemy

View File

@ -0,0 +1 @@
pip

View File

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

View File

@ -0,0 +1,128 @@
Metadata-Version: 2.1
Name: Werkzeug
Version: 2.0.1
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: Donate, https://palletsprojects.com/donate
Project-URL: Documentation, https://werkzeug.palletsprojects.com/
Project-URL: Changes, https://werkzeug.palletsprojects.com/changes/
Project-URL: Source Code, https://github.com/pallets/werkzeug/
Project-URL: Issue Tracker, https://github.com/pallets/werkzeug/issues/
Project-URL: Twitter, https://twitter.com/PalletsTeam
Project-URL: Chat, https://discord.gg/pallets
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: 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
Requires-Python: >=3.6
Description-Content-Type: text/x-rst
Requires-Dist: dataclasses ; python_version < "3.7"
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 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.
.. _WSGI: https://wsgi.readthedocs.io/en/latest/
.. _Flask: https://www.palletsprojects.com/p/flask/
Installing
----------
Install and update using `pip`_:
.. code-block:: text
pip install -U Werkzeug
.. _pip: https://pip.pypa.io/en/stable/quickstart/
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)
Donate
------
The Pallets organization develops and supports Werkzeug and other
popular packages. 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
-----
- Documentation: https://werkzeug.palletsprojects.com/
- Changes: https://werkzeug.palletsprojects.com/changes/
- PyPI Releases: https://pypi.org/project/Werkzeug/
- Source Code: https://github.com/pallets/werkzeug/
- Issue Tracker: https://github.com/pallets/werkzeug/issues/
- Website: https://palletsprojects.com/p/werkzeug/
- Twitter: https://twitter.com/PalletsTeam
- Chat: https://discord.gg/pallets

View File

@ -0,0 +1,111 @@
Werkzeug-2.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
Werkzeug-2.0.1.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475
Werkzeug-2.0.1.dist-info/METADATA,sha256=8-W33EMnGqnCCi-d8Dv63IQQuyELRIsXhwOJNXbNgL0,4421
Werkzeug-2.0.1.dist-info/RECORD,,
Werkzeug-2.0.1.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92
Werkzeug-2.0.1.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9
werkzeug/__init__.py,sha256=_CCsfdeqNllFNRJx8cvqYrwBsQQQXJaMmnk2sAZnDng,188
werkzeug/__pycache__/__init__.cpython-39.pyc,,
werkzeug/__pycache__/_internal.cpython-39.pyc,,
werkzeug/__pycache__/_reloader.cpython-39.pyc,,
werkzeug/__pycache__/datastructures.cpython-39.pyc,,
werkzeug/__pycache__/exceptions.cpython-39.pyc,,
werkzeug/__pycache__/filesystem.cpython-39.pyc,,
werkzeug/__pycache__/formparser.cpython-39.pyc,,
werkzeug/__pycache__/http.cpython-39.pyc,,
werkzeug/__pycache__/local.cpython-39.pyc,,
werkzeug/__pycache__/routing.cpython-39.pyc,,
werkzeug/__pycache__/security.cpython-39.pyc,,
werkzeug/__pycache__/serving.cpython-39.pyc,,
werkzeug/__pycache__/test.cpython-39.pyc,,
werkzeug/__pycache__/testapp.cpython-39.pyc,,
werkzeug/__pycache__/urls.cpython-39.pyc,,
werkzeug/__pycache__/user_agent.cpython-39.pyc,,
werkzeug/__pycache__/useragents.cpython-39.pyc,,
werkzeug/__pycache__/utils.cpython-39.pyc,,
werkzeug/__pycache__/wsgi.cpython-39.pyc,,
werkzeug/_internal.py,sha256=_QKkvdaG4pDFwK68c0EpPzYJGe9Y7toRAT1cBbC-CxU,18572
werkzeug/_reloader.py,sha256=B1hEfgsUOz2IginBQM5Zak_eaIF7gr3GS5-0x2OHvAE,13950
werkzeug/datastructures.py,sha256=KahVPSLOapbNbKh1ppr9K8_DgWJv1EGgA9DhTEGMHcg,97886
werkzeug/datastructures.pyi,sha256=5DTPF8P8Zvi458eK27Qcj7eNUlLM_AC0jBNkj6uQpds,33774
werkzeug/debug/__init__.py,sha256=CUFrPEYAaotHRkmjOieqd3EasXDii2JVC1HdmEzMwqM,17924
werkzeug/debug/__pycache__/__init__.cpython-39.pyc,,
werkzeug/debug/__pycache__/console.cpython-39.pyc,,
werkzeug/debug/__pycache__/repr.cpython-39.pyc,,
werkzeug/debug/__pycache__/tbtools.cpython-39.pyc,,
werkzeug/debug/console.py,sha256=E1nBMEvFkX673ShQjPtVY-byYatfX9MN-dBMjRI8a8E,5897
werkzeug/debug/repr.py,sha256=QCSHENKsChEZDCIApkVi_UNjhJ77v8BMXK1OfxO189M,9483
werkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673
werkzeug/debug/shared/ICON_LICENSE.md,sha256=DhA6Y1gUl5Jwfg0NFN9Rj4VWITt8tUx0IvdGf0ux9-s,222
werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507
werkzeug/debug/shared/debugger.js,sha256=dYbUmFmb3YZb5YpWpYPOQArdrN7NPeY0ODawL7ihzDI,10524
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=vyp1RnB227Fuw8LIyM5C-bBCBQN5hvZSCApY2oeJ9ik,6705
werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220
werkzeug/debug/tbtools.py,sha256=TfReusPbM3yjm3xvOFkH45V7-5JnNqB9x1EQPnVC6Xo,19189
werkzeug/exceptions.py,sha256=CUwx0pBiNbk4f9cON17ekgKnmLi6HIVFjUmYZc2x0wM,28681
werkzeug/filesystem.py,sha256=JS2Dv2QF98WILxY4_thHl-WMcUcwluF_4igkDPaP1l4,1956
werkzeug/formparser.py,sha256=GIKfzuQ_khuBXnf3N7_LzOEruYwNc3m4bI02BgtT5jg,17385
werkzeug/http.py,sha256=oUCXFFMnkOQ-cHbUY_aiqitshcrSzNDq3fEMf1VI_yk,45141
werkzeug/local.py,sha256=WsR6H-2XOtPigpimjORbLsS3h9WI0lCdZjGI2LHDDxA,22733
werkzeug/middleware/__init__.py,sha256=qfqgdT5npwG9ses3-FXQJf3aB95JYP1zchetH_T3PUw,500
werkzeug/middleware/__pycache__/__init__.cpython-39.pyc,,
werkzeug/middleware/__pycache__/dispatcher.cpython-39.pyc,,
werkzeug/middleware/__pycache__/http_proxy.cpython-39.pyc,,
werkzeug/middleware/__pycache__/lint.cpython-39.pyc,,
werkzeug/middleware/__pycache__/profiler.cpython-39.pyc,,
werkzeug/middleware/__pycache__/proxy_fix.cpython-39.pyc,,
werkzeug/middleware/__pycache__/shared_data.cpython-39.pyc,,
werkzeug/middleware/dispatcher.py,sha256=Fh_w-KyWnTSYF-Lfv5dimQ7THSS7afPAZMmvc4zF1gg,2580
werkzeug/middleware/http_proxy.py,sha256=HE8VyhS7CR-E1O6_9b68huv8FLgGGR1DLYqkS3Xcp3Q,7558
werkzeug/middleware/lint.py,sha256=yMzMdm4xI2_N-Wv2j1yoaVI3ltHOYS6yZyA-wUv1sKw,13962
werkzeug/middleware/profiler.py,sha256=G2JieUMv4QPamtCY6ibIK7P-piPRdPybav7bm2MSFvs,4898
werkzeug/middleware/proxy_fix.py,sha256=uRgQ3dEvFV8JxUqajHYYYOPEeA_BFqaa51Yp8VW0uzA,6849
werkzeug/middleware/shared_data.py,sha256=eOCGr-i6BCexDfL7xdPRWMwPJPgp0NE2B416Gl67Q78,10959
werkzeug/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
werkzeug/routing.py,sha256=FDRtvCfaZSmXnQ0cUYxowb3P0y0dxlUlMSUmerY5sb0,84147
werkzeug/sansio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
werkzeug/sansio/__pycache__/__init__.cpython-39.pyc,,
werkzeug/sansio/__pycache__/multipart.cpython-39.pyc,,
werkzeug/sansio/__pycache__/request.cpython-39.pyc,,
werkzeug/sansio/__pycache__/response.cpython-39.pyc,,
werkzeug/sansio/__pycache__/utils.cpython-39.pyc,,
werkzeug/sansio/multipart.py,sha256=bJMCNC2f5xyAaylahNViJ0JqmV4ThLRbDVGVzKwcqrQ,8751
werkzeug/sansio/request.py,sha256=aA9rABkWiG4MhYMByanst2NXkEclsq8SIxhb0LQf0e0,20228
werkzeug/sansio/response.py,sha256=HSG6t-tyPZd3awzWqr7qL9IV4HYAvDgON1c0YPU2RXw,24117
werkzeug/sansio/utils.py,sha256=V5v-UUnX8pm4RehP9Tt_NiUSOJGJGUvKjlW0eOIQldM,4164
werkzeug/security.py,sha256=gPDRuCjkjWrcqj99tBMq8_nHFZLFQjgoW5Ga5XIw9jo,8158
werkzeug/serving.py,sha256=_RG2dCclOQcdjJ2NE8tzCRybGePlwcs8kTypiWRP2gY,38030
werkzeug/test.py,sha256=EJXJy-b_JriHrlfs5VNCkwbki8Kn_xUDkOYOCx_6Q7Q,48096
werkzeug/testapp.py,sha256=f48prWSGJhbSrvYb8e1fnAah4BkrLb0enHSdChgsjBY,9471
werkzeug/urls.py,sha256=3o_aUcr5Ou13XihSU6VvX6RHMhoWkKpXuCCia9SSAb8,41021
werkzeug/user_agent.py,sha256=WclZhpvgLurMF45hsioSbS75H1Zb4iMQGKN3_yZ2oKo,1420
werkzeug/useragents.py,sha256=G8tmv_6vxJaPrLQH3eODNgIYe0_V6KETROQlJI-WxDE,7264
werkzeug/utils.py,sha256=WrU-LbwemyGd8zBHBgQyLaIxing4QLEChiP0qnzr2sc,36771
werkzeug/wrappers/__init__.py,sha256=-s75nPbyXHzU_rwmLPDhoMuGbEUk0jZT_n0ZQAOFGf8,654
werkzeug/wrappers/__pycache__/__init__.cpython-39.pyc,,
werkzeug/wrappers/__pycache__/accept.cpython-39.pyc,,
werkzeug/wrappers/__pycache__/auth.cpython-39.pyc,,
werkzeug/wrappers/__pycache__/base_request.cpython-39.pyc,,
werkzeug/wrappers/__pycache__/base_response.cpython-39.pyc,,
werkzeug/wrappers/__pycache__/common_descriptors.cpython-39.pyc,,
werkzeug/wrappers/__pycache__/cors.cpython-39.pyc,,
werkzeug/wrappers/__pycache__/etag.cpython-39.pyc,,
werkzeug/wrappers/__pycache__/json.cpython-39.pyc,,
werkzeug/wrappers/__pycache__/request.cpython-39.pyc,,
werkzeug/wrappers/__pycache__/response.cpython-39.pyc,,
werkzeug/wrappers/__pycache__/user_agent.cpython-39.pyc,,
werkzeug/wrappers/accept.py,sha256=_oZtAQkahvsrPRkNj2fieg7_St9P0NFC3SgZbJKS6xU,429
werkzeug/wrappers/auth.py,sha256=rZPCzGxHk9R55PRkmS90kRywUVjjuMWzCGtH68qCq8U,856
werkzeug/wrappers/base_request.py,sha256=saz9RyNQkvI_XLPYVm29KijNHmD1YzgxDqa0qHTbgss,1174
werkzeug/wrappers/base_response.py,sha256=q_-TaYywT5G4zA-DWDRDJhJSat2_4O7gOPob6ye4_9A,1186
werkzeug/wrappers/common_descriptors.py,sha256=v_kWLH3mvCiSRVJ1FNw7nO3w2UJfzY57UKKB5J4zCvE,898
werkzeug/wrappers/cors.py,sha256=c5UndlZsZvYkbPrp6Gj5iSXxw_VOJDJHskO6-jRmNyQ,846
werkzeug/wrappers/etag.py,sha256=XHWQQs7Mdd1oWezgBIsl-bYe8ydKkRZVil2Qd01D0Mo,846
werkzeug/wrappers/json.py,sha256=HM1btPseGeXca0vnwQN_MvZl6h-qNsFY5YBKXKXFwus,410
werkzeug/wrappers/request.py,sha256=0zAkCUwJbUBzioGy2UKxE6XpuXPAZbEhhML4WErzeBo,24818
werkzeug/wrappers/response.py,sha256=95hXIysZTeNC0bqhvGB2fLBRKxedR_cgI5szZZWfyzw,35177
werkzeug/wrappers/user_agent.py,sha256=Wl1-A0-1r8o7cHIZQTB55O4Ged6LpCKENaQDlOY5pXA,435
werkzeug/wsgi.py,sha256=7psV3SHLtCzk1KSuGmIK5uP2QTDXyfCCDclyqCmIUO4,33715

View File

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

View File

@ -0,0 +1 @@
werkzeug

View File

@ -0,0 +1,128 @@
import sys
import os
import re
import importlib
import warnings
is_pypy = '__pypy__' in sys.builtin_module_names
warnings.filterwarnings('ignore',
r'.+ distutils\b.+ deprecated',
DeprecationWarning)
def warn_distutils_present():
if 'distutils' not in sys.modules:
return
if is_pypy and sys.version_info < (3, 7):
# PyPy for 3.6 unconditionally imports distutils, so bypass the warning
# https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250
return
warnings.warn(
"Distutils was imported before Setuptools, but importing Setuptools "
"also replaces the `distutils` module in `sys.modules`. This may lead "
"to undesirable behaviors or errors. To avoid these issues, avoid "
"using distutils directly, ensure that setuptools is installed in the "
"traditional way (e.g. not an editable install), and/or make sure "
"that setuptools is always imported before distutils.")
def clear_distutils():
if 'distutils' not in sys.modules:
return
warnings.warn("Setuptools is replacing distutils.")
mods = [name for name in sys.modules if re.match(r'distutils\b', name)]
for name in mods:
del sys.modules[name]
def enabled():
"""
Allow selection of distutils by environment variable.
"""
which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'stdlib')
return which == 'local'
def ensure_local_distutils():
clear_distutils()
distutils = importlib.import_module('setuptools._distutils')
distutils.__name__ = 'distutils'
sys.modules['distutils'] = distutils
# sanity check that submodules load as expected
core = importlib.import_module('distutils.core')
assert '_distutils' in core.__file__, core.__file__
def do_override():
"""
Ensure that the local copy of distutils is preferred over stdlib.
See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401
for more motivation.
"""
if enabled():
warn_distutils_present()
ensure_local_distutils()
class DistutilsMetaFinder:
def find_spec(self, fullname, path, target=None):
if path is not None:
return
method_name = 'spec_for_{fullname}'.format(**locals())
method = getattr(self, method_name, lambda: None)
return method()
def spec_for_distutils(self):
import importlib.abc
import importlib.util
class DistutilsLoader(importlib.abc.Loader):
def create_module(self, spec):
return importlib.import_module('setuptools._distutils')
def exec_module(self, module):
pass
return importlib.util.spec_from_loader('distutils', DistutilsLoader())
def spec_for_pip(self):
"""
Ensure stdlib distutils when running under pip.
See pypa/pip#8761 for rationale.
"""
if self.pip_imported_during_build():
return
clear_distutils()
self.spec_for_distutils = lambda: None
@staticmethod
def pip_imported_during_build():
"""
Detect if pip is being imported in a build script. Ref #2355.
"""
import traceback
return any(
frame.f_globals['__file__'].endswith('setup.py')
for frame, line in traceback.walk_stack(None)
)
DISTUTILS_FINDER = DistutilsMetaFinder()
def add_shim():
sys.meta_path.insert(0, DISTUTILS_FINDER)
def remove_shim():
try:
sys.meta_path.remove(DISTUTILS_FINDER)
except ValueError:
pass

View File

@ -0,0 +1 @@
__import__('_distutils_hack').do_override()

View File

@ -0,0 +1,8 @@
__all__ = ["__version__"]
try:
from ._version import version as __version__
except ImportError:
# broken installation, we don't even try
# unknown only works because we do poor mans version compare
__version__ = "unknown"

View File

@ -0,0 +1,117 @@
"""Allow bash-completion for argparse with argcomplete if installed.
Needs argcomplete>=0.5.6 for python 3.2/3.3 (older versions fail
to find the magic string, so _ARGCOMPLETE env. var is never set, and
this does not need special code).
Function try_argcomplete(parser) should be called directly before
the call to ArgumentParser.parse_args().
The filescompleter is what you normally would use on the positional
arguments specification, in order to get "dirname/" after "dirn<TAB>"
instead of the default "dirname ":
optparser.add_argument(Config._file_or_dir, nargs='*').completer=filescompleter
Other, application specific, completers should go in the file
doing the add_argument calls as they need to be specified as .completer
attributes as well. (If argcomplete is not installed, the function the
attribute points to will not be used).
SPEEDUP
=======
The generic argcomplete script for bash-completion
(/etc/bash_completion.d/python-argcomplete.sh)
uses a python program to determine startup script generated by pip.
You can speed up completion somewhat by changing this script to include
# PYTHON_ARGCOMPLETE_OK
so the python-argcomplete-check-easy-install-script does not
need to be called to find the entry point of the code and see if that is
marked with PYTHON_ARGCOMPLETE_OK.
INSTALL/DEBUGGING
=================
To include this support in another application that has setup.py generated
scripts:
- Add the line:
# PYTHON_ARGCOMPLETE_OK
near the top of the main python entry point.
- Include in the file calling parse_args():
from _argcomplete import try_argcomplete, filescompleter
Call try_argcomplete just before parse_args(), and optionally add
filescompleter to the positional arguments' add_argument().
If things do not work right away:
- Switch on argcomplete debugging with (also helpful when doing custom
completers):
export _ARC_DEBUG=1
- Run:
python-argcomplete-check-easy-install-script $(which appname)
echo $?
will echo 0 if the magic line has been found, 1 if not.
- Sometimes it helps to find early on errors using:
_ARGCOMPLETE=1 _ARC_DEBUG=1 appname
which should throw a KeyError: 'COMPLINE' (which is properly set by the
global argcomplete script).
"""
import argparse
import os
import sys
from glob import glob
from typing import Any
from typing import List
from typing import Optional
class FastFilesCompleter:
"""Fast file completer class."""
def __init__(self, directories: bool = True) -> None:
self.directories = directories
def __call__(self, prefix: str, **kwargs: Any) -> List[str]:
# Only called on non option completions.
if os.path.sep in prefix[1:]:
prefix_dir = len(os.path.dirname(prefix) + os.path.sep)
else:
prefix_dir = 0
completion = []
globbed = []
if "*" not in prefix and "?" not in prefix:
# We are on unix, otherwise no bash.
if not prefix or prefix[-1] == os.path.sep:
globbed.extend(glob(prefix + ".*"))
prefix += "*"
globbed.extend(glob(prefix))
for x in sorted(globbed):
if os.path.isdir(x):
x += "/"
# Append stripping the prefix (like bash, not like compgen).
completion.append(x[prefix_dir:])
return completion
if os.environ.get("_ARGCOMPLETE"):
try:
import argcomplete.completers
except ImportError:
sys.exit(-1)
filescompleter: Optional[FastFilesCompleter] = FastFilesCompleter()
def try_argcomplete(parser: argparse.ArgumentParser) -> None:
argcomplete.autocomplete(parser, always_complete_options=False)
else:
def try_argcomplete(parser: argparse.ArgumentParser) -> None:
pass
filescompleter = None

View File

@ -0,0 +1,22 @@
"""Python inspection/code generation API."""
from .code import Code
from .code import ExceptionInfo
from .code import filter_traceback
from .code import Frame
from .code import getfslineno
from .code import Traceback
from .code import TracebackEntry
from .source import getrawcode
from .source import Source
__all__ = [
"Code",
"ExceptionInfo",
"filter_traceback",
"Frame",
"getfslineno",
"getrawcode",
"Traceback",
"TracebackEntry",
"Source",
]

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