From ca97db341d736e6c9aa90125902b500b3e7d82f5 Mon Sep 17 00:00:00 2001 From: huub Date: Wed, 20 Dec 2023 00:00:08 +0100 Subject: [PATCH 1/2] cleaned up the workspace by deleting the venv and .vscode settings, fixed werkzeug error --- .gitignore | 127 + .vscode/settings.json | 6 - __pycache__/utils.cpython-311.pyc | Bin 918 -> 930 bytes main.py | 2 +- requirements.txt | 2 + venv_flaskchat/bin/Activate.ps1 | 247 - venv_flaskchat/bin/activate | 69 - venv_flaskchat/bin/activate.csh | 26 - venv_flaskchat/bin/activate.fish | 69 - venv_flaskchat/bin/flask | 8 - venv_flaskchat/bin/pip | 8 - venv_flaskchat/bin/pip3 | 8 - venv_flaskchat/bin/pip3.11 | 8 - venv_flaskchat/bin/python | 1 - venv_flaskchat/bin/python3 | 1 - venv_flaskchat/bin/python3.11 | 1 - .../Flask-2.3.2.dist-info/INSTALLER | 1 - .../Flask-2.3.2.dist-info/LICENSE.rst | 28 - .../Flask-2.3.2.dist-info/METADATA | 118 - .../Flask-2.3.2.dist-info/RECORD | 54 - .../Flask-2.3.2.dist-info/REQUESTED | 0 .../site-packages/Flask-2.3.2.dist-info/WHEEL | 5 - .../Flask-2.3.2.dist-info/entry_points.txt | 2 - .../Flask-2.3.2.dist-info/top_level.txt | 1 - .../Flask_SocketIO-5.3.4.dist-info/INSTALLER | 1 - .../Flask_SocketIO-5.3.4.dist-info/LICENSE | 20 - .../Flask_SocketIO-5.3.4.dist-info/METADATA | 75 - .../Flask_SocketIO-5.3.4.dist-info/RECORD | 13 - .../Flask_SocketIO-5.3.4.dist-info/REQUESTED | 0 .../Flask_SocketIO-5.3.4.dist-info/WHEEL | 5 - .../top_level.txt | 1 - .../Jinja2-3.1.2.dist-info/INSTALLER | 1 - .../Jinja2-3.1.2.dist-info/LICENSE.rst | 28 - .../Jinja2-3.1.2.dist-info/METADATA | 113 - .../Jinja2-3.1.2.dist-info/RECORD | 58 - .../Jinja2-3.1.2.dist-info/WHEEL | 5 - .../Jinja2-3.1.2.dist-info/entry_points.txt | 2 - .../Jinja2-3.1.2.dist-info/top_level.txt | 1 - .../MarkupSafe-2.1.3.dist-info/INSTALLER | 1 - .../MarkupSafe-2.1.3.dist-info/LICENSE.rst | 28 - .../MarkupSafe-2.1.3.dist-info/METADATA | 93 - .../MarkupSafe-2.1.3.dist-info/RECORD | 14 - .../MarkupSafe-2.1.3.dist-info/WHEEL | 5 - .../MarkupSafe-2.1.3.dist-info/top_level.txt | 1 - .../Werkzeug-2.3.6.dist-info/INSTALLER | 1 - .../Werkzeug-2.3.6.dist-info/LICENSE.rst | 28 - .../Werkzeug-2.3.6.dist-info/METADATA | 119 - .../Werkzeug-2.3.6.dist-info/RECORD | 126 - .../Werkzeug-2.3.6.dist-info/WHEEL | 5 - .../Werkzeug-2.3.6.dist-info/top_level.txt | 1 - .../typing_extensions.cpython-311.pyc | Bin 131547 -> 0 bytes .../site-packages/_distutils_hack/__init__.py | 222 - .../__pycache__/__init__.cpython-311.pyc | Bin 11183 -> 0 bytes .../__pycache__/override.cpython-311.pyc | Bin 340 -> 0 bytes .../site-packages/_distutils_hack/override.py | 1 - .../annotated_types-0.5.0.dist-info/INSTALLER | 1 - .../annotated_types-0.5.0.dist-info/METADATA | 221 - .../annotated_types-0.5.0.dist-info/RECORD | 10 - .../annotated_types-0.5.0.dist-info/WHEEL | 4 - .../licenses/LICENSE | 21 - .../site-packages/annotated_types/__init__.py | 319 - .../__pycache__/__init__.cpython-311.pyc | Bin 15835 -> 0 bytes .../__pycache__/test_cases.cpython-311.pyc | Bin 13524 -> 0 bytes .../site-packages/annotated_types/py.typed | 0 .../annotated_types/test_cases.py | 133 - .../bidict-0.22.1.dist-info/INSTALLER | 1 - .../bidict-0.22.1.dist-info/LICENSE | 376 - .../bidict-0.22.1.dist-info/METADATA | 298 - .../bidict-0.22.1.dist-info/RECORD | 35 - .../bidict-0.22.1.dist-info/WHEEL | 5 - .../bidict-0.22.1.dist-info/top_level.txt | 1 - .../site-packages/bidict/__init__.py | 100 - .../__pycache__/__init__.cpython-311.pyc | Bin 3189 -> 0 bytes .../bidict/__pycache__/_abc.cpython-311.pyc | Bin 3063 -> 0 bytes .../bidict/__pycache__/_base.cpython-311.pyc | Bin 26566 -> 0 bytes .../__pycache__/_bidict.cpython-311.pyc | Bin 10796 -> 0 bytes .../bidict/__pycache__/_dup.cpython-311.pyc | Bin 2660 -> 0 bytes .../bidict/__pycache__/_exc.cpython-311.pyc | Bin 1897 -> 0 bytes .../__pycache__/_frozenbidict.cpython-311.pyc | Bin 1586 -> 0 bytes .../_frozenordered.cpython-311.pyc | Bin 2026 -> 0 bytes .../bidict/__pycache__/_iter.cpython-311.pyc | Bin 2291 -> 0 bytes .../bidict/__pycache__/_named.cpython-311.pyc | Bin 5768 -> 0 bytes .../__pycache__/_orderedbase.cpython-311.pyc | Bin 13625 -> 0 bytes .../_orderedbidict.cpython-311.pyc | Bin 8181 -> 0 bytes .../__pycache__/_typing.cpython-311.pyc | Bin 1719 -> 0 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 583 -> 0 bytes .../python3.11/site-packages/bidict/_abc.py | 77 - .../python3.11/site-packages/bidict/_base.py | 552 -- .../site-packages/bidict/_bidict.py | 198 - .../python3.11/site-packages/bidict/_dup.py | 59 - .../python3.11/site-packages/bidict/_exc.py | 36 - .../site-packages/bidict/_frozenbidict.py | 46 - .../site-packages/bidict/_frozenordered.py | 50 - .../python3.11/site-packages/bidict/_iter.py | 46 - .../python3.11/site-packages/bidict/_named.py | 97 - .../site-packages/bidict/_orderedbase.py | 238 - .../site-packages/bidict/_orderedbidict.py | 160 - .../site-packages/bidict/_typing.py | 43 - .../site-packages/bidict/metadata.py | 15 - .../python3.11/site-packages/bidict/py.typed | 1 - .../blinker-1.6.2.dist-info/INSTALLER | 1 - .../blinker-1.6.2.dist-info/LICENSE.rst | 20 - .../blinker-1.6.2.dist-info/METADATA | 63 - .../blinker-1.6.2.dist-info/RECORD | 15 - .../blinker-1.6.2.dist-info/WHEEL | 5 - .../blinker-1.6.2.dist-info/top_level.txt | 1 - .../site-packages/blinker/__init__.py | 19 - .../__pycache__/__init__.cpython-311.pyc | Bin 661 -> 0 bytes .../__pycache__/_saferef.cpython-311.pyc | Bin 9973 -> 0 bytes .../__pycache__/_utilities.cpython-311.pyc | Bin 6721 -> 0 bytes .../blinker/__pycache__/base.cpython-311.pyc | Bin 24861 -> 0 bytes .../site-packages/blinker/_saferef.py | 230 - .../site-packages/blinker/_utilities.py | 142 - .../python3.11/site-packages/blinker/base.py | 551 -- .../python3.11/site-packages/blinker/py.typed | 0 .../click-8.1.3.dist-info/INSTALLER | 1 - .../click-8.1.3.dist-info/LICENSE.rst | 28 - .../click-8.1.3.dist-info/METADATA | 111 - .../click-8.1.3.dist-info/RECORD | 39 - .../site-packages/click-8.1.3.dist-info/WHEEL | 5 - .../click-8.1.3.dist-info/top_level.txt | 1 - .../site-packages/click/__init__.py | 73 - .../__pycache__/__init__.cpython-311.pyc | Bin 3701 -> 0 bytes .../click/__pycache__/_compat.cpython-311.pyc | Bin 28464 -> 0 bytes .../__pycache__/_termui_impl.cpython-311.pyc | Bin 32605 -> 0 bytes .../__pycache__/_textwrap.cpython-311.pyc | Bin 2662 -> 0 bytes .../__pycache__/_winconsole.cpython-311.pyc | Bin 13352 -> 0 bytes .../click/__pycache__/core.cpython-311.pyc | Bin 140796 -> 0 bytes .../__pycache__/decorators.cpython-311.pyc | Bin 23522 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 16082 -> 0 bytes .../__pycache__/formatting.cpython-311.pyc | Bin 15707 -> 0 bytes .../click/__pycache__/globals.cpython-311.pyc | Bin 3389 -> 0 bytes .../click/__pycache__/parser.cpython-311.pyc | Bin 23139 -> 0 bytes .../shell_completion.cpython-311.pyc | Bin 23588 -> 0 bytes .../click/__pycache__/termui.cpython-311.pyc | Bin 34693 -> 0 bytes .../click/__pycache__/testing.cpython-311.pyc | Bin 25757 -> 0 bytes .../click/__pycache__/types.cpython-311.pyc | Bin 52846 -> 0 bytes .../click/__pycache__/utils.cpython-311.pyc | Bin 26030 -> 0 bytes .../python3.11/site-packages/click/_compat.py | 626 -- .../site-packages/click/_termui_impl.py | 717 -- .../site-packages/click/_textwrap.py | 49 - .../site-packages/click/_winconsole.py | 279 - .../python3.11/site-packages/click/core.py | 2998 ------ .../site-packages/click/decorators.py | 497 - .../site-packages/click/exceptions.py | 287 - .../site-packages/click/formatting.py | 301 - .../python3.11/site-packages/click/globals.py | 68 - .../python3.11/site-packages/click/parser.py | 529 - .../python3.11/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 580 -- .../python3.11/site-packages/click/termui.py | 787 -- .../python3.11/site-packages/click/testing.py | 479 - .../python3.11/site-packages/click/types.py | 1073 -- .../python3.11/site-packages/click/utils.py | 580 -- .../site-packages/distutils-precedence.pth | 1 - .../site-packages/engineio/__init__.py | 23 - .../__pycache__/__init__.cpython-311.pyc | Bin 1050 -> 0 bytes .../asyncio_client.cpython-311.pyc | Bin 38189 -> 0 bytes .../asyncio_server.cpython-311.pyc | Bin 27734 -> 0 bytes .../asyncio_socket.cpython-311.pyc | Bin 15225 -> 0 bytes .../__pycache__/client.cpython-311.pyc | Bin 38616 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 1377 -> 0 bytes .../engineio/__pycache__/json.cpython-311.pyc | Bin 879 -> 0 bytes .../__pycache__/middleware.cpython-311.pyc | Bin 5318 -> 0 bytes .../__pycache__/packet.cpython-311.pyc | Bin 3931 -> 0 bytes .../__pycache__/payload.cpython-311.pyc | Bin 2561 -> 0 bytes .../__pycache__/server.cpython-311.pyc | Bin 39263 -> 0 bytes .../__pycache__/socket.cpython-311.pyc | Bin 14892 -> 0 bytes .../__pycache__/static_files.cpython-311.pyc | Bin 2544 -> 0 bytes .../engineio/async_drivers/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 225 -> 0 bytes .../__pycache__/aiohttp.cpython-311.pyc | Bin 5903 -> 0 bytes .../__pycache__/asgi.cpython-311.pyc | Bin 14751 -> 0 bytes .../__pycache__/eventlet.cpython-311.pyc | Bin 1934 -> 0 bytes .../__pycache__/gevent.cpython-311.pyc | Bin 3599 -> 0 bytes .../__pycache__/gevent_uwsgi.cpython-311.pyc | Bin 8134 -> 0 bytes .../__pycache__/sanic.cpython-311.pyc | Bin 7093 -> 0 bytes .../__pycache__/threading.cpython-311.pyc | Bin 2488 -> 0 bytes .../__pycache__/tornado.cpython-311.pyc | Bin 10532 -> 0 bytes .../engineio/async_drivers/aiohttp.py | 127 - .../engineio/async_drivers/asgi.py | 263 - .../engineio/async_drivers/eventlet.py | 30 - .../engineio/async_drivers/gevent.py | 63 - .../engineio/async_drivers/gevent_uwsgi.py | 167 - .../engineio/async_drivers/sanic.py | 147 - .../engineio/async_drivers/threading.py | 48 - .../engineio/async_drivers/tornado.py | 182 - .../site-packages/engineio/asyncio_client.py | 640 -- .../site-packages/engineio/asyncio_server.py | 513 - .../site-packages/engineio/asyncio_socket.py | 251 - .../site-packages/engineio/client.py | 727 -- .../site-packages/engineio/exceptions.py | 22 - .../python3.11/site-packages/engineio/json.py | 16 - .../site-packages/engineio/middleware.py | 87 - .../site-packages/engineio/packet.py | 74 - .../site-packages/engineio/payload.py | 46 - .../site-packages/engineio/server.py | 770 -- .../site-packages/engineio/socket.py | 260 - .../site-packages/engineio/static_files.py | 60 - .../site-packages/flask/__init__.py | 102 - .../site-packages/flask/__main__.py | 3 - .../__pycache__/__init__.cpython-311.pyc | Bin 4089 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 283 -> 0 bytes .../flask/__pycache__/app.cpython-311.pyc | Bin 87110 -> 0 bytes .../__pycache__/blueprints.cpython-311.pyc | Bin 32032 -> 0 bytes .../flask/__pycache__/cli.cpython-311.pyc | Bin 44184 -> 0 bytes .../flask/__pycache__/config.cpython-311.pyc | Bin 16419 -> 0 bytes .../flask/__pycache__/ctx.cpython-311.pyc | Bin 20646 -> 0 bytes .../__pycache__/debughelpers.cpython-311.pyc | Bin 9490 -> 0 bytes .../flask/__pycache__/globals.cpython-311.pyc | Bin 4287 -> 0 bytes .../flask/__pycache__/helpers.cpython-311.pyc | Bin 29804 -> 0 bytes .../flask/__pycache__/logging.cpython-311.pyc | Bin 3471 -> 0 bytes .../__pycache__/scaffold.cpython-311.pyc | Bin 36478 -> 0 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 17359 -> 0 bytes .../flask/__pycache__/signals.cpython-311.pyc | Bin 1987 -> 0 bytes .../__pycache__/templating.cpython-311.pyc | Bin 10618 -> 0 bytes .../flask/__pycache__/testing.cpython-311.pyc | Bin 14167 -> 0 bytes .../flask/__pycache__/typing.cpython-311.pyc | Bin 3455 -> 0 bytes .../flask/__pycache__/views.cpython-311.pyc | Bin 7324 -> 0 bytes .../__pycache__/wrappers.cpython-311.pyc | Bin 6774 -> 0 bytes .../lib/python3.11/site-packages/flask/app.py | 2213 ----- .../site-packages/flask/blueprints.py | 626 -- .../lib/python3.11/site-packages/flask/cli.py | 1067 -- .../python3.11/site-packages/flask/config.py | 345 - .../lib/python3.11/site-packages/flask/ctx.py | 440 - .../site-packages/flask/debughelpers.py | 160 - .../python3.11/site-packages/flask/globals.py | 96 - .../python3.11/site-packages/flask/helpers.py | 693 -- .../site-packages/flask/json/__init__.py | 170 - .../json/__pycache__/__init__.cpython-311.pyc | Bin 6898 -> 0 bytes .../json/__pycache__/provider.cpython-311.pyc | Bin 10005 -> 0 bytes .../json/__pycache__/tag.cpython-311.pyc | Bin 15607 -> 0 bytes .../site-packages/flask/json/provider.py | 216 - .../site-packages/flask/json/tag.py | 314 - .../python3.11/site-packages/flask/logging.py | 76 - .../python3.11/site-packages/flask/py.typed | 0 .../site-packages/flask/scaffold.py | 923 -- .../site-packages/flask/sessions.py | 367 - .../python3.11/site-packages/flask/signals.py | 33 - .../site-packages/flask/templating.py | 220 - .../python3.11/site-packages/flask/testing.py | 282 - .../python3.11/site-packages/flask/typing.py | 82 - .../python3.11/site-packages/flask/views.py | 190 - .../site-packages/flask/wrappers.py | 173 - .../site-packages/flask_socketio/__init__.py | 1118 --- .../__pycache__/__init__.cpython-311.pyc | Bin 60209 -> 0 bytes .../__pycache__/namespace.cpython-311.pyc | Bin 2972 -> 0 bytes .../__pycache__/test_client.cpython-311.pyc | Bin 13223 -> 0 bytes .../site-packages/flask_socketio/namespace.py | 46 - .../flask_socketio/test_client.py | 218 - .../itsdangerous-2.1.2.dist-info/INSTALLER | 1 - .../itsdangerous-2.1.2.dist-info/LICENSE.rst | 28 - .../itsdangerous-2.1.2.dist-info/METADATA | 97 - .../itsdangerous-2.1.2.dist-info/RECORD | 23 - .../itsdangerous-2.1.2.dist-info/WHEEL | 5 - .../top_level.txt | 1 - .../site-packages/itsdangerous/__init__.py | 19 - .../__pycache__/__init__.cpython-311.pyc | Bin 1172 -> 0 bytes .../__pycache__/_json.cpython-311.pyc | Bin 1410 -> 0 bytes .../__pycache__/encoding.cpython-311.pyc | Bin 2997 -> 0 bytes .../__pycache__/exc.cpython-311.pyc | Bin 5013 -> 0 bytes .../__pycache__/serializer.cpython-311.pyc | Bin 13656 -> 0 bytes .../__pycache__/signer.cpython-311.pyc | Bin 12363 -> 0 bytes .../__pycache__/timed.cpython-311.pyc | Bin 10089 -> 0 bytes .../__pycache__/url_safe.cpython-311.pyc | Bin 4017 -> 0 bytes .../site-packages/itsdangerous/_json.py | 16 - .../site-packages/itsdangerous/encoding.py | 54 - .../site-packages/itsdangerous/exc.py | 107 - .../site-packages/itsdangerous/py.typed | 0 .../site-packages/itsdangerous/serializer.py | 295 - .../site-packages/itsdangerous/signer.py | 257 - .../site-packages/itsdangerous/timed.py | 234 - .../site-packages/itsdangerous/url_safe.py | 80 - .../site-packages/jinja2/__init__.py | 37 - .../__pycache__/__init__.cpython-311.pyc | Bin 2142 -> 0 bytes .../__pycache__/_identifier.cpython-311.pyc | Bin 2158 -> 0 bytes .../__pycache__/async_utils.cpython-311.pyc | Bin 4659 -> 0 bytes .../__pycache__/bccache.cpython-311.pyc | Bin 20940 -> 0 bytes .../__pycache__/compiler.cpython-311.pyc | Bin 110501 -> 0 bytes .../__pycache__/constants.cpython-311.pyc | Bin 1577 -> 0 bytes .../jinja2/__pycache__/debug.cpython-311.pyc | Bin 6737 -> 0 bytes .../__pycache__/defaults.cpython-311.pyc | Bin 1743 -> 0 bytes .../__pycache__/environment.cpython-311.pyc | Bin 80559 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 8628 -> 0 bytes .../jinja2/__pycache__/ext.cpython-311.pyc | Bin 43207 -> 0 bytes .../__pycache__/filters.cpython-311.pyc | Bin 75905 -> 0 bytes .../__pycache__/idtracking.cpython-311.pyc | Bin 19563 -> 0 bytes .../jinja2/__pycache__/lexer.cpython-311.pyc | Bin 35638 -> 0 bytes .../__pycache__/loaders.cpython-311.pyc | Bin 33096 -> 0 bytes .../jinja2/__pycache__/meta.cpython-311.pyc | Bin 5722 -> 0 bytes .../__pycache__/nativetypes.cpython-311.pyc | Bin 7984 -> 0 bytes .../jinja2/__pycache__/nodes.cpython-311.pyc | Bin 64503 -> 0 bytes .../__pycache__/optimizer.cpython-311.pyc | Bin 2873 -> 0 bytes .../jinja2/__pycache__/parser.cpython-311.pyc | Bin 59317 -> 0 bytes .../__pycache__/runtime.cpython-311.pyc | Bin 50669 -> 0 bytes .../__pycache__/sandbox.cpython-311.pyc | Bin 18841 -> 0 bytes .../jinja2/__pycache__/tests.cpython-311.pyc | Bin 9264 -> 0 bytes .../jinja2/__pycache__/utils.cpython-311.pyc | Bin 37079 -> 0 bytes .../__pycache__/visitor.cpython-311.pyc | Bin 5733 -> 0 bytes .../site-packages/jinja2/_identifier.py | 6 - .../site-packages/jinja2/async_utils.py | 84 - .../site-packages/jinja2/bccache.py | 406 - .../site-packages/jinja2/compiler.py | 1957 ---- .../site-packages/jinja2/constants.py | 20 - .../python3.11/site-packages/jinja2/debug.py | 191 - .../site-packages/jinja2/defaults.py | 48 - .../site-packages/jinja2/environment.py | 1667 ---- .../site-packages/jinja2/exceptions.py | 166 - .../python3.11/site-packages/jinja2/ext.py | 859 -- .../site-packages/jinja2/filters.py | 1840 ---- .../site-packages/jinja2/idtracking.py | 318 - .../python3.11/site-packages/jinja2/lexer.py | 866 -- .../site-packages/jinja2/loaders.py | 661 -- .../python3.11/site-packages/jinja2/meta.py | 111 - .../site-packages/jinja2/nativetypes.py | 130 - .../python3.11/site-packages/jinja2/nodes.py | 1204 --- .../site-packages/jinja2/optimizer.py | 47 - .../python3.11/site-packages/jinja2/parser.py | 1032 -- .../python3.11/site-packages/jinja2/py.typed | 0 .../site-packages/jinja2/runtime.py | 1053 -- .../site-packages/jinja2/sandbox.py | 428 - .../python3.11/site-packages/jinja2/tests.py | 255 - .../python3.11/site-packages/jinja2/utils.py | 755 -- .../site-packages/jinja2/visitor.py | 92 - .../site-packages/markupsafe/__init__.py | 304 - .../__pycache__/__init__.cpython-311.pyc | Bin 19793 -> 0 bytes .../__pycache__/_native.cpython-311.pyc | Bin 2760 -> 0 bytes .../site-packages/markupsafe/_native.py | 63 - .../site-packages/markupsafe/_speedups.c | 320 - .../_speedups.cpython-311-darwin.so | Bin 117484 -> 0 bytes .../site-packages/markupsafe/_speedups.pyi | 9 - .../site-packages/markupsafe/py.typed | 0 .../pip-23.0.1.dist-info/INSTALLER | 1 - .../pip-23.0.1.dist-info/LICENSE.txt | 20 - .../pip-23.0.1.dist-info/METADATA | 88 - .../site-packages/pip-23.0.1.dist-info/RECORD | 1002 -- .../pip-23.0.1.dist-info/REQUESTED | 0 .../site-packages/pip-23.0.1.dist-info/WHEEL | 5 - .../pip-23.0.1.dist-info/entry_points.txt | 4 - .../pip-23.0.1.dist-info/top_level.txt | 1 - .../python3.11/site-packages/pip/__init__.py | 13 - .../python3.11/site-packages/pip/__main__.py | 31 - .../site-packages/pip/__pip-runner__.py | 50 - .../pip/__pycache__/__init__.cpython-311.pyc | Bin 795 -> 0 bytes .../pip/__pycache__/__main__.cpython-311.pyc | Bin 1104 -> 0 bytes .../__pip-runner__.cpython-311.pyc | Bin 2532 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 19 - .../__pycache__/__init__.cpython-311.pyc | Bin 978 -> 0 bytes .../__pycache__/build_env.cpython-311.pyc | Bin 16098 -> 0 bytes .../__pycache__/cache.cpython-311.pyc | Bin 14723 -> 0 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 19254 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 38383 -> 0 bytes .../__pycache__/main.cpython-311.pyc | Bin 778 -> 0 bytes .../__pycache__/pyproject.cpython-311.pyc | Bin 5546 -> 0 bytes .../self_outdated_check.cpython-311.pyc | Bin 11348 -> 0 bytes .../__pycache__/wheel_builder.cpython-311.pyc | Bin 16018 -> 0 bytes .../site-packages/pip/_internal/build_env.py | 311 - .../site-packages/pip/_internal/cache.py | 293 - .../pip/_internal/cli/__init__.py | 4 - .../cli/__pycache__/__init__.cpython-311.pyc | Bin 313 -> 0 bytes .../autocompletion.cpython-311.pyc | Bin 10103 -> 0 bytes .../__pycache__/base_command.cpython-311.pyc | Bin 11101 -> 0 bytes .../__pycache__/cmdoptions.cpython-311.pyc | Bin 33000 -> 0 bytes .../command_context.cpython-311.pyc | Bin 2135 -> 0 bytes .../cli/__pycache__/main.cpython-311.pyc | Bin 2390 -> 0 bytes .../__pycache__/main_parser.cpython-311.pyc | Bin 5549 -> 0 bytes .../cli/__pycache__/parser.cpython-311.pyc | Bin 17050 -> 0 bytes .../__pycache__/progress_bars.cpython-311.pyc | Bin 3197 -> 0 bytes .../__pycache__/req_command.cpython-311.pyc | Bin 20162 -> 0 bytes .../cli/__pycache__/spinners.cpython-311.pyc | Bin 8862 -> 0 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 401 -> 0 bytes .../pip/_internal/cli/autocompletion.py | 171 - .../pip/_internal/cli/base_command.py | 216 - .../pip/_internal/cli/cmdoptions.py | 1055 -- .../pip/_internal/cli/command_context.py | 27 - .../site-packages/pip/_internal/cli/main.py | 70 - .../pip/_internal/cli/main_parser.py | 134 - .../site-packages/pip/_internal/cli/parser.py | 294 - .../pip/_internal/cli/progress_bars.py | 68 - .../pip/_internal/cli/req_command.py | 502 - .../pip/_internal/cli/spinners.py | 159 - .../pip/_internal/cli/status_codes.py | 6 - .../pip/_internal/commands/__init__.py | 132 - .../__pycache__/__init__.cpython-311.pyc | Bin 4481 -> 0 bytes .../__pycache__/cache.cpython-311.pyc | Bin 10580 -> 0 bytes .../__pycache__/check.cpython-311.pyc | Bin 2331 -> 0 bytes .../__pycache__/completion.cpython-311.pyc | Bin 5493 -> 0 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 14922 -> 0 bytes .../__pycache__/debug.cpython-311.pyc | Bin 12030 -> 0 bytes .../__pycache__/download.cpython-311.pyc | Bin 7837 -> 0 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 4167 -> 0 bytes .../commands/__pycache__/hash.cpython-311.pyc | Bin 3383 -> 0 bytes .../commands/__pycache__/help.cpython-311.pyc | Bin 1995 -> 0 bytes .../__pycache__/index.cpython-311.pyc | Bin 7818 -> 0 bytes .../__pycache__/inspect.cpython-311.pyc | Bin 4471 -> 0 bytes .../__pycache__/install.cpython-311.pyc | Bin 35400 -> 0 bytes .../commands/__pycache__/list.cpython-311.pyc | Bin 17175 -> 0 bytes .../__pycache__/search.cpython-311.pyc | Bin 8977 -> 0 bytes .../commands/__pycache__/show.cpython-311.pyc | Bin 11320 -> 0 bytes .../__pycache__/uninstall.cpython-311.pyc | Bin 5171 -> 0 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 9977 -> 0 bytes .../pip/_internal/commands/cache.py | 223 - .../pip/_internal/commands/check.py | 53 - .../pip/_internal/commands/completion.py | 126 - .../pip/_internal/commands/configuration.py | 282 - .../pip/_internal/commands/debug.py | 199 - .../pip/_internal/commands/download.py | 149 - .../pip/_internal/commands/freeze.py | 97 - .../pip/_internal/commands/hash.py | 59 - .../pip/_internal/commands/help.py | 41 - .../pip/_internal/commands/index.py | 139 - .../pip/_internal/commands/inspect.py | 92 - .../pip/_internal/commands/install.py | 873 -- .../pip/_internal/commands/list.py | 365 - .../pip/_internal/commands/search.py | 174 - .../pip/_internal/commands/show.py | 189 - .../pip/_internal/commands/uninstall.py | 113 - .../pip/_internal/commands/wheel.py | 203 - .../pip/_internal/configuration.py | 374 - .../pip/_internal/distributions/__init__.py | 21 - .../__pycache__/__init__.cpython-311.pyc | Bin 1063 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 2435 -> 0 bytes .../__pycache__/installed.cpython-311.pyc | Bin 1572 -> 0 bytes .../__pycache__/sdist.cpython-311.pyc | Bin 8974 -> 0 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 2166 -> 0 bytes .../pip/_internal/distributions/base.py | 39 - .../pip/_internal/distributions/installed.py | 23 - .../pip/_internal/distributions/sdist.py | 150 - .../pip/_internal/distributions/wheel.py | 34 - .../site-packages/pip/_internal/exceptions.py | 747 -- .../pip/_internal/index/__init__.py | 2 - .../__pycache__/__init__.cpython-311.pyc | Bin 267 -> 0 bytes .../__pycache__/collector.cpython-311.pyc | Bin 24573 -> 0 bytes .../package_finder.cpython-311.pyc | Bin 44245 -> 0 bytes .../index/__pycache__/sources.cpython-311.pyc | Bin 11049 -> 0 bytes .../pip/_internal/index/collector.py | 505 - .../pip/_internal/index/package_finder.py | 1029 -- .../pip/_internal/index/sources.py | 224 - .../pip/_internal/locations/__init__.py | 467 - .../__pycache__/__init__.cpython-311.pyc | Bin 18205 -> 0 bytes .../__pycache__/_distutils.cpython-311.pyc | Bin 7614 -> 0 bytes .../__pycache__/_sysconfig.cpython-311.pyc | Bin 8909 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 4030 -> 0 bytes .../pip/_internal/locations/_distutils.py | 173 - .../pip/_internal/locations/_sysconfig.py | 213 - .../pip/_internal/locations/base.py | 81 - .../site-packages/pip/_internal/main.py | 12 - .../pip/_internal/metadata/__init__.py | 127 - .../__pycache__/__init__.cpython-311.pyc | Bin 6438 -> 0 bytes .../__pycache__/_json.cpython-311.pyc | Bin 3592 -> 0 bytes .../metadata/__pycache__/base.cpython-311.pyc | Bin 38037 -> 0 bytes .../__pycache__/pkg_resources.cpython-311.pyc | Bin 16885 -> 0 bytes .../pip/_internal/metadata/_json.py | 84 - .../pip/_internal/metadata/base.py | 688 -- .../_internal/metadata/importlib/__init__.py | 4 - .../__pycache__/__init__.cpython-311.pyc | Bin 384 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 3591 -> 0 bytes .../__pycache__/_dists.cpython-311.pyc | Bin 14607 -> 0 bytes .../__pycache__/_envs.cpython-311.pyc | Bin 12445 -> 0 bytes .../_internal/metadata/importlib/_compat.py | 55 - .../_internal/metadata/importlib/_dists.py | 224 - .../pip/_internal/metadata/importlib/_envs.py | 188 - .../pip/_internal/metadata/pkg_resources.py | 270 - .../pip/_internal/models/__init__.py | 2 - .../__pycache__/__init__.cpython-311.pyc | Bin 301 -> 0 bytes .../__pycache__/candidate.cpython-311.pyc | Bin 2120 -> 0 bytes .../__pycache__/direct_url.cpython-311.pyc | Bin 12283 -> 0 bytes .../format_control.cpython-311.pyc | Bin 4684 -> 0 bytes .../models/__pycache__/index.cpython-311.pyc | Bin 1926 -> 0 bytes .../installation_report.cpython-311.pyc | Bin 2640 -> 0 bytes .../models/__pycache__/link.cpython-311.pyc | Bin 26472 -> 0 bytes .../models/__pycache__/scheme.cpython-311.pyc | Bin 1292 -> 0 bytes .../__pycache__/search_scope.cpython-311.pyc | Bin 5855 -> 0 bytes .../selection_prefs.cpython-311.pyc | Bin 2023 -> 0 bytes .../__pycache__/target_python.cpython-311.pyc | Bin 4785 -> 0 bytes .../models/__pycache__/wheel.cpython-311.pyc | Bin 6448 -> 0 bytes .../pip/_internal/models/candidate.py | 34 - .../pip/_internal/models/direct_url.py | 228 - .../pip/_internal/models/format_control.py | 80 - .../pip/_internal/models/index.py | 28 - .../_internal/models/installation_report.py | 53 - .../pip/_internal/models/link.py | 524 - .../pip/_internal/models/scheme.py | 31 - .../pip/_internal/models/search_scope.py | 133 - .../pip/_internal/models/selection_prefs.py | 51 - .../pip/_internal/models/target_python.py | 110 - .../pip/_internal/models/wheel.py | 92 - .../pip/_internal/network/__init__.py | 2 - .../__pycache__/__init__.cpython-311.pyc | Bin 289 -> 0 bytes .../network/__pycache__/auth.cpython-311.pyc | Bin 19093 -> 0 bytes .../network/__pycache__/cache.cpython-311.pyc | Bin 5212 -> 0 bytes .../__pycache__/download.cpython-311.pyc | Bin 9604 -> 0 bytes .../__pycache__/lazy_wheel.cpython-311.pyc | Bin 13050 -> 0 bytes .../__pycache__/session.cpython-311.pyc | Bin 21317 -> 0 bytes .../network/__pycache__/utils.cpython-311.pyc | Bin 2438 -> 0 bytes .../__pycache__/xmlrpc.cpython-311.pyc | Bin 3217 -> 0 bytes .../pip/_internal/network/auth.py | 446 - .../pip/_internal/network/cache.py | 69 - .../pip/_internal/network/download.py | 186 - .../pip/_internal/network/lazy_wheel.py | 210 - .../pip/_internal/network/session.py | 518 - .../pip/_internal/network/utils.py | 96 - .../pip/_internal/network/xmlrpc.py | 60 - .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 227 -> 0 bytes .../__pycache__/check.cpython-311.pyc | Bin 6660 -> 0 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 11623 -> 0 bytes .../__pycache__/prepare.cpython-311.pyc | Bin 26407 -> 0 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 233 -> 0 bytes .../__pycache__/build_tracker.cpython-311.pyc | Bin 8156 -> 0 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 2304 -> 0 bytes .../metadata_editable.cpython-311.pyc | Bin 2340 -> 0 bytes .../metadata_legacy.cpython-311.pyc | Bin 3740 -> 0 bytes .../build/__pycache__/wheel.cpython-311.pyc | Bin 1970 -> 0 bytes .../wheel_editable.cpython-311.pyc | Bin 2414 -> 0 bytes .../__pycache__/wheel_legacy.cpython-311.pyc | Bin 4521 -> 0 bytes .../operations/build/build_tracker.py | 124 - .../_internal/operations/build/metadata.py | 39 - .../operations/build/metadata_editable.py | 41 - .../operations/build/metadata_legacy.py | 74 - .../pip/_internal/operations/build/wheel.py | 37 - .../operations/build/wheel_editable.py | 46 - .../operations/build/wheel_legacy.py | 102 - .../pip/_internal/operations/check.py | 149 - .../pip/_internal/operations/freeze.py | 254 - .../_internal/operations/install/__init__.py | 2 - .../__pycache__/__init__.cpython-311.pyc | Bin 301 -> 0 bytes .../editable_legacy.cpython-311.pyc | Bin 2297 -> 0 bytes .../__pycache__/legacy.cpython-311.pyc | Bin 6137 -> 0 bytes .../install/__pycache__/wheel.cpython-311.pyc | Bin 40023 -> 0 bytes .../operations/install/editable_legacy.py | 47 - .../_internal/operations/install/legacy.py | 120 - .../pip/_internal/operations/install/wheel.py | 738 -- .../pip/_internal/operations/prepare.py | 667 -- .../site-packages/pip/_internal/pyproject.py | 174 - .../pip/_internal/req/__init__.py | 94 - .../req/__pycache__/__init__.cpython-311.pyc | Bin 4473 -> 0 bytes .../__pycache__/constructors.cpython-311.pyc | Bin 20732 -> 0 bytes .../req/__pycache__/req_file.cpython-311.pyc | Bin 22461 -> 0 bytes .../__pycache__/req_install.cpython-311.pyc | Bin 40373 -> 0 bytes .../req/__pycache__/req_set.cpython-311.pyc | Bin 6029 -> 0 bytes .../__pycache__/req_uninstall.cpython-311.pyc | Bin 37027 -> 0 bytes .../pip/_internal/req/constructors.py | 501 - .../pip/_internal/req/req_file.py | 544 -- .../pip/_internal/req/req_install.py | 946 -- .../pip/_internal/req/req_set.py | 82 - .../pip/_internal/req/req_uninstall.py | 640 -- .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 227 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 1398 -> 0 bytes .../pip/_internal/resolution/base.py | 20 - .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 234 -> 0 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 23820 -> 0 bytes .../_internal/resolution/legacy/resolver.py | 600 -- .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 238 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 9651 -> 0 bytes .../__pycache__/candidates.cpython-311.pyc | Bin 28861 -> 0 bytes .../__pycache__/factory.cpython-311.pyc | Bin 32005 -> 0 bytes .../found_candidates.cpython-311.pyc | Bin 6786 -> 0 bytes .../__pycache__/provider.cpython-311.pyc | Bin 11080 -> 0 bytes .../__pycache__/reporter.cpython-311.pyc | Bin 4683 -> 0 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 11148 -> 0 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 12335 -> 0 bytes .../_internal/resolution/resolvelib/base.py | 141 - .../resolution/resolvelib/candidates.py | 556 -- .../resolution/resolvelib/factory.py | 731 -- .../resolution/resolvelib/found_candidates.py | 155 - .../resolution/resolvelib/provider.py | 248 - .../resolution/resolvelib/reporter.py | 68 - .../resolution/resolvelib/requirements.py | 166 - .../resolution/resolvelib/resolver.py | 296 - .../pip/_internal/self_outdated_check.py | 242 - .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 222 -> 0 bytes .../utils/__pycache__/_log.cpython-311.pyc | Bin 2043 -> 0 bytes .../utils/__pycache__/appdirs.cpython-311.pyc | Bin 2581 -> 0 bytes .../utils/__pycache__/compat.cpython-311.pyc | Bin 2289 -> 0 bytes .../compatibility_tags.cpython-311.pyc | Bin 6781 -> 0 bytes .../__pycache__/datetime.cpython-311.pyc | Bin 739 -> 0 bytes .../__pycache__/deprecation.cpython-311.pyc | Bin 7112 -> 0 bytes .../direct_url_helpers.cpython-311.pyc | Bin 3745 -> 0 bytes .../distutils_args.cpython-311.pyc | Bin 1489 -> 0 bytes .../__pycache__/egg_link.cpython-311.pyc | Bin 3260 -> 0 bytes .../__pycache__/encoding.cpython-311.pyc | Bin 2345 -> 0 bytes .../__pycache__/entrypoints.cpython-311.pyc | Bin 4267 -> 0 bytes .../__pycache__/filesystem.cpython-311.pyc | Bin 8252 -> 0 bytes .../__pycache__/filetypes.cpython-311.pyc | Bin 1338 -> 0 bytes .../utils/__pycache__/glibc.cpython-311.pyc | Bin 2581 -> 0 bytes .../utils/__pycache__/hashes.cpython-311.pyc | Bin 8359 -> 0 bytes .../inject_securetransport.cpython-311.pyc | Bin 1356 -> 0 bytes .../utils/__pycache__/logging.cpython-311.pyc | Bin 15481 -> 0 bytes .../utils/__pycache__/misc.cpython-311.pyc | Bin 36752 -> 0 bytes .../utils/__pycache__/models.cpython-311.pyc | Bin 2962 -> 0 bytes .../__pycache__/packaging.cpython-311.pyc | Bin 2829 -> 0 bytes .../setuptools_build.cpython-311.pyc | Bin 6126 -> 0 bytes .../__pycache__/subprocess.cpython-311.pyc | Bin 9916 -> 0 bytes .../__pycache__/temp_dir.cpython-311.pyc | Bin 11443 -> 0 bytes .../__pycache__/unpacking.cpython-311.pyc | Bin 12918 -> 0 bytes .../utils/__pycache__/urls.cpython-311.pyc | Bin 2715 -> 0 bytes .../__pycache__/virtualenv.cpython-311.pyc | Bin 4962 -> 0 bytes .../utils/__pycache__/wheel.cpython-311.pyc | Bin 7132 -> 0 bytes .../site-packages/pip/_internal/utils/_log.py | 38 - .../pip/_internal/utils/appdirs.py | 52 - .../pip/_internal/utils/compat.py | 63 - .../pip/_internal/utils/compatibility_tags.py | 165 - .../pip/_internal/utils/datetime.py | 11 - .../pip/_internal/utils/deprecation.py | 188 - .../pip/_internal/utils/direct_url_helpers.py | 87 - .../pip/_internal/utils/distutils_args.py | 43 - .../pip/_internal/utils/egg_link.py | 72 - .../pip/_internal/utils/encoding.py | 36 - .../pip/_internal/utils/entrypoints.py | 84 - .../pip/_internal/utils/filesystem.py | 153 - .../pip/_internal/utils/filetypes.py | 27 - .../pip/_internal/utils/glibc.py | 88 - .../pip/_internal/utils/hashes.py | 144 - .../_internal/utils/inject_securetransport.py | 35 - .../pip/_internal/utils/logging.py | 348 - .../site-packages/pip/_internal/utils/misc.py | 739 -- .../pip/_internal/utils/models.py | 39 - .../pip/_internal/utils/packaging.py | 57 - .../pip/_internal/utils/setuptools_build.py | 195 - .../pip/_internal/utils/subprocess.py | 260 - .../pip/_internal/utils/temp_dir.py | 246 - .../pip/_internal/utils/unpacking.py | 257 - .../site-packages/pip/_internal/utils/urls.py | 62 - .../pip/_internal/utils/virtualenv.py | 104 - .../pip/_internal/utils/wheel.py | 136 - .../pip/_internal/vcs/__init__.py | 15 - .../vcs/__pycache__/__init__.cpython-311.pyc | Bin 657 -> 0 bytes .../vcs/__pycache__/bazaar.cpython-311.pyc | Bin 5882 -> 0 bytes .../vcs/__pycache__/git.cpython-311.pyc | Bin 21546 -> 0 bytes .../vcs/__pycache__/mercurial.cpython-311.pyc | Bin 8728 -> 0 bytes .../__pycache__/subversion.cpython-311.pyc | Bin 14625 -> 0 bytes .../versioncontrol.cpython-311.pyc | Bin 31894 -> 0 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 - .../site-packages/pip/_internal/vcs/git.py | 526 - .../pip/_internal/vcs/mercurial.py | 163 - .../pip/_internal/vcs/subversion.py | 324 - .../pip/_internal/vcs/versioncontrol.py | 705 -- .../pip/_internal/wheel_builder.py | 382 - .../site-packages/pip/_vendor/__init__.py | 120 - .../__pycache__/__init__.cpython-311.pyc | Bin 5635 -> 0 bytes .../_vendor/__pycache__/six.cpython-311.pyc | Bin 46437 -> 0 bytes .../typing_extensions.cpython-311.pyc | Bin 97467 -> 0 bytes .../pip/_vendor/cachecontrol/__init__.py | 18 - .../__pycache__/__init__.cpython-311.pyc | Bin 864 -> 0 bytes .../__pycache__/_cmd.cpython-311.pyc | Bin 2719 -> 0 bytes .../__pycache__/adapter.cpython-311.pyc | Bin 5526 -> 0 bytes .../__pycache__/cache.cpython-311.pyc | Bin 3800 -> 0 bytes .../__pycache__/compat.cpython-311.pyc | Bin 1157 -> 0 bytes .../__pycache__/controller.cpython-311.pyc | Bin 16472 -> 0 bytes .../__pycache__/filewrapper.cpython-311.pyc | Bin 4259 -> 0 bytes .../__pycache__/heuristics.cpython-311.pyc | Bin 6704 -> 0 bytes .../__pycache__/serialize.cpython-311.pyc | Bin 8419 -> 0 bytes .../__pycache__/wrapper.cpython-311.pyc | Bin 985 -> 0 bytes .../pip/_vendor/cachecontrol/_cmd.py | 61 - .../pip/_vendor/cachecontrol/adapter.py | 137 - .../pip/_vendor/cachecontrol/cache.py | 65 - .../_vendor/cachecontrol/caches/__init__.py | 9 - .../__pycache__/__init__.cpython-311.pyc | Bin 439 -> 0 bytes .../__pycache__/file_cache.cpython-311.pyc | Bin 8422 -> 0 bytes .../__pycache__/redis_cache.cpython-311.pyc | Bin 2519 -> 0 bytes .../_vendor/cachecontrol/caches/file_cache.py | 188 - .../cachecontrol/caches/redis_cache.py | 39 - .../pip/_vendor/cachecontrol/compat.py | 32 - .../pip/_vendor/cachecontrol/controller.py | 439 - .../pip/_vendor/cachecontrol/filewrapper.py | 111 - .../pip/_vendor/cachecontrol/heuristics.py | 139 - .../pip/_vendor/cachecontrol/serialize.py | 190 - .../pip/_vendor/cachecontrol/wrapper.py | 33 - .../pip/_vendor/certifi/__init__.py | 4 - .../pip/_vendor/certifi/__main__.py | 12 - .../__pycache__/__init__.cpython-311.pyc | Bin 364 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 765 -> 0 bytes .../certifi/__pycache__/core.cpython-311.pyc | Bin 3387 -> 0 bytes .../pip/_vendor/certifi/cacert.pem | 4527 --------- .../site-packages/pip/_vendor/certifi/core.py | 108 - .../pip/_vendor/chardet/__init__.py | 115 - .../__pycache__/__init__.cpython-311.pyc | Bin 5096 -> 0 bytes .../__pycache__/big5freq.cpython-311.pyc | Bin 27226 -> 0 bytes .../__pycache__/big5prober.cpython-311.pyc | Bin 1701 -> 0 bytes .../chardistribution.cpython-311.pyc | Bin 11293 -> 0 bytes .../charsetgroupprober.cpython-311.pyc | Bin 4323 -> 0 bytes .../__pycache__/charsetprober.cpython-311.pyc | Bin 5569 -> 0 bytes .../codingstatemachine.cpython-311.pyc | Bin 4020 -> 0 bytes .../codingstatemachinedict.cpython-311.pyc | Bin 976 -> 0 bytes .../__pycache__/cp949prober.cpython-311.pyc | Bin 1710 -> 0 bytes .../chardet/__pycache__/enums.cpython-311.pyc | Bin 3411 -> 0 bytes .../__pycache__/escprober.cpython-311.pyc | Bin 4927 -> 0 bytes .../chardet/__pycache__/escsm.cpython-311.pyc | Bin 12666 -> 0 bytes .../__pycache__/eucjpprober.cpython-311.pyc | Bin 4753 -> 0 bytes .../__pycache__/euckrfreq.cpython-311.pyc | Bin 12109 -> 0 bytes .../__pycache__/euckrprober.cpython-311.pyc | Bin 1702 -> 0 bytes .../__pycache__/euctwfreq.cpython-311.pyc | Bin 27231 -> 0 bytes .../__pycache__/euctwprober.cpython-311.pyc | Bin 1702 -> 0 bytes .../__pycache__/gb2312freq.cpython-311.pyc | Bin 19153 -> 0 bytes .../__pycache__/gb2312prober.cpython-311.pyc | Bin 1717 -> 0 bytes .../__pycache__/hebrewprober.cpython-311.pyc | Bin 5706 -> 0 bytes .../__pycache__/jisfreq.cpython-311.pyc | Bin 22182 -> 0 bytes .../__pycache__/johabfreq.cpython-311.pyc | Bin 84686 -> 0 bytes .../__pycache__/johabprober.cpython-311.pyc | Bin 1708 -> 0 bytes .../__pycache__/jpcntx.cpython-311.pyc | Bin 40190 -> 0 bytes .../langbulgarianmodel.cpython-311.pyc | Bin 85860 -> 0 bytes .../langgreekmodel.cpython-311.pyc | Bin 79282 -> 0 bytes .../langhebrewmodel.cpython-311.pyc | Bin 80044 -> 0 bytes .../langhungarianmodel.cpython-311.pyc | Bin 85814 -> 0 bytes .../langrussianmodel.cpython-311.pyc | Bin 108761 -> 0 bytes .../__pycache__/langthaimodel.cpython-311.pyc | Bin 80222 -> 0 bytes .../langturkishmodel.cpython-311.pyc | Bin 80061 -> 0 bytes .../__pycache__/latin1prober.cpython-311.pyc | Bin 7357 -> 0 bytes .../macromanprober.cpython-311.pyc | Bin 7524 -> 0 bytes .../mbcharsetprober.cpython-311.pyc | Bin 4145 -> 0 bytes .../mbcsgroupprober.cpython-311.pyc | Bin 2015 -> 0 bytes .../__pycache__/mbcssm.cpython-311.pyc | Bin 31755 -> 0 bytes .../__pycache__/resultdict.cpython-311.pyc | Bin 794 -> 0 bytes .../sbcharsetprober.cpython-311.pyc | Bin 6420 -> 0 bytes .../sbcsgroupprober.cpython-311.pyc | Bin 2965 -> 0 bytes .../__pycache__/sjisprober.cpython-311.pyc | Bin 4858 -> 0 bytes .../universaldetector.cpython-311.pyc | Bin 12486 -> 0 bytes .../__pycache__/utf1632prober.cpython-311.pyc | Bin 10606 -> 0 bytes .../__pycache__/utf8prober.cpython-311.pyc | Bin 3493 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 529 -> 0 bytes .../pip/_vendor/chardet/big5freq.py | 386 - .../pip/_vendor/chardet/big5prober.py | 47 - .../pip/_vendor/chardet/chardistribution.py | 261 - .../pip/_vendor/chardet/charsetgroupprober.py | 106 - .../pip/_vendor/chardet/charsetprober.py | 147 - .../pip/_vendor/chardet/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-311.pyc | Bin 226 -> 0 bytes .../__pycache__/chardetect.cpython-311.pyc | Bin 4365 -> 0 bytes .../pip/_vendor/chardet/cli/chardetect.py | 112 - .../pip/_vendor/chardet/codingstatemachine.py | 90 - .../_vendor/chardet/codingstatemachinedict.py | 19 - .../pip/_vendor/chardet/cp949prober.py | 49 - .../pip/_vendor/chardet/enums.py | 85 - .../pip/_vendor/chardet/escprober.py | 102 - .../pip/_vendor/chardet/escsm.py | 261 - .../pip/_vendor/chardet/eucjpprober.py | 102 - .../pip/_vendor/chardet/euckrfreq.py | 196 - .../pip/_vendor/chardet/euckrprober.py | 47 - .../pip/_vendor/chardet/euctwfreq.py | 388 - .../pip/_vendor/chardet/euctwprober.py | 47 - .../pip/_vendor/chardet/gb2312freq.py | 284 - .../pip/_vendor/chardet/gb2312prober.py | 47 - .../pip/_vendor/chardet/hebrewprober.py | 316 - .../pip/_vendor/chardet/jisfreq.py | 325 - .../pip/_vendor/chardet/johabfreq.py | 2382 ----- .../pip/_vendor/chardet/johabprober.py | 47 - .../pip/_vendor/chardet/jpcntx.py | 238 - .../pip/_vendor/chardet/langbulgarianmodel.py | 4649 --------- .../pip/_vendor/chardet/langgreekmodel.py | 4397 --------- .../pip/_vendor/chardet/langhebrewmodel.py | 4380 --------- .../pip/_vendor/chardet/langhungarianmodel.py | 4649 --------- .../pip/_vendor/chardet/langrussianmodel.py | 5725 ----------- .../pip/_vendor/chardet/langthaimodel.py | 4380 --------- .../pip/_vendor/chardet/langturkishmodel.py | 4380 --------- .../pip/_vendor/chardet/latin1prober.py | 147 - .../pip/_vendor/chardet/macromanprober.py | 162 - .../pip/_vendor/chardet/mbcharsetprober.py | 95 - .../pip/_vendor/chardet/mbcsgroupprober.py | 57 - .../pip/_vendor/chardet/mbcssm.py | 661 -- .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 231 -> 0 bytes .../__pycache__/languages.cpython-311.pyc | Bin 10831 -> 0 bytes .../pip/_vendor/chardet/metadata/languages.py | 352 - .../pip/_vendor/chardet/resultdict.py | 16 - .../pip/_vendor/chardet/sbcharsetprober.py | 162 - .../pip/_vendor/chardet/sbcsgroupprober.py | 88 - .../pip/_vendor/chardet/sjisprober.py | 105 - .../pip/_vendor/chardet/universaldetector.py | 362 - .../pip/_vendor/chardet/utf1632prober.py | 225 - .../pip/_vendor/chardet/utf8prober.py | 82 - .../pip/_vendor/chardet/version.py | 9 - .../pip/_vendor/colorama/__init__.py | 7 - .../__pycache__/__init__.cpython-311.pyc | Bin 598 -> 0 bytes .../colorama/__pycache__/ansi.cpython-311.pyc | Bin 4596 -> 0 bytes .../__pycache__/ansitowin32.cpython-311.pyc | Bin 16242 -> 0 bytes .../__pycache__/initialise.cpython-311.pyc | Bin 3959 -> 0 bytes .../__pycache__/win32.cpython-311.pyc | Bin 7947 -> 0 bytes .../__pycache__/winterm.cpython-311.pyc | Bin 9173 -> 0 bytes .../pip/_vendor/colorama/ansi.py | 102 - .../pip/_vendor/colorama/ansitowin32.py | 277 - .../pip/_vendor/colorama/initialise.py | 121 - .../pip/_vendor/colorama/tests/__init__.py | 1 - .../__pycache__/__init__.cpython-311.pyc | Bin 229 -> 0 bytes .../__pycache__/ansi_test.cpython-311.pyc | Bin 5874 -> 0 bytes .../ansitowin32_test.cpython-311.pyc | Bin 21541 -> 0 bytes .../initialise_test.cpython-311.pyc | Bin 14168 -> 0 bytes .../__pycache__/isatty_test.cpython-311.pyc | Bin 6733 -> 0 bytes .../tests/__pycache__/utils.cpython-311.pyc | Bin 2908 -> 0 bytes .../__pycache__/winterm_test.cpython-311.pyc | Bin 7261 -> 0 bytes .../pip/_vendor/colorama/tests/ansi_test.py | 76 - .../colorama/tests/ansitowin32_test.py | 294 - .../_vendor/colorama/tests/initialise_test.py | 189 - .../pip/_vendor/colorama/tests/isatty_test.py | 57 - .../pip/_vendor/colorama/tests/utils.py | 49 - .../_vendor/colorama/tests/winterm_test.py | 131 - .../pip/_vendor/colorama/win32.py | 180 - .../pip/_vendor/colorama/winterm.py | 195 - .../pip/_vendor/distlib/__init__.py | 23 - .../__pycache__/__init__.cpython-311.pyc | Bin 1467 -> 0 bytes .../__pycache__/compat.cpython-311.pyc | Bin 52333 -> 0 bytes .../__pycache__/database.cpython-311.pyc | Bin 72121 -> 0 bytes .../distlib/__pycache__/index.cpython-311.pyc | Bin 26710 -> 0 bytes .../__pycache__/locators.cpython-311.pyc | Bin 65886 -> 0 bytes .../__pycache__/manifest.cpython-311.pyc | Bin 17053 -> 0 bytes .../__pycache__/markers.cpython-311.pyc | Bin 8189 -> 0 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 47137 -> 0 bytes .../__pycache__/resources.cpython-311.pyc | Bin 19016 -> 0 bytes .../__pycache__/scripts.cpython-311.pyc | Bin 21292 -> 0 bytes .../distlib/__pycache__/util.cpython-311.pyc | Bin 97471 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 34598 -> 0 bytes .../distlib/__pycache__/wheel.cpython-311.pyc | Bin 60402 -> 0 bytes .../pip/_vendor/distlib/compat.py | 1116 --- .../pip/_vendor/distlib/database.py | 1350 --- .../pip/_vendor/distlib/index.py | 508 - .../pip/_vendor/distlib/locators.py | 1300 --- .../pip/_vendor/distlib/manifest.py | 393 - .../pip/_vendor/distlib/markers.py | 152 - .../pip/_vendor/distlib/metadata.py | 1076 --- .../pip/_vendor/distlib/resources.py | 358 - .../pip/_vendor/distlib/scripts.py | 437 - .../site-packages/pip/_vendor/distlib/t32.exe | Bin 97792 -> 0 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 182784 -> 0 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 108032 -> 0 bytes .../site-packages/pip/_vendor/distlib/util.py | 1932 ---- .../pip/_vendor/distlib/version.py | 739 -- .../site-packages/pip/_vendor/distlib/w32.exe | Bin 91648 -> 0 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 168448 -> 0 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 101888 -> 0 bytes .../pip/_vendor/distlib/wheel.py | 1082 --- .../pip/_vendor/distro/__init__.py | 54 - .../pip/_vendor/distro/__main__.py | 4 - .../__pycache__/__init__.cpython-311.pyc | Bin 1220 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 354 -> 0 bytes .../distro/__pycache__/distro.cpython-311.pyc | Bin 57753 -> 0 bytes .../pip/_vendor/distro/distro.py | 1399 --- .../pip/_vendor/idna/__init__.py | 44 - .../idna/__pycache__/__init__.cpython-311.pyc | Bin 1121 -> 0 bytes .../idna/__pycache__/codec.cpython-311.pyc | Bin 5412 -> 0 bytes .../idna/__pycache__/compat.cpython-311.pyc | Bin 1038 -> 0 bytes .../idna/__pycache__/core.cpython-311.pyc | Bin 19473 -> 0 bytes .../idna/__pycache__/idnadata.cpython-311.pyc | Bin 38997 -> 0 bytes .../__pycache__/intranges.cpython-311.pyc | Bin 3006 -> 0 bytes .../__pycache__/package_data.cpython-311.pyc | Bin 241 -> 0 bytes .../__pycache__/uts46data.cpython-311.pyc | Bin 163221 -> 0 bytes .../site-packages/pip/_vendor/idna/codec.py | 112 - .../site-packages/pip/_vendor/idna/compat.py | 13 - .../site-packages/pip/_vendor/idna/core.py | 400 - .../pip/_vendor/idna/idnadata.py | 2151 ----- .../pip/_vendor/idna/intranges.py | 54 - .../pip/_vendor/idna/package_data.py | 2 - .../pip/_vendor/idna/uts46data.py | 8600 ----------------- .../pip/_vendor/msgpack/__init__.py | 57 - .../__pycache__/__init__.cpython-311.pyc | Bin 2100 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 2401 -> 0 bytes .../msgpack/__pycache__/ext.cpython-311.pyc | Bin 9187 -> 0 bytes .../__pycache__/fallback.cpython-311.pyc | Bin 47214 -> 0 bytes .../pip/_vendor/msgpack/exceptions.py | 48 - .../site-packages/pip/_vendor/msgpack/ext.py | 193 - .../pip/_vendor/msgpack/fallback.py | 1010 -- .../pip/_vendor/packaging/__about__.py | 26 - .../pip/_vendor/packaging/__init__.py | 25 - .../__pycache__/__about__.cpython-311.pyc | Bin 665 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 586 -> 0 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 13252 -> 0 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 8020 -> 0 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 3708 -> 0 bytes .../__pycache__/markers.cpython-311.pyc | Bin 16548 -> 0 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 7663 -> 0 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 34386 -> 0 bytes .../__pycache__/tags.cpython-311.pyc | Bin 21371 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 6706 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 21898 -> 0 bytes .../pip/_vendor/packaging/_manylinux.py | 301 - .../pip/_vendor/packaging/_musllinux.py | 136 - .../pip/_vendor/packaging/_structures.py | 61 - .../pip/_vendor/packaging/markers.py | 304 - .../pip/_vendor/packaging/requirements.py | 146 - .../pip/_vendor/packaging/specifiers.py | 802 -- .../pip/_vendor/packaging/tags.py | 487 - .../pip/_vendor/packaging/utils.py | 136 - .../pip/_vendor/packaging/version.py | 504 - .../pip/_vendor/pkg_resources/__init__.py | 3296 ------- .../__pycache__/__init__.cpython-311.pyc | Bin 158254 -> 0 bytes .../__pycache__/py31compat.cpython-311.pyc | Bin 1007 -> 0 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 - .../pip/_vendor/platformdirs/__init__.py | 342 - .../pip/_vendor/platformdirs/__main__.py | 46 - .../__pycache__/__init__.cpython-311.pyc | Bin 12953 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 2150 -> 0 bytes .../__pycache__/android.cpython-311.pyc | Bin 6380 -> 0 bytes .../__pycache__/api.cpython-311.pyc | Bin 7207 -> 0 bytes .../__pycache__/macos.cpython-311.pyc | Bin 4617 -> 0 bytes .../__pycache__/unix.cpython-311.pyc | Bin 11049 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 336 -> 0 bytes .../__pycache__/windows.cpython-311.pyc | Bin 9985 -> 0 bytes .../pip/_vendor/platformdirs/android.py | 120 - .../pip/_vendor/platformdirs/api.py | 156 - .../pip/_vendor/platformdirs/macos.py | 64 - .../pip/_vendor/platformdirs/unix.py | 181 - .../pip/_vendor/platformdirs/version.py | 4 - .../pip/_vendor/platformdirs/windows.py | 184 - .../pip/_vendor/pygments/__init__.py | 82 - .../pip/_vendor/pygments/__main__.py | 17 - .../__pycache__/__init__.cpython-311.pyc | Bin 3868 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 804 -> 0 bytes .../__pycache__/cmdline.cpython-311.pyc | Bin 30315 -> 0 bytes .../__pycache__/console.cpython-311.pyc | Bin 3067 -> 0 bytes .../__pycache__/filter.cpython-311.pyc | Bin 3528 -> 0 bytes .../__pycache__/formatter.cpython-311.pyc | Bin 3894 -> 0 bytes .../__pycache__/lexer.cpython-311.pyc | Bin 40422 -> 0 bytes .../__pycache__/modeline.cpython-311.pyc | Bin 1747 -> 0 bytes .../__pycache__/plugin.cpython-311.pyc | Bin 3760 -> 0 bytes .../__pycache__/regexopt.cpython-311.pyc | Bin 5054 -> 0 bytes .../__pycache__/scanner.cpython-311.pyc | Bin 4909 -> 0 bytes .../__pycache__/sphinxext.cpython-311.pyc | Bin 8340 -> 0 bytes .../__pycache__/style.cpython-311.pyc | Bin 7448 -> 0 bytes .../__pycache__/token.cpython-311.pyc | Bin 7488 -> 0 bytes .../__pycache__/unistring.cpython-311.pyc | Bin 33822 -> 0 bytes .../pygments/__pycache__/util.cpython-311.pyc | Bin 14615 -> 0 bytes .../pip/_vendor/pygments/cmdline.py | 668 -- .../pip/_vendor/pygments/console.py | 70 - .../pip/_vendor/pygments/filter.py | 71 - .../pip/_vendor/pygments/filters/__init__.py | 940 -- .../__pycache__/__init__.cpython-311.pyc | Bin 40128 -> 0 bytes .../pip/_vendor/pygments/formatter.py | 94 - .../_vendor/pygments/formatters/__init__.py | 143 - .../__pycache__/__init__.cpython-311.pyc | Bin 6894 -> 0 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 4176 -> 0 bytes .../__pycache__/bbcode.cpython-311.pyc | Bin 4502 -> 0 bytes .../__pycache__/groff.cpython-311.pyc | Bin 7835 -> 0 bytes .../__pycache__/html.cpython-311.pyc | Bin 42620 -> 0 bytes .../__pycache__/img.cpython-311.pyc | Bin 28592 -> 0 bytes .../__pycache__/irc.cpython-311.pyc | Bin 7695 -> 0 bytes .../__pycache__/latex.cpython-311.pyc | Bin 21828 -> 0 bytes .../__pycache__/other.cpython-311.pyc | Bin 7656 -> 0 bytes .../__pycache__/pangomarkup.cpython-311.pyc | Bin 3200 -> 0 bytes .../__pycache__/rtf.cpython-311.pyc | Bin 6867 -> 0 bytes .../__pycache__/svg.cpython-311.pyc | Bin 9687 -> 0 bytes .../__pycache__/terminal.cpython-311.pyc | Bin 6066 -> 0 bytes .../__pycache__/terminal256.cpython-311.pyc | Bin 16432 -> 0 bytes .../_vendor/pygments/formatters/_mapping.py | 23 - .../pip/_vendor/pygments/formatters/bbcode.py | 108 - .../pip/_vendor/pygments/formatters/groff.py | 170 - .../pip/_vendor/pygments/formatters/html.py | 989 -- .../pip/_vendor/pygments/formatters/img.py | 645 -- .../pip/_vendor/pygments/formatters/irc.py | 179 - .../pip/_vendor/pygments/formatters/latex.py | 521 - .../pip/_vendor/pygments/formatters/other.py | 161 - .../pygments/formatters/pangomarkup.py | 83 - .../pip/_vendor/pygments/formatters/rtf.py | 146 - .../pip/_vendor/pygments/formatters/svg.py | 188 - .../_vendor/pygments/formatters/terminal.py | 127 - .../pygments/formatters/terminal256.py | 338 - .../pip/_vendor/pygments/lexer.py | 882 -- .../pip/_vendor/pygments/lexers/__init__.py | 335 - .../__pycache__/__init__.cpython-311.pyc | Bin 15171 -> 0 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 62802 -> 0 bytes .../lexers/__pycache__/python.cpython-311.pyc | Bin 44003 -> 0 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 541 -- .../pip/_vendor/pygments/lexers/python.py | 1204 --- .../pip/_vendor/pygments/modeline.py | 43 - .../pip/_vendor/pygments/plugin.py | 88 - .../pip/_vendor/pygments/regexopt.py | 91 - .../pip/_vendor/pygments/scanner.py | 104 - .../pip/_vendor/pygments/sphinxext.py | 155 - .../pip/_vendor/pygments/style.py | 197 - .../pip/_vendor/pygments/styles/__init__.py | 97 - .../__pycache__/__init__.cpython-311.pyc | Bin 4481 -> 0 bytes .../pip/_vendor/pygments/token.py | 213 - .../pip/_vendor/pygments/unistring.py | 153 - .../pip/_vendor/pygments/util.py | 308 - .../pip/_vendor/pyparsing/__init__.py | 331 - .../__pycache__/__init__.cpython-311.pyc | Bin 8371 -> 0 bytes .../__pycache__/actions.cpython-311.pyc | Bin 8485 -> 0 bytes .../__pycache__/common.cpython-311.pyc | Bin 14807 -> 0 bytes .../__pycache__/core.cpython-311.pyc | Bin 277693 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 12949 -> 0 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 53650 -> 0 bytes .../__pycache__/results.cpython-311.pyc | Bin 36333 -> 0 bytes .../__pycache__/testing.cpython-311.pyc | Bin 19529 -> 0 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 15387 -> 0 bytes .../__pycache__/util.cpython-311.pyc | Bin 14286 -> 0 bytes .../pip/_vendor/pyparsing/actions.py | 207 - .../pip/_vendor/pyparsing/common.py | 424 - .../pip/_vendor/pyparsing/core.py | 5814 ----------- .../pip/_vendor/pyparsing/diagram/__init__.py | 642 -- .../__pycache__/__init__.cpython-311.pyc | Bin 28052 -> 0 bytes .../pip/_vendor/pyparsing/exceptions.py | 267 - .../pip/_vendor/pyparsing/helpers.py | 1088 --- .../pip/_vendor/pyparsing/results.py | 760 -- .../pip/_vendor/pyparsing/testing.py | 331 - .../pip/_vendor/pyparsing/unicode.py | 352 - .../pip/_vendor/pyparsing/util.py | 235 - .../pip/_vendor/pyproject_hooks/__init__.py | 23 - .../__pycache__/__init__.cpython-311.pyc | Bin 729 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 427 -> 0 bytes .../__pycache__/_impl.cpython-311.pyc | Bin 16693 -> 0 bytes .../pip/_vendor/pyproject_hooks/_compat.py | 8 - .../pip/_vendor/pyproject_hooks/_impl.py | 330 - .../pyproject_hooks/_in_process/__init__.py | 18 - .../__pycache__/__init__.cpython-311.pyc | Bin 1189 -> 0 bytes .../__pycache__/_in_process.cpython-311.pyc | Bin 16511 -> 0 bytes .../_in_process/_in_process.py | 353 - .../pip/_vendor/requests/__init__.py | 182 - .../__pycache__/__init__.cpython-311.pyc | Bin 6473 -> 0 bytes .../__pycache__/__version__.cpython-311.pyc | Bin 610 -> 0 bytes .../_internal_utils.cpython-311.pyc | Bin 2107 -> 0 bytes .../__pycache__/adapters.cpython-311.pyc | Bin 24910 -> 0 bytes .../requests/__pycache__/api.cpython-311.pyc | Bin 7455 -> 0 bytes .../requests/__pycache__/auth.cpython-311.pyc | Bin 14654 -> 0 bytes .../__pycache__/certs.cpython-311.pyc | Bin 1006 -> 0 bytes .../__pycache__/compat.cpython-311.pyc | Bin 1832 -> 0 bytes .../__pycache__/cookies.cpython-311.pyc | Bin 27134 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 8549 -> 0 bytes .../requests/__pycache__/help.cpython-311.pyc | Bin 4544 -> 0 bytes .../__pycache__/hooks.cpython-311.pyc | Bin 1274 -> 0 bytes .../__pycache__/models.cpython-311.pyc | Bin 38805 -> 0 bytes .../__pycache__/packages.cpython-311.pyc | Bin 854 -> 0 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 29643 -> 0 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 6261 -> 0 bytes .../__pycache__/structures.cpython-311.pyc | Bin 6246 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 40160 -> 0 bytes .../pip/_vendor/requests/__version__.py | 14 - .../pip/_vendor/requests/_internal_utils.py | 48 - .../pip/_vendor/requests/adapters.py | 584 -- .../site-packages/pip/_vendor/requests/api.py | 157 - .../pip/_vendor/requests/auth.py | 315 - .../pip/_vendor/requests/certs.py | 24 - .../pip/_vendor/requests/compat.py | 67 - .../pip/_vendor/requests/cookies.py | 561 -- .../pip/_vendor/requests/exceptions.py | 141 - .../pip/_vendor/requests/help.py | 131 - .../pip/_vendor/requests/hooks.py | 33 - .../pip/_vendor/requests/models.py | 1034 -- .../pip/_vendor/requests/packages.py | 16 - .../pip/_vendor/requests/sessions.py | 831 -- .../pip/_vendor/requests/status_codes.py | 128 - .../pip/_vendor/requests/structures.py | 99 - .../pip/_vendor/requests/utils.py | 1086 --- .../pip/_vendor/resolvelib/__init__.py | 26 - .../__pycache__/__init__.cpython-311.pyc | Bin 777 -> 0 bytes .../__pycache__/providers.cpython-311.pyc | Bin 7096 -> 0 bytes .../__pycache__/reporters.cpython-311.pyc | Bin 2826 -> 0 bytes .../__pycache__/resolvers.cpython-311.pyc | Bin 25272 -> 0 bytes .../__pycache__/structs.cpython-311.pyc | Bin 11354 -> 0 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 232 -> 0 bytes .../collections_abc.cpython-311.pyc | Bin 507 -> 0 bytes .../resolvelib/compat/collections_abc.py | 6 - .../pip/_vendor/resolvelib/providers.py | 133 - .../pip/_vendor/resolvelib/reporters.py | 43 - .../pip/_vendor/resolvelib/resolvers.py | 482 - .../pip/_vendor/resolvelib/structs.py | 165 - .../pip/_vendor/rich/__init__.py | 177 - .../pip/_vendor/rich/__main__.py | 274 - .../rich/__pycache__/__init__.cpython-311.pyc | Bin 7520 -> 0 bytes .../rich/__pycache__/__main__.cpython-311.pyc | Bin 11598 -> 0 bytes .../__pycache__/_cell_widths.cpython-311.pyc | Bin 7859 -> 0 bytes .../__pycache__/_emoji_codes.cpython-311.pyc | Bin 208546 -> 0 bytes .../_emoji_replace.cpython-311.pyc | Bin 1958 -> 0 bytes .../_export_format.cpython-311.pyc | Bin 2363 -> 0 bytes .../__pycache__/_extension.cpython-311.pyc | Bin 659 -> 0 bytes .../rich/__pycache__/_inspect.cpython-311.pyc | Bin 14211 -> 0 bytes .../__pycache__/_log_render.cpython-311.pyc | Bin 4793 -> 0 bytes .../rich/__pycache__/_loop.cpython-311.pyc | Bin 2139 -> 0 bytes .../__pycache__/_null_file.cpython-311.pyc | Bin 4704 -> 0 bytes .../__pycache__/_palettes.cpython-311.pyc | Bin 5275 -> 0 bytes .../rich/__pycache__/_pick.cpython-311.pyc | Bin 820 -> 0 bytes .../rich/__pycache__/_ratio.cpython-311.pyc | Bin 7958 -> 0 bytes .../__pycache__/_spinners.cpython-311.pyc | Bin 13708 -> 0 bytes .../rich/__pycache__/_stack.cpython-311.pyc | Bin 1154 -> 0 bytes .../rich/__pycache__/_timer.cpython-311.pyc | Bin 1007 -> 0 bytes .../_win32_console.cpython-311.pyc | Bin 30195 -> 0 bytes .../rich/__pycache__/_windows.cpython-311.pyc | Bin 2854 -> 0 bytes .../_windows_renderer.cpython-311.pyc | Bin 4045 -> 0 bytes .../rich/__pycache__/_wrap.cpython-311.pyc | Bin 2810 -> 0 bytes .../rich/__pycache__/abc.cpython-311.pyc | Bin 1951 -> 0 bytes .../rich/__pycache__/align.cpython-311.pyc | Bin 13500 -> 0 bytes .../rich/__pycache__/ansi.cpython-311.pyc | Bin 10476 -> 0 bytes .../rich/__pycache__/bar.cpython-311.pyc | Bin 4573 -> 0 bytes .../rich/__pycache__/box.cpython-311.pyc | Bin 13015 -> 0 bytes .../rich/__pycache__/cells.cpython-311.pyc | Bin 6465 -> 0 bytes .../rich/__pycache__/color.cpython-311.pyc | Bin 27596 -> 0 bytes .../__pycache__/color_triplet.cpython-311.pyc | Bin 1899 -> 0 bytes .../rich/__pycache__/columns.cpython-311.pyc | Bin 10670 -> 0 bytes .../rich/__pycache__/console.cpython-311.pyc | Bin 123186 -> 0 bytes .../__pycache__/constrain.cpython-311.pyc | Bin 2491 -> 0 bytes .../__pycache__/containers.cpython-311.pyc | Bin 10832 -> 0 bytes .../rich/__pycache__/control.cpython-311.pyc | Bin 11923 -> 0 bytes .../default_styles.cpython-311.pyc | Bin 12523 -> 0 bytes .../rich/__pycache__/diagnose.cpython-311.pyc | Bin 1846 -> 0 bytes .../rich/__pycache__/emoji.cpython-311.pyc | Bin 4824 -> 0 bytes .../rich/__pycache__/errors.cpython-311.pyc | Bin 2355 -> 0 bytes .../__pycache__/file_proxy.cpython-311.pyc | Bin 3803 -> 0 bytes .../rich/__pycache__/filesize.cpython-311.pyc | Bin 3327 -> 0 bytes .../__pycache__/highlighter.cpython-311.pyc | Bin 11014 -> 0 bytes .../rich/__pycache__/json.cpython-311.pyc | Bin 6707 -> 0 bytes .../rich/__pycache__/jupyter.cpython-311.pyc | Bin 6430 -> 0 bytes .../rich/__pycache__/layout.cpython-311.pyc | Bin 23337 -> 0 bytes .../rich/__pycache__/live.cpython-311.pyc | Bin 21158 -> 0 bytes .../__pycache__/live_render.cpython-311.pyc | Bin 5171 -> 0 bytes .../rich/__pycache__/logging.cpython-311.pyc | Bin 14542 -> 0 bytes .../rich/__pycache__/markup.cpython-311.pyc | Bin 10464 -> 0 bytes .../rich/__pycache__/measure.cpython-311.pyc | Bin 7297 -> 0 bytes .../rich/__pycache__/padding.cpython-311.pyc | Bin 7513 -> 0 bytes .../rich/__pycache__/pager.cpython-311.pyc | Bin 2271 -> 0 bytes .../rich/__pycache__/palette.cpython-311.pyc | Bin 6004 -> 0 bytes .../rich/__pycache__/panel.cpython-311.pyc | Bin 12760 -> 0 bytes .../rich/__pycache__/pretty.cpython-311.pyc | Bin 44853 -> 0 bytes .../rich/__pycache__/progress.cpython-311.pyc | Bin 82732 -> 0 bytes .../__pycache__/progress_bar.cpython-311.pyc | Bin 11038 -> 0 bytes .../rich/__pycache__/prompt.cpython-311.pyc | Bin 16404 -> 0 bytes .../rich/__pycache__/protocol.cpython-311.pyc | Bin 2122 -> 0 bytes .../rich/__pycache__/region.cpython-311.pyc | Bin 685 -> 0 bytes .../rich/__pycache__/repr.cpython-311.pyc | Bin 7684 -> 0 bytes .../rich/__pycache__/rule.cpython-311.pyc | Bin 7723 -> 0 bytes .../rich/__pycache__/scope.cpython-311.pyc | Bin 4377 -> 0 bytes .../rich/__pycache__/screen.cpython-311.pyc | Bin 2800 -> 0 bytes .../rich/__pycache__/segment.cpython-311.pyc | Bin 31567 -> 0 bytes .../rich/__pycache__/spinner.cpython-311.pyc | Bin 6916 -> 0 bytes .../rich/__pycache__/status.cpython-311.pyc | Bin 6784 -> 0 bytes .../rich/__pycache__/style.cpython-311.pyc | Bin 34357 -> 0 bytes .../rich/__pycache__/styled.cpython-311.pyc | Bin 2465 -> 0 bytes .../rich/__pycache__/syntax.cpython-311.pyc | Bin 42559 -> 0 bytes .../rich/__pycache__/table.cpython-311.pyc | Bin 48826 -> 0 bytes .../terminal_theme.cpython-311.pyc | Bin 3731 -> 0 bytes .../rich/__pycache__/text.cpython-311.pyc | Bin 65242 -> 0 bytes .../rich/__pycache__/theme.cpython-311.pyc | Bin 7169 -> 0 bytes .../rich/__pycache__/themes.cpython-311.pyc | Bin 381 -> 0 bytes .../__pycache__/traceback.cpython-311.pyc | Bin 31695 -> 0 bytes .../rich/__pycache__/tree.cpython-311.pyc | Bin 12552 -> 0 bytes .../pip/_vendor/rich/_cell_widths.py | 451 - .../pip/_vendor/rich/_emoji_codes.py | 3610 ------- .../pip/_vendor/rich/_emoji_replace.py | 32 - .../pip/_vendor/rich/_export_format.py | 78 - .../pip/_vendor/rich/_extension.py | 10 - .../pip/_vendor/rich/_inspect.py | 270 - .../pip/_vendor/rich/_log_render.py | 94 - .../site-packages/pip/_vendor/rich/_loop.py | 43 - .../pip/_vendor/rich/_null_file.py | 83 - .../pip/_vendor/rich/_palettes.py | 309 - .../site-packages/pip/_vendor/rich/_pick.py | 17 - .../site-packages/pip/_vendor/rich/_ratio.py | 160 - .../pip/_vendor/rich/_spinners.py | 482 - .../site-packages/pip/_vendor/rich/_stack.py | 16 - .../site-packages/pip/_vendor/rich/_timer.py | 19 - .../pip/_vendor/rich/_win32_console.py | 662 -- .../pip/_vendor/rich/_windows.py | 72 - .../pip/_vendor/rich/_windows_renderer.py | 56 - .../site-packages/pip/_vendor/rich/_wrap.py | 56 - .../site-packages/pip/_vendor/rich/abc.py | 33 - .../site-packages/pip/_vendor/rich/align.py | 311 - .../site-packages/pip/_vendor/rich/ansi.py | 237 - .../site-packages/pip/_vendor/rich/bar.py | 94 - .../site-packages/pip/_vendor/rich/box.py | 517 - .../site-packages/pip/_vendor/rich/cells.py | 154 - .../site-packages/pip/_vendor/rich/color.py | 618 -- .../pip/_vendor/rich/color_triplet.py | 38 - .../site-packages/pip/_vendor/rich/columns.py | 187 - .../site-packages/pip/_vendor/rich/console.py | 2612 ----- .../pip/_vendor/rich/constrain.py | 37 - .../pip/_vendor/rich/containers.py | 167 - .../site-packages/pip/_vendor/rich/control.py | 225 - .../pip/_vendor/rich/default_styles.py | 188 - .../pip/_vendor/rich/diagnose.py | 37 - .../site-packages/pip/_vendor/rich/emoji.py | 96 - .../site-packages/pip/_vendor/rich/errors.py | 34 - .../pip/_vendor/rich/file_proxy.py | 54 - .../pip/_vendor/rich/filesize.py | 89 - .../pip/_vendor/rich/highlighter.py | 232 - .../site-packages/pip/_vendor/rich/json.py | 140 - .../site-packages/pip/_vendor/rich/jupyter.py | 101 - .../site-packages/pip/_vendor/rich/layout.py | 443 - .../site-packages/pip/_vendor/rich/live.py | 373 - .../pip/_vendor/rich/live_render.py | 113 - .../site-packages/pip/_vendor/rich/logging.py | 289 - .../site-packages/pip/_vendor/rich/markup.py | 246 - .../site-packages/pip/_vendor/rich/measure.py | 151 - .../site-packages/pip/_vendor/rich/padding.py | 141 - .../site-packages/pip/_vendor/rich/pager.py | 34 - .../site-packages/pip/_vendor/rich/palette.py | 100 - .../site-packages/pip/_vendor/rich/panel.py | 308 - .../site-packages/pip/_vendor/rich/pretty.py | 1029 -- .../pip/_vendor/rich/progress.py | 1707 ---- .../pip/_vendor/rich/progress_bar.py | 224 - .../site-packages/pip/_vendor/rich/prompt.py | 376 - .../pip/_vendor/rich/protocol.py | 42 - .../site-packages/pip/_vendor/rich/region.py | 10 - .../site-packages/pip/_vendor/rich/repr.py | 149 - .../site-packages/pip/_vendor/rich/rule.py | 134 - .../site-packages/pip/_vendor/rich/scope.py | 86 - .../site-packages/pip/_vendor/rich/screen.py | 54 - .../site-packages/pip/_vendor/rich/segment.py | 739 -- .../site-packages/pip/_vendor/rich/spinner.py | 136 - .../site-packages/pip/_vendor/rich/status.py | 132 - .../site-packages/pip/_vendor/rich/style.py | 773 -- .../site-packages/pip/_vendor/rich/styled.py | 42 - .../site-packages/pip/_vendor/rich/syntax.py | 945 -- .../site-packages/pip/_vendor/rich/table.py | 1002 -- .../pip/_vendor/rich/terminal_theme.py | 153 - .../site-packages/pip/_vendor/rich/text.py | 1311 --- .../site-packages/pip/_vendor/rich/theme.py | 112 - .../site-packages/pip/_vendor/rich/themes.py | 5 - .../pip/_vendor/rich/traceback.py | 677 -- .../site-packages/pip/_vendor/rich/tree.py | 251 - .../site-packages/pip/_vendor/six.py | 998 -- .../pip/_vendor/tenacity/__init__.py | 519 - .../__pycache__/__init__.cpython-311.pyc | Bin 27819 -> 0 bytes .../__pycache__/_asyncio.cpython-311.pyc | Bin 4826 -> 0 bytes .../__pycache__/_utils.cpython-311.pyc | Bin 2091 -> 0 bytes .../__pycache__/after.cpython-311.pyc | Bin 1718 -> 0 bytes .../__pycache__/before.cpython-311.pyc | Bin 1552 -> 0 bytes .../__pycache__/before_sleep.cpython-311.pyc | Bin 2129 -> 0 bytes .../tenacity/__pycache__/nap.cpython-311.pyc | Bin 1591 -> 0 bytes .../__pycache__/retry.cpython-311.pyc | Bin 15065 -> 0 bytes .../tenacity/__pycache__/stop.cpython-311.pyc | Bin 5919 -> 0 bytes .../__pycache__/tornadoweb.cpython-311.pyc | Bin 2937 -> 0 bytes .../tenacity/__pycache__/wait.cpython-311.pyc | Bin 13391 -> 0 bytes .../pip/_vendor/tenacity/_asyncio.py | 92 - .../pip/_vendor/tenacity/_utils.py | 68 - .../pip/_vendor/tenacity/after.py | 46 - .../pip/_vendor/tenacity/before.py | 41 - .../pip/_vendor/tenacity/before_sleep.py | 58 - .../site-packages/pip/_vendor/tenacity/nap.py | 43 - .../pip/_vendor/tenacity/retry.py | 240 - .../pip/_vendor/tenacity/stop.py | 96 - .../pip/_vendor/tenacity/tornadoweb.py | 59 - .../pip/_vendor/tenacity/wait.py | 232 - .../pip/_vendor/tomli/__init__.py | 11 - .../__pycache__/__init__.cpython-311.pyc | Bin 436 -> 0 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 30875 -> 0 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 4515 -> 0 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 428 -> 0 bytes .../pip/_vendor/tomli/_parser.py | 691 -- .../site-packages/pip/_vendor/tomli/_re.py | 107 - .../site-packages/pip/_vendor/tomli/_types.py | 10 - .../pip/_vendor/typing_extensions.py | 2209 ----- .../pip/_vendor/urllib3/__init__.py | 102 - .../__pycache__/__init__.cpython-311.pyc | Bin 3734 -> 0 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 18322 -> 0 bytes .../__pycache__/_version.cpython-311.pyc | Bin 244 -> 0 bytes .../__pycache__/connection.cpython-311.pyc | Bin 21918 -> 0 bytes .../connectionpool.cpython-311.pyc | Bin 37661 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 16148 -> 0 bytes .../__pycache__/fields.cpython-311.pyc | Bin 11441 -> 0 bytes .../__pycache__/filepost.cpython-311.pyc | Bin 4522 -> 0 bytes .../__pycache__/poolmanager.cpython-311.pyc | Bin 21845 -> 0 bytes .../__pycache__/request.cpython-311.pyc | Bin 6685 -> 0 bytes .../__pycache__/response.cpython-311.pyc | Bin 36568 -> 0 bytes .../pip/_vendor/urllib3/_collections.py | 337 - .../pip/_vendor/urllib3/_version.py | 2 - .../pip/_vendor/urllib3/connection.py | 567 -- .../pip/_vendor/urllib3/connectionpool.py | 1110 --- .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 230 -> 0 bytes .../_appengine_environ.cpython-311.pyc | Bin 1969 -> 0 bytes .../__pycache__/appengine.cpython-311.pyc | Bin 12176 -> 0 bytes .../__pycache__/ntlmpool.cpython-311.pyc | Bin 6253 -> 0 bytes .../__pycache__/pyopenssl.cpython-311.pyc | Bin 25762 -> 0 bytes .../securetransport.cpython-311.pyc | Bin 36869 -> 0 bytes .../contrib/__pycache__/socks.cpython-311.pyc | Bin 8114 -> 0 bytes .../urllib3/contrib/_appengine_environ.py | 36 - .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 247 -> 0 bytes .../__pycache__/bindings.cpython-311.pyc | Bin 16994 -> 0 bytes .../__pycache__/low_level.cpython-311.pyc | Bin 15631 -> 0 bytes .../contrib/_securetransport/bindings.py | 519 - .../contrib/_securetransport/low_level.py | 397 - .../pip/_vendor/urllib3/contrib/appengine.py | 314 - .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 - .../pip/_vendor/urllib3/contrib/pyopenssl.py | 518 - .../urllib3/contrib/securetransport.py | 921 -- .../pip/_vendor/urllib3/contrib/socks.py | 216 - .../pip/_vendor/urllib3/exceptions.py | 323 - .../pip/_vendor/urllib3/fields.py | 274 - .../pip/_vendor/urllib3/filepost.py | 98 - .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 231 -> 0 bytes .../packages/__pycache__/six.cpython-311.pyc | Bin 46473 -> 0 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 241 -> 0 bytes .../__pycache__/makefile.cpython-311.pyc | Bin 1988 -> 0 bytes .../urllib3/packages/backports/makefile.py | 51 - .../pip/_vendor/urllib3/packages/six.py | 1076 --- .../pip/_vendor/urllib3/poolmanager.py | 537 - .../pip/_vendor/urllib3/request.py | 170 - .../pip/_vendor/urllib3/response.py | 879 -- .../pip/_vendor/urllib3/util/__init__.py | 49 - .../util/__pycache__/__init__.cpython-311.pyc | Bin 1433 -> 0 bytes .../__pycache__/connection.cpython-311.pyc | Bin 5160 -> 0 bytes .../util/__pycache__/proxy.cpython-311.pyc | Bin 1742 -> 0 bytes .../util/__pycache__/queue.cpython-311.pyc | Bin 1525 -> 0 bytes .../util/__pycache__/request.cpython-311.pyc | Bin 4645 -> 0 bytes .../util/__pycache__/response.cpython-311.pyc | Bin 3514 -> 0 bytes .../util/__pycache__/retry.cpython-311.pyc | Bin 22782 -> 0 bytes .../util/__pycache__/ssl_.cpython-311.pyc | Bin 16845 -> 0 bytes .../ssl_match_hostname.cpython-311.pyc | Bin 5824 -> 0 bytes .../__pycache__/ssltransport.cpython-311.pyc | Bin 11653 -> 0 bytes .../util/__pycache__/timeout.cpython-311.pyc | Bin 11061 -> 0 bytes .../util/__pycache__/url.cpython-311.pyc | Bin 17585 -> 0 bytes .../util/__pycache__/wait.cpython-311.pyc | Bin 5027 -> 0 bytes .../pip/_vendor/urllib3/util/connection.py | 149 - .../pip/_vendor/urllib3/util/proxy.py | 57 - .../pip/_vendor/urllib3/util/queue.py | 22 - .../pip/_vendor/urllib3/util/request.py | 137 - .../pip/_vendor/urllib3/util/response.py | 107 - .../pip/_vendor/urllib3/util/retry.py | 620 -- .../pip/_vendor/urllib3/util/ssl_.py | 495 - .../urllib3/util/ssl_match_hostname.py | 159 - .../pip/_vendor/urllib3/util/ssltransport.py | 221 - .../pip/_vendor/urllib3/util/timeout.py | 268 - .../pip/_vendor/urllib3/util/url.py | 435 - .../pip/_vendor/urllib3/util/wait.py | 152 - .../site-packages/pip/_vendor/vendor.txt | 23 - .../pip/_vendor/webencodings/__init__.py | 342 - .../__pycache__/__init__.cpython-311.pyc | Bin 12907 -> 0 bytes .../__pycache__/labels.cpython-311.pyc | Bin 7307 -> 0 bytes .../__pycache__/mklabels.cpython-311.pyc | Bin 3235 -> 0 bytes .../__pycache__/tests.cpython-311.pyc | Bin 11213 -> 0 bytes .../x_user_defined.cpython-311.pyc | Bin 3587 -> 0 bytes .../pip/_vendor/webencodings/labels.py | 231 - .../pip/_vendor/webencodings/mklabels.py | 59 - .../pip/_vendor/webencodings/tests.py | 153 - .../_vendor/webencodings/x_user_defined.py | 325 - .../lib/python3.11/site-packages/pip/py.typed | 4 - .../site-packages/pkg_resources/__init__.py | 3357 ------- .../__pycache__/__init__.cpython-311.pyc | Bin 160184 -> 0 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 224 -> 0 bytes .../typing_extensions.cpython-311.pyc | Bin 97441 -> 0 bytes .../_vendor/__pycache__/zipp.cpython-311.pyc | Bin 16017 -> 0 bytes .../_vendor/importlib_resources/__init__.py | 36 - .../__pycache__/__init__.cpython-311.pyc | Bin 858 -> 0 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 10775 -> 0 bytes .../__pycache__/_common.cpython-311.pyc | Bin 9604 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 5851 -> 0 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 1420 -> 0 bytes .../__pycache__/_legacy.cpython-311.pyc | Bin 6552 -> 0 bytes .../__pycache__/abc.cpython-311.pyc | Bin 9958 -> 0 bytes .../__pycache__/readers.cpython-311.pyc | Bin 8487 -> 0 bytes .../__pycache__/simple.cpython-311.pyc | Bin 6102 -> 0 bytes .../_vendor/importlib_resources/_adapters.py | 170 - .../_vendor/importlib_resources/_common.py | 207 - .../_vendor/importlib_resources/_compat.py | 108 - .../_vendor/importlib_resources/_itertools.py | 35 - .../_vendor/importlib_resources/_legacy.py | 120 - .../_vendor/importlib_resources/abc.py | 170 - .../_vendor/importlib_resources/readers.py | 120 - .../_vendor/importlib_resources/simple.py | 106 - .../pkg_resources/_vendor/jaraco/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 231 -> 0 bytes .../__pycache__/context.cpython-311.pyc | Bin 12030 -> 0 bytes .../__pycache__/functools.cpython-311.pyc | Bin 20317 -> 0 bytes .../pkg_resources/_vendor/jaraco/context.py | 288 - .../pkg_resources/_vendor/jaraco/functools.py | 525 - .../_vendor/jaraco/text/__init__.py | 599 -- .../text/__pycache__/__init__.cpython-311.pyc | Bin 26634 -> 0 bytes .../_vendor/more_itertools/__init__.py | 6 - .../__pycache__/__init__.cpython-311.pyc | Bin 403 -> 0 bytes .../__pycache__/more.cpython-311.pyc | Bin 169525 -> 0 bytes .../__pycache__/recipes.cpython-311.pyc | Bin 33545 -> 0 bytes .../_vendor/more_itertools/more.py | 4346 --------- .../_vendor/more_itertools/recipes.py | 841 -- .../_vendor/packaging/__init__.py | 15 - .../__pycache__/__init__.cpython-311.pyc | Bin 598 -> 0 bytes .../__pycache__/_elffile.cpython-311.pyc | Bin 5514 -> 0 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 10366 -> 0 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 5170 -> 0 bytes .../__pycache__/_parser.cpython-311.pyc | Bin 15367 -> 0 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 3718 -> 0 bytes .../__pycache__/_tokenizer.cpython-311.pyc | Bin 8526 -> 0 bytes .../__pycache__/markers.cpython-311.pyc | Bin 12004 -> 0 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 5094 -> 0 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 41164 -> 0 bytes .../__pycache__/tags.cpython-311.pyc | Bin 23470 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 6843 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 21011 -> 0 bytes .../_vendor/packaging/_elffile.py | 108 - .../_vendor/packaging/_manylinux.py | 238 - .../_vendor/packaging/_musllinux.py | 80 - .../_vendor/packaging/_parser.py | 328 - .../_vendor/packaging/_structures.py | 61 - .../_vendor/packaging/_tokenizer.py | 188 - .../_vendor/packaging/markers.py | 245 - .../_vendor/packaging/requirements.py | 95 - .../_vendor/packaging/specifiers.py | 1005 -- .../pkg_resources/_vendor/packaging/tags.py | 546 -- .../pkg_resources/_vendor/packaging/utils.py | 141 - .../_vendor/packaging/version.py | 563 -- .../_vendor/platformdirs/__init__.py | 342 - .../_vendor/platformdirs/__main__.py | 46 - .../__pycache__/__init__.cpython-311.pyc | Bin 12856 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 2148 -> 0 bytes .../__pycache__/android.cpython-311.pyc | Bin 6390 -> 0 bytes .../__pycache__/api.cpython-311.pyc | Bin 7217 -> 0 bytes .../__pycache__/macos.cpython-311.pyc | Bin 4627 -> 0 bytes .../__pycache__/unix.cpython-311.pyc | Bin 11059 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 346 -> 0 bytes .../__pycache__/windows.cpython-311.pyc | Bin 9995 -> 0 bytes .../_vendor/platformdirs/android.py | 120 - .../pkg_resources/_vendor/platformdirs/api.py | 156 - .../_vendor/platformdirs/macos.py | 64 - .../_vendor/platformdirs/unix.py | 181 - .../_vendor/platformdirs/version.py | 4 - .../_vendor/platformdirs/windows.py | 184 - .../_vendor/typing_extensions.py | 2209 ----- .../pkg_resources/_vendor/zipp.py | 329 - .../pkg_resources/extern/__init__.py | 80 - .../__pycache__/__init__.cpython-311.pyc | Bin 4336 -> 0 bytes .../pydantic-2.0.3.dist-info/INSTALLER | 1 - .../pydantic-2.0.3.dist-info/METADATA | 1061 -- .../pydantic-2.0.3.dist-info/RECORD | 190 - .../pydantic-2.0.3.dist-info/REQUESTED | 0 .../pydantic-2.0.3.dist-info/WHEEL | 4 - .../pydantic-2.0.3.dist-info/licenses/LICENSE | 21 - .../site-packages/pydantic/__init__.py | 212 - .../__pycache__/__init__.cpython-311.pyc | Bin 4483 -> 0 bytes .../__pycache__/_migration.cpython-311.pyc | Bin 11107 -> 0 bytes .../alias_generators.cpython-311.pyc | Bin 2682 -> 0 bytes .../class_validators.cpython-311.pyc | Bin 420 -> 0 bytes .../__pycache__/color.cpython-311.pyc | Bin 32588 -> 0 bytes .../__pycache__/config.cpython-311.pyc | Bin 9647 -> 0 bytes .../__pycache__/dataclasses.cpython-311.pyc | Bin 10767 -> 0 bytes .../datetime_parse.cpython-311.pyc | Bin 420 -> 0 bytes .../__pycache__/decorator.cpython-311.pyc | Bin 410 -> 0 bytes .../__pycache__/env_settings.cpython-311.pyc | Bin 416 -> 0 bytes .../error_wrappers.cpython-311.pyc | Bin 420 -> 0 bytes .../__pycache__/errors.cpython-311.pyc | Bin 6924 -> 0 bytes .../__pycache__/fields.cpython-311.pyc | Bin 45965 -> 0 bytes .../functional_serializers.cpython-311.pyc | Bin 13266 -> 0 bytes .../functional_validators.cpython-311.pyc | Bin 25389 -> 0 bytes .../__pycache__/generics.cpython-311.pyc | Bin 408 -> 0 bytes .../pydantic/__pycache__/json.cpython-311.pyc | Bin 400 -> 0 bytes .../__pycache__/json_schema.cpython-311.pyc | Bin 105716 -> 0 bytes .../pydantic/__pycache__/main.cpython-311.pyc | Bin 63742 -> 0 bytes .../pydantic/__pycache__/mypy.cpython-311.pyc | Bin 58597 -> 0 bytes .../__pycache__/networks.cpython-311.pyc | Bin 17477 -> 0 bytes .../__pycache__/parse.cpython-311.pyc | Bin 402 -> 0 bytes .../__pycache__/root_model.cpython-311.pyc | Bin 4860 -> 0 bytes .../__pycache__/schema.cpython-311.pyc | Bin 404 -> 0 bytes .../__pycache__/tools.cpython-311.pyc | Bin 402 -> 0 bytes .../__pycache__/type_adapter.cpython-311.pyc | Bin 18008 -> 0 bytes .../__pycache__/types.cpython-311.pyc | Bin 58082 -> 0 bytes .../__pycache__/typing.cpython-311.pyc | Bin 400 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 402 -> 0 bytes .../__pycache__/validate_call.cpython-311.pyc | Bin 2276 -> 0 bytes .../__pycache__/validators.cpython-311.pyc | Bin 412 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 3178 -> 0 bytes .../__pycache__/warnings.cpython-311.pyc | Bin 3530 -> 0 bytes .../pydantic/_internal/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 221 -> 0 bytes .../_annotated_handlers.cpython-311.pyc | Bin 5523 -> 0 bytes .../__pycache__/_config.cpython-311.pyc | Bin 13238 -> 0 bytes .../_core_metadata.cpython-311.pyc | Bin 4349 -> 0 bytes .../__pycache__/_core_utils.cpython-311.pyc | Bin 29941 -> 0 bytes .../__pycache__/_dataclasses.cpython-311.pyc | Bin 13067 -> 0 bytes .../__pycache__/_decorators.cpython-311.pyc | Bin 38018 -> 0 bytes .../_decorators_v1.cpython-311.pyc | Bin 9996 -> 0 bytes .../_discriminated_union.cpython-311.pyc | Bin 22149 -> 0 bytes .../__pycache__/_fields.cpython-311.pyc | Bin 11421 -> 0 bytes .../__pycache__/_forward_ref.cpython-311.pyc | Bin 1076 -> 0 bytes .../_generate_schema.cpython-311.pyc | Bin 93156 -> 0 bytes .../__pycache__/_generics.cpython-311.pyc | Bin 24391 -> 0 bytes .../_internal_dataclass.cpython-311.pyc | Bin 529 -> 0 bytes .../_known_annotated_metadata.cpython-311.pyc | Bin 11114 -> 0 bytes .../_mock_validator.cpython-311.pyc | Bin 4287 -> 0 bytes .../_model_construction.cpython-311.pyc | Bin 25149 -> 0 bytes .../__pycache__/_repr.cpython-311.pyc | Bin 7324 -> 0 bytes .../_schema_generation_shared.cpython-311.pyc | Bin 6540 -> 0 bytes .../_std_types_schema.cpython-311.pyc | Bin 44974 -> 0 bytes .../__pycache__/_typing_extra.cpython-311.pyc | Bin 19752 -> 0 bytes .../__pycache__/_utils.cpython-311.pyc | Bin 17684 -> 0 bytes .../_validate_call.cpython-311.pyc | Bin 6581 -> 0 bytes .../__pycache__/_validators.cpython-311.pyc | Bin 13148 -> 0 bytes .../pydantic/_internal/_annotated_handlers.py | 114 - .../pydantic/_internal/_config.py | 261 - .../pydantic/_internal/_core_metadata.py | 88 - .../pydantic/_internal/_core_utils.py | 521 - .../pydantic/_internal/_dataclasses.py | 273 - .../pydantic/_internal/_decorators.py | 775 -- .../pydantic/_internal/_decorators_v1.py | 181 - .../_internal/_discriminated_union.py | 467 - .../pydantic/_internal/_fields.py | 266 - .../pydantic/_internal/_forward_ref.py | 16 - .../pydantic/_internal/_generate_schema.py | 1836 ---- .../pydantic/_internal/_generics.py | 492 - .../pydantic/_internal/_internal_dataclass.py | 10 - .../_internal/_known_annotated_metadata.py | 240 - .../pydantic/_internal/_mock_validator.py | 83 - .../pydantic/_internal/_model_construction.py | 537 - .../site-packages/pydantic/_internal/_repr.py | 109 - .../_internal/_schema_generation_shared.py | 120 - .../pydantic/_internal/_std_types_schema.py | 908 -- .../pydantic/_internal/_typing_extra.py | 433 - .../pydantic/_internal/_utils.py | 344 - .../pydantic/_internal/_validate_call.py | 119 - .../pydantic/_internal/_validators.py | 271 - .../site-packages/pydantic/_migration.py | 300 - .../pydantic/alias_generators.py | 44 - .../pydantic/class_validators.py | 4 - .../site-packages/pydantic/color.py | 603 -- .../site-packages/pydantic/config.py | 165 - .../site-packages/pydantic/dataclasses.py | 276 - .../site-packages/pydantic/datetime_parse.py | 4 - .../site-packages/pydantic/decorator.py | 4 - .../pydantic/deprecated/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 222 -> 0 bytes .../class_validators.cpython-311.pyc | Bin 12575 -> 0 bytes .../__pycache__/config.cpython-311.pyc | Bin 3433 -> 0 bytes .../copy_internals.cpython-311.pyc | Bin 9744 -> 0 bytes .../__pycache__/decorator.cpython-311.pyc | Bin 15716 -> 0 bytes .../__pycache__/json.cpython-311.pyc | Bin 6858 -> 0 bytes .../__pycache__/parse.cpython-311.pyc | Bin 3684 -> 0 bytes .../__pycache__/tools.cpython-311.pyc | Bin 3894 -> 0 bytes .../pydantic/deprecated/class_validators.py | 244 - .../pydantic/deprecated/config.py | 50 - .../pydantic/deprecated/copy_internals.py | 224 - .../pydantic/deprecated/decorator.py | 279 - .../site-packages/pydantic/deprecated/json.py | 130 - .../pydantic/deprecated/parse.py | 80 - .../pydantic/deprecated/tools.py | 96 - .../site-packages/pydantic/env_settings.py | 4 - .../site-packages/pydantic/error_wrappers.py | 4 - .../site-packages/pydantic/errors.py | 147 - .../site-packages/pydantic/fields.py | 1003 -- .../pydantic/functional_serializers.py | 279 - .../pydantic/functional_validators.py | 572 -- .../site-packages/pydantic/generics.py | 4 - .../python3.11/site-packages/pydantic/json.py | 4 - .../site-packages/pydantic/json_schema.py | 2235 ----- .../python3.11/site-packages/pydantic/main.py | 1332 --- .../python3.11/site-packages/pydantic/mypy.py | 1153 --- .../site-packages/pydantic/networks.py | 430 - .../site-packages/pydantic/parse.py | 4 - .../site-packages/pydantic/py.typed | 0 .../site-packages/pydantic/root_model.py | 99 - .../site-packages/pydantic/schema.py | 4 - .../site-packages/pydantic/tools.py | 4 - .../site-packages/pydantic/type_adapter.py | 391 - .../site-packages/pydantic/types.py | 1382 --- .../site-packages/pydantic/typing.py | 4 - .../site-packages/pydantic/utils.py | 4 - .../site-packages/pydantic/v1/__init__.py | 131 - .../v1/__pycache__/__init__.cpython-311.pyc | Bin 2293 -> 0 bytes .../_hypothesis_plugin.cpython-311.pyc | Bin 20270 -> 0 bytes .../annotated_types.cpython-311.pyc | Bin 4680 -> 0 bytes .../class_validators.cpython-311.pyc | Bin 22744 -> 0 bytes .../v1/__pycache__/color.cpython-311.pyc | Bin 28214 -> 0 bytes .../v1/__pycache__/config.cpython-311.pyc | Bin 10013 -> 0 bytes .../__pycache__/dataclasses.cpython-311.pyc | Bin 24626 -> 0 bytes .../datetime_parse.cpython-311.pyc | Bin 11999 -> 0 bytes .../v1/__pycache__/decorator.cpython-311.pyc | Bin 15639 -> 0 bytes .../__pycache__/env_settings.cpython-311.pyc | Bin 19989 -> 0 bytes .../error_wrappers.cpython-311.pyc | Bin 10009 -> 0 bytes .../v1/__pycache__/errors.cpython-311.pyc | Bin 36558 -> 0 bytes .../v1/__pycache__/fields.cpython-311.pyc | Bin 62713 -> 0 bytes .../v1/__pycache__/generics.cpython-311.pyc | Bin 19667 -> 0 bytes .../v1/__pycache__/json.cpython-311.pyc | Bin 5676 -> 0 bytes .../v1/__pycache__/main.cpython-311.pyc | Bin 54812 -> 0 bytes .../v1/__pycache__/mypy.cpython-311.pyc | Bin 50185 -> 0 bytes .../v1/__pycache__/networks.cpython-311.pyc | Bin 33964 -> 0 bytes .../v1/__pycache__/parse.cpython-311.pyc | Bin 3062 -> 0 bytes .../v1/__pycache__/schema.cpython-311.pyc | Bin 54520 -> 0 bytes .../v1/__pycache__/tools.cpython-311.pyc | Bin 4445 -> 0 bytes .../v1/__pycache__/types.cpython-311.pyc | Bin 55040 -> 0 bytes .../v1/__pycache__/typing.cpython-311.pyc | Bin 25121 -> 0 bytes .../v1/__pycache__/utils.cpython-311.pyc | Bin 40667 -> 0 bytes .../v1/__pycache__/validators.cpython-311.pyc | Bin 34575 -> 0 bytes .../v1/__pycache__/version.cpython-311.pyc | Bin 2231 -> 0 bytes .../pydantic/v1/_hypothesis_plugin.py | 391 - .../pydantic/v1/annotated_types.py | 72 - .../pydantic/v1/class_validators.py | 361 - .../site-packages/pydantic/v1/color.py | 494 - .../site-packages/pydantic/v1/config.py | 191 - .../site-packages/pydantic/v1/dataclasses.py | 478 - .../pydantic/v1/datetime_parse.py | 248 - .../site-packages/pydantic/v1/decorator.py | 264 - .../site-packages/pydantic/v1/env_settings.py | 350 - .../pydantic/v1/error_wrappers.py | 162 - .../site-packages/pydantic/v1/errors.py | 646 -- .../site-packages/pydantic/v1/fields.py | 1256 --- .../site-packages/pydantic/v1/generics.py | 400 - .../site-packages/pydantic/v1/json.py | 112 - .../site-packages/pydantic/v1/main.py | 1109 --- .../site-packages/pydantic/v1/mypy.py | 943 -- .../site-packages/pydantic/v1/networks.py | 739 -- .../site-packages/pydantic/v1/parse.py | 66 - .../site-packages/pydantic/v1/py.typed | 0 .../site-packages/pydantic/v1/schema.py | 1164 --- .../site-packages/pydantic/v1/tools.py | 92 - .../site-packages/pydantic/v1/types.py | 1206 --- .../site-packages/pydantic/v1/typing.py | 603 -- .../site-packages/pydantic/v1/utils.py | 803 -- .../site-packages/pydantic/v1/validators.py | 765 -- .../site-packages/pydantic/v1/version.py | 38 - .../site-packages/pydantic/validate_call.py | 51 - .../site-packages/pydantic/validators.py | 4 - .../site-packages/pydantic/version.py | 53 - .../site-packages/pydantic/warnings.py | 47 - .../pydantic_core-2.3.0.dist-info/INSTALLER | 1 - .../pydantic_core-2.3.0.dist-info/METADATA | 134 - .../pydantic_core-2.3.0.dist-info/RECORD | 12 - .../pydantic_core-2.3.0.dist-info/WHEEL | 4 - .../license_files/LICENSE | 21 - .../site-packages/pydantic_core/__init__.py | 95 - .../__pycache__/__init__.cpython-311.pyc | Bin 3434 -> 0 bytes .../__pycache__/core_schema.cpython-311.pyc | Bin 137391 -> 0 bytes .../_pydantic_core.cpython-311-darwin.so | Bin 3838568 -> 0 bytes .../pydantic_core/_pydantic_core.pyi | 337 - .../pydantic_core/core_schema.py | 3886 -------- .../site-packages/pydantic_core/py.typed | 1 - .../python_engineio-4.4.1.dist-info/INSTALLER | 1 - .../python_engineio-4.4.1.dist-info/LICENSE | 20 - .../python_engineio-4.4.1.dist-info/METADATA | 46 - .../python_engineio-4.4.1.dist-info/RECORD | 50 - .../python_engineio-4.4.1.dist-info/WHEEL | 5 - .../top_level.txt | 1 - .../python_socketio-5.8.0.dist-info/INSTALLER | 1 - .../python_socketio-5.8.0.dist-info/LICENSE | 20 - .../python_socketio-5.8.0.dist-info/METADATA | 70 - .../python_socketio-5.8.0.dist-info/RECORD | 52 - .../python_socketio-5.8.0.dist-info/WHEEL | 5 - .../top_level.txt | 1 - .../setuptools-67.6.1.dist-info/INSTALLER | 1 - .../setuptools-67.6.1.dist-info/LICENSE | 19 - .../setuptools-67.6.1.dist-info/METADATA | 137 - .../setuptools-67.6.1.dist-info/RECORD | 452 - .../setuptools-67.6.1.dist-info/REQUESTED | 0 .../setuptools-67.6.1.dist-info/WHEEL | 5 - .../entry_points.txt | 57 - .../setuptools-67.6.1.dist-info/top_level.txt | 3 - .../site-packages/setuptools/__init__.py | 268 - .../__pycache__/__init__.cpython-311.pyc | Bin 13952 -> 0 bytes .../_deprecation_warning.cpython-311.pyc | Bin 668 -> 0 bytes .../__pycache__/_entry_points.cpython-311.pyc | Bin 5225 -> 0 bytes .../__pycache__/_imp.cpython-311.pyc | Bin 3681 -> 0 bytes .../__pycache__/_importlib.cpython-311.pyc | Bin 1981 -> 0 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 1180 -> 0 bytes .../_normalization.cpython-311.pyc | Bin 5502 -> 0 bytes .../__pycache__/_path.cpython-311.pyc | Bin 2072 -> 0 bytes .../__pycache__/_reqs.cpython-311.pyc | Bin 1961 -> 0 bytes .../__pycache__/archive_util.cpython-311.pyc | Bin 10190 -> 0 bytes .../__pycache__/build_meta.cpython-311.pyc | Bin 28260 -> 0 bytes .../__pycache__/dep_util.cpython-311.pyc | Bin 1316 -> 0 bytes .../__pycache__/depends.cpython-311.pyc | Bin 8001 -> 0 bytes .../__pycache__/discovery.cpython-311.pyc | Bin 31611 -> 0 bytes .../__pycache__/dist.cpython-311.pyc | Bin 64248 -> 0 bytes .../__pycache__/errors.cpython-311.pyc | Bin 2977 -> 0 bytes .../__pycache__/extension.cpython-311.pyc | Bin 6833 -> 0 bytes .../__pycache__/glob.cpython-311.pyc | Bin 6590 -> 0 bytes .../__pycache__/installer.cpython-311.pyc | Bin 7574 -> 0 bytes .../__pycache__/launch.cpython-311.pyc | Bin 1556 -> 0 bytes .../__pycache__/logging.cpython-311.pyc | Bin 2123 -> 0 bytes .../__pycache__/monkey.cpython-311.pyc | Bin 6864 -> 0 bytes .../__pycache__/msvc.cpython-311.pyc | Bin 63288 -> 0 bytes .../__pycache__/namespaces.cpython-311.pyc | Bin 5688 -> 0 bytes .../__pycache__/package_index.cpython-311.pyc | Bin 60926 -> 0 bytes .../__pycache__/py34compat.cpython-311.pyc | Bin 743 -> 0 bytes .../__pycache__/sandbox.cpython-311.pyc | Bin 27359 -> 0 bytes .../__pycache__/unicode_utils.cpython-311.pyc | Bin 1845 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 456 -> 0 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 15652 -> 0 bytes .../windows_support.cpython-311.pyc | Bin 1460 -> 0 bytes .../setuptools/_deprecation_warning.py | 7 - .../setuptools/_distutils/__init__.py | 14 - .../__pycache__/__init__.cpython-311.pyc | Bin 587 -> 0 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 8524 -> 0 bytes .../__pycache__/_functools.cpython-311.pyc | Bin 889 -> 0 bytes .../__pycache__/_log.cpython-311.pyc | Bin 306 -> 0 bytes .../__pycache__/_macos_compat.cpython-311.pyc | Bin 598 -> 0 bytes .../__pycache__/_msvccompiler.cpython-311.pyc | Bin 25047 -> 0 bytes .../__pycache__/archive_util.cpython-311.pyc | Bin 10648 -> 0 bytes .../__pycache__/bcppcompiler.cpython-311.pyc | Bin 13415 -> 0 bytes .../__pycache__/ccompiler.cpython-311.pyc | Bin 47208 -> 0 bytes .../__pycache__/cmd.cpython-311.pyc | Bin 18867 -> 0 bytes .../__pycache__/config.cpython-311.pyc | Bin 6068 -> 0 bytes .../__pycache__/core.cpython-311.pyc | Bin 10009 -> 0 bytes .../cygwinccompiler.cpython-311.pyc | Bin 13620 -> 0 bytes .../__pycache__/debug.cpython-311.pyc | Bin 350 -> 0 bytes .../__pycache__/dep_util.cpython-311.pyc | Bin 4012 -> 0 bytes .../__pycache__/dir_util.cpython-311.pyc | Bin 10446 -> 0 bytes .../__pycache__/dist.cpython-311.pyc | Bin 55515 -> 0 bytes .../__pycache__/errors.cpython-311.pyc | Bin 6823 -> 0 bytes .../__pycache__/extension.cpython-311.pyc | Bin 10204 -> 0 bytes .../__pycache__/fancy_getopt.cpython-311.pyc | Bin 17263 -> 0 bytes .../__pycache__/file_util.cpython-311.pyc | Bin 10697 -> 0 bytes .../__pycache__/filelist.cpython-311.pyc | Bin 17637 -> 0 bytes .../__pycache__/log.cpython-311.pyc | Bin 2721 -> 0 bytes .../__pycache__/msvc9compiler.cpython-311.pyc | Bin 33569 -> 0 bytes .../__pycache__/msvccompiler.cpython-311.pyc | Bin 26998 -> 0 bytes .../__pycache__/py38compat.cpython-311.pyc | Bin 650 -> 0 bytes .../__pycache__/py39compat.cpython-311.pyc | Bin 1018 -> 0 bytes .../__pycache__/spawn.cpython-311.pyc | Bin 4462 -> 0 bytes .../__pycache__/sysconfig.cpython-311.pyc | Bin 22448 -> 0 bytes .../__pycache__/text_file.cpython-311.pyc | Bin 11290 -> 0 bytes .../__pycache__/unixccompiler.cpython-311.pyc | Bin 16522 -> 0 bytes .../__pycache__/util.cpython-311.pyc | Bin 20875 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 11375 -> 0 bytes .../versionpredicate.cpython-311.pyc | Bin 7652 -> 0 bytes .../setuptools/_distutils/_collections.py | 194 - .../setuptools/_distutils/_functools.py | 20 - .../setuptools/_distutils/_log.py | 4 - .../setuptools/_distutils/_macos_compat.py | 12 - .../setuptools/_distutils/_msvccompiler.py | 568 -- .../setuptools/_distutils/archive_util.py | 280 - .../setuptools/_distutils/bcppcompiler.py | 401 - .../setuptools/_distutils/ccompiler.py | 1254 --- .../setuptools/_distutils/cmd.py | 435 - .../setuptools/_distutils/command/__init__.py | 25 - .../__pycache__/__init__.cpython-311.pyc | Bin 570 -> 0 bytes .../_framework_compat.cpython-311.pyc | Bin 2811 -> 0 bytes .../command/__pycache__/bdist.cpython-311.pyc | Bin 6029 -> 0 bytes .../__pycache__/bdist_dumb.cpython-311.pyc | Bin 5749 -> 0 bytes .../__pycache__/bdist_rpm.cpython-311.pyc | Bin 23283 -> 0 bytes .../command/__pycache__/build.cpython-311.pyc | Bin 6084 -> 0 bytes .../__pycache__/build_clib.cpython-311.pyc | Bin 7792 -> 0 bytes .../__pycache__/build_ext.cpython-311.pyc | Bin 30302 -> 0 bytes .../__pycache__/build_py.cpython-311.pyc | Bin 17628 -> 0 bytes .../__pycache__/build_scripts.cpython-311.pyc | Bin 7882 -> 0 bytes .../command/__pycache__/check.cpython-311.pyc | Bin 7538 -> 0 bytes .../command/__pycache__/clean.cpython-311.pyc | Bin 3214 -> 0 bytes .../__pycache__/config.cpython-311.pyc | Bin 16251 -> 0 bytes .../__pycache__/install.cpython-311.pyc | Bin 29359 -> 0 bytes .../__pycache__/install_data.cpython-311.pyc | Bin 3791 -> 0 bytes .../install_egg_info.cpython-311.pyc | Bin 5246 -> 0 bytes .../install_headers.cpython-311.pyc | Bin 2379 -> 0 bytes .../__pycache__/install_lib.cpython-311.pyc | Bin 8700 -> 0 bytes .../install_scripts.cpython-311.pyc | Bin 3186 -> 0 bytes .../__pycache__/py37compat.cpython-311.pyc | Bin 1567 -> 0 bytes .../__pycache__/register.cpython-311.pyc | Bin 15585 -> 0 bytes .../command/__pycache__/sdist.cpython-311.pyc | Bin 23835 -> 0 bytes .../__pycache__/upload.cpython-311.pyc | Bin 10451 -> 0 bytes .../_distutils/command/_framework_compat.py | 55 - .../setuptools/_distutils/command/bdist.py | 156 - .../_distutils/command/bdist_dumb.py | 143 - .../_distutils/command/bdist_rpm.py | 614 -- .../setuptools/_distutils/command/build.py | 152 - .../_distutils/command/build_clib.py | 207 - .../_distutils/command/build_ext.py | 788 -- .../setuptools/_distutils/command/build_py.py | 406 - .../_distutils/command/build_scripts.py | 172 - .../setuptools/_distutils/command/check.py | 151 - .../setuptools/_distutils/command/clean.py | 75 - .../setuptools/_distutils/command/config.py | 376 - .../setuptools/_distutils/command/install.py | 813 -- .../_distutils/command/install_data.py | 83 - .../_distutils/command/install_egg_info.py | 92 - .../_distutils/command/install_headers.py | 44 - .../_distutils/command/install_lib.py | 237 - .../_distutils/command/install_scripts.py | 60 - .../_distutils/command/py37compat.py | 31 - .../setuptools/_distutils/command/register.py | 320 - .../setuptools/_distutils/command/sdist.py | 530 - .../setuptools/_distutils/command/upload.py | 206 - .../setuptools/_distutils/config.py | 139 - .../setuptools/_distutils/core.py | 291 - .../setuptools/_distutils/cygwinccompiler.py | 356 - .../setuptools/_distutils/debug.py | 5 - .../setuptools/_distutils/dep_util.py | 96 - .../setuptools/_distutils/dir_util.py | 243 - .../setuptools/_distutils/dist.py | 1287 --- .../setuptools/_distutils/errors.py | 127 - .../setuptools/_distutils/extension.py | 248 - .../setuptools/_distutils/fancy_getopt.py | 470 - .../setuptools/_distutils/file_util.py | 248 - .../setuptools/_distutils/filelist.py | 371 - .../setuptools/_distutils/log.py | 57 - .../setuptools/_distutils/msvc9compiler.py | 829 -- .../setuptools/_distutils/msvccompiler.py | 692 -- .../setuptools/_distutils/py38compat.py | 8 - .../setuptools/_distutils/py39compat.py | 22 - .../setuptools/_distutils/spawn.py | 109 - .../setuptools/_distutils/sysconfig.py | 559 -- .../setuptools/_distutils/text_file.py | 286 - .../setuptools/_distutils/unixccompiler.py | 400 - .../setuptools/_distutils/util.py | 513 - .../setuptools/_distutils/version.py | 357 - .../setuptools/_distutils/versionpredicate.py | 175 - .../site-packages/setuptools/_entry_points.py | 94 - .../site-packages/setuptools/_imp.py | 82 - .../site-packages/setuptools/_importlib.py | 47 - .../site-packages/setuptools/_itertools.py | 23 - .../setuptools/_normalization.py | 117 - .../site-packages/setuptools/_path.py | 37 - .../site-packages/setuptools/_reqs.py | 33 - .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 221 -> 0 bytes .../__pycache__/ordered_set.cpython-311.pyc | Bin 21807 -> 0 bytes .../typing_extensions.cpython-311.pyc | Bin 107638 -> 0 bytes .../_vendor/__pycache__/zipp.cpython-311.pyc | Bin 16014 -> 0 bytes .../_vendor/importlib_metadata/__init__.py | 904 -- .../__pycache__/__init__.cpython-311.pyc | Bin 50278 -> 0 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 4714 -> 0 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 2220 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 2742 -> 0 bytes .../__pycache__/_functools.cpython-311.pyc | Bin 3660 -> 0 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 2623 -> 0 bytes .../__pycache__/_meta.cpython-311.pyc | Bin 3164 -> 0 bytes .../__pycache__/_py39compat.cpython-311.pyc | Bin 1825 -> 0 bytes .../__pycache__/_text.cpython-311.pyc | Bin 4418 -> 0 bytes .../_vendor/importlib_metadata/_adapters.py | 90 - .../importlib_metadata/_collections.py | 30 - .../_vendor/importlib_metadata/_compat.py | 72 - .../_vendor/importlib_metadata/_functools.py | 104 - .../_vendor/importlib_metadata/_itertools.py | 73 - .../_vendor/importlib_metadata/_meta.py | 49 - .../_vendor/importlib_metadata/_py39compat.py | 35 - .../_vendor/importlib_metadata/_text.py | 99 - .../_vendor/importlib_resources/__init__.py | 36 - .../__pycache__/__init__.cpython-311.pyc | Bin 855 -> 0 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 10772 -> 0 bytes .../__pycache__/_common.cpython-311.pyc | Bin 9601 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 5848 -> 0 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 1417 -> 0 bytes .../__pycache__/_legacy.cpython-311.pyc | Bin 6549 -> 0 bytes .../__pycache__/abc.cpython-311.pyc | Bin 9955 -> 0 bytes .../__pycache__/readers.cpython-311.pyc | Bin 8484 -> 0 bytes .../__pycache__/simple.cpython-311.pyc | Bin 6099 -> 0 bytes .../_vendor/importlib_resources/_adapters.py | 170 - .../_vendor/importlib_resources/_common.py | 207 - .../_vendor/importlib_resources/_compat.py | 108 - .../_vendor/importlib_resources/_itertools.py | 35 - .../_vendor/importlib_resources/_legacy.py | 120 - .../_vendor/importlib_resources/abc.py | 170 - .../_vendor/importlib_resources/readers.py | 120 - .../_vendor/importlib_resources/simple.py | 106 - .../setuptools/_vendor/jaraco/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 228 -> 0 bytes .../__pycache__/context.cpython-311.pyc | Bin 12027 -> 0 bytes .../__pycache__/functools.cpython-311.pyc | Bin 20308 -> 0 bytes .../setuptools/_vendor/jaraco/context.py | 288 - .../setuptools/_vendor/jaraco/functools.py | 525 - .../_vendor/jaraco/text/__init__.py | 599 -- .../text/__pycache__/__init__.cpython-311.pyc | Bin 26622 -> 0 bytes .../_vendor/more_itertools/__init__.py | 4 - .../__pycache__/__init__.cpython-311.pyc | Bin 321 -> 0 bytes .../__pycache__/more.cpython-311.pyc | Bin 149208 -> 0 bytes .../__pycache__/recipes.cpython-311.pyc | Bin 23790 -> 0 bytes .../setuptools/_vendor/more_itertools/more.py | 3824 -------- .../_vendor/more_itertools/recipes.py | 620 -- .../setuptools/_vendor/ordered_set.py | 488 - .../setuptools/_vendor/packaging/__init__.py | 15 - .../__pycache__/__init__.cpython-311.pyc | Bin 595 -> 0 bytes .../__pycache__/_elffile.cpython-311.pyc | Bin 5511 -> 0 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 10363 -> 0 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 5167 -> 0 bytes .../__pycache__/_parser.cpython-311.pyc | Bin 15364 -> 0 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 3715 -> 0 bytes .../__pycache__/_tokenizer.cpython-311.pyc | Bin 8523 -> 0 bytes .../__pycache__/markers.cpython-311.pyc | Bin 12001 -> 0 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 5091 -> 0 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 41161 -> 0 bytes .../__pycache__/tags.cpython-311.pyc | Bin 23467 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 6840 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 21008 -> 0 bytes .../setuptools/_vendor/packaging/_elffile.py | 108 - .../_vendor/packaging/_manylinux.py | 238 - .../_vendor/packaging/_musllinux.py | 80 - .../setuptools/_vendor/packaging/_parser.py | 328 - .../_vendor/packaging/_structures.py | 61 - .../_vendor/packaging/_tokenizer.py | 188 - .../setuptools/_vendor/packaging/markers.py | 245 - .../_vendor/packaging/requirements.py | 95 - .../_vendor/packaging/specifiers.py | 1005 -- .../setuptools/_vendor/packaging/tags.py | 546 -- .../setuptools/_vendor/packaging/utils.py | 141 - .../setuptools/_vendor/packaging/version.py | 563 -- .../setuptools/_vendor/tomli/__init__.py | 11 - .../__pycache__/__init__.cpython-311.pyc | Bin 443 -> 0 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 30882 -> 0 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 4522 -> 0 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 435 -> 0 bytes .../setuptools/_vendor/tomli/_parser.py | 691 -- .../setuptools/_vendor/tomli/_re.py | 107 - .../setuptools/_vendor/tomli/_types.py | 10 - .../setuptools/_vendor/typing_extensions.py | 2296 ----- .../site-packages/setuptools/_vendor/zipp.py | 329 - .../site-packages/setuptools/archive_util.py | 213 - .../site-packages/setuptools/build_meta.py | 512 - .../site-packages/setuptools/cli-32.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/cli-64.exe | Bin 74752 -> 0 bytes .../site-packages/setuptools/cli-arm64.exe | Bin 137216 -> 0 bytes .../site-packages/setuptools/cli.exe | Bin 65536 -> 0 bytes .../setuptools/command/__init__.py | 12 - .../__pycache__/__init__.cpython-311.pyc | Bin 662 -> 0 bytes .../command/__pycache__/alias.cpython-311.pyc | Bin 3929 -> 0 bytes .../__pycache__/bdist_egg.cpython-311.pyc | Bin 25479 -> 0 bytes .../__pycache__/bdist_rpm.cpython-311.pyc | Bin 2217 -> 0 bytes .../command/__pycache__/build.cpython-311.pyc | Bin 7017 -> 0 bytes .../__pycache__/build_clib.cpython-311.pyc | Bin 4192 -> 0 bytes .../__pycache__/build_ext.cpython-311.pyc | Bin 22037 -> 0 bytes .../__pycache__/build_py.cpython-311.pyc | Bin 23203 -> 0 bytes .../__pycache__/develop.cpython-311.pyc | Bin 10939 -> 0 bytes .../__pycache__/dist_info.cpython-311.pyc | Bin 6593 -> 0 bytes .../__pycache__/easy_install.cpython-311.pyc | Bin 119362 -> 0 bytes .../editable_wheel.cpython-311.pyc | Bin 51989 -> 0 bytes .../__pycache__/egg_info.cpython-311.pyc | Bin 41864 -> 0 bytes .../__pycache__/install.cpython-311.pyc | Bin 6842 -> 0 bytes .../install_egg_info.cpython-311.pyc | Bin 4011 -> 0 bytes .../__pycache__/install_lib.cpython-311.pyc | Bin 6437 -> 0 bytes .../install_scripts.cpython-311.pyc | Bin 4511 -> 0 bytes .../__pycache__/py36compat.cpython-311.pyc | Bin 8063 -> 0 bytes .../__pycache__/register.cpython-311.pyc | Bin 1153 -> 0 bytes .../__pycache__/rotate.cpython-311.pyc | Bin 4213 -> 0 bytes .../__pycache__/saveopts.cpython-311.pyc | Bin 1393 -> 0 bytes .../command/__pycache__/sdist.cpython-311.pyc | Bin 13465 -> 0 bytes .../__pycache__/setopt.cpython-311.pyc | Bin 7705 -> 0 bytes .../command/__pycache__/test.cpython-311.pyc | Bin 14646 -> 0 bytes .../__pycache__/upload.cpython-311.pyc | Bin 1117 -> 0 bytes .../__pycache__/upload_docs.cpython-311.pyc | Bin 11968 -> 0 bytes .../site-packages/setuptools/command/alias.py | 78 - .../setuptools/command/bdist_egg.py | 456 - .../setuptools/command/bdist_rpm.py | 40 - .../site-packages/setuptools/command/build.py | 146 - .../setuptools/command/build_clib.py | 101 - .../setuptools/command/build_ext.py | 383 - .../setuptools/command/build_py.py | 368 - .../setuptools/command/develop.py | 194 - .../setuptools/command/dist_info.py | 118 - .../setuptools/command/easy_install.py | 2312 ----- .../setuptools/command/editable_wheel.py | 856 -- .../setuptools/command/egg_info.py | 791 -- .../setuptools/command/install.py | 139 - .../setuptools/command/install_egg_info.py | 60 - .../setuptools/command/install_lib.py | 122 - .../setuptools/command/install_scripts.py | 73 - .../setuptools/command/launcher manifest.xml | 15 - .../setuptools/command/py36compat.py | 134 - .../setuptools/command/register.py | 18 - .../setuptools/command/rotate.py | 64 - .../setuptools/command/saveopts.py | 22 - .../site-packages/setuptools/command/sdist.py | 210 - .../setuptools/command/setopt.py | 149 - .../site-packages/setuptools/command/test.py | 251 - .../setuptools/command/upload.py | 17 - .../setuptools/command/upload_docs.py | 212 - .../setuptools/config/__init__.py | 35 - .../__pycache__/__init__.cpython-311.pyc | Bin 2057 -> 0 bytes .../_apply_pyprojecttoml.cpython-311.pyc | Bin 23433 -> 0 bytes .../config/__pycache__/expand.cpython-311.pyc | Bin 28271 -> 0 bytes .../__pycache__/pyprojecttoml.cpython-311.pyc | Bin 27902 -> 0 bytes .../__pycache__/setupcfg.cpython-311.pyc | Bin 34142 -> 0 bytes .../setuptools/config/_apply_pyprojecttoml.py | 390 - .../config/_validate_pyproject/__init__.py | 34 - .../__pycache__/__init__.cpython-311.pyc | Bin 2345 -> 0 bytes .../error_reporting.cpython-311.pyc | Bin 20236 -> 0 bytes .../extra_validations.cpython-311.pyc | Bin 1894 -> 0 bytes .../fastjsonschema_exceptions.cpython-311.pyc | Bin 3269 -> 0 bytes ...fastjsonschema_validations.cpython-311.pyc | Bin 196281 -> 0 bytes .../__pycache__/formats.cpython-311.pyc | Bin 15160 -> 0 bytes .../_validate_pyproject/error_reporting.py | 318 - .../_validate_pyproject/extra_validations.py | 36 - .../fastjsonschema_exceptions.py | 51 - .../fastjsonschema_validations.py | 1052 -- .../config/_validate_pyproject/formats.py | 275 - .../site-packages/setuptools/config/expand.py | 462 - .../setuptools/config/pyprojecttoml.py | 498 - .../setuptools/config/setupcfg.py | 768 -- .../site-packages/setuptools/dep_util.py | 25 - .../site-packages/setuptools/depends.py | 176 - .../site-packages/setuptools/discovery.py | 611 -- .../site-packages/setuptools/dist.py | 1226 --- .../site-packages/setuptools/errors.py | 58 - .../site-packages/setuptools/extension.py | 148 - .../setuptools/extern/__init__.py | 83 - .../__pycache__/__init__.cpython-311.pyc | Bin 4410 -> 0 bytes .../site-packages/setuptools/glob.py | 167 - .../site-packages/setuptools/gui-32.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/gui-64.exe | Bin 75264 -> 0 bytes .../site-packages/setuptools/gui-arm64.exe | Bin 137728 -> 0 bytes .../site-packages/setuptools/gui.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/installer.py | 142 - .../site-packages/setuptools/launch.py | 36 - .../site-packages/setuptools/logging.py | 37 - .../site-packages/setuptools/monkey.py | 159 - .../site-packages/setuptools/msvc.py | 1686 ---- .../site-packages/setuptools/namespaces.py | 107 - .../site-packages/setuptools/package_index.py | 1162 --- .../site-packages/setuptools/py34compat.py | 13 - .../site-packages/setuptools/sandbox.py | 530 - .../setuptools/script (dev).tmpl | 6 - .../site-packages/setuptools/script.tmpl | 3 - .../site-packages/setuptools/unicode_utils.py | 42 - .../site-packages/setuptools/version.py | 6 - .../site-packages/setuptools/wheel.py | 231 - .../setuptools/windows_support.py | 29 - .../site-packages/socketio/__init__.py | 36 - .../__pycache__/__init__.cpython-311.pyc | Bin 1834 -> 0 bytes .../socketio/__pycache__/asgi.cpython-311.pyc | Bin 2328 -> 0 bytes .../asyncio_aiopika_manager.cpython-311.pyc | Bin 8629 -> 0 bytes .../asyncio_client.cpython-311.pyc | Bin 32012 -> 0 bytes .../asyncio_manager.cpython-311.pyc | Bin 3752 -> 0 bytes .../asyncio_namespace.cpython-311.pyc | Bin 11459 -> 0 bytes .../asyncio_pubsub_manager.cpython-311.pyc | Bin 11589 -> 0 bytes .../asyncio_redis_manager.cpython-311.pyc | Bin 6371 -> 0 bytes .../asyncio_server.cpython-311.pyc | Bin 38598 -> 0 bytes .../__pycache__/base_manager.cpython-311.pyc | Bin 11342 -> 0 bytes .../__pycache__/client.cpython-311.pyc | Bin 39196 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 2202 -> 0 bytes .../__pycache__/kafka_manager.cpython-311.pyc | Bin 4183 -> 0 bytes .../__pycache__/kombu_manager.cpython-311.pyc | Bin 8426 -> 0 bytes .../__pycache__/middleware.cpython-311.pyc | Bin 2685 -> 0 bytes .../msgpack_packet.cpython-311.pyc | Bin 1398 -> 0 bytes .../__pycache__/namespace.cpython-311.pyc | Bin 12222 -> 0 bytes .../__pycache__/packet.cpython-311.pyc | Bin 10737 -> 0 bytes .../pubsub_manager.cpython-311.pyc | Bin 10414 -> 0 bytes .../__pycache__/redis_manager.cpython-311.pyc | Bin 6614 -> 0 bytes .../__pycache__/server.cpython-311.pyc | Bin 46421 -> 0 bytes .../__pycache__/tornado.cpython-311.pyc | Bin 701 -> 0 bytes .../__pycache__/zmq_manager.cpython-311.pyc | Bin 5377 -> 0 bytes .../python3.11/site-packages/socketio/asgi.py | 42 - .../socketio/asyncio_aiopika_manager.py | 126 - .../site-packages/socketio/asyncio_client.py | 549 -- .../site-packages/socketio/asyncio_manager.py | 69 - .../socketio/asyncio_namespace.py | 231 - .../socketio/asyncio_pubsub_manager.py | 194 - .../socketio/asyncio_redis_manager.py | 107 - .../site-packages/socketio/asyncio_server.py | 619 -- .../site-packages/socketio/base_manager.py | 206 - .../site-packages/socketio/client.py | 732 -- .../site-packages/socketio/exceptions.py | 34 - .../site-packages/socketio/kafka_manager.py | 67 - .../site-packages/socketio/kombu_manager.py | 136 - .../site-packages/socketio/middleware.py | 42 - .../site-packages/socketio/msgpack_packet.py | 18 - .../site-packages/socketio/namespace.py | 214 - .../site-packages/socketio/packet.py | 190 - .../site-packages/socketio/pubsub_manager.py | 181 - .../site-packages/socketio/redis_manager.py | 117 - .../site-packages/socketio/server.py | 814 -- .../site-packages/socketio/tornado.py | 11 - .../site-packages/socketio/zmq_manager.py | 107 - .../INSTALLER | 1 - .../typing_extensions-4.7.1.dist-info/LICENSE | 279 - .../METADATA | 69 - .../typing_extensions-4.7.1.dist-info/RECORD | 7 - .../typing_extensions-4.7.1.dist-info/WHEEL | 4 - .../site-packages/typing_extensions.py | 3072 ------ .../site-packages/werkzeug/__init__.py | 6 - .../__pycache__/__init__.cpython-311.pyc | Bin 448 -> 0 bytes .../__pycache__/_internal.cpython-311.pyc | Bin 16088 -> 0 bytes .../__pycache__/_reloader.cpython-311.pyc | Bin 22687 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 36548 -> 0 bytes .../__pycache__/formparser.cpython-311.pyc | Bin 21100 -> 0 bytes .../werkzeug/__pycache__/http.cpython-311.pyc | Bin 59211 -> 0 bytes .../__pycache__/local.cpython-311.pyc | Bin 31247 -> 0 bytes .../__pycache__/security.cpython-311.pyc | Bin 8201 -> 0 bytes .../__pycache__/serving.cpython-311.pyc | Bin 49879 -> 0 bytes .../werkzeug/__pycache__/test.cpython-311.pyc | Bin 67371 -> 0 bytes .../__pycache__/testapp.cpython-311.pyc | Bin 9218 -> 0 bytes .../werkzeug/__pycache__/urls.cpython-311.pyc | Bin 60120 -> 0 bytes .../__pycache__/user_agent.cpython-311.pyc | Bin 2345 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 30284 -> 0 bytes .../werkzeug/__pycache__/wsgi.cpython-311.pyc | Bin 36750 -> 0 bytes .../site-packages/werkzeug/_internal.py | 341 - .../site-packages/werkzeug/_reloader.py | 458 - .../werkzeug/datastructures/__init__.py | 34 - .../__pycache__/__init__.cpython-311.pyc | Bin 2133 -> 0 bytes .../__pycache__/accept.cpython-311.pyc | Bin 15716 -> 0 bytes .../__pycache__/auth.cpython-311.pyc | Bin 23142 -> 0 bytes .../__pycache__/cache_control.cpython-311.pyc | Bin 8705 -> 0 bytes .../__pycache__/csp.cpython-311.pyc | Bin 5980 -> 0 bytes .../__pycache__/etag.cpython-311.pyc | Bin 5727 -> 0 bytes .../__pycache__/file_storage.cpython-311.pyc | Bin 8749 -> 0 bytes .../__pycache__/headers.cpython-311.pyc | Bin 27726 -> 0 bytes .../__pycache__/mixins.cpython-311.pyc | Bin 13162 -> 0 bytes .../__pycache__/range.cpython-311.pyc | Bin 8971 -> 0 bytes .../__pycache__/structures.cpython-311.pyc | Bin 53262 -> 0 bytes .../werkzeug/datastructures/accept.py | 326 - .../werkzeug/datastructures/accept.pyi | 54 - .../werkzeug/datastructures/auth.py | 510 - .../werkzeug/datastructures/cache_control.py | 175 - .../werkzeug/datastructures/cache_control.pyi | 109 - .../werkzeug/datastructures/csp.py | 94 - .../werkzeug/datastructures/csp.pyi | 169 - .../werkzeug/datastructures/etag.py | 95 - .../werkzeug/datastructures/etag.pyi | 30 - .../werkzeug/datastructures/file_storage.py | 196 - .../werkzeug/datastructures/file_storage.pyi | 47 - .../werkzeug/datastructures/headers.py | 566 -- .../werkzeug/datastructures/headers.pyi | 109 - .../werkzeug/datastructures/mixins.py | 242 - .../werkzeug/datastructures/mixins.pyi | 97 - .../werkzeug/datastructures/range.py | 180 - .../werkzeug/datastructures/range.pyi | 57 - .../werkzeug/datastructures/structures.py | 1006 -- .../werkzeug/datastructures/structures.pyi | 208 - .../site-packages/werkzeug/debug/__init__.py | 534 - .../__pycache__/__init__.cpython-311.pyc | Bin 24633 -> 0 bytes .../debug/__pycache__/console.cpython-311.pyc | Bin 13453 -> 0 bytes .../debug/__pycache__/repr.cpython-311.pyc | Bin 16189 -> 0 bytes .../debug/__pycache__/tbtools.cpython-311.pyc | Bin 17979 -> 0 bytes .../site-packages/werkzeug/debug/console.py | 219 - .../site-packages/werkzeug/debug/repr.py | 283 - .../werkzeug/debug/shared/ICON_LICENSE.md | 6 - .../werkzeug/debug/shared/console.png | Bin 507 -> 0 bytes .../werkzeug/debug/shared/debugger.js | 359 - .../werkzeug/debug/shared/less.png | Bin 191 -> 0 bytes .../werkzeug/debug/shared/more.png | Bin 200 -> 0 bytes .../werkzeug/debug/shared/style.css | 150 - .../site-packages/werkzeug/debug/tbtools.py | 437 - .../site-packages/werkzeug/exceptions.py | 879 -- .../site-packages/werkzeug/formparser.py | 547 -- .../python3.11/site-packages/werkzeug/http.py | 1536 --- .../site-packages/werkzeug/local.py | 643 -- .../werkzeug/middleware/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 222 -> 0 bytes .../__pycache__/dispatcher.cpython-311.pyc | Bin 3506 -> 0 bytes .../__pycache__/http_proxy.cpython-311.pyc | Bin 10991 -> 0 bytes .../__pycache__/lint.cpython-311.pyc | Bin 20818 -> 0 bytes .../__pycache__/profiler.cpython-311.pyc | Bin 7006 -> 0 bytes .../__pycache__/proxy_fix.cpython-311.pyc | Bin 7695 -> 0 bytes .../__pycache__/shared_data.cpython-311.pyc | Bin 13864 -> 0 bytes .../werkzeug/middleware/dispatcher.py | 80 - .../werkzeug/middleware/http_proxy.py | 235 - .../site-packages/werkzeug/middleware/lint.py | 420 - .../werkzeug/middleware/profiler.py | 141 - .../werkzeug/middleware/proxy_fix.py | 182 - .../werkzeug/middleware/shared_data.py | 282 - .../site-packages/werkzeug/py.typed | 0 .../werkzeug/routing/__init__.py | 133 - .../__pycache__/__init__.cpython-311.pyc | Bin 5087 -> 0 bytes .../__pycache__/converters.cpython-311.pyc | Bin 12895 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 8874 -> 0 bytes .../routing/__pycache__/map.cpython-311.pyc | Bin 42173 -> 0 bytes .../__pycache__/matcher.cpython-311.pyc | Bin 9064 -> 0 bytes .../routing/__pycache__/rules.cpython-311.pyc | Bin 41416 -> 0 bytes .../werkzeug/routing/converters.py | 270 - .../werkzeug/routing/exceptions.py | 148 - .../site-packages/werkzeug/routing/map.py | 977 -- .../site-packages/werkzeug/routing/matcher.py | 202 - .../site-packages/werkzeug/routing/rules.py | 913 -- .../site-packages/werkzeug/sansio/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 218 -> 0 bytes .../sansio/__pycache__/http.cpython-311.pyc | Bin 7008 -> 0 bytes .../__pycache__/multipart.cpython-311.pyc | Bin 15169 -> 0 bytes .../__pycache__/request.cpython-311.pyc | Bin 27510 -> 0 bytes .../__pycache__/response.cpython-311.pyc | Bin 35103 -> 0 bytes .../sansio/__pycache__/utils.cpython-311.pyc | Bin 6710 -> 0 bytes .../site-packages/werkzeug/sansio/http.py | 202 - .../werkzeug/sansio/multipart.py | 313 - .../site-packages/werkzeug/sansio/request.py | 659 -- .../site-packages/werkzeug/sansio/response.py | 789 -- .../site-packages/werkzeug/sansio/utils.py | 159 - .../site-packages/werkzeug/security.py | 172 - .../site-packages/werkzeug/serving.py | 1107 --- .../python3.11/site-packages/werkzeug/test.py | 1544 --- .../site-packages/werkzeug/testapp.py | 181 - .../python3.11/site-packages/werkzeug/urls.py | 1377 --- .../site-packages/werkzeug/user_agent.py | 47 - .../site-packages/werkzeug/utils.py | 690 -- .../werkzeug/wrappers/__init__.py | 3 - .../__pycache__/__init__.cpython-311.pyc | Bin 383 -> 0 bytes .../__pycache__/request.cpython-311.pyc | Bin 27694 -> 0 bytes .../__pycache__/response.cpython-311.pyc | Bin 37288 -> 0 bytes .../werkzeug/wrappers/request.py | 653 -- .../werkzeug/wrappers/response.py | 835 -- .../python3.11/site-packages/werkzeug/wsgi.py | 847 -- venv_flaskchat/pyvenv.cfg | 5 - 2165 files changed, 130 insertions(+), 373685 deletions(-) create mode 100644 .gitignore delete mode 100644 .vscode/settings.json create mode 100644 requirements.txt delete mode 100644 venv_flaskchat/bin/Activate.ps1 delete mode 100644 venv_flaskchat/bin/activate delete mode 100644 venv_flaskchat/bin/activate.csh delete mode 100644 venv_flaskchat/bin/activate.fish delete mode 100755 venv_flaskchat/bin/flask delete mode 100755 venv_flaskchat/bin/pip delete mode 100755 venv_flaskchat/bin/pip3 delete mode 100755 venv_flaskchat/bin/pip3.11 delete mode 120000 venv_flaskchat/bin/python delete mode 120000 venv_flaskchat/bin/python3 delete mode 120000 venv_flaskchat/bin/python3.11 delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/INSTALLER delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/LICENSE.rst delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/METADATA delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/RECORD delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/REQUESTED delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/WHEEL delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/entry_points.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/top_level.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/INSTALLER delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/LICENSE delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/METADATA delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/RECORD delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/REQUESTED delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/WHEEL delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/top_level.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/INSTALLER delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/METADATA delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/RECORD delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/WHEEL delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/top_level.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/METADATA delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/RECORD delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/INSTALLER delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/LICENSE.rst delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/METADATA delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/RECORD delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/WHEEL delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/top_level.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/__pycache__/typing_extensions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/_distutils_hack/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/_distutils_hack/override.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/annotated_types-0.5.0.dist-info/INSTALLER delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/annotated_types-0.5.0.dist-info/METADATA delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/annotated_types-0.5.0.dist-info/RECORD delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/annotated_types-0.5.0.dist-info/WHEEL delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/annotated_types-0.5.0.dist-info/licenses/LICENSE delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/annotated_types/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/annotated_types/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/annotated_types/__pycache__/test_cases.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/annotated_types/py.typed delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/annotated_types/test_cases.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/INSTALLER delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/LICENSE delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/METADATA delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/RECORD delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/WHEEL delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/top_level.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_abc.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_base.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_bidict.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_dup.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_exc.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_frozenbidict.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_frozenordered.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_iter.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_named.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_orderedbase.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_orderedbidict.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_typing.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/metadata.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/_abc.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/_base.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/_bidict.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/_dup.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/_exc.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/_frozenbidict.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/_frozenordered.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/_iter.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/_named.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/_orderedbase.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/_orderedbidict.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/_typing.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/metadata.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/bidict/py.typed delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/INSTALLER delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/LICENSE.rst delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/METADATA delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/RECORD delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/WHEEL delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/top_level.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/blinker/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/blinker/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/blinker/__pycache__/_saferef.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/blinker/__pycache__/_utilities.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/blinker/__pycache__/base.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/blinker/_saferef.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/blinker/_utilities.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/blinker/base.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/blinker/py.typed delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/INSTALLER delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/LICENSE.rst delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/METADATA delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/RECORD delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/WHEEL delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/top_level.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/_compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/_textwrap.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/_winconsole.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/core.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/decorators.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/formatting.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/globals.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/parser.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/shell_completion.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/termui.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/testing.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/types.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/utils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/_compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/_termui_impl.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/_textwrap.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/_winconsole.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/core.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/decorators.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/exceptions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/formatting.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/globals.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/parser.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/py.typed delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/shell_completion.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/termui.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/testing.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/types.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/click/utils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/distutils-precedence.pth delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/asyncio_client.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/asyncio_server.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/asyncio_socket.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/client.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/json.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/middleware.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/packet.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/payload.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/server.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/socket.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/static_files.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/aiohttp.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/asgi.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/eventlet.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/gevent.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/gevent_uwsgi.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/sanic.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/threading.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/tornado.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/aiohttp.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/asgi.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/eventlet.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/gevent.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/gevent_uwsgi.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/sanic.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/threading.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/tornado.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/asyncio_client.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/asyncio_server.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/asyncio_socket.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/client.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/exceptions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/json.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/middleware.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/packet.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/payload.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/server.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/socket.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/engineio/static_files.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__main__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/__main__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/app.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/blueprints.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/cli.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/config.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/ctx.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/debughelpers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/globals.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/helpers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/logging.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/scaffold.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/sessions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/signals.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/templating.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/testing.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/typing.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/views.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/wrappers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/app.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/blueprints.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/cli.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/config.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/ctx.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/debughelpers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/globals.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/helpers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/json/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/json/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/json/__pycache__/provider.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/json/__pycache__/tag.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/json/provider.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/json/tag.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/logging.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/py.typed delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/scaffold.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/sessions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/signals.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/templating.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/testing.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/typing.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/views.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask/wrappers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask_socketio/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask_socketio/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask_socketio/__pycache__/namespace.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask_socketio/__pycache__/test_client.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask_socketio/namespace.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/flask_socketio/test_client.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/INSTALLER delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/METADATA delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/RECORD delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/WHEEL delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__pycache__/_json.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__pycache__/encoding.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__pycache__/exc.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__pycache__/serializer.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__pycache__/signer.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__pycache__/timed.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__pycache__/url_safe.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous/_json.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous/encoding.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous/exc.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous/py.typed delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous/serializer.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous/signer.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous/timed.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/itsdangerous/url_safe.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/_identifier.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/async_utils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/bccache.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/compiler.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/constants.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/debug.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/defaults.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/environment.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/ext.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/filters.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/idtracking.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/lexer.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/loaders.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/meta.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/nativetypes.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/nodes.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/optimizer.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/parser.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/runtime.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/sandbox.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/tests.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/utils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/visitor.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/_identifier.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/async_utils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/bccache.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/compiler.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/constants.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/debug.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/defaults.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/environment.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/exceptions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/ext.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/filters.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/idtracking.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/lexer.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/loaders.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/meta.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/nativetypes.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/nodes.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/optimizer.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/parser.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/py.typed delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/runtime.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/sandbox.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/tests.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/utils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/jinja2/visitor.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/markupsafe/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/markupsafe/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/markupsafe/__pycache__/_native.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/markupsafe/_native.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/markupsafe/_speedups.c delete mode 100755 venv_flaskchat/lib/python3.11/site-packages/markupsafe/_speedups.cpython-311-darwin.so delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/markupsafe/_speedups.pyi delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/markupsafe/py.typed delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip-23.0.1.dist-info/INSTALLER delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip-23.0.1.dist-info/LICENSE.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip-23.0.1.dist-info/METADATA delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip-23.0.1.dist-info/RECORD delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip-23.0.1.dist-info/REQUESTED delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip-23.0.1.dist-info/WHEEL delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip-23.0.1.dist-info/entry_points.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip-23.0.1.dist-info/top_level.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/__main__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/__pip-runner__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/__pycache__/__main__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/build_env.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cache.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/autocompletion.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/base_command.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/command_context.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/main.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/main_parser.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/parser.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/progress_bars.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/req_command.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/spinners.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/cli/status_codes.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/cache.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/check.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/completion.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/configuration.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/debug.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/download.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/freeze.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/hash.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/help.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/index.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/inspect.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/install.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/list.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/search.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/show.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/uninstall.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/commands/wheel.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/configuration.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/distributions/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/distributions/base.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/distributions/installed.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/distributions/sdist.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/distributions/wheel.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/exceptions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/index/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/index/collector.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/index/package_finder.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/index/sources.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/locations/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/locations/_distutils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/locations/_sysconfig.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/locations/base.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/main.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/metadata/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/metadata/_json.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/metadata/base.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_dists.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_envs.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/metadata/pkg_resources.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/__pycache__/scheme.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/candidate.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/direct_url.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/format_control.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/index.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/installation_report.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/link.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/scheme.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/search_scope.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/selection_prefs.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/target_python.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/models/wheel.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/network/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/network/__pycache__/session.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/network/__pycache__/utils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/network/auth.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/network/cache.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/network/download.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/network/lazy_wheel.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/network/session.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/network/utils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/network/xmlrpc.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/build/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/build/build_tracker.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/build/metadata.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/build/metadata_editable.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/build/metadata_legacy.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/build/wheel.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/build/wheel_editable.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/build/wheel_legacy.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/check.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/freeze.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/install/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/install/editable_legacy.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/install/legacy.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/install/wheel.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/operations/prepare.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/pyproject.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/req/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/req/constructors.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/req/req_file.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/req/req_install.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/req/req_set.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/req/req_uninstall.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/base.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/legacy/resolver.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/base.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/candidates.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/factory.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/provider.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/reporter.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/requirements.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/resolver.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/self_outdated_check.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/_log.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/models.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/_log.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/appdirs.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/compatibility_tags.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/datetime.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/direct_url_helpers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/distutils_args.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/egg_link.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/encoding.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/entrypoints.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/filesystem.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/filetypes.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/glibc.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/hashes.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/inject_securetransport.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/logging.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/misc.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/models.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/packaging.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/subprocess.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/unpacking.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/urls.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/virtualenv.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/utils/wheel.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/vcs/bazaar.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/vcs/git.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/vcs/mercurial.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/vcs/versioncontrol.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_internal/wheel_builder.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/__pycache__/six.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/_cmd.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/adapter.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/cache.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/controller.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/filewrapper.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/heuristics.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/serialize.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/certifi/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/certifi/__main__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/certifi/cacert.pem delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/certifi/core.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/big5freq.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/big5prober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/chardistribution.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/charsetgroupprober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/charsetprober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/cli/chardetect.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/codingstatemachine.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/codingstatemachinedict.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/cp949prober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/enums.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/escprober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/escsm.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/eucjpprober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/euckrfreq.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/euckrprober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/euctwfreq.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/euctwprober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/gb2312freq.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/gb2312prober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/hebrewprober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/jisfreq.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/johabfreq.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/johabprober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/jpcntx.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/langbulgarianmodel.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/langgreekmodel.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/langhebrewmodel.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/langhungarianmodel.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/langrussianmodel.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/langthaimodel.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/langturkishmodel.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/latin1prober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/macromanprober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/mbcharsetprober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/mbcsgroupprober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/mbcssm.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/languages.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/resultdict.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/sbcharsetprober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/sbcsgroupprober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/sjisprober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/universaldetector.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/utf1632prober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/utf8prober.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/chardet/version.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/ansi.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/ansitowin32.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/initialise.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/tests/ansi_test.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/tests/initialise_test.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/tests/isatty_test.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/tests/utils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/tests/winterm_test.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/win32.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/colorama/winterm.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/database.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/index.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/locators.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/manifest.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/markers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/metadata.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/resources.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/scripts.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/t32.exe delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/t64-arm.exe delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/t64.exe delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/util.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/version.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/w32.exe delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/w64-arm.exe delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/w64.exe delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distlib/wheel.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distro/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distro/__main__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/distro/distro.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/idna/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/idna/codec.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/idna/compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/idna/core.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/idna/idnadata.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/idna/intranges.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/idna/package_data.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/idna/uts46data.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/msgpack/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/msgpack/exceptions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/msgpack/ext.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/msgpack/fallback.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/__about__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/_manylinux.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/_musllinux.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/_structures.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/markers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/requirements.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/specifiers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/tags.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/utils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/packaging/version.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pkg_resources/py31compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/platformdirs/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/platformdirs/__main__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/platformdirs/android.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/platformdirs/api.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/platformdirs/macos.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/platformdirs/unix.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/platformdirs/version.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/platformdirs/windows.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/__main__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/cmdline.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/console.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/filter.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/filters/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatter.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/_mapping.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/bbcode.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/groff.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/html.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/img.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/irc.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/latex.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/other.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/rtf.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/svg.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/terminal.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/terminal256.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/lexer.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/_mapping.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/python.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/modeline.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/plugin.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/regexopt.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/scanner.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/sphinxext.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/style.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/token.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/unistring.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pygments/util.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/actions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/common.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/core.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/diagram/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/exceptions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/helpers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/results.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/testing.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/unicode.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyparsing/util.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_impl.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/__version__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/_internal_utils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/adapters.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/api.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/auth.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/certs.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/cookies.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/exceptions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/help.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/hooks.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/models.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/packages.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/sessions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/status_codes.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/structures.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/requests/utils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/resolvelib/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/resolvelib/providers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/resolvelib/reporters.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/resolvelib/structs.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__main__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/text.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_cell_widths.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_codes.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_replace.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_export_format.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_extension.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_inspect.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_log_render.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_loop.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_null_file.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_palettes.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_pick.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_ratio.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_spinners.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_stack.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_timer.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_win32_console.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_windows.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_windows_renderer.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/_wrap.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/abc.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/align.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/ansi.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/bar.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/box.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/cells.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/color.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/color_triplet.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/columns.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/console.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/constrain.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/containers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/control.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/default_styles.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/diagnose.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/emoji.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/errors.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/file_proxy.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/filesize.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/highlighter.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/json.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/jupyter.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/layout.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/live.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/live_render.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/logging.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/markup.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/measure.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/padding.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/pager.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/palette.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/panel.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/pretty.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/progress.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/progress_bar.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/prompt.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/protocol.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/region.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/repr.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/rule.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/scope.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/screen.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/segment.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/spinner.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/status.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/style.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/styled.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/syntax.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/table.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/terminal_theme.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/text.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/theme.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/themes.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/traceback.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/rich/tree.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/six.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/_asyncio.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/_utils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/after.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/before.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/before_sleep.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/nap.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/retry.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/stop.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/tornadoweb.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tenacity/wait.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tomli/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tomli/_parser.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tomli/_re.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/tomli/_types.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/typing_extensions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/_collections.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/_version.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/connection.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/connectionpool.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/appengine.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/securetransport.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/socks.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/exceptions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/fields.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/filepost.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/six.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/poolmanager.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/request.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/response.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/connection.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/proxy.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/queue.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/request.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/response.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/retry.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssl_.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssltransport.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/timeout.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/url.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/urllib3/util/wait.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/vendor.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/webencodings/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/webencodings/labels.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/webencodings/mklabels.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/webencodings/tests.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/_vendor/webencodings/x_user_defined.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pip/py.typed delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/typing_extensions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/zipp.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_adapters.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_common.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_itertools.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_legacy.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/abc.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/readers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/simple.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/context.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/functools.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/context.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/functools.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/text/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/more.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/more.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/recipes.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_elffile.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_parser.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_tokenizer.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_elffile.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_manylinux.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_musllinux.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_parser.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_structures.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_tokenizer.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/markers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/requirements.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/specifiers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/tags.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/utils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/version.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__main__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/android.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/api.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/version.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/android.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/api.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/macos.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/unix.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/version.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/windows.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/typing_extensions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/_vendor/zipp.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/extern/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic-2.0.3.dist-info/INSTALLER delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic-2.0.3.dist-info/METADATA delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic-2.0.3.dist-info/RECORD delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic-2.0.3.dist-info/REQUESTED delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic-2.0.3.dist-info/WHEEL delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic-2.0.3.dist-info/licenses/LICENSE delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/_migration.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/alias_generators.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/class_validators.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/color.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/config.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/dataclasses.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/datetime_parse.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/decorator.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/env_settings.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/error_wrappers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/errors.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/fields.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/functional_serializers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/functional_validators.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/generics.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/json.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/json_schema.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/main.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/mypy.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/networks.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/parse.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/root_model.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/schema.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/tools.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/type_adapter.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/types.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/typing.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/utils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/validate_call.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/validators.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/version.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/__pycache__/warnings.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_annotated_handlers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_config.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_core_metadata.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_core_utils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_dataclasses.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_decorators.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_decorators_v1.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_discriminated_union.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_fields.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_forward_ref.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_generate_schema.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_generics.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_internal_dataclass.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_known_annotated_metadata.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_mock_validator.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_model_construction.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_repr.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_schema_generation_shared.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_std_types_schema.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_typing_extra.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_utils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_validate_call.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_validators.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_annotated_handlers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_config.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_core_metadata.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_dataclasses.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_decorators.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_decorators_v1.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_fields.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_forward_ref.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_generics.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_internal_dataclass.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_known_annotated_metadata.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_mock_validator.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_repr.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_std_types_schema.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_utils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_internal/_validators.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/_migration.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/alias_generators.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/class_validators.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/color.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/config.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/dataclasses.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/datetime_parse.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/decorator.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/deprecated/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/class_validators.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/config.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/copy_internals.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/decorator.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/json.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/parse.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/tools.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/deprecated/class_validators.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/deprecated/config.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/deprecated/copy_internals.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/deprecated/decorator.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/deprecated/json.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/deprecated/parse.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/deprecated/tools.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/env_settings.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/error_wrappers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/errors.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/fields.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/functional_serializers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/functional_validators.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/generics.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/json.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/json_schema.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/main.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/mypy.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/networks.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/parse.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/py.typed delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/root_model.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/schema.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/tools.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/type_adapter.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/types.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/typing.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/utils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/_hypothesis_plugin.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/annotated_types.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/class_validators.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/color.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/config.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/dataclasses.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/datetime_parse.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/decorator.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/env_settings.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/error_wrappers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/errors.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/fields.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/generics.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/json.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/main.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/mypy.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/networks.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/parse.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/schema.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/tools.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/types.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/typing.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/utils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/validators.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/__pycache__/version.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/_hypothesis_plugin.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/annotated_types.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/class_validators.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/color.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/config.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/dataclasses.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/datetime_parse.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/decorator.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/env_settings.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/error_wrappers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/errors.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/fields.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/generics.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/json.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/main.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/mypy.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/networks.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/parse.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/py.typed delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/schema.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/tools.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/types.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/typing.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/utils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/validators.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/v1/version.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/validate_call.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/validators.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/version.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic/warnings.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic_core-2.3.0.dist-info/INSTALLER delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic_core-2.3.0.dist-info/METADATA delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic_core-2.3.0.dist-info/RECORD delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic_core-2.3.0.dist-info/WHEEL delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic_core-2.3.0.dist-info/license_files/LICENSE delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic_core/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic_core/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic_core/__pycache__/core_schema.cpython-311.pyc delete mode 100755 venv_flaskchat/lib/python3.11/site-packages/pydantic_core/_pydantic_core.cpython-311-darwin.so delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic_core/_pydantic_core.pyi delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic_core/core_schema.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/pydantic_core/py.typed delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/python_engineio-4.4.1.dist-info/INSTALLER delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/python_engineio-4.4.1.dist-info/LICENSE delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/python_engineio-4.4.1.dist-info/METADATA delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/python_engineio-4.4.1.dist-info/RECORD delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/python_engineio-4.4.1.dist-info/WHEEL delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/python_engineio-4.4.1.dist-info/top_level.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/python_socketio-5.8.0.dist-info/INSTALLER delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/python_socketio-5.8.0.dist-info/LICENSE delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/python_socketio-5.8.0.dist-info/METADATA delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/python_socketio-5.8.0.dist-info/RECORD delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/python_socketio-5.8.0.dist-info/WHEEL delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/python_socketio-5.8.0.dist-info/top_level.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools-67.6.1.dist-info/INSTALLER delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools-67.6.1.dist-info/LICENSE delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools-67.6.1.dist-info/METADATA delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools-67.6.1.dist-info/RECORD delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools-67.6.1.dist-info/REQUESTED delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools-67.6.1.dist-info/WHEEL delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools-67.6.1.dist-info/entry_points.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools-67.6.1.dist-info/top_level.txt delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/_entry_points.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/_imp.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/_importlib.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/_itertools.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/_normalization.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/_path.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/_reqs.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/archive_util.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/build_meta.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/dep_util.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/depends.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/discovery.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/dist.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/errors.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/extension.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/glob.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/installer.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/launch.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/logging.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/monkey.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/msvc.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/namespaces.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/package_index.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/py34compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/sandbox.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/unicode_utils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/version.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/wheel.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/__pycache__/windows_support.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_deprecation_warning.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_collections.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_functools.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_log.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_macos_compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/config.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/core.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/debug.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dist.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/errors.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/extension.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/log.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/py39compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/util.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/version.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/_collections.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/_functools.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/_log.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/_macos_compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/_msvccompiler.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/archive_util.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/bcppcompiler.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/ccompiler.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/cmd.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/_framework_compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/_framework_compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/bdist.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/bdist_dumb.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/bdist_rpm.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/build.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/build_clib.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/build_ext.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/build_py.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/build_scripts.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/check.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/clean.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/config.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/install.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/install_data.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/install_egg_info.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/install_headers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/install_lib.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/install_scripts.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/py37compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/register.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/sdist.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/command/upload.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/config.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/core.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/cygwinccompiler.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/debug.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/dep_util.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/dir_util.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/dist.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/errors.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/extension.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/fancy_getopt.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/file_util.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/filelist.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/log.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/msvc9compiler.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/msvccompiler.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/py38compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/py39compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/spawn.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/sysconfig.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/text_file.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/unixccompiler.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/util.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/version.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_distutils/versionpredicate.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_entry_points.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_imp.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_importlib.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_itertools.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_normalization.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_path.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_reqs.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/typing_extensions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/zipp.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_adapters.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_collections.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_functools.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_itertools.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_meta.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_py39compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_text.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_collections.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_functools.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_meta.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_py39compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_text.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_adapters.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_common.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_itertools.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_legacy.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/abc.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/readers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/simple.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/context.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/functools.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/jaraco/context.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/jaraco/functools.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/jaraco/text/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/more.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/recipes.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/ordered_set.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_elffile.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_parser.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_tokenizer.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/_elffile.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/_manylinux.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/_musllinux.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/_parser.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/_structures.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/_tokenizer.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/markers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/requirements.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/specifiers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/tags.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/utils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/packaging/version.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/tomli/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_parser.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_re.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_types.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/tomli/_parser.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/tomli/_re.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/tomli/_types.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/typing_extensions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/_vendor/zipp.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/archive_util.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/build_meta.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/cli-32.exe delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/cli-64.exe delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/cli-arm64.exe delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/cli.exe delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/alias.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/build.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/build_clib.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/build_ext.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/build_py.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/develop.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/dist_info.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/easy_install.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/editable_wheel.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/egg_info.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/install.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/install_lib.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/install_scripts.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/py36compat.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/register.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/rotate.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/saveopts.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/sdist.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/setopt.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/test.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/upload.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/__pycache__/upload_docs.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/alias.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/bdist_egg.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/bdist_rpm.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/build.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/build_clib.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/build_ext.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/build_py.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/develop.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/dist_info.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/easy_install.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/editable_wheel.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/egg_info.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/install.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/install_egg_info.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/install_lib.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/install_scripts.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/launcher manifest.xml delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/py36compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/register.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/rotate.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/saveopts.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/sdist.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/setopt.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/test.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/upload.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/command/upload_docs.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/__pycache__/_apply_pyprojecttoml.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/__pycache__/expand.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/__pycache__/pyprojecttoml.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/__pycache__/setupcfg.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/_apply_pyprojecttoml.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/error_reporting.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/extra_validations.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_exceptions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_validations.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/formats.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/error_reporting.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/extra_validations.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/formats.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/expand.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/pyprojecttoml.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/config/setupcfg.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/dep_util.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/depends.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/discovery.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/dist.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/errors.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/extension.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/extern/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/extern/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/glob.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/gui-32.exe delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/gui-64.exe delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/gui-arm64.exe delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/gui.exe delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/installer.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/launch.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/logging.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/monkey.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/msvc.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/namespaces.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/package_index.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/py34compat.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/sandbox.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/script (dev).tmpl delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/script.tmpl delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/unicode_utils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/version.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/wheel.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/setuptools/windows_support.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/asgi.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/asyncio_aiopika_manager.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/asyncio_client.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/asyncio_manager.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/asyncio_namespace.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/asyncio_pubsub_manager.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/asyncio_redis_manager.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/asyncio_server.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/base_manager.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/client.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/kafka_manager.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/kombu_manager.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/middleware.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/msgpack_packet.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/namespace.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/packet.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/pubsub_manager.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/redis_manager.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/server.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/tornado.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/__pycache__/zmq_manager.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/asgi.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/asyncio_aiopika_manager.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/asyncio_client.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/asyncio_manager.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/asyncio_namespace.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/asyncio_pubsub_manager.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/asyncio_redis_manager.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/asyncio_server.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/base_manager.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/client.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/exceptions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/kafka_manager.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/kombu_manager.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/middleware.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/msgpack_packet.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/namespace.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/packet.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/pubsub_manager.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/redis_manager.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/server.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/tornado.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/socketio/zmq_manager.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/typing_extensions-4.7.1.dist-info/INSTALLER delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/typing_extensions-4.7.1.dist-info/LICENSE delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/typing_extensions-4.7.1.dist-info/METADATA delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/typing_extensions-4.7.1.dist-info/RECORD delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/typing_extensions-4.7.1.dist-info/WHEEL delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/typing_extensions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/__pycache__/_internal.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/__pycache__/_reloader.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/__pycache__/formparser.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/__pycache__/http.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/__pycache__/local.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/__pycache__/security.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/__pycache__/serving.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/__pycache__/test.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/__pycache__/testapp.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/__pycache__/urls.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/__pycache__/user_agent.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/__pycache__/utils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/__pycache__/wsgi.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/_internal.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/_reloader.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/accept.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/auth.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/cache_control.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/csp.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/etag.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/file_storage.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/headers.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/mixins.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/range.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/structures.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/accept.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/accept.pyi delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/auth.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/cache_control.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/cache_control.pyi delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/csp.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/csp.pyi delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/etag.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/etag.pyi delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/file_storage.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/file_storage.pyi delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/headers.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/headers.pyi delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/mixins.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/mixins.pyi delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/range.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/range.pyi delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/structures.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/datastructures/structures.pyi delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/debug/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/debug/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/debug/__pycache__/console.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/debug/__pycache__/repr.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/debug/console.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/debug/repr.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/debug/shared/ICON_LICENSE.md delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/debug/shared/console.png delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/debug/shared/debugger.js delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/debug/shared/less.png delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/debug/shared/more.png delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/debug/shared/style.css delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/debug/tbtools.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/exceptions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/formparser.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/http.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/local.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/middleware/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/lint.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/middleware/dispatcher.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/middleware/http_proxy.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/middleware/lint.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/middleware/profiler.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/middleware/proxy_fix.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/middleware/shared_data.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/py.typed delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/routing/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/routing/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/routing/__pycache__/converters.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/routing/__pycache__/exceptions.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/routing/__pycache__/map.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/routing/__pycache__/matcher.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/routing/__pycache__/rules.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/routing/converters.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/routing/exceptions.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/routing/map.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/routing/matcher.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/routing/rules.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/sansio/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/http.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/request.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/response.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/utils.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/sansio/http.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/sansio/multipart.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/sansio/request.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/sansio/response.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/sansio/utils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/security.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/serving.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/test.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/testapp.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/urls.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/user_agent.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/utils.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/wrappers/__init__.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/wrappers/__pycache__/request.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/wrappers/__pycache__/response.cpython-311.pyc delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/wrappers/request.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/wrappers/response.py delete mode 100644 venv_flaskchat/lib/python3.11/site-packages/werkzeug/wsgi.py delete mode 100644 venv_flaskchat/pyvenv.cfg diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3075904 --- /dev/null +++ b/.gitignore @@ -0,0 +1,127 @@ +# .gitignore template by: https://gist.github.com/GhostofGoes/94580e76cd251972b15b4821c8a06f59#file-gitignore + +# Editors +.vscode/ +.idea/ + +# Vagrant +.vagrant/ + +# Mac/OSX +.DS_Store + +# Windows +Thumbs.db + +# Source for the following rules: https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 5c80254..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "[python]": { - "editor.defaultFormatter": "ms-python.autopep8" - }, - "python.formatting.provider": "none" -} diff --git a/__pycache__/utils.cpython-311.pyc b/__pycache__/utils.cpython-311.pyc index e681ead8ef61e6ffcc89c66803292cc2ac7f8a57..0fc9851e76b4a4e6e11317848b0608d1f3314d6f 100644 GIT binary patch delta 77 zcmbQnzKES?IWI340}#v;Z%WqqH=sEHN)7wJblss6^i-wK%&Z fzd+wTv&5q`N#89eu{hf~BeBG>pkVW5#>0#NrCSAcIWI340}z~a*pjl5XCb4So_=U?YEiL%Zfag)QA%!NQDRS!Qan TzFSUWakg_tV#((FjE5NkmU|XZ diff --git a/main.py b/main.py index e410070..7e9c34c 100644 --- a/main.py +++ b/main.py @@ -114,4 +114,4 @@ def handle_disconnect(): if __name__ == '__main__': - socketio.run(app, debug=True) + socketio.run(app, debug=True, allow_unsafe_werkzeug=True) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..d41d3b7 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +Flask==2.3.3 +flask-socketio \ No newline at end of file diff --git a/venv_flaskchat/bin/Activate.ps1 b/venv_flaskchat/bin/Activate.ps1 deleted file mode 100644 index b49d77b..0000000 --- a/venv_flaskchat/bin/Activate.ps1 +++ /dev/null @@ -1,247 +0,0 @@ -<# -.Synopsis -Activate a Python virtual environment for the current PowerShell session. - -.Description -Pushes the python executable for a virtual environment to the front of the -$Env:PATH environment variable and sets the prompt to signify that you are -in a Python virtual environment. Makes use of the command line switches as -well as the `pyvenv.cfg` file values present in the virtual environment. - -.Parameter VenvDir -Path to the directory that contains the virtual environment to activate. The -default value for this is the parent of the directory that the Activate.ps1 -script is located within. - -.Parameter Prompt -The prompt prefix to display when this virtual environment is activated. By -default, this prompt is the name of the virtual environment folder (VenvDir) -surrounded by parentheses and followed by a single space (ie. '(.venv) '). - -.Example -Activate.ps1 -Activates the Python virtual environment that contains the Activate.ps1 script. - -.Example -Activate.ps1 -Verbose -Activates the Python virtual environment that contains the Activate.ps1 script, -and shows extra information about the activation as it executes. - -.Example -Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv -Activates the Python virtual environment located in the specified location. - -.Example -Activate.ps1 -Prompt "MyPython" -Activates the Python virtual environment that contains the Activate.ps1 script, -and prefixes the current prompt with the specified string (surrounded in -parentheses) while the virtual environment is active. - -.Notes -On Windows, it may be required to enable this Activate.ps1 script by setting the -execution policy for the user. You can do this by issuing the following PowerShell -command: - -PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser - -For more information on Execution Policies: -https://go.microsoft.com/fwlink/?LinkID=135170 - -#> -Param( - [Parameter(Mandatory = $false)] - [String] - $VenvDir, - [Parameter(Mandatory = $false)] - [String] - $Prompt -) - -<# Function declarations --------------------------------------------------- #> - -<# -.Synopsis -Remove all shell session elements added by the Activate script, including the -addition of the virtual environment's Python executable from the beginning of -the PATH variable. - -.Parameter NonDestructive -If present, do not remove this function from the global namespace for the -session. - -#> -function global:deactivate ([switch]$NonDestructive) { - # Revert to original values - - # The prior prompt: - if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { - Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt - Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT - } - - # The prior PYTHONHOME: - if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { - Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME - Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME - } - - # The prior PATH: - if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { - Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH - Remove-Item -Path Env:_OLD_VIRTUAL_PATH - } - - # Just remove the VIRTUAL_ENV altogether: - if (Test-Path -Path Env:VIRTUAL_ENV) { - Remove-Item -Path env:VIRTUAL_ENV - } - - # Just remove VIRTUAL_ENV_PROMPT altogether. - if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { - Remove-Item -Path env:VIRTUAL_ENV_PROMPT - } - - # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: - if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { - Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force - } - - # Leave deactivate function in the global namespace if requested: - if (-not $NonDestructive) { - Remove-Item -Path function:deactivate - } -} - -<# -.Description -Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the -given folder, and returns them in a map. - -For each line in the pyvenv.cfg file, if that line can be parsed into exactly -two strings separated by `=` (with any amount of whitespace surrounding the =) -then it is considered a `key = value` line. The left hand string is the key, -the right hand is the value. - -If the value starts with a `'` or a `"` then the first and last character is -stripped from the value before being captured. - -.Parameter ConfigDir -Path to the directory that contains the `pyvenv.cfg` file. -#> -function Get-PyVenvConfig( - [String] - $ConfigDir -) { - Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" - - # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). - $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue - - # An empty map will be returned if no config file is found. - $pyvenvConfig = @{ } - - if ($pyvenvConfigPath) { - - Write-Verbose "File exists, parse `key = value` lines" - $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath - - $pyvenvConfigContent | ForEach-Object { - $keyval = $PSItem -split "\s*=\s*", 2 - if ($keyval[0] -and $keyval[1]) { - $val = $keyval[1] - - # Remove extraneous quotations around a string value. - if ("'""".Contains($val.Substring(0, 1))) { - $val = $val.Substring(1, $val.Length - 2) - } - - $pyvenvConfig[$keyval[0]] = $val - Write-Verbose "Adding Key: '$($keyval[0])'='$val'" - } - } - } - return $pyvenvConfig -} - - -<# Begin Activate script --------------------------------------------------- #> - -# Determine the containing directory of this script -$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition -$VenvExecDir = Get-Item -Path $VenvExecPath - -Write-Verbose "Activation script is located in path: '$VenvExecPath'" -Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" -Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" - -# Set values required in priority: CmdLine, ConfigFile, Default -# First, get the location of the virtual environment, it might not be -# VenvExecDir if specified on the command line. -if ($VenvDir) { - Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" -} -else { - Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." - $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") - Write-Verbose "VenvDir=$VenvDir" -} - -# Next, read the `pyvenv.cfg` file to determine any required value such -# as `prompt`. -$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir - -# Next, set the prompt from the command line, or the config file, or -# just use the name of the virtual environment folder. -if ($Prompt) { - Write-Verbose "Prompt specified as argument, using '$Prompt'" -} -else { - Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" - if ($pyvenvCfg -and $pyvenvCfg['prompt']) { - Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" - $Prompt = $pyvenvCfg['prompt']; - } - else { - Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" - Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" - $Prompt = Split-Path -Path $venvDir -Leaf - } -} - -Write-Verbose "Prompt = '$Prompt'" -Write-Verbose "VenvDir='$VenvDir'" - -# Deactivate any currently active virtual environment, but leave the -# deactivate function in place. -deactivate -nondestructive - -# Now set the environment variable VIRTUAL_ENV, used by many tools to determine -# that there is an activated venv. -$env:VIRTUAL_ENV = $VenvDir - -if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { - - Write-Verbose "Setting prompt to '$Prompt'" - - # Set the prompt to include the env name - # Make sure _OLD_VIRTUAL_PROMPT is global - function global:_OLD_VIRTUAL_PROMPT { "" } - Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT - New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt - - function global:prompt { - Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " - _OLD_VIRTUAL_PROMPT - } - $env:VIRTUAL_ENV_PROMPT = $Prompt -} - -# Clear PYTHONHOME -if (Test-Path -Path Env:PYTHONHOME) { - Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME - Remove-Item -Path Env:PYTHONHOME -} - -# Add the venv to the PATH -Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH -$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/venv_flaskchat/bin/activate b/venv_flaskchat/bin/activate deleted file mode 100644 index 344cbd3..0000000 --- a/venv_flaskchat/bin/activate +++ /dev/null @@ -1,69 +0,0 @@ -# This file must be used with "source bin/activate" *from bash* -# you cannot run it directly - -deactivate () { - # reset old environment variables - if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then - PATH="${_OLD_VIRTUAL_PATH:-}" - export PATH - unset _OLD_VIRTUAL_PATH - fi - if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then - PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" - export PYTHONHOME - unset _OLD_VIRTUAL_PYTHONHOME - fi - - # This should detect bash and zsh, which have a hash command that must - # be called to get it to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected - if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r 2> /dev/null - fi - - if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then - PS1="${_OLD_VIRTUAL_PS1:-}" - export PS1 - unset _OLD_VIRTUAL_PS1 - fi - - unset VIRTUAL_ENV - unset VIRTUAL_ENV_PROMPT - if [ ! "${1:-}" = "nondestructive" ] ; then - # Self destruct! - unset -f deactivate - fi -} - -# unset irrelevant variables -deactivate nondestructive - -VIRTUAL_ENV="/Users/menardmaranan/Movies/FlaskChat/venv_flaskchat" -export VIRTUAL_ENV - -_OLD_VIRTUAL_PATH="$PATH" -PATH="$VIRTUAL_ENV/bin:$PATH" -export PATH - -# unset PYTHONHOME if set -# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) -# could use `if (set -u; : $PYTHONHOME) ;` in bash -if [ -n "${PYTHONHOME:-}" ] ; then - _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" - unset PYTHONHOME -fi - -if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then - _OLD_VIRTUAL_PS1="${PS1:-}" - PS1="(venv_flaskchat) ${PS1:-}" - export PS1 - VIRTUAL_ENV_PROMPT="(venv_flaskchat) " - export VIRTUAL_ENV_PROMPT -fi - -# This should detect bash and zsh, which have a hash command that must -# be called to get it to forget past commands. Without forgetting -# past commands the $PATH changes we made may not be respected -if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r 2> /dev/null -fi diff --git a/venv_flaskchat/bin/activate.csh b/venv_flaskchat/bin/activate.csh deleted file mode 100644 index e256bfe..0000000 --- a/venv_flaskchat/bin/activate.csh +++ /dev/null @@ -1,26 +0,0 @@ -# This file must be used with "source bin/activate.csh" *from csh*. -# You cannot run it directly. -# Created by Davide Di Blasi . -# Ported to Python 3.3 venv by Andrew Svetlov - -alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' - -# Unset irrelevant variables. -deactivate nondestructive - -setenv VIRTUAL_ENV "/Users/menardmaranan/Movies/FlaskChat/venv_flaskchat" - -set _OLD_VIRTUAL_PATH="$PATH" -setenv PATH "$VIRTUAL_ENV/bin:$PATH" - - -set _OLD_VIRTUAL_PROMPT="$prompt" - -if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then - set prompt = "(venv_flaskchat) $prompt" - setenv VIRTUAL_ENV_PROMPT "(venv_flaskchat) " -endif - -alias pydoc python -m pydoc - -rehash diff --git a/venv_flaskchat/bin/activate.fish b/venv_flaskchat/bin/activate.fish deleted file mode 100644 index ef15994..0000000 --- a/venv_flaskchat/bin/activate.fish +++ /dev/null @@ -1,69 +0,0 @@ -# This file must be used with "source /bin/activate.fish" *from fish* -# (https://fishshell.com/); you cannot run it directly. - -function deactivate -d "Exit virtual environment and return to normal shell environment" - # reset old environment variables - if test -n "$_OLD_VIRTUAL_PATH" - set -gx PATH $_OLD_VIRTUAL_PATH - set -e _OLD_VIRTUAL_PATH - end - if test -n "$_OLD_VIRTUAL_PYTHONHOME" - set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME - set -e _OLD_VIRTUAL_PYTHONHOME - end - - if test -n "$_OLD_FISH_PROMPT_OVERRIDE" - set -e _OLD_FISH_PROMPT_OVERRIDE - # prevents error when using nested fish instances (Issue #93858) - if functions -q _old_fish_prompt - functions -e fish_prompt - functions -c _old_fish_prompt fish_prompt - functions -e _old_fish_prompt - end - end - - set -e VIRTUAL_ENV - set -e VIRTUAL_ENV_PROMPT - if test "$argv[1]" != "nondestructive" - # Self-destruct! - functions -e deactivate - end -end - -# Unset irrelevant variables. -deactivate nondestructive - -set -gx VIRTUAL_ENV "/Users/menardmaranan/Movies/FlaskChat/venv_flaskchat" - -set -gx _OLD_VIRTUAL_PATH $PATH -set -gx PATH "$VIRTUAL_ENV/bin" $PATH - -# Unset PYTHONHOME if set. -if set -q PYTHONHOME - set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME - set -e PYTHONHOME -end - -if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" - # fish uses a function instead of an env var to generate the prompt. - - # Save the current fish_prompt function as the function _old_fish_prompt. - functions -c fish_prompt _old_fish_prompt - - # With the original prompt function renamed, we can override with our own. - function fish_prompt - # Save the return status of the last command. - set -l old_status $status - - # Output the venv prompt; color taken from the blue of the Python logo. - printf "%s%s%s" (set_color 4B8BBE) "(venv_flaskchat) " (set_color normal) - - # Restore the return status of the previous command. - echo "exit $old_status" | . - # Output the original/"old" prompt. - _old_fish_prompt - end - - set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" - set -gx VIRTUAL_ENV_PROMPT "(venv_flaskchat) " -end diff --git a/venv_flaskchat/bin/flask b/venv_flaskchat/bin/flask deleted file mode 100755 index 9b3eb74..0000000 --- a/venv_flaskchat/bin/flask +++ /dev/null @@ -1,8 +0,0 @@ -#!/Users/menardmaranan/Movies/FlaskChat/venv_flaskchat/bin/python3.11 -# -*- coding: utf-8 -*- -import re -import sys -from flask.cli import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv_flaskchat/bin/pip b/venv_flaskchat/bin/pip deleted file mode 100755 index cff674d..0000000 --- a/venv_flaskchat/bin/pip +++ /dev/null @@ -1,8 +0,0 @@ -#!/Users/menardmaranan/Movies/FlaskChat/venv_flaskchat/bin/python3.11 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv_flaskchat/bin/pip3 b/venv_flaskchat/bin/pip3 deleted file mode 100755 index cff674d..0000000 --- a/venv_flaskchat/bin/pip3 +++ /dev/null @@ -1,8 +0,0 @@ -#!/Users/menardmaranan/Movies/FlaskChat/venv_flaskchat/bin/python3.11 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv_flaskchat/bin/pip3.11 b/venv_flaskchat/bin/pip3.11 deleted file mode 100755 index cff674d..0000000 --- a/venv_flaskchat/bin/pip3.11 +++ /dev/null @@ -1,8 +0,0 @@ -#!/Users/menardmaranan/Movies/FlaskChat/venv_flaskchat/bin/python3.11 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv_flaskchat/bin/python b/venv_flaskchat/bin/python deleted file mode 120000 index 6e7f3c7..0000000 --- a/venv_flaskchat/bin/python +++ /dev/null @@ -1 +0,0 @@ -python3.11 \ No newline at end of file diff --git a/venv_flaskchat/bin/python3 b/venv_flaskchat/bin/python3 deleted file mode 120000 index 6e7f3c7..0000000 --- a/venv_flaskchat/bin/python3 +++ /dev/null @@ -1 +0,0 @@ -python3.11 \ No newline at end of file diff --git a/venv_flaskchat/bin/python3.11 b/venv_flaskchat/bin/python3.11 deleted file mode 120000 index 3cf1fbd..0000000 --- a/venv_flaskchat/bin/python3.11 +++ /dev/null @@ -1 +0,0 @@ -/opt/homebrew/opt/python@3.11/bin/python3.11 \ No newline at end of file diff --git a/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/INSTALLER b/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/LICENSE.rst b/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/LICENSE.rst deleted file mode 100644 index 9d227a0..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/LICENSE.rst +++ /dev/null @@ -1,28 +0,0 @@ -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. diff --git a/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/METADATA b/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/METADATA deleted file mode 100644 index a99e52f..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/METADATA +++ /dev/null @@ -1,118 +0,0 @@ -Metadata-Version: 2.1 -Name: Flask -Version: 2.3.2 -Summary: A simple framework for building complex web applications. -Author-email: Armin Ronacher -Maintainer-email: Pallets -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: Chat, https://discord.gg/pallets -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.8 -Description-Content-Type: text/x-rst -License-File: LICENSE.rst -Requires-Dist: Werkzeug (>=2.3.3) -Requires-Dist: Jinja2 (>=3.1.2) -Requires-Dist: itsdangerous (>=2.1.2) -Requires-Dist: click (>=8.1.3) -Requires-Dist: blinker (>=1.6.2) -Requires-Dist: importlib-metadata (>=3.6.0) ; python_version < "3.10" -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/getting-started/ - - -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/ -- Chat: https://discord.gg/pallets diff --git a/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/RECORD b/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/RECORD deleted file mode 100644 index 1ef5bd6..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/RECORD +++ /dev/null @@ -1,54 +0,0 @@ -../../../bin/flask,sha256=LTILJWQHsFFcRMLJYN4iezvqldZlBm3BlUbjwSLF9Bo,259 -Flask-2.3.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Flask-2.3.2.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -Flask-2.3.2.dist-info/METADATA,sha256=o20FsyHfhQR8TMWB_QrtQN2PHyzacLRUAgol_quBBvA,3716 -Flask-2.3.2.dist-info/RECORD,, -Flask-2.3.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -Flask-2.3.2.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92 -Flask-2.3.2.dist-info/entry_points.txt,sha256=s3MqQpduU25y4dq3ftBYD6bMVdVnbMpZP-sUNw0zw0k,41 -Flask-2.3.2.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6 -flask/__init__.py,sha256=yeirfdSGPoM3Ylc9FWWJfy2gEQlHfiZCKrxBiPefACM,3731 -flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 -flask/__pycache__/__init__.cpython-311.pyc,, -flask/__pycache__/__main__.cpython-311.pyc,, -flask/__pycache__/app.cpython-311.pyc,, -flask/__pycache__/blueprints.cpython-311.pyc,, -flask/__pycache__/cli.cpython-311.pyc,, -flask/__pycache__/config.cpython-311.pyc,, -flask/__pycache__/ctx.cpython-311.pyc,, -flask/__pycache__/debughelpers.cpython-311.pyc,, -flask/__pycache__/globals.cpython-311.pyc,, -flask/__pycache__/helpers.cpython-311.pyc,, -flask/__pycache__/logging.cpython-311.pyc,, -flask/__pycache__/scaffold.cpython-311.pyc,, -flask/__pycache__/sessions.cpython-311.pyc,, -flask/__pycache__/signals.cpython-311.pyc,, -flask/__pycache__/templating.cpython-311.pyc,, -flask/__pycache__/testing.cpython-311.pyc,, -flask/__pycache__/typing.cpython-311.pyc,, -flask/__pycache__/views.cpython-311.pyc,, -flask/__pycache__/wrappers.cpython-311.pyc,, -flask/app.py,sha256=ht3Qx9U9z0I1qUfLoS7bYhJcubdpk-i54eHq37LDlN8,87620 -flask/blueprints.py,sha256=ZpVrwa8UY-YnVDsX_1K10XQjDwCUp7Qn2hmKln5icEQ,24332 -flask/cli.py,sha256=wRxX61jRDKQM4iZsYaVwcgGbpN2_2DmntLMWjVeiAx4,33720 -flask/config.py,sha256=yqdiN7TLOs2EChJ0uhTz3SICA3-QBG6l5wHTIUnANpc,12800 -flask/ctx.py,sha256=x2kGzUXtPzVyi2YSKrU_PV1AvtxTmh2iRdriJRTSPGM,14841 -flask/debughelpers.py,sha256=BR0xkd-sAyFuFW07D6NfrqNwSZxk1IrkG5n8zem-3sw,5547 -flask/globals.py,sha256=KUzVvSPh8v28kUasVDi_aQKB9hI2jZSYQHqaDU2P414,2945 -flask/helpers.py,sha256=QDxFmBW9GGXQDLuXrcxQRL0Ldo-_q11zEt3ZVgfINlI,24957 -flask/json/__init__.py,sha256=pdtpoK2b0b1u7Sxbx3feM7VWhsI20l1yGAvbYWxaxvc,5572 -flask/json/__pycache__/__init__.cpython-311.pyc,, -flask/json/__pycache__/provider.cpython-311.pyc,, -flask/json/__pycache__/tag.cpython-311.pyc,, -flask/json/provider.py,sha256=Os0frb8oGfyWKL-TDxb0Uy-MY6gDhPdJkRaUl5xAOXI,7637 -flask/json/tag.py,sha256=ihb7QWrNEr0YC3KD4TolZbftgSPCuLk7FAvK49huYC0,8871 -flask/logging.py,sha256=lArx2Bq9oTtUJ-DnZL9t88xU2zytzp4UWSM9Bd72NDQ,2327 -flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -flask/scaffold.py,sha256=0tYQN98sC93YkIEw9g8BiIwceFZ27tNqBtBtFhFy5tY,35231 -flask/sessions.py,sha256=rFH2QKXG24dEazkKGxAHqUpAUh_30hDHrddhVYgAcY0,14169 -flask/signals.py,sha256=s1H4yKjf3c5dgVr41V6sJpE9dLJvmTJMYuK0rkqx3sw,1146 -flask/templating.py,sha256=XdP2hMFnZ5FCZOG7HUaLjC2VC-b4uHSWlDjwv_1p3qc,7503 -flask/testing.py,sha256=52-m5GecDcA-F2dFEYe8eDwApusxdg6S1suBaSC85N0,9768 -flask/typing.py,sha256=4Lj-YTxUoYvPYofC9GKu-1o0Ht8lyjp9z3I336J13_o,3005 -flask/views.py,sha256=V5hOGZLx0Bn99QGcM6mh5x_uM-MypVT0-RysEFU84jc,6789 -flask/wrappers.py,sha256=PhMp3teK3SnEmIdog59cO_DHiZ9Btn0qI1EifrTdwP8,5709 diff --git a/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/REQUESTED b/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/WHEEL b/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/WHEEL deleted file mode 100644 index 1f37c02..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.40.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/entry_points.txt b/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/entry_points.txt deleted file mode 100644 index 137232d..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[console_scripts] -flask = flask.cli:main diff --git a/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/top_level.txt b/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/top_level.txt deleted file mode 100644 index 7e10602..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Flask-2.3.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -flask diff --git a/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/INSTALLER b/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/LICENSE b/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/LICENSE deleted file mode 100644 index f5c10ab..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Miguel Grinberg - -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. diff --git a/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/METADATA b/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/METADATA deleted file mode 100644 index d259cbb..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/METADATA +++ /dev/null @@ -1,75 +0,0 @@ -Metadata-Version: 2.1 -Name: Flask-SocketIO -Version: 5.3.4 -Summary: Socket.IO integration for Flask applications -Home-page: https://github.com/miguelgrinberg/flask-socketio -Author: Miguel Grinberg -Author-email: miguel.grinberg@gmail.com -Project-URL: Bug Tracker, https://github.com/miguelgrinberg/flask-socketio/issues -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: Programming Language :: Python :: 3 -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Requires-Python: >=3.6 -Description-Content-Type: text/markdown -License-File: LICENSE -Requires-Dist: Flask (>=0.9) -Requires-Dist: python-socketio (>=5.0.2) - -Flask-SocketIO -============== - -[![Build status](https://github.com/miguelgrinberg/flask-socketio/workflows/build/badge.svg)](https://github.com/miguelgrinberg/Flask-SocketIO/actions) [![codecov](https://codecov.io/gh/miguelgrinberg/flask-socketio/branch/main/graph/badge.svg)](https://codecov.io/gh/miguelgrinberg/flask-socketio) - -Socket.IO integration for Flask applications. - -Sponsors --------- - -The following organizations are funding this project: - -![Socket.IO](https://images.opencollective.com/socketio/050e5eb/logo/64.png)
[Socket.IO](https://socket.io) | [Add your company here!](https://github.com/sponsors/miguelgrinberg)| --|- - -Many individual sponsors also support this project through small ongoing contributions. Why not [join them](https://github.com/sponsors/miguelgrinberg)? - -Installation ------------- - -You can install this package as usual with pip: - - pip install flask-socketio - -Example -------- - -```py -from flask import Flask, render_template -from flask_socketio import SocketIO, emit - -app = Flask(__name__) -app.config['SECRET_KEY'] = 'secret!' -socketio = SocketIO(app) - -@app.route('/') -def index(): - return render_template('index.html') - -@socketio.event -def my_event(message): - emit('my response', {'data': 'got it!'}) - -if __name__ == '__main__': - socketio.run(app) -``` - -Resources ---------- - -- [Tutorial](http://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) -- [Documentation](http://flask-socketio.readthedocs.io/en/latest/) -- [PyPI](https://pypi.python.org/pypi/Flask-SocketIO) -- [Change Log](https://github.com/miguelgrinberg/Flask-SocketIO/blob/main/CHANGES.md) -- Questions? See the [questions](https://stackoverflow.com/questions/tagged/flask-socketio) others have asked on Stack Overflow, or [ask](https://stackoverflow.com/questions/ask?tags=python+flask-socketio+python-socketio) your own question. - diff --git a/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/RECORD b/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/RECORD deleted file mode 100644 index 6211f9e..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/RECORD +++ /dev/null @@ -1,13 +0,0 @@ -Flask_SocketIO-5.3.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Flask_SocketIO-5.3.4.dist-info/LICENSE,sha256=aNCWbkgKjS_T1cJtACyZbvCM36KxWnfQ0LWTuavuYKQ,1082 -Flask_SocketIO-5.3.4.dist-info/METADATA,sha256=DAt6N9d2trl12V9EVnECC94FkHjl_4tZSlCe_nQf3WM,2574 -Flask_SocketIO-5.3.4.dist-info/RECORD,, -Flask_SocketIO-5.3.4.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -Flask_SocketIO-5.3.4.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92 -Flask_SocketIO-5.3.4.dist-info/top_level.txt,sha256=C1ugzQBJ3HHUJsWGzyt70XRVOX-y4CUAR8MWKjwJOQ8,15 -flask_socketio/__init__.py,sha256=RVXfUJi1MypU4Fq5MorzUquMMQUB_tYBgCrkOYfjMQ8,54782 -flask_socketio/__pycache__/__init__.cpython-311.pyc,, -flask_socketio/__pycache__/namespace.cpython-311.pyc,, -flask_socketio/__pycache__/test_client.cpython-311.pyc,, -flask_socketio/namespace.py,sha256=b3oyXEemu2po-wpoy4ILTHQMVuVQqicogCDxfymfz_w,2020 -flask_socketio/test_client.py,sha256=TZGQzhjQEnTN5JjK9a3-7DyA0o3Qgk8mkf5fOMOfFYA,10274 diff --git a/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/REQUESTED b/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/WHEEL b/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/WHEEL deleted file mode 100644 index 1f37c02..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.40.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/top_level.txt b/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/top_level.txt deleted file mode 100644 index ba82ec3..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Flask_SocketIO-5.3.4.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -flask_socketio diff --git a/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/INSTALLER b/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst b/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst deleted file mode 100644 index c37cae4..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst +++ /dev/null @@ -1,28 +0,0 @@ -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. diff --git a/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/METADATA b/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/METADATA deleted file mode 100644 index f54bb5c..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/METADATA +++ /dev/null @@ -1,113 +0,0 @@ -Metadata-Version: 2.1 -Name: Jinja2 -Version: 3.1.2 -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.7 -Description-Content-Type: text/x-rst -License-File: LICENSE.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/getting-started/ - - -In A Nutshell -------------- - -.. code-block:: jinja - - {% extends "base.html" %} - {% block title %}Members{% endblock %} - {% block content %} - - {% 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 - - diff --git a/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/RECORD b/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/RECORD deleted file mode 100644 index b20e953..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/RECORD +++ /dev/null @@ -1,58 +0,0 @@ -Jinja2-3.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Jinja2-3.1.2.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 -Jinja2-3.1.2.dist-info/METADATA,sha256=PZ6v2SIidMNixR7MRUX9f7ZWsPwtXanknqiZUmRbh4U,3539 -Jinja2-3.1.2.dist-info/RECORD,, -Jinja2-3.1.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 -Jinja2-3.1.2.dist-info/entry_points.txt,sha256=zRd62fbqIyfUpsRtU7EVIFyiu1tPwfgO7EvPErnxgTE,59 -Jinja2-3.1.2.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 -jinja2/__init__.py,sha256=8vGduD8ytwgD6GDSqpYc2m3aU-T7PKOAddvVXgGr_Fs,1927 -jinja2/__pycache__/__init__.cpython-311.pyc,, -jinja2/__pycache__/_identifier.cpython-311.pyc,, -jinja2/__pycache__/async_utils.cpython-311.pyc,, -jinja2/__pycache__/bccache.cpython-311.pyc,, -jinja2/__pycache__/compiler.cpython-311.pyc,, -jinja2/__pycache__/constants.cpython-311.pyc,, -jinja2/__pycache__/debug.cpython-311.pyc,, -jinja2/__pycache__/defaults.cpython-311.pyc,, -jinja2/__pycache__/environment.cpython-311.pyc,, -jinja2/__pycache__/exceptions.cpython-311.pyc,, -jinja2/__pycache__/ext.cpython-311.pyc,, -jinja2/__pycache__/filters.cpython-311.pyc,, -jinja2/__pycache__/idtracking.cpython-311.pyc,, -jinja2/__pycache__/lexer.cpython-311.pyc,, -jinja2/__pycache__/loaders.cpython-311.pyc,, -jinja2/__pycache__/meta.cpython-311.pyc,, -jinja2/__pycache__/nativetypes.cpython-311.pyc,, -jinja2/__pycache__/nodes.cpython-311.pyc,, -jinja2/__pycache__/optimizer.cpython-311.pyc,, -jinja2/__pycache__/parser.cpython-311.pyc,, -jinja2/__pycache__/runtime.cpython-311.pyc,, -jinja2/__pycache__/sandbox.cpython-311.pyc,, -jinja2/__pycache__/tests.cpython-311.pyc,, -jinja2/__pycache__/utils.cpython-311.pyc,, -jinja2/__pycache__/visitor.cpython-311.pyc,, -jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 -jinja2/async_utils.py,sha256=dHlbTeaxFPtAOQEYOGYh_PHcDT0rsDaUJAFDl_0XtTg,2472 -jinja2/bccache.py,sha256=mhz5xtLxCcHRAa56azOhphIAe19u1we0ojifNMClDio,14061 -jinja2/compiler.py,sha256=Gs-N8ThJ7OWK4-reKoO8Wh1ZXz95MVphBKNVf75qBr8,72172 -jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 -jinja2/debug.py,sha256=iWJ432RadxJNnaMOPrjIDInz50UEgni3_HKuFXi2vuQ,6299 -jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 -jinja2/environment.py,sha256=6uHIcc7ZblqOMdx_uYNKqRnnwAF0_nzbyeMP9FFtuh4,61349 -jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 -jinja2/ext.py,sha256=ivr3P7LKbddiXDVez20EflcO3q2aHQwz9P_PgWGHVqE,31502 -jinja2/filters.py,sha256=9js1V-h2RlyW90IhLiBGLM2U-k6SCy2F4BUUMgB3K9Q,53509 -jinja2/idtracking.py,sha256=GfNmadir4oDALVxzn3DL9YInhJDr69ebXeA2ygfuCGA,10704 -jinja2/lexer.py,sha256=DW2nX9zk-6MWp65YR2bqqj0xqCvLtD-u9NWT8AnFRxQ,29726 -jinja2/loaders.py,sha256=BfptfvTVpClUd-leMkHczdyPNYFzp_n7PKOJ98iyHOg,23207 -jinja2/meta.py,sha256=GNPEvifmSaU3CMxlbheBOZjeZ277HThOPUTf1RkppKQ,4396 -jinja2/nativetypes.py,sha256=DXgORDPRmVWgy034H0xL8eF7qYoK3DrMxs-935d0Fzk,4226 -jinja2/nodes.py,sha256=i34GPRAZexXMT6bwuf5SEyvdmS-bRCy9KMjwN5O6pjk,34550 -jinja2/optimizer.py,sha256=tHkMwXxfZkbfA1KmLcqmBMSaz7RLIvvItrJcPoXTyD8,1650 -jinja2/parser.py,sha256=nHd-DFHbiygvfaPtm9rcQXJChZG7DPsWfiEsqfwKerY,39595 -jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -jinja2/runtime.py,sha256=5CmD5BjbEJxSiDNTFBeKCaq8qU4aYD2v6q2EluyExms,33476 -jinja2/sandbox.py,sha256=Y0xZeXQnH6EX5VjaV2YixESxoepnRbW_3UeQosaBU3M,14584 -jinja2/tests.py,sha256=Am5Z6Lmfr2XaH_npIfJJ8MdXtWsbLjMULZJulTAj30E,5905 -jinja2/utils.py,sha256=u9jXESxGn8ATZNVolwmkjUVu4SA-tLgV0W7PcSfPfdQ,23965 -jinja2/visitor.py,sha256=MH14C6yq24G_KVtWzjwaI7Wg14PCJIYlWW1kpkxYak0,3568 diff --git a/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/WHEEL b/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/WHEEL deleted file mode 100644 index becc9a6..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.1) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt b/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt deleted file mode 100644 index 7b9666c..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[babel.extractors] -jinja2 = jinja2.ext:babel_extract[i18n] diff --git a/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/top_level.txt b/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/top_level.txt deleted file mode 100644 index 7f7afbf..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -jinja2 diff --git a/venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER b/venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst b/venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst deleted file mode 100644 index 9d227a0..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst +++ /dev/null @@ -1,28 +0,0 @@ -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. diff --git a/venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/METADATA b/venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/METADATA deleted file mode 100644 index bced165..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/METADATA +++ /dev/null @@ -1,93 +0,0 @@ -Metadata-Version: 2.1 -Name: MarkupSafe -Version: 2.1.3 -Summary: Safely add untrusted strings to HTML/XML markup. -Home-page: https://palletsprojects.com/p/markupsafe/ -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: Chat, https://discord.gg/pallets -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.7 -Description-Content-Type: text/x-rst -License-File: LICENSE.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/getting-started/ - - -Examples --------- - -.. code-block:: pycon - - >>> from markupsafe import Markup, escape - - >>> # escape replaces special characters and wraps in Markup - >>> escape("") - Markup('<script>alert(document.cookie);</script>') - - >>> # wrap in Markup to mark text "safe" and prevent escaping - >>> Markup("Hello") - Markup('hello') - - >>> escape(Markup("Hello")) - Markup('hello') - - >>> # Markup is a str subclass - >>> # methods and operators escape their arguments - >>> template = Markup("Hello {name}") - >>> template.format(name='"World"') - Markup('Hello "World"') - - -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/ -- Chat: https://discord.gg/pallets diff --git a/venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/RECORD b/venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/RECORD deleted file mode 100644 index 1c787f4..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/RECORD +++ /dev/null @@ -1,14 +0,0 @@ -MarkupSafe-2.1.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -MarkupSafe-2.1.3.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -MarkupSafe-2.1.3.dist-info/METADATA,sha256=Wvvh4Tz-YtW24YagYdqrrrBdm9m-DjTdqJWhxlbU6-0,3003 -MarkupSafe-2.1.3.dist-info/RECORD,, -MarkupSafe-2.1.3.dist-info/WHEEL,sha256=1gGdl8c7V4tzGrOfjA4xbXg5uJOisfAwei4hK84YpXE,115 -MarkupSafe-2.1.3.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 -markupsafe/__init__.py,sha256=xIItqrn1Bwi7FxPJO9rCVQBG0Evewue1Tl4BV0l9xEs,10338 -markupsafe/__pycache__/__init__.cpython-311.pyc,, -markupsafe/__pycache__/_native.cpython-311.pyc,, -markupsafe/_native.py,sha256=GR86Qvo_GcgKmKreA1WmYN9ud17OFwkww8E-fiW-57s,1713 -markupsafe/_speedups.c,sha256=X2XvQVtIdcK4Usz70BvkzoOfjTCmQlDkkjYSn-swE0g,7083 -markupsafe/_speedups.cpython-311-darwin.so,sha256=tzy2iIP3YqrDJlsEvshIKNMf7FwfWLcVq1OeD7W7HnM,117484 -markupsafe/_speedups.pyi,sha256=vfMCsOgbAXRNLUXkyuyonG8uEWKYU4PDqNuMaDELAYw,229 -markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL b/venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL deleted file mode 100644 index ebece4c..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.40.0) -Root-Is-Purelib: false -Tag: cp311-cp311-macosx_10_9_universal2 - diff --git a/venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt b/venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt deleted file mode 100644 index 75bf729..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -markupsafe diff --git a/venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/INSTALLER b/venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/LICENSE.rst b/venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/LICENSE.rst deleted file mode 100644 index c37cae4..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/LICENSE.rst +++ /dev/null @@ -1,28 +0,0 @@ -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. diff --git a/venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/METADATA b/venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/METADATA deleted file mode 100644 index ebeb6c9..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/METADATA +++ /dev/null @@ -1,119 +0,0 @@ -Metadata-Version: 2.1 -Name: Werkzeug -Version: 2.3.6 -Summary: The comprehensive WSGI web application library. -Maintainer-email: Pallets -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: Chat, https://discord.gg/pallets -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.8 -Description-Content-Type: text/x-rst -License-File: LICENSE.rst -Requires-Dist: MarkupSafe (>=2.1.1) -Provides-Extra: watchdog -Requires-Dist: watchdog (>=2.3) ; 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/getting-started/ - - -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/ -- Chat: https://discord.gg/pallets diff --git a/venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/RECORD b/venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/RECORD deleted file mode 100644 index 8815d2e..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/RECORD +++ /dev/null @@ -1,126 +0,0 @@ -Werkzeug-2.3.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Werkzeug-2.3.6.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 -Werkzeug-2.3.6.dist-info/METADATA,sha256=BdsAbo_jtuo9bG0Tx6vBULMr7VPCHnHGo_Rvza8KSFc,4146 -Werkzeug-2.3.6.dist-info/RECORD,, -Werkzeug-2.3.6.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92 -Werkzeug-2.3.6.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9 -werkzeug/__init__.py,sha256=GE-glr5Ri57UhBnkXrFicJrcM3JMATvBS3SEdi3rR6Q,188 -werkzeug/__pycache__/__init__.cpython-311.pyc,, -werkzeug/__pycache__/_internal.cpython-311.pyc,, -werkzeug/__pycache__/_reloader.cpython-311.pyc,, -werkzeug/__pycache__/exceptions.cpython-311.pyc,, -werkzeug/__pycache__/formparser.cpython-311.pyc,, -werkzeug/__pycache__/http.cpython-311.pyc,, -werkzeug/__pycache__/local.cpython-311.pyc,, -werkzeug/__pycache__/security.cpython-311.pyc,, -werkzeug/__pycache__/serving.cpython-311.pyc,, -werkzeug/__pycache__/test.cpython-311.pyc,, -werkzeug/__pycache__/testapp.cpython-311.pyc,, -werkzeug/__pycache__/urls.cpython-311.pyc,, -werkzeug/__pycache__/user_agent.cpython-311.pyc,, -werkzeug/__pycache__/utils.cpython-311.pyc,, -werkzeug/__pycache__/wsgi.cpython-311.pyc,, -werkzeug/_internal.py,sha256=tbijqLWDIRP_AaPSBswRI5KuzDB3Dy5M6rRGFlCAqt4,8688 -werkzeug/_reloader.py,sha256=1O1DDWlqVwYIX8kgJwH5B4a_Uh6acQnw3sQf01JpXtM,14745 -werkzeug/datastructures/__init__.py,sha256=yzBdOT9DdK3nraNG49pA3bVsvtPPLx2-t2N8ZmuAd9w,1900 -werkzeug/datastructures/__pycache__/__init__.cpython-311.pyc,, -werkzeug/datastructures/__pycache__/accept.cpython-311.pyc,, -werkzeug/datastructures/__pycache__/auth.cpython-311.pyc,, -werkzeug/datastructures/__pycache__/cache_control.cpython-311.pyc,, -werkzeug/datastructures/__pycache__/csp.cpython-311.pyc,, -werkzeug/datastructures/__pycache__/etag.cpython-311.pyc,, -werkzeug/datastructures/__pycache__/file_storage.cpython-311.pyc,, -werkzeug/datastructures/__pycache__/headers.cpython-311.pyc,, -werkzeug/datastructures/__pycache__/mixins.cpython-311.pyc,, -werkzeug/datastructures/__pycache__/range.cpython-311.pyc,, -werkzeug/datastructures/__pycache__/structures.cpython-311.pyc,, -werkzeug/datastructures/accept.py,sha256=CuCvBAxNzbt4QUb17rH986vvOVGURFUjo0DX2PQy_yI,10670 -werkzeug/datastructures/accept.pyi,sha256=6P114gncjZoy-i_n_3OQy2nJVwjEAIe7PcBxKYqCEfc,1917 -werkzeug/datastructures/auth.py,sha256=Mm92MLyv_M9Cgto8oNz65l_dZZ8sAibyY6NuKDW3pcs,16040 -werkzeug/datastructures/cache_control.py,sha256=RTUipZev50s-1TAn2rYGZrytm_6IOIxQd67fkR5bNF0,6043 -werkzeug/datastructures/cache_control.pyi,sha256=6Q93jRysAKMPWRA72OMksyn7d3ZysuxwGlHp_iwF9pA,3756 -werkzeug/datastructures/csp.py,sha256=DAOAO266LK0JKbvlG80bbkAgfrNsnU9HBoz-FdIYNdo,3244 -werkzeug/datastructures/csp.pyi,sha256=AmDWiZU4rrJA4SZmyMNI1L5PLdIfJsI5Li9r5lE1q6M,5765 -werkzeug/datastructures/etag.py,sha256=JsyI-yXayF-hQu26MyFzbHFIZsaQ6odj3RZO_jF-_cc,2913 -werkzeug/datastructures/etag.pyi,sha256=N9cuUBrZnxHmsbW0BBmjKW-djNY7WKbI6t_WopB8Zo0,1047 -werkzeug/datastructures/file_storage.py,sha256=ePeMtr65s_1_sunXMv_SBOiFof5CX5BepYv5_W16fZk,6184 -werkzeug/datastructures/file_storage.pyi,sha256=2sdbKHhvbQF5FjrJuO6l_m1yZvZ4oPCUTspmdmjQlSU,1433 -werkzeug/datastructures/headers.py,sha256=V08N4VTcaA11fRq1WK5v28QomGd-A1S9CmiwugixhWo,18882 -werkzeug/datastructures/headers.pyi,sha256=66Gh9DbD8QNpLRBOuer4DMCj12csddHrcgxiJPLE5n8,4237 -werkzeug/datastructures/mixins.py,sha256=-IQSQ70UOMQlqtJEIyyhplOd4obaTOfzGvka-cunCtM,5337 -werkzeug/datastructures/mixins.pyi,sha256=y92tClxVslJBEGgAwDRsQLExfin2p0x7NfnP_b8w6xc,4191 -werkzeug/datastructures/range.py,sha256=JXSDPseG7iH5giJp3R1SnQC_SqQp634M8Iv6QTsbTxM,5669 -werkzeug/datastructures/range.pyi,sha256=bsM61iNp86gT2lyN0F_Dqg8xsnfPerdmElipuHppiJQ,1792 -werkzeug/datastructures/structures.py,sha256=_bhAf0adEk6WU2uy8jdmuxFMTFcuClY1p7jQ-3wYXj4,31761 -werkzeug/datastructures/structures.pyi,sha256=MRg-RubT3UPjh62i9-7Xht8DVL0zTApRzjs52Hfz_j4,8148 -werkzeug/debug/__init__.py,sha256=WRTLJSvnuK6jlBuQLllTnN57th0HKPjxbS7-d8QJZIc,18760 -werkzeug/debug/__pycache__/__init__.cpython-311.pyc,, -werkzeug/debug/__pycache__/console.cpython-311.pyc,, -werkzeug/debug/__pycache__/repr.cpython-311.pyc,, -werkzeug/debug/__pycache__/tbtools.cpython-311.pyc,, -werkzeug/debug/console.py,sha256=FIO8gDX2eQ1_4MtpJ4s0i2gR4fFCJZTPwhSVByF4kbo,6068 -werkzeug/debug/repr.py,sha256=ECmIpNVlCppTfCuIuEgrJVfuhr8iDqPSWeVJyxt1QOM,9328 -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=tg42SZs1SVmYWZ-_Fj5ELK5-FLHnGNQrei0K2By8Bw8,10521 -werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 -werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 -werkzeug/debug/shared/style.css,sha256=-xSxzUEZGw_IqlDR5iZxitNl8LQUjBM-_Y4UAvXVH8g,6078 -werkzeug/debug/tbtools.py,sha256=8Xg7p2JzCC1AMWuse5HYc594OdzC5ToeJbNk49_zZCc,13271 -werkzeug/exceptions.py,sha256=d6VNzGcVgLazIpfwRD8pN_d3yAJNyngBDFvlXQbR-38,26062 -werkzeug/formparser.py,sha256=DZ9BeiHAah3_CuBORNOEipRwE74lHRFX1eK2_3XKcL4,19574 -werkzeug/http.py,sha256=lR6WM_GatD5P4_y1VCix2pqDMHex73fz7TkOI3kHHwU,48712 -werkzeug/local.py,sha256=zrXlO1IP3KTz310h9LSdVKMaFsJfNyXkfCYCkbvlBXQ,22075 -werkzeug/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -werkzeug/middleware/__pycache__/__init__.cpython-311.pyc,, -werkzeug/middleware/__pycache__/dispatcher.cpython-311.pyc,, -werkzeug/middleware/__pycache__/http_proxy.cpython-311.pyc,, -werkzeug/middleware/__pycache__/lint.cpython-311.pyc,, -werkzeug/middleware/__pycache__/profiler.cpython-311.pyc,, -werkzeug/middleware/__pycache__/proxy_fix.cpython-311.pyc,, -werkzeug/middleware/__pycache__/shared_data.cpython-311.pyc,, -werkzeug/middleware/dispatcher.py,sha256=6ltzPtDsIdLTY_T1GW6kxBJL0KZftbipa_WVdKtpVQ8,2601 -werkzeug/middleware/http_proxy.py,sha256=vsSvt84m656x3mV_Fj78y7O2eYHmurWngErTcjeiz8U,7833 -werkzeug/middleware/lint.py,sha256=6CqcwMWro1p-GRUGPgQ1n21KFnTTqc6-81CGTzpcK74,13916 -werkzeug/middleware/profiler.py,sha256=KKr8nAiF9dr9pNd3G0D3xs7mUba9gvWkyK7X9ceke70,4906 -werkzeug/middleware/proxy_fix.py,sha256=dcOOSjSok2QsSh1VSNsw-a0Vy_Jn5DunlO6PRbXBq0A,6754 -werkzeug/middleware/shared_data.py,sha256=DeM8OouhfhZs8w5T7Wxw-uKuOHXoH0x5RopzxR2RRjI,9513 -werkzeug/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -werkzeug/routing/__init__.py,sha256=HpvahY7WwkLdV4Cq3Bsc3GrqNon4u6t8-vhbb9E5o00,4819 -werkzeug/routing/__pycache__/__init__.cpython-311.pyc,, -werkzeug/routing/__pycache__/converters.cpython-311.pyc,, -werkzeug/routing/__pycache__/exceptions.cpython-311.pyc,, -werkzeug/routing/__pycache__/map.cpython-311.pyc,, -werkzeug/routing/__pycache__/matcher.cpython-311.pyc,, -werkzeug/routing/__pycache__/rules.cpython-311.pyc,, -werkzeug/routing/converters.py,sha256=V8e_wMRop6WG4Kymu4pBIR8OrJl-ZUQUZlinUXfw7WE,7602 -werkzeug/routing/exceptions.py,sha256=yGZ5AUL-buHp-vK8AJbZ0bLIbSckh1UyiGKgRg4ZjaA,4698 -werkzeug/routing/map.py,sha256=2tirw9j5wypzsUT6WBcBNcBTqNp0_iBXnF_1vhY9HjI,37403 -werkzeug/routing/matcher.py,sha256=FyPG45iqR1XwxFujejSqfNEKV7IgbR2td7Jp-ocSASY,7817 -werkzeug/routing/rules.py,sha256=dq0NO-0ZVG3OX7-8FFd0S-bZUgyzGoF4JYnlYC5bpy4,32048 -werkzeug/sansio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -werkzeug/sansio/__pycache__/__init__.cpython-311.pyc,, -werkzeug/sansio/__pycache__/http.cpython-311.pyc,, -werkzeug/sansio/__pycache__/multipart.cpython-311.pyc,, -werkzeug/sansio/__pycache__/request.cpython-311.pyc,, -werkzeug/sansio/__pycache__/response.cpython-311.pyc,, -werkzeug/sansio/__pycache__/utils.cpython-311.pyc,, -werkzeug/sansio/http.py,sha256=mKTbXo_squCAZKjt9yzfPFV8ZqQbfa6mjdc6XoeLNZ0,6234 -werkzeug/sansio/multipart.py,sha256=VTP_jhRRxYDX-1_1oge_b2CK3KTLnw3LB0k8b2zpiHI,11087 -werkzeug/sansio/request.py,sha256=wEeVGySwlOfJT5xlgQzjJOe2ksky70CJT75QTzkvfqM,24243 -werkzeug/sansio/response.py,sha256=WSsWrz-6FjtrRKun3Ha0a4sF78Su0kp8IzfrgmU_WOI,29011 -werkzeug/sansio/utils.py,sha256=LYgmrN7yr04ZDVk5flPcUJLo1rDnTzhF04OH3-ujCWQ,4950 -werkzeug/security.py,sha256=gEH8qD5Ykgn6W6PgMx2CQx-iNqJFenXXqOGiWDi_3eE,5814 -werkzeug/serving.py,sha256=Ql_SUZxsmQzN8OZ-hDvKFQ5nRgKh6FEIYwcXVEmD6qU,39224 -werkzeug/test.py,sha256=OVpg33rnFwDJ5Jya7639PKztEB7N32WAoQTVqH1p6zo,55645 -werkzeug/testapp.py,sha256=w9AdbZcmSvydD-OP6EjxVENuaZof9MkbYNFVALhcoqQ,6151 -werkzeug/urls.py,sha256=Uq_cu8TmZFHkQ7t2pp9DNwDvs6wG76jzWPstQIssPVk,45683 -werkzeug/user_agent.py,sha256=lSlLYKCcbzCUSkbdAoO8zPk2UR-8Mdn6iu_iA2kYPBA,1416 -werkzeug/utils.py,sha256=DYkOtfDR_Wc3ro3_peReo9KkUC-6yhOvz27_PUAckbA,24654 -werkzeug/wrappers/__init__.py,sha256=kGyK7rOud3qCxll_jFyW15YarJhj1xtdf3ocx9ZheB8,120 -werkzeug/wrappers/__pycache__/__init__.cpython-311.pyc,, -werkzeug/wrappers/__pycache__/request.cpython-311.pyc,, -werkzeug/wrappers/__pycache__/response.cpython-311.pyc,, -werkzeug/wrappers/request.py,sha256=_PIbgCZ9xfQXC9HEjm-j1R-F4gSPcx5q-QT983mMzbs,24848 -werkzeug/wrappers/response.py,sha256=FfGesquK6cSdPTFZvzV42CM__Ohta2cxNqLBDRkAuKA,32664 -werkzeug/wsgi.py,sha256=PGkhajtHnJj2NqYpYW_T8w17JJbaH8iI0wHHNkPvJKs,29153 diff --git a/venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/WHEEL b/venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/WHEEL deleted file mode 100644 index 1f37c02..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.40.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/top_level.txt b/venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/top_level.txt deleted file mode 100644 index 6fe8da8..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/Werkzeug-2.3.6.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -werkzeug diff --git a/venv_flaskchat/lib/python3.11/site-packages/__pycache__/typing_extensions.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/__pycache__/typing_extensions.cpython-311.pyc deleted file mode 100644 index aa1ac30a5916f508ff698090b8958cf824c07ca4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131547 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 G4E`@b3#3*6 diff --git a/venv_flaskchat/lib/python3.11/site-packages/_distutils_hack/__init__.py b/venv_flaskchat/lib/python3.11/site-packages/_distutils_hack/__init__.py deleted file mode 100644 index f987a53..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/_distutils_hack/__init__.py +++ /dev/null @@ -1,222 +0,0 @@ -# don't import any costly modules -import sys -import os - - -is_pypy = '__pypy__' in sys.builtin_module_names - - -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 - import warnings - - 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 - import warnings - - warnings.warn("Setuptools is replacing distutils.") - mods = [ - name - for name in sys.modules - if name == "distutils" or name.startswith("distutils.") - ] - for name in mods: - del sys.modules[name] - - -def enabled(): - """ - Allow selection of distutils by environment variable. - """ - which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local') - return which == 'local' - - -def ensure_local_distutils(): - import importlib - - clear_distutils() - - # With the DistutilsMetaFinder in place, - # perform an import to cause distutils to be - # loaded from setuptools._distutils. Ref #2906. - with shim(): - importlib.import_module('distutils') - - # check that submodules load as expected - core = importlib.import_module('distutils.core') - assert '_distutils' in core.__file__, core.__file__ - assert 'setuptools._distutils.log' not in sys.modules - - -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 _TrivialRe: - def __init__(self, *patterns): - self._patterns = patterns - - def match(self, string): - return all(pat in string for pat in self._patterns) - - -class DistutilsMetaFinder: - def find_spec(self, fullname, path, target=None): - # optimization: only consider top level modules and those - # found in the CPython test suite. - if path is not None and not fullname.startswith('test.'): - return - - method_name = 'spec_for_{fullname}'.format(**locals()) - method = getattr(self, method_name, lambda: None) - return method() - - def spec_for_distutils(self): - if self.is_cpython(): - return - - import importlib - import importlib.abc - import importlib.util - - try: - mod = importlib.import_module('setuptools._distutils') - except Exception: - # There are a couple of cases where setuptools._distutils - # may not be present: - # - An older Setuptools without a local distutils is - # taking precedence. Ref #2957. - # - Path manipulation during sitecustomize removes - # setuptools from the path but only after the hook - # has been loaded. Ref #2980. - # In either case, fall back to stdlib behavior. - return - - class DistutilsLoader(importlib.abc.Loader): - def create_module(self, spec): - mod.__name__ = 'distutils' - return mod - - def exec_module(self, module): - pass - - return importlib.util.spec_from_loader( - 'distutils', DistutilsLoader(), origin=mod.__file__ - ) - - @staticmethod - def is_cpython(): - """ - Suppress supplying distutils for CPython (build and tests). - Ref #2965 and #3007. - """ - return os.path.isfile('pybuilddir.txt') - - 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 - - @classmethod - def pip_imported_during_build(cls): - """ - Detect if pip is being imported in a build script. Ref #2355. - """ - import traceback - - return any( - cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None) - ) - - @staticmethod - def frame_file_is_setup(frame): - """ - Return True if the indicated frame suggests a setup.py file. - """ - # some frames may not have __file__ (#2940) - return frame.f_globals.get('__file__', '').endswith('setup.py') - - def spec_for_sensitive_tests(self): - """ - Ensure stdlib distutils when running select tests under CPython. - - python/cpython#91169 - """ - clear_distutils() - self.spec_for_distutils = lambda: None - - sensitive_tests = ( - [ - 'test.test_distutils', - 'test.test_peg_generator', - 'test.test_importlib', - ] - if sys.version_info < (3, 10) - else [ - 'test.test_distutils', - ] - ) - - -for name in DistutilsMetaFinder.sensitive_tests: - setattr( - DistutilsMetaFinder, - f'spec_for_{name}', - DistutilsMetaFinder.spec_for_sensitive_tests, - ) - - -DISTUTILS_FINDER = DistutilsMetaFinder() - - -def add_shim(): - DISTUTILS_FINDER in sys.meta_path or insert_shim() - - -class shim: - def __enter__(self): - insert_shim() - - def __exit__(self, exc, value, tb): - remove_shim() - - -def insert_shim(): - sys.meta_path.insert(0, DISTUTILS_FINDER) - - -def remove_shim(): - try: - sys.meta_path.remove(DISTUTILS_FINDER) - except ValueError: - pass diff --git a/venv_flaskchat/lib/python3.11/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 24a467526a743cd481e851a90e80f17cd038b9f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11183 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 XVP386l%yDSs{%!qKr*dBFx3A7Ox_FX diff --git a/venv_flaskchat/lib/python3.11/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc deleted file mode 100644 index 469ed12be80d34fed8af7755bb7a6c6db4637ab9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmZ8c!Ab)$6ntqx%9i2}*t<)$q4X*u2;TG}o?n& z#hUF60)pH_T3a78p?nwzm3x-)!RQXXgfXQH>jGozrm)PG(m5sMCv4&cTTLIlbe?Ky zxD%Q?Zn&Yhwp7y7o1FX6b;biNr777{l!GX9^+=0J$gJsidp+t^kmm&^@*$o&cm=H@ zyTxSNxX@ONb9w0+m>xgpPjUOL6GFZrc~0idlLfR_(EfsS3F!hlE9lIt<&JRp53, Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Zac Hatfield-Dodds -License-File: LICENSE -Classifier: Development Status :: 4 - Beta -Classifier: Environment :: Console -Classifier: Environment :: MacOS X -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: Information Technology -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: POSIX :: Linux -Classifier: Operating System :: Unix -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Typing :: Typed -Requires-Python: >=3.7 -Requires-Dist: typing-extensions>=4.0.0; python_version < '3.9' -Description-Content-Type: text/markdown - -# annotated-types - -[![CI](https://github.com/annotated-types/annotated-types/workflows/CI/badge.svg?event=push)](https://github.com/annotated-types/annotated-types/actions?query=event%3Apush+branch%3Amain+workflow%3ACI) -[![pypi](https://img.shields.io/pypi/v/annotated-types.svg)](https://pypi.python.org/pypi/annotated-types) -[![versions](https://img.shields.io/pypi/pyversions/annotated-types.svg)](https://github.com/annotated-types/annotated-types) -[![license](https://img.shields.io/github/license/annotated-types/annotated-types.svg)](https://github.com/annotated-types/annotated-types/blob/main/LICENSE) - -[PEP-593](https://peps.python.org/pep-0593/) added `typing.Annotated` as a way of -adding context-specific metadata to existing types, and specifies that -`Annotated[T, x]` _should_ be treated as `T` by any tool or library without special -logic for `x`. - -This package provides metadata objects which can be used to represent common -constraints such as upper and lower bounds on scalar values and collection sizes, -a `Predicate` marker for runtime checks, and -descriptions of how we intend these metadata to be interpreted. In some cases, -we also note alternative representations which do not require this package. - -## Install - -```bash -pip install annotated-types -``` - -## Examples - -```python -from typing import Annotated -from annotated_types import Gt, Len, Predicate - -class MyClass: - age: Annotated[int, Gt(18)] # Valid: 19, 20, ... - # Invalid: 17, 18, "19", 19.0, ... - factors: list[Annotated[int, Predicate(is_prime)]] # Valid: 2, 3, 5, 7, 11, ... - # Invalid: 4, 8, -2, 5.0, "prime", ... - - my_list: Annotated[list[int], Len(0, 10)] # Valid: [], [10, 20, 30, 40, 50] - # Invalid: (1, 2), ["abc"], [0] * 20 -``` - -## Documentation - -_While `annotated-types` avoids runtime checks for performance, users should not -construct invalid combinations such as `MultipleOf("non-numeric")` or `Annotated[int, Len(3)]`. -Downstream implementors may choose to raise an error, emit a warning, silently ignore -a metadata item, etc., if the metadata objects described below are used with an -incompatible type - or for any other reason!_ - -### Gt, Ge, Lt, Le - -Express inclusive and/or exclusive bounds on orderable values - which may be numbers, -dates, times, strings, sets, etc. Note that the boundary value need not be of the -same type that was annotated, so long as they can be compared: `Annotated[int, Gt(1.5)]` -is fine, for example, and implies that the value is an integer x such that `x > 1.5`. - -We suggest that implementors may also interpret `functools.partial(operator.le, 1.5)` -as being equivalent to `Gt(1.5)`, for users who wish to avoid a runtime dependency on -the `annotated-types` package. - -To be explicit, these types have the following meanings: - -* `Gt(x)` - value must be "Greater Than" `x` - equivalent to exclusive minimum -* `Ge(x)` - value must be "Greater than or Equal" to `x` - equivalent to inclusive minimum -* `Lt(x)` - value must be "Less Than" `x` - equivalent to exclusive maximum -* `Le(x)` - value must be "Less than or Equal" to `x` - equivalent to inclusive maximum - -### Interval - -`Interval(gt, ge, lt, le)` allows you to specify an upper and lower bound with a single -metadata object. `None` attributes should be ignored, and non-`None` attributes -treated as per the single bounds above. - -### MultipleOf - -`MultipleOf(multiple_of=x)` might be interpreted in two ways: - -1. Python semantics, implying `value % multiple_of == 0`, or -2. [JSONschema semantics](https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6.2.1), - where `int(value / multiple_of) == value / multiple_of`. - -We encourage users to be aware of these two common interpretations and their -distinct behaviours, especially since very large or non-integer numbers make -it easy to cause silent data corruption due to floating-point imprecision. - -We encourage libraries to carefully document which interpretation they implement. - -### MinLen, MaxLen, Len - -`Len()` implies that `min_length <= len(value) <= max_length` - lower and upper bounds are inclusive. - -As well as `Len()` which can optionally include upper and lower bounds, we also -provide `MinLen(x)` and `MaxLen(y)` which are equivalent to `Len(min_length=x)` -and `Len(max_length=y)` respectively. - -`Len`, `MinLen`, and `MaxLen` may be used with any type which supports `len(value)`. - -Examples of usage: - -* `Annotated[list, MaxLen(10)]` (or `Annotated[list, Len(max_length=10))`) - list must have a length of 10 or less -* `Annotated[str, MaxLen(10)]` - string must have a length of 10 or less -* `Annotated[list, MinLen(3))` (or `Annotated[list, Len(min_length=3))`) - list must have a length of 3 or more -* `Annotated[list, Len(4, 6)]` - list must have a length of 4, 5, or 6 -* `Annotated[list, Len(8, 8)]` - list must have a length of exactly 8 - -#### Changed in v0.4.0 - -* `min_inclusive` has been renamed to `min_length`, no change in meaning -* `max_exclusive` has been renamed to `max_length`, upper bound is now **inclusive** instead of **exclusive** -* The recommendation that slices are interpreted as `Len` has been removed due to ambiguity and different semantic - meaning of the upper bound in slices vs. `Len` - -See [issue #23](https://github.com/annotated-types/annotated-types/issues/23) for discussion. - -### Timezone - -`Timezone` can be used with a `datetime` or a `time` to express which timezones -are allowed. `Annotated[datetime, Timezone(None)]` must be a naive datetime. -`Timezone[...]` ([literal ellipsis](https://docs.python.org/3/library/constants.html#Ellipsis)) -expresses that any timezone-aware datetime is allowed. You may also pass a specific -timezone string or `timezone` object such as `Timezone(timezone.utc)` or -`Timezone("Africa/Abidjan")` to express that you only allow a specific timezone, -though we note that this is often a symptom of fragile design. - -### Predicate - -`Predicate(func: Callable)` expresses that `func(value)` is truthy for valid values. -Users should prefer the statically inspectable metadata above, but if you need -the full power and flexibility of arbitrary runtime predicates... here it is. - -We provide a few predefined predicates for common string constraints: -`IsLower = Predicate(str.islower)`, `IsUpper = Predicate(str.isupper)`, and -`IsDigit = Predicate(str.isdigit)`. -Some libraries might have special logic to handle known or understandable predicates, -for example by checking for `str.isdigit` and using its presence to both call custom -logic to enforce digit-only strings, and customise some generated external schema. -Users are therefore encouraged to avoid indirection like `lambda s: s.lower()`, in -favor of introspectable methods such as `str.lower` or `re.compile("pattern").search`. - -We do not specify what behaviour should be expected for predicates that raise -an exception. For example `Annotated[int, Predicate(str.isdigit)]` might silently -skip invalid constraints, or statically raise an error; or it might try calling it -and then propogate or discard the resulting -`TypeError: descriptor 'isdigit' for 'str' objects doesn't apply to a 'int' object` -exception. We encourage libraries to document the behaviour they choose. - -### Integrating downstream types with `GroupedMetadata` - -Implementers may choose to provide a convenience wrapper that groups multiple pieces of metadata. -This can help reduce verbosity and cognitive overhead for users. -For example, an implementer like Pydantic might provide a `Field` or `Meta` type that accepts keyword arguments and transforms these into low-level metadata: - -```python -from dataclasses import dataclass -from typing import Iterator -from annotated_types import GroupedMetadata, Ge - -@dataclass -class Field(GroupedMetadata): - ge: int | None = None - description: str | None = None - - def __iter__(self) -> Iterator[object]: - # Iterating over a GroupedMetadata object should yield annotated-types - # constraint metadata objects which describe it as fully as possible, - # and may include other unknown objects too. - if self.ge is not None: - yield Ge(self.ge) - if self.description is not None: - yield Description(self.description) -``` - -Libraries consuming annotated-types constraints should check for `GroupedMetadata` and unpack it by iterating over the object and treating the results as if they had been "unpacked" in the `Annotated` type. The same logic should be applied to the [PEP 646 `Unpack` type](https://peps.python.org/pep-0646/), so that `Annotated[T, Field(...)]`, `Annotated[T, Unpack[Field(...)]]` and `Annotated[T, *Field(...)]` are all treated consistently. - -Libraries consuming annotated-types should also ignore any metadata they do not recongize that came from unpacking a `GroupedMetadata`, just like they ignore unrecognized metadata in `Annotated` itself. - -Our own `annotated_types.Interval` class is a `GroupedMetadata` which unpacks itself into `Gt`, `Lt`, etc., so this is not an abstract concern. Similarly, `annotated_types.Len` is a `GroupedMetadata` which unpacks itself into `MinLen` (optionally) and `MaxLen`. - -### Consuming metadata - -We intend to not be perspcriptive as to _how_ the metadata and constraints are used, but as an example of how one might parse constraints from types annotations see our [implementation in `test_main.py`](https://github.com/annotated-types/annotated-types/blob/f59cf6d1b5255a0fe359b93896759a180bec30ae/tests/test_main.py#L94-L103). - -It is up to the implementer to determine how this metadata is used. -You could use the metadata for runtime type checking, for generating schemas or to generate example data, amongst other use cases. - -## Design & History - -This package was designed at the PyCon 2022 sprints by the maintainers of Pydantic -and Hypothesis, with the goal of making it as easy as possible for end-users to -provide more informative annotations for use by runtime libraries. - -It is deliberately minimal, and following PEP-593 allows considerable downstream -discretion in what (if anything!) they choose to support. Nonetheless, we expect -that staying simple and covering _only_ the most common use-cases will give users -and maintainers the best experience we can. If you'd like more constraints for your -types - follow our lead, by defining them and documenting them downstream! diff --git a/venv_flaskchat/lib/python3.11/site-packages/annotated_types-0.5.0.dist-info/RECORD b/venv_flaskchat/lib/python3.11/site-packages/annotated_types-0.5.0.dist-info/RECORD deleted file mode 100644 index d70ee0c..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/annotated_types-0.5.0.dist-info/RECORD +++ /dev/null @@ -1,10 +0,0 @@ -annotated_types-0.5.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -annotated_types-0.5.0.dist-info/METADATA,sha256=ie2NTBuiFKST5M2yUVgOgymZkQ5iad82BPFcZ07ZKBQ,11685 -annotated_types-0.5.0.dist-info/RECORD,, -annotated_types-0.5.0.dist-info/WHEEL,sha256=y1bSCq4r5i4nMmpXeUJMqs3ipKvkZObrIXSvJHm1qCI,87 -annotated_types-0.5.0.dist-info/licenses/LICENSE,sha256=_hBJiEsaDZNCkB6I4H8ykl0ksxIdmXK2poBfuYJLCV0,1083 -annotated_types/__init__.py,sha256=qQOWO1uHTw0QjOL1Ggcs92oY4OPX0G7srTdq_M5lC-8,9375 -annotated_types/__pycache__/__init__.cpython-311.pyc,, -annotated_types/__pycache__/test_cases.cpython-311.pyc,, -annotated_types/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -annotated_types/test_cases.py,sha256=z-ftQXel0GT9FjAN2PVXi8ZUVV7F1T9PvwZ5l-UAqpU,5680 diff --git a/venv_flaskchat/lib/python3.11/site-packages/annotated_types-0.5.0.dist-info/WHEEL b/venv_flaskchat/lib/python3.11/site-packages/annotated_types-0.5.0.dist-info/WHEEL deleted file mode 100644 index 2762755..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/annotated_types-0.5.0.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: hatchling 1.17.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv_flaskchat/lib/python3.11/site-packages/annotated_types-0.5.0.dist-info/licenses/LICENSE b/venv_flaskchat/lib/python3.11/site-packages/annotated_types-0.5.0.dist-info/licenses/LICENSE deleted file mode 100644 index d99323a..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/annotated_types-0.5.0.dist-info/licenses/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2022 the contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/venv_flaskchat/lib/python3.11/site-packages/annotated_types/__init__.py b/venv_flaskchat/lib/python3.11/site-packages/annotated_types/__init__.py deleted file mode 100644 index 644db6f..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/annotated_types/__init__.py +++ /dev/null @@ -1,319 +0,0 @@ -import sys -from dataclasses import dataclass -from datetime import timezone -from typing import TYPE_CHECKING, Any, Callable, Iterator, Optional, TypeVar, Union - -if sys.version_info < (3, 8): - from typing_extensions import Protocol, runtime_checkable -else: - from typing import Protocol, runtime_checkable - -if sys.version_info < (3, 9): - from typing_extensions import Annotated, Literal -else: - from typing import Annotated, Literal - -if sys.version_info < (3, 10): - EllipsisType = type(Ellipsis) - KW_ONLY = {} - SLOTS = {} -else: - from types import EllipsisType - - KW_ONLY = {"kw_only": True} - SLOTS = {"slots": True} - - -__all__ = ( - 'BaseMetadata', - 'GroupedMetadata', - 'Gt', - 'Ge', - 'Lt', - 'Le', - 'Interval', - 'MultipleOf', - 'MinLen', - 'MaxLen', - 'Len', - 'Timezone', - 'Predicate', - 'LowerCase', - 'UpperCase', - 'IsDigits', - '__version__', -) - -__version__ = '0.5.0' - - -T = TypeVar('T') - - -# arguments that start with __ are considered -# positional only -# see https://peps.python.org/pep-0484/#positional-only-arguments - - -class SupportsGt(Protocol): - def __gt__(self: T, __other: T) -> bool: - ... - - -class SupportsGe(Protocol): - def __ge__(self: T, __other: T) -> bool: - ... - - -class SupportsLt(Protocol): - def __lt__(self: T, __other: T) -> bool: - ... - - -class SupportsLe(Protocol): - def __le__(self: T, __other: T) -> bool: - ... - - -class SupportsMod(Protocol): - def __mod__(self: T, __other: T) -> T: - ... - - -class SupportsDiv(Protocol): - def __div__(self: T, __other: T) -> T: - ... - - -class BaseMetadata: - """Base class for all metadata. - - This exists mainly so that implementers - can do `isinstance(..., BaseMetadata)` while traversing field annotations. - """ - - __slots__ = () - - -@dataclass(frozen=True, **SLOTS) -class Gt(BaseMetadata): - """Gt(gt=x) implies that the value must be greater than x. - - It can be used with any type that supports the ``>`` operator, - including numbers, dates and times, strings, sets, and so on. - """ - - gt: SupportsGt - - -@dataclass(frozen=True, **SLOTS) -class Ge(BaseMetadata): - """Ge(ge=x) implies that the value must be greater than or equal to x. - - It can be used with any type that supports the ``>=`` operator, - including numbers, dates and times, strings, sets, and so on. - """ - - ge: SupportsGe - - -@dataclass(frozen=True, **SLOTS) -class Lt(BaseMetadata): - """Lt(lt=x) implies that the value must be less than x. - - It can be used with any type that supports the ``<`` operator, - including numbers, dates and times, strings, sets, and so on. - """ - - lt: SupportsLt - - -@dataclass(frozen=True, **SLOTS) -class Le(BaseMetadata): - """Le(le=x) implies that the value must be less than or equal to x. - - It can be used with any type that supports the ``<=`` operator, - including numbers, dates and times, strings, sets, and so on. - """ - - le: SupportsLe - - -@runtime_checkable -class GroupedMetadata(Protocol): - """A grouping of multiple BaseMetadata objects. - - `GroupedMetadata` on its own is not metadata and has no meaning. - All it the the constraint and metadata should be fully expressable - in terms of the `BaseMetadata`'s returned by `GroupedMetadata.__iter__()`. - - Concrete implementations should override `GroupedMetadata.__iter__()` - to add their own metadata. - For example: - - >>> @dataclass - >>> class Field(GroupedMetadata): - >>> gt: float | None = None - >>> description: str | None = None - ... - >>> def __iter__(self) -> Iterable[BaseMetadata]: - >>> if self.gt is not None: - >>> yield Gt(self.gt) - >>> if self.description is not None: - >>> yield Description(self.gt) - - Also see the implementation of `Interval` below for an example. - - Parsers should recognize this and unpack it so that it can be used - both with and without unpacking: - - - `Annotated[int, Field(...)]` (parser must unpack Field) - - `Annotated[int, *Field(...)]` (PEP-646) - """ # noqa: trailing-whitespace - - @property - def __is_annotated_types_grouped_metadata__(self) -> Literal[True]: - return True - - def __iter__(self) -> Iterator[BaseMetadata]: - ... - - if not TYPE_CHECKING: - __slots__ = () # allow subclasses to use slots - - def __init_subclass__(cls, *args: Any, **kwargs: Any) -> None: - # Basic ABC like functionality without the complexity of an ABC - super().__init_subclass__(*args, **kwargs) - if cls.__iter__ is GroupedMetadata.__iter__: - raise TypeError("Can't subclass GroupedMetadata without implementing __iter__") - - def __iter__(self) -> Iterator[BaseMetadata]: # noqa: F811 - raise NotImplementedError # more helpful than "None has no attribute..." type errors - - -@dataclass(frozen=True, **KW_ONLY, **SLOTS) -class Interval(GroupedMetadata): - """Interval can express inclusive or exclusive bounds with a single object. - - It accepts keyword arguments ``gt``, ``ge``, ``lt``, and/or ``le``, which - are interpreted the same way as the single-bound constraints. - """ - - gt: Union[SupportsGt, None] = None - ge: Union[SupportsGe, None] = None - lt: Union[SupportsLt, None] = None - le: Union[SupportsLe, None] = None - - def __iter__(self) -> Iterator[BaseMetadata]: - """Unpack an Interval into zero or more single-bounds.""" - if self.gt is not None: - yield Gt(self.gt) - if self.ge is not None: - yield Ge(self.ge) - if self.lt is not None: - yield Lt(self.lt) - if self.le is not None: - yield Le(self.le) - - -@dataclass(frozen=True, **SLOTS) -class MultipleOf(BaseMetadata): - """MultipleOf(multiple_of=x) might be interpreted in two ways: - - 1. Python semantics, implying ``value % multiple_of == 0``, or - 2. JSONschema semantics, where ``int(value / multiple_of) == value / multiple_of`` - - We encourage users to be aware of these two common interpretations, - and libraries to carefully document which they implement. - """ - - multiple_of: Union[SupportsDiv, SupportsMod] - - -@dataclass(frozen=True, **SLOTS) -class MinLen(BaseMetadata): - """ - MinLen() implies minimum inclusive length, - e.g. ``len(value) >= min_length``. - """ - - min_length: Annotated[int, Ge(0)] - - -@dataclass(frozen=True, **SLOTS) -class MaxLen(BaseMetadata): - """ - MaxLen() implies maximum inclusive length, - e.g. ``len(value) <= max_length``. - """ - - max_length: Annotated[int, Ge(0)] - - -@dataclass(frozen=True, **SLOTS) -class Len(GroupedMetadata): - """ - Len() implies that ``min_length <= len(value) <= max_length``. - - Upper bound may be omitted or ``None`` to indicate no upper length bound. - """ - - min_length: Annotated[int, Ge(0)] = 0 - max_length: Optional[Annotated[int, Ge(0)]] = None - - def __iter__(self) -> Iterator[BaseMetadata]: - """Unpack a Len into zone or more single-bounds.""" - if self.min_length > 0: - yield MinLen(self.min_length) - if self.max_length is not None: - yield MaxLen(self.max_length) - - -@dataclass(frozen=True, **SLOTS) -class Timezone(BaseMetadata): - """Timezone(tz=...) requires a datetime to be aware (or ``tz=None``, naive). - - ``Annotated[datetime, Timezone(None)]`` must be a naive datetime. - ``Timezone[...]`` (the ellipsis literal) expresses that the datetime must be - tz-aware but any timezone is allowed. - - You may also pass a specific timezone string or timezone object such as - ``Timezone(timezone.utc)`` or ``Timezone("Africa/Abidjan")`` to express that - you only allow a specific timezone, though we note that this is often - a symptom of poor design. - """ - - tz: Union[str, timezone, EllipsisType, None] - - -@dataclass(frozen=True, **SLOTS) -class Predicate(BaseMetadata): - """``Predicate(func: Callable)`` implies `func(value)` is truthy for valid values. - - Users should prefer statically inspectable metadata, but if you need the full - power and flexibility of arbitrary runtime predicates... here it is. - - We provide a few predefined predicates for common string constraints: - ``IsLower = Predicate(str.islower)``, ``IsUpper = Predicate(str.isupper)``, and - ``IsDigit = Predicate(str.isdigit)``. Users are encouraged to use methods which - can be given special handling, and avoid indirection like ``lambda s: s.lower()``. - - Some libraries might have special logic to handle certain predicates, e.g. by - checking for `str.isdigit` and using its presence to both call custom logic to - enforce digit-only strings, and customise some generated external schema. - - We do not specify what behaviour should be expected for predicates that raise - an exception. For example `Annotated[int, Predicate(str.isdigit)]` might silently - skip invalid constraints, or statically raise an error; or it might try calling it - and then propogate or discard the resulting exception. - """ - - func: Callable[[Any], bool] - - -StrType = TypeVar("StrType", bound=str) - -LowerCase = Annotated[StrType, Predicate(str.islower)] -UpperCase = Annotated[StrType, Predicate(str.isupper)] -IsDigits = Annotated[StrType, Predicate(str.isdigit)] -IsAscii = Annotated[StrType, Predicate(str.isascii)] diff --git a/venv_flaskchat/lib/python3.11/site-packages/annotated_types/__pycache__/__init__.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/annotated_types/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c2aa45e60b44a05fab8b8a2ed53d8bedd2e22f0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15835 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 C8e_o# diff --git a/venv_flaskchat/lib/python3.11/site-packages/annotated_types/py.typed b/venv_flaskchat/lib/python3.11/site-packages/annotated_types/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv_flaskchat/lib/python3.11/site-packages/annotated_types/test_cases.py b/venv_flaskchat/lib/python3.11/site-packages/annotated_types/test_cases.py deleted file mode 100644 index ae2c084..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/annotated_types/test_cases.py +++ /dev/null @@ -1,133 +0,0 @@ -import sys -from datetime import date, datetime, timedelta, timezone -from decimal import Decimal -from typing import Any, Dict, Iterable, Iterator, List, NamedTuple, Set, Tuple - -if sys.version_info < (3, 9): - from typing_extensions import Annotated -else: - from typing import Annotated - -import annotated_types as at - - -class Case(NamedTuple): - """ - A test case for `annotated_types`. - """ - - annotation: Any - valid_cases: Iterable[Any] - invalid_cases: Iterable[Any] - - -def cases() -> Iterable[Case]: - # Gt, Ge, Lt, Le - yield Case(Annotated[int, at.Gt(4)], (5, 6, 1000), (4, 0, -1)) - yield Case(Annotated[float, at.Gt(0.5)], (0.6, 0.7, 0.8, 0.9), (0.5, 0.0, -0.1)) - yield Case( - Annotated[datetime, at.Gt(datetime(2000, 1, 1))], - [datetime(2000, 1, 2), datetime(2000, 1, 3)], - [datetime(2000, 1, 1), datetime(1999, 12, 31)], - ) - yield Case( - Annotated[datetime, at.Gt(date(2000, 1, 1))], - [date(2000, 1, 2), date(2000, 1, 3)], - [date(2000, 1, 1), date(1999, 12, 31)], - ) - yield Case( - Annotated[datetime, at.Gt(Decimal('1.123'))], - [Decimal('1.1231'), Decimal('123')], - [Decimal('1.123'), Decimal('0')], - ) - - yield Case(Annotated[int, at.Ge(4)], (4, 5, 6, 1000, 4), (0, -1)) - yield Case(Annotated[float, at.Ge(0.5)], (0.5, 0.6, 0.7, 0.8, 0.9), (0.4, 0.0, -0.1)) - yield Case( - Annotated[datetime, at.Ge(datetime(2000, 1, 1))], - [datetime(2000, 1, 2), datetime(2000, 1, 3)], - [datetime(1998, 1, 1), datetime(1999, 12, 31)], - ) - - yield Case(Annotated[int, at.Lt(4)], (0, -1), (4, 5, 6, 1000, 4)) - yield Case(Annotated[float, at.Lt(0.5)], (0.4, 0.0, -0.1), (0.5, 0.6, 0.7, 0.8, 0.9)) - yield Case( - Annotated[datetime, at.Lt(datetime(2000, 1, 1))], - [datetime(1999, 12, 31), datetime(1999, 12, 31)], - [datetime(2000, 1, 2), datetime(2000, 1, 3)], - ) - - yield Case(Annotated[int, at.Le(4)], (4, 0, -1), (5, 6, 1000)) - yield Case(Annotated[float, at.Le(0.5)], (0.5, 0.0, -0.1), (0.6, 0.7, 0.8, 0.9)) - yield Case( - Annotated[datetime, at.Le(datetime(2000, 1, 1))], - [datetime(2000, 1, 1), datetime(1999, 12, 31)], - [datetime(2000, 1, 2), datetime(2000, 1, 3)], - ) - - # Interval - yield Case(Annotated[int, at.Interval(gt=4)], (5, 6, 1000), (4, 0, -1)) - yield Case(Annotated[int, at.Interval(gt=4, lt=10)], (5, 6), (4, 10, 1000, 0, -1)) - yield Case(Annotated[float, at.Interval(ge=0.5, le=1)], (0.5, 0.9, 1), (0.49, 1.1)) - yield Case( - Annotated[datetime, at.Interval(gt=datetime(2000, 1, 1), le=datetime(2000, 1, 3))], - [datetime(2000, 1, 2), datetime(2000, 1, 3)], - [datetime(2000, 1, 1), datetime(2000, 1, 4)], - ) - - yield Case(Annotated[int, at.MultipleOf(multiple_of=3)], (0, 3, 9), (1, 2, 4)) - yield Case(Annotated[float, at.MultipleOf(multiple_of=0.5)], (0, 0.5, 1, 1.5), (0.4, 1.1)) - - # lengths - - yield Case(Annotated[str, at.MinLen(3)], ('123', '1234', 'x' * 10), ('', '1', '12')) - yield Case(Annotated[str, at.Len(3)], ('123', '1234', 'x' * 10), ('', '1', '12')) - yield Case(Annotated[List[int], at.MinLen(3)], ([1, 2, 3], [1, 2, 3, 4], [1] * 10), ([], [1], [1, 2])) - yield Case(Annotated[List[int], at.Len(3)], ([1, 2, 3], [1, 2, 3, 4], [1] * 10), ([], [1], [1, 2])) - - yield Case(Annotated[str, at.MaxLen(4)], ('', '1234'), ('12345', 'x' * 10)) - yield Case(Annotated[str, at.Len(0, 4)], ('', '1234'), ('12345', 'x' * 10)) - yield Case(Annotated[List[str], at.MaxLen(4)], ([], ['a', 'bcdef'], ['a', 'b', 'c']), (['a'] * 5, ['b'] * 10)) - yield Case(Annotated[List[str], at.Len(0, 4)], ([], ['a', 'bcdef'], ['a', 'b', 'c']), (['a'] * 5, ['b'] * 10)) - - yield Case(Annotated[str, at.Len(3, 5)], ('123', '12345'), ('', '1', '12', '123456', 'x' * 10)) - yield Case(Annotated[str, at.Len(3, 3)], ('123',), ('12', '1234')) - - yield Case(Annotated[Dict[int, int], at.Len(2, 3)], [{1: 1, 2: 2}], [{}, {1: 1}, {1: 1, 2: 2, 3: 3, 4: 4}]) - yield Case(Annotated[Set[int], at.Len(2, 3)], ({1, 2}, {1, 2, 3}), (set(), {1}, {1, 2, 3, 4})) - yield Case(Annotated[Tuple[int, ...], at.Len(2, 3)], ((1, 2), (1, 2, 3)), ((), (1,), (1, 2, 3, 4))) - - # Timezone - - yield Case( - Annotated[datetime, at.Timezone(None)], [datetime(2000, 1, 1)], [datetime(2000, 1, 1, tzinfo=timezone.utc)] - ) - yield Case( - Annotated[datetime, at.Timezone(...)], [datetime(2000, 1, 1, tzinfo=timezone.utc)], [datetime(2000, 1, 1)] - ) - yield Case( - Annotated[datetime, at.Timezone(timezone.utc)], - [datetime(2000, 1, 1, tzinfo=timezone.utc)], - [datetime(2000, 1, 1), datetime(2000, 1, 1, tzinfo=timezone(timedelta(hours=6)))], - ) - yield Case( - Annotated[datetime, at.Timezone('Europe/London')], - [datetime(2000, 1, 1, tzinfo=timezone(timedelta(0), name='Europe/London'))], - [datetime(2000, 1, 1), datetime(2000, 1, 1, tzinfo=timezone(timedelta(hours=6)))], - ) - - # predicate types - - yield Case(at.LowerCase[str], ['abc', 'foobar'], ['', 'A', 'Boom']) - yield Case(at.UpperCase[str], ['ABC', 'DEFO'], ['', 'a', 'abc', 'AbC']) - yield Case(at.IsDigits[str], ['123'], ['', 'ab', 'a1b2']) - yield Case(at.IsAscii[str], ['123', 'foo bar'], ['£100', '😊', 'whatever 👀']) - - yield Case(Annotated[int, at.Predicate(lambda x: x % 2 == 0)], [0, 2, 4], [1, 3, 5]) - - # custom GroupedMetadata - class MyCustomGroupedMetadata(at.GroupedMetadata): - def __iter__(self) -> Iterator[at.Predicate]: - yield at.Predicate(lambda x: float(x).is_integer()) - - yield Case(Annotated[float, MyCustomGroupedMetadata()], [0, 2.0], [0.01, 1.5]) diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/INSTALLER b/venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/LICENSE b/venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/LICENSE deleted file mode 100644 index 525888d..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/LICENSE +++ /dev/null @@ -1,376 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -Copyright 2009-2022 Joshua Bronson. All rights reserved. - - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/METADATA b/venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/METADATA deleted file mode 100644 index dc152d0..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/METADATA +++ /dev/null @@ -1,298 +0,0 @@ -Metadata-Version: 2.1 -Name: bidict -Version: 0.22.1 -Summary: The bidirectional mapping library for Python. -Author-email: Joshua Bronson -License: MPL 2.0 -Project-URL: Homepage, https://bidict.readthedocs.io -Project-URL: Repository, https://github.com/jab/bidict -Project-URL: Documentation, https://bidict.readthedocs.io -Project-URL: Donate, https://github.com/sponsors/jab -Project-URL: Changelog, https://bidict.readthedocs.io/changelog.html -Project-URL: Chat, https://gitter.im/jab/bidict -Project-URL: Source Code, https://github.com/jab/bidict -Project-URL: Issue Tracker, https://github.com/jab/bidict/issues -Project-URL: Enterprise Support, https://bidict.readthedocs.io/#enterprise-support -Keywords: bidict,bimap,bidirectional,dict,dictionary,mapping,collections -Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0) -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Typing :: Typed -Requires-Python: >=3.7 -Description-Content-Type: text/x-rst -License-File: LICENSE -Provides-Extra: docs -Requires-Dist: sphinx ; extra == 'docs' -Requires-Dist: sphinx-copybutton ; extra == 'docs' -Requires-Dist: furo ; extra == 'docs' -Provides-Extra: lint -Requires-Dist: pre-commit ; extra == 'lint' -Provides-Extra: test -Requires-Dist: hypothesis ; extra == 'test' -Requires-Dist: pytest ; extra == 'test' -Requires-Dist: pytest-benchmark[histogram] ; extra == 'test' -Requires-Dist: pytest-cov ; extra == 'test' -Requires-Dist: pytest-xdist ; extra == 'test' -Requires-Dist: sortedcollections ; extra == 'test' -Requires-Dist: sortedcontainers ; extra == 'test' -Requires-Dist: sphinx ; extra == 'test' - -.. role:: doc -.. (Forward declaration for the "doc" role that Sphinx defines for interop with renderers that - are often used to show this doc and that are unaware of Sphinx (GitHub.com, PyPI.org, etc.). - Use :doc: rather than :ref: here for better interop as well.) - - -bidict -====== - -*The bidirectional mapping library for Python.* - - -Status ------- - -.. image:: https://img.shields.io/pypi/v/bidict.svg - :target: https://pypi.org/project/bidict - :alt: Latest release - -.. image:: https://img.shields.io/readthedocs/bidict/main.svg - :target: https://bidict.readthedocs.io/en/main/ - :alt: Documentation - -.. image:: https://github.com/jab/bidict/workflows/Tests/badge.svg - :target: https://github.com/jab/bidict/actions - :alt: GitHub Actions CI status - -.. image:: https://img.shields.io/pypi/l/bidict.svg - :target: https://raw.githubusercontent.com/jab/bidict/main/LICENSE - :alt: License - -.. image:: https://static.pepy.tech/badge/bidict - :target: https://pepy.tech/project/bidict - :alt: PyPI Downloads - -.. image:: https://img.shields.io/github/sponsors/jab - :target: https://github.com/sponsors/jab - :alt: Sponsors on GitHub - -.. image:: https://img.shields.io/badge/GitHub-sponsor-ff69b4 - :target: https://github.com/sponsors/jab - :alt: Sponsor on GitHub - - -Features --------- - -- Depended on by - Google, Venmo, CERN, Baidu, Tencent, - and teams across the world since 2009 - -- Familiar, Pythonic APIs - that are carefully designed for - safety, simplicity, flexibility, and ergonomics - -- Lightweight, with no runtime dependencies - outside Python's standard library - -- Implemented in - concise, well-factored, fully type-hinted Python code - that is optimized for running efficiently - as well as for long-term maintenance and stability - (not to mention `joy <#learning-from-bidict>`__ :) - -- Extensively `documented `__ - -- 100% test coverage - running continuously across all supported Python versions - - -Installation ------------- - -``pip install bidict`` - - -Quick Start ------------ - -.. code:: python - - >>> from bidict import bidict - >>> element_by_symbol = bidict({'H': 'hydrogen'}) - >>> element_by_symbol['H'] - 'hydrogen' - >>> element_by_symbol.inverse['hydrogen'] - 'H' - - -For more usage documentation, -head to the :doc:`intro` [#fn-intro]_ -and proceed from there. - - -Enterprise Support ------------------- - -Enterprise-level support for bidict can be obtained via the -`Tidelift subscription `__ -or by `contacting me directly `__. - -I have a US-based LLC set up for invoicing, -and I have 15+ years of professional experience -delivering software and support to companies successfully. - -You can also sponsor my work through platforms like GitHub Sponsors. -See the `Sponsoring <#sponsoring>`__ section below for details, -including rationale and examples of companies -supporting the open source projects they depend on. - - -Voluntary Community Support ---------------------------- - -Please search through already-asked questions and answers -in `GitHub Discussions `__ -and the `issue tracker `__ -in case your question has already been addressed. - -Otherwise, please feel free to -`start a new discussion `__ -or `create a new issue `__ on GitHub, -or ask in the `bidict chatroom `__ -for voluntary community support. - - -Notice of Usage ---------------- - -If you use bidict, -and especially if your usage or your organization is significant in some way, -please let me know in any of the following ways: - -- `star bidict on GitHub `__ -- post in `GitHub Discussions `__ -- leave a message in the `chat room `__ -- `email me `__ - - -Changelog ---------- - -For bidict release notes, see the :doc:`changelog`. [#fn-changelog]_ - - -Release Notifications ---------------------- - -.. duplicated in CHANGELOG.rst: - (would use `.. include::` but GitHub doesn't understand it) - -Watch `bidict releases on GitHub `__ -to be notified when new versions of bidict are published. -Click the "Watch" dropdown, choose "Custom", and then choose "Releases". - - -Learning from bidict --------------------- - -One of the best things about bidict -is that it touches a surprising number of -interesting Python corners, -especially given its small size and scope. - -Check out :doc:`learning-from-bidict` [#fn-learning]_ -if you're interested in learning more. - - -Contributing ------------- - -I have been bidict's sole maintainer -and `active contributor `__ -since I started the project ~15 years ago. - -Your help would be most welcome! -See the :doc:`contributors-guide` [#fn-contributing]_ -for more information. - - -Sponsoring ----------- - -.. duplicated in CONTRIBUTING.rst - (would use `.. include::` but GitHub doesn't understand it) - -.. image:: https://img.shields.io/badge/GitHub-sponsor-ff69b4 - :target: https://github.com/sponsors/jab - :alt: Sponsor through GitHub - -.. image:: https://img.shields.io/github/sponsors/jab - :target: https://github.com/sponsors/jab - :alt: Sponsors on GitHub - -Bidict is the product of thousands of hours of my unpaid work -over the ~15 years that I've been the sole maintainer. - -If bidict has helped you or your company accomplish your work, -please `sponsor my work through GitHub `__ -and/or ask your company to do the same. - -Choose a tier and GitHub handles everything else. -Your GitHub sponsorship will automatically go -on the same bill you already have set up with GitHub, -so after the one-click signup, there's nothing else to do. - -See the following for rationale and examples of companies -supporting the open source projects they depend on -in this manner: - -- ``__ -- ``__ -- ``__ - -.. - ``__ -.. - ``__ -.. - ``__ -.. - ``__ - -You can also support my work through -`Gumroad `__ or -`PayPal `__, -or through a support engagement with my LLC. -See `Enterprise Support <#enterprise-support>`__ -above for details. - - -Finding Documentation ---------------------- - -If you're viewing this on ``__, -note that multiple versions of the documentation are available, -and you can choose a different version using the popup menu at the bottom-right. -Please make sure you're viewing the version of the documentation -that corresponds to the version of bidict you'd like to use. - -If you're viewing this on GitHub, PyPI, or some other place -that can't render and link this documentation properly -and are seeing broken links, -try these alternate links instead: - -.. [#fn-intro] ``__ | ``__ - -.. [#fn-changelog] ``__ | ``__ - -.. [#fn-learning] ``__ | ``__ - -.. [#fn-contributing] ``__ | ``__ - - -.. image:: https://static.scarf.sh/a.png?x-pxid=05e3c4e4-eaa7-41a1-84c2-ec14413115f8 diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/RECORD b/venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/RECORD deleted file mode 100644 index 0d8fcc6..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/RECORD +++ /dev/null @@ -1,35 +0,0 @@ -bidict-0.22.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -bidict-0.22.1.dist-info/LICENSE,sha256=vgSHOYu6COd3K0B3tjd4e5SXO1PESzy91sfasQ7RUDU,16784 -bidict-0.22.1.dist-info/METADATA,sha256=tL98SDf3m4_wbLHauTk_5d9H2No-JFaIxjpppoDH2eY,10214 -bidict-0.22.1.dist-info/RECORD,, -bidict-0.22.1.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92 -bidict-0.22.1.dist-info/top_level.txt,sha256=WuQO02jp0ODioS7sJoaHg3JJ5_3h6Sxo9RITvNGPYmc,7 -bidict/__init__.py,sha256=MkSZDzvPG0w3qUYhGK7-y_v1ptSXsj_AN_ms-Eaf_gg,4402 -bidict/__pycache__/__init__.cpython-311.pyc,, -bidict/__pycache__/_abc.cpython-311.pyc,, -bidict/__pycache__/_base.cpython-311.pyc,, -bidict/__pycache__/_bidict.cpython-311.pyc,, -bidict/__pycache__/_dup.cpython-311.pyc,, -bidict/__pycache__/_exc.cpython-311.pyc,, -bidict/__pycache__/_frozenbidict.cpython-311.pyc,, -bidict/__pycache__/_frozenordered.cpython-311.pyc,, -bidict/__pycache__/_iter.cpython-311.pyc,, -bidict/__pycache__/_named.cpython-311.pyc,, -bidict/__pycache__/_orderedbase.cpython-311.pyc,, -bidict/__pycache__/_orderedbidict.cpython-311.pyc,, -bidict/__pycache__/_typing.cpython-311.pyc,, -bidict/__pycache__/metadata.cpython-311.pyc,, -bidict/_abc.py,sha256=4fpjOPr8DmTkHaVxQycj_UpjcCnTCg0HyM6tIChCUAk,3161 -bidict/_base.py,sha256=tH8Xt2bYkDXRK_hvKxtpEEU8varu2HJpxiDldQ4FhxA,24395 -bidict/_bidict.py,sha256=XrthGSjDIHt9NYAWJ1bogawflZFzYMVQUgEcIA7n3UA,7293 -bidict/_dup.py,sha256=lYD9eqXYcYQ7V5UkcbmQPUZRLpMm7imSFY8isb1p-iw,1986 -bidict/_exc.py,sha256=YccvFsU_44tu0D__pNh2sPn0EoIt_1H_ZKNJsbY4Svo,1065 -bidict/_frozenbidict.py,sha256=lMCPYVovjRBPP7mAJm_lhRnAh1VP2zxHFmfWJjvA79M,1830 -bidict/_frozenordered.py,sha256=t6RIm9xoAp3bv3vZHSpFvqmEitEBhv0XBAFTI8SK7iE,2115 -bidict/_iter.py,sha256=H5UTVAKp0G_V6ZlaqvyRYQyww-WnribAZm4kiaUBnug,1537 -bidict/_named.py,sha256=r_r7VZDk62oRbtwEvF-z42zDQfajnXlQGxZaa1nlKjQ,4006 -bidict/_orderedbase.py,sha256=r5lw22Z2VShEQnjdY-YoWVaHBYb_asTY9xFoYmKv4ww,9248 -bidict/_orderedbidict.py,sha256=v8EWAOVDIMAM2XxbKgiGFU_p8noWd_tbjNrdlQ-sBEE,6940 -bidict/_typing.py,sha256=F9fJScCGi-36vZI8bw7C0uZvHWl_i6gt94sD7zK09ww,1166 -bidict/metadata.py,sha256=V0wvZfLwi6nO5eNm6HvUCtISAi2J0G5zty0kf_ETLEw,574 -bidict/py.typed,sha256=RJao5SVFYIp8IfbxhL_SpZkBQYe3XXzPlobSRdh4B_c,16 diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/WHEEL b/venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/WHEEL deleted file mode 100644 index 57e3d84..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.38.4) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/top_level.txt b/venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/top_level.txt deleted file mode 100644 index 6ff5b04..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict-0.22.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -bidict diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/__init__.py b/venv_flaskchat/lib/python3.11/site-packages/bidict/__init__.py deleted file mode 100644 index 7ad180c..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict/__init__.py +++ /dev/null @@ -1,100 +0,0 @@ -# Copyright 2009-2022 Joshua Bronson. All rights reserved. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - - -#============================================================================== -# * Welcome to the bidict source code * -#============================================================================== - -# Reading through the code? You'll find a "Code review nav" comment like the one -# below at the top and bottom of the key source files. Follow these cues to take -# a path through the code that's optimized for familiarizing yourself with it. -# -# If you're not reading this on https://github.com/jab/bidict already, go there -# to ensure you have the latest version of the code. While there, you can also -# star the project, watch it for updates, fork the code, and submit an issue or -# pull request with any proposed changes. More information can be found linked -# from README.rst, which is also shown on https://github.com/jab/bidict. - -# * Code review nav * -#============================================================================== -# Current: __init__.py Next: _abc.py → -#============================================================================== - - -"""The bidirectional mapping library for Python. - ----- - -bidict by example: - -.. code-block:: python - - >>> from bidict import bidict - >>> element_by_symbol = bidict({'H': 'hydrogen'}) - >>> element_by_symbol['H'] - 'hydrogen' - >>> element_by_symbol.inverse['hydrogen'] - 'H' - - -Please see https://github.com/jab/bidict for the most up-to-date code and -https://bidict.readthedocs.io for the most up-to-date documentation -if you are reading this elsewhere. - ----- - -.. :copyright: (c) 2009-2022 Joshua Bronson. -.. :license: MPLv2. See LICENSE for details. -""" - -# Use private aliases to not re-export these publicly (for Sphinx automodule with imported-members). -from __future__ import annotations as _annotations -from sys import version_info as _version_info - - -if _version_info < (3, 7): # pragma: no cover - raise ImportError('Python 3.7+ is required.') - - -from contextlib import suppress as _suppress - -from ._abc import BidirectionalMapping as BidirectionalMapping, MutableBidirectionalMapping as MutableBidirectionalMapping -from ._base import BidictBase as BidictBase, GeneratedBidictInverse as GeneratedBidictInverse, BidictKeysView as BidictKeysView -from ._bidict import MutableBidict as MutableBidict, bidict as bidict -from ._frozenbidict import frozenbidict as frozenbidict -from ._frozenordered import FrozenOrderedBidict as FrozenOrderedBidict -from ._named import NamedBidictBase as NamedBidictBase, namedbidict as namedbidict -from ._orderedbase import OrderedBidictBase as OrderedBidictBase -from ._orderedbidict import OrderedBidict as OrderedBidict -from ._dup import ON_DUP_DEFAULT as ON_DUP_DEFAULT, ON_DUP_RAISE as ON_DUP_RAISE, ON_DUP_DROP_OLD as ON_DUP_DROP_OLD -from ._dup import RAISE as RAISE, DROP_OLD as DROP_OLD, DROP_NEW as DROP_NEW, OnDup as OnDup, OD as OD -from ._exc import BidictException as BidictException, DuplicationError as DuplicationError -from ._exc import KeyDuplicationError as KeyDuplicationError, ValueDuplicationError as ValueDuplicationError, KeyAndValueDuplicationError as KeyAndValueDuplicationError -from ._iter import inverted as inverted -from .metadata import ( - __author__ as __author__, __copyright__ as __copyright__, __description__ as __description__, - __license__ as __license__, __url__ as __url__, __version__ as __version__, -) - - -#: Alias -OnDupAction = OD - - -# Set __module__ of re-exported classes to the 'bidict' top-level module, so that e.g. -# 'bidict.bidict' shows up as 'bidict.bidict` rather than 'bidict._bidict.bidict'. -for _obj in tuple(locals().values()): # pragma: no cover - if not getattr(_obj, '__module__', '').startswith('bidict.'): - continue - with _suppress(AttributeError): - _obj.__module__ = 'bidict' - - -# * Code review nav * -#============================================================================== -# Current: __init__.py Next: _abc.py → -#============================================================================== diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/__init__.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index a9563704f2943c2ae7f7f65ac8be49b5ca651da8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3189 zcmb_d&2JmW6`$po#3iY3$@;M4wIqw8WRenPSqbZ?mP5L6V|~DmQ)Gf*vE+`#jdyn0 z*`*}9C>r#ngAZy@G(Gy{qVOgELvrka3IvqcQ-Pd(W04$;obqN?lto7dQlP81PxF5B z-kX{Cew_VBA|WGq{$>14&-Ekp9XHxfmp_oc&jb+q66pvdUD5-lL<2Y|@o~@$(J+ok zh(z?zBjL_s0Ytj=@G}Xa=kWT^pC#~)nB6prWr*z3yUiGl<2X&=gs`J#5ADUhv=8^u ze%voG*&LvQc#sa^Az{bNVLF0G#5itVprd$Hj1%S<9mnHz0#69L$Gk`{;Y(uNYraJ< z0NSDAJH#73qn44{paawdvx}{KH8bXk)BLJ2ATZ2 z6JJJfmN9Zuz15D^$NAqg;J|Zu{YOGpYzi$RC$tyX4}OgHBnf>CkrH~cp^ra6sR?Z! zoIk7(rDW&^BW2gHEe(pTRjY=zqnJjCX{@en+f3Q2yA|8Y$Z{GUS>^#{S1HvMvaivq zN%FFs$tY!8C+U)DmmlTxN>zl&vZ5%ftENwbBU;iqFK7! z4)^^tjA%Oe>vq}67`7%XWUoRPIqePf zAz!wub!O~T+`KYdPAR#Cg?G}qgnq}Gkz8o;)yoj(z)v&hhRNw_?`3rtAJs$OG zqby}s<`vj1BfqZ!(ew;Nbvw0cl@Z5z!Ec~cz#F=KmWAs+3B8H+nyZyea^7Sr=*b)} zySJfJ-pFr=MHp0G_rbe081Ye>(m~+BkWD4 zLxoS$LVWLrM%$)XI%aX;G_1cPfO|mhLi*evkv`3ElUmr0eA$LoVR=(1o^ zkujUW>Vr^^*I{q?Bh9RlpTQI0yJqR1SZhqF2BMV)(e!`NUiZ8_?f^Q_-)tR z8UsJZ`RB#eGbHtbPTgT4jwjT1a?VySc2`_Qq9~qRwk?u12{U<7%9%39c@3bqN%Bll?M#i`$pEQn1hvouk$ah^2M zN~2Sn=uV?kn&^JxJZYj^jZSHze4|sE$Zfn?nrOT6%cO~L<2-2vkYof}(1!nAH&L?D zDXl>tpBsUkJns#2t$xEY0Ba_W1#UK2YG-HiV+RRQ7dZ4iZOp2v*N{s z5jPT6(oPjqcDk6>NQ7J_Mskf9DW16R?}R#eil?iQ!-0C}*Q10ygF9%&QC}(zQX_nH za4qNoJA*d(ZaoHi;0{`G%!u6}+0m7A*M!?N4Ng^!(?Z2!QWi=VO~VwtqDT%o zo6fxwWo4-Zt0-D#l2dZ7`b&K2FQLd2G zt@idF=3dE{lQp+t8Po-(!Y9_Hf~$sbD1$+j3+_~aZr5kLySFd+ZuU(_Dh84{f9+G^ zB?7HGM~9hm_tx?py|Vme1&I$Ejvwl zQJ_~ja}*+3<{{h$cfbQG8)ZK~FmzB2Hb{%9A!?p#UQBYUDiIyJQ_A0z5Dj^toCyP> zh&jy3UxggyGQR-n`QXzUQ~4%$ntBzd6`WdTIbUxRr22vGBMLm9p8o-**UCoi;4>d0eM$7AUH#+`?6HtcRWfnXP$ z8Ld-3p^C%4=y^{S15FZW!WVnMn4|X_QuQjs5FBk990FEr7jVI85f}gt7`)0F)}Wab zVz+F8TO10efFq=bvkXcb;#OxunU#jc1VCRvA_}E%yBQlgRGLF38gSb9aJhA5+U5#3 zdM@_ELm$;3{aBNk7VbX>Zc7CSVJ)e#rf)S6i{)1BB4n3)yK6{b(x64Xt+P=thA|>0 zA$q;I551UxagfO35I#Pj>!B~YzH%HZ(crn7+r8ur%2Vhd>yDCxnIA6w_}O2X6Mtq- zyv)pQWM*GZWH%b^tqj`s zd+=uO_k$6IiV^dsuQn70#V`t1&hGb3U$=NQrE zwKlo5MP}Ol*CsjE?!Pw4WIMdJ$aH(y)k$PEpnh-n^XXqcdGh&hlTU7KOwYZ>1#jN2 zx}!z4sSerOwP!wlE?#`}yty%R?sskD{I&M=8||C7+t+VzoWJuL1>Ovi^5Om;trcWx diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_base.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_base.cpython-311.pyc deleted file mode 100644 index 45ecc9b418c9a7f6ccf48acbd6081aea4f401a71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26566 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 S@MD4Ef5RZGUR606;{G2N`0;E2 diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_bidict.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_bidict.cpython-311.pyc deleted file mode 100644 index f3917f5a76ea6828db0e8499e785c8eda60e9da5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10796 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 IH4q;77skPw9RL6T diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_exc.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_exc.cpython-311.pyc deleted file mode 100644 index 018dbd564b738513e00e3402d1bc35809feca30f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1897 zcmb7EOK%e~5Vn)eqiF*L#6uJngLoB6LZ}c@g^&sqgn)ut;E>DKT{~pe&2I2+0_g#e z;0N>se*l3{Py7!Kdqh1UapIP$J@v$lchg4_A?kQ1w!iUs=9{s<=JPoM?T7tQj2VRd z#!088qXAw241-TZkTMZeBpg~xloOOB$UP#GABZqy@=KDC75Ji7HZ+z3EG>;LETypw zU|E^!!qOTW04&#oWi&Pj*pN)i%op%>1-|&itjN!iv3*OUPn6fRg=E}u*n%x=D`4`q zCF_Chxqjgfs*lmtLGHRC`RmOJ+IT_gTeLeNLVEW~^pS)8#d3nyWd}ta+m0;CRS1UpBZCBN@{ao@JWf$U3^Q zIbVF{OXU}9(&b9jxZ*B%i;o~c=@;+9fs41RJSaA$+cYaUwQ%a#3&naXsCw>1p;RjR zb|5d;xwXh&z^;grq6wT7>MfOmW37hT)gVT#+n6zo-1x~$>aFB{U8K&tJtrtLXAkRr#Rai7(tVnJ21Ngf1h@=X*~ zVRq{N-1Iz~)VY|P?<_xd!HFpglRaP17G@OIwi-mCBg633{*E{R1Ai36HW}?iB9(2E zT_W0wyY@)Rp$D?n!^^qZ9no|4!iKc6McKmep;lu;3jJM2j}?le@b%>JN@&DAav2r( z=h=$CP^)NlJStu=iW?%s{kAY+ zS1M9T7c6XT{#V@|Mix<=L>9a2*1)>mB_cL)!_3%#!uKEFq)H=bD0q`p5*G%x-nZzD z(04;una-I$a`*Mw%-)EewVUb~SipzWry$!&N@;tT(6b>q^NXAgclUOh((yLw70dP- zu5N5Y*(8Nfdd2eFHC)};hK49Dq0Md)9>0i2OK3F4vXoAsYPSeajHBuVs>WD0h3EH* R@btCt`olFuHu}Jt?!S+y&9wjk diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_frozenbidict.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_frozenbidict.cpython-311.pyc deleted file mode 100644 index d8dbe519000fc316f98d762512adb4f9b57cb485..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1586 zcmZ`(L2nyX5PrK}uh(`$Xi`+%P_c?Al|!)G1{En(92!bV0#+;B09&Egwcm5R>F(OR zT?g5UgpqRSA%{vxBnJ*T1y#B5LpV59B&*c?7W$IZ|0ks zeZP;7rwEKctzX&u2}1tH#bCf1hjdZ_xOO9;F67n%SW++TyaXap)h6*x; zsdmEA49!UzNr}kh4q=Hc!ZfaOjVCK|COi|#evFUz2Ew`^`Gf zJx32&DM*{HTk}mc@e0qSNSL}69(>F6cvcSNm0}>T7Rymg5$%U4oqP%F9m0trK`P|? zkN_jbWUjE-P0;Z8x;oe<#(07ynYyLygXmx&CWgjRkPgL2G7Z3{gRx<7Eq&=Vz{-Av zB#2qAAH*r54phPYhHy{M51;X1wK%7*6u&Pcyum;oP)H{jAQlpQONFQ8sT3$4w<{hR z=%-fxzQ=`^cerZ`=9t2CO*j7)RD*l@&!HHP7OSS8-{9^Bt>ChZOWP{t>rKB}bLVr{ zuH`+;=O5P1@*{H%c12ao)8PU6524)*n{>3f+8_A+D&k4&GEy9yWFK}OobBElvWhH_j@EFK&@-z|vVO)x zPGhb4VwHzIsn;sHU$wljFQI&fz6URNyqrjbk3v=n5^Ef~(-(o{ z2gxPWty=uYP%YjBo2X1;64*eaVG~f=dTS)N1Mv*ne*&aU{z*?h`DpjT-g}4XD@W-o zopkI?R`YdzxFmwGVbN%sW+soaFsqI!r%ZT%^zmS#17<|Pz zkO7Z(MmB{(xTeD?4N{akHP*0^AEWe#hH3XT2})V54B`n&hyFiG#RWJd7%zTz_cmSp z;`ZXoQsGXZ)kUq&h2IoY=o2psF@Xd_36YB=a!7E$_W($H=;JDJ4E_c z>X2`a$xLT-cFAOCFptTl&gkrt>CUTWPdz6A+W(U$3%jMgncd3K)a4hbe)$TUFd6>= D4+4)C diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_frozenordered.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_frozenordered.cpython-311.pyc deleted file mode 100644 index a7f08b2625f05307c805297aad9850a617701cb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2026 zcmZuy%}*Og6rWvxEjDfhsZ^R&)wDe{E{?4Tsj3h`0u%zGAxLqMYKoS@GsX+Mv+m5A z)LhDeW6#ZhkfzF|$NmwO>Pk6SdqV0dH%IiuDQ{+MVh4}M&-3x-ef-{sf6wQ$2*%&u zZ*;{$=s&d?jEq@W7XlW~5k*x*Eo%E#U{`HRtrLEtnxsjZ@>4;&nufC^P5YU^sXBU{ z@h5_8H5=rrISbk7A)?M1q7%$vS(dBYpAIyk7YT%3!PkuHBuzX)h3v_rEfF4jl;QcB zPo$jRTNU96M>r27 z5_ut)n{O<0I9b=C4J$BBjVM_rk`?UO-l)X(cBN*_G_-HEb+HZm=ZK-I1xVRX0iSAu zB@a^r=4y)CEKL&&aKJK$fVLUpBQ`-Dnm$XufP+_qV^q!3%oC)(g^Bp)7|+Q+HbQGx z-VQ-9>Nt+tO;*ZgF^uoMBZkQpMpwZ0AsTUdPrrEPMUAi(;i$o|!Z`By0bbf#mqi>3 z>}z?NQLtksqz5thQ0g$Wdl=X_4msXxgJ6yq@LcJ;l9q61$@lxgl9&hv3LwyTn}SIu zj+NeL4S36yB4Z1qMJz)+tN?pb3nRW@gto8ADB^waCgeU`T^Ru;%ode&P^ywjtN*|& z$TPSlLnhwwc+GE7W!SI<1z-ZB-s4d!81UEYxE;2%n3hzp`VbiH!y@p3cg&>bR?Y%a zialzONE@|!y$s&JFb=A)VV_BfWs}qZN)XckKn&84xsGQDK^2e;9AGpSjgzcF9~e$q zlX2~G$h9phFLa!gg<)OG^&%EXT!Xp{2;|!cixI#$*c5~SDEqnTdo?dIhMmkrr4_(f z74XhZR9fQg-6HmQv>Q9Ft4iB-eRYO!$Ng3 zs3~jn57i8klKFM181Us``6(otEC-AeK?5QPC%pU!S`d@vRp>xRD-eM)AF9)h~K}-xGoKAt}9eG5;-98 z4c8s&gYd$N;(XMo!cKX+ut9>s8 z44TU*RyqrL@d^AWZ|g0{1MpU;CLE`s&p{Fj^|un|`;eOeXukoIegO8NoePxYyj*=*!ON?4s$;V4kC|JEOCU pW;>&^i*9$u&0hLr3t+fTI=5zDF8^u2Tz!3O?yb82e+-j`?j2VkSsDNU diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_iter.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_iter.cpython-311.pyc deleted file mode 100644 index 590a29634d22207756aa5575e992e9a43ae22416..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2291 zcmah~&1)M+6rWkGw6bJdu^q>8pvk5=G;&=jiA&?SC6JV)1UC-Fj-e`HHP)`IjrT*$ zuIhf6_SCG&h0i#izbE`iM47=xFrj&BuE) z^ZU(v`(s~Uf}7>Jckq%Q;!-vK7t6 z^r#-Q6g!@a+da7+JCRG+$y^fV2leEaa;{e&(o@j(NyLz0E!~j_*@b_z0@17A$fjjQu> zw}Kcq{AKPO40P<;Qw8+gE(qQ!Lg@YqDAR-jfPUBf2Jt)BCggTU4+FvvZ;;24w#)8z z2Rgf*0f%moD?rG4WS%^dz7m80fYRE9&rQS9Rlj5)culm%;AUg$0`m-AbscrJWWY3{ z`Ht6x?gB!e6oIgvYNWI zL@$~^LS`l{ z3B>py><#)6X!r;S58tAy@*!w~o(|-E6#BTx`xHbA-qiS$o3+$LJvC94UsLx|0}t=q zzjJTx!CF-weN*Mb;IKQK<{{Fi=Wd0-hTKE|aJv5;D6fVRW~CjN-9<`7xl8?yPRIrg zQ^9*B9D|iFL+GxwA8wq<0hb&MOVIKmwT`W0}t-N*wx<$c7 znL}vk7=jD8je?&^BvdHZiY+2b41;m12>EX+UtpGnPdu;Y^O|O&JKxYXEuUAJ?{jlu z**C_8eKR+S4Y=VgTfPe0p*bc^v%Sj=4ER;kGse}H0drc(6|$_zt)YyOhZx8=H)w8- z-V9bKiKK!_1eX`BO6wM5vxcEE%X7!nDLmj*z8T7y%Mj5VZVPFdS*>i63EfECBIxZN zn@L9l1(G*<3gT@nf(Yb*K=xKyS-j(PL}a5tffI_A5l}pQ1ORLEF~{4;@l!B-0{-3% zh)wd(5t2HxUHJCmllN==XX^cDHa~f$q_&lsa$TU;BRypZjH^HhjK5e7=^PtS2X{@}zjpX;~bGC&4}MMbQT$9cxCJ7{yQ%Ii+j< zKUT-k>QJC)n(h`fEl6luaT&fohNf}6S`c^3_(^m*$L~!L^DCI3`628mTC0cexVcpv zHGIm=(8rMGDhdSTDG_HESRKSavR!@IGA{Bln8H-${RW~Dp_Dcb5qiE#K6p;vu7>L# zIZ+MQJu+Br*XQJ1_5W%kCeh0jAb(XRBJ@~;ghelj4{ok)pWOberi|2;kxjV~OVJAr J@&+O9_b(k4Nsa&j diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_named.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_named.cpython-311.pyc deleted file mode 100644 index 5633cdfe5c156ca1788c3da8861d1bb2aea7f6b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5768 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 a_!h^$>r4!giK*?-1wk0vCO;IibN>f;YZHY4 diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_orderedbase.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_orderedbase.cpython-311.pyc deleted file mode 100644 index 7c8966b58dca8fdab1f872cabb8cafb515f923a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13625 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 diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_orderedbidict.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/_orderedbidict.cpython-311.pyc deleted file mode 100644 index 0cef9735f8b85abe9c1687125d975d2d703ac539..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8181 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 diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/metadata.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/bidict/__pycache__/metadata.cpython-311.pyc deleted file mode 100644 index da501a22f6661c901b10c6e99dc5230959801987..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 583 zcmZ8dyN=U96dmW~#Y++d5)=qA4J%T_c1*zd=orGD^!2MA~jEu1RRP^Uygny64_=fAsqvg7_uAvXd4!|+Iw*Q6u>vc zP>h%pJFLaptnN^})=C;Bt9uu8x`Qw0ITe|osC?AgbR^CBrpueB@*(u{^9n~{ z_J{JFhVwmgeRI$`zo?4(oNZ=;X zqG%e~C1xVw(r_RkSL%$AD|Fq=`Gy5w45$V BidirectionalMapping[VT, KT]: - """The inverse of this bidirectional mapping instance. - - *See also* :attr:`bidict.BidictBase.inverse`, :attr:`bidict.BidictBase.inv` - - :raises NotImplementedError: Meant to be overridden in subclasses. - """ - # The @abstractmethod decorator prevents BidirectionalMapping subclasses from being - # instantiated unless they override ``.inverse``. So this implementation of ``.inverse`` - # should never be unintentionally resolved from subclass instances. But raise here - # anyway, so it's extra clear that this implementation should never be called. - raise NotImplementedError - - def __inverted__(self) -> t.Iterator[tuple[VT, KT]]: - """Get an iterator over the items in :attr:`inverse`. - - This is functionally equivalent to iterating over the items in the - forward mapping and inverting each one on the fly, but this provides a - more efficient implementation: Assuming the already-inverted items - are stored in :attr:`inverse`, just return an iterator over them directly. - - Providing this default implementation enables external functions, - particularly :func:`~bidict.inverted`, to use this optimized - implementation when available, instead of having to invert on the fly. - - *See also* :func:`bidict.inverted` - """ - return iter(self.inverse.items()) - - -class MutableBidirectionalMapping(BidirectionalMapping[KT, VT], t.MutableMapping[KT, VT]): - """Abstract base class for mutable bidirectional mapping types.""" - - __slots__ = () - - -# * Code review nav * -#============================================================================== -# ← Prev: __init__.py Current: _abc.py Next: _base.py → -#============================================================================== diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/_base.py b/venv_flaskchat/lib/python3.11/site-packages/bidict/_base.py deleted file mode 100644 index 97be9d4..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict/_base.py +++ /dev/null @@ -1,552 +0,0 @@ -# Copyright 2009-2022 Joshua Bronson. All rights reserved. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - - -# * Code review nav * -# (see comments in __init__.py) -#============================================================================== -# ← Prev: _abc.py Current: _base.py Next: _frozenbidict.py → -#============================================================================== - - -"""Provide :class:`BidictBase`.""" - -from __future__ import annotations -from functools import partial -from itertools import starmap -from operator import eq -from types import MappingProxyType -import typing as t -import weakref - -from ._abc import BidirectionalMapping -from ._dup import ON_DUP_DEFAULT, RAISE, DROP_OLD, DROP_NEW, OnDup -from ._exc import DuplicationError, KeyDuplicationError, ValueDuplicationError, KeyAndValueDuplicationError -from ._iter import iteritems, inverted -from ._typing import KT, VT, MISSING, OKT, OVT, Items, MapOrItems, TypeAlias - - -OldKV: TypeAlias = 'tuple[OKT[KT], OVT[VT]]' -DedupResult: TypeAlias = 'OldKV[KT, VT] | None' -Write: TypeAlias = 'list[t.Callable[[], None]]' -Unwrite: TypeAlias = Write -PreparedWrite: TypeAlias = 'tuple[Write, Unwrite]' -BT = t.TypeVar('BT', bound='BidictBase[t.Any, t.Any]') - - -class BidictKeysView(t.KeysView[KT], t.ValuesView[KT]): - """Since the keys of a bidict are the values of its inverse (and vice versa), - the :class:`~collections.abc.ValuesView` result of calling *bi.values()* - is also a :class:`~collections.abc.KeysView` of *bi.inverse*. - """ - - -def get_arg(*args: MapOrItems[KT, VT]) -> MapOrItems[KT, VT]: - """Ensure there's only a single arg in *args*, then return it.""" - if len(args) > 1: - raise TypeError(f'Expected at most 1 positional argument, got {len(args)}') - return args[0] if args else () - - -class BidictBase(BidirectionalMapping[KT, VT]): - """Base class implementing :class:`BidirectionalMapping`.""" - - #: The default :class:`~bidict.OnDup` - #: that governs behavior when a provided item - #: duplicates the key or value of other item(s). - #: - #: *See also* - #: :ref:`basic-usage:Values Must Be Unique` (https://bidict.rtfd.io/basic-usage.html#values-must-be-unique), - #: :doc:`extending` (https://bidict.rtfd.io/extending.html) - on_dup = ON_DUP_DEFAULT - - _fwdm: t.MutableMapping[KT, VT] #: the backing forward mapping (*key* → *val*) - _invm: t.MutableMapping[VT, KT] #: the backing inverse mapping (*val* → *key*) - - # Use Any rather than KT/VT in the following to avoid "ClassVar cannot contain type variables" errors: - _fwdm_cls: t.ClassVar[t.Type[t.MutableMapping[t.Any, t.Any]]] = dict #: class of the backing forward mapping - _invm_cls: t.ClassVar[t.Type[t.MutableMapping[t.Any, t.Any]]] = dict #: class of the backing inverse mapping - - #: The class of the inverse bidict instance. - _inv_cls: t.ClassVar[t.Type[BidictBase[t.Any, t.Any]]] - - #: Used by :meth:`__repr__` for the contained items. - _repr_delegate: t.ClassVar[t.Any] = dict - - def __init_subclass__(cls) -> None: - super().__init_subclass__() - cls._init_class() - - @classmethod - def _init_class(cls) -> None: - cls._ensure_inv_cls() - cls._set_reversed() - - __reversed__: t.Any - - @classmethod - def _set_reversed(cls) -> None: - """Set __reversed__ for subclasses that do not set it explicitly - according to whether backing mappings are reversible. - """ - if cls is not BidictBase: - resolved = cls.__reversed__ - overridden = resolved is not BidictBase.__reversed__ - if overridden: # E.g. OrderedBidictBase, OrderedBidict, FrozenOrderedBidict - return - # The following will be False for MutableBidict, bidict, and frozenbidict on Python < 3.8, - # and True for them on 3.8+ (where dicts are reversible). Will also be True for custom - # subclasses like SortedBidict (see https://bidict.rtfd.io/extending.html#sortedbidict-recipes). - backing_reversible = all(issubclass(i, t.Reversible) for i in (cls._fwdm_cls, cls._invm_cls)) - cls.__reversed__ = _fwdm_reversed if backing_reversible else None - - @classmethod - def _ensure_inv_cls(cls) -> None: - """Ensure :attr:`_inv_cls` is set, computing it dynamically if necessary. - - See: :ref:`extending:Dynamic Inverse Class Generation` - (https://bidict.rtfd.io/extending.html#dynamic-inverse-class-generation) - - Most subclasses will be their own inverse classes, but some - (e.g. those created via namedbidict) will have distinct inverse classes. - """ - if cls.__dict__.get('_inv_cls'): - return # Already set, nothing to do. - cls._inv_cls = cls._make_inv_cls() - - @classmethod - def _make_inv_cls(cls: t.Type[BT], _miss: t.Any = object()) -> t.Type[BT]: - diff = cls._inv_cls_dict_diff() - cls_is_own_inv = all(getattr(cls, k, _miss) == v for (k, v) in diff.items()) - if cls_is_own_inv: - return cls - # Suppress auto-calculation of _inv_cls's _inv_cls since we know it already. - # Works with the guard in BidictBase._ensure_inv_cls() to prevent infinite recursion. - diff['_inv_cls'] = cls - inv_cls = type(f'{cls.__name__}Inv', (cls, GeneratedBidictInverse), diff) - inv_cls.__module__ = cls.__module__ - return t.cast(t.Type[BT], inv_cls) - - @classmethod - def _inv_cls_dict_diff(cls) -> dict[str, t.Any]: - return { - '_fwdm_cls': cls._invm_cls, - '_invm_cls': cls._fwdm_cls, - } - - @t.overload - def __init__(self, **kw: VT) -> None: ... - @t.overload - def __init__(self, __m: t.Mapping[KT, VT], **kw: VT) -> None: ... - @t.overload - def __init__(self, __i: Items[KT, VT], **kw: VT) -> None: ... - - def __init__(self, *args: MapOrItems[KT, VT], **kw: VT) -> None: - """Make a new bidirectional mapping. - The signature behaves like that of :class:`dict`. - Items passed in are added in the order they are passed, - respecting the :attr:`on_dup` class attribute in the process. - """ - self._fwdm = self._fwdm_cls() - self._invm = self._invm_cls() - if args or kw: - self._update(get_arg(*args), kw, rbof=False) - - # If Python ever adds support for higher-kinded types, `inverse` could use them, e.g. - # def inverse(self: BT[KT, VT]) -> BT[VT, KT]: - # Ref: https://github.com/python/typing/issues/548#issuecomment-621571821 - @property - def inverse(self) -> BidictBase[VT, KT]: - """The inverse of this bidirectional mapping instance.""" - # When `bi.inverse` is called for the first time, this method - # computes the inverse instance, stores it for subsequent use, and then - # returns it. It also stores a reference on `bi.inverse` back to `bi`, - # but uses a weakref to avoid creating a reference cycle. Strong references - # to inverse instances are stored in ._inv, and weak references are stored - # in ._invweak. - - # First check if a strong reference is already stored. - inv: BidictBase[VT, KT] | None = getattr(self, '_inv', None) - if inv is not None: - return inv - # Next check if a weak reference is already stored. - invweak = getattr(self, '_invweak', None) - if invweak is not None: - inv = invweak() # Try to resolve a strong reference and return it. - if inv is not None: - return inv - # No luck. Compute the inverse reference and store it for subsequent use. - inv = self._make_inverse() - self._inv: BidictBase[VT, KT] | None = inv - self._invweak: weakref.ReferenceType[BidictBase[VT, KT]] | None = None - # Also store a weak reference back to `instance` on its inverse instance, so that - # the second `.inverse` access in `bi.inverse.inverse` hits the cached weakref. - inv._inv = None - inv._invweak = weakref.ref(self) - # In e.g. `bidict().inverse.inverse`, this design ensures that a strong reference - # back to the original instance is retained before its refcount drops to zero, - # avoiding an unintended potential deallocation. - return inv - - def _make_inverse(self) -> BidictBase[VT, KT]: - inv: BidictBase[VT, KT] = self._inv_cls() - inv._fwdm = self._invm - inv._invm = self._fwdm - return inv - - @property - def inv(self) -> BidictBase[VT, KT]: - """Alias for :attr:`inverse`.""" - return self.inverse - - def __repr__(self) -> str: - """See :func:`repr`.""" - clsname = self.__class__.__name__ - items = self._repr_delegate(self.items()) if self else '' - return f'{clsname}({items})' - - def values(self) -> BidictKeysView[VT]: - """A set-like object providing a view on the contained values. - - Since the values of a bidict are equivalent to the keys of its inverse, - this method returns a set-like object for this bidict's values - rather than just a collections.abc.ValuesView. - This object supports set operations like union and difference, - and constant- rather than linear-time containment checks, - and is no more expensive to provide than the less capable - collections.abc.ValuesView would be. - - See :meth:`keys` for more information. - """ - return t.cast(BidictKeysView[VT], self.inverse.keys()) - - def keys(self) -> t.KeysView[KT]: - """A set-like object providing a view on the contained keys. - - When *b._fwdm* is a :class:`dict`, *b.keys()* returns a - *dict_keys* object that behaves exactly the same as - *collections.abc.KeysView(b)*, except for - - - offering better performance - - - being reversible on Python 3.8+ - - - having a .mapping attribute in Python 3.10+ - that exposes a mappingproxy to *b._fwdm*. - """ - fwdm = self._fwdm - kv = fwdm.keys() if isinstance(fwdm, dict) else BidictKeysView(self) - return kv - - def items(self) -> t.ItemsView[KT, VT]: - """A set-like object providing a view on the contained items. - - When *b._fwdm* is a :class:`dict`, *b.items()* returns a - *dict_items* object that behaves exactly the same as - *collections.abc.ItemsView(b)*, except for: - - - offering better performance - - - being reversible on Python 3.8+ - - - having a .mapping attribute in Python 3.10+ - that exposes a mappingproxy to *b._fwdm*. - """ - return self._fwdm.items() if isinstance(self._fwdm, dict) else super().items() - - # The inherited collections.abc.Mapping.__contains__() method is implemented by doing a `try` - # `except KeyError` around `self[key]`. The following implementation is much faster, - # especially in the missing case. - def __contains__(self, key: t.Any) -> bool: - """True if the mapping contains the specified key, else False.""" - return key in self._fwdm - - # The inherited collections.abc.Mapping.__eq__() method is implemented in terms of an inefficient - # `dict(self.items()) == dict(other.items())` comparison, so override it with a - # more efficient implementation. - def __eq__(self, other: object) -> bool: - """*x.__eq__(other) ⟺ x == other* - - Equivalent to *dict(x.items()) == dict(other.items())* - but more efficient. - - Note that :meth:`bidict's __eq__() ` implementation - is inherited by subclasses, - in particular by the ordered bidict subclasses, - so even with ordered bidicts, - :ref:`== comparison is order-insensitive ` - (https://bidict.rtfd.io/other-bidict-types.html#eq-is-order-insensitive). - - *See also* :meth:`equals_order_sensitive` - """ - if isinstance(other, t.Mapping): - return self._fwdm.items() == other.items() - # Ref: https://docs.python.org/3/library/constants.html#NotImplemented - return NotImplemented - - def equals_order_sensitive(self, other: object) -> bool: - """Order-sensitive equality check. - - *See also* :ref:`eq-order-insensitive` - (https://bidict.rtfd.io/other-bidict-types.html#eq-is-order-insensitive) - """ - if not isinstance(other, t.Mapping) or len(self) != len(other): - return False - return all(starmap(eq, zip(self.items(), other.items()))) - - def _dedup(self, key: KT, val: VT, on_dup: OnDup) -> DedupResult[KT, VT]: - """Check *key* and *val* for any duplication in self. - - Handle any duplication as per the passed in *on_dup*. - - If (key, val) is already present, return None - since writing (key, val) would be a no-op. - - If duplication is found and the corresponding :class:`~bidict.OnDupAction` is - :attr:`~bidict.DROP_NEW`, return None. - - If duplication is found and the corresponding :class:`~bidict.OnDupAction` is - :attr:`~bidict.RAISE`, raise the appropriate exception. - - If duplication is found and the corresponding :class:`~bidict.OnDupAction` is - :attr:`~bidict.DROP_OLD`, or if no duplication is found, - return *(oldkey, oldval)*. - """ - fwdm, invm = self._fwdm, self._invm - oldval: OVT[VT] = fwdm.get(key, MISSING) - oldkey: OKT[KT] = invm.get(val, MISSING) - isdupkey, isdupval = oldval is not MISSING, oldkey is not MISSING - if isdupkey and isdupval: - if key == oldkey: - assert val == oldval - # (key, val) duplicates an existing item -> no-op. - return None - # key and val each duplicate a different existing item. - if on_dup.kv is RAISE: - raise KeyAndValueDuplicationError(key, val) - if on_dup.kv is DROP_NEW: - return None - assert on_dup.kv is DROP_OLD - # Fall through to the return statement on the last line. - elif isdupkey: - if on_dup.key is RAISE: - raise KeyDuplicationError(key) - if on_dup.key is DROP_NEW: - return None - assert on_dup.key is DROP_OLD - # Fall through to the return statement on the last line. - elif isdupval: - if on_dup.val is RAISE: - raise ValueDuplicationError(val) - if on_dup.val is DROP_NEW: - return None - assert on_dup.val is DROP_OLD - # Fall through to the return statement on the last line. - # else neither isdupkey nor isdupval. - return oldkey, oldval - - def _prep_write(self, newkey: KT, newval: VT, oldkey: OKT[KT], oldval: OVT[VT], save_unwrite: bool) -> PreparedWrite: - """Given (newkey, newval) to insert, return the list of operations necessary to perform the write. - - *oldkey* and *oldval* are as returned by :meth:`_dedup`. - - If *save_unwrite* is true, also return the list of inverse operations necessary to undo the write. - This design allows :meth:`_update` to roll back a partially applied update that fails part-way through - when necessary. This design also allows subclasses that require additional operations to complete - a write to easily extend this implementation. For example, :class:`bidict.OrderedBidictBase` calls this - inherited implementation, and then extends the list of ops returned with additional operations - needed to keep its internal linked list nodes consistent with its items' order as changes are made. - """ - fwdm, invm = self._fwdm, self._invm - write: list[t.Callable[[], None]] = [ - partial(fwdm.__setitem__, newkey, newval), - partial(invm.__setitem__, newval, newkey), - ] - unwrite: list[t.Callable[[], None]] - if oldval is MISSING and oldkey is MISSING: # no key or value duplication - # {0: 1, 2: 3} + (4, 5) => {0: 1, 2: 3, 4: 5} - unwrite = [ - partial(fwdm.__delitem__, newkey), - partial(invm.__delitem__, newval), - ] if save_unwrite else [] - elif oldval is not MISSING and oldkey is not MISSING: # key and value duplication across two different items - # {0: 1, 2: 3} + (0, 3) => {0: 3} - write.extend(( - partial(fwdm.__delitem__, oldkey), - partial(invm.__delitem__, oldval), - )) - unwrite = [ - partial(fwdm.__setitem__, newkey, oldval), - partial(invm.__setitem__, oldval, newkey), - partial(fwdm.__setitem__, oldkey, newval), - partial(invm.__setitem__, newval, oldkey), - ] if save_unwrite else [] - elif oldval is not MISSING: # just key duplication - # {0: 1, 2: 3} + (2, 4) => {0: 1, 2: 4} - write.append(partial(invm.__delitem__, oldval)) - unwrite = [ - partial(fwdm.__setitem__, newkey, oldval), - partial(invm.__setitem__, oldval, newkey), - partial(invm.__delitem__, newval), - ] if save_unwrite else [] - else: - assert oldkey is not MISSING # just value duplication - # {0: 1, 2: 3} + (4, 3) => {0: 1, 4: 3} - write.append(partial(fwdm.__delitem__, oldkey)) - unwrite = [ - partial(fwdm.__setitem__, oldkey, newval), - partial(invm.__setitem__, newval, oldkey), - partial(fwdm.__delitem__, newkey), - ] if save_unwrite else [] - return write, unwrite - - def _update( - self, - arg: MapOrItems[KT, VT], - kw: t.Mapping[str, VT] = MappingProxyType({}), - *, - rbof: bool | None = None, - on_dup: OnDup | None = None, - ) -> None: - """Update, possibly rolling back on failure as per *rbof*.""" - # Must process input in a single pass, since arg may be a generator. - if not arg and not kw: - return - if on_dup is None: - on_dup = self.on_dup - if rbof is None: - rbof = RAISE in on_dup - if not self and not kw: - if isinstance(arg, BidictBase): # can skip dup check - self._init_from(arg) - return - # If arg is not a BidictBase, fall through to the general treatment below, - # which includes duplication checking. (If arg is some BidirectionalMapping - # that does not inherit from BidictBase, it's a foreign implementation, so we - # perform duplication checking to err on the safe side.) - - # If we roll back on failure and we know that there are more updates to process than - # already-contained items, our rollback strategy is to update a copy of self (without - # rolling back on failure), and then to become the copy if all updates succeed. - if rbof and isinstance(arg, t.Sized) and len(arg) + len(kw) > len(self): - target = self.copy() - target._update(arg, kw, rbof=False, on_dup=on_dup) - self._init_from(target) - return - - # There are more already-contained items than updates to process, or we don't know - # how many updates there are to process. If we need to roll back on failure, - # save a log of Unwrites as we update so we can undo changes if the update fails. - unwrites: list[Unwrite] = [] - append_unwrite = unwrites.append - prep_write = self._prep_write - for (key, val) in iteritems(arg, **kw): - try: - dedup_result = self._dedup(key, val, on_dup) - except DuplicationError: - if rbof: - while unwrites: # apply saved unwrites - unwrite = unwrites.pop() - for unwriteop in unwrite: - unwriteop() - raise - if dedup_result is None: # no-op - continue - write, unwrite = prep_write(key, val, *dedup_result, save_unwrite=rbof) - for writeop in write: # apply the write - writeop() - if rbof and unwrite: # save the unwrite for later application if needed - append_unwrite(unwrite) - - def copy(self: BT) -> BT: - """Make a (shallow) copy of this bidict.""" - # Could just `return self.__class__(self)` here, but the below is faster. The former - # would copy this bidict's items into a new instance one at a time (checking for duplication - # for each item), whereas the below copies from the backing mappings all at once, and foregoes - # item-by-item duplication checking since the backing mappings have been checked already. - return self._from_other(self.__class__, self) - - @staticmethod - def _from_other(bt: t.Type[BT], other: MapOrItems[KT, VT], inv: bool = False) -> BT: - """Fast, private constructor based on :meth:`_init_from`. - - If *inv* is true, return the inverse of the instance instead of the instance itself. - (Useful for pickling with dynamically-generated inverse classes -- see :meth:`__reduce__`.) - """ - inst = bt() - inst._init_from(other) - return t.cast(BT, inst.inverse) if inv else inst - - def _init_from(self, other: MapOrItems[KT, VT]) -> None: - """Fast init from *other*, bypassing item-by-item duplication checking.""" - self._fwdm.clear() - self._invm.clear() - self._fwdm.update(other) - # If other is a bidict, use its existing backing inverse mapping, otherwise - # other could be a generator that's now exhausted, so invert self._fwdm on the fly. - inv = other.inverse if isinstance(other, BidictBase) else inverted(self._fwdm) - self._invm.update(inv) - - #: Used for the copy protocol. - #: *See also* the :mod:`copy` module - __copy__ = copy - - def __or__(self: BT, other: t.Mapping[KT, VT]) -> BT: - """Return self|other.""" - if not isinstance(other, t.Mapping): - return NotImplemented - new = self.copy() - new._update(other, rbof=False) - return new - - def __ror__(self: BT, other: t.Mapping[KT, VT]) -> BT: - """Return other|self.""" - if not isinstance(other, t.Mapping): - return NotImplemented - new = self.__class__(other) - new._update(self, rbof=False) - return new - - def __len__(self) -> int: - """The number of contained items.""" - return len(self._fwdm) - - def __iter__(self) -> t.Iterator[KT]: - """Iterator over the contained keys.""" - return iter(self._fwdm) - - def __getitem__(self, key: KT) -> VT: - """*x.__getitem__(key) ⟺ x[key]*""" - return self._fwdm[key] - - def __reduce__(self) -> tuple[t.Any, ...]: - """Return state information for pickling.""" - # If this bidict's class is dynamically generated, pickle the inverse instead, whose - # (presumably not dynamically generated) class the caller is more likely to have a reference to - # somewhere in sys.modules that pickle can discover. - should_invert = isinstance(self, GeneratedBidictInverse) - cls, init_from = (self._inv_cls, self.inverse) if should_invert else (self.__class__, self) - return self._from_other, (cls, dict(init_from), should_invert) # type: ignore [call-overload] - - -# See BidictBase._set_reversed() above. -def _fwdm_reversed(self: BidictBase[KT, t.Any]) -> t.Iterator[KT]: - """Iterator over the contained keys in reverse order.""" - assert isinstance(self._fwdm, t.Reversible) - return reversed(self._fwdm) - - -BidictBase._init_class() - - -class GeneratedBidictInverse: - """Base class for dynamically-generated inverse bidict classes.""" - - -# * Code review nav * -#============================================================================== -# ← Prev: _abc.py Current: _base.py Next: _frozenbidict.py → -#============================================================================== diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/_bidict.py b/venv_flaskchat/lib/python3.11/site-packages/bidict/_bidict.py deleted file mode 100644 index 2cd1f54..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict/_bidict.py +++ /dev/null @@ -1,198 +0,0 @@ -# Copyright 2009-2022 Joshua Bronson. All rights reserved. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - - -# * Code review nav * -# (see comments in __init__.py) -#============================================================================== -# ← Prev: _frozenbidict.py Current: _bidict.py Next: _orderedbase.py → -#============================================================================== - - -"""Provide :class:`MutableBidict`.""" - -from __future__ import annotations -import typing as t - -from ._abc import MutableBidirectionalMapping -from ._base import BidictBase, get_arg -from ._dup import OnDup, ON_DUP_RAISE, ON_DUP_DROP_OLD -from ._typing import KT, VT, DT, ODT, MISSING, Items, MapOrItems - - -class MutableBidict(BidictBase[KT, VT], MutableBidirectionalMapping[KT, VT]): - """Base class for mutable bidirectional mappings.""" - - if t.TYPE_CHECKING: - @property - def inverse(self) -> MutableBidict[VT, KT]: ... - - def _pop(self, key: KT) -> VT: - val = self._fwdm.pop(key) - del self._invm[val] - return val - - def __delitem__(self, key: KT) -> None: - """*x.__delitem__(y) ⟺ del x[y]*""" - self._pop(key) - - def __setitem__(self, key: KT, val: VT) -> None: - """Set the value for *key* to *val*. - - If *key* is already associated with *val*, this is a no-op. - - If *key* is already associated with a different value, - the old value will be replaced with *val*, - as with dict's :meth:`__setitem__`. - - If *val* is already associated with a different key, - an exception is raised - to protect against accidental removal of the key - that's currently associated with *val*. - - Use :meth:`put` instead if you want to specify different behavior in - the case that the provided key or value duplicates an existing one. - Or use :meth:`forceput` to unconditionally associate *key* with *val*, - replacing any existing items as necessary to preserve uniqueness. - - :raises bidict.ValueDuplicationError: if *val* duplicates that of an - existing item. - - :raises bidict.KeyAndValueDuplicationError: if *key* duplicates the key of an - existing item and *val* duplicates the value of a different - existing item. - """ - self.put(key, val, on_dup=self.on_dup) - - def put(self, key: KT, val: VT, on_dup: OnDup = ON_DUP_RAISE) -> None: - """Associate *key* with *val*, honoring the :class:`OnDup` given in *on_dup*. - - For example, if *on_dup* is :attr:`~bidict.ON_DUP_RAISE`, - then *key* will be associated with *val* if and only if - *key* is not already associated with an existing value and - *val* is not already associated with an existing key, - otherwise an exception will be raised. - - If *key* is already associated with *val*, this is a no-op. - - :raises bidict.KeyDuplicationError: if attempting to insert an item - whose key only duplicates an existing item's, and *on_dup.key* is - :attr:`~bidict.RAISE`. - - :raises bidict.ValueDuplicationError: if attempting to insert an item - whose value only duplicates an existing item's, and *on_dup.val* is - :attr:`~bidict.RAISE`. - - :raises bidict.KeyAndValueDuplicationError: if attempting to insert an - item whose key duplicates one existing item's, and whose value - duplicates another existing item's, and *on_dup.kv* is - :attr:`~bidict.RAISE`. - """ - self._update([(key, val)], on_dup=on_dup) - - def forceput(self, key: KT, val: VT) -> None: - """Associate *key* with *val* unconditionally. - - Replace any existing mappings containing key *key* or value *val* - as necessary to preserve uniqueness. - """ - self.put(key, val, on_dup=ON_DUP_DROP_OLD) - - def clear(self) -> None: - """Remove all items.""" - self._fwdm.clear() - self._invm.clear() - - @t.overload - def pop(self, __key: KT) -> VT: ... - @t.overload - def pop(self, __key: KT, __default: DT = ...) -> VT | DT: ... - - def pop(self, key: KT, default: ODT[DT] = MISSING) -> VT | DT: - """*x.pop(k[, d]) → v* - - Remove specified key and return the corresponding value. - - :raises KeyError: if *key* is not found and no *default* is provided. - """ - try: - return self._pop(key) - except KeyError: - if default is MISSING: - raise - return default - - def popitem(self) -> tuple[KT, VT]: - """*x.popitem() → (k, v)* - - Remove and return some item as a (key, value) pair. - - :raises KeyError: if *x* is empty. - """ - key, val = self._fwdm.popitem() - del self._invm[val] - return key, val - - @t.overload # type: ignore [override] # https://github.com/jab/bidict/pull/242#discussion_r825464731 - def update(self, __m: t.Mapping[KT, VT], **kw: VT) -> None: ... - @t.overload - def update(self, __i: Items[KT, VT], **kw: VT) -> None: ... - @t.overload - def update(self, **kw: VT) -> None: ... - - def update(self, *args: MapOrItems[KT, VT], **kw: VT) -> None: - """Like calling :meth:`putall` with *self.on_dup* passed for *on_dup*.""" - if args or kw: - self._update(get_arg(*args), kw) - - @t.overload - def forceupdate(self, __m: t.Mapping[KT, VT], **kw: VT) -> None: ... - @t.overload - def forceupdate(self, __i: Items[KT, VT], **kw: VT) -> None: ... - @t.overload - def forceupdate(self, **kw: VT) -> None: ... - - def forceupdate(self, *args: MapOrItems[KT, VT], **kw: VT) -> None: - """Like a bulk :meth:`forceput`.""" - if args or kw: - self._update(get_arg(*args), kw, on_dup=ON_DUP_DROP_OLD) - - def __ior__(self, other: t.Mapping[KT, VT]) -> MutableBidict[KT, VT]: - """Return self|=other.""" - self.update(other) - return self - - @t.overload - def putall(self, items: t.Mapping[KT, VT], on_dup: OnDup) -> None: ... - @t.overload - def putall(self, items: Items[KT, VT], on_dup: OnDup = ...) -> None: ... - - def putall(self, items: MapOrItems[KT, VT], on_dup: OnDup = ON_DUP_RAISE) -> None: - """Like a bulk :meth:`put`. - - If one of the given items causes an exception to be raised, - none of the items is inserted. - """ - if items: - self._update(items, on_dup=on_dup) - - -class bidict(MutableBidict[KT, VT]): - """The main bidirectional mapping type. - - See :ref:`intro:Introduction` and :ref:`basic-usage:Basic Usage` - to get started (also available at https://bidict.rtfd.io). - """ - - if t.TYPE_CHECKING: - @property - def inverse(self) -> bidict[VT, KT]: ... - - -# * Code review nav * -#============================================================================== -# ← Prev: _frozenbidict.py Current: _bidict.py Next: _orderedbase.py → -#============================================================================== diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/_dup.py b/venv_flaskchat/lib/python3.11/site-packages/bidict/_dup.py deleted file mode 100644 index c1ac9e3..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict/_dup.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 2009-2022 Joshua Bronson. All rights reserved. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - - -"""Provide :class:`OnDup` and related functionality.""" - - -from __future__ import annotations -from enum import Enum -import typing as t - - -class OD(Enum): - """An action to take to prevent duplication from occurring.""" - - #: Raise a :class:`~bidict.DuplicationError`. - RAISE = 'RAISE' - #: Overwrite existing items with new items. - DROP_OLD = 'DROP_OLD' - #: Keep existing items and drop new items. - DROP_NEW = 'DROP_NEW' - - def __repr__(self) -> str: - return f'{self.__class__.__name__}.{self.name}' - - -RAISE: t.Final[OD] = OD.RAISE -DROP_OLD: t.Final[OD] = OD.DROP_OLD -DROP_NEW: t.Final[OD] = OD.DROP_NEW - - -class OnDup(t.NamedTuple('_OnDup', [('key', OD), ('val', OD), ('kv', OD)])): - r"""A 3-tuple of :class:`OD`\s specifying how to handle the 3 kinds of duplication. - - *See also* :ref:`basic-usage:Values Must Be Unique` - (https://bidict.rtfd.io/basic-usage.html#values-must-be-unique) - - If *kv* is not specified, *val* will be used for *kv*. - """ - - __slots__ = () - - def __new__(cls, key: OD = DROP_OLD, val: OD = RAISE, kv: OD | None = None) -> OnDup: - """Override to provide user-friendly default values.""" - return super().__new__(cls, key, val, kv or val) - - -#: Default :class:`OnDup` used for the -#: :meth:`~bidict.bidict.__init__`, -#: :meth:`~bidict.bidict.__setitem__`, and -#: :meth:`~bidict.bidict.update` methods. -ON_DUP_DEFAULT: t.Final[OnDup] = OnDup(key=DROP_OLD, val=RAISE, kv=RAISE) -#: An :class:`OnDup` whose members are all :obj:`RAISE`. -ON_DUP_RAISE: t.Final[OnDup] = OnDup(key=RAISE, val=RAISE, kv=RAISE) -#: An :class:`OnDup` whose members are all :obj:`DROP_OLD`. -ON_DUP_DROP_OLD: t.Final[OnDup] = OnDup(key=DROP_OLD, val=DROP_OLD, kv=DROP_OLD) diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/_exc.py b/venv_flaskchat/lib/python3.11/site-packages/bidict/_exc.py deleted file mode 100644 index 936563b..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict/_exc.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright 2009-2022 Joshua Bronson. All rights reserved. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - - -"""Provide all bidict exceptions.""" - -from __future__ import annotations - - -class BidictException(Exception): - """Base class for bidict exceptions.""" - - -class DuplicationError(BidictException): - """Base class for exceptions raised when uniqueness is violated - as per the :attr:~bidict.RAISE` :class:`~bidict.OnDupAction`. - """ - - -class KeyDuplicationError(DuplicationError): - """Raised when a given key is not unique.""" - - -class ValueDuplicationError(DuplicationError): - """Raised when a given value is not unique.""" - - -class KeyAndValueDuplicationError(KeyDuplicationError, ValueDuplicationError): - """Raised when a given item's key and value are not unique. - - That is, its key duplicates that of another item, - and its value duplicates that of a different other item. - """ diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/_frozenbidict.py b/venv_flaskchat/lib/python3.11/site-packages/bidict/_frozenbidict.py deleted file mode 100644 index 9a65303..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict/_frozenbidict.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright 2009-2022 Joshua Bronson. All rights reserved. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - - -# * Code review nav * -# (see comments in __init__.py) -#============================================================================== -# ← Prev: _base.py Current: _frozenbidict.py Next: _bidict.py → -#============================================================================== - -"""Provide :class:`frozenbidict`, an immutable, hashable bidirectional mapping type.""" - -from __future__ import annotations -import typing as t - -from ._base import BidictBase -from ._typing import KT, VT - - -class frozenbidict(BidictBase[KT, VT]): - """Immutable, hashable bidict type.""" - - _hash: int - - # Work around lack of support for higher-kinded types in Python. - # Ref: https://github.com/python/typing/issues/548#issuecomment-621571821 - if t.TYPE_CHECKING: - @property - def inverse(self) -> frozenbidict[VT, KT]: ... - - def __hash__(self) -> int: - """The hash of this bidict as determined by its items.""" - if getattr(self, '_hash', None) is None: - # The following is like hash(frozenset(self.items())) - # but more memory efficient. See also: https://bugs.python.org/issue46684 - self._hash = t.ItemsView(self)._hash() - return self._hash - - -# * Code review nav * -#============================================================================== -# ← Prev: _base.py Current: _frozenbidict.py Next: _bidict.py → -#============================================================================== diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/_frozenordered.py b/venv_flaskchat/lib/python3.11/site-packages/bidict/_frozenordered.py deleted file mode 100644 index 56e4c7a..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict/_frozenordered.py +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright 2009-2022 Joshua Bronson. All rights reserved. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - - -# * Code review nav * -# (see comments in __init__.py) -#============================================================================== -#← Prev: _orderedbase.py Current: _frozenordered.py Next: _orderedbidict.py → -#============================================================================== - -"""Provide :class:`FrozenOrderedBidict`, an immutable, hashable, ordered bidict.""" - -from __future__ import annotations -import typing as t - -from ._frozenbidict import frozenbidict -from ._orderedbase import OrderedBidictBase -from ._typing import KT, VT - - -class FrozenOrderedBidict(OrderedBidictBase[KT, VT]): - """Hashable, immutable, ordered bidict type. - - Like a hashable :class:`bidict.OrderedBidict` - without the mutating APIs, or like a - reversible :class:`bidict.frozenbidict` even on Python < 3.8. - (All bidicts are order-preserving when never mutated, so frozenbidict is - already order-preserving, but only on Python 3.8+, where dicts are - reversible, are all bidicts (including frozenbidict) also reversible.) - - If you are using Python 3.8+, frozenbidict gives you everything that - FrozenOrderedBidict gives you, but with less space overhead. - On the other hand, using FrozenOrderedBidict when you are depending on - the ordering of the items can make the ordering dependence more explicit. - """ - - __hash__: t.Callable[[t.Any], int] = frozenbidict.__hash__ - - if t.TYPE_CHECKING: - @property - def inverse(self) -> FrozenOrderedBidict[VT, KT]: ... - - -# * Code review nav * -#============================================================================== -#← Prev: _orderedbase.py Current: _frozenordered.py Next: _orderedbidict.py → -#============================================================================== diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/_iter.py b/venv_flaskchat/lib/python3.11/site-packages/bidict/_iter.py deleted file mode 100644 index c06dc87..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict/_iter.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright 2009-2022 Joshua Bronson. All rights reserved. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - - -"""Functions for iterating over items in a mapping.""" - -from __future__ import annotations -from operator import itemgetter -import typing as t - -from ._typing import KT, VT, ItemsIter, MapOrItems - - -def iteritems_mapping_or_iterable(arg: MapOrItems[KT, VT]) -> ItemsIter[KT, VT]: - """Yield the items in *arg* based on whether it's a mapping.""" - yield from arg.items() if isinstance(arg, t.Mapping) else arg - - -def iteritems(__arg: MapOrItems[KT, VT], **kw: VT) -> ItemsIter[KT, VT]: - """Yield the items from *arg* and then any from *kw* in the order given.""" - yield from iteritems_mapping_or_iterable(__arg) - yield from kw.items() # type: ignore [misc] - - -swap = itemgetter(1, 0) - - -def inverted(arg: MapOrItems[KT, VT]) -> ItemsIter[VT, KT]: - """Yield the inverse items of the provided object. - - If *arg* has a :func:`callable` ``__inverted__`` attribute, - return the result of calling it. - - Otherwise, return an iterator over the items in `arg`, - inverting each item on the fly. - - *See also* :attr:`bidict.BidirectionalMapping.__inverted__` - """ - invattr = getattr(arg, '__inverted__', None) - if callable(invattr): - inv: ItemsIter[VT, KT] = invattr() - return inv - return map(swap, iteritems_mapping_or_iterable(arg)) diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/_named.py b/venv_flaskchat/lib/python3.11/site-packages/bidict/_named.py deleted file mode 100644 index c0ca4e4..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict/_named.py +++ /dev/null @@ -1,97 +0,0 @@ -# Copyright 2009-2022 Joshua Bronson. All rights reserved. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -"""Provide :func:`bidict.namedbidict`.""" - -from __future__ import annotations -from sys import _getframe -import typing as t - -from ._base import BidictBase -from ._bidict import bidict -from ._typing import KT, VT - - -class NamedBidictBase: - """Base class that namedbidicts derive from.""" - - -def namedbidict( - typename: str, - keyname: str, - valname: str, - *, - base_type: t.Type[BidictBase[KT, VT]] = bidict, -) -> t.Type[BidictBase[KT, VT]]: - r"""Create a new subclass of *base_type* with custom accessors. - - Like :func:`collections.namedtuple` for bidicts. - - The new class's ``__name__`` and ``__qualname__`` will be set to *typename*, - and its ``__module__`` will be set to the caller's module. - - Instances of the new class will provide access to their - :attr:`inverse ` instances - via the custom *keyname*\_for property, - and access to themselves - via the custom *valname*\_for property. - - *See also* the :ref:`namedbidict usage documentation - ` - (https://bidict.rtfd.io/other-bidict-types.html#namedbidict) - - :raises ValueError: if any of the *typename*, *keyname*, or *valname* - strings is not a valid Python identifier, or if *keyname == valname*. - - :raises TypeError: if *base_type* is not a :class:`bidict.BidictBase` subclass. - Any of the concrete bidict types pictured in the - :ref:`other-bidict-types:Bidict Types Diagram` may be provided - (https://bidict.rtfd.io/other-bidict-types.html#bidict-types-diagram). - """ - if not issubclass(base_type, BidictBase): - raise TypeError(f'{base_type} is not a BidictBase subclass') - names = (typename, keyname, valname) - if not all(map(str.isidentifier, names)) or keyname == valname: - raise ValueError(names) - - basename = base_type.__name__ - get_keyname = property(lambda self: keyname, doc='The keyname of this namedbidict.') - get_valname = property(lambda self: valname, doc='The valname of this namedbidict.') - val_by_key_name = f'{valname}_for' - key_by_val_name = f'{keyname}_for' - val_by_key_doc = f'{typename} forward {basename}: {keyname} -> {valname}' - key_by_val_doc = f'{typename} inverse {basename}: {valname} -> {keyname}' - get_val_by_key = property(lambda self: self, doc=val_by_key_doc) - get_key_by_val = property(lambda self: self.inverse, doc=key_by_val_doc) - - class NamedBidict(base_type, NamedBidictBase): # type: ignore [valid-type,misc] # https://github.com/python/mypy/issues/5865 - """NamedBidict.""" - - keyname = get_keyname - valname = get_valname - - @classmethod - def _inv_cls_dict_diff(cls) -> dict[str, t.Any]: - base_diff = super()._inv_cls_dict_diff() - return { - **base_diff, - 'keyname': get_valname, - 'valname': get_keyname, - val_by_key_name: get_key_by_val, - key_by_val_name: get_val_by_key, - } - - NamedInv = NamedBidict._inv_cls - assert NamedInv is not NamedBidict, 'namedbidict classes are not their own inverses' - setattr(NamedBidict, val_by_key_name, get_val_by_key) - setattr(NamedBidict, key_by_val_name, get_key_by_val) - NamedBidict.__name__ = NamedBidict.__qualname__ = typename - NamedInv.__name__ = NamedInv.__qualname__ = f'{typename}Inv' - NamedBidict.__doc__ = f'NamedBidict({basename}) {typename!r}: {keyname} -> {valname}' - NamedInv.__doc__ = f'NamedBidictInv({basename}) {typename!r}: {valname} -> {keyname}' - caller_module = _getframe(1).f_globals.get('__name__', '__main__') - NamedBidict.__module__ = NamedInv.__module__ = caller_module - return NamedBidict diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/_orderedbase.py b/venv_flaskchat/lib/python3.11/site-packages/bidict/_orderedbase.py deleted file mode 100644 index 2375e78..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict/_orderedbase.py +++ /dev/null @@ -1,238 +0,0 @@ -# Copyright 2009-2022 Joshua Bronson. All rights reserved. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - - -# * Code review nav * -# (see comments in __init__.py) -#============================================================================== -# ← Prev: _bidict.py Current: _orderedbase.py Next: _frozenordered.py → -#============================================================================== - - -"""Provide :class:`OrderedBidictBase`.""" - -from __future__ import annotations -from functools import partial -from weakref import ref as weakref -import typing as t - -from ._base import BidictBase, PreparedWrite -from ._bidict import bidict -from ._iter import iteritems -from ._typing import KT, VT, OKT, OVT, MISSING, Items, MapOrItems - - -IT = t.TypeVar('IT') # instance type -AT = t.TypeVar('AT') # attr type - - -class WeakAttr(t.Generic[IT, AT]): - """Descriptor to automatically manage (de)referencing the given slot as a weakref. - - See https://docs.python.org/3/howto/descriptor.html#managed-attributes - for an intro to using descriptors like this for managed attributes. - """ - - def __init__(self, *, slot: str) -> None: - self.slot = slot - - def __set__(self, instance: IT, value: AT) -> None: - setattr(instance, self.slot, weakref(value)) - - def __get__(self, instance: IT, owner: t.Any) -> AT: - return getattr(instance, self.slot)() # type: ignore [no-any-return] - - -class Node: - """A node in a circular doubly-linked list - used to encode the order of items in an ordered bidict. - - A weak reference to the previous node is stored - to avoid creating strong reference cycles. - Referencing/dereferencing the weakref is handled automatically by :class:`WeakAttr`. - """ - - prv: WeakAttr[Node, Node] = WeakAttr(slot='_prv_weak') - __slots__ = ('_prv_weak', 'nxt', '__weakref__') - - def __init__(self, prv: Node, nxt: Node) -> None: - self.prv = prv - self.nxt = nxt - - def unlink(self) -> None: - """Remove self from in between prv and nxt. - Self's references to prv and nxt are retained so it can be relinked (see below). - """ - self.prv.nxt = self.nxt - self.nxt.prv = self.prv - - def relink(self) -> None: - """Restore self between prv and nxt after unlinking (see above).""" - self.prv.nxt = self.nxt.prv = self - - -class SentinelNode(Node): - """Special node in a circular doubly-linked list - that links the first node with the last node. - When its next and previous references point back to itself - it represents an empty list. - """ - - nxt: WeakAttr['SentinelNode', Node] = WeakAttr(slot='_nxt_weak') # type: ignore [assignment] - __slots__ = ('_nxt_weak',) - - def __init__(self) -> None: - super().__init__(self, self) - - def iternodes(self, *, reverse: bool = False) -> t.Iterator[Node]: - """Iterator yielding nodes in the requested order.""" - attr = 'prv' if reverse else 'nxt' - node = getattr(self, attr) - while node is not self: - yield node - node = getattr(node, attr) - - def new_last_node(self) -> Node: - """Create and return a new terminal node.""" - old_last = self.prv - new_last = Node(old_last, self) - old_last.nxt = self.prv = new_last - return new_last - - -class OrderedBidictBase(BidictBase[KT, VT]): - """Base class implementing an ordered :class:`BidirectionalMapping`.""" - - _repr_delegate: t.ClassVar[t.Any] = list - - _node_by_korv: bidict[t.Any, Node] - _bykey: bool - - @t.overload - def __init__(self, __m: t.Mapping[KT, VT], **kw: VT) -> None: ... - @t.overload - def __init__(self, __i: Items[KT, VT], **kw: VT) -> None: ... - @t.overload - def __init__(self, **kw: VT) -> None: ... - - def __init__(self, *args: MapOrItems[KT, VT], **kw: VT) -> None: - """Make a new ordered bidirectional mapping. - The signature behaves like that of :class:`dict`. - Items passed in are added in the order they are passed, - respecting the :attr:`on_dup` class attribute in the process. - - The order in which items are inserted is remembered, - similar to :class:`collections.OrderedDict`. - """ - self._sntl = SentinelNode() - self._node_by_korv = bidict() - self._bykey = True - super().__init__(*args, **kw) - - if t.TYPE_CHECKING: - @property - def inverse(self) -> OrderedBidictBase[VT, KT]: ... - - def _make_inverse(self) -> OrderedBidictBase[VT, KT]: - inv = t.cast(OrderedBidictBase[VT, KT], super()._make_inverse()) - inv._sntl = self._sntl - inv._node_by_korv = self._node_by_korv - inv._bykey = not self._bykey - return inv - - def _assoc_node(self, node: Node, key: KT, val: VT) -> None: - korv = key if self._bykey else val - self._node_by_korv.forceput(korv, node) - - def _dissoc_node(self, node: Node) -> None: - del self._node_by_korv.inverse[node] - node.unlink() - - def _init_from(self, other: MapOrItems[KT, VT]) -> None: - """See :meth:`BidictBase._init_from`.""" - super()._init_from(other) - bykey = self._bykey - korv_by_node = self._node_by_korv.inverse - korv_by_node.clear() - korv_by_node_set = korv_by_node.__setitem__ - self._sntl.nxt = self._sntl.prv = self._sntl - new_node = self._sntl.new_last_node - for (k, v) in iteritems(other): - korv_by_node_set(new_node(), k if bykey else v) - - def _prep_write(self, newkey: KT, newval: VT, oldkey: OKT[KT], oldval: OVT[VT], save_unwrite: bool) -> PreparedWrite: - """See :meth:`bidict.BidictBase._prep_write`.""" - write, unwrite = super()._prep_write(newkey, newval, oldkey, oldval, save_unwrite) - assoc, dissoc = self._assoc_node, self._dissoc_node - node_by_korv, bykey = self._node_by_korv, self._bykey - if oldval is MISSING and oldkey is MISSING: # no key or value duplication - # {0: 1, 2: 3} + (4, 5) => {0: 1, 2: 3, 4: 5} - newnode = self._sntl.new_last_node() - write.append(partial(assoc, newnode, newkey, newval)) - if save_unwrite: - unwrite.append(partial(dissoc, newnode)) - elif oldval is not MISSING and oldkey is not MISSING: # key and value duplication across two different items - # {0: 1, 2: 3} + (0, 3) => {0: 3} - # n1, n2 => n1 (collapse n1 and n2 into n1) - # oldkey: 2, oldval: 1, oldnode: n2, newkey: 0, newval: 3, newnode: n1 - if bykey: - oldnode = node_by_korv[oldkey] - newnode = node_by_korv[newkey] - else: - oldnode = node_by_korv[newval] - newnode = node_by_korv[oldval] - write.extend(( - partial(dissoc, oldnode), - partial(assoc, newnode, newkey, newval), - )) - if save_unwrite: - unwrite.extend(( - partial(assoc, newnode, newkey, oldval), - partial(assoc, oldnode, oldkey, newval), - partial(oldnode.relink,), - )) - elif oldval is not MISSING: # just key duplication - # {0: 1, 2: 3} + (2, 4) => {0: 1, 2: 4} - # oldkey: MISSING, oldval: 3, newkey: 2, newval: 4 - node = node_by_korv[newkey if bykey else oldval] - write.append(partial(assoc, node, newkey, newval)) - if save_unwrite: - unwrite.append(partial(assoc, node, newkey, oldval)) - else: - assert oldkey is not MISSING # just value duplication - # {0: 1, 2: 3} + (4, 3) => {0: 1, 4: 3} - # oldkey: 2, oldval: MISSING, newkey: 4, newval: 3 - node = node_by_korv[oldkey if bykey else newval] - write.append(partial(assoc, node, newkey, newval)) - if save_unwrite: - unwrite.append(partial(assoc, node, oldkey, newval)) - return write, unwrite - - def __iter__(self) -> t.Iterator[KT]: - """Iterator over the contained keys in insertion order.""" - return self._iter(reverse=False) - - def __reversed__(self) -> t.Iterator[KT]: - """Iterator over the contained keys in reverse insertion order.""" - return self._iter(reverse=True) - - def _iter(self, *, reverse: bool = False) -> t.Iterator[KT]: - nodes = self._sntl.iternodes(reverse=reverse) - korv_by_node = self._node_by_korv.inverse - if self._bykey: - for node in nodes: - yield korv_by_node[node] - else: - key_by_val = self._invm - for node in nodes: - val = korv_by_node[node] - yield key_by_val[val] - - -# * Code review nav * -#============================================================================== -# ← Prev: _bidict.py Current: _orderedbase.py Next: _frozenordered.py → -#============================================================================== diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/_orderedbidict.py b/venv_flaskchat/lib/python3.11/site-packages/bidict/_orderedbidict.py deleted file mode 100644 index 96a57a1..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict/_orderedbidict.py +++ /dev/null @@ -1,160 +0,0 @@ -# Copyright 2009-2022 Joshua Bronson. All rights reserved. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - - -# * Code review nav * -# (see comments in __init__.py) -#============================================================================== -# ← Prev: _frozenordered.py Current: _orderedbidict.py -#============================================================================== - - -"""Provide :class:`OrderedBidict`.""" - -from __future__ import annotations -from collections.abc import Set -import typing as t - -from ._base import BidictKeysView -from ._bidict import MutableBidict -from ._orderedbase import OrderedBidictBase -from ._typing import KT, VT - - -class OrderedBidict(OrderedBidictBase[KT, VT], MutableBidict[KT, VT]): - """Mutable bidict type that maintains items in insertion order.""" - - if t.TYPE_CHECKING: - @property - def inverse(self) -> OrderedBidict[VT, KT]: ... - - def clear(self) -> None: - """Remove all items.""" - super().clear() - self._node_by_korv.clear() - self._sntl.nxt = self._sntl.prv = self._sntl - - def _pop(self, key: KT) -> VT: - val = super()._pop(key) - node = self._node_by_korv[key if self._bykey else val] - self._dissoc_node(node) - return val - - def popitem(self, last: bool = True) -> tuple[KT, VT]: - """*b.popitem() → (k, v)* - - If *last* is true, - remove and return the most recently added item as a (key, value) pair. - Otherwise, remove and return the least recently added item. - - :raises KeyError: if *b* is empty. - """ - if not self: - raise KeyError('OrderedBidict is empty') - node = getattr(self._sntl, 'prv' if last else 'nxt') - korv = self._node_by_korv.inverse[node] - if self._bykey: - return korv, self._pop(korv) - return self.inverse._pop(korv), korv - - def move_to_end(self, key: KT, last: bool = True) -> None: - """Move the item with the given key to the end if *last* is true, else to the beginning. - - :raises KeyError: if *key* is missing - """ - korv = key if self._bykey else self._fwdm[key] - node = self._node_by_korv[korv] - node.prv.nxt = node.nxt - node.nxt.prv = node.prv - sntl = self._sntl - if last: - lastnode = sntl.prv - node.prv = lastnode - node.nxt = sntl - sntl.prv = lastnode.nxt = node - else: - firstnode = sntl.nxt - node.prv = sntl - node.nxt = firstnode - sntl.nxt = firstnode.prv = node - - # Override the keys() and items() implementations inherited from BidictBase, - # which may delegate to the backing _fwdm dict, since this is a mutable ordered bidict, - # and therefore the ordering of items can get out of sync with the backing mappings - # after mutation. (Need not override values() because it delegates to .inverse.keys().) - def keys(self) -> t.KeysView[KT]: - """A set-like object providing a view on the contained keys.""" - return _OrderedBidictKeysView(self) - - def items(self) -> t.ItemsView[KT, VT]: - """A set-like object providing a view on the contained items.""" - return _OrderedBidictItemsView(self) - - -# The following MappingView implementations use the __iter__ implementations -# inherited from their superclass counterparts in collections.abc, so they -# continue to yield items in the correct order even after an OrderedBidict -# is mutated. They also provide a __reversed__ implementation, which is not -# provided by the collections.abc superclasses. -class _OrderedBidictKeysView(BidictKeysView[KT]): - _mapping: OrderedBidict[KT, t.Any] - - def __reversed__(self) -> t.Iterator[KT]: - return reversed(self._mapping) - - -class _OrderedBidictItemsView(t.ItemsView[KT, VT]): - _mapping: OrderedBidict[KT, VT] - - def __reversed__(self) -> t.Iterator[tuple[KT, VT]]: - ob = self._mapping - for key in reversed(ob): - yield key, ob[key] - - -# For better performance, make _OrderedBidictKeysView and _OrderedBidictItemsView delegate -# to backing dicts for the methods they inherit from collections.abc.Set. (Cannot delegate -# for __iter__ and __reversed__ since they are order-sensitive.) See also: https://bugs.python.org/issue46713 -def _override_set_methods_to_use_backing_dict( - cls: t.Type[_OrderedBidictKeysView[KT]] | t.Type[_OrderedBidictItemsView[KT, t.Any]], - viewname: str, - _setmethodnames: t.Iterable[str] = ( - '__lt__', '__le__', '__gt__', '__ge__', '__eq__', '__ne__', '__sub__', '__rsub__', - '__or__', '__ror__', '__xor__', '__rxor__', '__and__', '__rand__', 'isdisjoint', - ) -) -> None: - def make_proxy_method(methodname: str) -> t.Any: - def method(self: _OrderedBidictKeysView[KT] | _OrderedBidictItemsView[KT, t.Any], *args: t.Any) -> t.Any: - fwdm = self._mapping._fwdm - if not isinstance(fwdm, dict): # dict view speedup not available, fall back to Set's implementation. - return getattr(Set, methodname)(self, *args) - fwdm_dict_view = getattr(fwdm, viewname)() - fwdm_dict_view_method = getattr(fwdm_dict_view, methodname) - if len(args) != 1 or not isinstance(args[0], self.__class__) or not isinstance(args[0]._mapping._fwdm, dict): - return fwdm_dict_view_method(*args) - # self and arg are both _OrderedBidictKeysViews or _OrderedBidictItemsViews whose bidicts are backed by a dict. - # Use arg's backing dict's corresponding view instead of arg. Otherwise, e.g. `ob1.keys() < ob2.keys()` would give - # "TypeError: '<' not supported between instances of '_OrderedBidictKeysView' and '_OrderedBidictKeysView'", because - # both `dict_keys(ob1).__lt__(ob2.keys()) is NotImplemented` and `dict_keys(ob2).__gt__(ob1.keys()) is NotImplemented`. - arg_dict = args[0]._mapping._fwdm - arg_dict_view = getattr(arg_dict, viewname)() - return fwdm_dict_view_method(arg_dict_view) - method.__name__ = methodname - method.__qualname__ = f'{cls.__qualname__}.{methodname}' - return method - - for name in _setmethodnames: - setattr(cls, name, make_proxy_method(name)) - - -_override_set_methods_to_use_backing_dict(_OrderedBidictKeysView, 'keys') -_override_set_methods_to_use_backing_dict(_OrderedBidictItemsView, 'items') - - -# * Code review nav * -#============================================================================== -# ← Prev: _frozenordered.py Current: _orderedbidict.py -#============================================================================== diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/_typing.py b/venv_flaskchat/lib/python3.11/site-packages/bidict/_typing.py deleted file mode 100644 index 482267e..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict/_typing.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright 2009-2022 Joshua Bronson. All rights reserved. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - - -"""Provide typing-related objects.""" - -from __future__ import annotations -from enum import Enum -import typing as t - -if t.TYPE_CHECKING: - from typing_extensions import TypeAlias as TypeAlias -else: - TypeAlias = 'TypeAlias' - - -KT = t.TypeVar('KT') -VT = t.TypeVar('VT') - - -Items: TypeAlias = 't.Iterable[tuple[KT, VT]]' -MapOrItems: TypeAlias = 't.Mapping[KT, VT] | Items[KT, VT]' -ItemsIter: TypeAlias = 't.Iterator[tuple[KT, VT]]' - - -class MissingT(Enum): - """Sentinel used to represent none/missing when None itself can't be used.""" - - MISSING = 'MISSING' - - def __repr__(self) -> str: - return '' - - -MISSING: t.Final[MissingT] = MissingT.MISSING -OKT: TypeAlias = 'KT | MissingT' #: optional key type -OVT: TypeAlias = 'VT | MissingT' #: optional value type - -DT = t.TypeVar('DT') #: for default arguments -ODT: TypeAlias = 'DT | MissingT' #: optional default arg type diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/metadata.py b/venv_flaskchat/lib/python3.11/site-packages/bidict/metadata.py deleted file mode 100644 index 00250fe..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict/metadata.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2009-2022 Joshua Bronson. All rights reserved. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -"""Define bidict package metadata.""" - - -__version__ = '0.22.1' -__author__ = {'name': 'Joshua Bronson', 'email': 'jabronson@gmail.com'} -__copyright__ = '© 2009-2022 Joshua Bronson' -__description__ = 'The bidirectional mapping library for Python.' -__license__ = 'MPL 2.0' -__url__ = 'https://bidict.readthedocs.io' diff --git a/venv_flaskchat/lib/python3.11/site-packages/bidict/py.typed b/venv_flaskchat/lib/python3.11/site-packages/bidict/py.typed deleted file mode 100644 index 342ea76..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/bidict/py.typed +++ /dev/null @@ -1 +0,0 @@ -PEP-561 marker. diff --git a/venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/INSTALLER b/venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/LICENSE.rst b/venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/LICENSE.rst deleted file mode 100644 index 79c9825..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/LICENSE.rst +++ /dev/null @@ -1,20 +0,0 @@ -Copyright 2010 Jason Kirtland - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/METADATA b/venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/METADATA deleted file mode 100644 index d181f19..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/METADATA +++ /dev/null @@ -1,63 +0,0 @@ -Metadata-Version: 2.1 -Name: blinker -Version: 1.6.2 -Summary: Fast, simple object-to-object and broadcast signaling -Author-email: Jason Kirtland -Maintainer-email: Pallets Ecosystem -License: MIT License -Project-URL: Homepage, https://blinker.readthedocs.io -Project-URL: Documentation, https://blinker.readthedocs.io -Project-URL: Source Code, https://github.com/pallets-eco/blinker/ -Project-URL: Issue Tracker, https://github.com/pallets-eco/blinker/issues/ -Project-URL: Chat, https://discord.gg/pallets -Keywords: signal,emit,events,broadcast -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Software Development :: Libraries -Requires-Python: >=3.7 -Description-Content-Type: text/x-rst -License-File: LICENSE.rst - -Blinker -======= - -Blinker provides a fast dispatching system that allows any number of -interested parties to subscribe to events, or "signals". - -Signal receivers can subscribe to specific senders or receive signals -sent by any sender. - -.. code-block:: pycon - - >>> from blinker import signal - >>> started = signal('round-started') - >>> def each(round): - ... print(f"Round {round}") - ... - >>> started.connect(each) - - >>> def round_two(round): - ... print("This is round two.") - ... - >>> started.connect(round_two, sender=2) - - >>> for round in range(1, 4): - ... started.send(round) - ... - Round 1! - Round 2! - This is round two. - Round 3! - - -Links ------ - -- Documentation: https://blinker.readthedocs.io/ -- Changes: https://blinker.readthedocs.io/#changes -- PyPI Releases: https://pypi.org/project/blinker/ -- Source Code: https://github.com/pallets-eco/blinker/ -- Issue Tracker: https://github.com/pallets-eco/blinker/issues/ diff --git a/venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/RECORD b/venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/RECORD deleted file mode 100644 index 8b67abc..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/RECORD +++ /dev/null @@ -1,15 +0,0 @@ -blinker-1.6.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -blinker-1.6.2.dist-info/LICENSE.rst,sha256=nrc6HzhZekqhcCXSrhvjg5Ykx5XphdTw6Xac4p-spGc,1054 -blinker-1.6.2.dist-info/METADATA,sha256=7MRskabu2wQvWIMFwgqP3w2LDt8nR5nCxH7Anu1ZrBM,1964 -blinker-1.6.2.dist-info/RECORD,, -blinker-1.6.2.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92 -blinker-1.6.2.dist-info/top_level.txt,sha256=2NmsENM0J2t9Z8mkjxHDmGMQj7Bm8f5ZTTYe1x1fZtM,8 -blinker/__init__.py,sha256=Ko7EbvxyCl_UewgsP8XgDJqJcHZA7EsuhG72R_zDrcY,408 -blinker/__pycache__/__init__.cpython-311.pyc,, -blinker/__pycache__/_saferef.cpython-311.pyc,, -blinker/__pycache__/_utilities.cpython-311.pyc,, -blinker/__pycache__/base.cpython-311.pyc,, -blinker/_saferef.py,sha256=kWOTIWnCY3kOb8lZP74Rbx7bR_BLVg4TjwzNCRLhKHs,9096 -blinker/_utilities.py,sha256=GPXtJzykzVotoxHC79mgFQMPJtICwpVDCCpus4_JtsA,4110 -blinker/base.py,sha256=7Y-C0ZVIe-NrrskPeqj0bLSp4R6Cpq5LrzI1DmLqMEA,20469 -blinker/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/WHEEL b/venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/WHEEL deleted file mode 100644 index 1f37c02..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.40.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/top_level.txt b/venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/top_level.txt deleted file mode 100644 index 1ff4ca5..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/blinker-1.6.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -blinker diff --git a/venv_flaskchat/lib/python3.11/site-packages/blinker/__init__.py b/venv_flaskchat/lib/python3.11/site-packages/blinker/__init__.py deleted file mode 100644 index 71d66d3..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/blinker/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -from blinker.base import ANY -from blinker.base import NamedSignal -from blinker.base import Namespace -from blinker.base import receiver_connected -from blinker.base import Signal -from blinker.base import signal -from blinker.base import WeakNamespace - -__all__ = [ - "ANY", - "NamedSignal", - "Namespace", - "Signal", - "WeakNamespace", - "receiver_connected", - "signal", -] - -__version__ = "1.6.2" diff --git a/venv_flaskchat/lib/python3.11/site-packages/blinker/__pycache__/__init__.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/blinker/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 2b5e96886fa749e526c55cc20a0dab012b54daa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 661 zcmZvZzl+pB6vyA>_ikL3L#zZrL|DXxJ;6#2M6h$4L&Rx@+05MDu*qbZi3?|Se}&o| z*c|>Z7AeEFR(1>5UFDl_t3;f9`R4P6`ObSJmy^jDaQ#r9#a9CG(-r&W-N4le!WR%A zNC_38ggEw)J?i!BBm30vIY16*&~u0!(y-?UIigX|F>*{}0!t9dH$oFJq9ZXrhH3iC zHJy^J|7!jLU+J7zQXH$L<|URRSK2i%Bo+ro7E*1bVMVRAEE*|rH~MopvisQNz2vLE z(b)Ld#01VlXR))9v&dP3_9>iYFS5h=biBQ_D3xAGlP$QF|3>>jpLePLl5NZwFH6R@ zDPuUERkdd9J6z!bxR&`lyv62~)ZB=Q8?L#|-_{!?ZT_a@cJ=y{H~B{D4LfmV;mT4i z^7UDBTI=W8Y?fQq$Y=N&R(y%6oB49alvWL6+4}4{d0ExsV=0f!UF?d#7VHJu&L@O) z@Sq*4gU9Vq9Xx7>>fmWRR0j{+q5ik?q=kWYL6Ukq*xPx$y9amfpQr9Iw{gbbHdL@8 diff --git a/venv_flaskchat/lib/python3.11/site-packages/blinker/__pycache__/_saferef.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/blinker/__pycache__/_saferef.cpython-311.pyc deleted file mode 100644 index 704ee279ba58d2a64b04ba0d3358857798b8767a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9973 zcmai4Yit`=cD}LCo z3?)mZ0wtTpY5}82gKVuJUQ{U3)IoNO{AkgjzmoJ{(E_AF)Wo0y7AOLA|1od^2>Yww zx%1#dk~@?xXXd`nJ@=gNJTCvCqoa-C`VaMQbO$$gnapOGEXcmB zFeC79-;9rc`)B<8J1`UQF-5o$bO(_Ap9qY7hJX8-3ANM*TI$1cL=L_y%tU@d^M3e1ew-xP&r+Vy_3yr1mV&yn_BW0%=(t(!-++b*(O{%dSe zNQ9;T0{dQ9%z~a1CGi;T(lK#Sk#08Zm8qdBEoHOPY*rCXNx!a`$+k8T*M#`S8}^Gg z-Z(8@nNvh<_J)!+Mf90f_(0jE`cU$?sAfdf95pcFtX9a$d=ycfSIjw0t~VSP7u9T5 zOzVndDrkG2+P=mcT?KKFqj6C)AvlYwp*UmMjcH^Mq0~*Le-q(?dytR^KV=nQ&5M|BzGC2h6ktjc6KC02`ksH7v_~5Hi!0R+6t@l zT!nN(iREr0DutPxEfkkuz)}qnjY#9h#aR%T)99J>Zd{bL+^8wu%xR0_9R9JT&VG2* zCVW=N-hM0U@iq~*B9IV1s1?Qxl4 zhp_-Xf`YG!$hD##6$UMjR{Te0@+XF(8C(#kYQR_>Ow8)Wnb-0p5O2PI@C+$uz)g+ zD(~_;caPq|%`bu03WHfXZ4mfPh385|`F!^2uy zwvh>%X;<23VsaRF9dZO^ryNDuCAXpMUSqd}nLRK`F`W=q`V}yH^fI<{RFrb0=>>x$ zTQlq#B=Bm^FeS2AHb5B;mTZ@02losYQlPi<3ZyHi8uMZXs_ROtn!E0(@hoAQi+qFx z1Q5FNWqhc27%SCt3f{{Z?u>L&X-w$FA>Mba3~{Q(r^SGrmE#cn>4@>LlpP)--JFc`8p zyW~+PifL%N0h8m^r)U6&tx`UpRnY^RO~ct}whMt|?YRBG>QatG5OJ5WY22&PGIh&f za|PUzZqjxdD6+1pa)Ejr8|E#*CIP$U@Y7}=H%u_4j)_^EQ*xZ?qIk@<5XTzncDh2| zoP~IsfpM=(`YbTb>7LeLv(m(@F*OOfpph|Deg0V`tp%x;c?n z^>jfsZCg%iYSbMYAkKUtYpUcud2-1Wo;Je3hKghM)Z?C-C$QD3?koikm0SQ^dd+v> ziOXKcOG&#{f{X=u(_Q#~Gz_=&*TP-+)Eju*ezkhbE5RbW;Y9))jS+*_xfpErg;zqw z(A&es&<&4*4L6+f`p`|$*W6EF#Za@q-E5OKJYT(Wm~F91xEOAvxfncy<~~*o-ym;? zUqzwlyY4Ic|4w+FsjL|ISokXevxi~J1nE00_k!&p=aj`dWN~A|9r|=ZN3>;nRgV0V zt8`v6RMJJlNr;GRV}M^8%!6LA5gZM)MG_!LyR*ZhxQiG;%bP_;%7Qp~X~KK!I{TtW zkTb7gLkq|Cv<8}uyq1$4C2N2H)$oY$upGWS86JccXsE-qzzw!1#(Pn@r5apYJtAzg zM=an57R_}Y{n$YOtQrg~OcjEJ29Ou)`d`S)WMN#*6U86XycC9Tp>Ns=3~qbOz(?+A zTn9BE666xpy0`&Sxc>nTZs(cDB5&!5h}GdOpCH5PY=$k%4~uJcw=Tj8!PY4`*$Ntk zyrNs-R0`DEfwr1c%~UE8wfyO<(co=IT}x$H!5q|Iw)`|<*pVzNFe@2~6-A6rn2OMy z0$O4&U8{Nzp7dc9%R}3NAnDBiChCokP;9}0-pjgr9(Eph(0O1ZRPG$DbdIk1t37>{ zp2H7&#vb&H-H(@hCMrD>YvF2p58T{pEMAEnei%FcAa?xzrE=_KC3dnDJ6VkntxbOu zANcEMKX~@;^Y1^u@l-iJT8WRYU928GwsxTs8(BBXu|w6^;M&DIudN^5NR(pd?yD&5 zzb~HgZmaSBwI4kKd8`Sk2q_3R9=#4VB%Fe`D!eNo-uGP>iY!GP_yq*>aLIi~->nFS zJ|1eB9s+D{w-R_<)?g*LOCBIlY{_e2K5v#?`UH3ALqQn7Op1M+tJsnx!q_}zMb%C1 zf;YUJMl+_ON6a0Kr;q&7&%q8aGeO3!jwBOV^=5+?N&dByPjJ+w0qM4)D zDv{R&Gso@d4tRkqMZqu;G9yXg#LPDI*zs~5BY;5A_Sw36i@+EUSGlS$sPNP=R|Za) zwg{v{2Eujbfxd90G6=`jtT~~&?jC8BOSuaQryWO`>gcjpl5`??C>X`zsj-Il6g-Ft z+r6e9#2wFRBY)?|c>+EOxfg){ETUkCu-*MoKC$P3c#IR%3b27Y4{%?(3+Z^8PG+MK z07cj7b@ssZ*a*%Yw-uJjaahR{y^Lrn3$I;*9JpB#BE)vHy-bM9R+subP>Q@&+l`}S z4Y~adcEu&6j_*y`N0MHW`$u%LQ82^;TOI^?-{wrZMA2Suf$sq4{mrGkGGx| za+c+~kuCHzjWJ{k{Q|qjasfAUSM*(EfARAbKk}cRMgc2YlDT?2{0V<6(g^I%2*&sH zjgNm#pj;~XUe0yHo4?t+5m@dVdK0ue7pQw0xy(NInXv{f$IH*W3b~O#0kh65CWFe4 zD9`Fg87u}qV!sJBBSiE1udzF;E-xs%ng}hQy{wob$#+sUF2eJmy}d%Z#3LKm!_n(X z1lf`mI6K-B?D_N`Xjhg8U%Zt@uuOijT;OrIllKvqd*HS!Qm&BqTwih7cUnwz=(G;~ zFcp*;(GQ}qB0o}=cvegApvR~;t`$Xyo>oY;tY{unm?`B}TBqHx{Kk@DMev9iB%@hD zUY!V90m39J!1G>VdnIV+Dv2d1206|o|01`!R!CRowFPDQ_>N}Rw)V+0Sq(~V{4i-Z zUdIr|d2nHs{eJIIW$*F(=jc<}n_PRj+TB~}KC&Uvr_?=G^Z7gas=WgrOjmkOe17Iv}n`HhMqoyw|zjxwW;~FV?V z*}zw41iC*vb$%-R^(i0jzdkL{{gfZ~|Hi0x+Lf)n7>U^!!}o^mdOTG2Pm~9fmBA#vS;I#^0vem} zotDbIIvqE6o6eS+PKjF1YMPO%@kFZWeCV;gGIVGrEPsB%%?5A>p>9s$cRNWh9WCB zjF9liF4gU0!f*LhnG2?V5?o98^bvev{oTOlN6U%lDv9UHM^9Ido-TDwl_FF2UV4@l0}v$g zz5E$&a5O4x;CuVk7=t(1V^+7vXc2JxeS#4`qfz;V9rG@GIo0zudU;@y|-V$#U0ZrE9VjncThzB8@L%2sd{rx6*QYAPWWZ9em59SLf^`^&)l> zSp*~vklT|Sx7Aa^2C+7YPn@a*RX_<9bwU{|4&*4IgqqF@ip^T3wIXQuavqD zmLdlqgGOI)`WtZtnW2V!SMzzWG1`baO>*q%$Kzti=FyPpB299xrqR6j@Ls+9*51Ih z0~fS;sqozGvlgxlRs`pxx`d-w%cs0)1K7d-?_d1^u1FXKl%9DVSi6b8szGZQoOB-(T(DclWLL-zxWyR{BTRUa5BV zm%0vB`wu+qAAQh2dOuX|pRDvxmbxdagen|K^otlU(W8@9vD#9pd1U6ZSe>o~dV>S-E_W%$lflUvYcAdpSZGhp7Yd%KF%;kW@%Zka*)O_7 zK^R4^=w{vhtFP1oLXa@REkeHF6E)@)kpNYAMXW2>TVsza>>c83=G)Y!|CHAMDisq{ z9H)Z3d#jCd&yY1Fj_Xbq|KR~=m;MU1JVFJ9Raw_6|5RDqD*sejcgg*$vd&fhsfF-cg0)llwZQsvx&2tB{n%=x+CI|qrWP6& a_SaZ*@xyCA0X*2b{FcA}ZkJlVnEwNI&O5mP diff --git a/venv_flaskchat/lib/python3.11/site-packages/blinker/__pycache__/_utilities.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/blinker/__pycache__/_utilities.cpython-311.pyc deleted file mode 100644 index e796789fee5d006a41bf2d026cb14c11adad8728..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6721 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 diff --git a/venv_flaskchat/lib/python3.11/site-packages/blinker/_saferef.py b/venv_flaskchat/lib/python3.11/site-packages/blinker/_saferef.py deleted file mode 100644 index dcb70c1..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/blinker/_saferef.py +++ /dev/null @@ -1,230 +0,0 @@ -# extracted from Louie, http://pylouie.org/ -# updated for Python 3 -# -# Copyright (c) 2006 Patrick K. O'Brien, Mike C. Fletcher, -# Matthew R. Scott -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following -# disclaimer in the documentation and/or other materials provided -# with the distribution. -# -# * Neither the name of the nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -"""Refactored 'safe reference from dispatcher.py""" -import operator -import sys -import traceback -import weakref - - -get_self = operator.attrgetter("__self__") -get_func = operator.attrgetter("__func__") - - -def safe_ref(target, on_delete=None): - """Return a *safe* weak reference to a callable target. - - - ``target``: The object to be weakly referenced, if it's a bound - method reference, will create a BoundMethodWeakref, otherwise - creates a simple weakref. - - - ``on_delete``: If provided, will have a hard reference stored to - the callable to be called after the safe reference goes out of - scope with the reference object, (either a weakref or a - BoundMethodWeakref) as argument. - """ - try: - im_self = get_self(target) - except AttributeError: - if callable(on_delete): - return weakref.ref(target, on_delete) - else: - return weakref.ref(target) - else: - if im_self is not None: - # Turn a bound method into a BoundMethodWeakref instance. - # Keep track of these instances for lookup by disconnect(). - assert hasattr(target, "im_func") or hasattr(target, "__func__"), ( - f"safe_ref target {target!r} has im_self, but no im_func, " - "don't know how to create reference" - ) - reference = BoundMethodWeakref(target=target, on_delete=on_delete) - return reference - - -class BoundMethodWeakref: - """'Safe' and reusable weak references to instance methods. - - BoundMethodWeakref objects provide a mechanism for referencing a - bound method without requiring that the method object itself - (which is normally a transient object) is kept alive. Instead, - the BoundMethodWeakref object keeps weak references to both the - object and the function which together define the instance method. - - Attributes: - - - ``key``: The identity key for the reference, calculated by the - class's calculate_key method applied to the target instance method. - - - ``deletion_methods``: Sequence of callable objects taking single - argument, a reference to this object which will be called when - *either* the target object or target function is garbage - collected (i.e. when this object becomes invalid). These are - specified as the on_delete parameters of safe_ref calls. - - - ``weak_self``: Weak reference to the target object. - - - ``weak_func``: Weak reference to the target function. - - Class Attributes: - - - ``_all_instances``: Class attribute pointing to all live - BoundMethodWeakref objects indexed by the class's - calculate_key(target) method applied to the target objects. - This weak value dictionary is used to short-circuit creation so - that multiple references to the same (object, function) pair - produce the same BoundMethodWeakref instance. - """ - - _all_instances = weakref.WeakValueDictionary() # type: ignore[var-annotated] - - def __new__(cls, target, on_delete=None, *arguments, **named): - """Create new instance or return current instance. - - Basically this method of construction allows us to - short-circuit creation of references to already-referenced - instance methods. The key corresponding to the target is - calculated, and if there is already an existing reference, - that is returned, with its deletion_methods attribute updated. - Otherwise the new instance is created and registered in the - table of already-referenced methods. - """ - key = cls.calculate_key(target) - current = cls._all_instances.get(key) - if current is not None: - current.deletion_methods.append(on_delete) - return current - else: - base = super().__new__(cls) - cls._all_instances[key] = base - base.__init__(target, on_delete, *arguments, **named) - return base - - def __init__(self, target, on_delete=None): - """Return a weak-reference-like instance for a bound method. - - - ``target``: The instance-method target for the weak reference, - must have im_self and im_func attributes and be - reconstructable via the following, which is true of built-in - instance methods:: - - target.im_func.__get__( target.im_self ) - - - ``on_delete``: Optional callback which will be called when - this weak reference ceases to be valid (i.e. either the - object or the function is garbage collected). Should take a - single argument, which will be passed a pointer to this - object. - """ - - def remove(weak, self=self): - """Set self.isDead to True when method or instance is destroyed.""" - methods = self.deletion_methods[:] - del self.deletion_methods[:] - try: - del self.__class__._all_instances[self.key] - except KeyError: - pass - for function in methods: - try: - if callable(function): - function(self) - except Exception: - try: - traceback.print_exc() - except AttributeError: - e = sys.exc_info()[1] - print( - f"Exception during saferef {self} " - f"cleanup function {function}: {e}" - ) - - self.deletion_methods = [on_delete] - self.key = self.calculate_key(target) - im_self = get_self(target) - im_func = get_func(target) - self.weak_self = weakref.ref(im_self, remove) - self.weak_func = weakref.ref(im_func, remove) - self.self_name = str(im_self) - self.func_name = str(im_func.__name__) - - @classmethod - def calculate_key(cls, target): - """Calculate the reference key for this reference. - - Currently this is a two-tuple of the id()'s of the target - object and the target function respectively. - """ - return (id(get_self(target)), id(get_func(target))) - - def __str__(self): - """Give a friendly representation of the object.""" - return "{}({}.{})".format( - self.__class__.__name__, - self.self_name, - self.func_name, - ) - - __repr__ = __str__ - - def __hash__(self): - return hash((self.self_name, self.key)) - - def __nonzero__(self): - """Whether we are still a valid reference.""" - return self() is not None - - def __eq__(self, other): - """Compare with another reference.""" - if not isinstance(other, self.__class__): - return operator.eq(self.__class__, type(other)) - return operator.eq(self.key, other.key) - - def __call__(self): - """Return a strong reference to the bound method. - - If the target cannot be retrieved, then will return None, - otherwise returns a bound instance method for our object and - function. - - Note: You may call this method any number of times, as it does - not invalidate the reference. - """ - target = self.weak_self() - if target is not None: - function = self.weak_func() - if function is not None: - return function.__get__(target) - return None diff --git a/venv_flaskchat/lib/python3.11/site-packages/blinker/_utilities.py b/venv_flaskchat/lib/python3.11/site-packages/blinker/_utilities.py deleted file mode 100644 index 068d94c..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/blinker/_utilities.py +++ /dev/null @@ -1,142 +0,0 @@ -from __future__ import annotations - -import asyncio -import inspect -import sys -import typing as t -from functools import partial -from weakref import ref - -from blinker._saferef import BoundMethodWeakref - -IdentityType = t.Union[t.Tuple[int, int], str, int] - - -class _symbol: - def __init__(self, name): - """Construct a new named symbol.""" - self.__name__ = self.name = name - - def __reduce__(self): - return symbol, (self.name,) - - def __repr__(self): - return self.name - - -_symbol.__name__ = "symbol" - - -class symbol: - """A constant symbol. - - >>> symbol('foo') is symbol('foo') - True - >>> symbol('foo') - foo - - A slight refinement of the MAGICCOOKIE=object() pattern. The primary - advantage of symbol() is its repr(). They are also singletons. - - Repeated calls of symbol('name') will all return the same instance. - - """ - - symbols = {} # type: ignore[var-annotated] - - def __new__(cls, name): - try: - return cls.symbols[name] - except KeyError: - return cls.symbols.setdefault(name, _symbol(name)) - - -def hashable_identity(obj: object) -> IdentityType: - if hasattr(obj, "__func__"): - return (id(obj.__func__), id(obj.__self__)) # type: ignore[attr-defined] - elif hasattr(obj, "im_func"): - return (id(obj.im_func), id(obj.im_self)) # type: ignore[attr-defined] - elif isinstance(obj, (int, str)): - return obj - else: - return id(obj) - - -WeakTypes = (ref, BoundMethodWeakref) - - -class annotatable_weakref(ref): - """A weakref.ref that supports custom instance attributes.""" - - receiver_id: t.Optional[IdentityType] - sender_id: t.Optional[IdentityType] - - -def reference( # type: ignore[no-untyped-def] - object, callback=None, **annotations -) -> annotatable_weakref: - """Return an annotated weak ref.""" - if callable(object): - weak = callable_reference(object, callback) - else: - weak = annotatable_weakref(object, callback) - for key, value in annotations.items(): - setattr(weak, key, value) - return weak # type: ignore[no-any-return] - - -def callable_reference(object, callback=None): - """Return an annotated weak ref, supporting bound instance methods.""" - if hasattr(object, "im_self") and object.im_self is not None: - return BoundMethodWeakref(target=object, on_delete=callback) - elif hasattr(object, "__self__") and object.__self__ is not None: - return BoundMethodWeakref(target=object, on_delete=callback) - return annotatable_weakref(object, callback) - - -class lazy_property: - """A @property that is only evaluated once.""" - - def __init__(self, deferred): - self._deferred = deferred - self.__doc__ = deferred.__doc__ - - def __get__(self, obj, cls): - if obj is None: - return self - value = self._deferred(obj) - setattr(obj, self._deferred.__name__, value) - return value - - -def is_coroutine_function(func: t.Any) -> bool: - # Python < 3.8 does not correctly determine partially wrapped - # coroutine functions are coroutine functions, hence the need for - # this to exist. Code taken from CPython. - if sys.version_info >= (3, 8): - return asyncio.iscoroutinefunction(func) - else: - # Note that there is something special about the AsyncMock - # such that it isn't determined as a coroutine function - # without an explicit check. - try: - from unittest.mock import AsyncMock # type: ignore[attr-defined] - - if isinstance(func, AsyncMock): - return True - except ImportError: - # Not testing, no asynctest to import - pass - - while inspect.ismethod(func): - func = func.__func__ - while isinstance(func, partial): - func = func.func - if not inspect.isfunction(func): - return False - - if func.__code__.co_flags & inspect.CO_COROUTINE: - return True - - acic = asyncio.coroutines._is_coroutine # type: ignore[attr-defined] - return getattr(func, "_is_coroutine", None) is acic diff --git a/venv_flaskchat/lib/python3.11/site-packages/blinker/base.py b/venv_flaskchat/lib/python3.11/site-packages/blinker/base.py deleted file mode 100644 index 80e24e2..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/blinker/base.py +++ /dev/null @@ -1,551 +0,0 @@ -"""Signals and events. - -A small implementation of signals, inspired by a snippet of Django signal -API client code seen in a blog post. Signals are first-class objects and -each manages its own receivers and message emission. - -The :func:`signal` function provides singleton behavior for named signals. - -""" -from __future__ import annotations - -import typing as t -from collections import defaultdict -from contextlib import contextmanager -from warnings import warn -from weakref import WeakValueDictionary - -from blinker._utilities import annotatable_weakref -from blinker._utilities import hashable_identity -from blinker._utilities import IdentityType -from blinker._utilities import is_coroutine_function -from blinker._utilities import lazy_property -from blinker._utilities import reference -from blinker._utilities import symbol -from blinker._utilities import WeakTypes - -if t.TYPE_CHECKING: - import typing_extensions as te - - T_callable = t.TypeVar("T_callable", bound=t.Callable[..., t.Any]) - - T = t.TypeVar("T") - P = te.ParamSpec("P") - - AsyncWrapperType = t.Callable[[t.Callable[P, T]], t.Callable[P, t.Awaitable[T]]] - SyncWrapperType = t.Callable[[t.Callable[P, t.Awaitable[T]]], t.Callable[P, T]] - -ANY = symbol("ANY") -ANY.__doc__ = 'Token for "any sender".' -ANY_ID = 0 - - -class Signal: - """A notification emitter.""" - - #: An :obj:`ANY` convenience synonym, allows ``Signal.ANY`` - #: without an additional import. - ANY = ANY - - @lazy_property - def receiver_connected(self) -> Signal: - """Emitted after each :meth:`connect`. - - The signal sender is the signal instance, and the :meth:`connect` - arguments are passed through: *receiver*, *sender*, and *weak*. - - .. versionadded:: 1.2 - - """ - return Signal(doc="Emitted after a receiver connects.") - - @lazy_property - def receiver_disconnected(self) -> Signal: - """Emitted after :meth:`disconnect`. - - The sender is the signal instance, and the :meth:`disconnect` arguments - are passed through: *receiver* and *sender*. - - Note, this signal is emitted **only** when :meth:`disconnect` is - called explicitly. - - The disconnect signal can not be emitted by an automatic disconnect - (due to a weakly referenced receiver or sender going out of scope), - as the receiver and/or sender instances are no longer available for - use at the time this signal would be emitted. - - An alternative approach is available by subscribing to - :attr:`receiver_connected` and setting up a custom weakref cleanup - callback on weak receivers and senders. - - .. versionadded:: 1.2 - - """ - return Signal(doc="Emitted after a receiver disconnects.") - - def __init__(self, doc: str | None = None) -> None: - """ - :param doc: optional. If provided, will be assigned to the signal's - __doc__ attribute. - - """ - if doc: - self.__doc__ = doc - #: A mapping of connected receivers. - #: - #: The values of this mapping are not meaningful outside of the - #: internal :class:`Signal` implementation, however the boolean value - #: of the mapping is useful as an extremely efficient check to see if - #: any receivers are connected to the signal. - self.receivers: dict[IdentityType, t.Callable | annotatable_weakref] = {} - self.is_muted = False - self._by_receiver: dict[IdentityType, set[IdentityType]] = defaultdict(set) - self._by_sender: dict[IdentityType, set[IdentityType]] = defaultdict(set) - self._weak_senders: dict[IdentityType, annotatable_weakref] = {} - - def connect( - self, receiver: T_callable, sender: t.Any = ANY, weak: bool = True - ) -> T_callable: - """Connect *receiver* to signal events sent by *sender*. - - :param receiver: A callable. Will be invoked by :meth:`send` with - `sender=` as a single positional argument and any ``kwargs`` that - were provided to a call to :meth:`send`. - - :param sender: Any object or :obj:`ANY`, defaults to ``ANY``. - Restricts notifications delivered to *receiver* to only those - :meth:`send` emissions sent by *sender*. If ``ANY``, the receiver - will always be notified. A *receiver* may be connected to - multiple *sender* values on the same Signal through multiple calls - to :meth:`connect`. - - :param weak: If true, the Signal will hold a weakref to *receiver* - and automatically disconnect when *receiver* goes out of scope or - is garbage collected. Defaults to True. - - """ - receiver_id = hashable_identity(receiver) - receiver_ref: T_callable | annotatable_weakref - - if weak: - receiver_ref = reference(receiver, self._cleanup_receiver) - receiver_ref.receiver_id = receiver_id - else: - receiver_ref = receiver - sender_id: IdentityType - if sender is ANY: - sender_id = ANY_ID - else: - sender_id = hashable_identity(sender) - - self.receivers.setdefault(receiver_id, receiver_ref) - self._by_sender[sender_id].add(receiver_id) - self._by_receiver[receiver_id].add(sender_id) - del receiver_ref - - if sender is not ANY and sender_id not in self._weak_senders: - # wire together a cleanup for weakref-able senders - try: - sender_ref = reference(sender, self._cleanup_sender) - sender_ref.sender_id = sender_id - except TypeError: - pass - else: - self._weak_senders.setdefault(sender_id, sender_ref) - del sender_ref - - # broadcast this connection. if receivers raise, disconnect. - if "receiver_connected" in self.__dict__ and self.receiver_connected.receivers: - try: - self.receiver_connected.send( - self, receiver=receiver, sender=sender, weak=weak - ) - except TypeError as e: - self.disconnect(receiver, sender) - raise e - if receiver_connected.receivers and self is not receiver_connected: - try: - receiver_connected.send( - self, receiver_arg=receiver, sender_arg=sender, weak_arg=weak - ) - except TypeError as e: - self.disconnect(receiver, sender) - raise e - return receiver - - def connect_via( - self, sender: t.Any, weak: bool = False - ) -> t.Callable[[T_callable], T_callable]: - """Connect the decorated function as a receiver for *sender*. - - :param sender: Any object or :obj:`ANY`. The decorated function - will only receive :meth:`send` emissions sent by *sender*. If - ``ANY``, the receiver will always be notified. A function may be - decorated multiple times with differing *sender* values. - - :param weak: If true, the Signal will hold a weakref to the - decorated function and automatically disconnect when *receiver* - goes out of scope or is garbage collected. Unlike - :meth:`connect`, this defaults to False. - - The decorated function will be invoked by :meth:`send` with - `sender=` as a single positional argument and any ``kwargs`` that - were provided to the call to :meth:`send`. - - - .. versionadded:: 1.1 - - """ - - def decorator(fn: T_callable) -> T_callable: - self.connect(fn, sender, weak) - return fn - - return decorator - - @contextmanager - def connected_to( - self, receiver: t.Callable, sender: t.Any = ANY - ) -> t.Generator[None, None, None]: - """Execute a block with the signal temporarily connected to *receiver*. - - :param receiver: a receiver callable - :param sender: optional, a sender to filter on - - This is a context manager for use in the ``with`` statement. It can - be useful in unit tests. *receiver* is connected to the signal for - the duration of the ``with`` block, and will be disconnected - automatically when exiting the block: - - .. code-block:: python - - with on_ready.connected_to(receiver): - # do stuff - on_ready.send(123) - - .. versionadded:: 1.1 - - """ - self.connect(receiver, sender=sender, weak=False) - try: - yield None - except Exception as e: - self.disconnect(receiver) - raise e - else: - self.disconnect(receiver) - - @contextmanager - def muted(self) -> t.Generator[None, None, None]: - """Context manager for temporarily disabling signal. - Useful for test purposes. - """ - self.is_muted = True - try: - yield None - except Exception as e: - raise e - finally: - self.is_muted = False - - def temporarily_connected_to( - self, receiver: t.Callable, sender: t.Any = ANY - ) -> t.ContextManager[None]: - """An alias for :meth:`connected_to`. - - :param receiver: a receiver callable - :param sender: optional, a sender to filter on - - .. versionadded:: 0.9 - - .. versionchanged:: 1.1 - Renamed to :meth:`connected_to`. ``temporarily_connected_to`` was - deprecated in 1.2 and will be removed in a subsequent version. - - """ - warn( - "temporarily_connected_to is deprecated; use connected_to instead.", - DeprecationWarning, - ) - return self.connected_to(receiver, sender) - - def send( - self, - *sender: t.Any, - _async_wrapper: AsyncWrapperType | None = None, - **kwargs: t.Any, - ) -> list[tuple[t.Callable, t.Any]]: - """Emit this signal on behalf of *sender*, passing on ``kwargs``. - - Returns a list of 2-tuples, pairing receivers with their return - value. The ordering of receiver notification is undefined. - - :param sender: Any object or ``None``. If omitted, synonymous - with ``None``. Only accepts one positional argument. - :param _async_wrapper: A callable that should wrap a coroutine - receiver and run it when called synchronously. - - :param kwargs: Data to be sent to receivers. - """ - if self.is_muted: - return [] - - sender = self._extract_sender(sender) - results = [] - for receiver in self.receivers_for(sender): - if is_coroutine_function(receiver): - if _async_wrapper is None: - raise RuntimeError("Cannot send to a coroutine function") - receiver = _async_wrapper(receiver) - result = receiver(sender, **kwargs) # type: ignore[call-arg] - results.append((receiver, result)) - return results - - async def send_async( - self, - *sender: t.Any, - _sync_wrapper: SyncWrapperType | None = None, - **kwargs: t.Any, - ) -> list[tuple[t.Callable, t.Any]]: - """Emit this signal on behalf of *sender*, passing on ``kwargs``. - - Returns a list of 2-tuples, pairing receivers with their return - value. The ordering of receiver notification is undefined. - - :param sender: Any object or ``None``. If omitted, synonymous - with ``None``. Only accepts one positional argument. - :param _sync_wrapper: A callable that should wrap a synchronous - receiver and run it when awaited. - - :param kwargs: Data to be sent to receivers. - """ - if self.is_muted: - return [] - - sender = self._extract_sender(sender) - results = [] - for receiver in self.receivers_for(sender): - if not is_coroutine_function(receiver): - if _sync_wrapper is None: - raise RuntimeError("Cannot send to a non-coroutine function") - receiver = _sync_wrapper(receiver) # type: ignore[arg-type] - result = await receiver(sender, **kwargs) # type: ignore[call-arg, misc] - results.append((receiver, result)) - return results - - def _extract_sender(self, sender: t.Any) -> t.Any: - if not self.receivers: - # Ensure correct signature even on no-op sends, disable with -O - # for lowest possible cost. - if __debug__ and sender and len(sender) > 1: - raise TypeError( - f"send() accepts only one positional argument, {len(sender)} given" - ) - return [] - - # Using '*sender' rather than 'sender=None' allows 'sender' to be - # used as a keyword argument- i.e. it's an invisible name in the - # function signature. - if len(sender) == 0: - sender = None - elif len(sender) > 1: - raise TypeError( - f"send() accepts only one positional argument, {len(sender)} given" - ) - else: - sender = sender[0] - return sender - - def has_receivers_for(self, sender: t.Any) -> bool: - """True if there is probably a receiver for *sender*. - - Performs an optimistic check only. Does not guarantee that all - weakly referenced receivers are still alive. See - :meth:`receivers_for` for a stronger search. - - """ - if not self.receivers: - return False - if self._by_sender[ANY_ID]: - return True - if sender is ANY: - return False - return hashable_identity(sender) in self._by_sender - - def receivers_for( - self, sender: t.Any - ) -> t.Generator[t.Callable | annotatable_weakref, None, None]: - """Iterate all live receivers listening for *sender*.""" - # TODO: test receivers_for(ANY) - if self.receivers: - sender_id = hashable_identity(sender) - if sender_id in self._by_sender: - ids = self._by_sender[ANY_ID] | self._by_sender[sender_id] - else: - ids = self._by_sender[ANY_ID].copy() - for receiver_id in ids: - receiver = self.receivers.get(receiver_id) - if receiver is None: - continue - if isinstance(receiver, WeakTypes): - strong = receiver() - if strong is None: - self._disconnect(receiver_id, ANY_ID) - continue - receiver = strong - yield receiver # type: ignore[misc] - - def disconnect(self, receiver: t.Callable, sender: t.Any = ANY) -> None: - """Disconnect *receiver* from this signal's events. - - :param receiver: a previously :meth:`connected` callable - - :param sender: a specific sender to disconnect from, or :obj:`ANY` - to disconnect from all senders. Defaults to ``ANY``. - - """ - sender_id: IdentityType - if sender is ANY: - sender_id = ANY_ID - else: - sender_id = hashable_identity(sender) - receiver_id = hashable_identity(receiver) - self._disconnect(receiver_id, sender_id) - - if ( - "receiver_disconnected" in self.__dict__ - and self.receiver_disconnected.receivers - ): - self.receiver_disconnected.send(self, receiver=receiver, sender=sender) - - def _disconnect(self, receiver_id: IdentityType, sender_id: IdentityType) -> None: - if sender_id == ANY_ID: - if self._by_receiver.pop(receiver_id, False): - for bucket in self._by_sender.values(): - bucket.discard(receiver_id) - self.receivers.pop(receiver_id, None) - else: - self._by_sender[sender_id].discard(receiver_id) - self._by_receiver[receiver_id].discard(sender_id) - - def _cleanup_receiver(self, receiver_ref: annotatable_weakref) -> None: - """Disconnect a receiver from all senders.""" - self._disconnect(t.cast(IdentityType, receiver_ref.receiver_id), ANY_ID) - - def _cleanup_sender(self, sender_ref: annotatable_weakref) -> None: - """Disconnect all receivers from a sender.""" - sender_id = t.cast(IdentityType, sender_ref.sender_id) - assert sender_id != ANY_ID - self._weak_senders.pop(sender_id, None) - for receiver_id in self._by_sender.pop(sender_id, ()): - self._by_receiver[receiver_id].discard(sender_id) - - def _cleanup_bookkeeping(self) -> None: - """Prune unused sender/receiver bookkeeping. Not threadsafe. - - Connecting & disconnecting leave behind a small amount of bookkeeping - for the receiver and sender values. Typical workloads using Blinker, - for example in most web apps, Flask, CLI scripts, etc., are not - adversely affected by this bookkeeping. - - With a long-running Python process performing dynamic signal routing - with high volume- e.g. connecting to function closures, "senders" are - all unique object instances, and doing all of this over and over- you - may see memory usage will grow due to extraneous bookkeeping. (An empty - set() for each stale sender/receiver pair.) - - This method will prune that bookkeeping away, with the caveat that such - pruning is not threadsafe. The risk is that cleanup of a fully - disconnected receiver/sender pair occurs while another thread is - connecting that same pair. If you are in the highly dynamic, unique - receiver/sender situation that has lead you to this method, that - failure mode is perhaps not a big deal for you. - """ - for mapping in (self._by_sender, self._by_receiver): - for _id, bucket in list(mapping.items()): - if not bucket: - mapping.pop(_id, None) - - def _clear_state(self) -> None: - """Throw away all signal state. Useful for unit tests.""" - self._weak_senders.clear() - self.receivers.clear() - self._by_sender.clear() - self._by_receiver.clear() - - -receiver_connected = Signal( - """\ -Sent by a :class:`Signal` after a receiver connects. - -:argument: the Signal that was connected to -:keyword receiver_arg: the connected receiver -:keyword sender_arg: the sender to connect to -:keyword weak_arg: true if the connection to receiver_arg is a weak reference - -.. deprecated:: 1.2 - -As of 1.2, individual signals have their own private -:attr:`~Signal.receiver_connected` and -:attr:`~Signal.receiver_disconnected` signals with a slightly simplified -call signature. This global signal is planned to be removed in 1.6. - -""" -) - - -class NamedSignal(Signal): - """A named generic notification emitter.""" - - def __init__(self, name: str, doc: str | None = None) -> None: - Signal.__init__(self, doc) - - #: The name of this signal. - self.name = name - - def __repr__(self) -> str: - base = Signal.__repr__(self) - return f"{base[:-1]}; {self.name!r}>" - - -class Namespace(dict): - """A mapping of signal names to signals.""" - - def signal(self, name: str, doc: str | None = None) -> NamedSignal: - """Return the :class:`NamedSignal` *name*, creating it if required. - - Repeated calls to this function will return the same signal object. - - """ - try: - return self[name] # type: ignore[no-any-return] - except KeyError: - result = self.setdefault(name, NamedSignal(name, doc)) - return result # type: ignore[no-any-return] - - -class WeakNamespace(WeakValueDictionary): - """A weak mapping of signal names to signals. - - Automatically cleans up unused Signals when the last reference goes out - of scope. This namespace implementation exists for a measure of legacy - compatibility with Blinker <= 1.2, and may be dropped in the future. - - .. versionadded:: 1.3 - - """ - - def signal(self, name: str, doc: str | None = None) -> NamedSignal: - """Return the :class:`NamedSignal` *name*, creating it if required. - - Repeated calls to this function will return the same signal object. - - """ - try: - return self[name] # type: ignore[no-any-return] - except KeyError: - result = self.setdefault(name, NamedSignal(name, doc)) - return result # type: ignore[no-any-return] - - -signal = Namespace().signal diff --git a/venv_flaskchat/lib/python3.11/site-packages/blinker/py.typed b/venv_flaskchat/lib/python3.11/site-packages/blinker/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/INSTALLER b/venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/LICENSE.rst b/venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/LICENSE.rst deleted file mode 100644 index d12a849..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/LICENSE.rst +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2014 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. diff --git a/venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/METADATA b/venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/METADATA deleted file mode 100644 index 8e5dc1e..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/METADATA +++ /dev/null @@ -1,111 +0,0 @@ -Metadata-Version: 2.1 -Name: click -Version: 8.1.3 -Summary: Composable command line interface toolkit -Home-page: https://palletsprojects.com/p/click/ -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://click.palletsprojects.com/ -Project-URL: Changes, https://click.palletsprojects.com/changes/ -Project-URL: Source Code, https://github.com/pallets/click/ -Project-URL: Issue Tracker, https://github.com/pallets/click/issues/ -Project-URL: Twitter, https://twitter.com/PalletsTeam -Project-URL: Chat, https://discord.gg/pallets -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Requires-Python: >=3.7 -Description-Content-Type: text/x-rst -License-File: LICENSE.rst -Requires-Dist: colorama ; platform_system == "Windows" -Requires-Dist: importlib-metadata ; python_version < "3.8" - -\$ click\_ -========== - -Click is a Python package for creating beautiful command line interfaces -in a composable way with as little code as necessary. It's the "Command -Line Interface Creation Kit". It's highly configurable but comes with -sensible defaults out of the box. - -It aims to make the process of writing command line tools quick and fun -while also preventing any frustration caused by the inability to -implement an intended CLI API. - -Click in three points: - -- Arbitrary nesting of commands -- Automatic help page generation -- Supports lazy loading of subcommands at runtime - - -Installing ----------- - -Install and update using `pip`_: - -.. code-block:: text - - $ pip install -U click - -.. _pip: https://pip.pypa.io/en/stable/getting-started/ - - -A Simple Example ----------------- - -.. code-block:: python - - import click - - @click.command() - @click.option("--count", default=1, help="Number of greetings.") - @click.option("--name", prompt="Your name", help="The person to greet.") - def hello(count, name): - """Simple program that greets NAME for a total of COUNT times.""" - for _ in range(count): - click.echo(f"Hello, {name}!") - - if __name__ == '__main__': - hello() - -.. code-block:: text - - $ python hello.py --count=3 - Your name: Click - Hello, Click! - Hello, Click! - Hello, Click! - - -Donate ------- - -The Pallets organization develops and supports Click 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://click.palletsprojects.com/ -- Changes: https://click.palletsprojects.com/changes/ -- PyPI Releases: https://pypi.org/project/click/ -- Source Code: https://github.com/pallets/click -- Issue Tracker: https://github.com/pallets/click/issues -- Website: https://palletsprojects.com/p/click -- Twitter: https://twitter.com/PalletsTeam -- Chat: https://discord.gg/pallets - - diff --git a/venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/RECORD b/venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/RECORD deleted file mode 100644 index 0c973f8..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/RECORD +++ /dev/null @@ -1,39 +0,0 @@ -click-8.1.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -click-8.1.3.dist-info/LICENSE.rst,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 -click-8.1.3.dist-info/METADATA,sha256=tFJIX5lOjx7c5LjZbdTPFVDJSgyv9F74XY0XCPp_gnc,3247 -click-8.1.3.dist-info/RECORD,, -click-8.1.3.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 -click-8.1.3.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 -click/__init__.py,sha256=rQBLutqg-z6m8nOzivIfigDn_emijB_dKv9BZ2FNi5s,3138 -click/__pycache__/__init__.cpython-311.pyc,, -click/__pycache__/_compat.cpython-311.pyc,, -click/__pycache__/_termui_impl.cpython-311.pyc,, -click/__pycache__/_textwrap.cpython-311.pyc,, -click/__pycache__/_winconsole.cpython-311.pyc,, -click/__pycache__/core.cpython-311.pyc,, -click/__pycache__/decorators.cpython-311.pyc,, -click/__pycache__/exceptions.cpython-311.pyc,, -click/__pycache__/formatting.cpython-311.pyc,, -click/__pycache__/globals.cpython-311.pyc,, -click/__pycache__/parser.cpython-311.pyc,, -click/__pycache__/shell_completion.cpython-311.pyc,, -click/__pycache__/termui.cpython-311.pyc,, -click/__pycache__/testing.cpython-311.pyc,, -click/__pycache__/types.cpython-311.pyc,, -click/__pycache__/utils.cpython-311.pyc,, -click/_compat.py,sha256=JIHLYs7Jzz4KT9t-ds4o4jBzLjnwCiJQKqur-5iwCKI,18810 -click/_termui_impl.py,sha256=qK6Cfy4mRFxvxE8dya8RBhLpSC8HjF-lvBc6aNrPdwg,23451 -click/_textwrap.py,sha256=10fQ64OcBUMuK7mFvh8363_uoOxPlRItZBmKzRJDgoY,1353 -click/_winconsole.py,sha256=5ju3jQkcZD0W27WEMGqmEP4y_crUVzPCqsX_FYb7BO0,7860 -click/core.py,sha256=mz87bYEKzIoNYEa56BFAiOJnvt1Y0L-i7wD4_ZecieE,112782 -click/decorators.py,sha256=yo3zvzgUm5q7h5CXjyV6q3h_PJAiUaem178zXwdWUFI,16350 -click/exceptions.py,sha256=7gDaLGuFZBeCNwY9ERMsF2-Z3R9Fvq09Zc6IZSKjseo,9167 -click/formatting.py,sha256=Frf0-5W33-loyY_i9qrwXR8-STnW3m5gvyxLVUdyxyk,9706 -click/globals.py,sha256=TP-qM88STzc7f127h35TD_v920FgfOD2EwzqA0oE8XU,1961 -click/parser.py,sha256=cAEt1uQR8gq3-S9ysqbVU-fdAZNvilxw4ReJ_T1OQMk,19044 -click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -click/shell_completion.py,sha256=qOp_BeC9esEOSZKyu5G7RIxEUaLsXUX-mTb7hB1r4QY,18018 -click/termui.py,sha256=ACBQVOvFCTSqtD5VREeCAdRtlHd-Imla-Lte4wSfMjA,28355 -click/testing.py,sha256=ptpMYgRY7dVfE3UDgkgwayu9ePw98sQI3D7zZXiCpj4,16063 -click/types.py,sha256=rEb1aZSQKq3ciCMmjpG2Uva9vk498XRL7ThrcK2GRss,35805 -click/utils.py,sha256=33D6E7poH_nrKB-xr-UyDEXnxOcCiQqxuRLtrqeVv6o,18682 diff --git a/venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/WHEEL b/venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/WHEEL deleted file mode 100644 index becc9a6..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.1) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/top_level.txt b/venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/top_level.txt deleted file mode 100644 index dca9a90..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click-8.1.3.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -click diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/__init__.py b/venv_flaskchat/lib/python3.11/site-packages/click/__init__.py deleted file mode 100644 index e3ef423..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click/__init__.py +++ /dev/null @@ -1,73 +0,0 @@ -""" -Click is a simple Python module inspired by the stdlib optparse to make -writing command line scripts fun. Unlike other modules, it's based -around a simple API that does not come with too much magic and is -composable. -""" -from .core import Argument as Argument -from .core import BaseCommand as BaseCommand -from .core import Command as Command -from .core import CommandCollection as CommandCollection -from .core import Context as Context -from .core import Group as Group -from .core import MultiCommand as MultiCommand -from .core import Option as Option -from .core import Parameter as Parameter -from .decorators import argument as argument -from .decorators import command as command -from .decorators import confirmation_option as confirmation_option -from .decorators import group as group -from .decorators import help_option as help_option -from .decorators import make_pass_decorator as make_pass_decorator -from .decorators import option as option -from .decorators import pass_context as pass_context -from .decorators import pass_obj as pass_obj -from .decorators import password_option as password_option -from .decorators import version_option as version_option -from .exceptions import Abort as Abort -from .exceptions import BadArgumentUsage as BadArgumentUsage -from .exceptions import BadOptionUsage as BadOptionUsage -from .exceptions import BadParameter as BadParameter -from .exceptions import ClickException as ClickException -from .exceptions import FileError as FileError -from .exceptions import MissingParameter as MissingParameter -from .exceptions import NoSuchOption as NoSuchOption -from .exceptions import UsageError as UsageError -from .formatting import HelpFormatter as HelpFormatter -from .formatting import wrap_text as wrap_text -from .globals import get_current_context as get_current_context -from .parser import OptionParser as OptionParser -from .termui import clear as clear -from .termui import confirm as confirm -from .termui import echo_via_pager as echo_via_pager -from .termui import edit as edit -from .termui import getchar as getchar -from .termui import launch as launch -from .termui import pause as pause -from .termui import progressbar as progressbar -from .termui import prompt as prompt -from .termui import secho as secho -from .termui import style as style -from .termui import unstyle as unstyle -from .types import BOOL as BOOL -from .types import Choice as Choice -from .types import DateTime as DateTime -from .types import File as File -from .types import FLOAT as FLOAT -from .types import FloatRange as FloatRange -from .types import INT as INT -from .types import IntRange as IntRange -from .types import ParamType as ParamType -from .types import Path as Path -from .types import STRING as STRING -from .types import Tuple as Tuple -from .types import UNPROCESSED as UNPROCESSED -from .types import UUID as UUID -from .utils import echo as echo -from .utils import format_filename as format_filename -from .utils import get_app_dir as get_app_dir -from .utils import get_binary_stream as get_binary_stream -from .utils import get_text_stream as get_text_stream -from .utils import open_file as open_file - -__version__ = "8.1.3" diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/__init__.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c68686fe347e973eca5d60d28d4ffb056e14c97f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3701 zcma)-NmCn3630uR4M}Xqc)`ZB!8T@-*o*;VFp|OMjSYl>OIm9$-4z!AT9v+^M2xf-~m2BJODh%2Z;xPhxicj5b!V` zCLRX9$L|r}10LZc#3R7>`F-O1z@vPWcog^ne?a`edFVdkkBA=vKjx2#9|4c?G2+L- zPxuq!G2o~CDe)8FaXwD`6!;l`Mm!EY!6%5H0c%_%o^YPKlYEj`1D@hj#Lt}RgL;LbmSt{ z2JHLTp>`wtz6&GJuge>$TcK_?g@D_s-&I{`2ZJnH&F|I5+tDL`)D@s04C;ZfUr4-V0pJ@9T_ z?Xz`y70~iyBg8$XPfoub9Dc$;r%iZr0rF>u$KQ@BdnYG*A7Pk0J3FA?>#Yu+Q)l&a z$nU{f#TD36BM9`GjU5}tVb%5waiz;pScVJEL3H9RxO4USf#p%0-%{(vrQ*ur%$HV1 z*K5A1>#Zc5RZGCfmx&}w3MGw_LCK=@q2M=MWREM!APF zf^r{a6y*U(D`(xDLn$7j_YultlrfYiC{IzwQJ$epfV6V$w&43qXy|>8-b~%`tA-=R zB#zPnoh~s&12~&*(-tpq@=KIgDAOpfQD#tPQRYzQQ5H~&C?$|qDulZ!#UeVEP?k|v zP*zdipsb<1MOjDLK-oljhq8t89;B6OhBoYU8y!0+A5eBt$|x0(R$kX{o`3xx?00an zKg`k@JTtNcFGxewTzG?dhFALPU)q)|?K_6NsK6VzbZL2)`Z*5aNeN5v1tBREybUq*}~gN2+z(&uqjLi&;5R zEmn(y0%Nuusn%^(XZF>IDb{U2n-Np2TYr=$(|)!hrdYRCN^00iw>h0%Rl-7+SS^9# zEJjSRn5{*sb-Q0X5mPKygFwt~_q4P2&bpMN0w<^29qc@Zo#&^s8~@L$&N!WWo`{%Y zF`J51iy1skipA;@h!C^qk!mrUi&Tr*c%)jl$TJaBtXr44h?rvC;wXhv6>lP@ iSgZztm@(UkREyOm5Fu7efQtS-F#4A~{)=OHYyA(dbwNV_ diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/_compat.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/_compat.cpython-311.pyc deleted file mode 100644 index 05adae19eee010c643a277904d827e53d3580723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28464 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 BEXDu; diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc deleted file mode 100644 index d81ef9572306f98c5ca81f34292f85c3fee868b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32605 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

`Hp_KJBxZz22g%S6e3U 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 diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/_winconsole.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/_winconsole.cpython-311.pyc deleted file mode 100644 index 882c95466a2c876076319fb5c3d765861424c12e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13352 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 SSbvwg`jn?Wdrl@sko+IU>HEz9 diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/decorators.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/decorators.cpython-311.pyc deleted file mode 100644 index 5aeedb7515711e3d64e3112e016cb23bf4efc9f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23522 zcmd6PTWlLwnr0QNc&F|cOR_ANZCMg+NxtVI+esYR%B0hAI%t1lAGD#^4dQYlh# zq(~j5$Gf3C#zfm|Pqf|fHg_l8qaZzicag^Wp%?4M_CsT^4`jeW2m)RRyXc1j_JKjV zfuNuE`_HK=R*{nJWD?Als8hvL=lY-je*VM1tE&qLxc+DCZ`A+wq#*ns`eI(q#>3}b zUO{+IPz6G}c*9KNcq4lb#hYfD$D2jLC1}#67IUy_ z9lo_%-|F$L&HOgy>NFpPUp4&FB?uqkpI_tcRqZsQ<~H-~!?mde?%P9$+N8Cs&071E zthQX0$2)D`Tk*ZiFQ|{J?dWT}*{`}y>sFi9jwz4YdDT6>LlxDo_eFKP)}wZ#+)lHc z)>E08QGUl&&$v=Gryea(Gw)q!XSdmoy7S>?idh6O3+1Z(OH}>HtS*f2vA2f#jHuN9 z=HuLrH`dyqMd!LXV2Szfx$3@uU+C@leR}If`xacaT{d{#e;m8)YdYmq_tuWXFQD%e ztnUiO^i<8qHdlL#syHRt#zLd4K+8VjK&4dWNv$1wWdwn$5jY`gqXo>W57^~cyDxzW zAz(s(4JOb`EWG;an4q;!i(1GIG2p^L%^LJtJyhoZ)mGqs5DnQOy2;4wF!iWmz_b@M z-l6W(>OqwvM!p|(zE>Rt{nqwlaV@O_bMB~`^AKwGeWjYisM*hI9>Dmwptw!@JcybD zU#aFH)C{vV5y7)W_3-3&r_CxlP_6Y;^bVX;&{H>*a{+Qbz-GCQm3$nj2V>9qDn`kzD;!FS&&eR^(2OQh-D zXmVyIl2G|$f{NkM{fwTRo5h3Yh1qm0nZT3(I}trHqopRS@i zwsL7IV_cUkk(s92#T#}d;@ zI;rSdRExc?Dd~%vV$4i2W)@IzB`;jkqG_r$71L9AFkm>$-bT%_(A|xH!nMzjBDpEP z2Q6X6WuKB$mQ0I_!haH95@N!l_<{J>Sj`W`vw8@1Ka@%``bm{Mm#@%WCv7N2@KBWH zKWhhGPHB4T09G=ht20=hL?m(G`Q+;{Ep=cl9!Xsuy%-EKVk9{U`n zg%4$&rc@HsB{>>NrS%5Nbg{|mBsEjC>XVAzMWsUaLFl`XMXW0|f&~4R1ETx!vQV4+ z$s>fiZtZ%%?-xzkzsPqD6}pDjU&{v%6@rIy@*%w&)&B*N^Ec;WGqHF?Cqx_}SdUEF zr#U&OT$oEM$wYi!p?rp<20|ti^o=7SCq$G3wx}s(U?h@G>m!q+JbxH9Cd0#ua{gj0 zrQkD{(x&F(N^A-(M9@6LaMqHp&FWeT#Lc@(rNK~?|TWC%XkAhuAF2uF(eQ)dsgUZ+sq81B8*E0Tzb{MC5M|cOkMitY@FfY|*|28FO zL@-&GDqRgNxfWeujB;cc4Lk$Rmrx=JlgrT{fE2)ysIFn{iEmn5fn&>+SUj#=N$Qsw z!lX9GU(9Kep>8Yze2J)pLj*s@bHQl&oGI7BVJ=im);p-g(hBQpDwa^GloCrMG<_xs z7HqI*RviOo12L$_2F%If0DHr*ep*B2EhdDyq!h@#>5Cw$MidmK6%ms*YhQBIsTXjr>Ab?BPX0(|Lnhuu68L5R-Xg`+jPbrBcI=P4v z%Dk55BjJ*Xto|C2L7AVcNN&2AM&rr|8EH!TrnH)~QIpW=Zs{GL&;X?OgspXsCD)3q zw=cS~7XP(3wBq?C@;|cPElG(sl(lmnt9WhMMQOPs4R4Kksp5*~5^*Ya{miAhZb{De ze=NF$Mb{-7Kf6}ki_)~KS}O`mXBSR94<%gxaD$;9{ER(>_P@De_ z2?W}`=Dqpm{z7wqW^|*Wtt?1&M~dy8pSJgZ(%!!w%(ovcv>#oSR;7*h&i9f(NoFtS z+YcAo4yVY#Bcaey#b5E4uR5)2R}zctN;zJ~+HX_`Di;0sdq zTn+w5%fkJVKkXJ8du~PEpZdj%>%M%?p+e80+lTTE#|jO{a=v41xM7j0n_-Eq79Z;& z>PDimno4KOCgal&qr`qHdJ+j6(cxzIBR5|x3%K1n#BL8r282*sPHr_uQfg3>(Fs*c zMfDgnyGqh!ZC*cu<}F4;G)Z8j;eGxJ5@ItCkoja*afvT3dsO#|02=h%l9oi(yD0ul zP<^+gMc0Hy?MyH5N8UunDC3@>C~K*}3!y3!;xeTG<6}~h@m53KWJbiWsdU0*j7*Z* zM6%myIuQ|5uF<&0IW&{6usIE}ZLocGG@?9*-eL)5($Z*IQz*opjw;!a2^Q4zYmdVW|)&LBms#xj3oHNo6<9ryqmux7sm5 zq}U;{+nC+(u<|-=I7~O9s+u}7qC7TykX3zAe; zFJi#bEu>m;R~&~+5@Yw4I9ZW5WA|MBmpGf2X{Gf8=oF0G;=1}lWN@y_7%th{DRK;O zhHK-uhZ(D-MkcTx55;LOQ)7&@9h|n<+;(GN?Z}Ox%xJM?$Cu%Wl8q;_kunye7-E5# z&H_WiiTe!m5)JApB%A|E!~wTR{uFp1^Ee0yJ)*xayA#%%zt5IPg1f#Tx0QW1J`I=IjC!6~X%oyZ zV)14SM<9e}yqVCD_N&eb43R&CQ%666ycCr%CgzQD=bQc%^4`M#=YAxZkxy{@mPeUb zD9NOCl-y*>r)s(iQl+Y{bTYl+KY1EAeH00^UkzZgu2}MKsH)Llz}BA>ji($&CJlJY zez0_`pJ%MjX!f8#PJB;MHYIan*4OWVb4ZAtaQ)&_%nI|!zSyL0sCkOwQ=7x~XBJT}z&_ag70EWwkOHxZ_T2uupWP-!=Z<>xCW(mPjmsBEi>Eui#9itNS3J@w1 zy{O>1N&uTCG*dw)zmM^tVk*p=ZEX2OqniGk6U&8;bfzNWx6-ja!HiA<_x zFJsDonEmOCY)0@SLq@_UiMhiw6^}$Al`qUIY9w`0OJSbRPAT)rIp)nJAq+ofVw$Y? zNP3XHh(;2uA>t!UouMivay-xXVAZnb<8KT3Tl?)l+xT!9+YL972 zTom7SEs6r46kA`F=F;TfHm+*%;2e)ABpUY!>3XxYAoL2l zBnsaZ67m({4e7hW6&kUx^1ku}@#hem%K?m#Ra!f%`qUxcGa^}H{wxM`~kg3&gLMR~#+5f_VR7ml66*5%AB*~*$cEF@QauK%$FNmn zR>U@`{y6nAOijAu$t#*(@)|NM>|^*`3W9&?Mzd^8rACV-7};%IB*1BLbjnP5@bpHm)P-M+g0&Py3jS@!rJDehDXI}hbT-B4Pa znsbf2i=pOspTG9}t%2O0Bl)hQg|4Id(6K`3SdM+Z_>&)I3H8@hNs6Jy%;~a(yf41^ z0=}kD)4Pvfdwlhke6YI^?9K&yi`_fke>QVwwQuG5jryicv@EzA0>!4bT+_+5ruVx( z?F@g?8P0d^FLdtzwDZU(okwnu-f78qo-A~pEVi{5TRO{LRA99*%!byo-~5`9(BHO> z8?lUZJy?WaERZ5o^0$)r)B)kQ2Lh)~NWVQUA`QDa<`7$B7^3%}T*)_Tu)30TDls2+ zS82l~nIsmsX^8qKA@-|PO22sV zgO{^`LfihbfV^LO+3jJHM+9Fe=iOFp=*Y~kwXVE%{jHp@XCv5Zx~^)>5@MR0nkD*^ zG+9#K4HL*cO_2ur1?2nz|N1FPx{=hh$t(j8-q@@vM!otOWIAjdYK=8XhJ-#wNllYP zJ-kVb<~?k^XOU5RRm+6sfL)p_B3|JHD%qvTVzq&C!0rsMNCkU4X&Z-CB{LAf$vKx? z`SaP#)rW}pwi*xU@^Djd^EAjnNUjC4bjpBj1+Qz2+$Fr_4+wCGo2 zP!ULPO_3ph@`fp4u&GJq(j4~km|KxbO+tZ~WNk1;O93aeS8eR|n0l5&p?t75ga#~@ zYAQkZ)v}1MGFE$*3kZ+?DwbI%@udHN5+Z(`c7K_5Yg)mh$S6tE`mC`_ZIHT!kAKAb z)FKkld8^>7duRT~^Q&!n@3w*$UWuLewsmLR8EqwGBYu~=^Il*72UCCl@~@xC9X*ZD z9gW}feP;@NXEG9Tt<>t#mHF%QIbX*gf}!h=+}wL>TedaVc>tgFHh#|s4;F$4bMis% zR&X=$*4W>Sa{mD%bh`HLt3-7}h`UgQU7IUR2+;v%eT090A&M5Bk+dc51t?4)HMCNR zicNW^kvm~2P3XmX{xZFUU1#-k=oX&C@8HInH_85zhikbd@5M-pgfK5=M4n8cgq^FD zf?OEGJvWoo$q`4ylA>aerrxI2T{mCNdv_GPJIMPKF8ch}eeX70YglvVeLV$V4_GGu z{Gp+J^|f5rV7_6f&@e<&u(!BtPv%r1)U)C97kpix`gVQd+m+p$_YD+$13B}<*Dc7_ z4Z8%OlPLPOE*VecRr}|}0{j=u2s#Y>0_5FCM1Y}slkP>tX{r{ALU!?N6468Cx{g}~ znQ3fLFSZDn?O35>8Z@*gs>2)xCN-Zjx|uxA+!2Po&6+Vsz#6vM+>olw%2$;E?Tx55 zn}%UcoC5(atezR;qP;d3dp#0|{lxS~+Rq>Z9doPc+_3pzMk63@4q|zAU||K-$E>1RJdm$`#g)ZV z?S&A@Dr;ue;mkrjo<(>>sE|YAibQf`#YI}YlWawlKnNR%j#O1}#+Pu@NpLfwF}4Ov zb><{S$<4)e+si1FB0N^iO+uzQEo?U-w~0=>gNX2H)cFEYXB|6!?*FMjyLY`c-!WY1 z7|wN!{CXf$chA?ddTMoPbt(J3+_n*XZlB@zyzh9ycRc4iPVs6!MqqH$Hlei-C7njY z$5nAjPa0~A&m57iqZAGT*meQiC3n-!m*AIoH{E)g-5!txY~JOsout>RNIJ>fdL|No zLj=vEM*l^~+35NkCuReV|6GTWG2DkEZbJPoQ#GMhItecAnEbIS@F_ySb$s;y{}qS(_>a`P{4NpI8mF zFEd<%*|eR!;wI#OkVx-EQ~~*KZ0mk+;U^3KcJanyCRA+S{b_sOC+&UNxpg()ex%TT zB-eiO*RN-SoEyBk`eyccZrhXi+#cljyzi-k@2Q;csR}pHiFfL+A#nx-c=&+yH}Gb! zlltA9`f(%b$L#@0y^Z==EQx~!5EJK89ldO_({Jfra9>IGT?%r&;B1BGs*FfKC^D*d ziHsc5?`kg9r}}G{_*P{Di>`+*8&pFNUA9iGf9SFeYGZX-r!HxlI529OB0~V(DHT#2 zI>OMk+4hX3T=5fOEIU;6n$2B06cd zB{%DXxm?di?Z`uj$Fz$_@BsVSm1(pZ@q`d((SDRp97=vGtp~ynV>7;YZiQ|g)r2cI-PQ-f9 zI2kHLqBPoyH=nhDg&c;rh{#(HQb+Oy#FUl-uyc()55`+eHH3mE*nk{BDYa|@5B)02 zjt~fbhX)v%%`SJx&1uATxjTLlW4He%v)f(32AS0fHoLb0GVWc)b|n+skOQB}ZJ)?( ztFdfrUhXT%eL1$i1$lo?-e1X0WVO6JSda&E@?a(RVon*!%f}1y@tl0T zl0B8{Ig^*i3i4P^9=jK8T0Nc%hO>Q0=p%>O3Pmv)>mnJ!xFVqzkdOGA$oQL8#Qp$x zy;RLFwsiQ&U!pAB=GE=mkE<-&&UA!55t3CEK17U!wiToa zkcJU>EHO)Qj%1jmE)#zO9mB$br-YaU=L(VO2tuW(5j&0;`$yjt7cxit^|2xlW?%>h zR5+~kWi0FYDzxVSD+K@`ZGwRY@g+Y-K}JD%W{Nyfki(pBFdH@ah@L@-mxykr@c_DM zH0YqO*uK|J2N$z)Ufx@f_vYli782*$_phJN%ZCf{;hcQf%3h6UPv_-uK_)!j3bn%$ zooZo6a9D_G$&V>b^G7e_KnfABC9e@DrmxV=y}__=&6K9B;W;I@-BLj>#g`V zS+4I#o<-l=&oBBm-}?gjI7cF`APD0!Q)=|KEo-@JYw6op#H`1hk^Qb#1v9JON+cRW zK7985G}WJOtkhKlY1#`gE;Wcll)j9Funt6Z~KypGHfD8x6y_>$9mkdm-QV!_W5ucUhrbY`OE3jSvXv1Q42{P#x%$%rj;l zkDy2Z8_3ML8Za4D5H$oavhhOcf~rgc#vZR>O#zaMLB}a!jD|+gD+H4P)dXL3z?&3r zrb=%zMFwYo&V4zPc4OqDN@!%6xU@2JH=hzIL46kF+#9l+#; z24~>zFw6y+_-n~)G^=07(DADb?r1We)WeOXCQvK_G(l&yWl2LQ`PsoXJ(*0G{ISGT z(l9hEeMtWa+9(B|Wk*_h*i*Ch(o$qtPo>uHa2hz9OpnozJh0+AowC*m%9XwGl7urd z`rlB?GO2fncyhXUSg*{Ev6(eA8!Na8u}#Z7l$<$$Opd>$@8@qpKdB!g`NDGkw5&;m z4z|zQg4m?YSefm&1iOnJ+kam7)4G4(@P0#~<51?=jbL-;$+gAY&PU50x$co-<8ZF# z^ToXu1TVSjaKgY$HX4uRoS(8A?ZcmfyP9+>&cOl5aj*Xg-?pZg}gL-&#A7+kW6)x@)qLu(8*cR@Sp50w)fioC!6~bH}@D`%J$~v z{({_}llv=9m8n~ioN^-HbF$ELGA}<-ke|rOPZT?MEstg3Uu@sX&l1J5SeNB18N?d> z|FN;625ThKR+})PFR@`$XWtsZCJW~K5&rpA(<5S-)dpt$lUv%j9FEM!$j?x{V*OKy zE$G3qqq2qRPemaWr@2LKQu=0AzZt(Vmtv6^2U?Ljk6XVBexEATOYQJ`SlluSq43}yl zOA4BE^F~GvQ%P^&VJn5y?hJ&A#GG;lK3F%WiUc*wQha~4Nmxjh`mMQ~Z5V16!bfhR zB(_K>JeKJdB_I9j6oHDV6#CEU#S#+7o(SX83p;EpTG=%=H;Dc>@Hh1gYHq0`{J|H> zoO}2C*S^2fO<3_9;H)7?u zRVUbqW*a}di|xC<0fv1t-}6MF=ZU=hWI=v1CqMaMh8-5ij2{6yi!-BV&xQx}|A?uT z-1Kt}_*E?2pxg35Y(EQ0rQc;?zb2&AoFvQn?wi-t9_TPe z$xY{*QXJ{LbPnK^h_3&T3Qtf%#zM*cass=0ELMp93Kjb~pps0bxuS8Hiv9;G>U)80 z>PF)1=&F94?A z?$ZVL>19{h;}Z|Bo+=Btt?gpB>ZIL|5@K1PTZG-JlP)1VT$YAJ`~nA(VpH>tcJ{Tn zYcIQRxI4>k^EE5OlMAA7?D4YHLlw=W=nt`+;_f{k>{~zg!2$M-wO|&h6fQq43c=RQ zuIu5|XS1*70z>)0P$4k1?1ggZlCE}@U6SZ4Lht|9YHID&`)5`c3ZdO)37H%2P}z+; z0@IA-Gf8lTj4C)0LDe_96&M=y9!W6}yuNSs+;t2H-!|&%ufJS&(@T%w@m?Lr&y2jf z8Y;MVzs( z-}S)t2z<@!(S#Lwc{NaQZ@=G)Gy+a#sY%4Cc_a@45fvGG=64#avElYyeKqqkp!Kb+ zxR%PESz9Qy?#tEfE4Tr7vq{!2PX@eVc=d2uz-{gw$Hi~U)N6G?jMB?lL zL_BgwzoXuL`p(6|k!M(5b<)?2dJt;3(fYE7+f5&L-FfNG>ASn{{6*o=8J1U_>}wPE zWpShkx7#m%{4#sE^V)9~et-D)y}9qa^!tIrljm4wb#kyC6=ARAhJG+mJlr|-n~}Tv zUG?`*-@RBk{sPOZPI?8Uw=5+^aUZB>Zy0={xN}cA$TEaVS_F}euSwS@cv+a|Ww%kO zrS-q&&8zb2g;iex z?5Tm}+xjl^XI1JJ_pJdoxUIkVE5HU1w_p2s;qKwPy}x(e9Vk5d9Lw7>VXD#p0|xn{ A2LJ#7 diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/exceptions.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/exceptions.cpython-311.pyc deleted file mode 100644 index 8c57d06098fe1bfcebce64c7fe0826a70c4fc16c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16082 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 diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/globals.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/globals.cpython-311.pyc deleted file mode 100644 index 52050008fea7538b4e709cf31f5a6973ef041c1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3389 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

_A($sdU$waqU&a>tX7KAlz4^dOv%Y2j z^5F8|okRF0-nqcReBhuSI9Tvk&wm-`#zfxUl_q^lH|Oopn|sAO7dVg)9MA&?3jTWC zzs1UYcx9u$(ZMKi+3(?Bp*1U2aXi{b-JHUq=}jjuk4}BXO_>bow)|*+O5oo zR$BEfy$r_ldNZJ=cP`ME58#k>AI^8_{tZ^VG%2s{L5$+&r{w?v&1qSkg0X;BK z@C3g0)K{Nc^5i@%c~6V(X)z9-?KCQQ>zQ0&M?SDa5A49vvu_^#`ca_Z$;FepXG5A+ z;2-Q7Y>+-~*f!Yf{`m0jGh3yfY~6O|xI1doo3dSimh7hrf=cC>Q{09SEk|&HyYxI8 ztc=4qv_xn(vayHCIF2A=&oM}^qFhM}A5Ffw2|9A#8K4oTn~Sh#U>6|6K3ga)mkXHr z&(h_Qxa*1J)v^-^@rYajo#H9`?FcIxZzBv2H1B2utBAjy=y6r6I9c;plC4$;2h3d* zo32JD&v4t`DSX&&+bjB~am^8tkAH&)&x3NL$tDHz(a6*z7u=i=Zq_}Uh5plT>|xrg z$V8fb(o;l z(_%bK1Hy#|!8%=!&BAvNmRfCMnml*~Sl|<8aG4AA3FsEVD0psmaW%(AI0~vbX)Z2w zgUwrLh{%r_WoDHL_)9l1=u8E?BZ8BPVw=z`p4NVJx(8kMbnW27~hv-Ye!K z_SeNEK!7u@dNO^S3EBZN;hGag&BOkzU>{Bp@Z4>lGIrpg+g4^GIQxNeoC*e$&cGNp zY-p!&TOFQ)8-*y2N#pWH3!Jq_g=DA3;B6DfO*pGo{NnKXBgM=usN8PsJO^w1~Hgtp1=ogGNxvWRrCQ?I5Nw81E1iA zwWmmB)+nw0TRcb;385xTJF=G%TKo4%{vuJ1rxAe#`Ir>Ip10}UfjbjF_WpQQKYBjb zc_H6<0ckh_z3kT;_u{>BM0_szKMB??`Iprd?N0i`oqF)GT=21c@G;%<7}K23Jv|w^ zMi-g_I+N_iQPX0`@U2&`?If0u56j|iOPs4B z`r)p)Lj*U0%(rCyYnx3f)x)^{)W1S|)T&q3>)fHB5cYsJc_V)cQgsg95?Wkw5{XH= zq3(eX4Qpvd*Fk=uSAvpNd?g`*i!eUyffI>wcO26uxJ6+l;nFo@u?r^_@+s@Z6Tx(pwL zC>#->i-?rBKtaE0P7Ibn;X_Yl?}l*r6)1+u57Io2g{!)+qY{IHt;@{NAUPBTV$=pO zSmx0n#$RJF0V{9>fIV(IyJz*0dn{;{6;_<7HUI%#ArIp6IrcI-q6uU7w3ZX&p#w@g zO0c?w8AYHFDMNWG=&l#IiALC6!&u^?6Kg>!z~%9rr1N1k)P}3DIHF=GAO&hVK(SC! z=sT^i3_WZp_Tl3*0vJ8!kqoE3HO~tG9*jenh;f){2roHif5>N2SRuqRRMN9BFulG` zudc!%z(xU-b%1TsZl|)zyj+z=3V@?2v3?!5bFSS~S!;_SAfALym!*lC7#FtEd=O7h zhBoMTG_d(=*ThW%l|g-p0MhX*atP!}gl`-X7SR>+AiD1yV+i)*|A75K`;Qd-83q3d z0d3J=qc4Aspy;8VVG~2hhhU&?ASQjSg4!omDOXHQlc$P_)vOB8{(_!UFi-n2UFm}T zcu1DKJ9W7Gr6VBJE$kO|z=TB7KgiJ%icy4epG7TC8zV#n$G zr+X3DHeWYyzHY(3S6-Tk?a>pFJe90_A_9*6Dsyw@$=xf@KdtQHjY(|$*ouVzs)5Tq zpZIA2zUYWpC;&)PN1It0n}~ZQyeK;W(>}|NpR^-&V}Ij{1eOah#457#P`iBe6niHO zo-jYqqN-T4#_1W}%HTy0oWwa8!^moM4!c1aOw?gWrKE{FK&nHaAC0kCqYy?&JT*w_ z`nFV2_nzIRHATo5Q(%8%nKYIOof=KEU1fKrDb+06J2~5nYdVvOR0KjqFRcieF~x)n zQ|iMwQyx8o(gI%w6q+~Nw3&l|DIuM43NG$6)eibVC^n$Hh|ril!%3Mgg~t7eG@fHI z%&R%(L|>S$S!-JO8RJ|N3|qn<)*5tni9}6f=n+mYD(916el#4nAs$I=cC^&O;n&rP z{j_akE`UZ)$CJ~qm%Zw^v;$}{K#mQ;c^?;Wfd~ma;>1Ko%A$7Lp}=3!4)L`6@*0lO9Y5B8U61R_h|ox z(yfOYr5e|fngWYY^jIt5(cdEqxgQZw$ODphx9-_xf8P%_EgV}qyR6+ol*jmz~2Go z9HOQ`^CIB(k`rKEsbO)bhFLZmHp>D`?3(Es0yawQ>pa*39|SvV@DaF0-nf~!TqRY& zngIpBwn1JZI4@_2sL{9Ol}ITQQ6QDL2Hq;g z96vy^4yKL4Oh^W}6s~3vi}JE@NCq4zUrJzN%9ToN!cmD->bjDE%cF2|h$QwyJB8!$ zc1d7uT?P-7$(uuO#w651I)!{w2AnRbFvuPq?WSWDgaoN1S7oDn;ACxU#@MF~eu2;p zb3%x~6_~Qfu*uocPZLp_aN++2R<@u(pCSfoMASeVLtwuWNu!4x=w*`gt8OU(D*}Ei zrbl99s1U?BiEj|9`sYP6tvyn+o6m?iHR3lib4n%A$mBcJn#pPh61+{<=X^|Pe z#)z)HFv;hyPzyA}3^$Q7iu9CHGQLDV#6+cnZ25(r~RjnC1dSSfy+E(zoFG)#{c^UVrR^<;? ztB7zULB)S3!Pww{agE$Fl390`FR};o#Y+^LZfxqftu2$nbsd78CEl0Phyp;AVlLRY zRTXGY>QRz%gcw9i6^SG`fz2TX*d`SpRH1`codE)h8Y&Qz z&%!dJHKt7yw=V9zDAQY7*~nlN=8BlunrxD=^MG%0z z{11xLUE+3nNSCw$KeYde^j{KbA*C}6PKr3>(Ul8s$p^RaA&+;5e$e;9KyJs8{Ej1> zz^6X$`-Ah@dv*1CLvOC`K)&w4f~VxE@{&wS_UOI$LiJ0{%R5&t>7lM%s4E}pLWC^b z4fjG#Z=PQ~zkol-C7lgaP6RN5FFZ~*>jq)74%O4MO;qQlg^O=qT)eozf0TtTk+0hH z*+TzXSvUjgNFPA=KK3`C*&uzqrFL+i^zmMq;`9WX;h~}7VeJxXxIA>Z%R4k=#5Fo+(p5J+j9f#*+Bfh``#lQ2Nx>2Y9SBg? zgAdHaG5Q7~kMWkef+%OaP$}vd8pa6_d}{YOn`>yOOCG|{@eOsI)#j0;Jxc*;&$V|c zU>xuX&O`eur4S`%Oep%{z&8oiv%nTVrIVflx2>7K=aUu}!IG;6e&{ce8iOAsAA-XX z6S5-lkGyF_Z#5#SMK4ZYA_s4-L|Kb9mtT7J-00aS&z*hh{O}XylXOM@Wt4vbY~p zeh7^WC`JE82zDSLLWfhL;>=&rqAJ#&6*qld6t}kVw#*AiyF(dIQg9r>=YbP&{hLn2 zPHAKUr`wLyC7}Vo$rFwp*!CNX|L{l7o?54^SxGETXf0sE=X;<^IdQP4EXQ6J#Ua7 zi@dksJoJbIkoP?`^Mh}kUxJLt8NVXX+pkMaOV8aJS!r7FuB2D0^DX;ysSod* z)K~H}*1HOx;KK7IH)8iaRSSnoUc})0;te6yPw{}{tyvf=RZ+ZJ@&*^ql!6ow;ZEWO ztyDwtT9IBy@p@6Vf#QuK-bC?c$=kGarqn|5R>|A2)KO}q_y&=_k>Z;qZ!_-y-AwT< zlDBc`P-!d0w@KcXrLod>iYp?$o#Gv$Y$xLLq0%m?Y0G?F$>)|km(w_CCwH!h502Y{ zMrqUbLi^6b#;t{pU8R~Dd3#AhP^hjcx$${FR9Es+qEBjSEBPrFkZS7|N0#Mxy!o1K zr7B9QriVd_g`{9;aqrSg`ReVWvReFrN2!h;QMI-}@yJcf&%JX6enoQA%4^@7=167G zD0S>Av~4N$^c4;rDI7gcaN>>MZrHfB)RK^8{K$jE9}F?a?$^|o;q!_-KB=LldfsOf%`$|?kxpHhLF_Ic&mE(;5!2- z8N2h`2Uk`S`OSU#`ue^D1h&NNZ0eP$B^S^PW)Fz&Y zei+>`KgQfr`!1Y{vpQa?8IWsB5(4fqK1F{$`I@aIFFo@~*!lbv3lKb26caN4;$t?h-D zjfI_Eg_cc)XD$_5HWXSn7B(C!G;b(0G!b$l&z7yF?N?kfP9RfQ0194PZg^+Y%HTU& z^R>H6Zc4o$s#(0SlwN$MYbsT76a&(HYwz;qd}Bu`$SEOu zSi{j;sipPS1@7{}4+ic=J~(-&_rrrf8u%#sqtp7{3;FF&<(r=_)p6c>slKVyz|lsj zp}Ew=QOt5{sfDAhQe9)IjiVbRET@ee-DG0h7xLBHN}D-ti-4DhZY!s3liD^J{Z=Gj zYpI=6c?iTn7~zyBB=0Xt&OnjQ$wP9=Sf~yz?ku?}dOuLLSiN-c*3sp@75RJqJMKG|?snd($ty=bbnBas=bKLC11C#f zF6)!3svjY zq2_$;wo)CZ)Jvcn7nU;l(3VmIr@)Vj@Q3H4iBp;d?c=r9!YQrz-6GuGtLB?JOKqHj zNv=1>U=tC)&78`^AqK?=&v>fjElc=a7kn&>502Y{O+@{6?<>?b5yjgEOx-RIg5XhD zuv0lVrQAoa_hN&)yxjiIo?BncSMMl!IX{N8rsU^nfL4DMNAX)QR_{c;SON8mu~H2` z7Sw^G+@5IF2w|53WSDd;V36aM&6xdC%|00%Hv*b<0)$c9jfDH3+)X22sQ}c9rsEQKiiY9-mgnw zANq4rf62F5hV+172|o~kj}(i!eOGzZhG2@to_#P!lAV9wd z>VpAOX6rVzm)_7Ry=JoX2AL{eW~_A79q-iBX5kh?|AI&M zjKpo*@r&g&~2t-XSk@tA>1VT}l6VU?{+I zqFeMNtH*;wLFO0W4-JKw-wS`uP!01}CBx&9p$N}OzKgX+vt%!F`;v9z(V-~MxwywU z(f<-B2HtXU+}rr4KST8rcd@~E6RS}|qwyxyw-{bd3?in!k2h~dlE)_#@ClQdL{fn#Iy{z0iNog-sknS?SeD|VBqO-`NL-PQ zrpL$QDRIO44?jFU3jArVvk61CW(t2YIL1C(c{*nG5OE?!H~Sb}EUC^uPp2DSjTgMw5xrOFJ`?LR8c@aZU3L zqhX26@bFZF9WQ-GFilW}=Ee+HY}_#GnX4`~wZjP(o7%{k#ot{-a~gkj)a*FkiGUc= zcEIxnmoZVqaar!7`IhCKbKwm4BmPv6ORG9BWkBn)96|OTmmGy7(<-1)C9#-X4@avW z9xkUt2bwE7V8*mkHcCIkt%MurGYenO9WI2os^P79-&UCx9nB?QcC?;a&RYKjJQ#BB zB3%7ZTJ7!6+52oH0g1eY9=>h%l1IoHP9_TOam#gZWFlKlxFTbCjPA7|$k9DvSOTq1 z)j2yxVeOQ38vuqS9G%OSINrah7>vw4bvwB6R&e8@TnKil!LEF;>rS|K*3WwR+y9M6 z<5P~F3Mhp2^m%xwr#ZN*pU>ZCCkCwE(}KxHRrAmi^`r9Gb|To`d3h58rfMBsr}Px8 zYzAOG|Mt`?Q;VCIw%=~;z17;gysOaqfZF;%A>5~i`|`d%*6lx(?h4fWT{5-Z(b28c zQRf)5loY;JPq*J{-M)Od(AuZA_7%cA)$q=|Z|5IWPkq$>WFjT4?rb-8*16OeiF?-R zZ{MxfzU3DSt-I9LU4`&NYWShN?;*Xv<^)4lB4S3!r{MV(NO_hU<3;`@-^;eio3rOY zI{kSIj>SS8tfYaq8Cl_CQ?dgT5^)Ndu525Cva@j!2yQm;*?ATtcOMVv%%|y$2oNN9i(!I^qtW~JHkX|5ZhBvXh_A!rQu;MFg!e-7AKSB4-OB%I2lit zWB82bJHq(r!P7GFK$=_0$eR0b>Y7a4kS3hF1}=)tUd^3IW!QEl(~>O{1~t!9n1^h( zXud%pJ)TL+@;-`wm;lWZ)+~KiRnsd0;!+f1CuhvRlFKc$FUFTHmNk;Y}g%SrRw}m;CAjk_lDc8>VQRd|KGN%%FdEr3{ zdvIQ1PVP8!Dgl!1rm)?Mo0yZEWKJbOvd8$vT}%6NTb3T7$jA6KAW|Jz>|E;2J)^d6 zr}zVv04X~4nmQ?JO`zkRFs^wqPEveauEC3AogmI`6aL+W*v%QM#0;cmefHDbXY4*= z^~a1Mk-!LqG>#3#ed_Fq9-eW2aE>FAP0TWFSL?C>E$$0C%cFGv6rs zLbHPLcc-O&);m{Yh80^j()%p_^ht@l=ED>Sc)L3TKr8CHlAZv0Nf14d>AXg65pv#G zfUUb#F9nCHB%dfq0%R)RD$(0-#zE?H?x8~{;VM5=4O9dmr=G(66VFOlGlQp}mE#i= zlB{{pO^%Jh_0SB|JeZe~=Dl7!J^H4=3YuzL0|}i zeZBbQ_USHQv7rT$SfK3824({~378us${{~nmuZK0$}ajnV;ooiQ4=x4}2OZiBK>j}!lj>!iJ93t=t0h+w> zqXZr!z}9l#gq+5RX0BO-riIGmH7X^O!^4=QUqW&=NgvbK=t0U(;4zB$HvkwMdDdUinh-MkVd>N!uxsi(%Lc9EE#+*1Dm!Zj7 zelD8f8Qb)=v`bmeDgHYdgK1aR^-cUc!)0i)mmksPO!Y_5xy-ml_cWL4&4i3pq-My_ znqGdK^~ennbbUsg-K}KRr@0LAz~$$nv6imaOQOW`bN{|!CG?!qh1|ZQ>B*!ROQkb0 zQsBjO1zwEUa7m6q>lb6XqnN%?=|XK!P^-ESSD1=~`oV}@^NhxojOH3Vt@%lFcwCm# zvKB}viIkFwr$!|<5j3xq8l~mcl}Kw=uQ&dfzu{Sy3Y~k@ z&OL?DUNy9L)^(>kG&@j?Hp~uwP}7ueexgt_sMZYTeS>$Zf-}>_NR;-w6@PU8_?x>6 z{tngOL1etO7-@JT_?_V5vxUeOHL_(^_@Fv8*Z+EaVeHLka>omey=r4`p?bSoy*=;Q zuCGUEp7|K#dAFI-wzV4$x&542OR8_|aUSS51#2IaJeK}ZtU`>b^@O(5C;A;}ZMsS^ z;D`|{3PQL^)pp&b^+UQS;^;L)cB zW6G$Un8@^<(!BCy3K{^-e>9o+lI{&E84>EwVa7Xa^oDKKc+)kn!@I%LxJ(30xwO1nBYUOv0z9RH#>sQ2@|49onv@!umLv+yT|3 z(7p!dpp|3l*y=lN-LoFm*J8LOAJ^WahqQEoJ*c@;cA8^&3(ewB-v?H)z4v7mdibgC zv!H`+T2Dl1rF&w!K06jyVw0%^jTo&{q+O;%3Vpy=F%`5*Pld|e(hK-!)G1nh7{?Q- zpZj{=*Q(E5YLW5K0I|W&z~f|Oa`tpadQ#n*18(g`l{;9@9C$M$Jfcfa=m^0FcFYK zf1C_d3To16UUbowNLm%pYX9y_<$f5DpbM(X?%u(=|HZL!d&OJG6}fXIIc!_l)@Ac;iB~my~SW??(zA< z3nvyIQR{n_A9?qIeEs8U@QIJyu4tfCO9`o78|Y^;hfCP7=*DUyY_NbSnoy{ZCG!XY zN(RRQW-jHg<37ez%XFj!M-`&5&AlcO(#OUdN zVk_7@99vf~X(n?gc^ok|CUDF}B&9!=ugnbk#DM4?3ov%gF9yXB*gy}C!@-md1;Au( zfOUeMxwNs9pSwn4Fh6H|(UJ%l$!aNh(G-}<_-KP=gR^C(5QUaet0P9Q*Je_GkGQM@ zV@N^H@Y|0&TQ7X#*77d><^dTJ|$*W4dA-?U?e2Evv?$ zO>|>#*(i@;c;ojldui7v@j@3WVo=~*PKc5c8=Fjxl57x9CNkGznRHneiN#|OJ4P?X zaBN0)FEKhM3lMLu%O^~#2EUpqn?l4UCgq8=f&vpMTaau3|VF;o>c+8B{7huu-#KMeIF4EQX>(Urr z;-f631l<8RAryuZV9A0?MT0dJ}_u$LpeKb9Cnyvd6~c^f>y3EHP&L zps;osLXXWw0Xoxb;2j0SUS@1E$y%gbNME7yq^t39?8P(=>y@OW$04{Tm*@Ahv5Zfz$WN2NRy~2B}x+#Kq>=d(J2OXjZvusTkB!w znN;HH0}~e#$+VK5xB$YOm>_xtQZB?VOTdUkBtm3R9t&#ZdWEIZ3FR84L#KDdl*!Qx zdQnmwzVZ0A*f}XSF2xm6AFNk~twZHW_6e-p#vV9u>cm;5mD1dxT`fSE*9lJxSg6*I zaO}c_sTv?IZnbJ)f(`?0)?4>e512wf_**6qd<#X&vjkoSfN)1@rM03IY7rYhn@nG4 zYDG-3{x6Y?9lt_qsNtGB$h@i;ZJd92kpy^Ov2`YDoV#}lv}!$M#zlIe37rO^y6PK?@hjSQo3Q5uVrz6X=! zJS{_{`!@%XX(;veQHmKUL4dRvjZn&w80je!=O!`du$qjFbjj&-rfXz`Rt=~<&62Qk z=+lVMh0|c9f+n6$Rty`dKZf5fI%o|r^BOK!I!w)D2Q*V17Jk=E@b9S{;wymc02hhQ zUCoC(7jdZ4sbke&Uh*WxfmT8(L+kVKRI0_Tb0(+k1T{7fg|llN8F{s>7^&a*sRLhP zwum|&Z5xrX8kg5*rhKENFmCAH$fS@au1qAVc_$~Z0Z7p8G6MZJ!q(93`j~DPwM^M4 z(+K-H@+c1iFb!`_-TdZ-?w4Pfdtug9ti~}k@9!)IYrZ}B%HVvW5R9q8SUwmlnr3JE zDT6SYPNrqYAs#WUoAB@Me}UrbTTS0;)(=_j_8w$wX+taKvt>X$?Sa@TIL;MlXxKCD zb%cA&@G3{RxmHa3GNgMdKNdSZ?T1)wiy1Zy)QQpo2cgZ3Q5W|OiZN4Qx-w#E@|){qU`YZx|bNO05jei$_5HX3!>T_@I$abJ7( zd90+<4bzPoIz}iz7h{GmXImePFi>@ald7}z*#dmAT6iD~rkg>JmG#@_H$j(!k=> znZyZ^HVt7K#tS$rW->QZWk54Sf@)bE1F4?G!1O2`7k4KUmq-Y=Bne#xcPe#y$_fw? z2@KKJDTj+`paE4-Bm2jt%!U3D{X}{M0w+{3qOF9o8inCPSEA@>(Zy#{TafYuErL^plgK2m*-+8f7lT?yK|Wm- zCHD8n4)i@}5(iZ=GNKFgB&tF61!V)qjnUP}2;}^bGCOt}|72 zh>hZa#>qQR){(LdVMn4W_t^qt<-Nv!5m8CWZQ`>Os=mf`Y9T5HM(83S0^gq04=P#c~aSKX@)6Ww9sW(KtYM6$4&KGssVGcwaoAxX&WF4C@-Rhdo$bz z!SLM4+rhS5!M4ROFFv2c4Xa)?*qaab7VFw>*KN5~x1~_GO|9E@yRPq6UElKMLft;K zZr|+D6)R)Ty*NaFg%?$OYc!*A=Wq5VLIs3>dI5q7AC(|0~KT;QrINqPfxv zOilFDJIxI$()_0VMo){b3MIWB(~+`q)vB3UqP}93j~EzlsQF?3Xq+~bz2FnHK-rJo zUyG0*dhk(69KMneGZ(a=UYgF@8D%p@LB3A)(h8}!oi)3O3RtVljTEuE+gdG!8+5N@ zr-6c25rbAm!9a!Pz9e1K1ZH3<|Cp+0t0s{Ev3hGfk3FVupnh|ooQkeNiT@ELD0A4K z?v-z>eY}rr>RuL>GdHq@#zSi3q1kG>oe=n-zG-1_*1yuwyf8EyFq{or)D5`O*<9?} z{Axh;b=;|``}X)NJo#%@wsl{>yb`Hh z2)y~!@`jtqLfcWb?I_IMx@%zW)?EWzkxm^hi+bcPeJZR%H2r0 z8w1D~ATyi|=%L=U0Gig)w$%FS(YceeCqHOyTk8Gpj-?&5Pp-7=C`L9ETiTb}iVYpb zhUQ{ZPpR75TJs?X@DTyZ^Kpa=G|Ueb{4v!Z!?gl`6RryQn||1Nz4ymwuH#k~UVefL zUPeTP52iDLP9x{XHIA~}e%zG;fHijOkB?r5Ej3<#a+Eo10jn&e`#9hztIFT}ChT$G z{164ev4EA0g6lY3O$q^>Pw-FixB}saRXD&3Op;E%`QlPWt>4T-SN80E=j2Z^>Yiil z^#hnb2}WX;qXM9Bn|jo)LwR4vO6NAUvp?_KxYE|ObQ)JsR$^P!7%nKb7q>k0s#o=O z6*oUfZfCKz>s2q#(7JZNDiEdB)z4OyTpRrRiyJ$?pZH$lyO)+Ol{jB$2LrDK=H2tp ztaNlPO@03x-}}b$XrbdFwd0}rszvu}IGJmne*|~)8roOdHZGmaDT}8UPv2YFuo+uS z1NvxyVsqP~r{u=#y?gh7hHX1uKeBLgQF-n3{OMw}Bex-6_dq^a{@vNQ<@@8`8~<*4 zDGhv5GXV5v{9fv7*+e8(EIZAecpEJCJof4dHMq6dJwWc3;>Mk?o|rpb+E+44J#hMf|2KPG z9@*+L;-D(7kYlGq&v7Y_p(OKjE;^{jVW9qqLe>S@ zSICA$?~*H9MYr~*1M_^U7Im73LL7%Wi_M5Wz8@sd|Tk-n4yl93q(3 zU5?POQFbO~_;A(9emr3weXVT)m94Q3vYaC`9nOYlU}{dT=)S~wZP}HrnXYz>ZP;G3 zvjpYo3^AbP=OS^W?8(_ejWFj0t!&siqRux+0k#r8tz5CHGPmfXK1~OoBRa47Monsu z?q1>T2V5Ax&C@kmLE-<1qh2Fd@UxAkS+370*Px|!+HJd@W#Pj~BcNV*lf;Qj=W*eWSta(3L(e;6s=J{fH5I3}HrSM- zO#iK$4=EG~I-DXkE!j%q+|yO3?ibD5cqzpxCoy3uxxmLrr@loD5jjj}~SfrBRJB zvRi|;95;21aq5dbot8Ij82Czh^ldf!enZiVXo;qFg^v4vydSL0G{+7ZP2>glwRSp%?WCn{Q z8TRT|OD|CrnR2qOYdpS@A+c++ma2|@1cz|#d~{8YSEtjdh)s>dHq)>1(BXUnTtj2{ z6`reap7j+&wcmc>l^1ebme0H^%)U?v4XB}k61T&@@4epQhK|{%io5sE4i=kRaCGy?abkBV7wIIrd93Bqg?vMdiHf&rv^xc7_fqCCbOY2hO5BckXAMd)c z|F3rcg#UNK&3<+JfEs)Bz1qKSEVMkKwmdQKy%TMjA1JnOoIe5I;upVjaQyI}Tn)=kHJ}6IWJ653FI(fT(^R4>LKRmPC_=B%r|7xLrms-CoU%$&1mpfai z?^Wx2^Yy)Yv29&?2X%-Z-uoch24zR6*8;_+Z9q_MYq7qi*w#MpXTa8(d7tq|`AgNv z3>PYr+ImCNU5Iq4k*<8C3(|k?@KXEjmYug+b{1N8sV%$ay~SwL0x7;~_Z8ba=TD%w z?c0|5rLWy?-+ilnccFc++P;^9?|oeTdoD9yzt{Ygp5sAXjKmoDkcjOg0#?{sKI-!t zsXl(5=OT^hTCt^r{k9YvJLm`fOxPEJ8V}$j0#Nt(1Ij-Ua{rZl3%eH~D>aN7`KPx4NDPxZZCIoahza-+Hv>_`|}__Xr63`NJUu z{leRNVvF#L7=`>|i$Ed0Zt_2HxE*EuP2ljx!EWJ~-BjQ&_j?8pR{e5-2h@B}VowZ% zDRrDSc+tR3_;>f;Vz#a}mbFfjoe~X9P)U7Xeyp3ES^h?)Jnps|-`aEp6-RYEZqM02 z$zgpa!T!mOY{lhi-GFPI8Y;99bS6C0jap2p8uB{nPS}Hzfq}R2Pk-<&V%SVOB_~Lg z9+ELA#*|F-RAxSuNgD@yD)k_&1zSIR3$CoL-%a&jF>5zk(c_N)J({qNG0-TMd)!I_ zn@cp1mhmm$vUHM$&wc?zH`~zp82xe)4EJ#T&JT78|w%@(qdN?0wWJpPR`2MdhrPaH=28@r&|6i5Siws*i5Z1x znX1XFm7jeKyzN(vQpo=@N}-LP`^d3-;y_e_g0!V(r(vcfnt60{IPkQ z3?P&i`zkIHLm~G*7PwIOvlhKxxsFm%xmg-Tp}e9J^_ahK?|o&(U;)b zEAFAoGf1Id9cTRJH}R@fJq^QeE*cd2!S{OVv#l98R^AIm_td7lVuF5tWhkZRo@rlnF~+BLQno56t55QS1RvO%JA8d`dGzM4clzHQedp19-w}25QMCp1 zh6H!~fw`9X-DqPVw|gm^k8V@_-6g@u&kE5&9p{ax!bWuJz#-~%IFGBIYsLNj#}|(*om}Q` z1a3a`PQThckZ&7M>mOD9kCm#e+VwWj#rh6vqKn0x^KfY9{)5!mPB2FsO5stS?%)%= z6KX99?A6Pm=@%Dkmzr|XT>SdQo6+m(eCJ-ZWuIEJzf{H2pkcM^bIvhX@C5Gh5Omo-ywY#E+J|7ZyAJchAr6R?5+KtjRL?Yh2y zdG}4%JJtE^2h~l7)aFN63L4$k`J;0kCBaC~GFg~%1nVhN0*mj9_L?#Fa5?2WG#3k5NE-FcHtlbOM6^1mL+Z z9Ea7!@uN=;o_d_*Oj%<0{B)~||4Dgiosil5eq7H2)sFc|Mg0?RY%!p{#I_RS%TFLW8t~PJ{ikyFj{nzM&pUrbE}D1#id=Wz`Mcxxyab_!=evrY&b;$i z@^2ugUsA&u-K)x_I^kaA6cR=E&OcLl*wgIK6hu*!C`;7SEs56qWy_LjTaxXzx;rF9fD&ZBd;!W5 zO-{?b&NSSsIZb=jF?(8`;m+C~`Pj43OuQMLot|CybWg@-&-?-CAQ6H@iDnZgGiP&h zsK}jhoSdEfepUAgfU>%GdbdwDmtftxx9ZlrzWQGE)$iBU)hM|BGWnmy@BBkW`Jecp zU)7rD{uP&^ysgBQxMNH?E$@!g4)N?f?ZVwT<{o#Sb~_m68uN^MPFD%P8~*Ck)$n`b zRb$?9-)W!lSHoX(x<>fD@YkNM6@K5Cf4uH=o$%L;)sF{G2ZX;C{^04LLrJ*KH|WJv zn?wm3Plu4Ye=Iy6IUNzP>)>xX-6Z_=W6k3&r&}C~Q+Zs82VPg=!S|ht@*)1^b-GoA zG$5og(fU4W`XT4Tur(rV1H$^t!q$qgjR@OR7S<=iHY03H zqOGL<>*CwvTQP1P(dz~OdfnfudzARLhlulNqII+?{gy)BSkY zS@Lcp-gTF}+k|&LCGR%lU2n;|EqJ%4nM+6TCH<+`XksKbHU@w7!O01&3_c@1zOO$x zIX*Rpl1@$>MNT6|tHI;b9_~+JR=%wy6vCF%&gTGc09~A?-3ib6D*b~*wb^G0Z``#D z0dej6dp( z*SzjN9rU4U@s4<{HC~)~8~MfS%&+40wvd1&g!!5|dE-Hhz=pU#UKeMGky^r1`cZeh z0cB|X%27b@4bSfR27!mDZw9PBY^ttHp@ZjV`Vt804p(fJP>V!yvZJ`JD zqXfxR6u;OQ;7a_GSB>}JrJ&T^0noM6Ry4m%E#c*Qc!iAVRG?q-Ihf-5xNh}>| zu}b#b2v-gLB0}K8|NShSx0SRdY*u+6Pahg@&Ktf(1Hsah;XUrK$B$cp=A2{JvCLPl z2Yr>+(Nv^Ai>1Jh-l^VM<-CE?%sD5VvyM6Z&pP9tYfeo6s+s@g@ff;V#o!*DRL5gn zqR?j;3?q}%V;Gi+=yWPEIz1LeF#0t;IXMO+FC_b0M1k{G~SaRg0er>hvPfrdp`=NMpBt0yKvKj+OL3EBn42`5Jr!`YKc>E~G z{`3eY8AhW~g8u#}zd`w9@pvLWFc96*zsU$yLueqC-BPSGR%QY{wF&R~oW&Y3EQdJ6 zkfH&zq;Op3XGZ-$F<10XR9y)VJDBL((9ley*?RiBV~oER&ShoEulO6XwH>JP+q>S{wdh%# zzCMx*ZOMnWWc^!~T#COFq3S9`90Q2@B`%or>q?7m12f^g=&e{YDvyS%sN?KpF;HeEYD@} z_ppUdKRw0akJh>r9Z#M;mySw^83o?0#%wSoc4l&#%lCLPm9hc~Q6r+!51hJNEK_$- z-GG9s{cvp642k;4*I1coyq?cydOOBWq9S0~y{6@ec zxvW)MY>mZzViK?uErc~aIcmTk0y1q)Oc`rjbS+l~3Y9UI zcWtrP7Jg%iXX;o}^i>{1COU$~jU`Qd3E*y8EFCH0dn4yWjVdnw_*yLbMiGxnd_y)g zPzUw}a?_weBEDYqjJ^ns#*$;hQGvk4j3h9@M${yR`33Zh98{Jr8ITiFWH2BwN|~35 z`$+tV&_#p2}Ba~4QK})k+cjLZA9uJ#Qs5Eu%9K#upW4A5@UQk5u4CvC|-cH!g>!%gqUe+ zy-_Y?JV8oF6ol9`pl(u-Czg+pMe^*#q?(BLN25=3(!P>Rfp*fqGZM3XuNRO*a$3N5 zMrSz_z_LNAfNhb&Tw)6(Cq~Amfnu3Mqeu+OBhpZt(QW$Dv<-e6%x)BMz-bZKw-|jh z9p=a>552$?R=~j^3MvhudGGw0+kq9g0xK5X`RLAEU?3kD$a)9l(5lv#ftqyx;G|q( zE8`f%14^)Y$E<7C`H{npReZ;RwR+nVi7}vs=p+!YqEQGsG{`}^5EV(rHTbRrjXtM9 zHYD0XHglhbjBuDQi;TFL@=U$iBz(S%FH$7nfxgu%f%b*%*IhRr&DQVC)$h#L@6394 z%IepkXC$L3p^{N-t9r=-cNWMJ7P$WruVp)7&WJ%gX)am=fO zPozSAhB@>f2Fk06m%$hzy=19gSrTR|4Uoe!ozSM6R&Y*d4fu;GX({|ykUm78^ufn* zF9+Xl`0RkZSa0j$#7v7h4DBIr@LLVEcPYWfj86=}KIhkpM&_`>f~!P%gTF z0tpCH^y;W+(R~PHW6`yL;*#2ph$>m#>P9+S=x}u^dQY+oz`Id*@*UZkMfY*QY;`Z6 z1%kPXzLj(Ytw=}Ea?b#_zHIqhat1u!C52A6()-BejZ|u&x*Ws6QuPbzR zT|S)Id}UyMXZyKAXRsja_!^zzZyjslkL+?{o|EUdh?Zt>Z7Pv3C8JCtvG zH0$1lU(UU2$sO|SScqL4T|9YxTFWh^%qw6E%~ZFTbC3#cLTvI z(@P#cRw==TD>Dm^H}9!FZl9x-SUGPrKa{uWT{sFSfn7GMu+Dq$71`E z!uySekK1k@{CI_Ys^C_6JpSv5jN8qIAGdvS@W+UYhf=4$$rC9=nyx;#Mi^sdZ8kEh0cuR`i+2r*+ws>+$!R`99ADzDG`e;Zzlsau@ z;|#D?19uz3Y?^`6rWq)0nt>%WO%oeNeki_{PGi8+SO|42xp-f_N#6JD7k3u9DI1LD zeJhtd2OI6$rSneq{ z9t7+ZEH7i;o>IvIwlTCwDKek?U2yD6pgrC1I8+k85MP7_C(}oDmTV$^SXC$04;+H} zOmSI}gtVBZGcDzX=ohTF-$BF_iT=yVXZ0&{^{evrtFqozq9q3Vss+?g_aR)}Pe%X; zFIELCyy;8o<9tUrP&!wi<~uq+!hdQH9CNOMQonrsuBUFv>G1T-r#NnVOy{0Usj7ed z>mty6D|?0s+Iq%|7rgG@h4Woo-#~KaW)Ls<$;J@ZS%>w>Dj|uZ7a^f=g9~4UUUi)} zn0N{Aa^H+PGs>tV?s?sR+83{~#)?zS!IZ0LtNn3C_{`ZF7j!_ z(CTx^UMHAUNt**_it2tF-UuE|aw3@qkEY31uzvmhyZ9`{bS^7}aLd)FGVUurczDa; zPxPv78gL4TY4A;We&Be}L|8QHfvCo1pDf_tD(8(F&VqvB8Y8#}&Ouo>7ck^$jApq? zvAQ3)M0JZkgZo+Zf$_xEaA+vS(nX_}<&xBmhnY5e-L0Iz>j+PgHv8hTawpvS=Hpi% zza3tCE4(%rUY8HA%lHZ%(Q8LDzWLsqx3v&x$$DGlNbkWn5+MlCC-8$Z)?5{WL}UGL z@VpJV-tvsOQnGB7k~W$}QF;{hgahBFjj_i@vVSw@nCQh<%u~DYRjUK>7L9qPhwvVE z#GQ7w_nhNJWy1Z6a?$mo@(Ma;(UP0_WhEw}LwQlK5%q6Ba1G9QrqiPvb`-1C#MBsw zvc4+Ooy8h~qX}53K7mw={^ur=kS!;~t726=!3TkAsO%U!t|f`)h`mEK!ubyv`-gBq z^Hh0#ePlT9d~4^zbGgu}d}vkHzv_!Sfz~CZ%GYOcoUXc^cUsyP4*#&`TFty?-t)zs z5Etyaou*T0>HJ;)Z~GTtxSq_l?8vw5V7z(Hk_)lE_~HvJi**g(Kl;6+^NEG$77yn9 zYxDlKS<7#!4tXMCY9mVbop7`AcFq2+uHOr6asHtLomQnlN?vcYE@sP^CTU%shlcD=@V#Noi;m0NQew!2@*U8PS1UEnmo^_ zbp8qcQ~wGM=7avX^K9UyxUxl;=mzH zO@g@FvQBtxAyt-;YHJEuC%jlEsbDBLV;0z}}mlJKFcrfd!qf*}e+GP3{NJ%GEfDr3kDBD_4lC9*>4;E{m z8+_)((+3ZqJbCz#EWt@8#@G_$q38fmLB+DvS+NXy@K5<27kR8sfsV|a=*qzlYD#BB z6QZaG>4?c-4175mCKymcswDZ2&Y$2vH3LT9dSSK3c{j9<}iZ zAIG=Vsd0EZ7giBX>Ri^51C)jNH5{OUlR{o@pfu`vl=BxDn#L0No9KT#wlM3kE^+py zNc|n_QujXcG!geXHx^RIA_sigHR~>06koxjs84pp$D#;kXu8(?v?O)UtY_B!l1N?M z{eYZ2WjXCC%SkT36-&Cz^4q2_q07~9neWVH8XV$J1O#o;ZMrdDku_g&Fx>U_5 zdd^$|^Hk+rQ{!|v6je5xm_t~+qxARCSxu)GPSFL{K(T5xMHR3VdzwslO`IlI>gJN+ zqk|VNF{!_T1J)eGqfPUPcb?1DuFBV9uGINj?=<%08hi7Ny_thc&YHU2`T~41*V317 z=`)vUZ{2QCubOkGbyKc&OTKl>d{rUTx^VKX-SfMboUX`zM)4g=*foC` z7(fHcz~DwD+?qLlC(tRvX0qPa)K=8;y~tzApL8AA==w=pWdA1TPc}N}-xNI% z^88uQ3ICrpI_M9z(%;X}hk>+JCr_O?I{0`+AgdDW&9s!ZzYbdOumg0^+MKy4L9056 z*QK!XWxk{H7yPCotZeYKX=^uq7Ffwg3#`PW1}ouPQtVEz!_y*RWeZ_tMMuI)7KQ`V zxO|%Lem|g$oy?TVfbpjIvI>E550(7l)lky(LLH1`qQ@i*6V-S!poNtj)ksSpNK1db zCSHs0szILmvAow=p6l>jFVysmRN^&O)x5Yx0WTh~g#;}q1xsb50F;7?dO?w=Gfs89 z1}L!wMZTd#wWvd*-ahfLnGU|B`dmm5tzjS`&BdyN=O&XQiP#=c927>5h({?|)0oA& zUoN{y{!ZT(UVfFHVWCb=!)?e+Dxkg#J(x3IKn7+fAo-4 zx)YKEXccMtZN)12H=ujXU0`?k3tj6o?!31>D}Dmb z*g!DT6s4Sk=U2w~P|hOm&)4ZN2`o>6J_n|PWd>+-!jGrnwNch0-Y$^#LI0NEcl-j>l&Dnh8Y zvxs~7wY*H4nsz2nNNvEA(I|1}OM)$;R>dK8{E-rOzvF@ilSlZg=mDzE`zoo11a1ukrOcM4O`n z97Dhuh03J*U6e%*>wfsGj7uScnrX8(tz9F@i>jokk%R#p2xc4B=K>q@fep6<+inH6 z-F)F+e)FGy^V6QcT%X(hLVouP*}%43;OqIo*R$TQiw2Z-a~`D^;Mv1V@4nbU>W_o77j~wa$Sr zYj#nwmtyQaGu_%$(6}@GyT%}DA4~1&H{*mjCEAe4WhL8sNdB%rztFqbYdlKmVTA&O z9-^2B;Nhw!3flfnjQu&NJYx*wefd>7hG(6qREJh6D3XRNVKP{^=8;sfjtEX7J|qD| z(W_%nf~HKd;jngVOW2!udYH;Lv+@+pV?_fGrmNm`{wn;){8NiNplI3V@Q;?SZ^CqDfN5!LJ+rT%weNJ`|x(A-ae6P*?7m` zaNN`@Eu9&EK}?<->5peIZ*r}N@~ww5^>=IQGkX_O`4!uzEUx@9xIkw>KWVweetX`QGTlqu1MSzLXiw)jyf9f3o0jDEI^S0$yLu=L#HfV60B%StQm}YL*Zsv~LG7 zS4}&V272cdC>^9p)w18#e(C4~ymV9LN{+0P>}zzOE=?C~4-?&&eCEyUX6o0Fk=*}I zcp-jmEZ6!-zV(r8pkMoW`$fT3LXmPcFgMgzo6c!$EZgW)6b$&rPG*Hrv3k#Iv9~|H3+9{ zo!^R=_m9B&f#aCszyQZu-!670;a&OlhSNUG|MTWq$MeeD4u^83!z6GW#TwD>DYp9u za;YdfM#S*c77DpWe(BrAjYSuy)IBq6HRxtnJF{R5ddx$d5Zh3;FaBEjYs`vl)06lu zJbRk!?C5TBiArn*Xr%B9LvwNY-C@8*#3O@PEG-4pFVM94B>i4yW=4C|>)Rc++{M-i9M;xB^>E z04G}&fhrOpN>s7$tHyv4^(d>l3Mpdo%LcZ}-(qaOe!hO;Ww{asYgk~aSdC3|;48*u?Wz$I3-@p|x=->lsBbtE zsaUmbtOk*&FSv*|DLyDRQ@Pjpeb&_a&MGSjez!J|ukBh=+`f~Jf*AR7crQMJd#>rp zeAAPe$1{)LZC!P{weMDIpIj<3PZlhF%(y3VO(*hAClFI_J+#+#Y~$LR3vA8fop-Bj zH^-^INU6}07`NEVzGh7adfOhWOnozRY? z&mw-{qec9HM@{?y-;!c?jyoKljZ*%wk(pSXs)%QsP+sJn%8R^Hc@cM}Xeck@c}e+7 zM+^$lBO~Y$6Wjd_QW=}>AvHldReJdo^_G0A;*@&?O1@#fM*O(Xj4$LPW{A~{L8;s$ zh;%9UpehArAPqv2(FhzSRP-Lg_WDyWY!N#KWQ~k`{e_ffXyh}r=MhgAIRK%72x6G8 zXcNQG$Jg*0rXm?u#s_lm3AbGvk`VeQCq|QJr-cAQ=-?as5|KRB@CC~rKzbZ|Vb)Ge zPHbRyGbEy7uOP9$=+To;M|XT}(`GF{T_EuSx35Un|0Rkf*6Ed6r$<~Lz4Ty#33eb; zWFnR4OJpV3;$oMRtbcepNlC-7Neq1!ZI{-t(X#!3_t+tZCLT7oBWR5>krJBbX~=ry z79sBHc|gMpxs)LXfqH@vyoWceR?4hGx4)$=POh_18wRN$JhUUsIQv=cc<$@_O!0fFfioi;VVxT-CH>`5D zOO7o>yQB-iAa4?tvI$)(emgw8X7!63R*!F39bdyXwmhF&{lviPrv_G^WWZN_9JNH2 zLq;X-Ggz$Fs%&HU6ESA+{SG+fmrl9Pf;jp;n;b{*$ee?Ht{Jah#F+-&XB5tSWfTFN z<3B{Yx{53PRxX)XC}$e<8DR)`h@@+Ke<0w=Hh(?at^FwM$>2`{;W9mM)VJv|>T7g<6An7@yY!1%mht?BI3;XU(jriKiFI6w zFG;?ypWpiSj<+eR9oQ_tX0mnIpdN-+{9y})dX;i0s8X$W1a zElxuO9W$LqJ5&muV1w*JDnNLhE?>)?PSel z&TpIF24xms3$;=GNI+_%u6DiaSnXOyi`j>0Vn|#-u67C2168;{)SM&_p723jhm>!1 zk?pZ)?G-(c{Pq$v9CJ{`dJU3>5vKzj_A4tOO0@KX@u5wbE6qx2mo;yDkJ<;UkS>to zD7(@P<}2<#uu2Ol>v||Tp#PAK#s($`ZOzO` zK)Dt#`a)kpnF?alBu`&t)=$zYp-jaX5yQizOh*~-EF3F6Dhf~MI1BY89IRdX-;%SD z^eCORPz)qJYLb0|BHjGaz>SfQ_U5CHRiFhWjac=ItDieS?+Q|L1F2Cwl{!^!PYX8{ zlA>)PHHzCO4cK}2M1DVLVmy^P{)j=B(r2Md`Dmd_@u<%YOo9rPLH2SsD`HT0f@n4- zR2X`^$|8K_S1IRBEcV8dCG>?4U=xi}Su}68BUPquVKl5YR{(ws-~Xc$RHM=YU`I6i zAPiY!f^|(wC-n2Mm;P0)xwuCh;M^%%tXOM#3sv5Kf$|8S)u0Jq1CrSs}~cw5adzov;OrGBdPX5Hmf@Ye~|lT z?gSgMjgRGmyYj(Zw}S_71rHY5R$M>z(Tfz?9&+4MoDGei(*a~|XetCl_iC#spn`*) zJmroH=@Y>TqCf({+3(%I%Jq|O2i(EFvh4#05luY=r|9PP3-t(}1#lCfPe8K`e7B0u zN;-e4JKtx;U&fOTzj!Z%!dC~l{Usk-optk19lLe?FYeruj3)-5gYDQ;y8F;@e#8uf}@o)`i+Wz+EK^#o%pb~Bd z_3SN#n#8Roid$VlyG7dYRFlD<7@0OHnE{ReDN_1-A*z?L`Ulu*Hl9WHYK6J*8(jrI z%O)<^FaZwxA@NvoaqA?81@@u-D?ImkO)|Y$H9bWtZP{K}j)dQmx`^y@xH1kj%s3KF1p9H3VCKv5l)n ze;vR;W`BVXpo}SV?zGXmN{I?w<@J%obg9KTkad<`iYwEO$yH7gipD@!t7k16@FuG8 zWcHZtYdcv-LeA_@OUed#5-Iy+|0;?|*#IJ(Z06S`DOV%R;C-t{W~ni06OWR1em z!?DPfM`)7vjxXyg8c|kg-@r zBoe?{P^$*g1G6d8cG;Q4kj%!XM)9o$*X-qEmJTK6#i}uw3B;mMbr$#7MY)-lV~Pk9 zugey!sikbjYgFu?aIz1=!DI(o<7>$T`1e^|;~OtrdExs*-y6bS;=|Xs=IS=)>o#Vb zh359F7Z=mn=0_lUYiTL?cP?zZwma+JnR(*MvCOgS=RSI=P~*?UubjK*ac*t_y0p0^ zQ-zdUI)0h&yox_~1x7qPzI~2DAOfPJZZC@P_N#Bby14D#9oL_|;r_TT*Ssg+yeAvn zb63VdR7;c-H^Lux=9>5BoA+jed+*jZ2)u9pd2zF1emio(o%!I-+rfReg8K?>9gBx< z_w2aUvm@6tkne$w6QyDQL*Rfx)1VHvvrSG<#EY(YQvI?ao#;O{emeg$ISn8Bq_`%iJdFJv*oT3$aTb!5?ff9BZUkc#%F0wtwxT9 zXcVP@eJ2=zEZ39~<&=i!gg2&Ml4(n}J5$hv4M=1lx|#b$Hf%;VPz{Bh9|(h(osj_x zGCp}hlk-@nbY|;b8U5+C#!nB4s)TxC0N2(j^Wamv1i7)XE*d` z1*{`vGf_Xhjp9YoIXMNbNjk9oQqnE|4I<1$%e%!6`2J`1&+j1WWd#ZnS9WA;+rc%v zR+nwqI3Jo1UEh{DPzbG_SF@qj06jZ!%oq#jMQ+ zHZL56gWuvRI_Y;W%EzpCb2)ZN+(3+(3-D0;%IpvHk^?>ML{Gb{xJ#K0YGb5uPYG5( zqxX@daoJZt^f1O<-182!xv|2{cqK4^3d`5FI$YstfRRnj(>cu~z4UM1ALvS3!RT@0OJ1oTg3~vXWXS^jXMxK3d3mJZj`Td`rr5&K@YjEF2a(Fxj<_ ziTfu|Cc)cJ<=Zm#7{6!BBKVNFl{y_x&yx-^4S9cfSF#k?DAG!xI_QLQ$#^Zod2!xziEJo+Xk*;}7MIY*!{|YgaE`@Ty?8j0c#2N#lvTxv51k zUC79gW<(^z)QeU)L3BArz;#$!EVy%0BF+~wuA~}@o36n6J3dE7&bPeO5@0h zxIj|`K7(zv=7v&%3#W!Plm(c>@Gy|xVXRfI0xL(u-hbimlHy_KLQowNW5rT2`iA zNtmTa2bCJt-%msPA|G1=&_JhXS-l0Ihyn}xU^74wh`8KLoi>qVC#ohY_TOO?34E-a z5zfi$;vfsd!Q$uwu}HZr2y?0gLdkS3ZgTMd5AcKC8wVJ&dLE_BLQEl1bodB@HG?W zRdi&_GA&!n>THVp^9Zr>sP(g(bWSx+LTZ3K$)Yr9J;|v={m^p86D=))#|s5U{MW#0 zpkMHZYhSN}c?UntBh>NCABMqX15ZYBpRN&n;98(^jl~+#(h|7#q7h8sYKN_&$Nqol z3eY5g`L7zf+Rh3v4NN3QqY3PhNT>oxn&3GF%?OodDu#zi{toMF*{=*d*9r_-0_VXa z%QJ@sL?FhaU&LAjjQ$QhzYKd^vRNTJ@Kj)86XLto(5y!dShp#``X3i>oK*gES!F^z+J#%1%V%dN-_*0vGzj-2{b6loCsr3Qnh z3G?$BSU%6TKc1_9B47VR*87C4#$Pixe<^N!0BtkAVmdE%{&%oA@UohQ7K&=X!s=?SkS^@JDM zvO||~yQ)1$9i+T?7o-%t*}T;3`(Kg;9%VWm!SV-9HN&X;pJ?ERa_8!Q(}KriAbZ*qec3Za{P~&ql1niheOP*%u}|!F}NAr;k5? zpU`BlzRpmHq5k)EhC(EBLF6}B(L~z6MSd!s<7_k1RVJ|_cm+%DprH#!pM_h*M+>(I zj~cfKz9q%(^f)|C66bCLg!fc*B=})rehtA-!*kCaJtV*n=~|)*Mfdb{GHw~GUj={I zx1y72_@J_68t9PQ>wUa2;nAD}dSmX&P^lcom05q>CG^HP;mR(n zL6lNNY>{KG>;gkb@m+>sQX*XdRBhN0Xndy#I*tjJZ+?o$=y&W956&wI3JUEaGKAsOg{%Iup%t^o+ z>XpF(&RFiakRbKS8d2as4DYW}ep0pHdBE@bvswq-hX6$?&KG}>-fmlYL+Q}y5?V@a z;ODE5du1>bVlbUVB`_qc+6D|AH2N%Hh>sR9ghvew!N>C$tWNhsgCQ2i28ImMpPLCP zk^WX<|GY61PJ1mZ0UW`b@PWLqF*Pz0*1d$jWkYIgA^ujhq`aVz=Eo7hZYZ_YL8+|{ zOoAHAq0LOu(3Gg4)K(A0vmh7>mRLx^kDZfbExtxR4-aq9Y$LC#v>v0XGSatD`anCXex-4*P{kISZ@RF zNE9sw?litbL&vmjqRA2Px8-LVPx=(PV0aA2ufsazSd0fMO{CSyF`RiO&;Ap&(JXG7 z&6^yDp{67>-O!;Z*fbdLS{HHWjHnTX>jR!E3Nq~~zYwm4jUZOU%FdT;wOvnLn z>YzA=3QY~KNC`+R&Wgw2F^*ppqpni3Vn3s-fH+Z+hqLuZ#nxChCP$|{jZoAC5tAsh zWq4rsr6?iJlcFI~Iec(B8?2P#oE0rD#2`GO8>$-SAzH%pC#4*y7{v1!(qwy(NXOy6 zVh1VPK~xtFFb<2TNDN)W!+*u$%Ubbd!4fVqsl{HI{>v@I-Ow=X$NtEW=E%BDAH(wJC|wX6|yO6)GMDCPo{k!dV<2&VA4r zLJ5vE?2ncsTxztWAc;V8j$s3>=t5&CXtrR`WMU$VZ$y)!xu}YQ_QElsng9iZNLovc z(tepxi6Ineu}TWjjuhRTk43LOiHcQ_Uc!Pb3=d&g7pr8W z{`*$@1=`ig6`qK%x`IxW&Pq7C+V67VmDPUhj-c`eZ|z4!8Xmz40$ePpL|UQF>(iBc zn>z4RtDOu}kWa+a%4smHDH1*Z9z4GcFS8T{2kQU@E5D%T;nLs2&wRxN4k+S(XnbR+ z@j~6gXdX1BU{`kI6ZJ3Y7(vVF?ly?Vvg+%8fIL!<;bZW*9;~kmdsE39Js)p?7H-bF zFYn!#_3pD;Qtd$^mG@LXfe^b&%WG6c#anq%k{5SqMp2;>1r9D1k}xFXC72^_yhTW# z2TDa7juaiQoTBOp#|~?)tD&$ERyCAj1Mq^$u?vYI4tk!meHOt|%;r*yrEohROX}mMP2`Y*;D5)G33G@Z z=w7>Cdlq`pYnLlkni6B}n)R62wY`M)CxpH``fZh>K9b>O$fI-=u4 zlM|5K10gSl#0{r{0jC>F!WW+OPHA2}iCTx)biekrFTobqSUcH{1;Wxc$>pfBB6imow4? zu~DQ6ECBdCo_1_IgEQ~I9*S`D{9dU1+zzk46<)m<%lAH(3-8K@cV)x7?l!l~dq3;y zD+D9+>8qC(d*0mu-RJgCPW_B&u7K4?I7o9v{Tokb_Ge~sOhho0`F4Q^O}QF&8mYc_ z?)u9gy^`zQp6}hB3-8E>cVxxyuAXhh2zNu_%oEsLM{Xb*%Ia#2k8IQKce<}Vg1vZc z>+@~v@rWM}rfnPi8Cq!14HkGO=Sk03*e2{?5unUCO)rcf$R%uKjy) z`&n1b;We(Gt=)FG+x6$&9{9h?j^a9`Be-|MhTd=9%0+K*Bov_ZPv;V|ACvY_Tx|IDV%(jKZ#J1Zc zyvzAb6Cjx1E#)TL?gqPHgl^_WRW`U?8tcslc4WOf1ip#Tk?Vx+4uW5NP=2pZg zy4jP(YPz6p#5uSs@hSmBg>q}DR_if_cGD5CwvWE2=qzt!4M+Wm zUfs9^9oJ5L($ILdW?}2q05x4Zq3Md#YtJu)^YvX+cG;LB z$X9zJi!Z-BO-X3v29&;VD|H&zc#b(Vtytl;a2Un2g~iBcjmJpul2YcLaMXKt3cG8( z)9xDYw7Z5oKQ-*G;h8qRVn33S|zjQF0|9tCO=a5#XF#? zM4M<{yZRBHYw_<-_{h;48|IX*kJoe)z?Yz`pD4{tTGWzFsagrsP8E< z7AkO1ME*ioRve>__8=z;=j^a>!^5W_SvHNSX?f{edW>{LHiBtMCM394(<<^)^_o-B zHpS+m@wL=T$*CzCI)^HS4y zK(Hgl7NwYA`0%AHC&vQXoBW%S;t^FY`&fVZRUaoVCPt>qKIhpv`und+K_`Z}ybR!| zc^sc(_Gau1DClYM(x}|4#f1No(Ko3}OPKPS7q<~G#7E20lt0je5AD*z{$P4FuC_`1o6IcO5hTw75izh3C z2Bnaf+6l%9a6NgYnyj|LN;UkDhEXRH{?;!=I!3A`>6GYbmZoFNvs68xBu|{tqwYjL zMV|qV)yMGMSF7&DP2ERlKb?bgVDtvtWau2CbC?bZ0rd(U>XO5dN|gSRuf>NV3G>4v zdSYV#CkK+eB=!FyQkkja3^I7pVRU=y9lRIhL35|zKDTz`R`nW+6=Ph}B-K5Ng=T1xOLhlcK*L;~nSB_@zSEy^a@-1o%bYpunBE!Qt zkNmLyTD>0Uv(k?wK3S&V&*8#hd;g!q`47PY$M7--_d{^^z%s}1|InBMCd<5P`QGJ- z=<}7b(U%zmpCvq6S$h1z;HmWz`;&&(;f!5^xIhPZoCk^_c=TztoJF~9#V2n5l3Ej{%qczC(%j0rukThjkEoXZQ zA4p=Eq_nz?P8#pX2^7+?gt`NdHn~CL$YcW2=pg~z0sA2vo@o|cTpqBS9eoxln397( zXuEOXru)afT;G9w-vNpe0--CH-ob|875LqWG++J3V&j`bSBK`E^Ugv;+9ZlpbbWSuyN=6yQU> z7>b?U&7+cSd73L(i6M}=>WO)<#i`k(U9fWc4*&=hlL$;<1O75+WtF5h;(Sr8a+M9F zSOo#`l2vQ5UeDipM=11knLe`gnp^^@Y-kAuVH(%ePw$%Y~#Za zjs8;Y;rn%OkB3_|Am*tV>~r4dqPjs{O;m$x=*+5D$;q38onmsS;N|gj2G>DQqcnBN zxu>?_E2ukH_yBwr$+zk^5?o`XIJbs;mzc?<>xYG^%88Hxr<1l1j-`{r{WHA}NXw*q z`};a16((?HQcqH70sew&Vqbg2dyS+ny1|l3t6SJs0`-21zFlkyL8tu|eQcPbC!I{g zK34U~p`#~H9Dcl5or3i$C^-p|Prg2M^n{@Opx-2pJ}A0R3_X2JP=ZDG3-pp6EV{oA z?=n(fV$-nqkP@6G^%+KYf)h%#LnHa3lIEjGWyY@|g@UK^1Tn!M!J))gsSjnGcVP>r zKil}^;;DCsaJ$)f^VRImCo|P|1CY}0^)&)7%m<>N=jwLji-r|ExM;rqGl3vB|9;2s zbzDD_Te&&Ea`Ww#J8!MrnOpf-e&u7i$gX^3*SvGdU0c^kgz<%i6K{Uw>Nki?esL!R z^SZt|Sn1Fmn%#O8BGrcNh4vM<+qc|m-*RJ1uKjEI_OE5b+7E{K-uAuagJe0|qzQ#@ zhY#KgA1rjPy!PVn4*m8}uCqVi+5e}FKW_izx!lfU`JKnGMKK~Qn`**lR3Op@K`<bl1F;_r^#*z)l}u6IwqSH7~AfQO(@|88?zwbr>!4|$UCv!gW?u*ye zf41f0?YY&DgE+1Hz^{x{q zYW$=#ynl=GlP$dm_qzV9ZGSgzKi%ViYl?wwYFh?DJ%~AP7x@E|GN~l+=1v$@3Bpim2_ie&&}{(Y$hkf60{1PIX$S?vZNRcEawp-~H&4-KO5BV9a1 z82BHB?truqM|Pt+00;K34DA8QVTE5@sB35fhRK4ndwh@Gwy<>WZ=#QAI$|H%?BUN2ELZ{eogQQ z`g})DojP*r$dP3g48)R54ysDlv{Wl#87yiAKj9Jj0^ff9_s?rT!FNOFj%s?X- zk(G1?YAP7o!n-A9Ij6$PeNhxzrIfEYTTkTkK@lMSH-l=(jyG`=|&r8^)`4x_2JFyE#Fb0fEXUE*{MM$aU z0qkm7_Hz~qW0br@K2n+%b7t)+Z^TS%QHg!|vk@_C^T z;XWM_yO+Ws5duZeDV}8(YsO?a1v#K5!h=BcTG%qZe~Z0xK$%DoiYrUk36E;;WTk5DhAwZKm9zi3P?w3F{Q3f?J zIxsAblH0(Hbn&8SJgqRP#2BodqHYjK%VXGLnz&V-L5H)_uT%k@R(T5r$wzhDkzQGiJ=a<~yeqPfWSd}KQWY|9vZXETeYo`UD^ zLkuQ5%YreMbsG$QlJpg3+gpV?J#XWr>+!cIV5u^j&j)g z?e~$&Os8xza(gWOrJt1jr))jurX7^szBAjt^SX24z_rKWDf!6```3t#q4Hha#QaiE z!k1zjXv_~XWM*p2Z2yFLY{E-e-VN-M=iAAYfw7*4FW0^^4>z?9zVTT_QhQ z1F=^`&#Z%|o49&UprGLpn2SuSj3pCDeyE^d3 zx37FV>+O<_z$W`j5gV}>QQCgA&Uc;PbvMD4@Js<71dGE1uYw;c){r@={{$8$l=)N~r3#bdP#vRsmWU&is^+4vV9gb_ z$@^y>`-Q&+8l!#O=PY{loQppCMEV%>t5I{6^qg%_R^f%1wS+=Ha2oSAEVd3g=9~n> zv(7i%Z@BD@sLkYvF_Yy2>XBeLfgzy&m7b%>JH@3LME2#&lFcY4cvOyBZOyGP$Mfj5 z)T8)PKl43&EE_)d!K2r=Tz`4~#Qcc`$HJqFt8$Uve54lvB|kCVVd(4{OCshD7a@5b z9{I08Mu@K#T{Foko#ZuV2OCQrV@<~4Xe96Ou15{3 zy;t{Uym!L1&GY2dCo|A`2`_kW)kY~m*N<6hDTJRXgr6;hJMUGy$!CP~x1jf0-|Agl zdm}mDn`_*cZ`=oq%V0$=1(Z54TD`Q00SD%X>*{|VR)Ud|`v0?oTsl5EoZI$fe%q4> z%!QBT;RcT71IM!7W3qiJpMQRkwLdNz>A4B$(W*b;ix3?mA{EKzQw$Ky{>SMfV3JDw zf|MTR<5@TY;O>*dV2JHY=RLL^x#eg&{cp)xO9Glso5QmM>+t#O4IedQe@xTO*6d~| zAsozi9Rd&7v*S~mI`!-*b$*HC=9H@XC8xu)dwzt8frY9&_gn~i{p%tSM7fN%Vm`$f z*e;|ymS`)Msv11Ub*+2hwa~ue*+TpBS)+aFT~Z#_m0(@8Bqv_6TBEzraV_$4T2UwzG=$0MwFn&S!R;NI1!mtL&W|E^~ zh1F*}6YXD;6ZU!Rr810ZeCDr{K1S7;IFasPU+wS1dDMJLBx@$FZL&w2eB6QLFxA z`hJ@Z`$<4b34{g5@*>{}So^=z_cwHYPDgM%gGiuQgKZGgXJASul`7WnPr*0?Z7dw7 z(FFBNMtvR*xWHn`R{4eh>@-eSPsFA6uUioBM7XecMwyEz9Ohui2&+}e-VJ=s@Azusi&Uzmpq7rNdhp-NZyLK(Se065t4Lg|O zu7&t}&;7xn#iw$iE&0$EZocff)7te;>b-5(!$17?wQuKIH|AS6&L5aR@L6l;Li~qq z*V^U}eDPTW@_4iJYG>xa-RAa;|Fi0b`R*Sia@8IA>JEbB);lnJed3KvS1w_LzYI<0 zs-yX82qzsl41kJfDDrQeynN~MC8Yl3oj@d0XS}%+Xw1~`>AB0VUVas6W&C_Pb$RCU z%$-0eQ+u~M#Dto}XG?Ccr(wxi?Q6IbXkF-jCz%VZ%?H+^GLUCB^QC~w8{FKy}Xg}<|bvO!&@3QzSD7BZxUqNZi>c4{0nYI54N;GT#6_k#w{dZSc zlePZ}%KEJRS1FyItYZ5Wl=iIsSN`U%%l-OZ9FXhSTyS@1^7EGr+!}tw8F0{=TbaX>rxhI1^x5pZDdK}muTJB^+ zYuM-!Ho6ue*zACH{&ENEzKb1fqjt8D7G;~q0nlFVWFvh{x0&f`5rS(SG~8R+%{HuD z+;dL^er}EOyrap1t@Py%hXCGwZU$|MFlM>4;NxIHOe1L1%MJ%Nr&e||Xm^HuZVf-@ zdfDlKRH?EnK0!D>F=L(cY;+K#uk6BF>pcb87!+hsTZ1j+IL0&h9s A8~^|S diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/utils.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index 3e4f149315fc3ae8b2128410c07585b6fb49b70b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26030 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 Ks_J9R&Hn)>{= str: - return sys.getfilesystemencoding() or sys.getdefaultencoding() - - -def _make_text_stream( - stream: t.BinaryIO, - encoding: t.Optional[str], - errors: t.Optional[str], - force_readable: bool = False, - force_writable: bool = False, -) -> t.TextIO: - if encoding is None: - encoding = get_best_encoding(stream) - if errors is None: - errors = "replace" - return _NonClosingTextIOWrapper( - stream, - encoding, - errors, - line_buffering=True, - force_readable=force_readable, - force_writable=force_writable, - ) - - -def is_ascii_encoding(encoding: str) -> bool: - """Checks if a given encoding is ascii.""" - try: - return codecs.lookup(encoding).name == "ascii" - except LookupError: - return False - - -def get_best_encoding(stream: t.IO) -> str: - """Returns the default stream encoding if not found.""" - rv = getattr(stream, "encoding", None) or sys.getdefaultencoding() - if is_ascii_encoding(rv): - return "utf-8" - return rv - - -class _NonClosingTextIOWrapper(io.TextIOWrapper): - def __init__( - self, - stream: t.BinaryIO, - encoding: t.Optional[str], - errors: t.Optional[str], - force_readable: bool = False, - force_writable: bool = False, - **extra: t.Any, - ) -> None: - self._stream = stream = t.cast( - t.BinaryIO, _FixupStream(stream, force_readable, force_writable) - ) - super().__init__(stream, encoding, errors, **extra) - - def __del__(self) -> None: - try: - self.detach() - except Exception: - pass - - def isatty(self) -> bool: - # https://bitbucket.org/pypy/pypy/issue/1803 - return self._stream.isatty() - - -class _FixupStream: - """The new io interface needs more from streams than streams - traditionally implement. As such, this fix-up code is necessary in - some circumstances. - - The forcing of readable and writable flags are there because some tools - put badly patched objects on sys (one such offender are certain version - of jupyter notebook). - """ - - def __init__( - self, - stream: t.BinaryIO, - force_readable: bool = False, - force_writable: bool = False, - ): - self._stream = stream - self._force_readable = force_readable - self._force_writable = force_writable - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._stream, name) - - def read1(self, size: int) -> bytes: - f = getattr(self._stream, "read1", None) - - if f is not None: - return t.cast(bytes, f(size)) - - return self._stream.read(size) - - def readable(self) -> bool: - if self._force_readable: - return True - x = getattr(self._stream, "readable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.read(0) - except Exception: - return False - return True - - def writable(self) -> bool: - if self._force_writable: - return True - x = getattr(self._stream, "writable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.write("") # type: ignore - except Exception: - try: - self._stream.write(b"") - except Exception: - return False - return True - - def seekable(self) -> bool: - x = getattr(self._stream, "seekable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.seek(self._stream.tell()) - except Exception: - return False - return True - - -def _is_binary_reader(stream: t.IO, default: bool = False) -> bool: - try: - return isinstance(stream.read(0), bytes) - except Exception: - return default - # This happens in some cases where the stream was already - # closed. In this case, we assume the default. - - -def _is_binary_writer(stream: t.IO, default: bool = False) -> bool: - try: - stream.write(b"") - except Exception: - try: - stream.write("") - return False - except Exception: - pass - return default - return True - - -def _find_binary_reader(stream: t.IO) -> t.Optional[t.BinaryIO]: - # We need to figure out if the given stream is already binary. - # This can happen because the official docs recommend detaching - # the streams to get binary streams. Some code might do this, so - # we need to deal with this case explicitly. - if _is_binary_reader(stream, False): - return t.cast(t.BinaryIO, stream) - - buf = getattr(stream, "buffer", None) - - # Same situation here; this time we assume that the buffer is - # actually binary in case it's closed. - if buf is not None and _is_binary_reader(buf, True): - return t.cast(t.BinaryIO, buf) - - return None - - -def _find_binary_writer(stream: t.IO) -> t.Optional[t.BinaryIO]: - # We need to figure out if the given stream is already binary. - # This can happen because the official docs recommend detaching - # the streams to get binary streams. Some code might do this, so - # we need to deal with this case explicitly. - if _is_binary_writer(stream, False): - return t.cast(t.BinaryIO, stream) - - buf = getattr(stream, "buffer", None) - - # Same situation here; this time we assume that the buffer is - # actually binary in case it's closed. - if buf is not None and _is_binary_writer(buf, True): - return t.cast(t.BinaryIO, buf) - - return None - - -def _stream_is_misconfigured(stream: t.TextIO) -> bool: - """A stream is misconfigured if its encoding is ASCII.""" - # If the stream does not have an encoding set, we assume it's set - # to ASCII. This appears to happen in certain unittest - # environments. It's not quite clear what the correct behavior is - # but this at least will force Click to recover somehow. - return is_ascii_encoding(getattr(stream, "encoding", None) or "ascii") - - -def _is_compat_stream_attr(stream: t.TextIO, attr: str, value: t.Optional[str]) -> bool: - """A stream attribute is compatible if it is equal to the - desired value or the desired value is unset and the attribute - has a value. - """ - stream_value = getattr(stream, attr, None) - return stream_value == value or (value is None and stream_value is not None) - - -def _is_compatible_text_stream( - stream: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] -) -> bool: - """Check if a stream's encoding and errors attributes are - compatible with the desired values. - """ - return _is_compat_stream_attr( - stream, "encoding", encoding - ) and _is_compat_stream_attr(stream, "errors", errors) - - -def _force_correct_text_stream( - text_stream: t.IO, - encoding: t.Optional[str], - errors: t.Optional[str], - is_binary: t.Callable[[t.IO, bool], bool], - find_binary: t.Callable[[t.IO], t.Optional[t.BinaryIO]], - force_readable: bool = False, - force_writable: bool = False, -) -> t.TextIO: - if is_binary(text_stream, False): - binary_reader = t.cast(t.BinaryIO, text_stream) - else: - text_stream = t.cast(t.TextIO, text_stream) - # If the stream looks compatible, and won't default to a - # misconfigured ascii encoding, return it as-is. - if _is_compatible_text_stream(text_stream, encoding, errors) and not ( - encoding is None and _stream_is_misconfigured(text_stream) - ): - return text_stream - - # Otherwise, get the underlying binary reader. - possible_binary_reader = find_binary(text_stream) - - # If that's not possible, silently use the original reader - # and get mojibake instead of exceptions. - if possible_binary_reader is None: - return text_stream - - binary_reader = possible_binary_reader - - # Default errors to replace instead of strict in order to get - # something that works. - if errors is None: - errors = "replace" - - # Wrap the binary stream in a text stream with the correct - # encoding parameters. - return _make_text_stream( - binary_reader, - encoding, - errors, - force_readable=force_readable, - force_writable=force_writable, - ) - - -def _force_correct_text_reader( - text_reader: t.IO, - encoding: t.Optional[str], - errors: t.Optional[str], - force_readable: bool = False, -) -> t.TextIO: - return _force_correct_text_stream( - text_reader, - encoding, - errors, - _is_binary_reader, - _find_binary_reader, - force_readable=force_readable, - ) - - -def _force_correct_text_writer( - text_writer: t.IO, - encoding: t.Optional[str], - errors: t.Optional[str], - force_writable: bool = False, -) -> t.TextIO: - return _force_correct_text_stream( - text_writer, - encoding, - errors, - _is_binary_writer, - _find_binary_writer, - force_writable=force_writable, - ) - - -def get_binary_stdin() -> t.BinaryIO: - reader = _find_binary_reader(sys.stdin) - if reader is None: - raise RuntimeError("Was not able to determine binary stream for sys.stdin.") - return reader - - -def get_binary_stdout() -> t.BinaryIO: - writer = _find_binary_writer(sys.stdout) - if writer is None: - raise RuntimeError("Was not able to determine binary stream for sys.stdout.") - return writer - - -def get_binary_stderr() -> t.BinaryIO: - writer = _find_binary_writer(sys.stderr) - if writer is None: - raise RuntimeError("Was not able to determine binary stream for sys.stderr.") - return writer - - -def get_text_stdin( - encoding: t.Optional[str] = None, errors: t.Optional[str] = None -) -> t.TextIO: - rv = _get_windows_console_stream(sys.stdin, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_reader(sys.stdin, encoding, errors, force_readable=True) - - -def get_text_stdout( - encoding: t.Optional[str] = None, errors: t.Optional[str] = None -) -> t.TextIO: - rv = _get_windows_console_stream(sys.stdout, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_writer(sys.stdout, encoding, errors, force_writable=True) - - -def get_text_stderr( - encoding: t.Optional[str] = None, errors: t.Optional[str] = None -) -> t.TextIO: - rv = _get_windows_console_stream(sys.stderr, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_writer(sys.stderr, encoding, errors, force_writable=True) - - -def _wrap_io_open( - file: t.Union[str, os.PathLike, int], - mode: str, - encoding: t.Optional[str], - errors: t.Optional[str], -) -> t.IO: - """Handles not passing ``encoding`` and ``errors`` in binary mode.""" - if "b" in mode: - return open(file, mode) - - return open(file, mode, encoding=encoding, errors=errors) - - -def open_stream( - filename: str, - mode: str = "r", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", - atomic: bool = False, -) -> t.Tuple[t.IO, bool]: - binary = "b" in mode - - # Standard streams first. These are simple because they ignore the - # atomic flag. Use fsdecode to handle Path("-"). - if os.fsdecode(filename) == "-": - if any(m in mode for m in ["w", "a", "x"]): - if binary: - return get_binary_stdout(), False - return get_text_stdout(encoding=encoding, errors=errors), False - if binary: - return get_binary_stdin(), False - return get_text_stdin(encoding=encoding, errors=errors), False - - # Non-atomic writes directly go out through the regular open functions. - if not atomic: - return _wrap_io_open(filename, mode, encoding, errors), True - - # Some usability stuff for atomic writes - if "a" in mode: - raise ValueError( - "Appending to an existing file is not supported, because that" - " would involve an expensive `copy`-operation to a temporary" - " file. Open the file in normal `w`-mode and copy explicitly" - " if that's what you're after." - ) - if "x" in mode: - raise ValueError("Use the `overwrite`-parameter instead.") - if "w" not in mode: - raise ValueError("Atomic writes only make sense with `w`-mode.") - - # Atomic writes are more complicated. They work by opening a file - # as a proxy in the same folder and then using the fdopen - # functionality to wrap it in a Python file. Then we wrap it in an - # atomic file that moves the file over on close. - import errno - import random - - try: - perm: t.Optional[int] = os.stat(filename).st_mode - except OSError: - perm = None - - flags = os.O_RDWR | os.O_CREAT | os.O_EXCL - - if binary: - flags |= getattr(os, "O_BINARY", 0) - - while True: - tmp_filename = os.path.join( - os.path.dirname(filename), - f".__atomic-write{random.randrange(1 << 32):08x}", - ) - try: - fd = os.open(tmp_filename, flags, 0o666 if perm is None else perm) - break - except OSError as e: - if e.errno == errno.EEXIST or ( - os.name == "nt" - and e.errno == errno.EACCES - and os.path.isdir(e.filename) - and os.access(e.filename, os.W_OK) - ): - continue - raise - - if perm is not None: - os.chmod(tmp_filename, perm) # in case perm includes bits in umask - - f = _wrap_io_open(fd, mode, encoding, errors) - af = _AtomicFile(f, tmp_filename, os.path.realpath(filename)) - return t.cast(t.IO, af), True - - -class _AtomicFile: - def __init__(self, f: t.IO, tmp_filename: str, real_filename: str) -> None: - self._f = f - self._tmp_filename = tmp_filename - self._real_filename = real_filename - self.closed = False - - @property - def name(self) -> str: - return self._real_filename - - def close(self, delete: bool = False) -> None: - if self.closed: - return - self._f.close() - os.replace(self._tmp_filename, self._real_filename) - self.closed = True - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._f, name) - - def __enter__(self) -> "_AtomicFile": - return self - - def __exit__(self, exc_type, exc_value, tb): # type: ignore - self.close(delete=exc_type is not None) - - def __repr__(self) -> str: - return repr(self._f) - - -def strip_ansi(value: str) -> str: - return _ansi_re.sub("", value) - - -def _is_jupyter_kernel_output(stream: t.IO) -> bool: - while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)): - stream = stream._stream - - return stream.__class__.__module__.startswith("ipykernel.") - - -def should_strip_ansi( - stream: t.Optional[t.IO] = None, color: t.Optional[bool] = None -) -> bool: - if color is None: - if stream is None: - stream = sys.stdin - return not isatty(stream) and not _is_jupyter_kernel_output(stream) - return not color - - -# On Windows, wrap the output streams with colorama to support ANSI -# color codes. -# NOTE: double check is needed so mypy does not analyze this on Linux -if sys.platform.startswith("win") and WIN: - from ._winconsole import _get_windows_console_stream - - def _get_argv_encoding() -> str: - import locale - - return locale.getpreferredencoding() - - _ansi_stream_wrappers: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() - - def auto_wrap_for_ansi( - stream: t.TextIO, color: t.Optional[bool] = None - ) -> t.TextIO: - """Support ANSI color and style codes on Windows by wrapping a - stream with colorama. - """ - try: - cached = _ansi_stream_wrappers.get(stream) - except Exception: - cached = None - - if cached is not None: - return cached - - import colorama - - strip = should_strip_ansi(stream, color) - ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) - rv = t.cast(t.TextIO, ansi_wrapper.stream) - _write = rv.write - - def _safe_write(s): - try: - return _write(s) - except BaseException: - ansi_wrapper.reset_all() - raise - - rv.write = _safe_write - - try: - _ansi_stream_wrappers[stream] = rv - except Exception: - pass - - return rv - -else: - - def _get_argv_encoding() -> str: - return getattr(sys.stdin, "encoding", None) or get_filesystem_encoding() - - def _get_windows_console_stream( - f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] - ) -> t.Optional[t.TextIO]: - return None - - -def term_len(x: str) -> int: - return len(strip_ansi(x)) - - -def isatty(stream: t.IO) -> bool: - try: - return stream.isatty() - except Exception: - return False - - -def _make_cached_stream_func( - src_func: t.Callable[[], t.TextIO], wrapper_func: t.Callable[[], t.TextIO] -) -> t.Callable[[], t.TextIO]: - cache: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() - - def func() -> t.TextIO: - stream = src_func() - try: - rv = cache.get(stream) - except Exception: - rv = None - if rv is not None: - return rv - rv = wrapper_func() - try: - cache[stream] = rv - except Exception: - pass - return rv - - return func - - -_default_text_stdin = _make_cached_stream_func(lambda: sys.stdin, get_text_stdin) -_default_text_stdout = _make_cached_stream_func(lambda: sys.stdout, get_text_stdout) -_default_text_stderr = _make_cached_stream_func(lambda: sys.stderr, get_text_stderr) - - -binary_streams: t.Mapping[str, t.Callable[[], t.BinaryIO]] = { - "stdin": get_binary_stdin, - "stdout": get_binary_stdout, - "stderr": get_binary_stderr, -} - -text_streams: t.Mapping[ - str, t.Callable[[t.Optional[str], t.Optional[str]], t.TextIO] -] = { - "stdin": get_text_stdin, - "stdout": get_text_stdout, - "stderr": get_text_stderr, -} diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/_termui_impl.py b/venv_flaskchat/lib/python3.11/site-packages/click/_termui_impl.py deleted file mode 100644 index 4b979bc..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click/_termui_impl.py +++ /dev/null @@ -1,717 +0,0 @@ -""" -This module contains implementations for the termui module. To keep the -import time of Click down, some infrequently used functionality is -placed in this module and only imported as needed. -""" -import contextlib -import math -import os -import sys -import time -import typing as t -from gettext import gettext as _ - -from ._compat import _default_text_stdout -from ._compat import CYGWIN -from ._compat import get_best_encoding -from ._compat import isatty -from ._compat import open_stream -from ._compat import strip_ansi -from ._compat import term_len -from ._compat import WIN -from .exceptions import ClickException -from .utils import echo - -V = t.TypeVar("V") - -if os.name == "nt": - BEFORE_BAR = "\r" - AFTER_BAR = "\n" -else: - BEFORE_BAR = "\r\033[?25l" - AFTER_BAR = "\033[?25h\n" - - -class ProgressBar(t.Generic[V]): - def __init__( - self, - iterable: t.Optional[t.Iterable[V]], - length: t.Optional[int] = None, - fill_char: str = "#", - empty_char: str = " ", - bar_template: str = "%(bar)s", - info_sep: str = " ", - show_eta: bool = True, - show_percent: t.Optional[bool] = None, - show_pos: bool = False, - item_show_func: t.Optional[t.Callable[[t.Optional[V]], t.Optional[str]]] = None, - label: t.Optional[str] = None, - file: t.Optional[t.TextIO] = None, - color: t.Optional[bool] = None, - update_min_steps: int = 1, - width: int = 30, - ) -> None: - self.fill_char = fill_char - self.empty_char = empty_char - self.bar_template = bar_template - self.info_sep = info_sep - self.show_eta = show_eta - self.show_percent = show_percent - self.show_pos = show_pos - self.item_show_func = item_show_func - self.label = label or "" - if file is None: - file = _default_text_stdout() - self.file = file - self.color = color - self.update_min_steps = update_min_steps - self._completed_intervals = 0 - self.width = width - self.autowidth = width == 0 - - if length is None: - from operator import length_hint - - length = length_hint(iterable, -1) - - if length == -1: - length = None - if iterable is None: - if length is None: - raise TypeError("iterable or length is required") - iterable = t.cast(t.Iterable[V], range(length)) - self.iter = iter(iterable) - self.length = length - self.pos = 0 - self.avg: t.List[float] = [] - self.start = self.last_eta = time.time() - self.eta_known = False - self.finished = False - self.max_width: t.Optional[int] = None - self.entered = False - self.current_item: t.Optional[V] = None - self.is_hidden = not isatty(self.file) - self._last_line: t.Optional[str] = None - - def __enter__(self) -> "ProgressBar": - self.entered = True - self.render_progress() - return self - - def __exit__(self, exc_type, exc_value, tb): # type: ignore - self.render_finish() - - def __iter__(self) -> t.Iterator[V]: - if not self.entered: - raise RuntimeError("You need to use progress bars in a with block.") - self.render_progress() - return self.generator() - - def __next__(self) -> V: - # Iteration is defined in terms of a generator function, - # returned by iter(self); use that to define next(). This works - # because `self.iter` is an iterable consumed by that generator, - # so it is re-entry safe. Calling `next(self.generator())` - # twice works and does "what you want". - return next(iter(self)) - - def render_finish(self) -> None: - if self.is_hidden: - return - self.file.write(AFTER_BAR) - self.file.flush() - - @property - def pct(self) -> float: - if self.finished: - return 1.0 - return min(self.pos / (float(self.length or 1) or 1), 1.0) - - @property - def time_per_iteration(self) -> float: - if not self.avg: - return 0.0 - return sum(self.avg) / float(len(self.avg)) - - @property - def eta(self) -> float: - if self.length is not None and not self.finished: - return self.time_per_iteration * (self.length - self.pos) - return 0.0 - - def format_eta(self) -> str: - if self.eta_known: - t = int(self.eta) - seconds = t % 60 - t //= 60 - minutes = t % 60 - t //= 60 - hours = t % 24 - t //= 24 - if t > 0: - return f"{t}d {hours:02}:{minutes:02}:{seconds:02}" - else: - return f"{hours:02}:{minutes:02}:{seconds:02}" - return "" - - def format_pos(self) -> str: - pos = str(self.pos) - if self.length is not None: - pos += f"/{self.length}" - return pos - - def format_pct(self) -> str: - return f"{int(self.pct * 100): 4}%"[1:] - - def format_bar(self) -> str: - if self.length is not None: - bar_length = int(self.pct * self.width) - bar = self.fill_char * bar_length - bar += self.empty_char * (self.width - bar_length) - elif self.finished: - bar = self.fill_char * self.width - else: - chars = list(self.empty_char * (self.width or 1)) - if self.time_per_iteration != 0: - chars[ - int( - (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5) - * self.width - ) - ] = self.fill_char - bar = "".join(chars) - return bar - - def format_progress_line(self) -> str: - show_percent = self.show_percent - - info_bits = [] - if self.length is not None and show_percent is None: - show_percent = not self.show_pos - - if self.show_pos: - info_bits.append(self.format_pos()) - if show_percent: - info_bits.append(self.format_pct()) - if self.show_eta and self.eta_known and not self.finished: - info_bits.append(self.format_eta()) - if self.item_show_func is not None: - item_info = self.item_show_func(self.current_item) - if item_info is not None: - info_bits.append(item_info) - - return ( - self.bar_template - % { - "label": self.label, - "bar": self.format_bar(), - "info": self.info_sep.join(info_bits), - } - ).rstrip() - - def render_progress(self) -> None: - import shutil - - if self.is_hidden: - # Only output the label as it changes if the output is not a - # TTY. Use file=stderr if you expect to be piping stdout. - if self._last_line != self.label: - self._last_line = self.label - echo(self.label, file=self.file, color=self.color) - - return - - buf = [] - # Update width in case the terminal has been resized - if self.autowidth: - old_width = self.width - self.width = 0 - clutter_length = term_len(self.format_progress_line()) - new_width = max(0, shutil.get_terminal_size().columns - clutter_length) - if new_width < old_width: - buf.append(BEFORE_BAR) - buf.append(" " * self.max_width) # type: ignore - self.max_width = new_width - self.width = new_width - - clear_width = self.width - if self.max_width is not None: - clear_width = self.max_width - - buf.append(BEFORE_BAR) - line = self.format_progress_line() - line_len = term_len(line) - if self.max_width is None or self.max_width < line_len: - self.max_width = line_len - - buf.append(line) - buf.append(" " * (clear_width - line_len)) - line = "".join(buf) - # Render the line only if it changed. - - if line != self._last_line: - self._last_line = line - echo(line, file=self.file, color=self.color, nl=False) - self.file.flush() - - def make_step(self, n_steps: int) -> None: - self.pos += n_steps - if self.length is not None and self.pos >= self.length: - self.finished = True - - if (time.time() - self.last_eta) < 1.0: - return - - self.last_eta = time.time() - - # self.avg is a rolling list of length <= 7 of steps where steps are - # defined as time elapsed divided by the total progress through - # self.length. - if self.pos: - step = (time.time() - self.start) / self.pos - else: - step = time.time() - self.start - - self.avg = self.avg[-6:] + [step] - - self.eta_known = self.length is not None - - def update(self, n_steps: int, current_item: t.Optional[V] = None) -> None: - """Update the progress bar by advancing a specified number of - steps, and optionally set the ``current_item`` for this new - position. - - :param n_steps: Number of steps to advance. - :param current_item: Optional item to set as ``current_item`` - for the updated position. - - .. versionchanged:: 8.0 - Added the ``current_item`` optional parameter. - - .. versionchanged:: 8.0 - Only render when the number of steps meets the - ``update_min_steps`` threshold. - """ - if current_item is not None: - self.current_item = current_item - - self._completed_intervals += n_steps - - if self._completed_intervals >= self.update_min_steps: - self.make_step(self._completed_intervals) - self.render_progress() - self._completed_intervals = 0 - - def finish(self) -> None: - self.eta_known = False - self.current_item = None - self.finished = True - - def generator(self) -> t.Iterator[V]: - """Return a generator which yields the items added to the bar - during construction, and updates the progress bar *after* the - yielded block returns. - """ - # WARNING: the iterator interface for `ProgressBar` relies on - # this and only works because this is a simple generator which - # doesn't create or manage additional state. If this function - # changes, the impact should be evaluated both against - # `iter(bar)` and `next(bar)`. `next()` in particular may call - # `self.generator()` repeatedly, and this must remain safe in - # order for that interface to work. - if not self.entered: - raise RuntimeError("You need to use progress bars in a with block.") - - if self.is_hidden: - yield from self.iter - else: - for rv in self.iter: - self.current_item = rv - - # This allows show_item_func to be updated before the - # item is processed. Only trigger at the beginning of - # the update interval. - if self._completed_intervals == 0: - self.render_progress() - - yield rv - self.update(1) - - self.finish() - self.render_progress() - - -def pager(generator: t.Iterable[str], color: t.Optional[bool] = None) -> None: - """Decide what method to use for paging through text.""" - stdout = _default_text_stdout() - if not isatty(sys.stdin) or not isatty(stdout): - return _nullpager(stdout, generator, color) - pager_cmd = (os.environ.get("PAGER", None) or "").strip() - if pager_cmd: - if WIN: - return _tempfilepager(generator, pager_cmd, color) - return _pipepager(generator, pager_cmd, color) - if os.environ.get("TERM") in ("dumb", "emacs"): - return _nullpager(stdout, generator, color) - if WIN or sys.platform.startswith("os2"): - return _tempfilepager(generator, "more <", color) - if hasattr(os, "system") and os.system("(less) 2>/dev/null") == 0: - return _pipepager(generator, "less", color) - - import tempfile - - fd, filename = tempfile.mkstemp() - os.close(fd) - try: - if hasattr(os, "system") and os.system(f'more "{filename}"') == 0: - return _pipepager(generator, "more", color) - return _nullpager(stdout, generator, color) - finally: - os.unlink(filename) - - -def _pipepager(generator: t.Iterable[str], cmd: str, color: t.Optional[bool]) -> None: - """Page through text by feeding it to another program. Invoking a - pager through this might support colors. - """ - import subprocess - - env = dict(os.environ) - - # If we're piping to less we might support colors under the - # condition that - cmd_detail = cmd.rsplit("/", 1)[-1].split() - if color is None and cmd_detail[0] == "less": - less_flags = f"{os.environ.get('LESS', '')}{' '.join(cmd_detail[1:])}" - if not less_flags: - env["LESS"] = "-R" - color = True - elif "r" in less_flags or "R" in less_flags: - color = True - - c = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, env=env) - stdin = t.cast(t.BinaryIO, c.stdin) - encoding = get_best_encoding(stdin) - try: - for text in generator: - if not color: - text = strip_ansi(text) - - stdin.write(text.encode(encoding, "replace")) - except (OSError, KeyboardInterrupt): - pass - else: - stdin.close() - - # Less doesn't respect ^C, but catches it for its own UI purposes (aborting - # search or other commands inside less). - # - # That means when the user hits ^C, the parent process (click) terminates, - # but less is still alive, paging the output and messing up the terminal. - # - # If the user wants to make the pager exit on ^C, they should set - # `LESS='-K'`. It's not our decision to make. - while True: - try: - c.wait() - except KeyboardInterrupt: - pass - else: - break - - -def _tempfilepager( - generator: t.Iterable[str], cmd: str, color: t.Optional[bool] -) -> None: - """Page through text by invoking a program on a temporary file.""" - import tempfile - - fd, filename = tempfile.mkstemp() - # TODO: This never terminates if the passed generator never terminates. - text = "".join(generator) - if not color: - text = strip_ansi(text) - encoding = get_best_encoding(sys.stdout) - with open_stream(filename, "wb")[0] as f: - f.write(text.encode(encoding)) - try: - os.system(f'{cmd} "{filename}"') - finally: - os.close(fd) - os.unlink(filename) - - -def _nullpager( - stream: t.TextIO, generator: t.Iterable[str], color: t.Optional[bool] -) -> None: - """Simply print unformatted text. This is the ultimate fallback.""" - for text in generator: - if not color: - text = strip_ansi(text) - stream.write(text) - - -class Editor: - def __init__( - self, - editor: t.Optional[str] = None, - env: t.Optional[t.Mapping[str, str]] = None, - require_save: bool = True, - extension: str = ".txt", - ) -> None: - self.editor = editor - self.env = env - self.require_save = require_save - self.extension = extension - - def get_editor(self) -> str: - if self.editor is not None: - return self.editor - for key in "VISUAL", "EDITOR": - rv = os.environ.get(key) - if rv: - return rv - if WIN: - return "notepad" - for editor in "sensible-editor", "vim", "nano": - if os.system(f"which {editor} >/dev/null 2>&1") == 0: - return editor - return "vi" - - def edit_file(self, filename: str) -> None: - import subprocess - - editor = self.get_editor() - environ: t.Optional[t.Dict[str, str]] = None - - if self.env: - environ = os.environ.copy() - environ.update(self.env) - - try: - c = subprocess.Popen(f'{editor} "{filename}"', env=environ, shell=True) - exit_code = c.wait() - if exit_code != 0: - raise ClickException( - _("{editor}: Editing failed").format(editor=editor) - ) - except OSError as e: - raise ClickException( - _("{editor}: Editing failed: {e}").format(editor=editor, e=e) - ) from e - - def edit(self, text: t.Optional[t.AnyStr]) -> t.Optional[t.AnyStr]: - import tempfile - - if not text: - data = b"" - elif isinstance(text, (bytes, bytearray)): - data = text - else: - if text and not text.endswith("\n"): - text += "\n" - - if WIN: - data = text.replace("\n", "\r\n").encode("utf-8-sig") - else: - data = text.encode("utf-8") - - fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension) - f: t.BinaryIO - - try: - with os.fdopen(fd, "wb") as f: - f.write(data) - - # If the filesystem resolution is 1 second, like Mac OS - # 10.12 Extended, or 2 seconds, like FAT32, and the editor - # closes very fast, require_save can fail. Set the modified - # time to be 2 seconds in the past to work around this. - os.utime(name, (os.path.getatime(name), os.path.getmtime(name) - 2)) - # Depending on the resolution, the exact value might not be - # recorded, so get the new recorded value. - timestamp = os.path.getmtime(name) - - self.edit_file(name) - - if self.require_save and os.path.getmtime(name) == timestamp: - return None - - with open(name, "rb") as f: - rv = f.read() - - if isinstance(text, (bytes, bytearray)): - return rv - - return rv.decode("utf-8-sig").replace("\r\n", "\n") # type: ignore - finally: - os.unlink(name) - - -def open_url(url: str, wait: bool = False, locate: bool = False) -> int: - import subprocess - - def _unquote_file(url: str) -> str: - from urllib.parse import unquote - - if url.startswith("file://"): - url = unquote(url[7:]) - - return url - - if sys.platform == "darwin": - args = ["open"] - if wait: - args.append("-W") - if locate: - args.append("-R") - args.append(_unquote_file(url)) - null = open("/dev/null", "w") - try: - return subprocess.Popen(args, stderr=null).wait() - finally: - null.close() - elif WIN: - if locate: - url = _unquote_file(url.replace('"', "")) - args = f'explorer /select,"{url}"' - else: - url = url.replace('"', "") - wait_str = "/WAIT" if wait else "" - args = f'start {wait_str} "" "{url}"' - return os.system(args) - elif CYGWIN: - if locate: - url = os.path.dirname(_unquote_file(url).replace('"', "")) - args = f'cygstart "{url}"' - else: - url = url.replace('"', "") - wait_str = "-w" if wait else "" - args = f'cygstart {wait_str} "{url}"' - return os.system(args) - - try: - if locate: - url = os.path.dirname(_unquote_file(url)) or "." - else: - url = _unquote_file(url) - c = subprocess.Popen(["xdg-open", url]) - if wait: - return c.wait() - return 0 - except OSError: - if url.startswith(("http://", "https://")) and not locate and not wait: - import webbrowser - - webbrowser.open(url) - return 0 - return 1 - - -def _translate_ch_to_exc(ch: str) -> t.Optional[BaseException]: - if ch == "\x03": - raise KeyboardInterrupt() - - if ch == "\x04" and not WIN: # Unix-like, Ctrl+D - raise EOFError() - - if ch == "\x1a" and WIN: # Windows, Ctrl+Z - raise EOFError() - - return None - - -if WIN: - import msvcrt - - @contextlib.contextmanager - def raw_terminal() -> t.Iterator[int]: - yield -1 - - def getchar(echo: bool) -> str: - # The function `getch` will return a bytes object corresponding to - # the pressed character. Since Windows 10 build 1803, it will also - # return \x00 when called a second time after pressing a regular key. - # - # `getwch` does not share this probably-bugged behavior. Moreover, it - # returns a Unicode object by default, which is what we want. - # - # Either of these functions will return \x00 or \xe0 to indicate - # a special key, and you need to call the same function again to get - # the "rest" of the code. The fun part is that \u00e0 is - # "latin small letter a with grave", so if you type that on a French - # keyboard, you _also_ get a \xe0. - # E.g., consider the Up arrow. This returns \xe0 and then \x48. The - # resulting Unicode string reads as "a with grave" + "capital H". - # This is indistinguishable from when the user actually types - # "a with grave" and then "capital H". - # - # When \xe0 is returned, we assume it's part of a special-key sequence - # and call `getwch` again, but that means that when the user types - # the \u00e0 character, `getchar` doesn't return until a second - # character is typed. - # The alternative is returning immediately, but that would mess up - # cross-platform handling of arrow keys and others that start with - # \xe0. Another option is using `getch`, but then we can't reliably - # read non-ASCII characters, because return values of `getch` are - # limited to the current 8-bit codepage. - # - # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` - # is doing the right thing in more situations than with `getch`. - func: t.Callable[[], str] - - if echo: - func = msvcrt.getwche # type: ignore - else: - func = msvcrt.getwch # type: ignore - - rv = func() - - if rv in ("\x00", "\xe0"): - # \x00 and \xe0 are control characters that indicate special key, - # see above. - rv += func() - - _translate_ch_to_exc(rv) - return rv - -else: - import tty - import termios - - @contextlib.contextmanager - def raw_terminal() -> t.Iterator[int]: - f: t.Optional[t.TextIO] - fd: int - - if not isatty(sys.stdin): - f = open("/dev/tty") - fd = f.fileno() - else: - fd = sys.stdin.fileno() - f = None - - try: - old_settings = termios.tcgetattr(fd) - - try: - tty.setraw(fd) - yield fd - finally: - termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) - sys.stdout.flush() - - if f is not None: - f.close() - except termios.error: - pass - - def getchar(echo: bool) -> str: - with raw_terminal() as fd: - ch = os.read(fd, 32).decode(get_best_encoding(sys.stdin), "replace") - - if echo and isatty(sys.stdout): - sys.stdout.write(ch) - - _translate_ch_to_exc(ch) - return ch diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/_textwrap.py b/venv_flaskchat/lib/python3.11/site-packages/click/_textwrap.py deleted file mode 100644 index b47dcbd..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click/_textwrap.py +++ /dev/null @@ -1,49 +0,0 @@ -import textwrap -import typing as t -from contextlib import contextmanager - - -class TextWrapper(textwrap.TextWrapper): - def _handle_long_word( - self, - reversed_chunks: t.List[str], - cur_line: t.List[str], - cur_len: int, - width: int, - ) -> None: - space_left = max(width - cur_len, 1) - - if self.break_long_words: - last = reversed_chunks[-1] - cut = last[:space_left] - res = last[space_left:] - cur_line.append(cut) - reversed_chunks[-1] = res - elif not cur_line: - cur_line.append(reversed_chunks.pop()) - - @contextmanager - def extra_indent(self, indent: str) -> t.Iterator[None]: - old_initial_indent = self.initial_indent - old_subsequent_indent = self.subsequent_indent - self.initial_indent += indent - self.subsequent_indent += indent - - try: - yield - finally: - self.initial_indent = old_initial_indent - self.subsequent_indent = old_subsequent_indent - - def indent_only(self, text: str) -> str: - rv = [] - - for idx, line in enumerate(text.splitlines()): - indent = self.initial_indent - - if idx > 0: - indent = self.subsequent_indent - - rv.append(f"{indent}{line}") - - return "\n".join(rv) diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/_winconsole.py b/venv_flaskchat/lib/python3.11/site-packages/click/_winconsole.py deleted file mode 100644 index 6b20df3..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click/_winconsole.py +++ /dev/null @@ -1,279 +0,0 @@ -# This module is based on the excellent work by Adam Bartoš who -# provided a lot of what went into the implementation here in -# the discussion to issue1602 in the Python bug tracker. -# -# There are some general differences in regards to how this works -# compared to the original patches as we do not need to patch -# the entire interpreter but just work in our little world of -# echo and prompt. -import io -import sys -import time -import typing as t -from ctypes import byref -from ctypes import c_char -from ctypes import c_char_p -from ctypes import c_int -from ctypes import c_ssize_t -from ctypes import c_ulong -from ctypes import c_void_p -from ctypes import POINTER -from ctypes import py_object -from ctypes import Structure -from ctypes.wintypes import DWORD -from ctypes.wintypes import HANDLE -from ctypes.wintypes import LPCWSTR -from ctypes.wintypes import LPWSTR - -from ._compat import _NonClosingTextIOWrapper - -assert sys.platform == "win32" -import msvcrt # noqa: E402 -from ctypes import windll # noqa: E402 -from ctypes import WINFUNCTYPE # noqa: E402 - -c_ssize_p = POINTER(c_ssize_t) - -kernel32 = windll.kernel32 -GetStdHandle = kernel32.GetStdHandle -ReadConsoleW = kernel32.ReadConsoleW -WriteConsoleW = kernel32.WriteConsoleW -GetConsoleMode = kernel32.GetConsoleMode -GetLastError = kernel32.GetLastError -GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32)) -CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( - ("CommandLineToArgvW", windll.shell32) -) -LocalFree = WINFUNCTYPE(c_void_p, c_void_p)(("LocalFree", windll.kernel32)) - -STDIN_HANDLE = GetStdHandle(-10) -STDOUT_HANDLE = GetStdHandle(-11) -STDERR_HANDLE = GetStdHandle(-12) - -PyBUF_SIMPLE = 0 -PyBUF_WRITABLE = 1 - -ERROR_SUCCESS = 0 -ERROR_NOT_ENOUGH_MEMORY = 8 -ERROR_OPERATION_ABORTED = 995 - -STDIN_FILENO = 0 -STDOUT_FILENO = 1 -STDERR_FILENO = 2 - -EOF = b"\x1a" -MAX_BYTES_WRITTEN = 32767 - -try: - from ctypes import pythonapi -except ImportError: - # On PyPy we cannot get buffers so our ability to operate here is - # severely limited. - get_buffer = None -else: - - class Py_buffer(Structure): - _fields_ = [ - ("buf", c_void_p), - ("obj", py_object), - ("len", c_ssize_t), - ("itemsize", c_ssize_t), - ("readonly", c_int), - ("ndim", c_int), - ("format", c_char_p), - ("shape", c_ssize_p), - ("strides", c_ssize_p), - ("suboffsets", c_ssize_p), - ("internal", c_void_p), - ] - - PyObject_GetBuffer = pythonapi.PyObject_GetBuffer - PyBuffer_Release = pythonapi.PyBuffer_Release - - def get_buffer(obj, writable=False): - buf = Py_buffer() - flags = PyBUF_WRITABLE if writable else PyBUF_SIMPLE - PyObject_GetBuffer(py_object(obj), byref(buf), flags) - - try: - buffer_type = c_char * buf.len - return buffer_type.from_address(buf.buf) - finally: - PyBuffer_Release(byref(buf)) - - -class _WindowsConsoleRawIOBase(io.RawIOBase): - def __init__(self, handle): - self.handle = handle - - def isatty(self): - super().isatty() - return True - - -class _WindowsConsoleReader(_WindowsConsoleRawIOBase): - def readable(self): - return True - - def readinto(self, b): - bytes_to_be_read = len(b) - if not bytes_to_be_read: - return 0 - elif bytes_to_be_read % 2: - raise ValueError( - "cannot read odd number of bytes from UTF-16-LE encoded console" - ) - - buffer = get_buffer(b, writable=True) - code_units_to_be_read = bytes_to_be_read // 2 - code_units_read = c_ulong() - - rv = ReadConsoleW( - HANDLE(self.handle), - buffer, - code_units_to_be_read, - byref(code_units_read), - None, - ) - if GetLastError() == ERROR_OPERATION_ABORTED: - # wait for KeyboardInterrupt - time.sleep(0.1) - if not rv: - raise OSError(f"Windows error: {GetLastError()}") - - if buffer[0] == EOF: - return 0 - return 2 * code_units_read.value - - -class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): - def writable(self): - return True - - @staticmethod - def _get_error_message(errno): - if errno == ERROR_SUCCESS: - return "ERROR_SUCCESS" - elif errno == ERROR_NOT_ENOUGH_MEMORY: - return "ERROR_NOT_ENOUGH_MEMORY" - return f"Windows error {errno}" - - def write(self, b): - bytes_to_be_written = len(b) - buf = get_buffer(b) - code_units_to_be_written = min(bytes_to_be_written, MAX_BYTES_WRITTEN) // 2 - code_units_written = c_ulong() - - WriteConsoleW( - HANDLE(self.handle), - buf, - code_units_to_be_written, - byref(code_units_written), - None, - ) - bytes_written = 2 * code_units_written.value - - if bytes_written == 0 and bytes_to_be_written > 0: - raise OSError(self._get_error_message(GetLastError())) - return bytes_written - - -class ConsoleStream: - def __init__(self, text_stream: t.TextIO, byte_stream: t.BinaryIO) -> None: - self._text_stream = text_stream - self.buffer = byte_stream - - @property - def name(self) -> str: - return self.buffer.name - - def write(self, x: t.AnyStr) -> int: - if isinstance(x, str): - return self._text_stream.write(x) - try: - self.flush() - except Exception: - pass - return self.buffer.write(x) - - def writelines(self, lines: t.Iterable[t.AnyStr]) -> None: - for line in lines: - self.write(line) - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._text_stream, name) - - def isatty(self) -> bool: - return self.buffer.isatty() - - def __repr__(self): - return f"" - - -def _get_text_stdin(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -def _get_text_stdout(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -def _get_text_stderr(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -_stream_factories: t.Mapping[int, t.Callable[[t.BinaryIO], t.TextIO]] = { - 0: _get_text_stdin, - 1: _get_text_stdout, - 2: _get_text_stderr, -} - - -def _is_console(f: t.TextIO) -> bool: - if not hasattr(f, "fileno"): - return False - - try: - fileno = f.fileno() - except (OSError, io.UnsupportedOperation): - return False - - handle = msvcrt.get_osfhandle(fileno) - return bool(GetConsoleMode(handle, byref(DWORD()))) - - -def _get_windows_console_stream( - f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] -) -> t.Optional[t.TextIO]: - if ( - get_buffer is not None - and encoding in {"utf-16-le", None} - and errors in {"strict", None} - and _is_console(f) - ): - func = _stream_factories.get(f.fileno()) - if func is not None: - b = getattr(f, "buffer", None) - - if b is None: - return None - - return func(b) diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/core.py b/venv_flaskchat/lib/python3.11/site-packages/click/core.py deleted file mode 100644 index 5abfb0f..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click/core.py +++ /dev/null @@ -1,2998 +0,0 @@ -import enum -import errno -import inspect -import os -import sys -import typing as t -from collections import abc -from contextlib import contextmanager -from contextlib import ExitStack -from functools import partial -from functools import update_wrapper -from gettext import gettext as _ -from gettext import ngettext -from itertools import repeat - -from . import types -from .exceptions import Abort -from .exceptions import BadParameter -from .exceptions import ClickException -from .exceptions import Exit -from .exceptions import MissingParameter -from .exceptions import UsageError -from .formatting import HelpFormatter -from .formatting import join_options -from .globals import pop_context -from .globals import push_context -from .parser import _flag_needs_value -from .parser import OptionParser -from .parser import split_opt -from .termui import confirm -from .termui import prompt -from .termui import style -from .utils import _detect_program_name -from .utils import _expand_args -from .utils import echo -from .utils import make_default_short_help -from .utils import make_str -from .utils import PacifyFlushWrapper - -if t.TYPE_CHECKING: - import typing_extensions as te - from .shell_completion import CompletionItem - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) -V = t.TypeVar("V") - - -def _complete_visible_commands( - ctx: "Context", incomplete: str -) -> t.Iterator[t.Tuple[str, "Command"]]: - """List all the subcommands of a group that start with the - incomplete value and aren't hidden. - - :param ctx: Invocation context for the group. - :param incomplete: Value being completed. May be empty. - """ - multi = t.cast(MultiCommand, ctx.command) - - for name in multi.list_commands(ctx): - if name.startswith(incomplete): - command = multi.get_command(ctx, name) - - if command is not None and not command.hidden: - yield name, command - - -def _check_multicommand( - base_command: "MultiCommand", cmd_name: str, cmd: "Command", register: bool = False -) -> None: - if not base_command.chain or not isinstance(cmd, MultiCommand): - return - if register: - hint = ( - "It is not possible to add multi commands as children to" - " another multi command that is in chain mode." - ) - else: - hint = ( - "Found a multi command as subcommand to a multi command" - " that is in chain mode. This is not supported." - ) - raise RuntimeError( - f"{hint}. Command {base_command.name!r} is set to chain and" - f" {cmd_name!r} was added as a subcommand but it in itself is a" - f" multi command. ({cmd_name!r} is a {type(cmd).__name__}" - f" within a chained {type(base_command).__name__} named" - f" {base_command.name!r})." - ) - - -def batch(iterable: t.Iterable[V], batch_size: int) -> t.List[t.Tuple[V, ...]]: - return list(zip(*repeat(iter(iterable), batch_size))) - - -@contextmanager -def augment_usage_errors( - ctx: "Context", param: t.Optional["Parameter"] = None -) -> t.Iterator[None]: - """Context manager that attaches extra information to exceptions.""" - try: - yield - except BadParameter as e: - if e.ctx is None: - e.ctx = ctx - if param is not None and e.param is None: - e.param = param - raise - except UsageError as e: - if e.ctx is None: - e.ctx = ctx - raise - - -def iter_params_for_processing( - invocation_order: t.Sequence["Parameter"], - declaration_order: t.Sequence["Parameter"], -) -> t.List["Parameter"]: - """Given a sequence of parameters in the order as should be considered - for processing and an iterable of parameters that exist, this returns - a list in the correct order as they should be processed. - """ - - def sort_key(item: "Parameter") -> t.Tuple[bool, float]: - try: - idx: float = invocation_order.index(item) - except ValueError: - idx = float("inf") - - return not item.is_eager, idx - - return sorted(declaration_order, key=sort_key) - - -class ParameterSource(enum.Enum): - """This is an :class:`~enum.Enum` that indicates the source of a - parameter's value. - - Use :meth:`click.Context.get_parameter_source` to get the - source for a parameter by name. - - .. versionchanged:: 8.0 - Use :class:`~enum.Enum` and drop the ``validate`` method. - - .. versionchanged:: 8.0 - Added the ``PROMPT`` value. - """ - - COMMANDLINE = enum.auto() - """The value was provided by the command line args.""" - ENVIRONMENT = enum.auto() - """The value was provided with an environment variable.""" - DEFAULT = enum.auto() - """Used the default specified by the parameter.""" - DEFAULT_MAP = enum.auto() - """Used a default provided by :attr:`Context.default_map`.""" - PROMPT = enum.auto() - """Used a prompt to confirm a default or provide a value.""" - - -class Context: - """The context is a special internal object that holds state relevant - for the script execution at every single level. It's normally invisible - to commands unless they opt-in to getting access to it. - - The context is useful as it can pass internal objects around and can - control special execution features such as reading data from - environment variables. - - A context can be used as context manager in which case it will call - :meth:`close` on teardown. - - :param command: the command class for this context. - :param parent: the parent context. - :param info_name: the info name for this invocation. Generally this - is the most descriptive name for the script or - command. For the toplevel script it is usually - the name of the script, for commands below it it's - the name of the script. - :param obj: an arbitrary object of user data. - :param auto_envvar_prefix: the prefix to use for automatic environment - variables. If this is `None` then reading - from environment variables is disabled. This - does not affect manually set environment - variables which are always read. - :param default_map: a dictionary (like object) with default values - for parameters. - :param terminal_width: the width of the terminal. The default is - inherit from parent context. If no context - defines the terminal width then auto - detection will be applied. - :param max_content_width: the maximum width for content rendered by - Click (this currently only affects help - pages). This defaults to 80 characters if - not overridden. In other words: even if the - terminal is larger than that, Click will not - format things wider than 80 characters by - default. In addition to that, formatters might - add some safety mapping on the right. - :param resilient_parsing: if this flag is enabled then Click will - parse without any interactivity or callback - invocation. Default values will also be - ignored. This is useful for implementing - things such as completion support. - :param allow_extra_args: if this is set to `True` then extra arguments - at the end will not raise an error and will be - kept on the context. The default is to inherit - from the command. - :param allow_interspersed_args: if this is set to `False` then options - and arguments cannot be mixed. The - default is to inherit from the command. - :param ignore_unknown_options: instructs click to ignore options it does - not know and keeps them for later - processing. - :param help_option_names: optionally a list of strings that define how - the default help parameter is named. The - default is ``['--help']``. - :param token_normalize_func: an optional function that is used to - normalize tokens (options, choices, - etc.). This for instance can be used to - implement case insensitive behavior. - :param color: controls if the terminal supports ANSI colors or not. The - default is autodetection. This is only needed if ANSI - codes are used in texts that Click prints which is by - default not the case. This for instance would affect - help output. - :param show_default: Show the default value for commands. If this - value is not set, it defaults to the value from the parent - context. ``Command.show_default`` overrides this default for the - specific command. - - .. versionchanged:: 8.1 - The ``show_default`` parameter is overridden by - ``Command.show_default``, instead of the other way around. - - .. versionchanged:: 8.0 - The ``show_default`` parameter defaults to the value from the - parent context. - - .. versionchanged:: 7.1 - Added the ``show_default`` parameter. - - .. versionchanged:: 4.0 - Added the ``color``, ``ignore_unknown_options``, and - ``max_content_width`` parameters. - - .. versionchanged:: 3.0 - Added the ``allow_extra_args`` and ``allow_interspersed_args`` - parameters. - - .. versionchanged:: 2.0 - Added the ``resilient_parsing``, ``help_option_names``, and - ``token_normalize_func`` parameters. - """ - - #: The formatter class to create with :meth:`make_formatter`. - #: - #: .. versionadded:: 8.0 - formatter_class: t.Type["HelpFormatter"] = HelpFormatter - - def __init__( - self, - command: "Command", - parent: t.Optional["Context"] = None, - info_name: t.Optional[str] = None, - obj: t.Optional[t.Any] = None, - auto_envvar_prefix: t.Optional[str] = None, - default_map: t.Optional[t.Dict[str, t.Any]] = None, - terminal_width: t.Optional[int] = None, - max_content_width: t.Optional[int] = None, - resilient_parsing: bool = False, - allow_extra_args: t.Optional[bool] = None, - allow_interspersed_args: t.Optional[bool] = None, - ignore_unknown_options: t.Optional[bool] = None, - help_option_names: t.Optional[t.List[str]] = None, - token_normalize_func: t.Optional[t.Callable[[str], str]] = None, - color: t.Optional[bool] = None, - show_default: t.Optional[bool] = None, - ) -> None: - #: the parent context or `None` if none exists. - self.parent = parent - #: the :class:`Command` for this context. - self.command = command - #: the descriptive information name - self.info_name = info_name - #: Map of parameter names to their parsed values. Parameters - #: with ``expose_value=False`` are not stored. - self.params: t.Dict[str, t.Any] = {} - #: the leftover arguments. - self.args: t.List[str] = [] - #: protected arguments. These are arguments that are prepended - #: to `args` when certain parsing scenarios are encountered but - #: must be never propagated to another arguments. This is used - #: to implement nested parsing. - self.protected_args: t.List[str] = [] - #: the collected prefixes of the command's options. - self._opt_prefixes: t.Set[str] = set(parent._opt_prefixes) if parent else set() - - if obj is None and parent is not None: - obj = parent.obj - - #: the user object stored. - self.obj: t.Any = obj - self._meta: t.Dict[str, t.Any] = getattr(parent, "meta", {}) - - #: A dictionary (-like object) with defaults for parameters. - if ( - default_map is None - and info_name is not None - and parent is not None - and parent.default_map is not None - ): - default_map = parent.default_map.get(info_name) - - self.default_map: t.Optional[t.Dict[str, t.Any]] = default_map - - #: This flag indicates if a subcommand is going to be executed. A - #: group callback can use this information to figure out if it's - #: being executed directly or because the execution flow passes - #: onwards to a subcommand. By default it's None, but it can be - #: the name of the subcommand to execute. - #: - #: If chaining is enabled this will be set to ``'*'`` in case - #: any commands are executed. It is however not possible to - #: figure out which ones. If you require this knowledge you - #: should use a :func:`result_callback`. - self.invoked_subcommand: t.Optional[str] = None - - if terminal_width is None and parent is not None: - terminal_width = parent.terminal_width - - #: The width of the terminal (None is autodetection). - self.terminal_width: t.Optional[int] = terminal_width - - if max_content_width is None and parent is not None: - max_content_width = parent.max_content_width - - #: The maximum width of formatted content (None implies a sensible - #: default which is 80 for most things). - self.max_content_width: t.Optional[int] = max_content_width - - if allow_extra_args is None: - allow_extra_args = command.allow_extra_args - - #: Indicates if the context allows extra args or if it should - #: fail on parsing. - #: - #: .. versionadded:: 3.0 - self.allow_extra_args = allow_extra_args - - if allow_interspersed_args is None: - allow_interspersed_args = command.allow_interspersed_args - - #: Indicates if the context allows mixing of arguments and - #: options or not. - #: - #: .. versionadded:: 3.0 - self.allow_interspersed_args: bool = allow_interspersed_args - - if ignore_unknown_options is None: - ignore_unknown_options = command.ignore_unknown_options - - #: Instructs click to ignore options that a command does not - #: understand and will store it on the context for later - #: processing. This is primarily useful for situations where you - #: want to call into external programs. Generally this pattern is - #: strongly discouraged because it's not possibly to losslessly - #: forward all arguments. - #: - #: .. versionadded:: 4.0 - self.ignore_unknown_options: bool = ignore_unknown_options - - if help_option_names is None: - if parent is not None: - help_option_names = parent.help_option_names - else: - help_option_names = ["--help"] - - #: The names for the help options. - self.help_option_names: t.List[str] = help_option_names - - if token_normalize_func is None and parent is not None: - token_normalize_func = parent.token_normalize_func - - #: An optional normalization function for tokens. This is - #: options, choices, commands etc. - self.token_normalize_func: t.Optional[ - t.Callable[[str], str] - ] = token_normalize_func - - #: Indicates if resilient parsing is enabled. In that case Click - #: will do its best to not cause any failures and default values - #: will be ignored. Useful for completion. - self.resilient_parsing: bool = resilient_parsing - - # If there is no envvar prefix yet, but the parent has one and - # the command on this level has a name, we can expand the envvar - # prefix automatically. - if auto_envvar_prefix is None: - if ( - parent is not None - and parent.auto_envvar_prefix is not None - and self.info_name is not None - ): - auto_envvar_prefix = ( - f"{parent.auto_envvar_prefix}_{self.info_name.upper()}" - ) - else: - auto_envvar_prefix = auto_envvar_prefix.upper() - - if auto_envvar_prefix is not None: - auto_envvar_prefix = auto_envvar_prefix.replace("-", "_") - - self.auto_envvar_prefix: t.Optional[str] = auto_envvar_prefix - - if color is None and parent is not None: - color = parent.color - - #: Controls if styling output is wanted or not. - self.color: t.Optional[bool] = color - - if show_default is None and parent is not None: - show_default = parent.show_default - - #: Show option default values when formatting help text. - self.show_default: t.Optional[bool] = show_default - - self._close_callbacks: t.List[t.Callable[[], t.Any]] = [] - self._depth = 0 - self._parameter_source: t.Dict[str, ParameterSource] = {} - self._exit_stack = ExitStack() - - def to_info_dict(self) -> t.Dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. This traverses the entire CLI - structure. - - .. code-block:: python - - with Context(cli) as ctx: - info = ctx.to_info_dict() - - .. versionadded:: 8.0 - """ - return { - "command": self.command.to_info_dict(self), - "info_name": self.info_name, - "allow_extra_args": self.allow_extra_args, - "allow_interspersed_args": self.allow_interspersed_args, - "ignore_unknown_options": self.ignore_unknown_options, - "auto_envvar_prefix": self.auto_envvar_prefix, - } - - def __enter__(self) -> "Context": - self._depth += 1 - push_context(self) - return self - - def __exit__(self, exc_type, exc_value, tb): # type: ignore - self._depth -= 1 - if self._depth == 0: - self.close() - pop_context() - - @contextmanager - def scope(self, cleanup: bool = True) -> t.Iterator["Context"]: - """This helper method can be used with the context object to promote - it to the current thread local (see :func:`get_current_context`). - The default behavior of this is to invoke the cleanup functions which - can be disabled by setting `cleanup` to `False`. The cleanup - functions are typically used for things such as closing file handles. - - If the cleanup is intended the context object can also be directly - used as a context manager. - - Example usage:: - - with ctx.scope(): - assert get_current_context() is ctx - - This is equivalent:: - - with ctx: - assert get_current_context() is ctx - - .. versionadded:: 5.0 - - :param cleanup: controls if the cleanup functions should be run or - not. The default is to run these functions. In - some situations the context only wants to be - temporarily pushed in which case this can be disabled. - Nested pushes automatically defer the cleanup. - """ - if not cleanup: - self._depth += 1 - try: - with self as rv: - yield rv - finally: - if not cleanup: - self._depth -= 1 - - @property - def meta(self) -> t.Dict[str, t.Any]: - """This is a dictionary which is shared with all the contexts - that are nested. It exists so that click utilities can store some - state here if they need to. It is however the responsibility of - that code to manage this dictionary well. - - The keys are supposed to be unique dotted strings. For instance - module paths are a good choice for it. What is stored in there is - irrelevant for the operation of click. However what is important is - that code that places data here adheres to the general semantics of - the system. - - Example usage:: - - LANG_KEY = f'{__name__}.lang' - - def set_language(value): - ctx = get_current_context() - ctx.meta[LANG_KEY] = value - - def get_language(): - return get_current_context().meta.get(LANG_KEY, 'en_US') - - .. versionadded:: 5.0 - """ - return self._meta - - def make_formatter(self) -> HelpFormatter: - """Creates the :class:`~click.HelpFormatter` for the help and - usage output. - - To quickly customize the formatter class used without overriding - this method, set the :attr:`formatter_class` attribute. - - .. versionchanged:: 8.0 - Added the :attr:`formatter_class` attribute. - """ - return self.formatter_class( - width=self.terminal_width, max_width=self.max_content_width - ) - - def with_resource(self, context_manager: t.ContextManager[V]) -> V: - """Register a resource as if it were used in a ``with`` - statement. The resource will be cleaned up when the context is - popped. - - Uses :meth:`contextlib.ExitStack.enter_context`. It calls the - resource's ``__enter__()`` method and returns the result. When - the context is popped, it closes the stack, which calls the - resource's ``__exit__()`` method. - - To register a cleanup function for something that isn't a - context manager, use :meth:`call_on_close`. Or use something - from :mod:`contextlib` to turn it into a context manager first. - - .. code-block:: python - - @click.group() - @click.option("--name") - @click.pass_context - def cli(ctx): - ctx.obj = ctx.with_resource(connect_db(name)) - - :param context_manager: The context manager to enter. - :return: Whatever ``context_manager.__enter__()`` returns. - - .. versionadded:: 8.0 - """ - return self._exit_stack.enter_context(context_manager) - - def call_on_close(self, f: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: - """Register a function to be called when the context tears down. - - This can be used to close resources opened during the script - execution. Resources that support Python's context manager - protocol which would be used in a ``with`` statement should be - registered with :meth:`with_resource` instead. - - :param f: The function to execute on teardown. - """ - return self._exit_stack.callback(f) - - def close(self) -> None: - """Invoke all close callbacks registered with - :meth:`call_on_close`, and exit all context managers entered - with :meth:`with_resource`. - """ - self._exit_stack.close() - # In case the context is reused, create a new exit stack. - self._exit_stack = ExitStack() - - @property - def command_path(self) -> str: - """The computed command path. This is used for the ``usage`` - information on the help page. It's automatically created by - combining the info names of the chain of contexts to the root. - """ - rv = "" - if self.info_name is not None: - rv = self.info_name - if self.parent is not None: - parent_command_path = [self.parent.command_path] - - if isinstance(self.parent.command, Command): - for param in self.parent.command.get_params(self): - parent_command_path.extend(param.get_usage_pieces(self)) - - rv = f"{' '.join(parent_command_path)} {rv}" - return rv.lstrip() - - def find_root(self) -> "Context": - """Finds the outermost context.""" - node = self - while node.parent is not None: - node = node.parent - return node - - def find_object(self, object_type: t.Type[V]) -> t.Optional[V]: - """Finds the closest object of a given type.""" - node: t.Optional["Context"] = self - - while node is not None: - if isinstance(node.obj, object_type): - return node.obj - - node = node.parent - - return None - - def ensure_object(self, object_type: t.Type[V]) -> V: - """Like :meth:`find_object` but sets the innermost object to a - new instance of `object_type` if it does not exist. - """ - rv = self.find_object(object_type) - if rv is None: - self.obj = rv = object_type() - return rv - - @t.overload - def lookup_default( - self, name: str, call: "te.Literal[True]" = True - ) -> t.Optional[t.Any]: - ... - - @t.overload - def lookup_default( - self, name: str, call: "te.Literal[False]" = ... - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - ... - - def lookup_default(self, name: str, call: bool = True) -> t.Optional[t.Any]: - """Get the default for a parameter from :attr:`default_map`. - - :param name: Name of the parameter. - :param call: If the default is a callable, call it. Disable to - return the callable instead. - - .. versionchanged:: 8.0 - Added the ``call`` parameter. - """ - if self.default_map is not None: - value = self.default_map.get(name) - - if call and callable(value): - return value() - - return value - - return None - - def fail(self, message: str) -> "te.NoReturn": - """Aborts the execution of the program with a specific error - message. - - :param message: the error message to fail with. - """ - raise UsageError(message, self) - - def abort(self) -> "te.NoReturn": - """Aborts the script.""" - raise Abort() - - def exit(self, code: int = 0) -> "te.NoReturn": - """Exits the application with a given exit code.""" - raise Exit(code) - - def get_usage(self) -> str: - """Helper method to get formatted usage string for the current - context and command. - """ - return self.command.get_usage(self) - - def get_help(self) -> str: - """Helper method to get formatted help page for the current - context and command. - """ - return self.command.get_help(self) - - def _make_sub_context(self, command: "Command") -> "Context": - """Create a new context of the same type as this context, but - for a new command. - - :meta private: - """ - return type(self)(command, info_name=command.name, parent=self) - - def invoke( - __self, # noqa: B902 - __callback: t.Union["Command", t.Callable[..., t.Any]], - *args: t.Any, - **kwargs: t.Any, - ) -> t.Any: - """Invokes a command callback in exactly the way it expects. There - are two ways to invoke this method: - - 1. the first argument can be a callback and all other arguments and - keyword arguments are forwarded directly to the function. - 2. the first argument is a click command object. In that case all - arguments are forwarded as well but proper click parameters - (options and click arguments) must be keyword arguments and Click - will fill in defaults. - - Note that before Click 3.2 keyword arguments were not properly filled - in against the intention of this code and no context was created. For - more information about this change and why it was done in a bugfix - release see :ref:`upgrade-to-3.2`. - - .. versionchanged:: 8.0 - All ``kwargs`` are tracked in :attr:`params` so they will be - passed if :meth:`forward` is called at multiple levels. - """ - if isinstance(__callback, Command): - other_cmd = __callback - - if other_cmd.callback is None: - raise TypeError( - "The given command does not have a callback that can be invoked." - ) - else: - __callback = other_cmd.callback - - ctx = __self._make_sub_context(other_cmd) - - for param in other_cmd.params: - if param.name not in kwargs and param.expose_value: - kwargs[param.name] = param.type_cast_value( # type: ignore - ctx, param.get_default(ctx) - ) - - # Track all kwargs as params, so that forward() will pass - # them on in subsequent calls. - ctx.params.update(kwargs) - else: - ctx = __self - - with augment_usage_errors(__self): - with ctx: - return __callback(*args, **kwargs) - - def forward( - __self, __cmd: "Command", *args: t.Any, **kwargs: t.Any # noqa: B902 - ) -> t.Any: - """Similar to :meth:`invoke` but fills in default keyword - arguments from the current context if the other command expects - it. This cannot invoke callbacks directly, only other commands. - - .. versionchanged:: 8.0 - All ``kwargs`` are tracked in :attr:`params` so they will be - passed if ``forward`` is called at multiple levels. - """ - # Can only forward to other commands, not direct callbacks. - if not isinstance(__cmd, Command): - raise TypeError("Callback is not a command.") - - for param in __self.params: - if param not in kwargs: - kwargs[param] = __self.params[param] - - return __self.invoke(__cmd, *args, **kwargs) - - def set_parameter_source(self, name: str, source: ParameterSource) -> None: - """Set the source of a parameter. This indicates the location - from which the value of the parameter was obtained. - - :param name: The name of the parameter. - :param source: A member of :class:`~click.core.ParameterSource`. - """ - self._parameter_source[name] = source - - def get_parameter_source(self, name: str) -> t.Optional[ParameterSource]: - """Get the source of a parameter. This indicates the location - from which the value of the parameter was obtained. - - This can be useful for determining when a user specified a value - on the command line that is the same as the default value. It - will be :attr:`~click.core.ParameterSource.DEFAULT` only if the - value was actually taken from the default. - - :param name: The name of the parameter. - :rtype: ParameterSource - - .. versionchanged:: 8.0 - Returns ``None`` if the parameter was not provided from any - source. - """ - return self._parameter_source.get(name) - - -class BaseCommand: - """The base command implements the minimal API contract of commands. - Most code will never use this as it does not implement a lot of useful - functionality but it can act as the direct subclass of alternative - parsing methods that do not depend on the Click parser. - - For instance, this can be used to bridge Click and other systems like - argparse or docopt. - - Because base commands do not implement a lot of the API that other - parts of Click take for granted, they are not supported for all - operations. For instance, they cannot be used with the decorators - usually and they have no built-in callback system. - - .. versionchanged:: 2.0 - Added the `context_settings` parameter. - - :param name: the name of the command to use unless a group overrides it. - :param context_settings: an optional dictionary with defaults that are - passed to the context object. - """ - - #: The context class to create with :meth:`make_context`. - #: - #: .. versionadded:: 8.0 - context_class: t.Type[Context] = Context - #: the default for the :attr:`Context.allow_extra_args` flag. - allow_extra_args = False - #: the default for the :attr:`Context.allow_interspersed_args` flag. - allow_interspersed_args = True - #: the default for the :attr:`Context.ignore_unknown_options` flag. - ignore_unknown_options = False - - def __init__( - self, - name: t.Optional[str], - context_settings: t.Optional[t.Dict[str, t.Any]] = None, - ) -> None: - #: the name the command thinks it has. Upon registering a command - #: on a :class:`Group` the group will default the command name - #: with this information. You should instead use the - #: :class:`Context`\'s :attr:`~Context.info_name` attribute. - self.name = name - - if context_settings is None: - context_settings = {} - - #: an optional dictionary with defaults passed to the context. - self.context_settings: t.Dict[str, t.Any] = context_settings - - def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. This traverses the entire structure - below this command. - - Use :meth:`click.Context.to_info_dict` to traverse the entire - CLI structure. - - :param ctx: A :class:`Context` representing this command. - - .. versionadded:: 8.0 - """ - return {"name": self.name} - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.name}>" - - def get_usage(self, ctx: Context) -> str: - raise NotImplementedError("Base commands cannot get usage") - - def get_help(self, ctx: Context) -> str: - raise NotImplementedError("Base commands cannot get help") - - def make_context( - self, - info_name: t.Optional[str], - args: t.List[str], - parent: t.Optional[Context] = None, - **extra: t.Any, - ) -> Context: - """This function when given an info name and arguments will kick - off the parsing and create a new :class:`Context`. It does not - invoke the actual command callback though. - - To quickly customize the context class used without overriding - this method, set the :attr:`context_class` attribute. - - :param info_name: the info name for this invocation. Generally this - is the most descriptive name for the script or - command. For the toplevel script it's usually - the name of the script, for commands below it it's - the name of the command. - :param args: the arguments to parse as list of strings. - :param parent: the parent context if available. - :param extra: extra keyword arguments forwarded to the context - constructor. - - .. versionchanged:: 8.0 - Added the :attr:`context_class` attribute. - """ - for key, value in self.context_settings.items(): - if key not in extra: - extra[key] = value - - ctx = self.context_class( - self, info_name=info_name, parent=parent, **extra # type: ignore - ) - - with ctx.scope(cleanup=False): - self.parse_args(ctx, args) - return ctx - - def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: - """Given a context and a list of arguments this creates the parser - and parses the arguments, then modifies the context as necessary. - This is automatically invoked by :meth:`make_context`. - """ - raise NotImplementedError("Base commands do not know how to parse arguments.") - - def invoke(self, ctx: Context) -> t.Any: - """Given a context, this invokes the command. The default - implementation is raising a not implemented error. - """ - raise NotImplementedError("Base commands are not invokable by default") - - def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: - """Return a list of completions for the incomplete value. Looks - at the names of chained multi-commands. - - Any command could be part of a chained multi-command, so sibling - commands are valid at any point during command completion. Other - command classes will return more completions. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - results: t.List["CompletionItem"] = [] - - while ctx.parent is not None: - ctx = ctx.parent - - if isinstance(ctx.command, MultiCommand) and ctx.command.chain: - results.extend( - CompletionItem(name, help=command.get_short_help_str()) - for name, command in _complete_visible_commands(ctx, incomplete) - if name not in ctx.protected_args - ) - - return results - - @t.overload - def main( - self, - args: t.Optional[t.Sequence[str]] = None, - prog_name: t.Optional[str] = None, - complete_var: t.Optional[str] = None, - standalone_mode: "te.Literal[True]" = True, - **extra: t.Any, - ) -> "te.NoReturn": - ... - - @t.overload - def main( - self, - args: t.Optional[t.Sequence[str]] = None, - prog_name: t.Optional[str] = None, - complete_var: t.Optional[str] = None, - standalone_mode: bool = ..., - **extra: t.Any, - ) -> t.Any: - ... - - def main( - self, - args: t.Optional[t.Sequence[str]] = None, - prog_name: t.Optional[str] = None, - complete_var: t.Optional[str] = None, - standalone_mode: bool = True, - windows_expand_args: bool = True, - **extra: t.Any, - ) -> t.Any: - """This is the way to invoke a script with all the bells and - whistles as a command line application. This will always terminate - the application after a call. If this is not wanted, ``SystemExit`` - needs to be caught. - - This method is also available by directly calling the instance of - a :class:`Command`. - - :param args: the arguments that should be used for parsing. If not - provided, ``sys.argv[1:]`` is used. - :param prog_name: the program name that should be used. By default - the program name is constructed by taking the file - name from ``sys.argv[0]``. - :param complete_var: the environment variable that controls the - bash completion support. The default is - ``"__COMPLETE"`` with prog_name in - uppercase. - :param standalone_mode: the default behavior is to invoke the script - in standalone mode. Click will then - handle exceptions and convert them into - error messages and the function will never - return but shut down the interpreter. If - this is set to `False` they will be - propagated to the caller and the return - value of this function is the return value - of :meth:`invoke`. - :param windows_expand_args: Expand glob patterns, user dir, and - env vars in command line args on Windows. - :param extra: extra keyword arguments are forwarded to the context - constructor. See :class:`Context` for more information. - - .. versionchanged:: 8.0.1 - Added the ``windows_expand_args`` parameter to allow - disabling command line arg expansion on Windows. - - .. versionchanged:: 8.0 - When taking arguments from ``sys.argv`` on Windows, glob - patterns, user dir, and env vars are expanded. - - .. versionchanged:: 3.0 - Added the ``standalone_mode`` parameter. - """ - if args is None: - args = sys.argv[1:] - - if os.name == "nt" and windows_expand_args: - args = _expand_args(args) - else: - args = list(args) - - if prog_name is None: - prog_name = _detect_program_name() - - # Process shell completion requests and exit early. - self._main_shell_completion(extra, prog_name, complete_var) - - try: - try: - with self.make_context(prog_name, args, **extra) as ctx: - rv = self.invoke(ctx) - if not standalone_mode: - return rv - # it's not safe to `ctx.exit(rv)` here! - # note that `rv` may actually contain data like "1" which - # has obvious effects - # more subtle case: `rv=[None, None]` can come out of - # chained commands which all returned `None` -- so it's not - # even always obvious that `rv` indicates success/failure - # by its truthiness/falsiness - ctx.exit() - except (EOFError, KeyboardInterrupt): - echo(file=sys.stderr) - raise Abort() from None - except ClickException as e: - if not standalone_mode: - raise - e.show() - sys.exit(e.exit_code) - except OSError as e: - if e.errno == errno.EPIPE: - sys.stdout = t.cast(t.TextIO, PacifyFlushWrapper(sys.stdout)) - sys.stderr = t.cast(t.TextIO, PacifyFlushWrapper(sys.stderr)) - sys.exit(1) - else: - raise - except Exit as e: - if standalone_mode: - sys.exit(e.exit_code) - else: - # in non-standalone mode, return the exit code - # note that this is only reached if `self.invoke` above raises - # an Exit explicitly -- thus bypassing the check there which - # would return its result - # the results of non-standalone execution may therefore be - # somewhat ambiguous: if there are codepaths which lead to - # `ctx.exit(1)` and to `return 1`, the caller won't be able to - # tell the difference between the two - return e.exit_code - except Abort: - if not standalone_mode: - raise - echo(_("Aborted!"), file=sys.stderr) - sys.exit(1) - - def _main_shell_completion( - self, - ctx_args: t.Dict[str, t.Any], - prog_name: str, - complete_var: t.Optional[str] = None, - ) -> None: - """Check if the shell is asking for tab completion, process - that, then exit early. Called from :meth:`main` before the - program is invoked. - - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. Defaults to - ``_{PROG_NAME}_COMPLETE``. - """ - if complete_var is None: - complete_var = f"_{prog_name}_COMPLETE".replace("-", "_").upper() - - instruction = os.environ.get(complete_var) - - if not instruction: - return - - from .shell_completion import shell_complete - - rv = shell_complete(self, ctx_args, prog_name, complete_var, instruction) - sys.exit(rv) - - def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Any: - """Alias for :meth:`main`.""" - return self.main(*args, **kwargs) - - -class Command(BaseCommand): - """Commands are the basic building block of command line interfaces in - Click. A basic command handles command line parsing and might dispatch - more parsing to commands nested below it. - - :param name: the name of the command to use unless a group overrides it. - :param context_settings: an optional dictionary with defaults that are - passed to the context object. - :param callback: the callback to invoke. This is optional. - :param params: the parameters to register with this command. This can - be either :class:`Option` or :class:`Argument` objects. - :param help: the help string to use for this command. - :param epilog: like the help string but it's printed at the end of the - help page after everything else. - :param short_help: the short help to use for this command. This is - shown on the command listing of the parent command. - :param add_help_option: by default each command registers a ``--help`` - option. This can be disabled by this parameter. - :param no_args_is_help: this controls what happens if no arguments are - provided. This option is disabled by default. - If enabled this will add ``--help`` as argument - if no arguments are passed - :param hidden: hide this command from help outputs. - - :param deprecated: issues a message indicating that - the command is deprecated. - - .. versionchanged:: 8.1 - ``help``, ``epilog``, and ``short_help`` are stored unprocessed, - all formatting is done when outputting help text, not at init, - and is done even if not using the ``@command`` decorator. - - .. versionchanged:: 8.0 - Added a ``repr`` showing the command name. - - .. versionchanged:: 7.1 - Added the ``no_args_is_help`` parameter. - - .. versionchanged:: 2.0 - Added the ``context_settings`` parameter. - """ - - def __init__( - self, - name: t.Optional[str], - context_settings: t.Optional[t.Dict[str, t.Any]] = None, - callback: t.Optional[t.Callable[..., t.Any]] = None, - params: t.Optional[t.List["Parameter"]] = None, - help: t.Optional[str] = None, - epilog: t.Optional[str] = None, - short_help: t.Optional[str] = None, - options_metavar: t.Optional[str] = "[OPTIONS]", - add_help_option: bool = True, - no_args_is_help: bool = False, - hidden: bool = False, - deprecated: bool = False, - ) -> None: - super().__init__(name, context_settings) - #: the callback to execute when the command fires. This might be - #: `None` in which case nothing happens. - self.callback = callback - #: the list of parameters for this command in the order they - #: should show up in the help page and execute. Eager parameters - #: will automatically be handled before non eager ones. - self.params: t.List["Parameter"] = params or [] - self.help = help - self.epilog = epilog - self.options_metavar = options_metavar - self.short_help = short_help - self.add_help_option = add_help_option - self.no_args_is_help = no_args_is_help - self.hidden = hidden - self.deprecated = deprecated - - def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict(ctx) - info_dict.update( - params=[param.to_info_dict() for param in self.get_params(ctx)], - help=self.help, - epilog=self.epilog, - short_help=self.short_help, - hidden=self.hidden, - deprecated=self.deprecated, - ) - return info_dict - - def get_usage(self, ctx: Context) -> str: - """Formats the usage line into a string and returns it. - - Calls :meth:`format_usage` internally. - """ - formatter = ctx.make_formatter() - self.format_usage(ctx, formatter) - return formatter.getvalue().rstrip("\n") - - def get_params(self, ctx: Context) -> t.List["Parameter"]: - rv = self.params - help_option = self.get_help_option(ctx) - - if help_option is not None: - rv = [*rv, help_option] - - return rv - - def format_usage(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the usage line into the formatter. - - This is a low-level method called by :meth:`get_usage`. - """ - pieces = self.collect_usage_pieces(ctx) - formatter.write_usage(ctx.command_path, " ".join(pieces)) - - def collect_usage_pieces(self, ctx: Context) -> t.List[str]: - """Returns all the pieces that go into the usage line and returns - it as a list of strings. - """ - rv = [self.options_metavar] if self.options_metavar else [] - - for param in self.get_params(ctx): - rv.extend(param.get_usage_pieces(ctx)) - - return rv - - def get_help_option_names(self, ctx: Context) -> t.List[str]: - """Returns the names for the help option.""" - all_names = set(ctx.help_option_names) - for param in self.params: - all_names.difference_update(param.opts) - all_names.difference_update(param.secondary_opts) - return list(all_names) - - def get_help_option(self, ctx: Context) -> t.Optional["Option"]: - """Returns the help option object.""" - help_options = self.get_help_option_names(ctx) - - if not help_options or not self.add_help_option: - return None - - def show_help(ctx: Context, param: "Parameter", value: str) -> None: - if value and not ctx.resilient_parsing: - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - return Option( - help_options, - is_flag=True, - is_eager=True, - expose_value=False, - callback=show_help, - help=_("Show this message and exit."), - ) - - def make_parser(self, ctx: Context) -> OptionParser: - """Creates the underlying option parser for this command.""" - parser = OptionParser(ctx) - for param in self.get_params(ctx): - param.add_to_parser(parser, ctx) - return parser - - def get_help(self, ctx: Context) -> str: - """Formats the help into a string and returns it. - - Calls :meth:`format_help` internally. - """ - formatter = ctx.make_formatter() - self.format_help(ctx, formatter) - return formatter.getvalue().rstrip("\n") - - def get_short_help_str(self, limit: int = 45) -> str: - """Gets short help for the command or makes it by shortening the - long help string. - """ - if self.short_help: - text = inspect.cleandoc(self.short_help) - elif self.help: - text = make_default_short_help(self.help, limit) - else: - text = "" - - if self.deprecated: - text = _("(Deprecated) {text}").format(text=text) - - return text.strip() - - def format_help(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the help into the formatter if it exists. - - This is a low-level method called by :meth:`get_help`. - - This calls the following methods: - - - :meth:`format_usage` - - :meth:`format_help_text` - - :meth:`format_options` - - :meth:`format_epilog` - """ - self.format_usage(ctx, formatter) - self.format_help_text(ctx, formatter) - self.format_options(ctx, formatter) - self.format_epilog(ctx, formatter) - - def format_help_text(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the help text to the formatter if it exists.""" - text = self.help if self.help is not None else "" - - if self.deprecated: - text = _("(Deprecated) {text}").format(text=text) - - if text: - text = inspect.cleandoc(text).partition("\f")[0] - formatter.write_paragraph() - - with formatter.indentation(): - formatter.write_text(text) - - def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes all the options into the formatter if they exist.""" - opts = [] - for param in self.get_params(ctx): - rv = param.get_help_record(ctx) - if rv is not None: - opts.append(rv) - - if opts: - with formatter.section(_("Options")): - formatter.write_dl(opts) - - def format_epilog(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the epilog into the formatter if it exists.""" - if self.epilog: - epilog = inspect.cleandoc(self.epilog) - formatter.write_paragraph() - - with formatter.indentation(): - formatter.write_text(epilog) - - def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: - if not args and self.no_args_is_help and not ctx.resilient_parsing: - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - parser = self.make_parser(ctx) - opts, args, param_order = parser.parse_args(args=args) - - for param in iter_params_for_processing(param_order, self.get_params(ctx)): - value, args = param.handle_parse_result(ctx, opts, args) - - if args and not ctx.allow_extra_args and not ctx.resilient_parsing: - ctx.fail( - ngettext( - "Got unexpected extra argument ({args})", - "Got unexpected extra arguments ({args})", - len(args), - ).format(args=" ".join(map(str, args))) - ) - - ctx.args = args - ctx._opt_prefixes.update(parser._opt_prefixes) - return args - - def invoke(self, ctx: Context) -> t.Any: - """Given a context, this invokes the attached callback (if it exists) - in the right way. - """ - if self.deprecated: - message = _( - "DeprecationWarning: The command {name!r} is deprecated." - ).format(name=self.name) - echo(style(message, fg="red"), err=True) - - if self.callback is not None: - return ctx.invoke(self.callback, **ctx.params) - - def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: - """Return a list of completions for the incomplete value. Looks - at the names of options and chained multi-commands. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - results: t.List["CompletionItem"] = [] - - if incomplete and not incomplete[0].isalnum(): - for param in self.get_params(ctx): - if ( - not isinstance(param, Option) - or param.hidden - or ( - not param.multiple - and ctx.get_parameter_source(param.name) # type: ignore - is ParameterSource.COMMANDLINE - ) - ): - continue - - results.extend( - CompletionItem(name, help=param.help) - for name in [*param.opts, *param.secondary_opts] - if name.startswith(incomplete) - ) - - results.extend(super().shell_complete(ctx, incomplete)) - return results - - -class MultiCommand(Command): - """A multi command is the basic implementation of a command that - dispatches to subcommands. The most common version is the - :class:`Group`. - - :param invoke_without_command: this controls how the multi command itself - is invoked. By default it's only invoked - if a subcommand is provided. - :param no_args_is_help: this controls what happens if no arguments are - provided. This option is enabled by default if - `invoke_without_command` is disabled or disabled - if it's enabled. If enabled this will add - ``--help`` as argument if no arguments are - passed. - :param subcommand_metavar: the string that is used in the documentation - to indicate the subcommand place. - :param chain: if this is set to `True` chaining of multiple subcommands - is enabled. This restricts the form of commands in that - they cannot have optional arguments but it allows - multiple commands to be chained together. - :param result_callback: The result callback to attach to this multi - command. This can be set or changed later with the - :meth:`result_callback` decorator. - """ - - allow_extra_args = True - allow_interspersed_args = False - - def __init__( - self, - name: t.Optional[str] = None, - invoke_without_command: bool = False, - no_args_is_help: t.Optional[bool] = None, - subcommand_metavar: t.Optional[str] = None, - chain: bool = False, - result_callback: t.Optional[t.Callable[..., t.Any]] = None, - **attrs: t.Any, - ) -> None: - super().__init__(name, **attrs) - - if no_args_is_help is None: - no_args_is_help = not invoke_without_command - - self.no_args_is_help = no_args_is_help - self.invoke_without_command = invoke_without_command - - if subcommand_metavar is None: - if chain: - subcommand_metavar = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..." - else: - subcommand_metavar = "COMMAND [ARGS]..." - - self.subcommand_metavar = subcommand_metavar - self.chain = chain - # The result callback that is stored. This can be set or - # overridden with the :func:`result_callback` decorator. - self._result_callback = result_callback - - if self.chain: - for param in self.params: - if isinstance(param, Argument) and not param.required: - raise RuntimeError( - "Multi commands in chain mode cannot have" - " optional arguments." - ) - - def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict(ctx) - commands = {} - - for name in self.list_commands(ctx): - command = self.get_command(ctx, name) - - if command is None: - continue - - sub_ctx = ctx._make_sub_context(command) - - with sub_ctx.scope(cleanup=False): - commands[name] = command.to_info_dict(sub_ctx) - - info_dict.update(commands=commands, chain=self.chain) - return info_dict - - def collect_usage_pieces(self, ctx: Context) -> t.List[str]: - rv = super().collect_usage_pieces(ctx) - rv.append(self.subcommand_metavar) - return rv - - def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: - super().format_options(ctx, formatter) - self.format_commands(ctx, formatter) - - def result_callback(self, replace: bool = False) -> t.Callable[[F], F]: - """Adds a result callback to the command. By default if a - result callback is already registered this will chain them but - this can be disabled with the `replace` parameter. The result - callback is invoked with the return value of the subcommand - (or the list of return values from all subcommands if chaining - is enabled) as well as the parameters as they would be passed - to the main callback. - - Example:: - - @click.group() - @click.option('-i', '--input', default=23) - def cli(input): - return 42 - - @cli.result_callback() - def process_result(result, input): - return result + input - - :param replace: if set to `True` an already existing result - callback will be removed. - - .. versionchanged:: 8.0 - Renamed from ``resultcallback``. - - .. versionadded:: 3.0 - """ - - def decorator(f: F) -> F: - old_callback = self._result_callback - - if old_callback is None or replace: - self._result_callback = f - return f - - def function(__value, *args, **kwargs): # type: ignore - inner = old_callback(__value, *args, **kwargs) # type: ignore - return f(inner, *args, **kwargs) - - self._result_callback = rv = update_wrapper(t.cast(F, function), f) - return rv - - return decorator - - def format_commands(self, ctx: Context, formatter: HelpFormatter) -> None: - """Extra format methods for multi methods that adds all the commands - after the options. - """ - commands = [] - for subcommand in self.list_commands(ctx): - cmd = self.get_command(ctx, subcommand) - # What is this, the tool lied about a command. Ignore it - if cmd is None: - continue - if cmd.hidden: - continue - - commands.append((subcommand, cmd)) - - # allow for 3 times the default spacing - if len(commands): - limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) - - rows = [] - for subcommand, cmd in commands: - help = cmd.get_short_help_str(limit) - rows.append((subcommand, help)) - - if rows: - with formatter.section(_("Commands")): - formatter.write_dl(rows) - - def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: - if not args and self.no_args_is_help and not ctx.resilient_parsing: - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - rest = super().parse_args(ctx, args) - - if self.chain: - ctx.protected_args = rest - ctx.args = [] - elif rest: - ctx.protected_args, ctx.args = rest[:1], rest[1:] - - return ctx.args - - def invoke(self, ctx: Context) -> t.Any: - def _process_result(value: t.Any) -> t.Any: - if self._result_callback is not None: - value = ctx.invoke(self._result_callback, value, **ctx.params) - return value - - if not ctx.protected_args: - if self.invoke_without_command: - # No subcommand was invoked, so the result callback is - # invoked with the group return value for regular - # groups, or an empty list for chained groups. - with ctx: - rv = super().invoke(ctx) - return _process_result([] if self.chain else rv) - ctx.fail(_("Missing command.")) - - # Fetch args back out - args = [*ctx.protected_args, *ctx.args] - ctx.args = [] - ctx.protected_args = [] - - # If we're not in chain mode, we only allow the invocation of a - # single command but we also inform the current context about the - # name of the command to invoke. - if not self.chain: - # Make sure the context is entered so we do not clean up - # resources until the result processor has worked. - with ctx: - cmd_name, cmd, args = self.resolve_command(ctx, args) - assert cmd is not None - ctx.invoked_subcommand = cmd_name - super().invoke(ctx) - sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) - with sub_ctx: - return _process_result(sub_ctx.command.invoke(sub_ctx)) - - # In chain mode we create the contexts step by step, but after the - # base command has been invoked. Because at that point we do not - # know the subcommands yet, the invoked subcommand attribute is - # set to ``*`` to inform the command that subcommands are executed - # but nothing else. - with ctx: - ctx.invoked_subcommand = "*" if args else None - super().invoke(ctx) - - # Otherwise we make every single context and invoke them in a - # chain. In that case the return value to the result processor - # is the list of all invoked subcommand's results. - contexts = [] - while args: - cmd_name, cmd, args = self.resolve_command(ctx, args) - assert cmd is not None - sub_ctx = cmd.make_context( - cmd_name, - args, - parent=ctx, - allow_extra_args=True, - allow_interspersed_args=False, - ) - contexts.append(sub_ctx) - args, sub_ctx.args = sub_ctx.args, [] - - rv = [] - for sub_ctx in contexts: - with sub_ctx: - rv.append(sub_ctx.command.invoke(sub_ctx)) - return _process_result(rv) - - def resolve_command( - self, ctx: Context, args: t.List[str] - ) -> t.Tuple[t.Optional[str], t.Optional[Command], t.List[str]]: - cmd_name = make_str(args[0]) - original_cmd_name = cmd_name - - # Get the command - cmd = self.get_command(ctx, cmd_name) - - # If we can't find the command but there is a normalization - # function available, we try with that one. - if cmd is None and ctx.token_normalize_func is not None: - cmd_name = ctx.token_normalize_func(cmd_name) - cmd = self.get_command(ctx, cmd_name) - - # If we don't find the command we want to show an error message - # to the user that it was not provided. However, there is - # something else we should do: if the first argument looks like - # an option we want to kick off parsing again for arguments to - # resolve things like --help which now should go to the main - # place. - if cmd is None and not ctx.resilient_parsing: - if split_opt(cmd_name)[0]: - self.parse_args(ctx, ctx.args) - ctx.fail(_("No such command {name!r}.").format(name=original_cmd_name)) - return cmd_name if cmd else None, cmd, args[1:] - - def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: - """Given a context and a command name, this returns a - :class:`Command` object if it exists or returns `None`. - """ - raise NotImplementedError - - def list_commands(self, ctx: Context) -> t.List[str]: - """Returns a list of subcommand names in the order they should - appear. - """ - return [] - - def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: - """Return a list of completions for the incomplete value. Looks - at the names of options, subcommands, and chained - multi-commands. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - results = [ - CompletionItem(name, help=command.get_short_help_str()) - for name, command in _complete_visible_commands(ctx, incomplete) - ] - results.extend(super().shell_complete(ctx, incomplete)) - return results - - -class Group(MultiCommand): - """A group allows a command to have subcommands attached. This is - the most common way to implement nesting in Click. - - :param name: The name of the group command. - :param commands: A dict mapping names to :class:`Command` objects. - Can also be a list of :class:`Command`, which will use - :attr:`Command.name` to create the dict. - :param attrs: Other command arguments described in - :class:`MultiCommand`, :class:`Command`, and - :class:`BaseCommand`. - - .. versionchanged:: 8.0 - The ``commmands`` argument can be a list of command objects. - """ - - #: If set, this is used by the group's :meth:`command` decorator - #: as the default :class:`Command` class. This is useful to make all - #: subcommands use a custom command class. - #: - #: .. versionadded:: 8.0 - command_class: t.Optional[t.Type[Command]] = None - - #: If set, this is used by the group's :meth:`group` decorator - #: as the default :class:`Group` class. This is useful to make all - #: subgroups use a custom group class. - #: - #: If set to the special value :class:`type` (literally - #: ``group_class = type``), this group's class will be used as the - #: default class. This makes a custom group class continue to make - #: custom groups. - #: - #: .. versionadded:: 8.0 - group_class: t.Optional[t.Union[t.Type["Group"], t.Type[type]]] = None - # Literal[type] isn't valid, so use Type[type] - - def __init__( - self, - name: t.Optional[str] = None, - commands: t.Optional[t.Union[t.Dict[str, Command], t.Sequence[Command]]] = None, - **attrs: t.Any, - ) -> None: - super().__init__(name, **attrs) - - if commands is None: - commands = {} - elif isinstance(commands, abc.Sequence): - commands = {c.name: c for c in commands if c.name is not None} - - #: The registered subcommands by their exported names. - self.commands: t.Dict[str, Command] = commands - - def add_command(self, cmd: Command, name: t.Optional[str] = None) -> None: - """Registers another :class:`Command` with this group. If the name - is not provided, the name of the command is used. - """ - name = name or cmd.name - if name is None: - raise TypeError("Command has no name.") - _check_multicommand(self, name, cmd, register=True) - self.commands[name] = cmd - - @t.overload - def command(self, __func: t.Callable[..., t.Any]) -> Command: - ... - - @t.overload - def command( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], Command]: - ... - - def command( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Union[t.Callable[[t.Callable[..., t.Any]], Command], Command]: - """A shortcut decorator for declaring and attaching a command to - the group. This takes the same arguments as :func:`command` and - immediately registers the created command with this group by - calling :meth:`add_command`. - - To customize the command class used, set the - :attr:`command_class` attribute. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - - .. versionchanged:: 8.0 - Added the :attr:`command_class` attribute. - """ - from .decorators import command - - if self.command_class and kwargs.get("cls") is None: - kwargs["cls"] = self.command_class - - func: t.Optional[t.Callable] = None - - if args and callable(args[0]): - assert ( - len(args) == 1 and not kwargs - ), "Use 'command(**kwargs)(callable)' to provide arguments." - (func,) = args - args = () - - def decorator(f: t.Callable[..., t.Any]) -> Command: - cmd: Command = command(*args, **kwargs)(f) - self.add_command(cmd) - return cmd - - if func is not None: - return decorator(func) - - return decorator - - @t.overload - def group(self, __func: t.Callable[..., t.Any]) -> "Group": - ... - - @t.overload - def group( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], "Group"]: - ... - - def group( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Union[t.Callable[[t.Callable[..., t.Any]], "Group"], "Group"]: - """A shortcut decorator for declaring and attaching a group to - the group. This takes the same arguments as :func:`group` and - immediately registers the created group with this group by - calling :meth:`add_command`. - - To customize the group class used, set the :attr:`group_class` - attribute. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - - .. versionchanged:: 8.0 - Added the :attr:`group_class` attribute. - """ - from .decorators import group - - func: t.Optional[t.Callable] = None - - if args and callable(args[0]): - assert ( - len(args) == 1 and not kwargs - ), "Use 'group(**kwargs)(callable)' to provide arguments." - (func,) = args - args = () - - if self.group_class is not None and kwargs.get("cls") is None: - if self.group_class is type: - kwargs["cls"] = type(self) - else: - kwargs["cls"] = self.group_class - - def decorator(f: t.Callable[..., t.Any]) -> "Group": - cmd: Group = group(*args, **kwargs)(f) - self.add_command(cmd) - return cmd - - if func is not None: - return decorator(func) - - return decorator - - def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: - return self.commands.get(cmd_name) - - def list_commands(self, ctx: Context) -> t.List[str]: - return sorted(self.commands) - - -class CommandCollection(MultiCommand): - """A command collection is a multi command that merges multiple multi - commands together into one. This is a straightforward implementation - that accepts a list of different multi commands as sources and - provides all the commands for each of them. - """ - - def __init__( - self, - name: t.Optional[str] = None, - sources: t.Optional[t.List[MultiCommand]] = None, - **attrs: t.Any, - ) -> None: - super().__init__(name, **attrs) - #: The list of registered multi commands. - self.sources: t.List[MultiCommand] = sources or [] - - def add_source(self, multi_cmd: MultiCommand) -> None: - """Adds a new multi command to the chain dispatcher.""" - self.sources.append(multi_cmd) - - def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: - for source in self.sources: - rv = source.get_command(ctx, cmd_name) - - if rv is not None: - if self.chain: - _check_multicommand(self, cmd_name, rv) - - return rv - - return None - - def list_commands(self, ctx: Context) -> t.List[str]: - rv: t.Set[str] = set() - - for source in self.sources: - rv.update(source.list_commands(ctx)) - - return sorted(rv) - - -def _check_iter(value: t.Any) -> t.Iterator[t.Any]: - """Check if the value is iterable but not a string. Raises a type - error, or return an iterator over the value. - """ - if isinstance(value, str): - raise TypeError - - return iter(value) - - -class Parameter: - r"""A parameter to a command comes in two versions: they are either - :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently - not supported by design as some of the internals for parsing are - intentionally not finalized. - - Some settings are supported by both options and arguments. - - :param param_decls: the parameter declarations for this option or - argument. This is a list of flags or argument - names. - :param type: the type that should be used. Either a :class:`ParamType` - or a Python type. The later is converted into the former - automatically if supported. - :param required: controls if this is optional or not. - :param default: the default value if omitted. This can also be a callable, - in which case it's invoked when the default is needed - without any arguments. - :param callback: A function to further process or validate the value - after type conversion. It is called as ``f(ctx, param, value)`` - and must return the value. It is called for all sources, - including prompts. - :param nargs: the number of arguments to match. If not ``1`` the return - value is a tuple instead of single value. The default for - nargs is ``1`` (except if the type is a tuple, then it's - the arity of the tuple). If ``nargs=-1``, all remaining - parameters are collected. - :param metavar: how the value is represented in the help page. - :param expose_value: if this is `True` then the value is passed onwards - to the command callback and stored on the context, - otherwise it's skipped. - :param is_eager: eager values are processed before non eager ones. This - should not be set for arguments or it will inverse the - order of processing. - :param envvar: a string or list of strings that are environment variables - that should be checked. - :param shell_complete: A function that returns custom shell - completions. Used instead of the param's type completion if - given. Takes ``ctx, param, incomplete`` and must return a list - of :class:`~click.shell_completion.CompletionItem` or a list of - strings. - - .. versionchanged:: 8.0 - ``process_value`` validates required parameters and bounded - ``nargs``, and invokes the parameter callback before returning - the value. This allows the callback to validate prompts. - ``full_process_value`` is removed. - - .. versionchanged:: 8.0 - ``autocompletion`` is renamed to ``shell_complete`` and has new - semantics described above. The old name is deprecated and will - be removed in 8.1, until then it will be wrapped to match the - new requirements. - - .. versionchanged:: 8.0 - For ``multiple=True, nargs>1``, the default must be a list of - tuples. - - .. versionchanged:: 8.0 - Setting a default is no longer required for ``nargs>1``, it will - default to ``None``. ``multiple=True`` or ``nargs=-1`` will - default to ``()``. - - .. versionchanged:: 7.1 - Empty environment variables are ignored rather than taking the - empty string value. This makes it possible for scripts to clear - variables if they can't unset them. - - .. versionchanged:: 2.0 - Changed signature for parameter callback to also be passed the - parameter. The old callback format will still work, but it will - raise a warning to give you a chance to migrate the code easier. - """ - - param_type_name = "parameter" - - def __init__( - self, - param_decls: t.Optional[t.Sequence[str]] = None, - type: t.Optional[t.Union[types.ParamType, t.Any]] = None, - required: bool = False, - default: t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]] = None, - callback: t.Optional[t.Callable[[Context, "Parameter", t.Any], t.Any]] = None, - nargs: t.Optional[int] = None, - multiple: bool = False, - metavar: t.Optional[str] = None, - expose_value: bool = True, - is_eager: bool = False, - envvar: t.Optional[t.Union[str, t.Sequence[str]]] = None, - shell_complete: t.Optional[ - t.Callable[ - [Context, "Parameter", str], - t.Union[t.List["CompletionItem"], t.List[str]], - ] - ] = None, - ) -> None: - self.name, self.opts, self.secondary_opts = self._parse_decls( - param_decls or (), expose_value - ) - self.type = types.convert_type(type, default) - - # Default nargs to what the type tells us if we have that - # information available. - if nargs is None: - if self.type.is_composite: - nargs = self.type.arity - else: - nargs = 1 - - self.required = required - self.callback = callback - self.nargs = nargs - self.multiple = multiple - self.expose_value = expose_value - self.default = default - self.is_eager = is_eager - self.metavar = metavar - self.envvar = envvar - self._custom_shell_complete = shell_complete - - if __debug__: - if self.type.is_composite and nargs != self.type.arity: - raise ValueError( - f"'nargs' must be {self.type.arity} (or None) for" - f" type {self.type!r}, but it was {nargs}." - ) - - # Skip no default or callable default. - check_default = default if not callable(default) else None - - if check_default is not None: - if multiple: - try: - # Only check the first value against nargs. - check_default = next(_check_iter(check_default), None) - except TypeError: - raise ValueError( - "'default' must be a list when 'multiple' is true." - ) from None - - # Can be None for multiple with empty default. - if nargs != 1 and check_default is not None: - try: - _check_iter(check_default) - except TypeError: - if multiple: - message = ( - "'default' must be a list of lists when 'multiple' is" - " true and 'nargs' != 1." - ) - else: - message = "'default' must be a list when 'nargs' != 1." - - raise ValueError(message) from None - - if nargs > 1 and len(check_default) != nargs: - subject = "item length" if multiple else "length" - raise ValueError( - f"'default' {subject} must match nargs={nargs}." - ) - - def to_info_dict(self) -> t.Dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. - - Use :meth:`click.Context.to_info_dict` to traverse the entire - CLI structure. - - .. versionadded:: 8.0 - """ - return { - "name": self.name, - "param_type_name": self.param_type_name, - "opts": self.opts, - "secondary_opts": self.secondary_opts, - "type": self.type.to_info_dict(), - "required": self.required, - "nargs": self.nargs, - "multiple": self.multiple, - "default": self.default, - "envvar": self.envvar, - } - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.name}>" - - def _parse_decls( - self, decls: t.Sequence[str], expose_value: bool - ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: - raise NotImplementedError() - - @property - def human_readable_name(self) -> str: - """Returns the human readable name of this parameter. This is the - same as the name for options, but the metavar for arguments. - """ - return self.name # type: ignore - - def make_metavar(self) -> str: - if self.metavar is not None: - return self.metavar - - metavar = self.type.get_metavar(self) - - if metavar is None: - metavar = self.type.name.upper() - - if self.nargs != 1: - metavar += "..." - - return metavar - - @t.overload - def get_default( - self, ctx: Context, call: "te.Literal[True]" = True - ) -> t.Optional[t.Any]: - ... - - @t.overload - def get_default( - self, ctx: Context, call: bool = ... - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - ... - - def get_default( - self, ctx: Context, call: bool = True - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - """Get the default for the parameter. Tries - :meth:`Context.lookup_default` first, then the local default. - - :param ctx: Current context. - :param call: If the default is a callable, call it. Disable to - return the callable instead. - - .. versionchanged:: 8.0.2 - Type casting is no longer performed when getting a default. - - .. versionchanged:: 8.0.1 - Type casting can fail in resilient parsing mode. Invalid - defaults will not prevent showing help text. - - .. versionchanged:: 8.0 - Looks at ``ctx.default_map`` first. - - .. versionchanged:: 8.0 - Added the ``call`` parameter. - """ - value = ctx.lookup_default(self.name, call=False) # type: ignore - - if value is None: - value = self.default - - if call and callable(value): - value = value() - - return value - - def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: - raise NotImplementedError() - - def consume_value( - self, ctx: Context, opts: t.Mapping[str, t.Any] - ) -> t.Tuple[t.Any, ParameterSource]: - value = opts.get(self.name) # type: ignore - source = ParameterSource.COMMANDLINE - - if value is None: - value = self.value_from_envvar(ctx) - source = ParameterSource.ENVIRONMENT - - if value is None: - value = ctx.lookup_default(self.name) # type: ignore - source = ParameterSource.DEFAULT_MAP - - if value is None: - value = self.get_default(ctx) - source = ParameterSource.DEFAULT - - return value, source - - def type_cast_value(self, ctx: Context, value: t.Any) -> t.Any: - """Convert and validate a value against the option's - :attr:`type`, :attr:`multiple`, and :attr:`nargs`. - """ - if value is None: - return () if self.multiple or self.nargs == -1 else None - - def check_iter(value: t.Any) -> t.Iterator: - try: - return _check_iter(value) - except TypeError: - # This should only happen when passing in args manually, - # the parser should construct an iterable when parsing - # the command line. - raise BadParameter( - _("Value must be an iterable."), ctx=ctx, param=self - ) from None - - if self.nargs == 1 or self.type.is_composite: - convert: t.Callable[[t.Any], t.Any] = partial( - self.type, param=self, ctx=ctx - ) - elif self.nargs == -1: - - def convert(value: t.Any) -> t.Tuple: - return tuple(self.type(x, self, ctx) for x in check_iter(value)) - - else: # nargs > 1 - - def convert(value: t.Any) -> t.Tuple: - value = tuple(check_iter(value)) - - if len(value) != self.nargs: - raise BadParameter( - ngettext( - "Takes {nargs} values but 1 was given.", - "Takes {nargs} values but {len} were given.", - len(value), - ).format(nargs=self.nargs, len=len(value)), - ctx=ctx, - param=self, - ) - - return tuple(self.type(x, self, ctx) for x in value) - - if self.multiple: - return tuple(convert(x) for x in check_iter(value)) - - return convert(value) - - def value_is_missing(self, value: t.Any) -> bool: - if value is None: - return True - - if (self.nargs != 1 or self.multiple) and value == (): - return True - - return False - - def process_value(self, ctx: Context, value: t.Any) -> t.Any: - value = self.type_cast_value(ctx, value) - - if self.required and self.value_is_missing(value): - raise MissingParameter(ctx=ctx, param=self) - - if self.callback is not None: - value = self.callback(ctx, self, value) - - return value - - def resolve_envvar_value(self, ctx: Context) -> t.Optional[str]: - if self.envvar is None: - return None - - if isinstance(self.envvar, str): - rv = os.environ.get(self.envvar) - - if rv: - return rv - else: - for envvar in self.envvar: - rv = os.environ.get(envvar) - - if rv: - return rv - - return None - - def value_from_envvar(self, ctx: Context) -> t.Optional[t.Any]: - rv: t.Optional[t.Any] = self.resolve_envvar_value(ctx) - - if rv is not None and self.nargs != 1: - rv = self.type.split_envvar_value(rv) - - return rv - - def handle_parse_result( - self, ctx: Context, opts: t.Mapping[str, t.Any], args: t.List[str] - ) -> t.Tuple[t.Any, t.List[str]]: - with augment_usage_errors(ctx, param=self): - value, source = self.consume_value(ctx, opts) - ctx.set_parameter_source(self.name, source) # type: ignore - - try: - value = self.process_value(ctx, value) - except Exception: - if not ctx.resilient_parsing: - raise - - value = None - - if self.expose_value: - ctx.params[self.name] = value # type: ignore - - return value, args - - def get_help_record(self, ctx: Context) -> t.Optional[t.Tuple[str, str]]: - pass - - def get_usage_pieces(self, ctx: Context) -> t.List[str]: - return [] - - def get_error_hint(self, ctx: Context) -> str: - """Get a stringified version of the param for use in error messages to - indicate which param caused the error. - """ - hint_list = self.opts or [self.human_readable_name] - return " / ".join(f"'{x}'" for x in hint_list) - - def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: - """Return a list of completions for the incomplete value. If a - ``shell_complete`` function was given during init, it is used. - Otherwise, the :attr:`type` - :meth:`~click.types.ParamType.shell_complete` function is used. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - if self._custom_shell_complete is not None: - results = self._custom_shell_complete(ctx, self, incomplete) - - if results and isinstance(results[0], str): - from click.shell_completion import CompletionItem - - results = [CompletionItem(c) for c in results] - - return t.cast(t.List["CompletionItem"], results) - - return self.type.shell_complete(ctx, self, incomplete) - - -class Option(Parameter): - """Options are usually optional values on the command line and - have some extra features that arguments don't have. - - All other parameters are passed onwards to the parameter constructor. - - :param show_default: Show the default value for this option in its - help text. Values are not shown by default, unless - :attr:`Context.show_default` is ``True``. If this value is a - string, it shows that string in parentheses instead of the - actual value. This is particularly useful for dynamic options. - For single option boolean flags, the default remains hidden if - its value is ``False``. - :param show_envvar: Controls if an environment variable should be - shown on the help page. Normally, environment variables are not - shown. - :param prompt: If set to ``True`` or a non empty string then the - user will be prompted for input. If set to ``True`` the prompt - will be the option name capitalized. - :param confirmation_prompt: Prompt a second time to confirm the - value if it was prompted for. Can be set to a string instead of - ``True`` to customize the message. - :param prompt_required: If set to ``False``, the user will be - prompted for input only when the option was specified as a flag - without a value. - :param hide_input: If this is ``True`` then the input on the prompt - will be hidden from the user. This is useful for password input. - :param is_flag: forces this option to act as a flag. The default is - auto detection. - :param flag_value: which value should be used for this flag if it's - enabled. This is set to a boolean automatically if - the option string contains a slash to mark two options. - :param multiple: if this is set to `True` then the argument is accepted - multiple times and recorded. This is similar to ``nargs`` - in how it works but supports arbitrary number of - arguments. - :param count: this flag makes an option increment an integer. - :param allow_from_autoenv: if this is enabled then the value of this - parameter will be pulled from an environment - variable in case a prefix is defined on the - context. - :param help: the help string. - :param hidden: hide this option from help outputs. - - .. versionchanged:: 8.1.0 - Help text indentation is cleaned here instead of only in the - ``@option`` decorator. - - .. versionchanged:: 8.1.0 - The ``show_default`` parameter overrides - ``Context.show_default``. - - .. versionchanged:: 8.1.0 - The default of a single option boolean flag is not shown if the - default value is ``False``. - - .. versionchanged:: 8.0.1 - ``type`` is detected from ``flag_value`` if given. - """ - - param_type_name = "option" - - def __init__( - self, - param_decls: t.Optional[t.Sequence[str]] = None, - show_default: t.Union[bool, str, None] = None, - prompt: t.Union[bool, str] = False, - confirmation_prompt: t.Union[bool, str] = False, - prompt_required: bool = True, - hide_input: bool = False, - is_flag: t.Optional[bool] = None, - flag_value: t.Optional[t.Any] = None, - multiple: bool = False, - count: bool = False, - allow_from_autoenv: bool = True, - type: t.Optional[t.Union[types.ParamType, t.Any]] = None, - help: t.Optional[str] = None, - hidden: bool = False, - show_choices: bool = True, - show_envvar: bool = False, - **attrs: t.Any, - ) -> None: - if help: - help = inspect.cleandoc(help) - - default_is_missing = "default" not in attrs - super().__init__(param_decls, type=type, multiple=multiple, **attrs) - - if prompt is True: - if self.name is None: - raise TypeError("'name' is required with 'prompt=True'.") - - prompt_text: t.Optional[str] = self.name.replace("_", " ").capitalize() - elif prompt is False: - prompt_text = None - else: - prompt_text = prompt - - self.prompt = prompt_text - self.confirmation_prompt = confirmation_prompt - self.prompt_required = prompt_required - self.hide_input = hide_input - self.hidden = hidden - - # If prompt is enabled but not required, then the option can be - # used as a flag to indicate using prompt or flag_value. - self._flag_needs_value = self.prompt is not None and not self.prompt_required - - if is_flag is None: - if flag_value is not None: - # Implicitly a flag because flag_value was set. - is_flag = True - elif self._flag_needs_value: - # Not a flag, but when used as a flag it shows a prompt. - is_flag = False - else: - # Implicitly a flag because flag options were given. - is_flag = bool(self.secondary_opts) - elif is_flag is False and not self._flag_needs_value: - # Not a flag, and prompt is not enabled, can be used as a - # flag if flag_value is set. - self._flag_needs_value = flag_value is not None - - if is_flag and default_is_missing and not self.required: - self.default: t.Union[t.Any, t.Callable[[], t.Any]] = False - - if flag_value is None: - flag_value = not self.default - - if is_flag and type is None: - # Re-guess the type from the flag value instead of the - # default. - self.type = types.convert_type(None, flag_value) - - self.is_flag: bool = is_flag - self.is_bool_flag = is_flag and isinstance(self.type, types.BoolParamType) - self.flag_value: t.Any = flag_value - - # Counting - self.count = count - if count: - if type is None: - self.type = types.IntRange(min=0) - if default_is_missing: - self.default = 0 - - self.allow_from_autoenv = allow_from_autoenv - self.help = help - self.show_default = show_default - self.show_choices = show_choices - self.show_envvar = show_envvar - - if __debug__: - if self.nargs == -1: - raise TypeError("nargs=-1 is not supported for options.") - - if self.prompt and self.is_flag and not self.is_bool_flag: - raise TypeError("'prompt' is not valid for non-boolean flag.") - - if not self.is_bool_flag and self.secondary_opts: - raise TypeError("Secondary flag is not valid for non-boolean flag.") - - if self.is_bool_flag and self.hide_input and self.prompt is not None: - raise TypeError( - "'prompt' with 'hide_input' is not valid for boolean flag." - ) - - if self.count: - if self.multiple: - raise TypeError("'count' is not valid with 'multiple'.") - - if self.is_flag: - raise TypeError("'count' is not valid with 'is_flag'.") - - if self.multiple and self.is_flag: - raise TypeError("'multiple' is not valid with 'is_flag', use 'count'.") - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - help=self.help, - prompt=self.prompt, - is_flag=self.is_flag, - flag_value=self.flag_value, - count=self.count, - hidden=self.hidden, - ) - return info_dict - - def _parse_decls( - self, decls: t.Sequence[str], expose_value: bool - ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: - opts = [] - secondary_opts = [] - name = None - possible_names = [] - - for decl in decls: - if decl.isidentifier(): - if name is not None: - raise TypeError(f"Name '{name}' defined twice") - name = decl - else: - split_char = ";" if decl[:1] == "/" else "/" - if split_char in decl: - first, second = decl.split(split_char, 1) - first = first.rstrip() - if first: - possible_names.append(split_opt(first)) - opts.append(first) - second = second.lstrip() - if second: - secondary_opts.append(second.lstrip()) - if first == second: - raise ValueError( - f"Boolean option {decl!r} cannot use the" - " same flag for true/false." - ) - else: - possible_names.append(split_opt(decl)) - opts.append(decl) - - if name is None and possible_names: - possible_names.sort(key=lambda x: -len(x[0])) # group long options first - name = possible_names[0][1].replace("-", "_").lower() - if not name.isidentifier(): - name = None - - if name is None: - if not expose_value: - return None, opts, secondary_opts - raise TypeError("Could not determine name for option") - - if not opts and not secondary_opts: - raise TypeError( - f"No options defined but a name was passed ({name})." - " Did you mean to declare an argument instead? Did" - f" you mean to pass '--{name}'?" - ) - - return name, opts, secondary_opts - - def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: - if self.multiple: - action = "append" - elif self.count: - action = "count" - else: - action = "store" - - if self.is_flag: - action = f"{action}_const" - - if self.is_bool_flag and self.secondary_opts: - parser.add_option( - obj=self, opts=self.opts, dest=self.name, action=action, const=True - ) - parser.add_option( - obj=self, - opts=self.secondary_opts, - dest=self.name, - action=action, - const=False, - ) - else: - parser.add_option( - obj=self, - opts=self.opts, - dest=self.name, - action=action, - const=self.flag_value, - ) - else: - parser.add_option( - obj=self, - opts=self.opts, - dest=self.name, - action=action, - nargs=self.nargs, - ) - - def get_help_record(self, ctx: Context) -> t.Optional[t.Tuple[str, str]]: - if self.hidden: - return None - - any_prefix_is_slash = False - - def _write_opts(opts: t.Sequence[str]) -> str: - nonlocal any_prefix_is_slash - - rv, any_slashes = join_options(opts) - - if any_slashes: - any_prefix_is_slash = True - - if not self.is_flag and not self.count: - rv += f" {self.make_metavar()}" - - return rv - - rv = [_write_opts(self.opts)] - - if self.secondary_opts: - rv.append(_write_opts(self.secondary_opts)) - - help = self.help or "" - extra = [] - - if self.show_envvar: - envvar = self.envvar - - if envvar is None: - if ( - self.allow_from_autoenv - and ctx.auto_envvar_prefix is not None - and self.name is not None - ): - envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" - - if envvar is not None: - var_str = ( - envvar - if isinstance(envvar, str) - else ", ".join(str(d) for d in envvar) - ) - extra.append(_("env var: {var}").format(var=var_str)) - - # Temporarily enable resilient parsing to avoid type casting - # failing for the default. Might be possible to extend this to - # help formatting in general. - resilient = ctx.resilient_parsing - ctx.resilient_parsing = True - - try: - default_value = self.get_default(ctx, call=False) - finally: - ctx.resilient_parsing = resilient - - show_default = False - show_default_is_str = False - - if self.show_default is not None: - if isinstance(self.show_default, str): - show_default_is_str = show_default = True - else: - show_default = self.show_default - elif ctx.show_default is not None: - show_default = ctx.show_default - - if show_default_is_str or (show_default and (default_value is not None)): - if show_default_is_str: - default_string = f"({self.show_default})" - elif isinstance(default_value, (list, tuple)): - default_string = ", ".join(str(d) for d in default_value) - elif inspect.isfunction(default_value): - default_string = _("(dynamic)") - elif self.is_bool_flag and self.secondary_opts: - # For boolean flags that have distinct True/False opts, - # use the opt without prefix instead of the value. - default_string = split_opt( - (self.opts if self.default else self.secondary_opts)[0] - )[1] - elif self.is_bool_flag and not self.secondary_opts and not default_value: - default_string = "" - else: - default_string = str(default_value) - - if default_string: - extra.append(_("default: {default}").format(default=default_string)) - - if ( - isinstance(self.type, types._NumberRangeBase) - # skip count with default range type - and not (self.count and self.type.min == 0 and self.type.max is None) - ): - range_str = self.type._describe_range() - - if range_str: - extra.append(range_str) - - if self.required: - extra.append(_("required")) - - if extra: - extra_str = "; ".join(extra) - help = f"{help} [{extra_str}]" if help else f"[{extra_str}]" - - return ("; " if any_prefix_is_slash else " / ").join(rv), help - - @t.overload - def get_default( - self, ctx: Context, call: "te.Literal[True]" = True - ) -> t.Optional[t.Any]: - ... - - @t.overload - def get_default( - self, ctx: Context, call: bool = ... - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - ... - - def get_default( - self, ctx: Context, call: bool = True - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - # If we're a non boolean flag our default is more complex because - # we need to look at all flags in the same group to figure out - # if we're the default one in which case we return the flag - # value as default. - if self.is_flag and not self.is_bool_flag: - for param in ctx.command.params: - if param.name == self.name and param.default: - return param.flag_value # type: ignore - - return None - - return super().get_default(ctx, call=call) - - def prompt_for_value(self, ctx: Context) -> t.Any: - """This is an alternative flow that can be activated in the full - value processing if a value does not exist. It will prompt the - user until a valid value exists and then returns the processed - value as result. - """ - assert self.prompt is not None - - # Calculate the default before prompting anything to be stable. - default = self.get_default(ctx) - - # If this is a prompt for a flag we need to handle this - # differently. - if self.is_bool_flag: - return confirm(self.prompt, default) - - return prompt( - self.prompt, - default=default, - type=self.type, - hide_input=self.hide_input, - show_choices=self.show_choices, - confirmation_prompt=self.confirmation_prompt, - value_proc=lambda x: self.process_value(ctx, x), - ) - - def resolve_envvar_value(self, ctx: Context) -> t.Optional[str]: - rv = super().resolve_envvar_value(ctx) - - if rv is not None: - return rv - - if ( - self.allow_from_autoenv - and ctx.auto_envvar_prefix is not None - and self.name is not None - ): - envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" - rv = os.environ.get(envvar) - - if rv: - return rv - - return None - - def value_from_envvar(self, ctx: Context) -> t.Optional[t.Any]: - rv: t.Optional[t.Any] = self.resolve_envvar_value(ctx) - - if rv is None: - return None - - value_depth = (self.nargs != 1) + bool(self.multiple) - - if value_depth > 0: - rv = self.type.split_envvar_value(rv) - - if self.multiple and self.nargs != 1: - rv = batch(rv, self.nargs) - - return rv - - def consume_value( - self, ctx: Context, opts: t.Mapping[str, "Parameter"] - ) -> t.Tuple[t.Any, ParameterSource]: - value, source = super().consume_value(ctx, opts) - - # The parser will emit a sentinel value if the option can be - # given as a flag without a value. This is different from None - # to distinguish from the flag not being given at all. - if value is _flag_needs_value: - if self.prompt is not None and not ctx.resilient_parsing: - value = self.prompt_for_value(ctx) - source = ParameterSource.PROMPT - else: - value = self.flag_value - source = ParameterSource.COMMANDLINE - - elif ( - self.multiple - and value is not None - and any(v is _flag_needs_value for v in value) - ): - value = [self.flag_value if v is _flag_needs_value else v for v in value] - source = ParameterSource.COMMANDLINE - - # The value wasn't set, or used the param's default, prompt if - # prompting is enabled. - elif ( - source in {None, ParameterSource.DEFAULT} - and self.prompt is not None - and (self.required or self.prompt_required) - and not ctx.resilient_parsing - ): - value = self.prompt_for_value(ctx) - source = ParameterSource.PROMPT - - return value, source - - -class Argument(Parameter): - """Arguments are positional parameters to a command. They generally - provide fewer features than options but can have infinite ``nargs`` - and are required by default. - - All parameters are passed onwards to the parameter constructor. - """ - - param_type_name = "argument" - - def __init__( - self, - param_decls: t.Sequence[str], - required: t.Optional[bool] = None, - **attrs: t.Any, - ) -> None: - if required is None: - if attrs.get("default") is not None: - required = False - else: - required = attrs.get("nargs", 1) > 0 - - if "multiple" in attrs: - raise TypeError("__init__() got an unexpected keyword argument 'multiple'.") - - super().__init__(param_decls, required=required, **attrs) - - if __debug__: - if self.default is not None and self.nargs == -1: - raise TypeError("'default' is not supported for nargs=-1.") - - @property - def human_readable_name(self) -> str: - if self.metavar is not None: - return self.metavar - return self.name.upper() # type: ignore - - def make_metavar(self) -> str: - if self.metavar is not None: - return self.metavar - var = self.type.get_metavar(self) - if not var: - var = self.name.upper() # type: ignore - if not self.required: - var = f"[{var}]" - if self.nargs != 1: - var += "..." - return var - - def _parse_decls( - self, decls: t.Sequence[str], expose_value: bool - ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: - if not decls: - if not expose_value: - return None, [], [] - raise TypeError("Could not determine name for argument") - if len(decls) == 1: - name = arg = decls[0] - name = name.replace("-", "_").lower() - else: - raise TypeError( - "Arguments take exactly one parameter declaration, got" - f" {len(decls)}." - ) - return name, [arg], [] - - def get_usage_pieces(self, ctx: Context) -> t.List[str]: - return [self.make_metavar()] - - def get_error_hint(self, ctx: Context) -> str: - return f"'{self.make_metavar()}'" - - def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: - parser.add_argument(dest=self.name, nargs=self.nargs, obj=self) diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/decorators.py b/venv_flaskchat/lib/python3.11/site-packages/click/decorators.py deleted file mode 100644 index 28618dc..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click/decorators.py +++ /dev/null @@ -1,497 +0,0 @@ -import inspect -import types -import typing as t -from functools import update_wrapper -from gettext import gettext as _ - -from .core import Argument -from .core import Command -from .core import Context -from .core import Group -from .core import Option -from .core import Parameter -from .globals import get_current_context -from .utils import echo - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) -FC = t.TypeVar("FC", bound=t.Union[t.Callable[..., t.Any], Command]) - - -def pass_context(f: F) -> F: - """Marks a callback as wanting to receive the current context - object as first argument. - """ - - def new_func(*args, **kwargs): # type: ignore - return f(get_current_context(), *args, **kwargs) - - return update_wrapper(t.cast(F, new_func), f) - - -def pass_obj(f: F) -> F: - """Similar to :func:`pass_context`, but only pass the object on the - context onwards (:attr:`Context.obj`). This is useful if that object - represents the state of a nested system. - """ - - def new_func(*args, **kwargs): # type: ignore - return f(get_current_context().obj, *args, **kwargs) - - return update_wrapper(t.cast(F, new_func), f) - - -def make_pass_decorator( - object_type: t.Type, ensure: bool = False -) -> "t.Callable[[F], F]": - """Given an object type this creates a decorator that will work - similar to :func:`pass_obj` but instead of passing the object of the - current context, it will find the innermost context of type - :func:`object_type`. - - This generates a decorator that works roughly like this:: - - from functools import update_wrapper - - def decorator(f): - @pass_context - def new_func(ctx, *args, **kwargs): - obj = ctx.find_object(object_type) - return ctx.invoke(f, obj, *args, **kwargs) - return update_wrapper(new_func, f) - return decorator - - :param object_type: the type of the object to pass. - :param ensure: if set to `True`, a new object will be created and - remembered on the context if it's not there yet. - """ - - def decorator(f: F) -> F: - def new_func(*args, **kwargs): # type: ignore - ctx = get_current_context() - - if ensure: - obj = ctx.ensure_object(object_type) - else: - obj = ctx.find_object(object_type) - - if obj is None: - raise RuntimeError( - "Managed to invoke callback without a context" - f" object of type {object_type.__name__!r}" - " existing." - ) - - return ctx.invoke(f, obj, *args, **kwargs) - - return update_wrapper(t.cast(F, new_func), f) - - return decorator - - -def pass_meta_key( - key: str, *, doc_description: t.Optional[str] = None -) -> "t.Callable[[F], F]": - """Create a decorator that passes a key from - :attr:`click.Context.meta` as the first argument to the decorated - function. - - :param key: Key in ``Context.meta`` to pass. - :param doc_description: Description of the object being passed, - inserted into the decorator's docstring. Defaults to "the 'key' - key from Context.meta". - - .. versionadded:: 8.0 - """ - - def decorator(f: F) -> F: - def new_func(*args, **kwargs): # type: ignore - ctx = get_current_context() - obj = ctx.meta[key] - return ctx.invoke(f, obj, *args, **kwargs) - - return update_wrapper(t.cast(F, new_func), f) - - if doc_description is None: - doc_description = f"the {key!r} key from :attr:`click.Context.meta`" - - decorator.__doc__ = ( - f"Decorator that passes {doc_description} as the first argument" - " to the decorated function." - ) - return decorator - - -CmdType = t.TypeVar("CmdType", bound=Command) - - -@t.overload -def command( - __func: t.Callable[..., t.Any], -) -> Command: - ... - - -@t.overload -def command( - name: t.Optional[str] = None, - **attrs: t.Any, -) -> t.Callable[..., Command]: - ... - - -@t.overload -def command( - name: t.Optional[str] = None, - cls: t.Type[CmdType] = ..., - **attrs: t.Any, -) -> t.Callable[..., CmdType]: - ... - - -def command( - name: t.Union[str, t.Callable[..., t.Any], None] = None, - cls: t.Optional[t.Type[Command]] = None, - **attrs: t.Any, -) -> t.Union[Command, t.Callable[..., Command]]: - r"""Creates a new :class:`Command` and uses the decorated function as - callback. This will also automatically attach all decorated - :func:`option`\s and :func:`argument`\s as parameters to the command. - - The name of the command defaults to the name of the function with - underscores replaced by dashes. If you want to change that, you can - pass the intended name as the first argument. - - All keyword arguments are forwarded to the underlying command class. - For the ``params`` argument, any decorated params are appended to - the end of the list. - - Once decorated the function turns into a :class:`Command` instance - that can be invoked as a command line utility or be attached to a - command :class:`Group`. - - :param name: the name of the command. This defaults to the function - name with underscores replaced by dashes. - :param cls: the command class to instantiate. This defaults to - :class:`Command`. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - - .. versionchanged:: 8.1 - The ``params`` argument can be used. Decorated params are - appended to the end of the list. - """ - - func: t.Optional[t.Callable[..., t.Any]] = None - - if callable(name): - func = name - name = None - assert cls is None, "Use 'command(cls=cls)(callable)' to specify a class." - assert not attrs, "Use 'command(**kwargs)(callable)' to provide arguments." - - if cls is None: - cls = Command - - def decorator(f: t.Callable[..., t.Any]) -> Command: - if isinstance(f, Command): - raise TypeError("Attempted to convert a callback into a command twice.") - - attr_params = attrs.pop("params", None) - params = attr_params if attr_params is not None else [] - - try: - decorator_params = f.__click_params__ # type: ignore - except AttributeError: - pass - else: - del f.__click_params__ # type: ignore - params.extend(reversed(decorator_params)) - - if attrs.get("help") is None: - attrs["help"] = f.__doc__ - - cmd = cls( # type: ignore[misc] - name=name or f.__name__.lower().replace("_", "-"), # type: ignore[arg-type] - callback=f, - params=params, - **attrs, - ) - cmd.__doc__ = f.__doc__ - return cmd - - if func is not None: - return decorator(func) - - return decorator - - -@t.overload -def group( - __func: t.Callable[..., t.Any], -) -> Group: - ... - - -@t.overload -def group( - name: t.Optional[str] = None, - **attrs: t.Any, -) -> t.Callable[[F], Group]: - ... - - -def group( - name: t.Union[str, t.Callable[..., t.Any], None] = None, **attrs: t.Any -) -> t.Union[Group, t.Callable[[F], Group]]: - """Creates a new :class:`Group` with a function as callback. This - works otherwise the same as :func:`command` just that the `cls` - parameter is set to :class:`Group`. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - """ - if attrs.get("cls") is None: - attrs["cls"] = Group - - if callable(name): - grp: t.Callable[[F], Group] = t.cast(Group, command(**attrs)) - return grp(name) - - return t.cast(Group, command(name, **attrs)) - - -def _param_memo(f: FC, param: Parameter) -> None: - if isinstance(f, Command): - f.params.append(param) - else: - if not hasattr(f, "__click_params__"): - f.__click_params__ = [] # type: ignore - - f.__click_params__.append(param) # type: ignore - - -def argument(*param_decls: str, **attrs: t.Any) -> t.Callable[[FC], FC]: - """Attaches an argument to the command. All positional arguments are - passed as parameter declarations to :class:`Argument`; all keyword - arguments are forwarded unchanged (except ``cls``). - This is equivalent to creating an :class:`Argument` instance manually - and attaching it to the :attr:`Command.params` list. - - :param cls: the argument class to instantiate. This defaults to - :class:`Argument`. - """ - - def decorator(f: FC) -> FC: - ArgumentClass = attrs.pop("cls", None) or Argument - _param_memo(f, ArgumentClass(param_decls, **attrs)) - return f - - return decorator - - -def option(*param_decls: str, **attrs: t.Any) -> t.Callable[[FC], FC]: - """Attaches an option to the command. All positional arguments are - passed as parameter declarations to :class:`Option`; all keyword - arguments are forwarded unchanged (except ``cls``). - This is equivalent to creating an :class:`Option` instance manually - and attaching it to the :attr:`Command.params` list. - - :param cls: the option class to instantiate. This defaults to - :class:`Option`. - """ - - def decorator(f: FC) -> FC: - # Issue 926, copy attrs, so pre-defined options can re-use the same cls= - option_attrs = attrs.copy() - OptionClass = option_attrs.pop("cls", None) or Option - _param_memo(f, OptionClass(param_decls, **option_attrs)) - return f - - return decorator - - -def confirmation_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Add a ``--yes`` option which shows a prompt before continuing if - not passed. If the prompt is declined, the program will exit. - - :param param_decls: One or more option names. Defaults to the single - value ``"--yes"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - - def callback(ctx: Context, param: Parameter, value: bool) -> None: - if not value: - ctx.abort() - - if not param_decls: - param_decls = ("--yes",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("callback", callback) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("prompt", "Do you want to continue?") - kwargs.setdefault("help", "Confirm the action without prompting.") - return option(*param_decls, **kwargs) - - -def password_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Add a ``--password`` option which prompts for a password, hiding - input and asking to enter the value again for confirmation. - - :param param_decls: One or more option names. Defaults to the single - value ``"--password"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - if not param_decls: - param_decls = ("--password",) - - kwargs.setdefault("prompt", True) - kwargs.setdefault("confirmation_prompt", True) - kwargs.setdefault("hide_input", True) - return option(*param_decls, **kwargs) - - -def version_option( - version: t.Optional[str] = None, - *param_decls: str, - package_name: t.Optional[str] = None, - prog_name: t.Optional[str] = None, - message: t.Optional[str] = None, - **kwargs: t.Any, -) -> t.Callable[[FC], FC]: - """Add a ``--version`` option which immediately prints the version - number and exits the program. - - If ``version`` is not provided, Click will try to detect it using - :func:`importlib.metadata.version` to get the version for the - ``package_name``. On Python < 3.8, the ``importlib_metadata`` - backport must be installed. - - If ``package_name`` is not provided, Click will try to detect it by - inspecting the stack frames. This will be used to detect the - version, so it must match the name of the installed package. - - :param version: The version number to show. If not provided, Click - will try to detect it. - :param param_decls: One or more option names. Defaults to the single - value ``"--version"``. - :param package_name: The package name to detect the version from. If - not provided, Click will try to detect it. - :param prog_name: The name of the CLI to show in the message. If not - provided, it will be detected from the command. - :param message: The message to show. The values ``%(prog)s``, - ``%(package)s``, and ``%(version)s`` are available. Defaults to - ``"%(prog)s, version %(version)s"``. - :param kwargs: Extra arguments are passed to :func:`option`. - :raise RuntimeError: ``version`` could not be detected. - - .. versionchanged:: 8.0 - Add the ``package_name`` parameter, and the ``%(package)s`` - value for messages. - - .. versionchanged:: 8.0 - Use :mod:`importlib.metadata` instead of ``pkg_resources``. The - version is detected based on the package name, not the entry - point name. The Python package name must match the installed - package name, or be passed with ``package_name=``. - """ - if message is None: - message = _("%(prog)s, version %(version)s") - - if version is None and package_name is None: - frame = inspect.currentframe() - f_back = frame.f_back if frame is not None else None - f_globals = f_back.f_globals if f_back is not None else None - # break reference cycle - # https://docs.python.org/3/library/inspect.html#the-interpreter-stack - del frame - - if f_globals is not None: - package_name = f_globals.get("__name__") - - if package_name == "__main__": - package_name = f_globals.get("__package__") - - if package_name: - package_name = package_name.partition(".")[0] - - def callback(ctx: Context, param: Parameter, value: bool) -> None: - if not value or ctx.resilient_parsing: - return - - nonlocal prog_name - nonlocal version - - if prog_name is None: - prog_name = ctx.find_root().info_name - - if version is None and package_name is not None: - metadata: t.Optional[types.ModuleType] - - try: - from importlib import metadata # type: ignore - except ImportError: - # Python < 3.8 - import importlib_metadata as metadata # type: ignore - - try: - version = metadata.version(package_name) # type: ignore - except metadata.PackageNotFoundError: # type: ignore - raise RuntimeError( - f"{package_name!r} is not installed. Try passing" - " 'package_name' instead." - ) from None - - if version is None: - raise RuntimeError( - f"Could not determine the version for {package_name!r} automatically." - ) - - echo( - t.cast(str, message) - % {"prog": prog_name, "package": package_name, "version": version}, - color=ctx.color, - ) - ctx.exit() - - if not param_decls: - param_decls = ("--version",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("is_eager", True) - kwargs.setdefault("help", _("Show the version and exit.")) - kwargs["callback"] = callback - return option(*param_decls, **kwargs) - - -def help_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Add a ``--help`` option which immediately prints the help page - and exits the program. - - This is usually unnecessary, as the ``--help`` option is added to - each command automatically unless ``add_help_option=False`` is - passed. - - :param param_decls: One or more option names. Defaults to the single - value ``"--help"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - - def callback(ctx: Context, param: Parameter, value: bool) -> None: - if not value or ctx.resilient_parsing: - return - - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - if not param_decls: - param_decls = ("--help",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("is_eager", True) - kwargs.setdefault("help", _("Show this message and exit.")) - kwargs["callback"] = callback - return option(*param_decls, **kwargs) diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/exceptions.py b/venv_flaskchat/lib/python3.11/site-packages/click/exceptions.py deleted file mode 100644 index 9e20b3e..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click/exceptions.py +++ /dev/null @@ -1,287 +0,0 @@ -import os -import typing as t -from gettext import gettext as _ -from gettext import ngettext - -from ._compat import get_text_stderr -from .utils import echo - -if t.TYPE_CHECKING: - from .core import Context - from .core import Parameter - - -def _join_param_hints( - param_hint: t.Optional[t.Union[t.Sequence[str], str]] -) -> t.Optional[str]: - if param_hint is not None and not isinstance(param_hint, str): - return " / ".join(repr(x) for x in param_hint) - - return param_hint - - -class ClickException(Exception): - """An exception that Click can handle and show to the user.""" - - #: The exit code for this exception. - exit_code = 1 - - def __init__(self, message: str) -> None: - super().__init__(message) - self.message = message - - def format_message(self) -> str: - return self.message - - def __str__(self) -> str: - return self.message - - def show(self, file: t.Optional[t.IO] = None) -> None: - if file is None: - file = get_text_stderr() - - echo(_("Error: {message}").format(message=self.format_message()), file=file) - - -class UsageError(ClickException): - """An internal exception that signals a usage error. This typically - aborts any further handling. - - :param message: the error message to display. - :param ctx: optionally the context that caused this error. Click will - fill in the context automatically in some situations. - """ - - exit_code = 2 - - def __init__(self, message: str, ctx: t.Optional["Context"] = None) -> None: - super().__init__(message) - self.ctx = ctx - self.cmd = self.ctx.command if self.ctx else None - - def show(self, file: t.Optional[t.IO] = None) -> None: - if file is None: - file = get_text_stderr() - color = None - hint = "" - if ( - self.ctx is not None - and self.ctx.command.get_help_option(self.ctx) is not None - ): - hint = _("Try '{command} {option}' for help.").format( - command=self.ctx.command_path, option=self.ctx.help_option_names[0] - ) - hint = f"{hint}\n" - if self.ctx is not None: - color = self.ctx.color - echo(f"{self.ctx.get_usage()}\n{hint}", file=file, color=color) - echo( - _("Error: {message}").format(message=self.format_message()), - file=file, - color=color, - ) - - -class BadParameter(UsageError): - """An exception that formats out a standardized error message for a - bad parameter. This is useful when thrown from a callback or type as - Click will attach contextual information to it (for instance, which - parameter it is). - - .. versionadded:: 2.0 - - :param param: the parameter object that caused this error. This can - be left out, and Click will attach this info itself - if possible. - :param param_hint: a string that shows up as parameter name. This - can be used as alternative to `param` in cases - where custom validation should happen. If it is - a string it's used as such, if it's a list then - each item is quoted and separated. - """ - - def __init__( - self, - message: str, - ctx: t.Optional["Context"] = None, - param: t.Optional["Parameter"] = None, - param_hint: t.Optional[str] = None, - ) -> None: - super().__init__(message, ctx) - self.param = param - self.param_hint = param_hint - - def format_message(self) -> str: - if self.param_hint is not None: - param_hint = self.param_hint - elif self.param is not None: - param_hint = self.param.get_error_hint(self.ctx) # type: ignore - else: - return _("Invalid value: {message}").format(message=self.message) - - return _("Invalid value for {param_hint}: {message}").format( - param_hint=_join_param_hints(param_hint), message=self.message - ) - - -class MissingParameter(BadParameter): - """Raised if click required an option or argument but it was not - provided when invoking the script. - - .. versionadded:: 4.0 - - :param param_type: a string that indicates the type of the parameter. - The default is to inherit the parameter type from - the given `param`. Valid values are ``'parameter'``, - ``'option'`` or ``'argument'``. - """ - - def __init__( - self, - message: t.Optional[str] = None, - ctx: t.Optional["Context"] = None, - param: t.Optional["Parameter"] = None, - param_hint: t.Optional[str] = None, - param_type: t.Optional[str] = None, - ) -> None: - super().__init__(message or "", ctx, param, param_hint) - self.param_type = param_type - - def format_message(self) -> str: - if self.param_hint is not None: - param_hint: t.Optional[str] = self.param_hint - elif self.param is not None: - param_hint = self.param.get_error_hint(self.ctx) # type: ignore - else: - param_hint = None - - param_hint = _join_param_hints(param_hint) - param_hint = f" {param_hint}" if param_hint else "" - - param_type = self.param_type - if param_type is None and self.param is not None: - param_type = self.param.param_type_name - - msg = self.message - if self.param is not None: - msg_extra = self.param.type.get_missing_message(self.param) - if msg_extra: - if msg: - msg += f". {msg_extra}" - else: - msg = msg_extra - - msg = f" {msg}" if msg else "" - - # Translate param_type for known types. - if param_type == "argument": - missing = _("Missing argument") - elif param_type == "option": - missing = _("Missing option") - elif param_type == "parameter": - missing = _("Missing parameter") - else: - missing = _("Missing {param_type}").format(param_type=param_type) - - return f"{missing}{param_hint}.{msg}" - - def __str__(self) -> str: - if not self.message: - param_name = self.param.name if self.param else None - return _("Missing parameter: {param_name}").format(param_name=param_name) - else: - return self.message - - -class NoSuchOption(UsageError): - """Raised if click attempted to handle an option that does not - exist. - - .. versionadded:: 4.0 - """ - - def __init__( - self, - option_name: str, - message: t.Optional[str] = None, - possibilities: t.Optional[t.Sequence[str]] = None, - ctx: t.Optional["Context"] = None, - ) -> None: - if message is None: - message = _("No such option: {name}").format(name=option_name) - - super().__init__(message, ctx) - self.option_name = option_name - self.possibilities = possibilities - - def format_message(self) -> str: - if not self.possibilities: - return self.message - - possibility_str = ", ".join(sorted(self.possibilities)) - suggest = ngettext( - "Did you mean {possibility}?", - "(Possible options: {possibilities})", - len(self.possibilities), - ).format(possibility=possibility_str, possibilities=possibility_str) - return f"{self.message} {suggest}" - - -class BadOptionUsage(UsageError): - """Raised if an option is generally supplied but the use of the option - was incorrect. This is for instance raised if the number of arguments - for an option is not correct. - - .. versionadded:: 4.0 - - :param option_name: the name of the option being used incorrectly. - """ - - def __init__( - self, option_name: str, message: str, ctx: t.Optional["Context"] = None - ) -> None: - super().__init__(message, ctx) - self.option_name = option_name - - -class BadArgumentUsage(UsageError): - """Raised if an argument is generally supplied but the use of the argument - was incorrect. This is for instance raised if the number of values - for an argument is not correct. - - .. versionadded:: 6.0 - """ - - -class FileError(ClickException): - """Raised if a file cannot be opened.""" - - def __init__(self, filename: str, hint: t.Optional[str] = None) -> None: - if hint is None: - hint = _("unknown error") - - super().__init__(hint) - self.ui_filename = os.fsdecode(filename) - self.filename = filename - - def format_message(self) -> str: - return _("Could not open file {filename!r}: {message}").format( - filename=self.ui_filename, message=self.message - ) - - -class Abort(RuntimeError): - """An internal signalling exception that signals Click to abort.""" - - -class Exit(RuntimeError): - """An exception that indicates that the application should exit with some - status code. - - :param code: the status code to exit with. - """ - - __slots__ = ("exit_code",) - - def __init__(self, code: int = 0) -> None: - self.exit_code = code diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/formatting.py b/venv_flaskchat/lib/python3.11/site-packages/click/formatting.py deleted file mode 100644 index ddd2a2f..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click/formatting.py +++ /dev/null @@ -1,301 +0,0 @@ -import typing as t -from contextlib import contextmanager -from gettext import gettext as _ - -from ._compat import term_len -from .parser import split_opt - -# Can force a width. This is used by the test system -FORCED_WIDTH: t.Optional[int] = None - - -def measure_table(rows: t.Iterable[t.Tuple[str, str]]) -> t.Tuple[int, ...]: - widths: t.Dict[int, int] = {} - - for row in rows: - for idx, col in enumerate(row): - widths[idx] = max(widths.get(idx, 0), term_len(col)) - - return tuple(y for x, y in sorted(widths.items())) - - -def iter_rows( - rows: t.Iterable[t.Tuple[str, str]], col_count: int -) -> t.Iterator[t.Tuple[str, ...]]: - for row in rows: - yield row + ("",) * (col_count - len(row)) - - -def wrap_text( - text: str, - width: int = 78, - initial_indent: str = "", - subsequent_indent: str = "", - preserve_paragraphs: bool = False, -) -> str: - """A helper function that intelligently wraps text. By default, it - assumes that it operates on a single paragraph of text but if the - `preserve_paragraphs` parameter is provided it will intelligently - handle paragraphs (defined by two empty lines). - - If paragraphs are handled, a paragraph can be prefixed with an empty - line containing the ``\\b`` character (``\\x08``) to indicate that - no rewrapping should happen in that block. - - :param text: the text that should be rewrapped. - :param width: the maximum width for the text. - :param initial_indent: the initial indent that should be placed on the - first line as a string. - :param subsequent_indent: the indent string that should be placed on - each consecutive line. - :param preserve_paragraphs: if this flag is set then the wrapping will - intelligently handle paragraphs. - """ - from ._textwrap import TextWrapper - - text = text.expandtabs() - wrapper = TextWrapper( - width, - initial_indent=initial_indent, - subsequent_indent=subsequent_indent, - replace_whitespace=False, - ) - if not preserve_paragraphs: - return wrapper.fill(text) - - p: t.List[t.Tuple[int, bool, str]] = [] - buf: t.List[str] = [] - indent = None - - def _flush_par() -> None: - if not buf: - return - if buf[0].strip() == "\b": - p.append((indent or 0, True, "\n".join(buf[1:]))) - else: - p.append((indent or 0, False, " ".join(buf))) - del buf[:] - - for line in text.splitlines(): - if not line: - _flush_par() - indent = None - else: - if indent is None: - orig_len = term_len(line) - line = line.lstrip() - indent = orig_len - term_len(line) - buf.append(line) - _flush_par() - - rv = [] - for indent, raw, text in p: - with wrapper.extra_indent(" " * indent): - if raw: - rv.append(wrapper.indent_only(text)) - else: - rv.append(wrapper.fill(text)) - - return "\n\n".join(rv) - - -class HelpFormatter: - """This class helps with formatting text-based help pages. It's - usually just needed for very special internal cases, but it's also - exposed so that developers can write their own fancy outputs. - - At present, it always writes into memory. - - :param indent_increment: the additional increment for each level. - :param width: the width for the text. This defaults to the terminal - width clamped to a maximum of 78. - """ - - def __init__( - self, - indent_increment: int = 2, - width: t.Optional[int] = None, - max_width: t.Optional[int] = None, - ) -> None: - import shutil - - self.indent_increment = indent_increment - if max_width is None: - max_width = 80 - if width is None: - width = FORCED_WIDTH - if width is None: - width = max(min(shutil.get_terminal_size().columns, max_width) - 2, 50) - self.width = width - self.current_indent = 0 - self.buffer: t.List[str] = [] - - def write(self, string: str) -> None: - """Writes a unicode string into the internal buffer.""" - self.buffer.append(string) - - def indent(self) -> None: - """Increases the indentation.""" - self.current_indent += self.indent_increment - - def dedent(self) -> None: - """Decreases the indentation.""" - self.current_indent -= self.indent_increment - - def write_usage( - self, prog: str, args: str = "", prefix: t.Optional[str] = None - ) -> None: - """Writes a usage line into the buffer. - - :param prog: the program name. - :param args: whitespace separated list of arguments. - :param prefix: The prefix for the first line. Defaults to - ``"Usage: "``. - """ - if prefix is None: - prefix = f"{_('Usage:')} " - - usage_prefix = f"{prefix:>{self.current_indent}}{prog} " - text_width = self.width - self.current_indent - - if text_width >= (term_len(usage_prefix) + 20): - # The arguments will fit to the right of the prefix. - indent = " " * term_len(usage_prefix) - self.write( - wrap_text( - args, - text_width, - initial_indent=usage_prefix, - subsequent_indent=indent, - ) - ) - else: - # The prefix is too long, put the arguments on the next line. - self.write(usage_prefix) - self.write("\n") - indent = " " * (max(self.current_indent, term_len(prefix)) + 4) - self.write( - wrap_text( - args, text_width, initial_indent=indent, subsequent_indent=indent - ) - ) - - self.write("\n") - - def write_heading(self, heading: str) -> None: - """Writes a heading into the buffer.""" - self.write(f"{'':>{self.current_indent}}{heading}:\n") - - def write_paragraph(self) -> None: - """Writes a paragraph into the buffer.""" - if self.buffer: - self.write("\n") - - def write_text(self, text: str) -> None: - """Writes re-indented text into the buffer. This rewraps and - preserves paragraphs. - """ - indent = " " * self.current_indent - self.write( - wrap_text( - text, - self.width, - initial_indent=indent, - subsequent_indent=indent, - preserve_paragraphs=True, - ) - ) - self.write("\n") - - def write_dl( - self, - rows: t.Sequence[t.Tuple[str, str]], - col_max: int = 30, - col_spacing: int = 2, - ) -> None: - """Writes a definition list into the buffer. This is how options - and commands are usually formatted. - - :param rows: a list of two item tuples for the terms and values. - :param col_max: the maximum width of the first column. - :param col_spacing: the number of spaces between the first and - second column. - """ - rows = list(rows) - widths = measure_table(rows) - if len(widths) != 2: - raise TypeError("Expected two columns for definition list") - - first_col = min(widths[0], col_max) + col_spacing - - for first, second in iter_rows(rows, len(widths)): - self.write(f"{'':>{self.current_indent}}{first}") - if not second: - self.write("\n") - continue - if term_len(first) <= first_col - col_spacing: - self.write(" " * (first_col - term_len(first))) - else: - self.write("\n") - self.write(" " * (first_col + self.current_indent)) - - text_width = max(self.width - first_col - 2, 10) - wrapped_text = wrap_text(second, text_width, preserve_paragraphs=True) - lines = wrapped_text.splitlines() - - if lines: - self.write(f"{lines[0]}\n") - - for line in lines[1:]: - self.write(f"{'':>{first_col + self.current_indent}}{line}\n") - else: - self.write("\n") - - @contextmanager - def section(self, name: str) -> t.Iterator[None]: - """Helpful context manager that writes a paragraph, a heading, - and the indents. - - :param name: the section name that is written as heading. - """ - self.write_paragraph() - self.write_heading(name) - self.indent() - try: - yield - finally: - self.dedent() - - @contextmanager - def indentation(self) -> t.Iterator[None]: - """A context manager that increases the indentation.""" - self.indent() - try: - yield - finally: - self.dedent() - - def getvalue(self) -> str: - """Returns the buffer contents.""" - return "".join(self.buffer) - - -def join_options(options: t.Sequence[str]) -> t.Tuple[str, bool]: - """Given a list of option strings this joins them in the most appropriate - way and returns them in the form ``(formatted_string, - any_prefix_is_slash)`` where the second item in the tuple is a flag that - indicates if any of the option prefixes was a slash. - """ - rv = [] - any_prefix_is_slash = False - - for opt in options: - prefix = split_opt(opt)[0] - - if prefix == "/": - any_prefix_is_slash = True - - rv.append((len(prefix), opt)) - - rv.sort(key=lambda x: x[0]) - return ", ".join(x[1] for x in rv), any_prefix_is_slash diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/globals.py b/venv_flaskchat/lib/python3.11/site-packages/click/globals.py deleted file mode 100644 index 480058f..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click/globals.py +++ /dev/null @@ -1,68 +0,0 @@ -import typing as t -from threading import local - -if t.TYPE_CHECKING: - import typing_extensions as te - from .core import Context - -_local = local() - - -@t.overload -def get_current_context(silent: "te.Literal[False]" = False) -> "Context": - ... - - -@t.overload -def get_current_context(silent: bool = ...) -> t.Optional["Context"]: - ... - - -def get_current_context(silent: bool = False) -> t.Optional["Context"]: - """Returns the current click context. This can be used as a way to - access the current context object from anywhere. This is a more implicit - alternative to the :func:`pass_context` decorator. This function is - primarily useful for helpers such as :func:`echo` which might be - interested in changing its behavior based on the current context. - - To push the current context, :meth:`Context.scope` can be used. - - .. versionadded:: 5.0 - - :param silent: if set to `True` the return value is `None` if no context - is available. The default behavior is to raise a - :exc:`RuntimeError`. - """ - try: - return t.cast("Context", _local.stack[-1]) - except (AttributeError, IndexError) as e: - if not silent: - raise RuntimeError("There is no active click context.") from e - - return None - - -def push_context(ctx: "Context") -> None: - """Pushes a new context to the current stack.""" - _local.__dict__.setdefault("stack", []).append(ctx) - - -def pop_context() -> None: - """Removes the top level from the stack.""" - _local.stack.pop() - - -def resolve_color_default(color: t.Optional[bool] = None) -> t.Optional[bool]: - """Internal helper to get the default value of the color flag. If a - value is passed it's returned unchanged, otherwise it's looked up from - the current context. - """ - if color is not None: - return color - - ctx = get_current_context(silent=True) - - if ctx is not None: - return ctx.color - - return None diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/parser.py b/venv_flaskchat/lib/python3.11/site-packages/click/parser.py deleted file mode 100644 index 2d5a2ed..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click/parser.py +++ /dev/null @@ -1,529 +0,0 @@ -""" -This module started out as largely a copy paste from the stdlib's -optparse module with the features removed that we do not need from -optparse because we implement them in Click on a higher level (for -instance type handling, help formatting and a lot more). - -The plan is to remove more and more from here over time. - -The reason this is a different module and not optparse from the stdlib -is that there are differences in 2.x and 3.x about the error messages -generated and optparse in the stdlib uses gettext for no good reason -and might cause us issues. - -Click uses parts of optparse written by Gregory P. Ward and maintained -by the Python Software Foundation. This is limited to code in parser.py. - -Copyright 2001-2006 Gregory P. Ward. All rights reserved. -Copyright 2002-2006 Python Software Foundation. All rights reserved. -""" -# This code uses parts of optparse written by Gregory P. Ward and -# maintained by the Python Software Foundation. -# Copyright 2001-2006 Gregory P. Ward -# Copyright 2002-2006 Python Software Foundation -import typing as t -from collections import deque -from gettext import gettext as _ -from gettext import ngettext - -from .exceptions import BadArgumentUsage -from .exceptions import BadOptionUsage -from .exceptions import NoSuchOption -from .exceptions import UsageError - -if t.TYPE_CHECKING: - import typing_extensions as te - from .core import Argument as CoreArgument - from .core import Context - from .core import Option as CoreOption - from .core import Parameter as CoreParameter - -V = t.TypeVar("V") - -# Sentinel value that indicates an option was passed as a flag without a -# value but is not a flag option. Option.consume_value uses this to -# prompt or use the flag_value. -_flag_needs_value = object() - - -def _unpack_args( - args: t.Sequence[str], nargs_spec: t.Sequence[int] -) -> t.Tuple[t.Sequence[t.Union[str, t.Sequence[t.Optional[str]], None]], t.List[str]]: - """Given an iterable of arguments and an iterable of nargs specifications, - it returns a tuple with all the unpacked arguments at the first index - and all remaining arguments as the second. - - The nargs specification is the number of arguments that should be consumed - or `-1` to indicate that this position should eat up all the remainders. - - Missing items are filled with `None`. - """ - args = deque(args) - nargs_spec = deque(nargs_spec) - rv: t.List[t.Union[str, t.Tuple[t.Optional[str], ...], None]] = [] - spos: t.Optional[int] = None - - def _fetch(c: "te.Deque[V]") -> t.Optional[V]: - try: - if spos is None: - return c.popleft() - else: - return c.pop() - except IndexError: - return None - - while nargs_spec: - nargs = _fetch(nargs_spec) - - if nargs is None: - continue - - if nargs == 1: - rv.append(_fetch(args)) - elif nargs > 1: - x = [_fetch(args) for _ in range(nargs)] - - # If we're reversed, we're pulling in the arguments in reverse, - # so we need to turn them around. - if spos is not None: - x.reverse() - - rv.append(tuple(x)) - elif nargs < 0: - if spos is not None: - raise TypeError("Cannot have two nargs < 0") - - spos = len(rv) - rv.append(None) - - # spos is the position of the wildcard (star). If it's not `None`, - # we fill it with the remainder. - if spos is not None: - rv[spos] = tuple(args) - args = [] - rv[spos + 1 :] = reversed(rv[spos + 1 :]) - - return tuple(rv), list(args) - - -def split_opt(opt: str) -> t.Tuple[str, str]: - first = opt[:1] - if first.isalnum(): - return "", opt - if opt[1:2] == first: - return opt[:2], opt[2:] - return first, opt[1:] - - -def normalize_opt(opt: str, ctx: t.Optional["Context"]) -> str: - if ctx is None or ctx.token_normalize_func is None: - return opt - prefix, opt = split_opt(opt) - return f"{prefix}{ctx.token_normalize_func(opt)}" - - -def split_arg_string(string: str) -> t.List[str]: - """Split an argument string as with :func:`shlex.split`, but don't - fail if the string is incomplete. Ignores a missing closing quote or - incomplete escape sequence and uses the partial token as-is. - - .. code-block:: python - - split_arg_string("example 'my file") - ["example", "my file"] - - split_arg_string("example my\\") - ["example", "my"] - - :param string: String to split. - """ - import shlex - - lex = shlex.shlex(string, posix=True) - lex.whitespace_split = True - lex.commenters = "" - out = [] - - try: - for token in lex: - out.append(token) - except ValueError: - # Raised when end-of-string is reached in an invalid state. Use - # the partial token as-is. The quote or escape character is in - # lex.state, not lex.token. - out.append(lex.token) - - return out - - -class Option: - def __init__( - self, - obj: "CoreOption", - opts: t.Sequence[str], - dest: t.Optional[str], - action: t.Optional[str] = None, - nargs: int = 1, - const: t.Optional[t.Any] = None, - ): - self._short_opts = [] - self._long_opts = [] - self.prefixes = set() - - for opt in opts: - prefix, value = split_opt(opt) - if not prefix: - raise ValueError(f"Invalid start character for option ({opt})") - self.prefixes.add(prefix[0]) - if len(prefix) == 1 and len(value) == 1: - self._short_opts.append(opt) - else: - self._long_opts.append(opt) - self.prefixes.add(prefix) - - if action is None: - action = "store" - - self.dest = dest - self.action = action - self.nargs = nargs - self.const = const - self.obj = obj - - @property - def takes_value(self) -> bool: - return self.action in ("store", "append") - - def process(self, value: str, state: "ParsingState") -> None: - if self.action == "store": - state.opts[self.dest] = value # type: ignore - elif self.action == "store_const": - state.opts[self.dest] = self.const # type: ignore - elif self.action == "append": - state.opts.setdefault(self.dest, []).append(value) # type: ignore - elif self.action == "append_const": - state.opts.setdefault(self.dest, []).append(self.const) # type: ignore - elif self.action == "count": - state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 # type: ignore - else: - raise ValueError(f"unknown action '{self.action}'") - state.order.append(self.obj) - - -class Argument: - def __init__(self, obj: "CoreArgument", dest: t.Optional[str], nargs: int = 1): - self.dest = dest - self.nargs = nargs - self.obj = obj - - def process( - self, - value: t.Union[t.Optional[str], t.Sequence[t.Optional[str]]], - state: "ParsingState", - ) -> None: - if self.nargs > 1: - assert value is not None - holes = sum(1 for x in value if x is None) - if holes == len(value): - value = None - elif holes != 0: - raise BadArgumentUsage( - _("Argument {name!r} takes {nargs} values.").format( - name=self.dest, nargs=self.nargs - ) - ) - - if self.nargs == -1 and self.obj.envvar is not None and value == (): - # Replace empty tuple with None so that a value from the - # environment may be tried. - value = None - - state.opts[self.dest] = value # type: ignore - state.order.append(self.obj) - - -class ParsingState: - def __init__(self, rargs: t.List[str]) -> None: - self.opts: t.Dict[str, t.Any] = {} - self.largs: t.List[str] = [] - self.rargs = rargs - self.order: t.List["CoreParameter"] = [] - - -class OptionParser: - """The option parser is an internal class that is ultimately used to - parse options and arguments. It's modelled after optparse and brings - a similar but vastly simplified API. It should generally not be used - directly as the high level Click classes wrap it for you. - - It's not nearly as extensible as optparse or argparse as it does not - implement features that are implemented on a higher level (such as - types or defaults). - - :param ctx: optionally the :class:`~click.Context` where this parser - should go with. - """ - - def __init__(self, ctx: t.Optional["Context"] = None) -> None: - #: The :class:`~click.Context` for this parser. This might be - #: `None` for some advanced use cases. - self.ctx = ctx - #: This controls how the parser deals with interspersed arguments. - #: If this is set to `False`, the parser will stop on the first - #: non-option. Click uses this to implement nested subcommands - #: safely. - self.allow_interspersed_args = True - #: This tells the parser how to deal with unknown options. By - #: default it will error out (which is sensible), but there is a - #: second mode where it will ignore it and continue processing - #: after shifting all the unknown options into the resulting args. - self.ignore_unknown_options = False - - if ctx is not None: - self.allow_interspersed_args = ctx.allow_interspersed_args - self.ignore_unknown_options = ctx.ignore_unknown_options - - self._short_opt: t.Dict[str, Option] = {} - self._long_opt: t.Dict[str, Option] = {} - self._opt_prefixes = {"-", "--"} - self._args: t.List[Argument] = [] - - def add_option( - self, - obj: "CoreOption", - opts: t.Sequence[str], - dest: t.Optional[str], - action: t.Optional[str] = None, - nargs: int = 1, - const: t.Optional[t.Any] = None, - ) -> None: - """Adds a new option named `dest` to the parser. The destination - is not inferred (unlike with optparse) and needs to be explicitly - provided. Action can be any of ``store``, ``store_const``, - ``append``, ``append_const`` or ``count``. - - The `obj` can be used to identify the option in the order list - that is returned from the parser. - """ - opts = [normalize_opt(opt, self.ctx) for opt in opts] - option = Option(obj, opts, dest, action=action, nargs=nargs, const=const) - self._opt_prefixes.update(option.prefixes) - for opt in option._short_opts: - self._short_opt[opt] = option - for opt in option._long_opts: - self._long_opt[opt] = option - - def add_argument( - self, obj: "CoreArgument", dest: t.Optional[str], nargs: int = 1 - ) -> None: - """Adds a positional argument named `dest` to the parser. - - The `obj` can be used to identify the option in the order list - that is returned from the parser. - """ - self._args.append(Argument(obj, dest=dest, nargs=nargs)) - - def parse_args( - self, args: t.List[str] - ) -> t.Tuple[t.Dict[str, t.Any], t.List[str], t.List["CoreParameter"]]: - """Parses positional arguments and returns ``(values, args, order)`` - for the parsed options and arguments as well as the leftover - arguments if there are any. The order is a list of objects as they - appear on the command line. If arguments appear multiple times they - will be memorized multiple times as well. - """ - state = ParsingState(args) - try: - self._process_args_for_options(state) - self._process_args_for_args(state) - except UsageError: - if self.ctx is None or not self.ctx.resilient_parsing: - raise - return state.opts, state.largs, state.order - - def _process_args_for_args(self, state: ParsingState) -> None: - pargs, args = _unpack_args( - state.largs + state.rargs, [x.nargs for x in self._args] - ) - - for idx, arg in enumerate(self._args): - arg.process(pargs[idx], state) - - state.largs = args - state.rargs = [] - - def _process_args_for_options(self, state: ParsingState) -> None: - while state.rargs: - arg = state.rargs.pop(0) - arglen = len(arg) - # Double dashes always handled explicitly regardless of what - # prefixes are valid. - if arg == "--": - return - elif arg[:1] in self._opt_prefixes and arglen > 1: - self._process_opts(arg, state) - elif self.allow_interspersed_args: - state.largs.append(arg) - else: - state.rargs.insert(0, arg) - return - - # Say this is the original argument list: - # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] - # ^ - # (we are about to process arg(i)). - # - # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of - # [arg0, ..., arg(i-1)] (any options and their arguments will have - # been removed from largs). - # - # The while loop will usually consume 1 or more arguments per pass. - # If it consumes 1 (eg. arg is an option that takes no arguments), - # then after _process_arg() is done the situation is: - # - # largs = subset of [arg0, ..., arg(i)] - # rargs = [arg(i+1), ..., arg(N-1)] - # - # If allow_interspersed_args is false, largs will always be - # *empty* -- still a subset of [arg0, ..., arg(i-1)], but - # not a very interesting subset! - - def _match_long_opt( - self, opt: str, explicit_value: t.Optional[str], state: ParsingState - ) -> None: - if opt not in self._long_opt: - from difflib import get_close_matches - - possibilities = get_close_matches(opt, self._long_opt) - raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) - - option = self._long_opt[opt] - if option.takes_value: - # At this point it's safe to modify rargs by injecting the - # explicit value, because no exception is raised in this - # branch. This means that the inserted value will be fully - # consumed. - if explicit_value is not None: - state.rargs.insert(0, explicit_value) - - value = self._get_value_from_state(opt, option, state) - - elif explicit_value is not None: - raise BadOptionUsage( - opt, _("Option {name!r} does not take a value.").format(name=opt) - ) - - else: - value = None - - option.process(value, state) - - def _match_short_opt(self, arg: str, state: ParsingState) -> None: - stop = False - i = 1 - prefix = arg[0] - unknown_options = [] - - for ch in arg[1:]: - opt = normalize_opt(f"{prefix}{ch}", self.ctx) - option = self._short_opt.get(opt) - i += 1 - - if not option: - if self.ignore_unknown_options: - unknown_options.append(ch) - continue - raise NoSuchOption(opt, ctx=self.ctx) - if option.takes_value: - # Any characters left in arg? Pretend they're the - # next arg, and stop consuming characters of arg. - if i < len(arg): - state.rargs.insert(0, arg[i:]) - stop = True - - value = self._get_value_from_state(opt, option, state) - - else: - value = None - - option.process(value, state) - - if stop: - break - - # If we got any unknown options we re-combinate the string of the - # remaining options and re-attach the prefix, then report that - # to the state as new larg. This way there is basic combinatorics - # that can be achieved while still ignoring unknown arguments. - if self.ignore_unknown_options and unknown_options: - state.largs.append(f"{prefix}{''.join(unknown_options)}") - - def _get_value_from_state( - self, option_name: str, option: Option, state: ParsingState - ) -> t.Any: - nargs = option.nargs - - if len(state.rargs) < nargs: - if option.obj._flag_needs_value: - # Option allows omitting the value. - value = _flag_needs_value - else: - raise BadOptionUsage( - option_name, - ngettext( - "Option {name!r} requires an argument.", - "Option {name!r} requires {nargs} arguments.", - nargs, - ).format(name=option_name, nargs=nargs), - ) - elif nargs == 1: - next_rarg = state.rargs[0] - - if ( - option.obj._flag_needs_value - and isinstance(next_rarg, str) - and next_rarg[:1] in self._opt_prefixes - and len(next_rarg) > 1 - ): - # The next arg looks like the start of an option, don't - # use it as the value if omitting the value is allowed. - value = _flag_needs_value - else: - value = state.rargs.pop(0) - else: - value = tuple(state.rargs[:nargs]) - del state.rargs[:nargs] - - return value - - def _process_opts(self, arg: str, state: ParsingState) -> None: - explicit_value = None - # Long option handling happens in two parts. The first part is - # supporting explicitly attached values. In any case, we will try - # to long match the option first. - if "=" in arg: - long_opt, explicit_value = arg.split("=", 1) - else: - long_opt = arg - norm_long_opt = normalize_opt(long_opt, self.ctx) - - # At this point we will match the (assumed) long option through - # the long option matching code. Note that this allows options - # like "-foo" to be matched as long options. - try: - self._match_long_opt(norm_long_opt, explicit_value, state) - except NoSuchOption: - # At this point the long option matching failed, and we need - # to try with short options. However there is a special rule - # which says, that if we have a two character options prefix - # (applies to "--foo" for instance), we do not dispatch to the - # short option code and will instead raise the no option - # error. - if arg[:2] not in self._opt_prefixes: - self._match_short_opt(arg, state) - return - - if not self.ignore_unknown_options: - raise - - state.largs.append(arg) diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/py.typed b/venv_flaskchat/lib/python3.11/site-packages/click/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/shell_completion.py b/venv_flaskchat/lib/python3.11/site-packages/click/shell_completion.py deleted file mode 100644 index c17a8e6..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click/shell_completion.py +++ /dev/null @@ -1,580 +0,0 @@ -import os -import re -import typing as t -from gettext import gettext as _ - -from .core import Argument -from .core import BaseCommand -from .core import Context -from .core import MultiCommand -from .core import Option -from .core import Parameter -from .core import ParameterSource -from .parser import split_arg_string -from .utils import echo - - -def shell_complete( - cli: BaseCommand, - ctx_args: t.Dict[str, t.Any], - prog_name: str, - complete_var: str, - instruction: str, -) -> int: - """Perform shell completion for the given CLI program. - - :param cli: Command being called. - :param ctx_args: Extra arguments to pass to - ``cli.make_context``. - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. - :param instruction: Value of ``complete_var`` with the completion - instruction and shell, in the form ``instruction_shell``. - :return: Status code to exit with. - """ - shell, _, instruction = instruction.partition("_") - comp_cls = get_completion_class(shell) - - if comp_cls is None: - return 1 - - comp = comp_cls(cli, ctx_args, prog_name, complete_var) - - if instruction == "source": - echo(comp.source()) - return 0 - - if instruction == "complete": - echo(comp.complete()) - return 0 - - return 1 - - -class CompletionItem: - """Represents a completion value and metadata about the value. The - default metadata is ``type`` to indicate special shell handling, - and ``help`` if a shell supports showing a help string next to the - value. - - Arbitrary parameters can be passed when creating the object, and - accessed using ``item.attr``. If an attribute wasn't passed, - accessing it returns ``None``. - - :param value: The completion suggestion. - :param type: Tells the shell script to provide special completion - support for the type. Click uses ``"dir"`` and ``"file"``. - :param help: String shown next to the value if supported. - :param kwargs: Arbitrary metadata. The built-in implementations - don't use this, but custom type completions paired with custom - shell support could use it. - """ - - __slots__ = ("value", "type", "help", "_info") - - def __init__( - self, - value: t.Any, - type: str = "plain", - help: t.Optional[str] = None, - **kwargs: t.Any, - ) -> None: - self.value = value - self.type = type - self.help = help - self._info = kwargs - - def __getattr__(self, name: str) -> t.Any: - return self._info.get(name) - - -# Only Bash >= 4.4 has the nosort option. -_SOURCE_BASH = """\ -%(complete_func)s() { - local IFS=$'\\n' - local response - - response=$(env COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD \ -%(complete_var)s=bash_complete $1) - - for completion in $response; do - IFS=',' read type value <<< "$completion" - - if [[ $type == 'dir' ]]; then - COMPREPLY=() - compopt -o dirnames - elif [[ $type == 'file' ]]; then - COMPREPLY=() - compopt -o default - elif [[ $type == 'plain' ]]; then - COMPREPLY+=($value) - fi - done - - return 0 -} - -%(complete_func)s_setup() { - complete -o nosort -F %(complete_func)s %(prog_name)s -} - -%(complete_func)s_setup; -""" - -_SOURCE_ZSH = """\ -#compdef %(prog_name)s - -%(complete_func)s() { - local -a completions - local -a completions_with_descriptions - local -a response - (( ! $+commands[%(prog_name)s] )) && return 1 - - response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) \ -%(complete_var)s=zsh_complete %(prog_name)s)}") - - for type key descr in ${response}; do - if [[ "$type" == "plain" ]]; then - if [[ "$descr" == "_" ]]; then - completions+=("$key") - else - completions_with_descriptions+=("$key":"$descr") - fi - elif [[ "$type" == "dir" ]]; then - _path_files -/ - elif [[ "$type" == "file" ]]; then - _path_files -f - fi - done - - if [ -n "$completions_with_descriptions" ]; then - _describe -V unsorted completions_with_descriptions -U - fi - - if [ -n "$completions" ]; then - compadd -U -V unsorted -a completions - fi -} - -compdef %(complete_func)s %(prog_name)s; -""" - -_SOURCE_FISH = """\ -function %(complete_func)s; - set -l response; - - for value in (env %(complete_var)s=fish_complete COMP_WORDS=(commandline -cp) \ -COMP_CWORD=(commandline -t) %(prog_name)s); - set response $response $value; - end; - - for completion in $response; - set -l metadata (string split "," $completion); - - if test $metadata[1] = "dir"; - __fish_complete_directories $metadata[2]; - else if test $metadata[1] = "file"; - __fish_complete_path $metadata[2]; - else if test $metadata[1] = "plain"; - echo $metadata[2]; - end; - end; -end; - -complete --no-files --command %(prog_name)s --arguments \ -"(%(complete_func)s)"; -""" - - -class ShellComplete: - """Base class for providing shell completion support. A subclass for - a given shell will override attributes and methods to implement the - completion instructions (``source`` and ``complete``). - - :param cli: Command being called. - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. - - .. versionadded:: 8.0 - """ - - name: t.ClassVar[str] - """Name to register the shell as with :func:`add_completion_class`. - This is used in completion instructions (``{name}_source`` and - ``{name}_complete``). - """ - - source_template: t.ClassVar[str] - """Completion script template formatted by :meth:`source`. This must - be provided by subclasses. - """ - - def __init__( - self, - cli: BaseCommand, - ctx_args: t.Dict[str, t.Any], - prog_name: str, - complete_var: str, - ) -> None: - self.cli = cli - self.ctx_args = ctx_args - self.prog_name = prog_name - self.complete_var = complete_var - - @property - def func_name(self) -> str: - """The name of the shell function defined by the completion - script. - """ - safe_name = re.sub(r"\W*", "", self.prog_name.replace("-", "_"), re.ASCII) - return f"_{safe_name}_completion" - - def source_vars(self) -> t.Dict[str, t.Any]: - """Vars for formatting :attr:`source_template`. - - By default this provides ``complete_func``, ``complete_var``, - and ``prog_name``. - """ - return { - "complete_func": self.func_name, - "complete_var": self.complete_var, - "prog_name": self.prog_name, - } - - def source(self) -> str: - """Produce the shell script that defines the completion - function. By default this ``%``-style formats - :attr:`source_template` with the dict returned by - :meth:`source_vars`. - """ - return self.source_template % self.source_vars() - - def get_completion_args(self) -> t.Tuple[t.List[str], str]: - """Use the env vars defined by the shell script to return a - tuple of ``args, incomplete``. This must be implemented by - subclasses. - """ - raise NotImplementedError - - def get_completions( - self, args: t.List[str], incomplete: str - ) -> t.List[CompletionItem]: - """Determine the context and last complete command or parameter - from the complete args. Call that object's ``shell_complete`` - method to get the completions for the incomplete value. - - :param args: List of complete args before the incomplete value. - :param incomplete: Value being completed. May be empty. - """ - ctx = _resolve_context(self.cli, self.ctx_args, self.prog_name, args) - obj, incomplete = _resolve_incomplete(ctx, args, incomplete) - return obj.shell_complete(ctx, incomplete) - - def format_completion(self, item: CompletionItem) -> str: - """Format a completion item into the form recognized by the - shell script. This must be implemented by subclasses. - - :param item: Completion item to format. - """ - raise NotImplementedError - - def complete(self) -> str: - """Produce the completion data to send back to the shell. - - By default this calls :meth:`get_completion_args`, gets the - completions, then calls :meth:`format_completion` for each - completion. - """ - args, incomplete = self.get_completion_args() - completions = self.get_completions(args, incomplete) - out = [self.format_completion(item) for item in completions] - return "\n".join(out) - - -class BashComplete(ShellComplete): - """Shell completion for Bash.""" - - name = "bash" - source_template = _SOURCE_BASH - - def _check_version(self) -> None: - import subprocess - - output = subprocess.run( - ["bash", "-c", "echo ${BASH_VERSION}"], stdout=subprocess.PIPE - ) - match = re.search(r"^(\d+)\.(\d+)\.\d+", output.stdout.decode()) - - if match is not None: - major, minor = match.groups() - - if major < "4" or major == "4" and minor < "4": - raise RuntimeError( - _( - "Shell completion is not supported for Bash" - " versions older than 4.4." - ) - ) - else: - raise RuntimeError( - _("Couldn't detect Bash version, shell completion is not supported.") - ) - - def source(self) -> str: - self._check_version() - return super().source() - - def get_completion_args(self) -> t.Tuple[t.List[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - cword = int(os.environ["COMP_CWORD"]) - args = cwords[1:cword] - - try: - incomplete = cwords[cword] - except IndexError: - incomplete = "" - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - return f"{item.type},{item.value}" - - -class ZshComplete(ShellComplete): - """Shell completion for Zsh.""" - - name = "zsh" - source_template = _SOURCE_ZSH - - def get_completion_args(self) -> t.Tuple[t.List[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - cword = int(os.environ["COMP_CWORD"]) - args = cwords[1:cword] - - try: - incomplete = cwords[cword] - except IndexError: - incomplete = "" - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - return f"{item.type}\n{item.value}\n{item.help if item.help else '_'}" - - -class FishComplete(ShellComplete): - """Shell completion for Fish.""" - - name = "fish" - source_template = _SOURCE_FISH - - def get_completion_args(self) -> t.Tuple[t.List[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - incomplete = os.environ["COMP_CWORD"] - args = cwords[1:] - - # Fish stores the partial word in both COMP_WORDS and - # COMP_CWORD, remove it from complete args. - if incomplete and args and args[-1] == incomplete: - args.pop() - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - if item.help: - return f"{item.type},{item.value}\t{item.help}" - - return f"{item.type},{item.value}" - - -_available_shells: t.Dict[str, t.Type[ShellComplete]] = { - "bash": BashComplete, - "fish": FishComplete, - "zsh": ZshComplete, -} - - -def add_completion_class( - cls: t.Type[ShellComplete], name: t.Optional[str] = None -) -> None: - """Register a :class:`ShellComplete` subclass under the given name. - The name will be provided by the completion instruction environment - variable during completion. - - :param cls: The completion class that will handle completion for the - shell. - :param name: Name to register the class under. Defaults to the - class's ``name`` attribute. - """ - if name is None: - name = cls.name - - _available_shells[name] = cls - - -def get_completion_class(shell: str) -> t.Optional[t.Type[ShellComplete]]: - """Look up a registered :class:`ShellComplete` subclass by the name - provided by the completion instruction environment variable. If the - name isn't registered, returns ``None``. - - :param shell: Name the class is registered under. - """ - return _available_shells.get(shell) - - -def _is_incomplete_argument(ctx: Context, param: Parameter) -> bool: - """Determine if the given parameter is an argument that can still - accept values. - - :param ctx: Invocation context for the command represented by the - parsed complete args. - :param param: Argument object being checked. - """ - if not isinstance(param, Argument): - return False - - assert param.name is not None - value = ctx.params[param.name] - return ( - param.nargs == -1 - or ctx.get_parameter_source(param.name) is not ParameterSource.COMMANDLINE - or ( - param.nargs > 1 - and isinstance(value, (tuple, list)) - and len(value) < param.nargs - ) - ) - - -def _start_of_option(ctx: Context, value: str) -> bool: - """Check if the value looks like the start of an option.""" - if not value: - return False - - c = value[0] - return c in ctx._opt_prefixes - - -def _is_incomplete_option(ctx: Context, args: t.List[str], param: Parameter) -> bool: - """Determine if the given parameter is an option that needs a value. - - :param args: List of complete args before the incomplete value. - :param param: Option object being checked. - """ - if not isinstance(param, Option): - return False - - if param.is_flag or param.count: - return False - - last_option = None - - for index, arg in enumerate(reversed(args)): - if index + 1 > param.nargs: - break - - if _start_of_option(ctx, arg): - last_option = arg - - return last_option is not None and last_option in param.opts - - -def _resolve_context( - cli: BaseCommand, ctx_args: t.Dict[str, t.Any], prog_name: str, args: t.List[str] -) -> Context: - """Produce the context hierarchy starting with the command and - traversing the complete arguments. This only follows the commands, - it doesn't trigger input prompts or callbacks. - - :param cli: Command being called. - :param prog_name: Name of the executable in the shell. - :param args: List of complete args before the incomplete value. - """ - ctx_args["resilient_parsing"] = True - ctx = cli.make_context(prog_name, args.copy(), **ctx_args) - args = ctx.protected_args + ctx.args - - while args: - command = ctx.command - - if isinstance(command, MultiCommand): - if not command.chain: - name, cmd, args = command.resolve_command(ctx, args) - - if cmd is None: - return ctx - - ctx = cmd.make_context(name, args, parent=ctx, resilient_parsing=True) - args = ctx.protected_args + ctx.args - else: - while args: - name, cmd, args = command.resolve_command(ctx, args) - - if cmd is None: - return ctx - - sub_ctx = cmd.make_context( - name, - args, - parent=ctx, - allow_extra_args=True, - allow_interspersed_args=False, - resilient_parsing=True, - ) - args = sub_ctx.args - - ctx = sub_ctx - args = [*sub_ctx.protected_args, *sub_ctx.args] - else: - break - - return ctx - - -def _resolve_incomplete( - ctx: Context, args: t.List[str], incomplete: str -) -> t.Tuple[t.Union[BaseCommand, Parameter], str]: - """Find the Click object that will handle the completion of the - incomplete value. Return the object and the incomplete value. - - :param ctx: Invocation context for the command represented by - the parsed complete args. - :param args: List of complete args before the incomplete value. - :param incomplete: Value being completed. May be empty. - """ - # Different shells treat an "=" between a long option name and - # value differently. Might keep the value joined, return the "=" - # as a separate item, or return the split name and value. Always - # split and discard the "=" to make completion easier. - if incomplete == "=": - incomplete = "" - elif "=" in incomplete and _start_of_option(ctx, incomplete): - name, _, incomplete = incomplete.partition("=") - args.append(name) - - # The "--" marker tells Click to stop treating values as options - # even if they start with the option character. If it hasn't been - # given and the incomplete arg looks like an option, the current - # command will provide option name completions. - if "--" not in args and _start_of_option(ctx, incomplete): - return ctx.command, incomplete - - params = ctx.command.get_params(ctx) - - # If the last complete arg is an option name with an incomplete - # value, the option will provide value completions. - for param in params: - if _is_incomplete_option(ctx, args, param): - return param, incomplete - - # It's not an option name or value. The first argument without a - # parsed value will provide value completions. - for param in params: - if _is_incomplete_argument(ctx, param): - return param, incomplete - - # There were no unparsed arguments, the command may be a group that - # will provide command name completions. - return ctx.command, incomplete diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/termui.py b/venv_flaskchat/lib/python3.11/site-packages/click/termui.py deleted file mode 100644 index bfb2f5a..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click/termui.py +++ /dev/null @@ -1,787 +0,0 @@ -import inspect -import io -import itertools -import os -import sys -import typing as t -from gettext import gettext as _ - -from ._compat import isatty -from ._compat import strip_ansi -from ._compat import WIN -from .exceptions import Abort -from .exceptions import UsageError -from .globals import resolve_color_default -from .types import Choice -from .types import convert_type -from .types import ParamType -from .utils import echo -from .utils import LazyFile - -if t.TYPE_CHECKING: - from ._termui_impl import ProgressBar - -V = t.TypeVar("V") - -# The prompt functions to use. The doc tools currently override these -# functions to customize how they work. -visible_prompt_func: t.Callable[[str], str] = input - -_ansi_colors = { - "black": 30, - "red": 31, - "green": 32, - "yellow": 33, - "blue": 34, - "magenta": 35, - "cyan": 36, - "white": 37, - "reset": 39, - "bright_black": 90, - "bright_red": 91, - "bright_green": 92, - "bright_yellow": 93, - "bright_blue": 94, - "bright_magenta": 95, - "bright_cyan": 96, - "bright_white": 97, -} -_ansi_reset_all = "\033[0m" - - -def hidden_prompt_func(prompt: str) -> str: - import getpass - - return getpass.getpass(prompt) - - -def _build_prompt( - text: str, - suffix: str, - show_default: bool = False, - default: t.Optional[t.Any] = None, - show_choices: bool = True, - type: t.Optional[ParamType] = None, -) -> str: - prompt = text - if type is not None and show_choices and isinstance(type, Choice): - prompt += f" ({', '.join(map(str, type.choices))})" - if default is not None and show_default: - prompt = f"{prompt} [{_format_default(default)}]" - return f"{prompt}{suffix}" - - -def _format_default(default: t.Any) -> t.Any: - if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"): - return default.name # type: ignore - - return default - - -def prompt( - text: str, - default: t.Optional[t.Any] = None, - hide_input: bool = False, - confirmation_prompt: t.Union[bool, str] = False, - type: t.Optional[t.Union[ParamType, t.Any]] = None, - value_proc: t.Optional[t.Callable[[str], t.Any]] = None, - prompt_suffix: str = ": ", - show_default: bool = True, - err: bool = False, - show_choices: bool = True, -) -> t.Any: - """Prompts a user for input. This is a convenience function that can - be used to prompt a user for input later. - - If the user aborts the input by sending an interrupt signal, this - function will catch it and raise a :exc:`Abort` exception. - - :param text: the text to show for the prompt. - :param default: the default value to use if no input happens. If this - is not given it will prompt until it's aborted. - :param hide_input: if this is set to true then the input value will - be hidden. - :param confirmation_prompt: Prompt a second time to confirm the - value. Can be set to a string instead of ``True`` to customize - the message. - :param type: the type to use to check the value against. - :param value_proc: if this parameter is provided it's a function that - is invoked instead of the type conversion to - convert a value. - :param prompt_suffix: a suffix that should be added to the prompt. - :param show_default: shows or hides the default value in the prompt. - :param err: if set to true the file defaults to ``stderr`` instead of - ``stdout``, the same as with echo. - :param show_choices: Show or hide choices if the passed type is a Choice. - For example if type is a Choice of either day or week, - show_choices is true and text is "Group by" then the - prompt will be "Group by (day, week): ". - - .. versionadded:: 8.0 - ``confirmation_prompt`` can be a custom string. - - .. versionadded:: 7.0 - Added the ``show_choices`` parameter. - - .. versionadded:: 6.0 - Added unicode support for cmd.exe on Windows. - - .. versionadded:: 4.0 - Added the `err` parameter. - - """ - - def prompt_func(text: str) -> str: - f = hidden_prompt_func if hide_input else visible_prompt_func - try: - # Write the prompt separately so that we get nice - # coloring through colorama on Windows - echo(text.rstrip(" "), nl=False, err=err) - # Echo a space to stdout to work around an issue where - # readline causes backspace to clear the whole line. - return f(" ") - except (KeyboardInterrupt, EOFError): - # getpass doesn't print a newline if the user aborts input with ^C. - # Allegedly this behavior is inherited from getpass(3). - # A doc bug has been filed at https://bugs.python.org/issue24711 - if hide_input: - echo(None, err=err) - raise Abort() from None - - if value_proc is None: - value_proc = convert_type(type, default) - - prompt = _build_prompt( - text, prompt_suffix, show_default, default, show_choices, type - ) - - if confirmation_prompt: - if confirmation_prompt is True: - confirmation_prompt = _("Repeat for confirmation") - - confirmation_prompt = _build_prompt(confirmation_prompt, prompt_suffix) - - while True: - while True: - value = prompt_func(prompt) - if value: - break - elif default is not None: - value = default - break - try: - result = value_proc(value) - except UsageError as e: - if hide_input: - echo(_("Error: The value you entered was invalid."), err=err) - else: - echo(_("Error: {e.message}").format(e=e), err=err) # noqa: B306 - continue - if not confirmation_prompt: - return result - while True: - value2 = prompt_func(confirmation_prompt) - is_empty = not value and not value2 - if value2 or is_empty: - break - if value == value2: - return result - echo(_("Error: The two entered values do not match."), err=err) - - -def confirm( - text: str, - default: t.Optional[bool] = False, - abort: bool = False, - prompt_suffix: str = ": ", - show_default: bool = True, - err: bool = False, -) -> bool: - """Prompts for confirmation (yes/no question). - - If the user aborts the input by sending a interrupt signal this - function will catch it and raise a :exc:`Abort` exception. - - :param text: the question to ask. - :param default: The default value to use when no input is given. If - ``None``, repeat until input is given. - :param abort: if this is set to `True` a negative answer aborts the - exception by raising :exc:`Abort`. - :param prompt_suffix: a suffix that should be added to the prompt. - :param show_default: shows or hides the default value in the prompt. - :param err: if set to true the file defaults to ``stderr`` instead of - ``stdout``, the same as with echo. - - .. versionchanged:: 8.0 - Repeat until input is given if ``default`` is ``None``. - - .. versionadded:: 4.0 - Added the ``err`` parameter. - """ - prompt = _build_prompt( - text, - prompt_suffix, - show_default, - "y/n" if default is None else ("Y/n" if default else "y/N"), - ) - - while True: - try: - # Write the prompt separately so that we get nice - # coloring through colorama on Windows - echo(prompt.rstrip(" "), nl=False, err=err) - # Echo a space to stdout to work around an issue where - # readline causes backspace to clear the whole line. - value = visible_prompt_func(" ").lower().strip() - except (KeyboardInterrupt, EOFError): - raise Abort() from None - if value in ("y", "yes"): - rv = True - elif value in ("n", "no"): - rv = False - elif default is not None and value == "": - rv = default - else: - echo(_("Error: invalid input"), err=err) - continue - break - if abort and not rv: - raise Abort() - return rv - - -def echo_via_pager( - text_or_generator: t.Union[t.Iterable[str], t.Callable[[], t.Iterable[str]], str], - color: t.Optional[bool] = None, -) -> None: - """This function takes a text and shows it via an environment specific - pager on stdout. - - .. versionchanged:: 3.0 - Added the `color` flag. - - :param text_or_generator: the text to page, or alternatively, a - generator emitting the text to page. - :param color: controls if the pager supports ANSI colors or not. The - default is autodetection. - """ - color = resolve_color_default(color) - - if inspect.isgeneratorfunction(text_or_generator): - i = t.cast(t.Callable[[], t.Iterable[str]], text_or_generator)() - elif isinstance(text_or_generator, str): - i = [text_or_generator] - else: - i = iter(t.cast(t.Iterable[str], text_or_generator)) - - # convert every element of i to a text type if necessary - text_generator = (el if isinstance(el, str) else str(el) for el in i) - - from ._termui_impl import pager - - return pager(itertools.chain(text_generator, "\n"), color) - - -def progressbar( - iterable: t.Optional[t.Iterable[V]] = None, - length: t.Optional[int] = None, - label: t.Optional[str] = None, - show_eta: bool = True, - show_percent: t.Optional[bool] = None, - show_pos: bool = False, - item_show_func: t.Optional[t.Callable[[t.Optional[V]], t.Optional[str]]] = None, - fill_char: str = "#", - empty_char: str = "-", - bar_template: str = "%(label)s [%(bar)s] %(info)s", - info_sep: str = " ", - width: int = 36, - file: t.Optional[t.TextIO] = None, - color: t.Optional[bool] = None, - update_min_steps: int = 1, -) -> "ProgressBar[V]": - """This function creates an iterable context manager that can be used - to iterate over something while showing a progress bar. It will - either iterate over the `iterable` or `length` items (that are counted - up). While iteration happens, this function will print a rendered - progress bar to the given `file` (defaults to stdout) and will attempt - to calculate remaining time and more. By default, this progress bar - will not be rendered if the file is not a terminal. - - The context manager creates the progress bar. When the context - manager is entered the progress bar is already created. With every - iteration over the progress bar, the iterable passed to the bar is - advanced and the bar is updated. When the context manager exits, - a newline is printed and the progress bar is finalized on screen. - - Note: The progress bar is currently designed for use cases where the - total progress can be expected to take at least several seconds. - Because of this, the ProgressBar class object won't display - progress that is considered too fast, and progress where the time - between steps is less than a second. - - No printing must happen or the progress bar will be unintentionally - destroyed. - - Example usage:: - - with progressbar(items) as bar: - for item in bar: - do_something_with(item) - - Alternatively, if no iterable is specified, one can manually update the - progress bar through the `update()` method instead of directly - iterating over the progress bar. The update method accepts the number - of steps to increment the bar with:: - - with progressbar(length=chunks.total_bytes) as bar: - for chunk in chunks: - process_chunk(chunk) - bar.update(chunks.bytes) - - The ``update()`` method also takes an optional value specifying the - ``current_item`` at the new position. This is useful when used - together with ``item_show_func`` to customize the output for each - manual step:: - - with click.progressbar( - length=total_size, - label='Unzipping archive', - item_show_func=lambda a: a.filename - ) as bar: - for archive in zip_file: - archive.extract() - bar.update(archive.size, archive) - - :param iterable: an iterable to iterate over. If not provided the length - is required. - :param length: the number of items to iterate over. By default the - progressbar will attempt to ask the iterator about its - length, which might or might not work. If an iterable is - also provided this parameter can be used to override the - length. If an iterable is not provided the progress bar - will iterate over a range of that length. - :param label: the label to show next to the progress bar. - :param show_eta: enables or disables the estimated time display. This is - automatically disabled if the length cannot be - determined. - :param show_percent: enables or disables the percentage display. The - default is `True` if the iterable has a length or - `False` if not. - :param show_pos: enables or disables the absolute position display. The - default is `False`. - :param item_show_func: A function called with the current item which - can return a string to show next to the progress bar. If the - function returns ``None`` nothing is shown. The current item can - be ``None``, such as when entering and exiting the bar. - :param fill_char: the character to use to show the filled part of the - progress bar. - :param empty_char: the character to use to show the non-filled part of - the progress bar. - :param bar_template: the format string to use as template for the bar. - The parameters in it are ``label`` for the label, - ``bar`` for the progress bar and ``info`` for the - info section. - :param info_sep: the separator between multiple info items (eta etc.) - :param width: the width of the progress bar in characters, 0 means full - terminal width - :param file: The file to write to. If this is not a terminal then - only the label is printed. - :param color: controls if the terminal supports ANSI colors or not. The - default is autodetection. This is only needed if ANSI - codes are included anywhere in the progress bar output - which is not the case by default. - :param update_min_steps: Render only when this many updates have - completed. This allows tuning for very fast iterators. - - .. versionchanged:: 8.0 - Output is shown even if execution time is less than 0.5 seconds. - - .. versionchanged:: 8.0 - ``item_show_func`` shows the current item, not the previous one. - - .. versionchanged:: 8.0 - Labels are echoed if the output is not a TTY. Reverts a change - in 7.0 that removed all output. - - .. versionadded:: 8.0 - Added the ``update_min_steps`` parameter. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. Added the ``update`` method to - the object. - - .. versionadded:: 2.0 - """ - from ._termui_impl import ProgressBar - - color = resolve_color_default(color) - return ProgressBar( - iterable=iterable, - length=length, - show_eta=show_eta, - show_percent=show_percent, - show_pos=show_pos, - item_show_func=item_show_func, - fill_char=fill_char, - empty_char=empty_char, - bar_template=bar_template, - info_sep=info_sep, - file=file, - label=label, - width=width, - color=color, - update_min_steps=update_min_steps, - ) - - -def clear() -> None: - """Clears the terminal screen. This will have the effect of clearing - the whole visible space of the terminal and moving the cursor to the - top left. This does not do anything if not connected to a terminal. - - .. versionadded:: 2.0 - """ - if not isatty(sys.stdout): - return - if WIN: - os.system("cls") - else: - sys.stdout.write("\033[2J\033[1;1H") - - -def _interpret_color( - color: t.Union[int, t.Tuple[int, int, int], str], offset: int = 0 -) -> str: - if isinstance(color, int): - return f"{38 + offset};5;{color:d}" - - if isinstance(color, (tuple, list)): - r, g, b = color - return f"{38 + offset};2;{r:d};{g:d};{b:d}" - - return str(_ansi_colors[color] + offset) - - -def style( - text: t.Any, - fg: t.Optional[t.Union[int, t.Tuple[int, int, int], str]] = None, - bg: t.Optional[t.Union[int, t.Tuple[int, int, int], str]] = None, - bold: t.Optional[bool] = None, - dim: t.Optional[bool] = None, - underline: t.Optional[bool] = None, - overline: t.Optional[bool] = None, - italic: t.Optional[bool] = None, - blink: t.Optional[bool] = None, - reverse: t.Optional[bool] = None, - strikethrough: t.Optional[bool] = None, - reset: bool = True, -) -> str: - """Styles a text with ANSI styles and returns the new string. By - default the styling is self contained which means that at the end - of the string a reset code is issued. This can be prevented by - passing ``reset=False``. - - Examples:: - - click.echo(click.style('Hello World!', fg='green')) - click.echo(click.style('ATTENTION!', blink=True)) - click.echo(click.style('Some things', reverse=True, fg='cyan')) - click.echo(click.style('More colors', fg=(255, 12, 128), bg=117)) - - Supported color names: - - * ``black`` (might be a gray) - * ``red`` - * ``green`` - * ``yellow`` (might be an orange) - * ``blue`` - * ``magenta`` - * ``cyan`` - * ``white`` (might be light gray) - * ``bright_black`` - * ``bright_red`` - * ``bright_green`` - * ``bright_yellow`` - * ``bright_blue`` - * ``bright_magenta`` - * ``bright_cyan`` - * ``bright_white`` - * ``reset`` (reset the color code only) - - If the terminal supports it, color may also be specified as: - - - An integer in the interval [0, 255]. The terminal must support - 8-bit/256-color mode. - - An RGB tuple of three integers in [0, 255]. The terminal must - support 24-bit/true-color mode. - - See https://en.wikipedia.org/wiki/ANSI_color and - https://gist.github.com/XVilka/8346728 for more information. - - :param text: the string to style with ansi codes. - :param fg: if provided this will become the foreground color. - :param bg: if provided this will become the background color. - :param bold: if provided this will enable or disable bold mode. - :param dim: if provided this will enable or disable dim mode. This is - badly supported. - :param underline: if provided this will enable or disable underline. - :param overline: if provided this will enable or disable overline. - :param italic: if provided this will enable or disable italic. - :param blink: if provided this will enable or disable blinking. - :param reverse: if provided this will enable or disable inverse - rendering (foreground becomes background and the - other way round). - :param strikethrough: if provided this will enable or disable - striking through text. - :param reset: by default a reset-all code is added at the end of the - string which means that styles do not carry over. This - can be disabled to compose styles. - - .. versionchanged:: 8.0 - A non-string ``message`` is converted to a string. - - .. versionchanged:: 8.0 - Added support for 256 and RGB color codes. - - .. versionchanged:: 8.0 - Added the ``strikethrough``, ``italic``, and ``overline`` - parameters. - - .. versionchanged:: 7.0 - Added support for bright colors. - - .. versionadded:: 2.0 - """ - if not isinstance(text, str): - text = str(text) - - bits = [] - - if fg: - try: - bits.append(f"\033[{_interpret_color(fg)}m") - except KeyError: - raise TypeError(f"Unknown color {fg!r}") from None - - if bg: - try: - bits.append(f"\033[{_interpret_color(bg, 10)}m") - except KeyError: - raise TypeError(f"Unknown color {bg!r}") from None - - if bold is not None: - bits.append(f"\033[{1 if bold else 22}m") - if dim is not None: - bits.append(f"\033[{2 if dim else 22}m") - if underline is not None: - bits.append(f"\033[{4 if underline else 24}m") - if overline is not None: - bits.append(f"\033[{53 if overline else 55}m") - if italic is not None: - bits.append(f"\033[{3 if italic else 23}m") - if blink is not None: - bits.append(f"\033[{5 if blink else 25}m") - if reverse is not None: - bits.append(f"\033[{7 if reverse else 27}m") - if strikethrough is not None: - bits.append(f"\033[{9 if strikethrough else 29}m") - bits.append(text) - if reset: - bits.append(_ansi_reset_all) - return "".join(bits) - - -def unstyle(text: str) -> str: - """Removes ANSI styling information from a string. Usually it's not - necessary to use this function as Click's echo function will - automatically remove styling if necessary. - - .. versionadded:: 2.0 - - :param text: the text to remove style information from. - """ - return strip_ansi(text) - - -def secho( - message: t.Optional[t.Any] = None, - file: t.Optional[t.IO[t.AnyStr]] = None, - nl: bool = True, - err: bool = False, - color: t.Optional[bool] = None, - **styles: t.Any, -) -> None: - """This function combines :func:`echo` and :func:`style` into one - call. As such the following two calls are the same:: - - click.secho('Hello World!', fg='green') - click.echo(click.style('Hello World!', fg='green')) - - All keyword arguments are forwarded to the underlying functions - depending on which one they go with. - - Non-string types will be converted to :class:`str`. However, - :class:`bytes` are passed directly to :meth:`echo` without applying - style. If you want to style bytes that represent text, call - :meth:`bytes.decode` first. - - .. versionchanged:: 8.0 - A non-string ``message`` is converted to a string. Bytes are - passed through without style applied. - - .. versionadded:: 2.0 - """ - if message is not None and not isinstance(message, (bytes, bytearray)): - message = style(message, **styles) - - return echo(message, file=file, nl=nl, err=err, color=color) - - -def edit( - text: t.Optional[t.AnyStr] = None, - editor: t.Optional[str] = None, - env: t.Optional[t.Mapping[str, str]] = None, - require_save: bool = True, - extension: str = ".txt", - filename: t.Optional[str] = None, -) -> t.Optional[t.AnyStr]: - r"""Edits the given text in the defined editor. If an editor is given - (should be the full path to the executable but the regular operating - system search path is used for finding the executable) it overrides - the detected editor. Optionally, some environment variables can be - used. If the editor is closed without changes, `None` is returned. In - case a file is edited directly the return value is always `None` and - `require_save` and `extension` are ignored. - - If the editor cannot be opened a :exc:`UsageError` is raised. - - Note for Windows: to simplify cross-platform usage, the newlines are - automatically converted from POSIX to Windows and vice versa. As such, - the message here will have ``\n`` as newline markers. - - :param text: the text to edit. - :param editor: optionally the editor to use. Defaults to automatic - detection. - :param env: environment variables to forward to the editor. - :param require_save: if this is true, then not saving in the editor - will make the return value become `None`. - :param extension: the extension to tell the editor about. This defaults - to `.txt` but changing this might change syntax - highlighting. - :param filename: if provided it will edit this file instead of the - provided text contents. It will not use a temporary - file as an indirection in that case. - """ - from ._termui_impl import Editor - - ed = Editor(editor=editor, env=env, require_save=require_save, extension=extension) - - if filename is None: - return ed.edit(text) - - ed.edit_file(filename) - return None - - -def launch(url: str, wait: bool = False, locate: bool = False) -> int: - """This function launches the given URL (or filename) in the default - viewer application for this file type. If this is an executable, it - might launch the executable in a new session. The return value is - the exit code of the launched application. Usually, ``0`` indicates - success. - - Examples:: - - click.launch('https://click.palletsprojects.com/') - click.launch('/my/downloaded/file', locate=True) - - .. versionadded:: 2.0 - - :param url: URL or filename of the thing to launch. - :param wait: Wait for the program to exit before returning. This - only works if the launched program blocks. In particular, - ``xdg-open`` on Linux does not block. - :param locate: if this is set to `True` then instead of launching the - application associated with the URL it will attempt to - launch a file manager with the file located. This - might have weird effects if the URL does not point to - the filesystem. - """ - from ._termui_impl import open_url - - return open_url(url, wait=wait, locate=locate) - - -# If this is provided, getchar() calls into this instead. This is used -# for unittesting purposes. -_getchar: t.Optional[t.Callable[[bool], str]] = None - - -def getchar(echo: bool = False) -> str: - """Fetches a single character from the terminal and returns it. This - will always return a unicode character and under certain rare - circumstances this might return more than one character. The - situations which more than one character is returned is when for - whatever reason multiple characters end up in the terminal buffer or - standard input was not actually a terminal. - - Note that this will always read from the terminal, even if something - is piped into the standard input. - - Note for Windows: in rare cases when typing non-ASCII characters, this - function might wait for a second character and then return both at once. - This is because certain Unicode characters look like special-key markers. - - .. versionadded:: 2.0 - - :param echo: if set to `True`, the character read will also show up on - the terminal. The default is to not show it. - """ - global _getchar - - if _getchar is None: - from ._termui_impl import getchar as f - - _getchar = f - - return _getchar(echo) - - -def raw_terminal() -> t.ContextManager[int]: - from ._termui_impl import raw_terminal as f - - return f() - - -def pause(info: t.Optional[str] = None, err: bool = False) -> None: - """This command stops execution and waits for the user to press any - key to continue. This is similar to the Windows batch "pause" - command. If the program is not run through a terminal, this command - will instead do nothing. - - .. versionadded:: 2.0 - - .. versionadded:: 4.0 - Added the `err` parameter. - - :param info: The message to print before pausing. Defaults to - ``"Press any key to continue..."``. - :param err: if set to message goes to ``stderr`` instead of - ``stdout``, the same as with echo. - """ - if not isatty(sys.stdin) or not isatty(sys.stdout): - return - - if info is None: - info = _("Press any key to continue...") - - try: - if info: - echo(info, nl=False, err=err) - try: - getchar() - except (KeyboardInterrupt, EOFError): - pass - finally: - if info: - echo(err=err) diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/testing.py b/venv_flaskchat/lib/python3.11/site-packages/click/testing.py deleted file mode 100644 index e395c2e..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click/testing.py +++ /dev/null @@ -1,479 +0,0 @@ -import contextlib -import io -import os -import shlex -import shutil -import sys -import tempfile -import typing as t -from types import TracebackType - -from . import formatting -from . import termui -from . import utils -from ._compat import _find_binary_reader - -if t.TYPE_CHECKING: - from .core import BaseCommand - - -class EchoingStdin: - def __init__(self, input: t.BinaryIO, output: t.BinaryIO) -> None: - self._input = input - self._output = output - self._paused = False - - def __getattr__(self, x: str) -> t.Any: - return getattr(self._input, x) - - def _echo(self, rv: bytes) -> bytes: - if not self._paused: - self._output.write(rv) - - return rv - - def read(self, n: int = -1) -> bytes: - return self._echo(self._input.read(n)) - - def read1(self, n: int = -1) -> bytes: - return self._echo(self._input.read1(n)) # type: ignore - - def readline(self, n: int = -1) -> bytes: - return self._echo(self._input.readline(n)) - - def readlines(self) -> t.List[bytes]: - return [self._echo(x) for x in self._input.readlines()] - - def __iter__(self) -> t.Iterator[bytes]: - return iter(self._echo(x) for x in self._input) - - def __repr__(self) -> str: - return repr(self._input) - - -@contextlib.contextmanager -def _pause_echo(stream: t.Optional[EchoingStdin]) -> t.Iterator[None]: - if stream is None: - yield - else: - stream._paused = True - yield - stream._paused = False - - -class _NamedTextIOWrapper(io.TextIOWrapper): - def __init__( - self, buffer: t.BinaryIO, name: str, mode: str, **kwargs: t.Any - ) -> None: - super().__init__(buffer, **kwargs) - self._name = name - self._mode = mode - - @property - def name(self) -> str: - return self._name - - @property - def mode(self) -> str: - return self._mode - - -def make_input_stream( - input: t.Optional[t.Union[str, bytes, t.IO]], charset: str -) -> t.BinaryIO: - # Is already an input stream. - if hasattr(input, "read"): - rv = _find_binary_reader(t.cast(t.IO, input)) - - if rv is not None: - return rv - - raise TypeError("Could not find binary reader for input stream.") - - if input is None: - input = b"" - elif isinstance(input, str): - input = input.encode(charset) - - return io.BytesIO(t.cast(bytes, input)) - - -class Result: - """Holds the captured result of an invoked CLI script.""" - - def __init__( - self, - runner: "CliRunner", - stdout_bytes: bytes, - stderr_bytes: t.Optional[bytes], - return_value: t.Any, - exit_code: int, - exception: t.Optional[BaseException], - exc_info: t.Optional[ - t.Tuple[t.Type[BaseException], BaseException, TracebackType] - ] = None, - ): - #: The runner that created the result - self.runner = runner - #: The standard output as bytes. - self.stdout_bytes = stdout_bytes - #: The standard error as bytes, or None if not available - self.stderr_bytes = stderr_bytes - #: The value returned from the invoked command. - #: - #: .. versionadded:: 8.0 - self.return_value = return_value - #: The exit code as integer. - self.exit_code = exit_code - #: The exception that happened if one did. - self.exception = exception - #: The traceback - self.exc_info = exc_info - - @property - def output(self) -> str: - """The (standard) output as unicode string.""" - return self.stdout - - @property - def stdout(self) -> str: - """The standard output as unicode string.""" - return self.stdout_bytes.decode(self.runner.charset, "replace").replace( - "\r\n", "\n" - ) - - @property - def stderr(self) -> str: - """The standard error as unicode string.""" - if self.stderr_bytes is None: - raise ValueError("stderr not separately captured") - return self.stderr_bytes.decode(self.runner.charset, "replace").replace( - "\r\n", "\n" - ) - - def __repr__(self) -> str: - exc_str = repr(self.exception) if self.exception else "okay" - return f"<{type(self).__name__} {exc_str}>" - - -class CliRunner: - """The CLI runner provides functionality to invoke a Click command line - script for unittesting purposes in a isolated environment. This only - works in single-threaded systems without any concurrency as it changes the - global interpreter state. - - :param charset: the character set for the input and output data. - :param env: a dictionary with environment variables for overriding. - :param echo_stdin: if this is set to `True`, then reading from stdin writes - to stdout. This is useful for showing examples in - some circumstances. Note that regular prompts - will automatically echo the input. - :param mix_stderr: if this is set to `False`, then stdout and stderr are - preserved as independent streams. This is useful for - Unix-philosophy apps that have predictable stdout and - noisy stderr, such that each may be measured - independently - """ - - def __init__( - self, - charset: str = "utf-8", - env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, - echo_stdin: bool = False, - mix_stderr: bool = True, - ) -> None: - self.charset = charset - self.env = env or {} - self.echo_stdin = echo_stdin - self.mix_stderr = mix_stderr - - def get_default_prog_name(self, cli: "BaseCommand") -> str: - """Given a command object it will return the default program name - for it. The default is the `name` attribute or ``"root"`` if not - set. - """ - return cli.name or "root" - - def make_env( - self, overrides: t.Optional[t.Mapping[str, t.Optional[str]]] = None - ) -> t.Mapping[str, t.Optional[str]]: - """Returns the environment overrides for invoking a script.""" - rv = dict(self.env) - if overrides: - rv.update(overrides) - return rv - - @contextlib.contextmanager - def isolation( - self, - input: t.Optional[t.Union[str, bytes, t.IO]] = None, - env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, - color: bool = False, - ) -> t.Iterator[t.Tuple[io.BytesIO, t.Optional[io.BytesIO]]]: - """A context manager that sets up the isolation for invoking of a - command line tool. This sets up stdin with the given input data - and `os.environ` with the overrides from the given dictionary. - This also rebinds some internals in Click to be mocked (like the - prompt functionality). - - This is automatically done in the :meth:`invoke` method. - - :param input: the input stream to put into sys.stdin. - :param env: the environment overrides as dictionary. - :param color: whether the output should contain color codes. The - application can still override this explicitly. - - .. versionchanged:: 8.0 - ``stderr`` is opened with ``errors="backslashreplace"`` - instead of the default ``"strict"``. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - """ - bytes_input = make_input_stream(input, self.charset) - echo_input = None - - old_stdin = sys.stdin - old_stdout = sys.stdout - old_stderr = sys.stderr - old_forced_width = formatting.FORCED_WIDTH - formatting.FORCED_WIDTH = 80 - - env = self.make_env(env) - - bytes_output = io.BytesIO() - - if self.echo_stdin: - bytes_input = echo_input = t.cast( - t.BinaryIO, EchoingStdin(bytes_input, bytes_output) - ) - - sys.stdin = text_input = _NamedTextIOWrapper( - bytes_input, encoding=self.charset, name="", mode="r" - ) - - if self.echo_stdin: - # Force unbuffered reads, otherwise TextIOWrapper reads a - # large chunk which is echoed early. - text_input._CHUNK_SIZE = 1 # type: ignore - - sys.stdout = _NamedTextIOWrapper( - bytes_output, encoding=self.charset, name="", mode="w" - ) - - bytes_error = None - if self.mix_stderr: - sys.stderr = sys.stdout - else: - bytes_error = io.BytesIO() - sys.stderr = _NamedTextIOWrapper( - bytes_error, - encoding=self.charset, - name="", - mode="w", - errors="backslashreplace", - ) - - @_pause_echo(echo_input) # type: ignore - def visible_input(prompt: t.Optional[str] = None) -> str: - sys.stdout.write(prompt or "") - val = text_input.readline().rstrip("\r\n") - sys.stdout.write(f"{val}\n") - sys.stdout.flush() - return val - - @_pause_echo(echo_input) # type: ignore - def hidden_input(prompt: t.Optional[str] = None) -> str: - sys.stdout.write(f"{prompt or ''}\n") - sys.stdout.flush() - return text_input.readline().rstrip("\r\n") - - @_pause_echo(echo_input) # type: ignore - def _getchar(echo: bool) -> str: - char = sys.stdin.read(1) - - if echo: - sys.stdout.write(char) - - sys.stdout.flush() - return char - - default_color = color - - def should_strip_ansi( - stream: t.Optional[t.IO] = None, color: t.Optional[bool] = None - ) -> bool: - if color is None: - return not default_color - return not color - - old_visible_prompt_func = termui.visible_prompt_func - old_hidden_prompt_func = termui.hidden_prompt_func - old__getchar_func = termui._getchar - old_should_strip_ansi = utils.should_strip_ansi # type: ignore - termui.visible_prompt_func = visible_input - termui.hidden_prompt_func = hidden_input - termui._getchar = _getchar - utils.should_strip_ansi = should_strip_ansi # type: ignore - - old_env = {} - try: - for key, value in env.items(): - old_env[key] = os.environ.get(key) - if value is None: - try: - del os.environ[key] - except Exception: - pass - else: - os.environ[key] = value - yield (bytes_output, bytes_error) - finally: - for key, value in old_env.items(): - if value is None: - try: - del os.environ[key] - except Exception: - pass - else: - os.environ[key] = value - sys.stdout = old_stdout - sys.stderr = old_stderr - sys.stdin = old_stdin - termui.visible_prompt_func = old_visible_prompt_func - termui.hidden_prompt_func = old_hidden_prompt_func - termui._getchar = old__getchar_func - utils.should_strip_ansi = old_should_strip_ansi # type: ignore - formatting.FORCED_WIDTH = old_forced_width - - def invoke( - self, - cli: "BaseCommand", - args: t.Optional[t.Union[str, t.Sequence[str]]] = None, - input: t.Optional[t.Union[str, bytes, t.IO]] = None, - env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, - catch_exceptions: bool = True, - color: bool = False, - **extra: t.Any, - ) -> Result: - """Invokes a command in an isolated environment. The arguments are - forwarded directly to the command line script, the `extra` keyword - arguments are passed to the :meth:`~clickpkg.Command.main` function of - the command. - - This returns a :class:`Result` object. - - :param cli: the command to invoke - :param args: the arguments to invoke. It may be given as an iterable - or a string. When given as string it will be interpreted - as a Unix shell command. More details at - :func:`shlex.split`. - :param input: the input data for `sys.stdin`. - :param env: the environment overrides. - :param catch_exceptions: Whether to catch any other exceptions than - ``SystemExit``. - :param extra: the keyword arguments to pass to :meth:`main`. - :param color: whether the output should contain color codes. The - application can still override this explicitly. - - .. versionchanged:: 8.0 - The result object has the ``return_value`` attribute with - the value returned from the invoked command. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - - .. versionchanged:: 3.0 - Added the ``catch_exceptions`` parameter. - - .. versionchanged:: 3.0 - The result object has the ``exc_info`` attribute with the - traceback if available. - """ - exc_info = None - with self.isolation(input=input, env=env, color=color) as outstreams: - return_value = None - exception: t.Optional[BaseException] = None - exit_code = 0 - - if isinstance(args, str): - args = shlex.split(args) - - try: - prog_name = extra.pop("prog_name") - except KeyError: - prog_name = self.get_default_prog_name(cli) - - try: - return_value = cli.main(args=args or (), prog_name=prog_name, **extra) - except SystemExit as e: - exc_info = sys.exc_info() - e_code = t.cast(t.Optional[t.Union[int, t.Any]], e.code) - - if e_code is None: - e_code = 0 - - if e_code != 0: - exception = e - - if not isinstance(e_code, int): - sys.stdout.write(str(e_code)) - sys.stdout.write("\n") - e_code = 1 - - exit_code = e_code - - except Exception as e: - if not catch_exceptions: - raise - exception = e - exit_code = 1 - exc_info = sys.exc_info() - finally: - sys.stdout.flush() - stdout = outstreams[0].getvalue() - if self.mix_stderr: - stderr = None - else: - stderr = outstreams[1].getvalue() # type: ignore - - return Result( - runner=self, - stdout_bytes=stdout, - stderr_bytes=stderr, - return_value=return_value, - exit_code=exit_code, - exception=exception, - exc_info=exc_info, # type: ignore - ) - - @contextlib.contextmanager - def isolated_filesystem( - self, temp_dir: t.Optional[t.Union[str, os.PathLike]] = None - ) -> t.Iterator[str]: - """A context manager that creates a temporary directory and - changes the current working directory to it. This isolates tests - that affect the contents of the CWD to prevent them from - interfering with each other. - - :param temp_dir: Create the temporary directory under this - directory. If given, the created directory is not removed - when exiting. - - .. versionchanged:: 8.0 - Added the ``temp_dir`` parameter. - """ - cwd = os.getcwd() - dt = tempfile.mkdtemp(dir=temp_dir) # type: ignore[type-var] - os.chdir(dt) - - try: - yield t.cast(str, dt) - finally: - os.chdir(cwd) - - if temp_dir is None: - try: - shutil.rmtree(dt) - except OSError: # noqa: B014 - pass diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/types.py b/venv_flaskchat/lib/python3.11/site-packages/click/types.py deleted file mode 100644 index b45ee53..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click/types.py +++ /dev/null @@ -1,1073 +0,0 @@ -import os -import stat -import typing as t -from datetime import datetime -from gettext import gettext as _ -from gettext import ngettext - -from ._compat import _get_argv_encoding -from ._compat import get_filesystem_encoding -from ._compat import open_stream -from .exceptions import BadParameter -from .utils import LazyFile -from .utils import safecall - -if t.TYPE_CHECKING: - import typing_extensions as te - from .core import Context - from .core import Parameter - from .shell_completion import CompletionItem - - -class ParamType: - """Represents the type of a parameter. Validates and converts values - from the command line or Python into the correct type. - - To implement a custom type, subclass and implement at least the - following: - - - The :attr:`name` class attribute must be set. - - Calling an instance of the type with ``None`` must return - ``None``. This is already implemented by default. - - :meth:`convert` must convert string values to the correct type. - - :meth:`convert` must accept values that are already the correct - type. - - It must be able to convert a value if the ``ctx`` and ``param`` - arguments are ``None``. This can occur when converting prompt - input. - """ - - is_composite: t.ClassVar[bool] = False - arity: t.ClassVar[int] = 1 - - #: the descriptive name of this type - name: str - - #: if a list of this type is expected and the value is pulled from a - #: string environment variable, this is what splits it up. `None` - #: means any whitespace. For all parameters the general rule is that - #: whitespace splits them up. The exception are paths and files which - #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on - #: Windows). - envvar_list_splitter: t.ClassVar[t.Optional[str]] = None - - def to_info_dict(self) -> t.Dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. - - Use :meth:`click.Context.to_info_dict` to traverse the entire - CLI structure. - - .. versionadded:: 8.0 - """ - # The class name without the "ParamType" suffix. - param_type = type(self).__name__.partition("ParamType")[0] - param_type = param_type.partition("ParameterType")[0] - - # Custom subclasses might not remember to set a name. - if hasattr(self, "name"): - name = self.name - else: - name = param_type - - return {"param_type": param_type, "name": name} - - def __call__( - self, - value: t.Any, - param: t.Optional["Parameter"] = None, - ctx: t.Optional["Context"] = None, - ) -> t.Any: - if value is not None: - return self.convert(value, param, ctx) - - def get_metavar(self, param: "Parameter") -> t.Optional[str]: - """Returns the metavar default for this param if it provides one.""" - - def get_missing_message(self, param: "Parameter") -> t.Optional[str]: - """Optionally might return extra information about a missing - parameter. - - .. versionadded:: 2.0 - """ - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - """Convert the value to the correct type. This is not called if - the value is ``None`` (the missing value). - - This must accept string values from the command line, as well as - values that are already the correct type. It may also convert - other compatible types. - - The ``param`` and ``ctx`` arguments may be ``None`` in certain - situations, such as when converting prompt input. - - If the value cannot be converted, call :meth:`fail` with a - descriptive message. - - :param value: The value to convert. - :param param: The parameter that is using this type to convert - its value. May be ``None``. - :param ctx: The current context that arrived at this value. May - be ``None``. - """ - return value - - def split_envvar_value(self, rv: str) -> t.Sequence[str]: - """Given a value from an environment variable this splits it up - into small chunks depending on the defined envvar list splitter. - - If the splitter is set to `None`, which means that whitespace splits, - then leading and trailing whitespace is ignored. Otherwise, leading - and trailing splitters usually lead to empty items being included. - """ - return (rv or "").split(self.envvar_list_splitter) - - def fail( - self, - message: str, - param: t.Optional["Parameter"] = None, - ctx: t.Optional["Context"] = None, - ) -> "t.NoReturn": - """Helper method to fail with an invalid value message.""" - raise BadParameter(message, ctx=ctx, param=param) - - def shell_complete( - self, ctx: "Context", param: "Parameter", incomplete: str - ) -> t.List["CompletionItem"]: - """Return a list of - :class:`~click.shell_completion.CompletionItem` objects for the - incomplete value. Most types do not provide completions, but - some do, and this allows custom types to provide custom - completions as well. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - return [] - - -class CompositeParamType(ParamType): - is_composite = True - - @property - def arity(self) -> int: # type: ignore - raise NotImplementedError() - - -class FuncParamType(ParamType): - def __init__(self, func: t.Callable[[t.Any], t.Any]) -> None: - self.name = func.__name__ - self.func = func - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["func"] = self.func - return info_dict - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - try: - return self.func(value) - except ValueError: - try: - value = str(value) - except UnicodeError: - value = value.decode("utf-8", "replace") - - self.fail(value, param, ctx) - - -class UnprocessedParamType(ParamType): - name = "text" - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - return value - - def __repr__(self) -> str: - return "UNPROCESSED" - - -class StringParamType(ParamType): - name = "text" - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - if isinstance(value, bytes): - enc = _get_argv_encoding() - try: - value = value.decode(enc) - except UnicodeError: - fs_enc = get_filesystem_encoding() - if fs_enc != enc: - try: - value = value.decode(fs_enc) - except UnicodeError: - value = value.decode("utf-8", "replace") - else: - value = value.decode("utf-8", "replace") - return value - return str(value) - - def __repr__(self) -> str: - return "STRING" - - -class Choice(ParamType): - """The choice type allows a value to be checked against a fixed set - of supported values. All of these values have to be strings. - - You should only pass a list or tuple of choices. Other iterables - (like generators) may lead to surprising results. - - The resulting value will always be one of the originally passed choices - regardless of ``case_sensitive`` or any ``ctx.token_normalize_func`` - being specified. - - See :ref:`choice-opts` for an example. - - :param case_sensitive: Set to false to make choices case - insensitive. Defaults to true. - """ - - name = "choice" - - def __init__(self, choices: t.Sequence[str], case_sensitive: bool = True) -> None: - self.choices = choices - self.case_sensitive = case_sensitive - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["choices"] = self.choices - info_dict["case_sensitive"] = self.case_sensitive - return info_dict - - def get_metavar(self, param: "Parameter") -> str: - choices_str = "|".join(self.choices) - - # Use curly braces to indicate a required argument. - if param.required and param.param_type_name == "argument": - return f"{{{choices_str}}}" - - # Use square braces to indicate an option or optional argument. - return f"[{choices_str}]" - - def get_missing_message(self, param: "Parameter") -> str: - return _("Choose from:\n\t{choices}").format(choices=",\n\t".join(self.choices)) - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - # Match through normalization and case sensitivity - # first do token_normalize_func, then lowercase - # preserve original `value` to produce an accurate message in - # `self.fail` - normed_value = value - normed_choices = {choice: choice for choice in self.choices} - - if ctx is not None and ctx.token_normalize_func is not None: - normed_value = ctx.token_normalize_func(value) - normed_choices = { - ctx.token_normalize_func(normed_choice): original - for normed_choice, original in normed_choices.items() - } - - if not self.case_sensitive: - normed_value = normed_value.casefold() - normed_choices = { - normed_choice.casefold(): original - for normed_choice, original in normed_choices.items() - } - - if normed_value in normed_choices: - return normed_choices[normed_value] - - choices_str = ", ".join(map(repr, self.choices)) - self.fail( - ngettext( - "{value!r} is not {choice}.", - "{value!r} is not one of {choices}.", - len(self.choices), - ).format(value=value, choice=choices_str, choices=choices_str), - param, - ctx, - ) - - def __repr__(self) -> str: - return f"Choice({list(self.choices)})" - - def shell_complete( - self, ctx: "Context", param: "Parameter", incomplete: str - ) -> t.List["CompletionItem"]: - """Complete choices that start with the incomplete value. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - str_choices = map(str, self.choices) - - if self.case_sensitive: - matched = (c for c in str_choices if c.startswith(incomplete)) - else: - incomplete = incomplete.lower() - matched = (c for c in str_choices if c.lower().startswith(incomplete)) - - return [CompletionItem(c) for c in matched] - - -class DateTime(ParamType): - """The DateTime type converts date strings into `datetime` objects. - - The format strings which are checked are configurable, but default to some - common (non-timezone aware) ISO 8601 formats. - - When specifying *DateTime* formats, you should only pass a list or a tuple. - Other iterables, like generators, may lead to surprising results. - - The format strings are processed using ``datetime.strptime``, and this - consequently defines the format strings which are allowed. - - Parsing is tried using each format, in order, and the first format which - parses successfully is used. - - :param formats: A list or tuple of date format strings, in the order in - which they should be tried. Defaults to - ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, - ``'%Y-%m-%d %H:%M:%S'``. - """ - - name = "datetime" - - def __init__(self, formats: t.Optional[t.Sequence[str]] = None): - self.formats = formats or ["%Y-%m-%d", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%d %H:%M:%S"] - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["formats"] = self.formats - return info_dict - - def get_metavar(self, param: "Parameter") -> str: - return f"[{'|'.join(self.formats)}]" - - def _try_to_convert_date(self, value: t.Any, format: str) -> t.Optional[datetime]: - try: - return datetime.strptime(value, format) - except ValueError: - return None - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - if isinstance(value, datetime): - return value - - for format in self.formats: - converted = self._try_to_convert_date(value, format) - - if converted is not None: - return converted - - formats_str = ", ".join(map(repr, self.formats)) - self.fail( - ngettext( - "{value!r} does not match the format {format}.", - "{value!r} does not match the formats {formats}.", - len(self.formats), - ).format(value=value, format=formats_str, formats=formats_str), - param, - ctx, - ) - - def __repr__(self) -> str: - return "DateTime" - - -class _NumberParamTypeBase(ParamType): - _number_class: t.ClassVar[t.Type] - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - try: - return self._number_class(value) - except ValueError: - self.fail( - _("{value!r} is not a valid {number_type}.").format( - value=value, number_type=self.name - ), - param, - ctx, - ) - - -class _NumberRangeBase(_NumberParamTypeBase): - def __init__( - self, - min: t.Optional[float] = None, - max: t.Optional[float] = None, - min_open: bool = False, - max_open: bool = False, - clamp: bool = False, - ) -> None: - self.min = min - self.max = max - self.min_open = min_open - self.max_open = max_open - self.clamp = clamp - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - min=self.min, - max=self.max, - min_open=self.min_open, - max_open=self.max_open, - clamp=self.clamp, - ) - return info_dict - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - import operator - - rv = super().convert(value, param, ctx) - lt_min: bool = self.min is not None and ( - operator.le if self.min_open else operator.lt - )(rv, self.min) - gt_max: bool = self.max is not None and ( - operator.ge if self.max_open else operator.gt - )(rv, self.max) - - if self.clamp: - if lt_min: - return self._clamp(self.min, 1, self.min_open) # type: ignore - - if gt_max: - return self._clamp(self.max, -1, self.max_open) # type: ignore - - if lt_min or gt_max: - self.fail( - _("{value} is not in the range {range}.").format( - value=rv, range=self._describe_range() - ), - param, - ctx, - ) - - return rv - - def _clamp(self, bound: float, dir: "te.Literal[1, -1]", open: bool) -> float: - """Find the valid value to clamp to bound in the given - direction. - - :param bound: The boundary value. - :param dir: 1 or -1 indicating the direction to move. - :param open: If true, the range does not include the bound. - """ - raise NotImplementedError - - def _describe_range(self) -> str: - """Describe the range for use in help text.""" - if self.min is None: - op = "<" if self.max_open else "<=" - return f"x{op}{self.max}" - - if self.max is None: - op = ">" if self.min_open else ">=" - return f"x{op}{self.min}" - - lop = "<" if self.min_open else "<=" - rop = "<" if self.max_open else "<=" - return f"{self.min}{lop}x{rop}{self.max}" - - def __repr__(self) -> str: - clamp = " clamped" if self.clamp else "" - return f"<{type(self).__name__} {self._describe_range()}{clamp}>" - - -class IntParamType(_NumberParamTypeBase): - name = "integer" - _number_class = int - - def __repr__(self) -> str: - return "INT" - - -class IntRange(_NumberRangeBase, IntParamType): - """Restrict an :data:`click.INT` value to a range of accepted - values. See :ref:`ranges`. - - If ``min`` or ``max`` are not passed, any value is accepted in that - direction. If ``min_open`` or ``max_open`` are enabled, the - corresponding boundary is not included in the range. - - If ``clamp`` is enabled, a value outside the range is clamped to the - boundary instead of failing. - - .. versionchanged:: 8.0 - Added the ``min_open`` and ``max_open`` parameters. - """ - - name = "integer range" - - def _clamp( # type: ignore - self, bound: int, dir: "te.Literal[1, -1]", open: bool - ) -> int: - if not open: - return bound - - return bound + dir - - -class FloatParamType(_NumberParamTypeBase): - name = "float" - _number_class = float - - def __repr__(self) -> str: - return "FLOAT" - - -class FloatRange(_NumberRangeBase, FloatParamType): - """Restrict a :data:`click.FLOAT` value to a range of accepted - values. See :ref:`ranges`. - - If ``min`` or ``max`` are not passed, any value is accepted in that - direction. If ``min_open`` or ``max_open`` are enabled, the - corresponding boundary is not included in the range. - - If ``clamp`` is enabled, a value outside the range is clamped to the - boundary instead of failing. This is not supported if either - boundary is marked ``open``. - - .. versionchanged:: 8.0 - Added the ``min_open`` and ``max_open`` parameters. - """ - - name = "float range" - - def __init__( - self, - min: t.Optional[float] = None, - max: t.Optional[float] = None, - min_open: bool = False, - max_open: bool = False, - clamp: bool = False, - ) -> None: - super().__init__( - min=min, max=max, min_open=min_open, max_open=max_open, clamp=clamp - ) - - if (min_open or max_open) and clamp: - raise TypeError("Clamping is not supported for open bounds.") - - def _clamp(self, bound: float, dir: "te.Literal[1, -1]", open: bool) -> float: - if not open: - return bound - - # Could use Python 3.9's math.nextafter here, but clamping an - # open float range doesn't seem to be particularly useful. It's - # left up to the user to write a callback to do it if needed. - raise RuntimeError("Clamping is not supported for open bounds.") - - -class BoolParamType(ParamType): - name = "boolean" - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - if value in {False, True}: - return bool(value) - - norm = value.strip().lower() - - if norm in {"1", "true", "t", "yes", "y", "on"}: - return True - - if norm in {"0", "false", "f", "no", "n", "off"}: - return False - - self.fail( - _("{value!r} is not a valid boolean.").format(value=value), param, ctx - ) - - def __repr__(self) -> str: - return "BOOL" - - -class UUIDParameterType(ParamType): - name = "uuid" - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - import uuid - - if isinstance(value, uuid.UUID): - return value - - value = value.strip() - - try: - return uuid.UUID(value) - except ValueError: - self.fail( - _("{value!r} is not a valid UUID.").format(value=value), param, ctx - ) - - def __repr__(self) -> str: - return "UUID" - - -class File(ParamType): - """Declares a parameter to be a file for reading or writing. The file - is automatically closed once the context tears down (after the command - finished working). - - Files can be opened for reading or writing. The special value ``-`` - indicates stdin or stdout depending on the mode. - - By default, the file is opened for reading text data, but it can also be - opened in binary mode or for writing. The encoding parameter can be used - to force a specific encoding. - - The `lazy` flag controls if the file should be opened immediately or upon - first IO. The default is to be non-lazy for standard input and output - streams as well as files opened for reading, `lazy` otherwise. When opening a - file lazily for reading, it is still opened temporarily for validation, but - will not be held open until first IO. lazy is mainly useful when opening - for writing to avoid creating the file until it is needed. - - Starting with Click 2.0, files can also be opened atomically in which - case all writes go into a separate file in the same folder and upon - completion the file will be moved over to the original location. This - is useful if a file regularly read by other users is modified. - - See :ref:`file-args` for more information. - """ - - name = "filename" - envvar_list_splitter = os.path.pathsep - - def __init__( - self, - mode: str = "r", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", - lazy: t.Optional[bool] = None, - atomic: bool = False, - ) -> None: - self.mode = mode - self.encoding = encoding - self.errors = errors - self.lazy = lazy - self.atomic = atomic - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update(mode=self.mode, encoding=self.encoding) - return info_dict - - def resolve_lazy_flag(self, value: t.Any) -> bool: - if self.lazy is not None: - return self.lazy - if value == "-": - return False - elif "w" in self.mode: - return True - return False - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - try: - if hasattr(value, "read") or hasattr(value, "write"): - return value - - lazy = self.resolve_lazy_flag(value) - - if lazy: - f: t.IO = t.cast( - t.IO, - LazyFile( - value, self.mode, self.encoding, self.errors, atomic=self.atomic - ), - ) - - if ctx is not None: - ctx.call_on_close(f.close_intelligently) # type: ignore - - return f - - f, should_close = open_stream( - value, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - - # If a context is provided, we automatically close the file - # at the end of the context execution (or flush out). If a - # context does not exist, it's the caller's responsibility to - # properly close the file. This for instance happens when the - # type is used with prompts. - if ctx is not None: - if should_close: - ctx.call_on_close(safecall(f.close)) - else: - ctx.call_on_close(safecall(f.flush)) - - return f - except OSError as e: # noqa: B014 - self.fail(f"'{os.fsdecode(value)}': {e.strerror}", param, ctx) - - def shell_complete( - self, ctx: "Context", param: "Parameter", incomplete: str - ) -> t.List["CompletionItem"]: - """Return a special completion marker that tells the completion - system to use the shell to provide file path completions. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - return [CompletionItem(incomplete, type="file")] - - -class Path(ParamType): - """The ``Path`` type is similar to the :class:`File` type, but - returns the filename instead of an open file. Various checks can be - enabled to validate the type of file and permissions. - - :param exists: The file or directory needs to exist for the value to - be valid. If this is not set to ``True``, and the file does not - exist, then all further checks are silently skipped. - :param file_okay: Allow a file as a value. - :param dir_okay: Allow a directory as a value. - :param readable: if true, a readable check is performed. - :param writable: if true, a writable check is performed. - :param executable: if true, an executable check is performed. - :param resolve_path: Make the value absolute and resolve any - symlinks. A ``~`` is not expanded, as this is supposed to be - done by the shell only. - :param allow_dash: Allow a single dash as a value, which indicates - a standard stream (but does not open it). Use - :func:`~click.open_file` to handle opening this value. - :param path_type: Convert the incoming path value to this type. If - ``None``, keep Python's default, which is ``str``. Useful to - convert to :class:`pathlib.Path`. - - .. versionchanged:: 8.1 - Added the ``executable`` parameter. - - .. versionchanged:: 8.0 - Allow passing ``type=pathlib.Path``. - - .. versionchanged:: 6.0 - Added the ``allow_dash`` parameter. - """ - - envvar_list_splitter = os.path.pathsep - - def __init__( - self, - exists: bool = False, - file_okay: bool = True, - dir_okay: bool = True, - writable: bool = False, - readable: bool = True, - resolve_path: bool = False, - allow_dash: bool = False, - path_type: t.Optional[t.Type] = None, - executable: bool = False, - ): - self.exists = exists - self.file_okay = file_okay - self.dir_okay = dir_okay - self.readable = readable - self.writable = writable - self.executable = executable - self.resolve_path = resolve_path - self.allow_dash = allow_dash - self.type = path_type - - if self.file_okay and not self.dir_okay: - self.name = _("file") - elif self.dir_okay and not self.file_okay: - self.name = _("directory") - else: - self.name = _("path") - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - exists=self.exists, - file_okay=self.file_okay, - dir_okay=self.dir_okay, - writable=self.writable, - readable=self.readable, - allow_dash=self.allow_dash, - ) - return info_dict - - def coerce_path_result(self, rv: t.Any) -> t.Any: - if self.type is not None and not isinstance(rv, self.type): - if self.type is str: - rv = os.fsdecode(rv) - elif self.type is bytes: - rv = os.fsencode(rv) - else: - rv = self.type(rv) - - return rv - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - rv = value - - is_dash = self.file_okay and self.allow_dash and rv in (b"-", "-") - - if not is_dash: - if self.resolve_path: - # os.path.realpath doesn't resolve symlinks on Windows - # until Python 3.8. Use pathlib for now. - import pathlib - - rv = os.fsdecode(pathlib.Path(rv).resolve()) - - try: - st = os.stat(rv) - except OSError: - if not self.exists: - return self.coerce_path_result(rv) - self.fail( - _("{name} {filename!r} does not exist.").format( - name=self.name.title(), filename=os.fsdecode(value) - ), - param, - ctx, - ) - - if not self.file_okay and stat.S_ISREG(st.st_mode): - self.fail( - _("{name} {filename!r} is a file.").format( - name=self.name.title(), filename=os.fsdecode(value) - ), - param, - ctx, - ) - if not self.dir_okay and stat.S_ISDIR(st.st_mode): - self.fail( - _("{name} '{filename}' is a directory.").format( - name=self.name.title(), filename=os.fsdecode(value) - ), - param, - ctx, - ) - - if self.readable and not os.access(rv, os.R_OK): - self.fail( - _("{name} {filename!r} is not readable.").format( - name=self.name.title(), filename=os.fsdecode(value) - ), - param, - ctx, - ) - - if self.writable and not os.access(rv, os.W_OK): - self.fail( - _("{name} {filename!r} is not writable.").format( - name=self.name.title(), filename=os.fsdecode(value) - ), - param, - ctx, - ) - - if self.executable and not os.access(value, os.X_OK): - self.fail( - _("{name} {filename!r} is not executable.").format( - name=self.name.title(), filename=os.fsdecode(value) - ), - param, - ctx, - ) - - return self.coerce_path_result(rv) - - def shell_complete( - self, ctx: "Context", param: "Parameter", incomplete: str - ) -> t.List["CompletionItem"]: - """Return a special completion marker that tells the completion - system to use the shell to provide path completions for only - directories or any paths. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - type = "dir" if self.dir_okay and not self.file_okay else "file" - return [CompletionItem(incomplete, type=type)] - - -class Tuple(CompositeParamType): - """The default behavior of Click is to apply a type on a value directly. - This works well in most cases, except for when `nargs` is set to a fixed - count and different types should be used for different items. In this - case the :class:`Tuple` type can be used. This type can only be used - if `nargs` is set to a fixed number. - - For more information see :ref:`tuple-type`. - - This can be selected by using a Python tuple literal as a type. - - :param types: a list of types that should be used for the tuple items. - """ - - def __init__(self, types: t.Sequence[t.Union[t.Type, ParamType]]) -> None: - self.types = [convert_type(ty) for ty in types] - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["types"] = [t.to_info_dict() for t in self.types] - return info_dict - - @property - def name(self) -> str: # type: ignore - return f"<{' '.join(ty.name for ty in self.types)}>" - - @property - def arity(self) -> int: # type: ignore - return len(self.types) - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - len_type = len(self.types) - len_value = len(value) - - if len_value != len_type: - self.fail( - ngettext( - "{len_type} values are required, but {len_value} was given.", - "{len_type} values are required, but {len_value} were given.", - len_value, - ).format(len_type=len_type, len_value=len_value), - param=param, - ctx=ctx, - ) - - return tuple(ty(x, param, ctx) for ty, x in zip(self.types, value)) - - -def convert_type(ty: t.Optional[t.Any], default: t.Optional[t.Any] = None) -> ParamType: - """Find the most appropriate :class:`ParamType` for the given Python - type. If the type isn't provided, it can be inferred from a default - value. - """ - guessed_type = False - - if ty is None and default is not None: - if isinstance(default, (tuple, list)): - # If the default is empty, ty will remain None and will - # return STRING. - if default: - item = default[0] - - # A tuple of tuples needs to detect the inner types. - # Can't call convert recursively because that would - # incorrectly unwind the tuple to a single type. - if isinstance(item, (tuple, list)): - ty = tuple(map(type, item)) - else: - ty = type(item) - else: - ty = type(default) - - guessed_type = True - - if isinstance(ty, tuple): - return Tuple(ty) - - if isinstance(ty, ParamType): - return ty - - if ty is str or ty is None: - return STRING - - if ty is int: - return INT - - if ty is float: - return FLOAT - - if ty is bool: - return BOOL - - if guessed_type: - return STRING - - if __debug__: - try: - if issubclass(ty, ParamType): - raise AssertionError( - f"Attempted to use an uninstantiated parameter type ({ty})." - ) - except TypeError: - # ty is an instance (correct), so issubclass fails. - pass - - return FuncParamType(ty) - - -#: A dummy parameter type that just does nothing. From a user's -#: perspective this appears to just be the same as `STRING` but -#: internally no string conversion takes place if the input was bytes. -#: This is usually useful when working with file paths as they can -#: appear in bytes and unicode. -#: -#: For path related uses the :class:`Path` type is a better choice but -#: there are situations where an unprocessed type is useful which is why -#: it is is provided. -#: -#: .. versionadded:: 4.0 -UNPROCESSED = UnprocessedParamType() - -#: A unicode string parameter type which is the implicit default. This -#: can also be selected by using ``str`` as type. -STRING = StringParamType() - -#: An integer parameter. This can also be selected by using ``int`` as -#: type. -INT = IntParamType() - -#: A floating point value parameter. This can also be selected by using -#: ``float`` as type. -FLOAT = FloatParamType() - -#: A boolean parameter. This is the default for boolean flags. This can -#: also be selected by using ``bool`` as a type. -BOOL = BoolParamType() - -#: A UUID parameter. -UUID = UUIDParameterType() diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/utils.py b/venv_flaskchat/lib/python3.11/site-packages/click/utils.py deleted file mode 100644 index 8283788..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/click/utils.py +++ /dev/null @@ -1,580 +0,0 @@ -import os -import re -import sys -import typing as t -from functools import update_wrapper -from types import ModuleType - -from ._compat import _default_text_stderr -from ._compat import _default_text_stdout -from ._compat import _find_binary_writer -from ._compat import auto_wrap_for_ansi -from ._compat import binary_streams -from ._compat import get_filesystem_encoding -from ._compat import open_stream -from ._compat import should_strip_ansi -from ._compat import strip_ansi -from ._compat import text_streams -from ._compat import WIN -from .globals import resolve_color_default - -if t.TYPE_CHECKING: - import typing_extensions as te - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) - - -def _posixify(name: str) -> str: - return "-".join(name.split()).lower() - - -def safecall(func: F) -> F: - """Wraps a function so that it swallows exceptions.""" - - def wrapper(*args, **kwargs): # type: ignore - try: - return func(*args, **kwargs) - except Exception: - pass - - return update_wrapper(t.cast(F, wrapper), func) - - -def make_str(value: t.Any) -> str: - """Converts a value into a valid string.""" - if isinstance(value, bytes): - try: - return value.decode(get_filesystem_encoding()) - except UnicodeError: - return value.decode("utf-8", "replace") - return str(value) - - -def make_default_short_help(help: str, max_length: int = 45) -> str: - """Returns a condensed version of help string.""" - # Consider only the first paragraph. - paragraph_end = help.find("\n\n") - - if paragraph_end != -1: - help = help[:paragraph_end] - - # Collapse newlines, tabs, and spaces. - words = help.split() - - if not words: - return "" - - # The first paragraph started with a "no rewrap" marker, ignore it. - if words[0] == "\b": - words = words[1:] - - total_length = 0 - last_index = len(words) - 1 - - for i, word in enumerate(words): - total_length += len(word) + (i > 0) - - if total_length > max_length: # too long, truncate - break - - if word[-1] == ".": # sentence end, truncate without "..." - return " ".join(words[: i + 1]) - - if total_length == max_length and i != last_index: - break # not at sentence end, truncate with "..." - else: - return " ".join(words) # no truncation needed - - # Account for the length of the suffix. - total_length += len("...") - - # remove words until the length is short enough - while i > 0: - total_length -= len(words[i]) + (i > 0) - - if total_length <= max_length: - break - - i -= 1 - - return " ".join(words[:i]) + "..." - - -class LazyFile: - """A lazy file works like a regular file but it does not fully open - the file but it does perform some basic checks early to see if the - filename parameter does make sense. This is useful for safely opening - files for writing. - """ - - def __init__( - self, - filename: str, - mode: str = "r", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", - atomic: bool = False, - ): - self.name = filename - self.mode = mode - self.encoding = encoding - self.errors = errors - self.atomic = atomic - self._f: t.Optional[t.IO] - - if filename == "-": - self._f, self.should_close = open_stream(filename, mode, encoding, errors) - else: - if "r" in mode: - # Open and close the file in case we're opening it for - # reading so that we can catch at least some errors in - # some cases early. - open(filename, mode).close() - self._f = None - self.should_close = True - - def __getattr__(self, name: str) -> t.Any: - return getattr(self.open(), name) - - def __repr__(self) -> str: - if self._f is not None: - return repr(self._f) - return f"" - - def open(self) -> t.IO: - """Opens the file if it's not yet open. This call might fail with - a :exc:`FileError`. Not handling this error will produce an error - that Click shows. - """ - if self._f is not None: - return self._f - try: - rv, self.should_close = open_stream( - self.name, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - except OSError as e: # noqa: E402 - from .exceptions import FileError - - raise FileError(self.name, hint=e.strerror) from e - self._f = rv - return rv - - def close(self) -> None: - """Closes the underlying file, no matter what.""" - if self._f is not None: - self._f.close() - - def close_intelligently(self) -> None: - """This function only closes the file if it was opened by the lazy - file wrapper. For instance this will never close stdin. - """ - if self.should_close: - self.close() - - def __enter__(self) -> "LazyFile": - return self - - def __exit__(self, exc_type, exc_value, tb): # type: ignore - self.close_intelligently() - - def __iter__(self) -> t.Iterator[t.AnyStr]: - self.open() - return iter(self._f) # type: ignore - - -class KeepOpenFile: - def __init__(self, file: t.IO) -> None: - self._file = file - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._file, name) - - def __enter__(self) -> "KeepOpenFile": - return self - - def __exit__(self, exc_type, exc_value, tb): # type: ignore - pass - - def __repr__(self) -> str: - return repr(self._file) - - def __iter__(self) -> t.Iterator[t.AnyStr]: - return iter(self._file) - - -def echo( - message: t.Optional[t.Any] = None, - file: t.Optional[t.IO[t.Any]] = None, - nl: bool = True, - err: bool = False, - color: t.Optional[bool] = None, -) -> None: - """Print a message and newline to stdout or a file. This should be - used instead of :func:`print` because it provides better support - for different data, files, and environments. - - Compared to :func:`print`, this does the following: - - - Ensures that the output encoding is not misconfigured on Linux. - - Supports Unicode in the Windows console. - - Supports writing to binary outputs, and supports writing bytes - to text outputs. - - Supports colors and styles on Windows. - - Removes ANSI color and style codes if the output does not look - like an interactive terminal. - - Always flushes the output. - - :param message: The string or bytes to output. Other objects are - converted to strings. - :param file: The file to write to. Defaults to ``stdout``. - :param err: Write to ``stderr`` instead of ``stdout``. - :param nl: Print a newline after the message. Enabled by default. - :param color: Force showing or hiding colors and other styles. By - default Click will remove color if the output does not look like - an interactive terminal. - - .. versionchanged:: 6.0 - Support Unicode output on the Windows console. Click does not - modify ``sys.stdout``, so ``sys.stdout.write()`` and ``print()`` - will still not support Unicode. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - - .. versionadded:: 3.0 - Added the ``err`` parameter. - - .. versionchanged:: 2.0 - Support colors on Windows if colorama is installed. - """ - if file is None: - if err: - file = _default_text_stderr() - else: - file = _default_text_stdout() - - # Convert non bytes/text into the native string type. - if message is not None and not isinstance(message, (str, bytes, bytearray)): - out: t.Optional[t.Union[str, bytes]] = str(message) - else: - out = message - - if nl: - out = out or "" - if isinstance(out, str): - out += "\n" - else: - out += b"\n" - - if not out: - file.flush() - return - - # If there is a message and the value looks like bytes, we manually - # need to find the binary stream and write the message in there. - # This is done separately so that most stream types will work as you - # would expect. Eg: you can write to StringIO for other cases. - if isinstance(out, (bytes, bytearray)): - binary_file = _find_binary_writer(file) - - if binary_file is not None: - file.flush() - binary_file.write(out) - binary_file.flush() - return - - # ANSI style code support. For no message or bytes, nothing happens. - # When outputting to a file instead of a terminal, strip codes. - else: - color = resolve_color_default(color) - - if should_strip_ansi(file, color): - out = strip_ansi(out) - elif WIN: - if auto_wrap_for_ansi is not None: - file = auto_wrap_for_ansi(file) # type: ignore - elif not color: - out = strip_ansi(out) - - file.write(out) # type: ignore - file.flush() - - -def get_binary_stream(name: "te.Literal['stdin', 'stdout', 'stderr']") -> t.BinaryIO: - """Returns a system stream for byte processing. - - :param name: the name of the stream to open. Valid names are ``'stdin'``, - ``'stdout'`` and ``'stderr'`` - """ - opener = binary_streams.get(name) - if opener is None: - raise TypeError(f"Unknown standard stream '{name}'") - return opener() - - -def get_text_stream( - name: "te.Literal['stdin', 'stdout', 'stderr']", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", -) -> t.TextIO: - """Returns a system stream for text processing. This usually returns - a wrapped stream around a binary stream returned from - :func:`get_binary_stream` but it also can take shortcuts for already - correctly configured streams. - - :param name: the name of the stream to open. Valid names are ``'stdin'``, - ``'stdout'`` and ``'stderr'`` - :param encoding: overrides the detected default encoding. - :param errors: overrides the default error mode. - """ - opener = text_streams.get(name) - if opener is None: - raise TypeError(f"Unknown standard stream '{name}'") - return opener(encoding, errors) - - -def open_file( - filename: str, - mode: str = "r", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", - lazy: bool = False, - atomic: bool = False, -) -> t.IO: - """Open a file, with extra behavior to handle ``'-'`` to indicate - a standard stream, lazy open on write, and atomic write. Similar to - the behavior of the :class:`~click.File` param type. - - If ``'-'`` is given to open ``stdout`` or ``stdin``, the stream is - wrapped so that using it in a context manager will not close it. - This makes it possible to use the function without accidentally - closing a standard stream: - - .. code-block:: python - - with open_file(filename) as f: - ... - - :param filename: The name of the file to open, or ``'-'`` for - ``stdin``/``stdout``. - :param mode: The mode in which to open the file. - :param encoding: The encoding to decode or encode a file opened in - text mode. - :param errors: The error handling mode. - :param lazy: Wait to open the file until it is accessed. For read - mode, the file is temporarily opened to raise access errors - early, then closed until it is read again. - :param atomic: Write to a temporary file and replace the given file - on close. - - .. versionadded:: 3.0 - """ - if lazy: - return t.cast(t.IO, LazyFile(filename, mode, encoding, errors, atomic=atomic)) - - f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic) - - if not should_close: - f = t.cast(t.IO, KeepOpenFile(f)) - - return f - - -def format_filename( - filename: t.Union[str, bytes, os.PathLike], shorten: bool = False -) -> str: - """Formats a filename for user display. The main purpose of this - function is to ensure that the filename can be displayed at all. This - will decode the filename to unicode if necessary in a way that it will - not fail. Optionally, it can shorten the filename to not include the - full path to the filename. - - :param filename: formats a filename for UI display. This will also convert - the filename into unicode without failing. - :param shorten: this optionally shortens the filename to strip of the - path that leads up to it. - """ - if shorten: - filename = os.path.basename(filename) - - return os.fsdecode(filename) - - -def get_app_dir(app_name: str, roaming: bool = True, force_posix: bool = False) -> str: - r"""Returns the config folder for the application. The default behavior - is to return whatever is most appropriate for the operating system. - - To give you an idea, for an app called ``"Foo Bar"``, something like - the following folders could be returned: - - Mac OS X: - ``~/Library/Application Support/Foo Bar`` - Mac OS X (POSIX): - ``~/.foo-bar`` - Unix: - ``~/.config/foo-bar`` - Unix (POSIX): - ``~/.foo-bar`` - Windows (roaming): - ``C:\Users\\AppData\Roaming\Foo Bar`` - Windows (not roaming): - ``C:\Users\\AppData\Local\Foo Bar`` - - .. versionadded:: 2.0 - - :param app_name: the application name. This should be properly capitalized - and can contain whitespace. - :param roaming: controls if the folder should be roaming or not on Windows. - Has no affect otherwise. - :param force_posix: if this is set to `True` then on any POSIX system the - folder will be stored in the home folder with a leading - dot instead of the XDG config home or darwin's - application support folder. - """ - if WIN: - key = "APPDATA" if roaming else "LOCALAPPDATA" - folder = os.environ.get(key) - if folder is None: - folder = os.path.expanduser("~") - return os.path.join(folder, app_name) - if force_posix: - return os.path.join(os.path.expanduser(f"~/.{_posixify(app_name)}")) - if sys.platform == "darwin": - return os.path.join( - os.path.expanduser("~/Library/Application Support"), app_name - ) - return os.path.join( - os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")), - _posixify(app_name), - ) - - -class PacifyFlushWrapper: - """This wrapper is used to catch and suppress BrokenPipeErrors resulting - from ``.flush()`` being called on broken pipe during the shutdown/final-GC - of the Python interpreter. Notably ``.flush()`` is always called on - ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any - other cleanup code, and the case where the underlying file is not a broken - pipe, all calls and attributes are proxied. - """ - - def __init__(self, wrapped: t.IO) -> None: - self.wrapped = wrapped - - def flush(self) -> None: - try: - self.wrapped.flush() - except OSError as e: - import errno - - if e.errno != errno.EPIPE: - raise - - def __getattr__(self, attr: str) -> t.Any: - return getattr(self.wrapped, attr) - - -def _detect_program_name( - path: t.Optional[str] = None, _main: t.Optional[ModuleType] = None -) -> str: - """Determine the command used to run the program, for use in help - text. If a file or entry point was executed, the file name is - returned. If ``python -m`` was used to execute a module or package, - ``python -m name`` is returned. - - This doesn't try to be too precise, the goal is to give a concise - name for help text. Files are only shown as their name without the - path. ``python`` is only shown for modules, and the full path to - ``sys.executable`` is not shown. - - :param path: The Python file being executed. Python puts this in - ``sys.argv[0]``, which is used by default. - :param _main: The ``__main__`` module. This should only be passed - during internal testing. - - .. versionadded:: 8.0 - Based on command args detection in the Werkzeug reloader. - - :meta private: - """ - if _main is None: - _main = sys.modules["__main__"] - - if not path: - path = sys.argv[0] - - # The value of __package__ indicates how Python was called. It may - # not exist if a setuptools script is installed as an egg. It may be - # set incorrectly for entry points created with pip on Windows. - if getattr(_main, "__package__", None) is None or ( - os.name == "nt" - and _main.__package__ == "" - and not os.path.exists(path) - and os.path.exists(f"{path}.exe") - ): - # Executed a file, like "python app.py". - return os.path.basename(path) - - # Executed a module, like "python -m example". - # Rewritten by Python from "-m script" to "/path/to/script.py". - # Need to look at main module to determine how it was executed. - py_module = t.cast(str, _main.__package__) - name = os.path.splitext(os.path.basename(path))[0] - - # A submodule like "example.cli". - if name != "__main__": - py_module = f"{py_module}.{name}" - - return f"python -m {py_module.lstrip('.')}" - - -def _expand_args( - args: t.Iterable[str], - *, - user: bool = True, - env: bool = True, - glob_recursive: bool = True, -) -> t.List[str]: - """Simulate Unix shell expansion with Python functions. - - See :func:`glob.glob`, :func:`os.path.expanduser`, and - :func:`os.path.expandvars`. - - This is intended for use on Windows, where the shell does not do any - expansion. It may not exactly match what a Unix shell would do. - - :param args: List of command line arguments to expand. - :param user: Expand user home directory. - :param env: Expand environment variables. - :param glob_recursive: ``**`` matches directories recursively. - - .. versionchanged:: 8.1 - Invalid glob patterns are treated as empty expansions rather - than raising an error. - - .. versionadded:: 8.0 - - :meta private: - """ - from glob import glob - - out = [] - - for arg in args: - if user: - arg = os.path.expanduser(arg) - - if env: - arg = os.path.expandvars(arg) - - try: - matches = glob(arg, recursive=glob_recursive) - except re.error: - matches = [] - - if not matches: - out.append(arg) - else: - out.extend(matches) - - return out diff --git a/venv_flaskchat/lib/python3.11/site-packages/distutils-precedence.pth b/venv_flaskchat/lib/python3.11/site-packages/distutils-precedence.pth deleted file mode 100644 index 7f009fe..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/distutils-precedence.pth +++ /dev/null @@ -1 +0,0 @@ -import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'local') == 'local'; enabled and __import__('_distutils_hack').add_shim(); diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/__init__.py b/venv_flaskchat/lib/python3.11/site-packages/engineio/__init__.py deleted file mode 100644 index a4c21bb..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/engineio/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -import sys - -from .client import Client -from .middleware import WSGIApp, Middleware -from .server import Server -if sys.version_info >= (3, 5): # pragma: no cover - from .asyncio_server import AsyncServer - from .asyncio_client import AsyncClient - from .async_drivers.asgi import ASGIApp - try: - from .async_drivers.tornado import get_tornado_handler - except ImportError: - get_tornado_handler = None -else: # pragma: no cover - AsyncServer = None - AsyncClient = None - get_tornado_handler = None - ASGIApp = None - -__all__ = ['Server', 'WSGIApp', 'Middleware', 'Client'] -if AsyncServer is not None: # pragma: no cover - __all__ += ['AsyncServer', 'ASGIApp', 'get_tornado_handler', - 'AsyncClient'], diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/__init__.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 40d8dd60086c619871af53c985475607108dcabd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1050 zcma)3&1(}u6raiLN4oiFOlS+OtsfC26uT4;UZfC;mLl~MM7oz{%}&y_v$J7#O^v7c zA9&JxFXCU|P4Frn7V)s`so*K#A<|3e$v4~767=BAo5y=^-uu1Zn|WU<83@)_@2&eY zhtLn{Tr6d3oPGi09deP28M2U@a|y$K&dOnFD~$MxrTD6)X1>ZaU$=COD0-g1fO54% zRodbvtPAfvUEgo7~E+8NI*Gd27_ z3@<@aEzFo^*l7_shhD&Kk9UH!>`1y^U{6zIqs!nFTDD88S*Gm@PXcT>Vb{wTr3pQ~X4mbCLzDGmzA#=jR z?E@z=`;_ly^N&y}-0#JTJ2Cjo#oa zf8P(>7mRL+tI$?{Z+HXrm|%<(WDK)?f|lc1Nzi)yFG*(8peiBScT#)P|3+40vYIIC z@vQt$WSk>vJ;`syf5{{%ERGRY>z687yBX(K&IQI$>yyc3tfAV{@KI7-1hu>tD@#ea zI@~!i?!}o5^@NmTvYaRd0IFP@Ro8z(hwH-~xyJ-4E07t^!&80Kw$LZNnJ1rh4Ei^j CyC(hs diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/asyncio_client.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/asyncio_client.cpython-311.pyc deleted file mode 100644 index f746059b3cc07984652cd88035281c14eb3ffe2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38189 zcmd_T32+?gl^&Q`2T%nRfC5leDBK0&z6tOIniohMyh$~w?h&OP5JVP9kU#;QRcMkW zpvBR&EwBws=r(1dd#O>4hOI$QQz1yvTG3-Urlr=5q-l+}3X!v@sW3L^UH7iFws)c6 z$fnz|;r-s9ccDO1hrNcFq>ctL1|BI!?6nh;z>N87^eI#$C65 zhP%cK7Qs56HIaQT8}BTF4Q|Id2XouucAj%GcNW|^=W^iA9?2CPuW{#G7H)_WoUd_0 zPB8mQo{Ho*tsM6r{^jdjzQCX1nsa|ak0*b@12*%itkLnYU?>7tPVo9@a4Ir3848pC z)X3=7Ao*ucjocWY91#Xb<#c3d!w)6>s2>0oz`w@LauG^Yxvpq#3pc}k6Ta`MuefjG z-Fw=5Dijd2M)#dLGIZqR*}&zIkT4z;J92UYxcbM!qm!Xfa5NGa86OXfj7G*@2?j>O zH$tNU8ToJr3uwZR8t9+k|Iu~ibByDGV?@iJ<8i7B6KHRKHIY-9YFc{6UN&<-`UIn|f}b2S8)hAG;VLz~)8j%v+}pj6Ca z{6E?QaEH5uYJRDd3YEFzn6sVczg;rJzhRj#JHx%pHCs~ItPhM$rd*@bqKHmB92p5; z#S2Tv)|8FhVQRxb;FIyrPltnIxN{;H8WDww5pg6m66!oL`N~)@+&MUokcTdhL^@vy zhF%%INROlRI6iivbLvLq@?>aRM^{&8cq|fZr%^F-39*8qOJkwn*kq@I#IW2IJEm@Y zlCx)gEF2k~oS51d?Pafr!(*31Bjdwr$KEqOIXW^P-q*3wM~_b_c z!V;;ld8vl}q{6m!&f=_RV6HD&;9f1LSt+PV6x2!uwWyiA`lPSq&iI?-Z-j1#;_kYQ z_v7^}wZ7kJl(uY3Y}p}g*@38q&A%k@_XOtb4?U&ubCxkM*PnE`zjEyLW4BJspP0kn zTE2Hav>1%%?^%uj(Cx@@uQ>`NM^(ZRkQ{+kNBxSUKH+GT9F1}H7K>2KlkZyOiq8v% z!qZ}K_~JAgG}z3Gte4OjQ>xOFsRG3s1fYQz-U@*Jl#^>mhf%?=$~e1AvXw42EjGQ? zaXB8}1k!(&5YhIaPe~mw97qZ}! zC1e9;3*}g+_;U^+2Tx9+LU7?JN65odu8XURlN_mDT6$<*_i{j)cR3v5BeiAf}K=I4}~pI6XdoBS3?Ed~75X zF(h>@ctK6>+F0arAUr)aH7Q2e5=H6beRz`A)&Q2d!1!e7Qv1~8`1n}pQXqnfDNKRG zZ7k`L$k>JPV1Olq!KI=mCnb(d1g}ksR|Auwz-cy31-5nU2q1@0@S3)I_D*58n?N>~ zE(OKjz}d+F=0Hl6d??Q_5Q$6%&YwRkP6yAQr}$G;+7TsAVDiEhT6-gtEL)6O<24-) zc2J_2ATp;qh{S z%6JEb0L?IgYnOwe%qhv`MRCx2db%vEQX^NwlcC-KI>E?zBq)YZ)u1ZKGcYkJOrwHO zDJUK562Z{uq(GHLEhYrzhm9G_BvZH}aA+En-h?r=a9{#{plp!I`SZf`#8eo_QF7y4+bs-Hx^IL6U`;CK7p)5ti4pssWE8)feJuf zbOb;S1jf)0FK(XLjmc>YBqWHaBZ3eJPX$MTs5-PKWl9;Nd-O8KWnfC2yq=-vRn+8+ zF|5y=IUX1dijlF4W1}OHAbf(6QBxI#!{ft1a_r)bUet&(DuIOTmmvX+Sgnh1GE51L z@YS)Y^w@HugbCWCjp*yiYv|{j)rvwZ$X#+$sm-uFKZS$i7Xw7+pvsH|l*^{pgW=cQ zm$agq>Ov-%h8_gET z2(!)fR3s?0(PW4`o~3q?+IWygw-#SUhE3~o=OYx^Br=6HL$2~oD+kFPQ4!G-0;z@B z9_73cRHkvIzoTzIp_nph3e0Gx7zK)0(ZnEnp8!8r{)rLhfTv)pe{HP->4?Q?Sn2h> zV9MCcgxLmDQYeDxtYm_K(L4!KH*ht01B;XJ1g!L~Fd|->me*BUdDxJ9rg-{%aV zgo&TJ$t4Sl=OQwl_K8zw3_8XpM>VDnfhgb~;{VYCXs0jPWrlQyy8#R1NGhrx?>1MD;!WMuc7iy{HB0l{+P|0%Xq~ZM;%BXMc2J{^*Bmp} z4a_(~gv~iS({rA&PVu+wGu$u{@$7=YfC%vom$@AfL#tg27iral&p^h5I?&P+a&^%~ z6v50bF~iSTruZ>##%7iUf$7gy1rituu91I+iaex9S!h-@(#Fc7DNAE$)G7qTv^Wle z607Q`pFbX$yvQaJouXEk+9QzwO9brg- zVAAJoC0Ctlm#c%gf2t3*n$m2hQS}{x7eMM5eKyS(xf8v2{(Pgt95ib5Vxu-I!>=Q7 zS<70KwcEsi(*wP)XI0+g%ZFmw{|H_yE5tvgYFos21=bC+~JQH!6@@Epf zfYphhu$PIj!mO6c*Cdt9E0s%x*RcGa33$XZB%Ue)!;vO4Ol8S3#8j3nBxfR>R55zy z5mhV^6b6V*PG!l=Zz}uRh)85v$}Tr(4kn-Jpd2P=EUc1)DJ!PjRF2*Nkf$>0a2ONv zbTDO?f3hLh!{8R1v&06%(TeFmm95OD;(qdia7ymkY>1205Md%Ts9OgP$fCY%rTL=8 z8QSzD#dsHF*kf6)x4xBgxux97buP;}!2fN-KH0J6E|uI(33rR+Zu!=j)Nv@$F(7pe zthfi_?tyiSEpLEdbC*c&hJ?Eb0axA6t+=0C^OW5_@wc_Rere?kdq{%ULjpY+JpQ=2 z0Z)i$gh{vOcJ8XXcEw#AuRD}*_e<{nxOzk8ir|kQKYmyXSzX{^Zoz!-V%17+V?4KU zt*9bi*`FvHkctN4u7PAleeCn`@@;X4Kbh-|=hmzhlrFZsGny!9kqTNU$ChMO)8gkA za@H+scZILgahK0AHw2Gmdw_P?p1GqBi%}zdULU{a3&d;oCwvDa-+{RMK(eeZUbZ{l zw0q7rUy$^cu6i3*ybTF&ljLoJS5DH~|J4^4&&Hlx_Pk&HL7~)jC{cST;q8~a5MCB6 zlq^&(9*pIof_$CG$=8WY+)o6~&M=M7f4;M?oBLsR-N91pkNiBKiS(x7@`w0;v=bl$ z;agxNgF%?^Dq(^>1d!=6sUA(eNYmnUC^9zA)(OM9tck~Dk^}RrV4S>_*$&Hq%5{PL zp%n}=05+woVisD(Qz>>1W#Wx*suUNiA}bA znjx6LoQc)NdeoJHA4%D0RfxKcV}^WQrC|F2l=0$b=WIw8`J|%yxNFlJUD!$8 z-q|2ac&VY(i-s+0v>7vw?7|JmY-A^qc_f-5=?hVt3N1E*NBNc3ZPbQlzlQKKNybpTHioTD;DHjU(l7{> zj-EMn@;B;I#L`l_C!1|47Z#zAfGL?|<BzD(f_RNM)ZGICG|NXrS4`=5+BmUMhQL z@@x&hI3$?69r@g%a038Jw=3cbidXZiSMsah$-0;Kt&8_VA8d~Y4krSKCBXb6QvQ*+ zW7C`UzQIwg>mXfXep&ZxgRk2CbY@xL6}I-@gPkI-eZys9jkOLM(U@fH0Bde@7c@Va zJ0xZ*jV;f-|0-CX6ko7{vD0t`?itx_!6w-6XPJk|20XOASs`1gi)vt}G3PO+x}asH zIKGMB_cYJ6H2H8IQqY71=C^{wh&hA_v;(JHy23$>h`S9JcK^{v?`iD>@qioR0ou7z zE{F%LJZEI}Q8xymgBmV(RBExp7;rR{^X1%ydP z9y4;B_H8a;%v=J&kBNxwV`d)SkOgCRhnNkWxg-%8=`TPsMspDc&~G%TQ%)tFpl~vk zr<3#`@kElf3}Vzf#p#f|c`K68Kx_tRE)<_5_Xz?t{zam*Quaf~Pn{VM`^asbnvSIM zL4=RdHj%u2i>+aGTU}*fQsN~EW8)8k z@uK=fQNL8wA9rQAA@-9B>X*t_3bw}!wkLgMw=dn9cyr>7$=j20cm2jYS?njWtpy<^ zUvu1@;ZBw|5)$hcYo2$_?PJ7i=Zd>?*_LqcklZ`s?0&o^6M$YyP6nV=7i>h6dWj^> zFZ#;W*RS51n4gF{$~U{iBt!Zzr}|I}_hC!UpKVJ zfqoCfOb{|z??Io$Jk~KH`H=}kI};fZvE!LOiVOpR?X)t!8a(y*SmXxwSmpgMj9}~p zW+vbu$B|RkhGW_|HRPbmYank9V$jpPfVglQa>DSu9vq#HfTvfNZ6z8)Lb9aGsxgw; zMyWzosK{=JcNJ_H#Z)BX&ys?c^;w`O>uwNhs>m}yU@%@2B7(EfRUsOLZI9_WizE(h zw#kfImR!b^jnGJC$>@Y>7P=aagZ9MukRei~}@d5K?~&*8$w*e&y%DbQRRa zUWmQ0bT(eUXZZyH+=+s{Qo-K1V=r6i8T)MNWVAf9#l9B~d9lyj(Pq**7p8xWSwKg# zL_d3GJQ$o}dzRF=%I+U#;*kl=+e|1&Tbzb2@#|3OiVB83Oqr;2Teh-MYMR}GC`h!> zRCyHV&*2?z0gxxQU*&MV%G)o+b|t*6lD9Qpu;F&J%9Ocb*l|QAQH?#KNqn;*X84JVS{DcZa^bZPC;G3Vl^@aH_ z#2r24@H|ApG-B^2y49fPJFc=U!nr12=T%nAV)Qq` z#fg387_kQ%uFXp@YY&xx`8UM4qA~gq12C(IS-Vjbkh#P{PK-p)8!lt%%=Iy2H;Yuh z$Yav2*Auv+wHr$1(fxJT=B0{}zQ~44$Teed-(`ND%?j0`F52{nr~%(*Z7k%OV+;Hj zEvn_nOxBeWH5DOW?;^9=Guc-(QB9;<4FmSAOm!vNFcLtSd6qS}Z;D`wQ9&xb+@@Y$lqjtr_Uv|pX-jv4x} z>PO`;myXSg4f=cCCHRHX`(@^_VV-kLy{lZ{)68WmXCWMnHR>tqt{I0J3v;^jRRXOr zTARJXiA~Ih2zz$H2V%__NwGFuBy^ZbTT6`Ti_k_tL#qLCTpKRr+p2n+aYT)4Bk~Ec z+c%Bfp}t{TSC!E{17MvmU{3&wqEMt3Py{jBZnuVwKH$q(#aOf%bOV zyPysHiIJTxsQ*R-hje+R z7`({TYE6nazxXM_|Dp|xZnW*wq2P6>#*(}fs70o+xi$&Ckk8MOVu7+F2Wj9G)Q^Lo z*ry{G+jm1wS-@1PVRWJxmqn`$>8QbF@vWQ&6B|UgoH{*l5@HvoK2K$rg(Jut_{jmI zHK!GAdP7l1M#;1d!Ps6QcD%=gltWQr38!3Bs3E3q2_eh>!CLRYR}Q3d$@{FV9sP;D z0de+<&*QB~!*EbMOHQJ4n54D26ZS~5_OjRm&y*c(5H{lrhnYQ$x-m|h<_OfwsGIx&?hP+qFa+9J(vB5nLJR!gL5I8~rGo1zFHH%Q7x zYVE09c_UPL1&KD)WVa`N5%i;KTUNfdz18x2Bd zN!_zz$^}K50*0oJB92n<+~I2?OtWNbqXON{L|CXzeP>lsXknu3W~aR6b%=1F?k^5d zV!W8LLQazt6$xMo&LO5?7!!=606zz&{Z@ynDkey`a4$q9ZTWm6Cd;>{3j&; z32f=-B^|E$+*OBv1zd0Go(GX1%qB{YCmbgv$BDS(1QTZ0trXQIU4;wVZ|{w5U#;z3 zsqIbF?vZNuB#QTZa0zUQTzPXnU(1PgL5;!R zBKce9dXU+j);C+-9_G5{cQ1^- zzHe^d;-~KZ-cs?~!;8aDOOoW|<;jZ5uMfUG_}1aOhZjPIKkI@Og7Pv+R_!RKTx0;& ze*rHStRycl2mAD~g4w=RHz|=MJ>J`gNll~*=oMBatGE2pZYi##ngJ_k$*Wt>vOD)e z!{m0s^2^_U<-4zZ=lc8Cm#g%@)vZG-TZfYF5+u@9ibT3fk$Yho8IP4wnq_l+bA69L zE`YbixmO2j6?IYNY@^EAmfXFE(A>LjMMz@xvbYle?Xehtdwec8nd_5sx4d)l-qn@d zu6S;j8h<;*-%0UzQn7bF)O$(N)%m^J<*U-p!9@3v)IF4N4I!}e2#?T!2oCtLxJoLn zjSWb}E$C#9q`y}3H!YP({_WJ~)+z(Ba>!AZJEWSvMCC!L^56$ABr1>1*(68VT19m% zR|;%hu9O1%6BP%fiUS|)OjI19m!-)Xqz7|1^xC<+`MkxF*!Fw76Q!*QM=L!)^ae;x zWzCV#jNuwr9F0r1gri+@w8tIo$^4?#{F;^gnppGlbUeQ%k-t~UC$aLz`(d%?cF*Fc z7N1{y{x+(YcfuqPVD1nb5DhCu4Y6>ds8uRzjk_}64|9Esb$8pL%!7OB*n{mq*dK2@ ziu)m{)wHd6+m_BOH$K>#@E(!8N8$zPH}#W}hi>0O*2C)B)#{#=>YfL6Qt#13^)acM z)l@~YYRhWX?v<+Dm;fYKEn1J!*1vS{1bh3q z!RNTYdM+?jZszD|KBvj}(E*4we`g%MmC;dFq`To_9DSO0G5BBur!BVQN#oBmi>1Ju z+cI$jLe?za2-(K;R62Rq7HSZz^d1yjmWtRjU11nNxyPh-y^h^vC#FC!RG9KD;$E zCvL8x*&J|FIl5+iq)x>G{E)_RB7|mnFq1Rm6!K_K8f~C)$a*YlE1f@%>1>@Lh>$;) zrd6L_Hq??+$Y;4YpPoy4Y$vvKOm$nPW==gjrt!|IFa4V9g+|0h((-rG2CR_>n#~Q3 zr%78hepBbWOwt(ry{4eC$$O1YzG#KqVmmlYyI6^m=wm%VxTar1nnZyKd@;jBh!j(< zD;m!$xXtzTMP8G6*cW*5mysbgj*%xeampHhEEL`^GV{5y20ga!GS}{`3v#a9P59e1 ziH@=EF=`H=?oaFKqL#MJl9J8SYN$AJMvpazYDiu}tg z>kjDkue$`FIZw=L)Nh~O12u_&IsX6GdmqW_hdb5!Gxd97ST|fkiMf7wZh;TI@>}=e zof}4B^K9NGvyJ~r{dOaT0^72*5tq3)WazI2GX zfj$n*X>BYiW_LqqpQ8c#4Hrfd5gY6>*A!xFa_=X^Cc#nW*d%IUmyiXWiQ4FXU3Li-NQ2SWNZ`fb zg){Ow76w6Enl3)XmzApclH^CEyG>#{&1P$m3D2SdgQQYV*O1*=aSmujYcqy3M3t*pD*4%VI-WOPI20;PPaWqDm6DFpC;VO}^n=d6Jq(Ki zQgS3>SiBEl+*6hN7hbsYxi>!-tBt*! z@HR`{X6+SIK!{qN3y8Cb1JP!9oXNAIEgLKH;>Z|8$Gt{Z^eAY(F4$G$t zLGc*UjPBYzrD=oo7Xmye&nah!^#&Iu^s;*bU$ zv}7Zr1M%AwE=TV1!&gRd{?hamH2;H;JklTtiwi7(eyD`FOddW(4@)_bh2)eGsO!K$ z?Q(GR>M&UuhH$=2%6Vwu`Ln|(Pn{e{<;n+84C8o|U@A+_B~@}wJQ$-iPoExozOR2k z{0yb}KM;70z+D1gBk)HA%mQuk>*Pn$Z1Eg{Q3Br}@FxH%k3lG{RiG@Ec4rhz=V_tX zzCpIqu~V?7W38OZk`3`vcBUrERIl{o8dAB`{7Mtc2>mIc!3V{638y81up2-TZEHVF z#x4Fa-bAaOJdu^sq?JUqXBKS7tM(>b`y|)CxN9HOpci(S1lq~YUP!-6$-J#}&s-iU z+3a5DoX#O$k&RcZxGIwF?&X&f?t=)K*H6+)KoV~D^ACMxb3;j2>Eeq}t+}44>`b^i z=>)EazH<0iG()5MgejpN5AqW30ZM3yB{akm0)$xGJ>L`0t%%v~IU&S^Yt3IR`P&oz zPRZYigpRB`xMJ^IcCxbW>o2|i(p$rKhu1l~)5pNA6LW(L1IYsKS7u(Hx%KM&t1m6T6Q{yN_TFPk4?>o})me{5YWkxRCwOQ@%L3a4PBc zF4)(doV#T`hjZr5J0(ZOs-tzq(YiF0aBPl3a3%HwpC>fAy^D%rML zvTLPe*8}GV-HDPxsbnzW7?K=AamP@ywq-7FVGQS#B^};XN5zVxV)3k0*^_YeN{-&R zqj%kw3lq&`N$W!7_6@0|HR-O5*;WI)Rsy>cfgUN)lW_MyknKNCbq$!@d(`*{&m#8f z32^S<+`-2mlVNAG}ra$%tB;VFJ>?3{sl8=l&NyCbnd#)F8uHs*E-OhusG40oE`F+@0{tJnk_eojmzBx-t*j~^mewJmqie1r$yK-NYF%+bEi&Qil3ZPJR~OsMVU{{$ z4|Xt1oj$3kFYd~4KP>WKV<|iNY+Et)C~0*gDz>_jZN)sK<9)(JmHouiaoEcJ)Y?~g zq|N%X5-;Fi*OwpTxsUjqWBaThf>9upKr-IQEmNsThoa$>)({w z;r^fM%1?7#oXa`A*BZ}hI=$N(-))CGQCI!Eja#whJip7jl3(|Hw{@l44!6lt!T}tJ zSbX$YaxbZ|s% z1lmmMh19ZDxA8n7GdCR0Hiko9Y5G0jkd5WlZ~&LC?Zqg2B2aJ7yz2tK-+&7+HQ`Li-pylv8Ry5*@jDS8td0wV!8gCbD~Ye9pG3M93wP2 z!StDAwUiAOo}kxH9y@vJ#goyp=VdJtLDd(k4+og7b$$2~$DRvgI12d2zErkiQht^( zXfVYWe;*h|>$S)R4p-4TQf$S+;5HYFj8m|V2Sc(>j7!myA?7J8^LdQ1BdH8yEmC%7 zLN1;n55^$;gj^>GoFwpb0xuAtU96Pt>Hp4tl6u}2)*<5~9Dmof>ZF(p3-1EaQHqTwjYmMi%vNQ}v zp{)@SV+5&~1dV zvq_?EOhrpBgT>W^oo6QO7dmeC)IY81*Ukm$LR>2a~v*jFz5(G)kW*Fjm#EFa8~B zr#V+<*!$oXUnI~&fDKh9JNQ@hNMl>pv^!3&H2}qggbhNIw2ua`**MI2?84V+%#mb5 z9&_?(F{(i`Q}D_!n!oau(CeYaGl~2fDZeJ}$Z#99y^^j*Mi*7btoI5e*VZQt!E7rV zf&^iSk_P22NM%+ptqa<8BE!%HnQDX@*07Zc)d<6;j^44piLmc!;US>b+{Ux!(G@lS z&1{#b5g{{n97Td=(M?AL%YExN5%xVTJeF9^ z;_VD=)Bl<&-nVTq7BQrUZ7CxGL-o$Ch+&z$q7A=`7Hl8yghIdJjE2m_29#+?H9Fgz zH_QqQsswmzD*LE~tgdFWUj?}%|LU8_%~^CpjXg36&Er8>g7yPTSxiO}XC_a?+GO^P zwlale3_C@0m4+#vWC^sahRa0H@a$;L*JYlvfb@Mz_#lD*k-(n=sKQW1Ay>RjFNoMm zxfCxZAT$hQ+U0=BSObO0lFw}u4^b>aHD$XnDcq1{=DB2Q(LG~FnL-1 zGJK+?re&4M5|!f7p;h4!fVQYURg$#kt6UWBjxG7VUGZlX?^fNfO89n5zTI=V>$W^+ z1q{e;?_cM#^A7UK%BIE7COsvwlBLL6MXglP^&mT5aX?Y73qtHsb%KZTCLrVjfLLh# z&j1S%#=%uJZ=N_MeUK$hViIyw($4@PN_qS%2ZwJIxNF~eQK|S)S%xM*HFw^rN`Z^DGa6igwB-l}YXutJC zXX~L}>xbKUa`)N+O>7j6ZxTm8>c9;5CGJc7mn;f1WsSjm<0as08ENy4ja1KW@wW^! zAdD6MFVkG3Ew08;w|ITQG><{SHqD7sGd8i*!Xbt>H*6OB5{}vX2LC+wW!OlP647Si zZdtwzu2Hb62P?q@>+Q6;N1O35$H*tK+~O&{EVV8&TYTQa(W+4dF_!}|c_B+-0`OrQ zTEbz_bzZjUMENS_EOR`L`M2Ve0FK$LTU=)1BVCE?>7_);+R1|SnJ{-eGv-zWb2~^8 zXViZr^vWbGE^u%ZGyGOhUF;A)jj9+tc{b|7Au#yXfciq-Q4@2rfL(7J+e99r8J}8DU^^PDu>A4l|wjqVGnUqWmq*ZM1eM_SVVjZHtk+vrC_rs<$nljaT=^{mK!F`Q{>H^8F#A ziT{oOo2rZHXddOzO!dGFS&Kja5c`Y>wkP#zJmu836PvST=I7s2QdC~?0s*S=loduG z;(vgP9mjkg=V9QIXKiAzqGg+x_%Env_W>}MD5ROE?9S0Qk1l?GX&~Y0mOR~aPADGF zS(CZ$h5p+oaC#p*z|V)1`Obb@96W@v8KD z(Ygq&_VO)KIhnD0Aud({c2pK^>lQnb@mJi319gC%1`pB%_OLMaK1ZoP0c3F%fz|RID=6bcqP$-! z?~i->*KOHAp{g5e+r-j9f$NliRf`dD(KXTOpepuo@)Wm(*RNr4@K7ddoXa_OPDHFYc+*A(}gEry+0^$mt zLB2M#cSaa(V$U>%K(?Yy-D+C&OO}9oOoY-VU1O+k;z1{uDSeX^&7h-<)HIUOyf_I= zm-@clY-f!nAWK^UaF9Tnr82)cmnQBr)r%(eGU7eMZ?r&$wC?FAey3>)8?j{iUmkFh znruvPTxFR;htKG%S~2%M9Z#H|ZHQ^Ex8EM$(7%99v8ERbsiY=l15;z*j`f-|x3{tM zF#{W*hkvR~u_bgAi#sg?%7rC;FDseevop3}x_$9)UmIBTcWBzWmMb0=BWSu;&SErV zwwi`bCot97GGm?KgJzIj>g%IEc9)-J?B<(OW+l{g#m)I-%0;{koHJ^X3k8DvexbQH znbSkR*s7Kv{X(MwV`aLp?%JqR#*WN0x2jC2X~Q`kQr=I@zoMK!w<3^@l`|=zX0&bPJ@Pz(JB=j=tiqlLkc%3g+Bm@HX2e;Q5r`4^69P>B zOp6t>!W2J8u9pCmqr=2^$m355ke-P7%rNmDywcP{Hkexe8;s=eDJ+)?aYa(D#bYb^ zjfwn50|S_JcP;n7k4?rtVgL`ZO~ymuHOUR_j#XdNim!?EAtJYDW0BRyeJhRo5{(C> z#si6x18e^B#eS)xW7#Hc?MwI%O8$c%d@A7|giT`!zSm|cIZV7OAb8ipr$Ou^Lmpl@ zcjIeEV=sTJHc`=ml;>`kwx_*u&p^DC^hXMr{sL zDvfW=Q-1r@gRZ~W`R6rpo^s@|qY~oj9gLc+f|a6|EFZm9 zOgG?TI&09D2Mre$7!XZ*_7aBs5xfx63V>&;14Xw5Dau5rzx4JEM9O6Vqq|jM zES)a-Y{x(Twudx6#az}P>y4LoB^=$7qdTtNOh5F;U47g@H}{v_eYU|K>tF5W0e`x; z`bZ`Bv&x(!E!Lkk^MEEbSeh9A5dV*!&w3&$Y!L;)GD`=fXrwL{Ep36o;;8v&CU(t> z4#I21F5JjlzKFbq%oXXrr=^W$Q`@4z!FAf!CEHTa2wtO%)JV8qOq0`uFCagS+}T84 zYBL?#!|TWDn3uk^P#P}gP-dc=EwLK;n%P(`{Rkyv4KNb;k3h0&xy|yS{|o|8t1lyw z2~uw#%kgO?wwrPO?Xmm}nQ9z0eop6#M!xC?>u98?j-N&ps(pffg*2w%cY$B%zeHN} zJb=mbOpW1bm}Hw;J?(U7bI<)g6Kds|M1(V!9N=Fy1MHsr$C zf{bLmkSnLHz74+^$c~k zft6w#wFS`~CbmF3e_Lk=Ud&)NqU_p=e-HGc-Lm30j&s50?ndnkeJ58Z!lNxpoXe!> zkM9jn;iwlVicCz0*oXE)mkeRIGYpAF?=_eTKs#DJqMNJ*K8sDqx9IG`zoFN+2z*GdOXPagPf%CIv217juPGcY z-m<1jj9h<0AQKGtFR%Ip_AMrm^@C?kvzl1-mfb>uFc4ShK$9L|z@W&uMGO-hG z4=I6`f#xl%k;+fsuUZsCatma+?CijlHmSHja~6RWcL18~MDsI!bwHx}k3S>p!^nQ7 z>1-#4LIn!`a^gcz&~z>-e>T=;-k;9P@8vGmUPy2qB_46z$^=aZw0jbodf1Oer5Q2KP!uAxGtQI}>G?MiryqU*2 z&j0^}$)RcG%|ra5O725%Ho?k1=TNcr$IX3t`1#A-^zc`FpJOQB`jdP+9)42d9ct%( z(w=j~Y5mErKF1N8^=CFa9zL>GAFJg)s?9mJ)%sB<515%Py7^?b$SQh`3=x(|jSPod zV~NZQzF;9XXBN7wvlcA(nzj=N_l!(Y=B?H=hAPcE5zDu>y^F6_T0$pkP3kZ@`w-C> z3FNQg!jwy@7!j2NWZ9MZ1d{ZxYts1x3zpC=Q@XTFu?ysgO$l*bmjny=vZk^t-y1Rmd`)kjU7KU$cxjZ)Ix661IS;`d288wu_*B?B#K!RxgdtYRy z1-)BNm&wmqGfU&mH6`Q-xnpz!s3tYXnWpH)CY33zC*m9+3uOJ}IHTv+Zsqw3c9w3Z zjy4pz3=(wn7!zq%K<~MFgXqz5RxNg@($3Og>~$;7jMd0@A^$3i!_LXoeG8Oxa-Vy8 zK7!kro*7RXVb3U~*J=^xh@?V)L%kh!`6bk)T|YBa+y;Cq)k4OqRG0C0#{MiVYaRo} z`2_iQn{vs>PW<+{Adg>jl+4eC`oQWQ&`W!zMs;7=qPmP{fkY0gzBn<5POXu@O04&s zdi}lb5(>?=Lo-^)t<3-#Si%MCve(p8GN-$7Zw2RxG#5uNvu~m3U*nKB6G-1I%(w=a z(TB}?uh2N5jh7qr(bybSb8Tumd>M?8rXUOZZ1z$~FfJLLUdE z@3`L3`I)o7_^-Iw$)eDbe+zNQLiWtrs0&*(5io1*XTe)UbI6Xkb7~wPwuEZR|4!-m z6PP9ND*~?)plurQKLSK|yr^xO{5lL-iMo-(PJA@%q%_E^(toB5zD9ttMYJS||AhcC zKPf9tt#0!el7O40%&I2t6E{B)&^F1J*ZK*bdD+#r!FO z1p<2sFz$-d|N7q=?}`*06(K}w+MVl;Qyh(1qVf_8HG-dO(_=9 z+4Q+4oGHrGl$FnL%GFAZA@9??L#}rL!ZeoTjv%YTd;`zX5)+4|pOv|v7^{D)F;-9u zG)mQ>$yZXgSSOXWEeTSG^1aCqx?mg$`&u%-B|AsoT1^uj3Rw4k%lA9J+mYx#D0LtF zU?@>@T&g)9FW+#Nomj|T$bL+G6HH+1-nk?-^u~*!ZDJwTKm`hGP_yE$iEq)r!Kw2q z&9q~H2r6K2pkc#E?1u%u#qEm?D+PggL4cCVS#{T~xa$(`27Dbf?runyRS*{IHb-F< z`ETdLkT|;9xM!ttPoi<3gv}=Ze#yT-&hE!aux-6kIUUdGrB5v?AnC7M zv?FJ46}XLuB~^>!?a#+cT9R8}K(W-lRC}*&F`HC#a#sCqEB>~GzeDnO#QhzJ2kTPg zU&MKEKqX54uW5&feOsz@rJy@r(9L#nmWJY49A8Iu@SI&Z*t%MA6%yBw0TF6q95iT zmQ{Vd_3hTT+Ho|ar*Y$*^pwJ4x?#t9z6&gQHNI|X_rmA`V9}Z^uewW0sHJ^;a!bR# z#?>v`SGH_lKJ)!^-#z!8&%OV-#Fm57mV@z%%=be%O83f^?&WRY@BMD?clNx$C$Z&# zwB-PFaW~$XS{jWFZq(cP_*X8jG$8rAB>#~$f8)1G&};l?7KjmafG4mtN2Y67Hjt=Z<@=Klku}&DN7A#YQC3 z%nxEYAU=q^PBxdO9K*w8mNYz^${D89BBsa5?Hb1Sgh$4eH}t`c$kE0aoQa}nYg#0c5<7DN2Q16qml+L? z;~O8qb{enP*HsV5b0g8xB7r7)@iq^Az?+=zF2@<(8HQtK@f=q5nR zXet+9#fDZ0TQ5_}cM9$FmX<|XKcb6VL@%bYo%Omo3s_(JSqP@PG%RO6Y;1Y6<~Y% z<`Df+y2Uh}voPPqIgjy9a{jpaPMQNCaFRnT)BUhKfLQBUMLc?=23mg4$)mb6!-a<1 bSTpF|-)|BkOyty?wi516c8xX0*I55w)(i1L diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/asyncio_server.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/asyncio_server.cpython-311.pyc deleted file mode 100644 index 8c733e853d2396232942275635f9945304850558..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27734 zcmd6QYit`?mR|8CQ4%RpCM8i%mt?&tOOzjS+m;_~Sr5PE9!t}cac?h0t0yMqzat_B|hX0xHhyRG<{yW{M zhfTS7K8K4(oWKdDIqs_bYr1L@%z|akJa4&bF>$!I;@W!E%C2p=wq3Qc>k?d-TrDwi zX6_6pl)l3W_K@vnsanX7Egbh#{K>~vyI`8&d}V(}x8r|j0`!^k<)J&%p@n!j8j0bq zWFa^`8;a9aEF|6viMXl^#_mR@!_h!2O7EuS++=80Zk~T17mv6Q2h_Q%X2EpTBADOd zu37~PpiQU~Z10$^mIx)dDYiJ@T^jB;jT)k z26PF#0ILNz;4XaQ!F#t*gFBB<3s@tRqk;|jiXp;yf>j_mU&V1l5q>msJsb)7&t2x_ zit#g1kymQwFE8hDOx_5``02S|EXIfD7v@6qp-4Q&2l<)Bxw*UibQI6R!AM+})$PzV zHM`s4_zga`xUdiv<19DIAMa(N@xh3|&qX8G`xc^ebK%H!J}w3$F-jckWmyN~;cIgt zo@Eoi5mHf;vl4^zq1#b$mXAjG*Y3t|;OC(K5RVcfq1z!*!GCZeh=lT&f%&Kq8bp

hn8%z1wP_267skWptig6?97ZwrQ_H{$Vy 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 NJ>L6bgA($1{4dly=!O6Q diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/client.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/client.cpython-311.pyc deleted file mode 100644 index c42e62e49ffb923fe9747a5c01b3dea44303fa26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38616 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 Juf5@?^9N-~0nPvb diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/json.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/json.cpython-311.pyc deleted file mode 100644 index 738199e42cb305883bde74b6bfa5fa4f2c134993..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 879 zcmZ8f&1(}u6rb76SCb}{AYu_@Pij({O;BP%gfgf423!vR?N(T_Ww8 z!;Fqcdmwgf*)jxinL$~D^c*P)Cn`w}2RIK9bv!~v9ST{H4w_ms3UG+z1>XRD2kX~j zhvIfb#qkxXBF>3wmrw0u8J+tOx_SqcuUAe~uD$C|UCEk^8@4c{=NS&+O_tLG-C=H! zd`+Ald(64V1KoC|dVvtC6yvmJz7mWJv%_4%X@_v)64%`H`Zg2h6NiZQqZW~7pSgXj zq0G869lK_BcV)|S?-xoXQ`nNNcS*fXnh?d@rtLD@Gq;837P`B^k|jukS&*48L((`b zu?8?ilX!Aede=Ybf715{!@(qT(_b}@GsQodqMs;EQkl`4_vH`e;pPmEqq>4QslKeh znw0@y;CO)hm?!1j4|0Gh-T-;A!vkc){x|#)L-({wu+$}7gtg_gu(}}QaT^{$94j1f zP75N?OcBJ|J4y=m(+q>BKyWp}5YnIs_4S5m9M2xz@#6;Y0c}-ocn)MTf=fZTSiH)s!DK!u=1-6E~sAV!FO*b3YaqhI+?Kl?!%1VY?bfTBSART^>u!(W}*Baft{ zG)4EwxqZ#-%mt(L>JOz9^YbGSQh6+ zfr#WB(L)~*T{1%VLWDekzhCAhJ{E?th#~D53+uuhNw)kGr_Lq?FTQBFisP!TsVNI) z+R&;*_)Dxdwuhl|n;2wX(8;{03-h5Ei4na;mp&5aB^{QU59<+t5nTlGQLp8lxpOm< znT&d0A_VJH&1BN12J6@sT{d++ZLF%ypbIvmXRSrkGUS;z<)!zz+-f$a8((`Gb&S;sli1vZ3V<12f>U6 zo;h1grWdoo))ipTqNWABS(<@d0(HJHYGhZre7QzhoNqmTsjj~2ESmL| zYn%dQ)uqhP408n(pr+H*7p1D)CK3&%;f&Kss+$^ap~|k)RnuK+)FoX8Ax&$MvMeZ8 zrgMhz--Xa^ExQa__l*KAK{s60Ogj{8#6=@e*&?6O#8ORi1&m_JSE^y@8QZj6x(Zvu zS8dR9qvbhEb~f#A=q{b|4%i323F)+<%Y4IhV?oWPUAm&CvoHuuWirgpFcVAzZROiH zi7wl)vzqFFHhjxIyQVH@(gw{s>Y_0|?sww4=5oenZeT6}&07Bos3~o@bp*q-=|nKU zY6OX7fCx-Bj#rOk0?5u%hB#&lu1#3PHX6(Su--;pZlkIx8Es$ok60q;L=RwC ziNp}dacXpQG?^U1?ex)SpT&IBl1*Eyd0_N_=vnc<{SN@QNlwTS1!{iDiO>>)mISSu z+ax)1HK^y2!mgqV_W<`nfbYb0pkBvX2aIo}2(EQ^*+sD{N7jToMO|3$AVd=zxC~_k z6ITgj)(JRqarT*zN=Cf);JksRylBm*cpX7Mo?j`^#%5nR-cyP{|8;!iQG8@;t{5LH#m6c{ zh>e$@Kbm(-L$4H{e`WJbsr_(m;_##R@Yac9JXMOPaN@CYdsm_TFwDpwDYk##ua*ZA zg#meMimzCRJ_o;T;DTt4<`aPqZjdWrUXUILIbnscAs+Tc2>T%yQL3dm0oVwMBp1pF zy6{|W0%fR1w;OtzUC>xZ#`_xzqF3kOQP2a-I1 zzhCB%VqlJ}*9DWUl^h(g`dBlb1^LNFI2UF&T(qoexf-q2@@RRxN)B?Dx}-b!e;4#6 zLZ%aiS+V-81#wYmURxk;Z=G~AO}({w?n`7Nl8fZg@OPDa(DNYZT@*AC(mr^aDF|>x zkB~9qNUP#n=v}fZ2;^NNz+)W({j}Eze7HYH@so9jp}c#t_hvo(uP~n041#Vz<+xmC)@0c(Qkbr%zhzw5uc-^$l@@M;l4SDN-68Yj&1@=`x8PylgC4CWC)ByjoH<+r0tLB>y}Zm3b^t2uAb_O6xpENI z=f`X1X*k#7`tWzLRiFC`P;k(Z0%QGypZ%z??-=K57F;bjH;mGX;2K9DD zc|WVB{SmGP)(`k!5RS){uBs;x` zedVg5xeU#k2M-=lyv`-nf@_7sjQ6vK6u7pU( z!EfSy71Gl2+Fkb9>gP8;y|H!e%i)rIwm3Ll8l2`M<*viGI?MY8%KMMzuRWAY$0iHC zQ-yt}ABV;6v%(XCu)^WLBV>Qyogd_{miopXo-FpBD)pX1n>zO8WO?Aw=hL4~|Ka>+ z=kJUIOWnu#Kpi~Bc~213`}V3mefo5-Zr=Azckd^M3f;ry1O2x*e!G!>XUi%cm?#~X zD0EFg`2O{ck8j+uit*#6`0+yYxPu4(tNz~86QQprq%%UxUnBuwlb@1c3J=jQK;<^L zEeyH(9zjD7E#i$_nqBWWIeL=L+Af{uW+<{FfV$qwbMH)Ag=+~$uV4ZjgjUVLrJ&yA z;LyC*yK9~#Fz$;uj{*Rzi|*g-y!Ep}@?0Ttz8IY;MP~}pnR3^_=8Z!15I?=i(CjS3 zWCPB`0KC{C1cw25Es6ryH%0MX2zm&HOLC^_u7qI>=Kw3tPXV9{@t=y=AC6WCf>UHl zm=?-|!;WL-g#at0xGQ zmjKUs9l+C@;9`lhWjpOrT7)~8Tn?2#J0}ydw1VYZ98Sf8Azc{ zMOUecsz}R6)F5>uxltZe*_HU{N_=dkO6~sj!;VJkXe1=0DpK?3D7#XWubw+&4>nmo zddEJ#k8{pF=gfKesn1t~VEiljM;!4W^dGt?4`*reItG*b2qVm-P>lYvDQ1z4*%*Xv zzW}Tl7qiD4F=xybbH{3~A?Gikv|SXjSgC@^M};3Y?aodO2{!Kri8GZRy~{nAI%vlBWu6P>yOa2lZV zP26`V>5T`J z&T39sv|yc)c372eL`d;kQ*^_y9tkLcgFS3}0(v~NboqkG+J4)ZMLE|2&cQ5u2pc>J z%^F{Uo4WkT+WQxiX_2g!EGqK}G0kVvsa1YX;xqHSvbrSkrME1&b&qNIINjDcEGnX2 zla!NbSrO9-Nw>)g(H(OJN8M}w8n`m?gGhSKXJTqunjjQuq1FgCrhb$QV$5E zfnxckG(Ev_^D>#*iHGqP_kSu&MDAadKxDiq5-}~N`#;XCBqh23a!QnMT)HkQ{VP&> zB|cA=3A#)r=lYjcmFt=GaNpoyznoO04=88x8c<1wOC>Y?C68KK)m`y;GM!Z7@wLE= z>1O2(`V!dcV2#yk#`sGP+mSnh!+_bywB8 zt9kEL&C{Isyr+3QQ4aZ%xG zr}z#5pX##)1u+iZHbk`JtR6v%(&0cTe9Ra4() zE4{vwhjMh(d1#y;NWJDWB)D}Xr`oa{2vx_geBwx&x}#{wd&cdSbh!#W4`?do!?v%v z>U&EPw^d?6bhC$ScEo!zsk1b1+SkGpMjY|Vb*U8I{CtM+3WSZkn3UyYCf%nqb8Gfx zW&VTH0{fOZ^_Dpc#i2%)mLRy443PydX#&w9s6|;C9nsx$qa$W`8nH@R;E*&@V8rin zip$|-LeaTY60!l6Q@7*g#U)v=kyg600Sgj>nM@BMu1Oo+c9?9}e5If>mj)j7>26`K2{3BQ)=)Oy?*f9n%$A_&U}vx1C#2&q_I^ZdfNZ6f2ZrOf_Cl-#ASF0 zWC%wY5CiEOV4FeOZj~k9l<8X{a^{L?KMHx?) z!Ax@*9r_lN%WXExl2Oc6%2FA}uy5so%E()=sv7XMW5@5<1K!p00tZV@?3hKBa*?h> zwxZrz8rAV92NYU_O5?CiZdYkb8jjMy=sl{WQD~4@Tq`Z~juw_3+*Ajv8^}Q}dw2Xl zR;jW9TCn6(XxNrUwKa%SvFwk~7Ywy)7*+0dA##iX-#PqlD&NNE(2>rfTj*D|&(SSL zaIS?SM(yXtaxzjB2^%>IigKUPl&*!M=@l`R#Jse)q?G#;o=6EPxgufG3G#kIXc?Lk z{Ddk%sAHJf%9fJS;@>(9K_=~dU2f3wSC)KIDTF|ejb_wj}|y~_t&((pMN0d&KKH;)b^nr z@p=1LzJ1K7@#BTMb86kWy!V_|cl=)OMken+o9o*Ns-43-^7GEK8#c}3FQR()aH)0J zYwzBOsNUASrZ%7otcF_F!&1|7@P;DH9^w=Q$=tAv6 zzUgGq4GUxE&5t#xsS`vB4j%xG@7un)O}2^34^dW|##6Kb(wjGL$wDLVJY<2RSZRO!SSkK;@Nw(W8HH^?Yb zgmwa?oq|&o(8Bf?WTarDJ`q~=4M5Ag{7V4q)}wJPd9G#OQ@bA75BF^2zmF7=*M9Oa zXbsxiil`cNpRj}G?*j8?dZ`d3hVQz{y{aki7?p?0LTHykXqq52Lzpg4TUA3P-D`HX zhE-%j{S=}Ayj~+V9W diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/payload.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/payload.cpython-311.pyc deleted file mode 100644 index 7aadea6ac4a68cb91e1ab158a26d4d1ca062c56b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2561 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 Y3vLU+b@xA+FMg^#{pIImVnF%70gwBX3;+NC diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/socket.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/socket.cpython-311.pyc deleted file mode 100644 index 62fee024d130f0f9bd1410ac8b7dd1b2c0d01113..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14892 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 Q&A#wCdGh5`o|BILFYB=%AOHXW diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/static_files.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/engineio/__pycache__/static_files.cpython-311.pyc deleted file mode 100644 index 847693ada7c58a3754cbf9a31099d6db7fe1be1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2544 zcmbVN-A~(A6u09fBylqGMIlhwCA4Ui5Ra{uHq>o}u4{)%r}g8ds)pQL0}hFu*@i-7 zCLT5^o%#?av}RMMc`qGPUwE0+$Nd3&AjlGyrAkP9>RYPrVd7;w*8!50u9J3keSOZk z=i_(Iy*~aq6beuyk!%KH*lyz9X0nA@+m%&qcNXky1}tnw zThcPFgOuRyfro+Tc>z|)ie7Q)luj>FieIO7DsiZ~!bqQB*9xP9&OEW8l#4oL9PT$0 zq$&>~%A>K;cnuD#5 zMrSm416L~|#e+RMBhrvpTxX0Xt0oH|A04ugJA*xq_(qfOLnT1@kOnJw>O*;5cNwJ0 zN5&D&fbN3Z zU|;KLVt>P8#iIoqMn+qMZcw@h2U_pl0ZyGEJ%V3>i*i-a78D6-a{|iA89s+*#GD}U zc>(bfMj2Vs1W7~MazQ{dvf}6|!siQustFjW8uW}z0Kp(;=*HE{>43wI6?lcuqXMtZ zjX6eyLIqhNJqF1$FF0}xiJN`9y5ni$R2@V7exP~~z%(PyE+|gBLRicYm%OsPANl&6 zsG^w#$q^&PNlyhA4MlWE1T5Me8O;mJY6>L}QcjYb9r(%p#HUH($u#=-C4do@1rm1pxuLE3zb{ogJIHvPW}I$@gme4p7*^=HSq%B`hqZ zNmt#Y(@+0~QS54N%yLE(v=LQP1U?U)*sG|}%r!e8s-gsSlrn;U{$6n@&-p`qL7cvZ6*5UO6tf*c`2ds*&= zDkv(Khnu9}JX{5dm$)f;Q500}BQTjiKgVm_q983!&k#04*qnHqD=cesvh;R(bd*y? zO&BTgnR)noshl9qijpA8Tr-+9B-9RAr<;UIKj45KMX9~e_gAUfF)A8gowVB6lD^f} z1Jeq2RpMr_uSA#V-C(#xTdzgSx4+JovR0z^$DZ$djB6YH)kMlnr0!0ZJ}jTG62~jr zcil#|ns~D`X|>17`d0e@Oe>CzxEUWT(^j~{igZ+%weE_(6&Z%<>}@bVb(`^&vtNr) zVClrEMJb>E8P(w#eZqE>`5$6cw%25PYZT*8SdpH}r{(t2cxik$9J%lP#=GWQ_m##i zHdwlO@4X$if1B+$2CD3!$qv>i+W*GJ*v{~|?csC3#j3*>%;5`;&`Jy#k+FWE`)CM+mtFpc6)9i%r6`qOtPi`p8an za639^sMYAO86Do3Fr!@Q{1Y^?gGRT}s1=TFb#TuZx_|Uf3KpoVR1Nm-vcc6$&*7F( zSB6|l7rdQ&^9!XU35{Uc^PSDhcp)deubcpue5C3GEH#Fv>0P$NVvkwDPK)id0!b^_ bM_9JA7V$@1H42v1P_2ujLpAE?;>7p|_0^DM diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__init__.py b/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/__init__.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c3f9e023853eed7715cc75cd4c2fa5902bb07d03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmXv|K?=e!5KI(B1o0gnY$#sEi{MQ!;yJ8Mtc&foB(czs=o7@h_zOQ!=&dIcuydH5 z*=5*y&1O^P@xg}*^BbrK|BH6)#gi#^WD92(`=UZ^ z#V!MT+g`zmN>e2-!6w0Gcot>tt_7{4I2IP2UY3yDAoVFtDU!xQfUPN!%3u{fNQs0_ g%BZZn$vQ98J<}UA@+Cq|JNMKKIp+=Q$qfDO2le?rRsaA1 diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/aiohttp.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/aiohttp.cpython-311.pyc deleted file mode 100644 index 2092e49ce43625a867b58a0e871fad5d6e70fb28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5903 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 diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/eventlet.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/eventlet.cpython-311.pyc deleted file mode 100644 index b7bfa2954c41bdaad5f4acb859aecd744f8e43ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1934 zcmb7E&2Jk;6rWjp*J~$^)dZKesL_f8!bG)cI8;@t3W+8a3PggGRxCoJ&F5 z*_1>+M5q!uw1@+x9602F0w|Xr5f}ae4o($RYo$s^oVdA452z>JjI&Eja$$Dn?faOS zH}AdQ%n#*q2|@eK{l@t{htQuwNL%5MIoJZ`A##v|J>+8(W5Fw);^)kqpEvVT&Uvb@ znVRJDz!%JdoD$b>hm6;hM7y!fsO2Q;>>3R?%u#R0G^T=yJWAWZlyA|c z#n4`*{MO?2ckR@T_$!CP!Rx?$0TEMVVh5SZ7HVP#-_^~WZS{`)7YVUFD~bq-^5EYvjLjFk@lixs z)bMFwF~_%<6<9&z{cz2tQDY8fufDTv@do5{jWmU53(<3z8trwy90qUIFJ5d!E~gjT zmc44VU=ffLQBPwKpp4!G^7kg{=~MUB z`~J5#_VicxMW6cdMpwV`=q8Xs?^Vxk zS`tUufdcJjMfx1(IQT5A7_{xol4`_%2gYuufD&cJQ5 z4Fe-=$|X){$3kyOWiw=kA2MpV0kFPQ)@xca`e7V!*Qc|Lg)AwxD3>^+oRuL0CT?$r zMBDN_LTY(72HKF*5W3B) zmy{I?T5Aje<`(Xn2XDzkff>V)CCJMj_apY86v8SH7%*T@dsE;%7=79~mm)3OE4G(i zQHSTAb1v_>=bo=W6$&{5BNfDXy?Am)NLBZ3(_!Oz3w0bG35T zmR3l4^j}CU)2L{!2EN+}nc>vxJ`ZmKP5Gd~8Vr%^o6HMuEnCSK@SUi4un3c1gMk>S zP@8~JXeF~o98#5bNENoeH&T)9%so<3cF0{?QDIv-Qg5wuX4y~Q%e1r z5SpHCa$9$uRc`XFg#b3fUE?hlg|sCP9ZDIT>)C04)F~v z*0*>bc5fA9BQ7S&j{z}w4Zz_x>1mfgRX(lWx1VVse^2MyC5aI%JB z`<7t{+wck8sW7-Mi@7e`E#w!3q*zZ^XCni7mHYjjBd?9E_6127qIOH*aSz86D*;xo-Eh@avR#$xM z4h!F3x$$;u>%T^_nZ$Cs@N_W8F_{LmE`nKP0Em4EV8~7`1D6jW;C*ip!fEKiK~m>A zFHY5_ZDIfx51S0R31pkHB;1700Xx8zdh9H*qfexI;sH~Czlg$kbKo}P6Fc&*wgW$5 zWGhLEz!eD+=LZs48tMma(@n~Y!wJQf9s%!ZaueiNAY;>)aJ3kqd&(0hNl)4)8!2Za z-4*1A@F9sb$$`WWJ|uyOCE0TbACgdqB!=+)q)sO6!B>u-3_K=tvvsB!tT~HK2DJwL zrp0gj4c%kR)Rk0Kzv5`85 zUiGuXHagg7f8ilNaGN+MAr& zYjr2f0zW^s_s-sr0Uha0Oz&-UCl&zD_oiO{JlCCi74X6!;XRZ;{&4rhjy4;+Z|YK@ zP8vwxg9&Eg4S2_6e^@RdlK-5KC4LDcBE@ojxJQw4arGe1UInx@emu^EBsLWRW>b-y zcUxZ;=e{V;Ju8;F#ZpHr#p(%(kRPIKjRgUg zNZc{W5mx|jjUCq=7hMJVus)Vu;Qkb-HdTte;uK-v2iP6q&{mvMR$#9H9qWfi(B z(f)B6rcqvWw+5@#!>vdWB_SYQSdK%ncevZ@^N33g<6fg7&W8H$@8=u_AhVs3gf#! d?-#N;sZRiGtN07BMSQ5vk>6*_na8x8`8Ub(NzwoS diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/gevent_uwsgi.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/gevent_uwsgi.cpython-311.pyc deleted file mode 100644 index 4eb65aae05d04156a1bb5615de6a3ad34083eab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8134 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 ZKXOcx-*ad9f8*iG-E)rT|KQ+&{vZ07)7Ah0 diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/threading.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/threading.cpython-311.pyc deleted file mode 100644 index ce1b6f1ead9253f4b323bb8d2edd23a1657edf50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2488 zcma)7&uqkk{^q?mv$OAg z@6F7w`FxH*`_uW!UX=;?3zcqDw}s6=K-eHQu?3gZgsLE*EV^PErJ zRkkHS#g+jxwgRYPfK|;_!38bKU!pS=-?~bJOOrH0X>y+u1YjUpF znZMxJlaB1)n z*CA4u)jBsCxI@RQ+JkO^>BPq z*Izfv-*d`%8NOjMyJj-eGrjV+5C!Gsvk=qO)8J_tJX$bjQMFKYotbidF_`ncPp6I^ zEpsQJAJ8;wL_lgI3V-iNvhv^dQ7qCGq?Szs{A>%PY+N0*>N7;Xg&)-ql9UBM>y z4`3D_2UsDmhKi5&KPa!4A!IciDBQn(@A@P8?#Ca2U%$lprq+P1`4E~%tN2F zC%fl$jpQjv&r_`%p2%?LMT&)c=a~=($MO9n0)`GQ6?!uj&mDmQj=6#~4HR0<`#0|0 zxO=O0tF0YOoZZbbQW)o|4#Eb>zK6SS=CDGJkO0@&Zg4&g2qfs9dSLAha8>A@SxFw{ zBv9A~p3M}P9;xRqo?*;qC2>2YHOe{Gak4?;46-83TpH?)AD0*fJ3j@mLOP<99SsZn z*FWDl`S9cu^+jRwWnr@2Ke_d4V7x8X9>}S})zX*pa}#wY9}HSYvf$lsq0e zF7+fh6TC?U+79Ey z695Sn#e|Ae4^O=)OuQ^iwEHKzL==&T1YpwIv9)7JLlJ4f?Xp@tKz`1Zq~C;+bfJ{R z-Q$@xY8X+@FlxTta8d3zjB5?k-5ya5!}cx1V0dD%0s@w7oHsTG(lZj5W0Fm*7KVVc zxdX70K9EL5>ktG@Q1*kXUC4;a!463QMlr2j$jAyLIE8*$fe7D*#0&g(DHCOqBQa90 zHE4rIeQ{^dT0K~dl=u>evP}w?9^N~V!d*)1r6HtYwh=TK(7(gFs4-7bW;(viBIUc-Q{_zJ z;~BiD*d%^FW5lOD!!p>R`n7g4$=FxyI1J#4!v6+IW50hB=J&R$oxGY8I|N`QgHK${ M>$!3Ai<%Vk|Gzv(g#Z8m diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/tornado.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/__pycache__/tornado.cpython-311.pyc deleted file mode 100644 index 7b2f9e3cec499f022541bb4d5534caf3f73ea9a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10532 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 dAy8;JQrO>B*w= 2.1.x with support for api access across-greenlets - self._req_ctx = uwsgi.request_context() - else: - # use event and queue for sending messages - self._event = Event() - self._send_queue = queue.Queue() - - # spawn a select greenlet - def select_greenlet_runner(fd, event): - """Sets event when data becomes available to read on fd.""" - sel = selectors.DefaultSelector() - sel.register(fd, selectors.EVENT_READ) - try: - while True: - sel.select() - event.set() - except gevent.GreenletExit: - sel.unregister(fd) - self._select_greenlet = gevent.spawn( - select_greenlet_runner, - self._sock, - self._event) - - self.app(self) - - def close(self): - """Disconnects uWSGI from the client.""" - if self._req_ctx is None: - # better kill it here in case wait() is not called again - self._select_greenlet.kill() - self._event.set() - uwsgi.disconnect() - - def _send(self, msg): - """Transmits message either in binary or UTF-8 text mode, - depending on its type.""" - if isinstance(msg, bytes): - method = uwsgi.websocket_send_binary - else: - method = uwsgi.websocket_send - if self._req_ctx is not None: - method(msg, request_context=self._req_ctx) - else: - method(msg) - - def _decode_received(self, msg): - """Returns either bytes or str, depending on message type.""" - if not isinstance(msg, bytes): - # already decoded - do nothing - return msg - # only decode from utf-8 if message is not binary data - type = ord(msg[0:1]) - if type >= 48: # no binary - return msg.decode('utf-8') - # binary message, don't try to decode - return msg - - def send(self, msg): - """Queues a message for sending. Real transmission is done in - wait method. - Sends directly if uWSGI version is new enough.""" - if self._req_ctx is not None: - self._send(msg) - else: - self._send_queue.put(msg) - self._event.set() - - def wait(self): - """Waits and returns received messages. - If running in compatibility mode for older uWSGI versions, - it also sends messages that have been queued by send(). - A return value of None means that connection was closed. - This must be called repeatedly. For uWSGI < 2.1.x it must - be called from the main greenlet.""" - while True: - if self._req_ctx is not None: - try: - msg = uwsgi.websocket_recv(request_context=self._req_ctx) - except IOError: # connection closed - self.close() - return None - return self._decode_received(msg) - else: - if self.received_messages: - return self.received_messages.pop(0) - - # we wake up at least every 3 seconds to let uWSGI - # do its ping/ponging - event_set = self._event.wait(timeout=3) - if event_set: - self._event.clear() - # maybe there is something to send - msgs = [] - while True: - try: - msgs.append(self._send_queue.get(block=False)) - except gevent.queue.Empty: - break - for msg in msgs: - try: - self._send(msg) - except IOError: - self.close() - return None - # maybe there is something to receive, if not, at least - # ensure uWSGI does its ping/ponging - while True: - try: - msg = uwsgi.websocket_recv_nb() - except IOError: # connection closed - self.close() - return None - if msg: # message available - self.received_messages.append( - self._decode_received(msg)) - else: - break - if self.received_messages: - return self.received_messages.pop(0) - - -_async = { - 'thread': Thread, - 'queue': queue.JoinableQueue, - 'queue_empty': queue.Empty, - 'event': Event, - 'websocket': uWSGIWebSocket if _websocket_available else None, - 'sleep': gevent.sleep, -} diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/sanic.py b/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/sanic.py deleted file mode 100644 index 88b3e5f..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/sanic.py +++ /dev/null @@ -1,147 +0,0 @@ -import sys -from urllib.parse import urlsplit - -try: # pragma: no cover - from sanic.response import HTTPResponse - try: - from sanic.server.protocols.websocket_protocol import WebSocketProtocol - except ImportError: - print('yay') - from sanic.websocket import WebSocketProtocol -except ImportError: - HTTPResponse = None - WebSocketProtocol = None - - -def create_route(app, engineio_server, engineio_endpoint): # pragma: no cover - """This function sets up the engine.io endpoint as a route for the - application. - - Note that both GET and POST requests must be hooked up on the engine.io - endpoint. - """ - app.add_route(engineio_server.handle_request, engineio_endpoint, - methods=['GET', 'POST', 'OPTIONS']) - try: - app.enable_websocket() - except AttributeError: - # ignore, this version does not support websocket - pass - - -def translate_request(request): # pragma: no cover - """This function takes the arguments passed to the request handler and - uses them to generate a WSGI compatible environ dictionary. - """ - class AwaitablePayload(object): - def __init__(self, payload): - self.payload = payload or b'' - - async def read(self, length=None): - if length is None: - r = self.payload - self.payload = b'' - else: - r = self.payload[:length] - self.payload = self.payload[length:] - return r - - uri_parts = urlsplit(request.url) - environ = { - 'wsgi.input': AwaitablePayload(request.body), - 'wsgi.errors': sys.stderr, - 'wsgi.version': (1, 0), - 'wsgi.async': True, - 'wsgi.multithread': False, - 'wsgi.multiprocess': False, - 'wsgi.run_once': False, - 'SERVER_SOFTWARE': 'sanic', - 'REQUEST_METHOD': request.method, - 'QUERY_STRING': uri_parts.query or '', - 'RAW_URI': request.url, - 'SERVER_PROTOCOL': 'HTTP/' + request.version, - 'REMOTE_ADDR': '127.0.0.1', - 'REMOTE_PORT': '0', - 'SERVER_NAME': 'sanic', - 'SERVER_PORT': '0', - 'sanic.request': request - } - - for hdr_name, hdr_value in request.headers.items(): - hdr_name = hdr_name.upper() - if hdr_name == 'CONTENT-TYPE': - environ['CONTENT_TYPE'] = hdr_value - continue - elif hdr_name == 'CONTENT-LENGTH': - environ['CONTENT_LENGTH'] = hdr_value - continue - - key = 'HTTP_%s' % hdr_name.replace('-', '_') - if key in environ: - hdr_value = '%s,%s' % (environ[key], hdr_value) - - environ[key] = hdr_value - - environ['wsgi.url_scheme'] = environ.get('HTTP_X_FORWARDED_PROTO', 'http') - - path_info = uri_parts.path - - environ['PATH_INFO'] = path_info - environ['SCRIPT_NAME'] = '' - - return environ - - -def make_response(status, headers, payload, environ): # pragma: no cover - """This function generates an appropriate response object for this async - mode. - """ - headers_dict = {} - content_type = None - for h in headers: - if h[0].lower() == 'content-type': - content_type = h[1] - else: - headers_dict[h[0]] = h[1] - return HTTPResponse(body=payload, content_type=content_type, - status=int(status.split()[0]), headers=headers_dict) - - -class WebSocket(object): # pragma: no cover - """ - This wrapper class provides a sanic WebSocket interface that is - somewhat compatible with eventlet's implementation. - """ - def __init__(self, handler): - self.handler = handler - self._sock = None - - async def __call__(self, environ): - request = environ['sanic.request'] - protocol = request.transport.get_protocol() - self._sock = await protocol.websocket_handshake(request) - - self.environ = environ - await self.handler(self) - - async def close(self): - await self._sock.close() - - async def send(self, message): - await self._sock.send(message) - - async def wait(self): - data = await self._sock.recv() - if not isinstance(data, bytes) and \ - not isinstance(data, str): - raise IOError() - return data - - -_async = { - 'asyncio': True, - 'create_route': create_route, - 'translate_request': translate_request, - 'make_response': make_response, - 'websocket': WebSocket if WebSocketProtocol else None, -} diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/threading.py b/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/threading.py deleted file mode 100644 index de8df79..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/threading.py +++ /dev/null @@ -1,48 +0,0 @@ -from __future__ import absolute_import -import queue -import threading -import time - -try: - from simple_websocket import Server, ConnectionClosed - _websocket_available = True -except ImportError: # pragma: no cover - _websocket_available = False - - -class WebSocketWSGI(object): # pragma: no cover - """ - This wrapper class provides a threading WebSocket interface that is - compatible with eventlet's implementation. - """ - def __init__(self, app): - self.app = app - - def __call__(self, environ, start_response): - self.ws = Server(environ) - return self.app(self) - - def close(self): - return self.ws.close() - - def send(self, message): - try: - return self.ws.send(message) - except ConnectionClosed: - raise IOError() - - def wait(self): - try: - return self.ws.receive() - except ConnectionClosed: - return None - - -_async = { - 'thread': threading.Thread, - 'queue': queue.Queue, - 'queue_empty': queue.Empty, - 'event': threading.Event, - 'websocket': WebSocketWSGI if _websocket_available else None, - 'sleep': time.sleep, -} diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/tornado.py b/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/tornado.py deleted file mode 100644 index eb1c4de..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/engineio/async_drivers/tornado.py +++ /dev/null @@ -1,182 +0,0 @@ -import asyncio -import sys -from urllib.parse import urlsplit -from .. import exceptions - -import tornado.web -import tornado.websocket - - -def get_tornado_handler(engineio_server): - class Handler(tornado.websocket.WebSocketHandler): # pragma: no cover - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - if isinstance(engineio_server.cors_allowed_origins, str): - if engineio_server.cors_allowed_origins == '*': - self.allowed_origins = None - else: - self.allowed_origins = [ - engineio_server.cors_allowed_origins] - else: - self.allowed_origins = engineio_server.cors_allowed_origins - self.receive_queue = asyncio.Queue() - - async def get(self, *args, **kwargs): - if self.request.headers.get('Upgrade', '').lower() == 'websocket': - ret = super().get(*args, **kwargs) - if asyncio.iscoroutine(ret): - await ret - else: - await engineio_server.handle_request(self) - - async def open(self, *args, **kwargs): - # this is the handler for the websocket request - asyncio.ensure_future(engineio_server.handle_request(self)) - - async def post(self, *args, **kwargs): - await engineio_server.handle_request(self) - - async def options(self, *args, **kwargs): - await engineio_server.handle_request(self) - - async def on_message(self, message): - await self.receive_queue.put(message) - - async def get_next_message(self): - return await self.receive_queue.get() - - def on_close(self): - self.receive_queue.put_nowait(None) - - def check_origin(self, origin): - if self.allowed_origins is None or origin in self.allowed_origins: - return True - return super().check_origin(origin) - - def get_compression_options(self): - # enable compression - return {} - - return Handler - - -def translate_request(handler): - """This function takes the arguments passed to the request handler and - uses them to generate a WSGI compatible environ dictionary. - """ - class AwaitablePayload(object): - def __init__(self, payload): - self.payload = payload or b'' - - async def read(self, length=None): - if length is None: - r = self.payload - self.payload = b'' - else: - r = self.payload[:length] - self.payload = self.payload[length:] - return r - - payload = handler.request.body - - uri_parts = urlsplit(handler.request.path) - full_uri = handler.request.path - if handler.request.query: # pragma: no cover - full_uri += '?' + handler.request.query - environ = { - 'wsgi.input': AwaitablePayload(payload), - 'wsgi.errors': sys.stderr, - 'wsgi.version': (1, 0), - 'wsgi.async': True, - 'wsgi.multithread': False, - 'wsgi.multiprocess': False, - 'wsgi.run_once': False, - 'SERVER_SOFTWARE': 'aiohttp', - 'REQUEST_METHOD': handler.request.method, - 'QUERY_STRING': handler.request.query or '', - 'RAW_URI': full_uri, - 'SERVER_PROTOCOL': 'HTTP/%s' % handler.request.version, - 'REMOTE_ADDR': '127.0.0.1', - 'REMOTE_PORT': '0', - 'SERVER_NAME': 'aiohttp', - 'SERVER_PORT': '0', - 'tornado.handler': handler - } - - for hdr_name, hdr_value in handler.request.headers.items(): - hdr_name = hdr_name.upper() - if hdr_name == 'CONTENT-TYPE': - environ['CONTENT_TYPE'] = hdr_value - continue - elif hdr_name == 'CONTENT-LENGTH': - environ['CONTENT_LENGTH'] = hdr_value - continue - - key = 'HTTP_%s' % hdr_name.replace('-', '_') - environ[key] = hdr_value - - environ['wsgi.url_scheme'] = environ.get('HTTP_X_FORWARDED_PROTO', 'http') - - path_info = uri_parts.path - - environ['PATH_INFO'] = path_info - environ['SCRIPT_NAME'] = '' - - return environ - - -def make_response(status, headers, payload, environ): - """This function generates an appropriate response object for this async - mode. - """ - tornado_handler = environ['tornado.handler'] - try: - tornado_handler.set_status(int(status.split()[0])) - except RuntimeError: # pragma: no cover - # for websocket connections Tornado does not accept a response, since - # it already emitted the 101 status code - return - for header, value in headers: - tornado_handler.set_header(header, value) - tornado_handler.write(payload) - tornado_handler.finish() - - -class WebSocket(object): # pragma: no cover - """ - This wrapper class provides a tornado WebSocket interface that is - somewhat compatible with eventlet's implementation. - """ - def __init__(self, handler): - self.handler = handler - self.tornado_handler = None - - async def __call__(self, environ): - self.tornado_handler = environ['tornado.handler'] - self.environ = environ - await self.handler(self) - - async def close(self): - self.tornado_handler.close() - - async def send(self, message): - try: - self.tornado_handler.write_message( - message, binary=isinstance(message, bytes)) - except tornado.websocket.WebSocketClosedError: - raise exceptions.EngineIOError() - - async def wait(self): - msg = await self.tornado_handler.get_next_message() - if not isinstance(msg, bytes) and \ - not isinstance(msg, str): - raise IOError() - return msg - - -_async = { - 'asyncio': True, - 'translate_request': translate_request, - 'make_response': make_response, - 'websocket': WebSocket, -} diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/asyncio_client.py b/venv_flaskchat/lib/python3.11/site-packages/engineio/asyncio_client.py deleted file mode 100644 index cf7ae1a..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/engineio/asyncio_client.py +++ /dev/null @@ -1,640 +0,0 @@ -import asyncio -import signal -import ssl -import threading - -try: - import aiohttp -except ImportError: # pragma: no cover - aiohttp = None - -from . import client -from . import exceptions -from . import packet -from . import payload - -async_signal_handler_set = False - - -def async_signal_handler(): - """SIGINT handler. - - Disconnect all active async clients. - """ - async def _handler(): # pragma: no cover - for c in client.connected_clients[:]: - if c.is_asyncio_based(): - await c.disconnect() - - # cancel all running tasks - tasks = [task for task in asyncio.all_tasks() if task is not - asyncio.current_task()] - for task in tasks: - task.cancel() - await asyncio.gather(*tasks, return_exceptions=True) - asyncio.get_event_loop().stop() - - asyncio.ensure_future(_handler()) - - -class AsyncClient(client.Client): - """An Engine.IO client for asyncio. - - This class implements a fully compliant Engine.IO web client with support - for websocket and long-polling transports, compatible with the asyncio - framework on Python 3.5 or newer. - - :param logger: To enable logging set to ``True`` or pass a logger object to - use. To disable logging set to ``False``. The default is - ``False``. Note that fatal errors are logged even when - ``logger`` is ``False``. - :param json: An alternative json module to use for encoding and decoding - packets. Custom json modules must have ``dumps`` and ``loads`` - functions that are compatible with the standard library - versions. - :param request_timeout: A timeout in seconds for requests. The default is - 5 seconds. - :param http_session: an initialized ``aiohttp.ClientSession`` object to be - used when sending requests to the server. Use it if - you need to add special client options such as proxy - servers, SSL certificates, etc. - :param ssl_verify: ``True`` to verify SSL certificates, or ``False`` to - skip SSL certificate verification, allowing - connections to servers with self signed certificates. - The default is ``True``. - :param handle_sigint: Set to ``True`` to automatically handle disconnection - when the process is interrupted, or to ``False`` to - leave interrupt handling to the calling application. - Interrupt handling can only be enabled when the - client instance is created in the main thread. - :param websocket_extra_options: Dictionary containing additional keyword - arguments passed to - ``aiohttp.ws_connect()``. - """ - - def is_asyncio_based(self): - return True - - async def connect(self, url, headers=None, transports=None, - engineio_path='engine.io'): - """Connect to an Engine.IO server. - - :param url: The URL of the Engine.IO server. It can include custom - query string parameters if required by the server. - :param headers: A dictionary with custom headers to send with the - connection request. - :param transports: The list of allowed transports. Valid transports - are ``'polling'`` and ``'websocket'``. If not - given, the polling transport is connected first, - then an upgrade to websocket is attempted. - :param engineio_path: The endpoint where the Engine.IO server is - installed. The default value is appropriate for - most cases. - - Note: this method is a coroutine. - - Example usage:: - - eio = engineio.Client() - await eio.connect('http://localhost:5000') - """ - global async_signal_handler_set - if self.handle_sigint and not async_signal_handler_set and \ - threading.current_thread() == threading.main_thread(): - try: - asyncio.get_event_loop().add_signal_handler( - signal.SIGINT, async_signal_handler) - except NotImplementedError: # pragma: no cover - self.logger.warning('Signal handler is unsupported') - async_signal_handler_set = True - - if self.state != 'disconnected': - raise ValueError('Client is not in a disconnected state') - valid_transports = ['polling', 'websocket'] - if transports is not None: - if isinstance(transports, str): - transports = [transports] - transports = [transport for transport in transports - if transport in valid_transports] - if not transports: - raise ValueError('No valid transports provided') - self.transports = transports or valid_transports - self.queue = self.create_queue() - return await getattr(self, '_connect_' + self.transports[0])( - url, headers or {}, engineio_path) - - async def wait(self): - """Wait until the connection with the server ends. - - Client applications can use this function to block the main thread - during the life of the connection. - - Note: this method is a coroutine. - """ - if self.read_loop_task: - await self.read_loop_task - - async def send(self, data): - """Send a message to the server. - - :param data: The data to send to the server. Data can be of type - ``str``, ``bytes``, ``list`` or ``dict``. If a ``list`` - or ``dict``, the data will be serialized as JSON. - - Note: this method is a coroutine. - """ - await self._send_packet(packet.Packet(packet.MESSAGE, data=data)) - - async def disconnect(self, abort=False): - """Disconnect from the server. - - :param abort: If set to ``True``, do not wait for background tasks - associated with the connection to end. - - Note: this method is a coroutine. - """ - if self.state == 'connected': - await self._send_packet(packet.Packet(packet.CLOSE)) - await self.queue.put(None) - self.state = 'disconnecting' - await self._trigger_event('disconnect', run_async=False) - if self.current_transport == 'websocket': - await self.ws.close() - if not abort: - await self.read_loop_task - self.state = 'disconnected' - try: - client.connected_clients.remove(self) - except ValueError: # pragma: no cover - pass - await self._reset() - - def start_background_task(self, target, *args, **kwargs): - """Start a background task. - - This is a utility function that applications can use to start a - background task. - - :param target: the target function to execute. - :param args: arguments to pass to the function. - :param kwargs: keyword arguments to pass to the function. - - The return value is a ``asyncio.Task`` object. - """ - return asyncio.ensure_future(target(*args, **kwargs)) - - async def sleep(self, seconds=0): - """Sleep for the requested amount of time. - - Note: this method is a coroutine. - """ - return await asyncio.sleep(seconds) - - def create_queue(self): - """Create a queue object.""" - q = asyncio.Queue() - q.Empty = asyncio.QueueEmpty - return q - - def create_event(self): - """Create an event object.""" - return asyncio.Event() - - async def _reset(self): - super()._reset() - if not self.external_http: # pragma: no cover - if self.http and not self.http.closed: - await self.http.close() - - def __del__(self): # pragma: no cover - # try to close the aiohttp session if it is still open - if self.http and not self.http.closed: - try: - loop = asyncio.get_event_loop() - if loop.is_running(): - loop.ensure_future(self.http.close()) - else: - loop.run_until_complete(self.http.close()) - except: - pass - - async def _connect_polling(self, url, headers, engineio_path): - """Establish a long-polling connection to the Engine.IO server.""" - if aiohttp is None: # pragma: no cover - self.logger.error('aiohttp not installed -- cannot make HTTP ' - 'requests!') - return - self.base_url = self._get_engineio_url(url, engineio_path, 'polling') - self.logger.info('Attempting polling connection to ' + self.base_url) - r = await self._send_request( - 'GET', self.base_url + self._get_url_timestamp(), headers=headers, - timeout=self.request_timeout) - if r is None or isinstance(r, str): - await self._reset() - raise exceptions.ConnectionError( - r or 'Connection refused by the server') - if r.status < 200 or r.status >= 300: - await self._reset() - try: - arg = await r.json() - except aiohttp.ClientError: - arg = None - raise exceptions.ConnectionError( - 'Unexpected status code {} in server response'.format( - r.status), arg) - try: - p = payload.Payload(encoded_payload=(await r.read()).decode( - 'utf-8')) - except ValueError: - raise exceptions.ConnectionError( - 'Unexpected response from server') from None - open_packet = p.packets[0] - if open_packet.packet_type != packet.OPEN: - raise exceptions.ConnectionError( - 'OPEN packet not returned by server') - self.logger.info( - 'Polling connection accepted with ' + str(open_packet.data)) - self.sid = open_packet.data['sid'] - self.upgrades = open_packet.data['upgrades'] - self.ping_interval = int(open_packet.data['pingInterval']) / 1000.0 - self.ping_timeout = int(open_packet.data['pingTimeout']) / 1000.0 - self.current_transport = 'polling' - self.base_url += '&sid=' + self.sid - - self.state = 'connected' - client.connected_clients.append(self) - await self._trigger_event('connect', run_async=False) - - for pkt in p.packets[1:]: - await self._receive_packet(pkt) - - if 'websocket' in self.upgrades and 'websocket' in self.transports: - # attempt to upgrade to websocket - if await self._connect_websocket(url, headers, engineio_path): - # upgrade to websocket succeeded, we're done here - return - - self.write_loop_task = self.start_background_task(self._write_loop) - self.read_loop_task = self.start_background_task( - self._read_loop_polling) - - async def _connect_websocket(self, url, headers, engineio_path): - """Establish or upgrade to a WebSocket connection with the server.""" - if aiohttp is None: # pragma: no cover - self.logger.error('aiohttp package not installed') - return False - websocket_url = self._get_engineio_url(url, engineio_path, - 'websocket') - if self.sid: - self.logger.info( - 'Attempting WebSocket upgrade to ' + websocket_url) - upgrade = True - websocket_url += '&sid=' + self.sid - else: - upgrade = False - self.base_url = websocket_url - self.logger.info( - 'Attempting WebSocket connection to ' + websocket_url) - - if self.http is None or self.http.closed: # pragma: no cover - self.http = aiohttp.ClientSession() - - # extract any new cookies passed in a header so that they can also be - # sent the the WebSocket route - cookies = {} - for header, value in headers.items(): - if header.lower() == 'cookie': - cookies = dict( - [cookie.split('=', 1) for cookie in value.split('; ')]) - del headers[header] - break - self.http.cookie_jar.update_cookies(cookies) - - extra_options = {'timeout': self.request_timeout} - if not self.ssl_verify: - ssl_context = ssl.create_default_context() - ssl_context.check_hostname = False - ssl_context.verify_mode = ssl.CERT_NONE - extra_options['ssl'] = ssl_context - - # combine internally generated options with the ones supplied by the - # caller. The caller's options take precedence. - headers.update(self.websocket_extra_options.pop('headers', {})) - extra_options['headers'] = headers - extra_options.update(self.websocket_extra_options) - - try: - ws = await self.http.ws_connect( - websocket_url + self._get_url_timestamp(), **extra_options) - except (aiohttp.client_exceptions.WSServerHandshakeError, - aiohttp.client_exceptions.ServerConnectionError, - aiohttp.client_exceptions.ClientConnectionError): - if upgrade: - self.logger.warning( - 'WebSocket upgrade failed: connection error') - return False - else: - raise exceptions.ConnectionError('Connection error') - if upgrade: - p = packet.Packet(packet.PING, data='probe').encode() - try: - await ws.send_str(p) - except Exception as e: # pragma: no cover - self.logger.warning( - 'WebSocket upgrade failed: unexpected send exception: %s', - str(e)) - return False - try: - p = (await ws.receive()).data - except Exception as e: # pragma: no cover - self.logger.warning( - 'WebSocket upgrade failed: unexpected recv exception: %s', - str(e)) - return False - pkt = packet.Packet(encoded_packet=p) - if pkt.packet_type != packet.PONG or pkt.data != 'probe': - self.logger.warning( - 'WebSocket upgrade failed: no PONG packet') - return False - p = packet.Packet(packet.UPGRADE).encode() - try: - await ws.send_str(p) - except Exception as e: # pragma: no cover - self.logger.warning( - 'WebSocket upgrade failed: unexpected send exception: %s', - str(e)) - return False - self.current_transport = 'websocket' - self.logger.info('WebSocket upgrade was successful') - else: - try: - p = (await ws.receive()).data - except Exception as e: # pragma: no cover - raise exceptions.ConnectionError( - 'Unexpected recv exception: ' + str(e)) - open_packet = packet.Packet(encoded_packet=p) - if open_packet.packet_type != packet.OPEN: - raise exceptions.ConnectionError('no OPEN packet') - self.logger.info( - 'WebSocket connection accepted with ' + str(open_packet.data)) - self.sid = open_packet.data['sid'] - self.upgrades = open_packet.data['upgrades'] - self.ping_interval = int(open_packet.data['pingInterval']) / 1000.0 - self.ping_timeout = int(open_packet.data['pingTimeout']) / 1000.0 - self.current_transport = 'websocket' - - self.state = 'connected' - client.connected_clients.append(self) - await self._trigger_event('connect', run_async=False) - - self.ws = ws - self.write_loop_task = self.start_background_task(self._write_loop) - self.read_loop_task = self.start_background_task( - self._read_loop_websocket) - return True - - async def _receive_packet(self, pkt): - """Handle incoming packets from the server.""" - packet_name = packet.packet_names[pkt.packet_type] \ - if pkt.packet_type < len(packet.packet_names) else 'UNKNOWN' - self.logger.info( - 'Received packet %s data %s', packet_name, - pkt.data if not isinstance(pkt.data, bytes) else '') - if pkt.packet_type == packet.MESSAGE: - await self._trigger_event('message', pkt.data, run_async=True) - elif pkt.packet_type == packet.PING: - await self._send_packet(packet.Packet(packet.PONG, pkt.data)) - elif pkt.packet_type == packet.CLOSE: - await self.disconnect(abort=True) - elif pkt.packet_type == packet.NOOP: - pass - else: - self.logger.error('Received unexpected packet of type %s', - pkt.packet_type) - - async def _send_packet(self, pkt): - """Queue a packet to be sent to the server.""" - if self.state != 'connected': - return - await self.queue.put(pkt) - self.logger.info( - 'Sending packet %s data %s', - packet.packet_names[pkt.packet_type], - pkt.data if not isinstance(pkt.data, bytes) else '') - - async def _send_request( - self, method, url, headers=None, body=None, - timeout=None): # pragma: no cover - if self.http is None or self.http.closed: - self.http = aiohttp.ClientSession() - http_method = getattr(self.http, method.lower()) - - try: - if not self.ssl_verify: - return await http_method( - url, headers=headers, data=body, - timeout=aiohttp.ClientTimeout(total=timeout), ssl=False) - else: - return await http_method( - url, headers=headers, data=body, - timeout=aiohttp.ClientTimeout(total=timeout)) - - except (aiohttp.ClientError, asyncio.TimeoutError) as exc: - self.logger.info('HTTP %s request to %s failed with error %s.', - method, url, exc) - return str(exc) - - async def _trigger_event(self, event, *args, **kwargs): - """Invoke an event handler.""" - run_async = kwargs.pop('run_async', False) - ret = None - if event in self.handlers: - if asyncio.iscoroutinefunction(self.handlers[event]) is True: - if run_async: - return self.start_background_task(self.handlers[event], - *args) - else: - try: - ret = await self.handlers[event](*args) - except asyncio.CancelledError: # pragma: no cover - pass - except: - self.logger.exception(event + ' async handler error') - if event == 'connect': - # if connect handler raised error we reject the - # connection - return False - else: - if run_async: - async def async_handler(): - return self.handlers[event](*args) - - return self.start_background_task(async_handler) - else: - try: - ret = self.handlers[event](*args) - except: - self.logger.exception(event + ' handler error') - if event == 'connect': - # if connect handler raised error we reject the - # connection - return False - return ret - - async def _read_loop_polling(self): - """Read packets by polling the Engine.IO server.""" - while self.state == 'connected': - self.logger.info( - 'Sending polling GET request to ' + self.base_url) - r = await self._send_request( - 'GET', self.base_url + self._get_url_timestamp(), - timeout=max(self.ping_interval, self.ping_timeout) + 5) - if r is None or isinstance(r, str): - self.logger.warning( - r or 'Connection refused by the server, aborting') - await self.queue.put(None) - break - if r.status < 200 or r.status >= 300: - self.logger.warning('Unexpected status code %s in server ' - 'response, aborting', r.status) - await self.queue.put(None) - break - try: - p = payload.Payload(encoded_payload=(await r.read()).decode( - 'utf-8')) - except ValueError: - self.logger.warning( - 'Unexpected packet from server, aborting') - await self.queue.put(None) - break - for pkt in p.packets: - await self._receive_packet(pkt) - - self.logger.info('Waiting for write loop task to end') - await self.write_loop_task - if self.state == 'connected': - await self._trigger_event('disconnect', run_async=False) - try: - client.connected_clients.remove(self) - except ValueError: # pragma: no cover - pass - await self._reset() - self.logger.info('Exiting read loop task') - - async def _read_loop_websocket(self): - """Read packets from the Engine.IO WebSocket connection.""" - while self.state == 'connected': - p = None - try: - p = await asyncio.wait_for( - self.ws.receive(), - timeout=self.ping_interval + self.ping_timeout) - if not isinstance(p.data, (str, bytes)): # pragma: no cover - self.logger.warning( - 'Server sent unexpected packet %s data %s, aborting', - str(p.type), str(p.data)) - await self.queue.put(None) - break # the connection is broken - p = p.data - except asyncio.TimeoutError: - self.logger.warning( - 'Server has stopped communicating, aborting') - await self.queue.put(None) - break - except aiohttp.client_exceptions.ServerDisconnectedError: - self.logger.info( - 'Read loop: WebSocket connection was closed, aborting') - await self.queue.put(None) - break - except Exception as e: - self.logger.info( - 'Unexpected error receiving packet: "%s", aborting', - str(e)) - await self.queue.put(None) - break - try: - pkt = packet.Packet(encoded_packet=p) - except Exception as e: # pragma: no cover - self.logger.info( - 'Unexpected error decoding packet: "%s", aborting', str(e)) - await self.queue.put(None) - break - await self._receive_packet(pkt) - - self.logger.info('Waiting for write loop task to end') - await self.write_loop_task - if self.state == 'connected': - await self._trigger_event('disconnect', run_async=False) - try: - client.connected_clients.remove(self) - except ValueError: # pragma: no cover - pass - await self._reset() - self.logger.info('Exiting read loop task') - - async def _write_loop(self): - """This background task sends packages to the server as they are - pushed to the send queue. - """ - while self.state == 'connected': - # to simplify the timeout handling, use the maximum of the - # ping interval and ping timeout as timeout, with an extra 5 - # seconds grace period - timeout = max(self.ping_interval, self.ping_timeout) + 5 - packets = None - try: - packets = [await asyncio.wait_for(self.queue.get(), timeout)] - except (self.queue.Empty, asyncio.TimeoutError): - self.logger.error('packet queue is empty, aborting') - break - except asyncio.CancelledError: # pragma: no cover - break - if packets == [None]: - self.queue.task_done() - packets = [] - else: - while True: - try: - packets.append(self.queue.get_nowait()) - except self.queue.Empty: - break - if packets[-1] is None: - packets = packets[:-1] - self.queue.task_done() - break - if not packets: - # empty packet list returned -> connection closed - break - if self.current_transport == 'polling': - p = payload.Payload(packets=packets) - r = await self._send_request( - 'POST', self.base_url, body=p.encode(), - headers={'Content-Type': 'text/plain'}, - timeout=self.request_timeout) - for pkt in packets: - self.queue.task_done() - if r is None or isinstance(r, str): - self.logger.warning( - r or 'Connection refused by the server, aborting') - break - if r.status < 200 or r.status >= 300: - self.logger.warning('Unexpected status code %s in server ' - 'response, aborting', r.status) - await self._reset() - break - else: - # websocket - try: - for pkt in packets: - if pkt.binary: - await self.ws.send_bytes(pkt.encode()) - else: - await self.ws.send_str(pkt.encode()) - self.queue.task_done() - except (aiohttp.client_exceptions.ServerDisconnectedError, - BrokenPipeError, OSError): - self.logger.info( - 'Write loop: WebSocket connection was closed, ' - 'aborting') - break - self.logger.info('Exiting write loop task') diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/asyncio_server.py b/venv_flaskchat/lib/python3.11/site-packages/engineio/asyncio_server.py deleted file mode 100644 index 66cf5f9..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/engineio/asyncio_server.py +++ /dev/null @@ -1,513 +0,0 @@ -import asyncio -import urllib - -from . import exceptions -from . import packet -from . import server -from . import asyncio_socket - - -class AsyncServer(server.Server): - """An Engine.IO server for asyncio. - - This class implements a fully compliant Engine.IO web server with support - for websocket and long-polling transports, compatible with the asyncio - framework on Python 3.5 or newer. - - :param async_mode: The asynchronous model to use. See the Deployment - section in the documentation for a description of the - available options. Valid async modes are "aiohttp", - "sanic", "tornado" and "asgi". If this argument is not - given, "aiohttp" is tried first, followed by "sanic", - "tornado", and finally "asgi". The first async mode that - has all its dependencies installed is the one that is - chosen. - :param ping_interval: The interval in seconds at which the server pings - the client. The default is 25 seconds. For advanced - control, a two element tuple can be given, where - the first number is the ping interval and the second - is a grace period added by the server. - :param ping_timeout: The time in seconds that the client waits for the - server to respond before disconnecting. The default - is 20 seconds. - :param max_http_buffer_size: The maximum size of a message. The default - is 1,000,000 bytes. - :param allow_upgrades: Whether to allow transport upgrades or not. - :param http_compression: Whether to compress packages when using the - polling transport. - :param compression_threshold: Only compress messages when their byte size - is greater than this value. - :param cookie: If set to a string, it is the name of the HTTP cookie the - server sends back tot he client containing the client - session id. If set to a dictionary, the ``'name'`` key - contains the cookie name and other keys define cookie - attributes, where the value of each attribute can be a - string, a callable with no arguments, or a boolean. If set - to ``None`` (the default), a cookie is not sent to the - client. - :param cors_allowed_origins: Origin or list of origins that are allowed to - connect to this server. Only the same origin - is allowed by default. Set this argument to - ``'*'`` to allow all origins, or to ``[]`` to - disable CORS handling. - :param cors_credentials: Whether credentials (cookies, authentication) are - allowed in requests to this server. - :param logger: To enable logging set to ``True`` or pass a logger object to - use. To disable logging set to ``False``. Note that fatal - errors are logged even when ``logger`` is ``False``. - :param json: An alternative json module to use for encoding and decoding - packets. Custom json modules must have ``dumps`` and ``loads`` - functions that are compatible with the standard library - versions. - :param async_handlers: If set to ``True``, run message event handlers in - non-blocking threads. To run handlers synchronously, - set to ``False``. The default is ``True``. - :param transports: The list of allowed transports. Valid transports - are ``'polling'`` and ``'websocket'``. Defaults to - ``['polling', 'websocket']``. - :param kwargs: Reserved for future extensions, any additional parameters - given as keyword arguments will be silently ignored. - """ - def is_asyncio_based(self): - return True - - def async_modes(self): - return ['aiohttp', 'sanic', 'tornado', 'asgi'] - - def attach(self, app, engineio_path='engine.io'): - """Attach the Engine.IO server to an application.""" - engineio_path = engineio_path.strip('/') - self._async['create_route'](app, self, '/{}/'.format(engineio_path)) - - async def send(self, sid, data): - """Send a message to a client. - - :param sid: The session id of the recipient client. - :param data: The data to send to the client. Data can be of type - ``str``, ``bytes``, ``list`` or ``dict``. If a ``list`` - or ``dict``, the data will be serialized as JSON. - - Note: this method is a coroutine. - """ - try: - socket = self._get_socket(sid) - except KeyError: - # the socket is not available - self.logger.warning('Cannot send to sid %s', sid) - return - await socket.send(packet.Packet(packet.MESSAGE, data=data)) - - async def get_session(self, sid): - """Return the user session for a client. - - :param sid: The session id of the client. - - The return value is a dictionary. Modifications made to this - dictionary are not guaranteed to be preserved. If you want to modify - the user session, use the ``session`` context manager instead. - """ - socket = self._get_socket(sid) - return socket.session - - async def save_session(self, sid, session): - """Store the user session for a client. - - :param sid: The session id of the client. - :param session: The session dictionary. - """ - socket = self._get_socket(sid) - socket.session = session - - def session(self, sid): - """Return the user session for a client with context manager syntax. - - :param sid: The session id of the client. - - This is a context manager that returns the user session dictionary for - the client. Any changes that are made to this dictionary inside the - context manager block are saved back to the session. Example usage:: - - @eio.on('connect') - def on_connect(sid, environ): - username = authenticate_user(environ) - if not username: - return False - with eio.session(sid) as session: - session['username'] = username - - @eio.on('message') - def on_message(sid, msg): - async with eio.session(sid) as session: - print('received message from ', session['username']) - """ - class _session_context_manager(object): - def __init__(self, server, sid): - self.server = server - self.sid = sid - self.session = None - - async def __aenter__(self): - self.session = await self.server.get_session(sid) - return self.session - - async def __aexit__(self, *args): - await self.server.save_session(sid, self.session) - - return _session_context_manager(self, sid) - - async def disconnect(self, sid=None): - """Disconnect a client. - - :param sid: The session id of the client to close. If this parameter - is not given, then all clients are closed. - - Note: this method is a coroutine. - """ - if sid is not None: - try: - socket = self._get_socket(sid) - except KeyError: # pragma: no cover - # the socket was already closed or gone - pass - else: - await socket.close() - if sid in self.sockets: # pragma: no cover - del self.sockets[sid] - else: - await asyncio.wait([asyncio.create_task(client.close()) - for client in self.sockets.values()]) - self.sockets = {} - - async def handle_request(self, *args, **kwargs): - """Handle an HTTP request from the client. - - This is the entry point of the Engine.IO application. This function - returns the HTTP response to deliver to the client. - - Note: this method is a coroutine. - """ - translate_request = self._async['translate_request'] - if asyncio.iscoroutinefunction(translate_request): - environ = await translate_request(*args, **kwargs) - else: - environ = translate_request(*args, **kwargs) - - if self.cors_allowed_origins != []: - # Validate the origin header if present - # This is important for WebSocket more than for HTTP, since - # browsers only apply CORS controls to HTTP. - origin = environ.get('HTTP_ORIGIN') - if origin: - allowed_origins = self._cors_allowed_origins(environ) - if allowed_origins is not None and origin not in \ - allowed_origins: - self._log_error_once( - origin + ' is not an accepted origin.', 'bad-origin') - return await self._make_response( - self._bad_request( - origin + ' is not an accepted origin.'), - environ) - - method = environ['REQUEST_METHOD'] - query = urllib.parse.parse_qs(environ.get('QUERY_STRING', '')) - - sid = query['sid'][0] if 'sid' in query else None - jsonp = False - jsonp_index = None - - # make sure the client uses an allowed transport - transport = query.get('transport', ['polling'])[0] - if transport not in self.transports: - self._log_error_once('Invalid transport', 'bad-transport') - return await self._make_response( - self._bad_request('Invalid transport'), environ) - - # make sure the client speaks a compatible Engine.IO version - sid = query['sid'][0] if 'sid' in query else None - if sid is None and query.get('EIO') != ['4']: - self._log_error_once( - 'The client is using an unsupported version of the Socket.IO ' - 'or Engine.IO protocols', 'bad-version' - ) - return await self._make_response(self._bad_request( - 'The client is using an unsupported version of the Socket.IO ' - 'or Engine.IO protocols' - ), environ) - - if 'j' in query: - jsonp = True - try: - jsonp_index = int(query['j'][0]) - except (ValueError, KeyError, IndexError): - # Invalid JSONP index number - pass - - if jsonp and jsonp_index is None: - self._log_error_once('Invalid JSONP index number', - 'bad-jsonp-index') - r = self._bad_request('Invalid JSONP index number') - elif method == 'GET': - if sid is None: - # transport must be one of 'polling' or 'websocket'. - # if 'websocket', the HTTP_UPGRADE header must match. - upgrade_header = environ.get('HTTP_UPGRADE').lower() \ - if 'HTTP_UPGRADE' in environ else None - if transport == 'polling' \ - or transport == upgrade_header == 'websocket': - r = await self._handle_connect(environ, transport, - jsonp_index) - else: - self._log_error_once('Invalid websocket upgrade', - 'bad-upgrade') - r = self._bad_request('Invalid websocket upgrade') - else: - if sid not in self.sockets: - self._log_error_once('Invalid session ' + sid, 'bad-sid') - r = self._bad_request('Invalid session ' + sid) - else: - socket = self._get_socket(sid) - try: - packets = await socket.handle_get_request(environ) - if isinstance(packets, list): - r = self._ok(packets, jsonp_index=jsonp_index) - else: - r = packets - except exceptions.EngineIOError: - if sid in self.sockets: # pragma: no cover - await self.disconnect(sid) - r = self._bad_request() - if sid in self.sockets and self.sockets[sid].closed: - del self.sockets[sid] - elif method == 'POST': - if sid is None or sid not in self.sockets: - self._log_error_once('Invalid session ' + sid, 'bad-sid') - r = self._bad_request('Invalid session ' + sid) - else: - socket = self._get_socket(sid) - try: - await socket.handle_post_request(environ) - r = self._ok(jsonp_index=jsonp_index) - except exceptions.EngineIOError: - if sid in self.sockets: # pragma: no cover - await self.disconnect(sid) - r = self._bad_request() - except: # pragma: no cover - # for any other unexpected errors, we log the error - # and keep going - self.logger.exception('post request handler error') - r = self._ok(jsonp_index=jsonp_index) - elif method == 'OPTIONS': - r = self._ok() - else: - self.logger.warning('Method %s not supported', method) - r = self._method_not_found() - if not isinstance(r, dict): - return r - if self.http_compression and \ - len(r['response']) >= self.compression_threshold: - encodings = [e.split(';')[0].strip() for e in - environ.get('HTTP_ACCEPT_ENCODING', '').split(',')] - for encoding in encodings: - if encoding in self.compression_methods: - r['response'] = \ - getattr(self, '_' + encoding)(r['response']) - r['headers'] += [('Content-Encoding', encoding)] - break - return await self._make_response(r, environ) - - def start_background_task(self, target, *args, **kwargs): - """Start a background task using the appropriate async model. - - This is a utility function that applications can use to start a - background task using the method that is compatible with the - selected async mode. - - :param target: the target function to execute. - :param args: arguments to pass to the function. - :param kwargs: keyword arguments to pass to the function. - - The return value is a ``asyncio.Task`` object. - """ - return asyncio.ensure_future(target(*args, **kwargs)) - - async def sleep(self, seconds=0): - """Sleep for the requested amount of time using the appropriate async - model. - - This is a utility function that applications can use to put a task to - sleep without having to worry about using the correct call for the - selected async mode. - - Note: this method is a coroutine. - """ - return await asyncio.sleep(seconds) - - def create_queue(self, *args, **kwargs): - """Create a queue object using the appropriate async model. - - This is a utility function that applications can use to create a queue - without having to worry about using the correct call for the selected - async mode. For asyncio based async modes, this returns an instance of - ``asyncio.Queue``. - """ - return asyncio.Queue(*args, **kwargs) - - def get_queue_empty_exception(self): - """Return the queue empty exception for the appropriate async model. - - This is a utility function that applications can use to work with a - queue without having to worry about using the correct call for the - selected async mode. For asyncio based async modes, this returns an - instance of ``asyncio.QueueEmpty``. - """ - return asyncio.QueueEmpty - - def create_event(self, *args, **kwargs): - """Create an event object using the appropriate async model. - - This is a utility function that applications can use to create an - event without having to worry about using the correct call for the - selected async mode. For asyncio based async modes, this returns - an instance of ``asyncio.Event``. - """ - return asyncio.Event(*args, **kwargs) - - async def _make_response(self, response_dict, environ): - cors_headers = self._cors_headers(environ) - make_response = self._async['make_response'] - if asyncio.iscoroutinefunction(make_response): - response = await make_response( - response_dict['status'], - response_dict['headers'] + cors_headers, - response_dict['response'], environ) - else: - response = make_response( - response_dict['status'], - response_dict['headers'] + cors_headers, - response_dict['response'], environ) - return response - - async def _handle_connect(self, environ, transport, jsonp_index=None): - """Handle a client connection request.""" - if self.start_service_task: - # start the service task to monitor connected clients - self.start_service_task = False - self.start_background_task(self._service_task) - - sid = self.generate_id() - s = asyncio_socket.AsyncSocket(self, sid) - self.sockets[sid] = s - - pkt = packet.Packet( - packet.OPEN, {'sid': sid, - 'upgrades': self._upgrades(sid, transport), - 'pingTimeout': int(self.ping_timeout * 1000), - 'pingInterval': int(self.ping_interval * 1000)}) - await s.send(pkt) - s.schedule_ping() - - ret = await self._trigger_event('connect', sid, environ, - run_async=False) - if ret is not None and ret is not True: - del self.sockets[sid] - self.logger.warning('Application rejected connection') - return self._unauthorized(ret or None) - - if transport == 'websocket': - ret = await s.handle_get_request(environ) - if s.closed and sid in self.sockets: - # websocket connection ended, so we are done - del self.sockets[sid] - return ret - else: - s.connected = True - headers = None - if self.cookie: - if isinstance(self.cookie, dict): - headers = [( - 'Set-Cookie', - self._generate_sid_cookie(sid, self.cookie) - )] - else: - headers = [( - 'Set-Cookie', - self._generate_sid_cookie(sid, { - 'name': self.cookie, 'path': '/', 'SameSite': 'Lax' - }) - )] - try: - return self._ok(await s.poll(), headers=headers, - jsonp_index=jsonp_index) - except exceptions.QueueEmpty: - return self._bad_request() - - async def _trigger_event(self, event, *args, **kwargs): - """Invoke an event handler.""" - run_async = kwargs.pop('run_async', False) - ret = None - if event in self.handlers: - if asyncio.iscoroutinefunction(self.handlers[event]) is True: - if run_async: - return self.start_background_task(self.handlers[event], - *args) - else: - try: - ret = await self.handlers[event](*args) - except asyncio.CancelledError: # pragma: no cover - pass - except: - self.logger.exception(event + ' async handler error') - if event == 'connect': - # if connect handler raised error we reject the - # connection - return False - else: - if run_async: - async def async_handler(): - return self.handlers[event](*args) - - return self.start_background_task(async_handler) - else: - try: - ret = self.handlers[event](*args) - except: - self.logger.exception(event + ' handler error') - if event == 'connect': - # if connect handler raised error we reject the - # connection - return False - return ret - - async def _service_task(self): # pragma: no cover - """Monitor connected clients and clean up those that time out.""" - while True: - if len(self.sockets) == 0: - # nothing to do - await self.sleep(self.ping_timeout) - continue - - # go through the entire client list in a ping interval cycle - sleep_interval = self.ping_timeout / len(self.sockets) - - try: - # iterate over the current clients - for socket in self.sockets.copy().values(): - if not socket.closing and not socket.closed: - await socket.check_ping_timeout() - await self.sleep(sleep_interval) - except ( - SystemExit, - KeyboardInterrupt, - asyncio.CancelledError, - GeneratorExit, - ): - self.logger.info('service task canceled') - break - except: - if asyncio.get_event_loop().is_closed(): - self.logger.info('event loop is closed, exiting service ' - 'task') - break - - # an unexpected exception has occurred, log it and continue - self.logger.exception('service task exception') diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/asyncio_socket.py b/venv_flaskchat/lib/python3.11/site-packages/engineio/asyncio_socket.py deleted file mode 100644 index 17265c2..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/engineio/asyncio_socket.py +++ /dev/null @@ -1,251 +0,0 @@ -import asyncio -import sys -import time - -from . import exceptions -from . import packet -from . import payload -from . import socket - - -class AsyncSocket(socket.Socket): - async def poll(self): - """Wait for packets to send to the client.""" - try: - packets = [await asyncio.wait_for( - self.queue.get(), - self.server.ping_interval + self.server.ping_timeout)] - self.queue.task_done() - except (asyncio.TimeoutError, asyncio.CancelledError): - raise exceptions.QueueEmpty() - if packets == [None]: - return [] - while True: - try: - pkt = self.queue.get_nowait() - self.queue.task_done() - if pkt is None: - self.queue.put_nowait(None) - break - packets.append(pkt) - except asyncio.QueueEmpty: - break - return packets - - async def receive(self, pkt): - """Receive packet from the client.""" - self.server.logger.info('%s: Received packet %s data %s', - self.sid, packet.packet_names[pkt.packet_type], - pkt.data if not isinstance(pkt.data, bytes) - else '') - if pkt.packet_type == packet.PONG: - self.schedule_ping() - elif pkt.packet_type == packet.MESSAGE: - await self.server._trigger_event( - 'message', self.sid, pkt.data, - run_async=self.server.async_handlers) - elif pkt.packet_type == packet.UPGRADE: - await self.send(packet.Packet(packet.NOOP)) - elif pkt.packet_type == packet.CLOSE: - await self.close(wait=False, abort=True) - else: - raise exceptions.UnknownPacketError() - - async def check_ping_timeout(self): - """Make sure the client is still sending pings.""" - if self.closed: - raise exceptions.SocketIsClosedError() - if self.last_ping and \ - time.time() - self.last_ping > self.server.ping_timeout: - self.server.logger.info('%s: Client is gone, closing socket', - self.sid) - # Passing abort=False here will cause close() to write a - # CLOSE packet. This has the effect of updating half-open sockets - # to their correct state of disconnected - await self.close(wait=False, abort=False) - return False - return True - - async def send(self, pkt): - """Send a packet to the client.""" - if not await self.check_ping_timeout(): - return - else: - await self.queue.put(pkt) - self.server.logger.info('%s: Sending packet %s data %s', - self.sid, packet.packet_names[pkt.packet_type], - pkt.data if not isinstance(pkt.data, bytes) - else '') - - async def handle_get_request(self, environ): - """Handle a long-polling GET request from the client.""" - connections = [ - s.strip() - for s in environ.get('HTTP_CONNECTION', '').lower().split(',')] - transport = environ.get('HTTP_UPGRADE', '').lower() - if 'upgrade' in connections and transport in self.upgrade_protocols: - self.server.logger.info('%s: Received request to upgrade to %s', - self.sid, transport) - return await getattr(self, '_upgrade_' + transport)(environ) - if self.upgrading or self.upgraded: - # we are upgrading to WebSocket, do not return any more packets - # through the polling endpoint - return [packet.Packet(packet.NOOP)] - try: - packets = await self.poll() - except exceptions.QueueEmpty: - exc = sys.exc_info() - await self.close(wait=False) - raise exc[1].with_traceback(exc[2]) - return packets - - async def handle_post_request(self, environ): - """Handle a long-polling POST request from the client.""" - length = int(environ.get('CONTENT_LENGTH', '0')) - if length > self.server.max_http_buffer_size: - raise exceptions.ContentTooLongError() - else: - body = (await environ['wsgi.input'].read(length)).decode('utf-8') - p = payload.Payload(encoded_payload=body) - for pkt in p.packets: - await self.receive(pkt) - - async def close(self, wait=True, abort=False): - """Close the socket connection.""" - if not self.closed and not self.closing: - self.closing = True - await self.server._trigger_event('disconnect', self.sid) - if not abort: - await self.send(packet.Packet(packet.CLOSE)) - self.closed = True - if wait: - await self.queue.join() - - def schedule_ping(self): - async def send_ping(): - self.last_ping = None - await asyncio.sleep(self.server.ping_interval) - if not self.closing and not self.closed: - self.last_ping = time.time() - await self.send(packet.Packet(packet.PING)) - - self.server.start_background_task(send_ping) - - async def _upgrade_websocket(self, environ): - """Upgrade the connection from polling to websocket.""" - if self.upgraded: - raise IOError('Socket has been upgraded already') - if self.server._async['websocket'] is None: - # the selected async mode does not support websocket - return self.server._bad_request() - ws = self.server._async['websocket'](self._websocket_handler) - return await ws(environ) - - async def _websocket_handler(self, ws): - """Engine.IO handler for websocket transport.""" - async def websocket_wait(): - data = await ws.wait() - if data and len(data) > self.server.max_http_buffer_size: - raise ValueError('packet is too large') - return data - - if self.connected: - # the socket was already connected, so this is an upgrade - self.upgrading = True # hold packet sends during the upgrade - - try: - pkt = await websocket_wait() - except IOError: # pragma: no cover - return - decoded_pkt = packet.Packet(encoded_packet=pkt) - if decoded_pkt.packet_type != packet.PING or \ - decoded_pkt.data != 'probe': - self.server.logger.info( - '%s: Failed websocket upgrade, no PING packet', self.sid) - self.upgrading = False - return - await ws.send(packet.Packet(packet.PONG, data='probe').encode()) - await self.queue.put(packet.Packet(packet.NOOP)) # end poll - - try: - pkt = await websocket_wait() - except IOError: # pragma: no cover - self.upgrading = False - return - decoded_pkt = packet.Packet(encoded_packet=pkt) - if decoded_pkt.packet_type != packet.UPGRADE: - self.upgraded = False - self.server.logger.info( - ('%s: Failed websocket upgrade, expected UPGRADE packet, ' - 'received %s instead.'), - self.sid, pkt) - self.upgrading = False - return - self.upgraded = True - self.upgrading = False - else: - self.connected = True - self.upgraded = True - - # start separate writer thread - async def writer(): - while True: - packets = None - try: - packets = await self.poll() - except exceptions.QueueEmpty: - break - if not packets: - # empty packet list returned -> connection closed - break - try: - for pkt in packets: - await ws.send(pkt.encode()) - except: - break - writer_task = asyncio.ensure_future(writer()) - - self.server.logger.info( - '%s: Upgrade to websocket successful', self.sid) - - while True: - p = None - wait_task = asyncio.ensure_future(websocket_wait()) - try: - p = await asyncio.wait_for( - wait_task, - self.server.ping_interval + self.server.ping_timeout) - except asyncio.CancelledError: # pragma: no cover - # there is a bug (https://bugs.python.org/issue30508) in - # asyncio that causes a "Task exception never retrieved" error - # to appear when wait_task raises an exception before it gets - # cancelled. Calling wait_task.exception() prevents the error - # from being issued in Python 3.6, but causes other errors in - # other versions, so we run it with all errors suppressed and - # hope for the best. - try: - wait_task.exception() - except: - pass - break - except: - break - if p is None: - # connection closed by client - break - pkt = packet.Packet(encoded_packet=p) - try: - await self.receive(pkt) - except exceptions.UnknownPacketError: # pragma: no cover - pass - except exceptions.SocketIsClosedError: # pragma: no cover - self.server.logger.info('Receive error -- socket is closed') - break - except: # pragma: no cover - # if we get an unexpected exception we log the error and exit - # the connection properly - self.server.logger.exception('Unknown receive error') - - await self.queue.put(None) # unlock the writer task so it can exit - await asyncio.wait_for(writer_task, timeout=None) - await self.close(wait=False, abort=True) diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/client.py b/venv_flaskchat/lib/python3.11/site-packages/engineio/client.py deleted file mode 100644 index 0584979..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/engineio/client.py +++ /dev/null @@ -1,727 +0,0 @@ -from base64 import b64encode -from engineio.json import JSONDecodeError -import logging -import queue -import signal -import ssl -import threading -import time -import urllib - -try: - import requests -except ImportError: # pragma: no cover - requests = None -try: - import websocket -except ImportError: # pragma: no cover - websocket = None -from . import exceptions -from . import packet -from . import payload - -default_logger = logging.getLogger('engineio.client') -connected_clients = [] - - -def signal_handler(sig, frame): - """SIGINT handler. - - Disconnect all active clients and then invoke the original signal handler. - """ - for client in connected_clients[:]: - if not client.is_asyncio_based(): - client.disconnect() - if callable(original_signal_handler): - return original_signal_handler(sig, frame) - else: # pragma: no cover - # Handle case where no original SIGINT handler was present. - return signal.default_int_handler(sig, frame) - - -original_signal_handler = None - - -class Client(object): - """An Engine.IO client. - - This class implements a fully compliant Engine.IO web client with support - for websocket and long-polling transports. - - :param logger: To enable logging set to ``True`` or pass a logger object to - use. To disable logging set to ``False``. The default is - ``False``. Note that fatal errors are logged even when - ``logger`` is ``False``. - :param json: An alternative json module to use for encoding and decoding - packets. Custom json modules must have ``dumps`` and ``loads`` - functions that are compatible with the standard library - versions. - :param request_timeout: A timeout in seconds for requests. The default is - 5 seconds. - :param http_session: an initialized ``requests.Session`` object to be used - when sending requests to the server. Use it if you - need to add special client options such as proxy - servers, SSL certificates, custom CA bundle, etc. - :param ssl_verify: ``True`` to verify SSL certificates, or ``False`` to - skip SSL certificate verification, allowing - connections to servers with self signed certificates. - The default is ``True``. - :param handle_sigint: Set to ``True`` to automatically handle disconnection - when the process is interrupted, or to ``False`` to - leave interrupt handling to the calling application. - Interrupt handling can only be enabled when the - client instance is created in the main thread. - :param websocket_extra_options: Dictionary containing additional keyword - arguments passed to - ``websocket.create_connection()``. - """ - event_names = ['connect', 'disconnect', 'message'] - - def __init__(self, logger=False, json=None, request_timeout=5, - http_session=None, ssl_verify=True, handle_sigint=True, - websocket_extra_options=None): - global original_signal_handler - if handle_sigint and original_signal_handler is None and \ - threading.current_thread() == threading.main_thread(): - original_signal_handler = signal.signal(signal.SIGINT, - signal_handler) - self.handlers = {} - self.base_url = None - self.transports = None - self.current_transport = None - self.sid = None - self.upgrades = None - self.ping_interval = None - self.ping_timeout = None - self.http = http_session - self.external_http = http_session is not None - self.handle_sigint = handle_sigint - self.ws = None - self.read_loop_task = None - self.write_loop_task = None - self.queue = None - self.state = 'disconnected' - self.ssl_verify = ssl_verify - self.websocket_extra_options = websocket_extra_options or {} - - if json is not None: - packet.Packet.json = json - if not isinstance(logger, bool): - self.logger = logger - else: - self.logger = default_logger - if self.logger.level == logging.NOTSET: - if logger: - self.logger.setLevel(logging.INFO) - else: - self.logger.setLevel(logging.ERROR) - self.logger.addHandler(logging.StreamHandler()) - - self.request_timeout = request_timeout - - def is_asyncio_based(self): - return False - - def on(self, event, handler=None): - """Register an event handler. - - :param event: The event name. Can be ``'connect'``, ``'message'`` or - ``'disconnect'``. - :param handler: The function that should be invoked to handle the - event. When this parameter is not given, the method - acts as a decorator for the handler function. - - Example usage:: - - # as a decorator: - @eio.on('connect') - def connect_handler(): - print('Connection request') - - # as a method: - def message_handler(msg): - print('Received message: ', msg) - eio.send('response') - eio.on('message', message_handler) - """ - if event not in self.event_names: - raise ValueError('Invalid event') - - def set_handler(handler): - self.handlers[event] = handler - return handler - - if handler is None: - return set_handler - set_handler(handler) - - def connect(self, url, headers=None, transports=None, - engineio_path='engine.io'): - """Connect to an Engine.IO server. - - :param url: The URL of the Engine.IO server. It can include custom - query string parameters if required by the server. - :param headers: A dictionary with custom headers to send with the - connection request. - :param transports: The list of allowed transports. Valid transports - are ``'polling'`` and ``'websocket'``. If not - given, the polling transport is connected first, - then an upgrade to websocket is attempted. - :param engineio_path: The endpoint where the Engine.IO server is - installed. The default value is appropriate for - most cases. - - Example usage:: - - eio = engineio.Client() - eio.connect('http://localhost:5000') - """ - if self.state != 'disconnected': - raise ValueError('Client is not in a disconnected state') - valid_transports = ['polling', 'websocket'] - if transports is not None: - if isinstance(transports, str): - transports = [transports] - transports = [transport for transport in transports - if transport in valid_transports] - if not transports: - raise ValueError('No valid transports provided') - self.transports = transports or valid_transports - self.queue = self.create_queue() - return getattr(self, '_connect_' + self.transports[0])( - url, headers or {}, engineio_path) - - def wait(self): - """Wait until the connection with the server ends. - - Client applications can use this function to block the main thread - during the life of the connection. - """ - if self.read_loop_task: - self.read_loop_task.join() - - def send(self, data): - """Send a message to the server. - - :param data: The data to send to the server. Data can be of type - ``str``, ``bytes``, ``list`` or ``dict``. If a ``list`` - or ``dict``, the data will be serialized as JSON. - """ - self._send_packet(packet.Packet(packet.MESSAGE, data=data)) - - def disconnect(self, abort=False): - """Disconnect from the server. - - :param abort: If set to ``True``, do not wait for background tasks - associated with the connection to end. - """ - if self.state == 'connected': - self._send_packet(packet.Packet(packet.CLOSE)) - self.queue.put(None) - self.state = 'disconnecting' - self._trigger_event('disconnect', run_async=False) - if self.current_transport == 'websocket': - self.ws.close() - if not abort: - self.read_loop_task.join() - self.state = 'disconnected' - try: - connected_clients.remove(self) - except ValueError: # pragma: no cover - pass - self._reset() - - def transport(self): - """Return the name of the transport currently in use. - - The possible values returned by this function are ``'polling'`` and - ``'websocket'``. - """ - return self.current_transport - - def start_background_task(self, target, *args, **kwargs): - """Start a background task. - - This is a utility function that applications can use to start a - background task. - - :param target: the target function to execute. - :param args: arguments to pass to the function. - :param kwargs: keyword arguments to pass to the function. - - This function returns an object that represents the background task, - on which the ``join()`` method can be invoked to wait for the task to - complete. - """ - th = threading.Thread(target=target, args=args, kwargs=kwargs) - th.start() - return th - - def sleep(self, seconds=0): - """Sleep for the requested amount of time.""" - return time.sleep(seconds) - - def create_queue(self, *args, **kwargs): - """Create a queue object.""" - q = queue.Queue(*args, **kwargs) - q.Empty = queue.Empty - return q - - def create_event(self, *args, **kwargs): - """Create an event object.""" - return threading.Event(*args, **kwargs) - - def _reset(self): - self.state = 'disconnected' - self.sid = None - - def _connect_polling(self, url, headers, engineio_path): - """Establish a long-polling connection to the Engine.IO server.""" - if requests is None: # pragma: no cover - # not installed - self.logger.error('requests package is not installed -- cannot ' - 'send HTTP requests!') - return - self.base_url = self._get_engineio_url(url, engineio_path, 'polling') - self.logger.info('Attempting polling connection to ' + self.base_url) - r = self._send_request( - 'GET', self.base_url + self._get_url_timestamp(), headers=headers, - timeout=self.request_timeout) - if r is None or isinstance(r, str): - self._reset() - raise exceptions.ConnectionError( - r or 'Connection refused by the server') - if r.status_code < 200 or r.status_code >= 300: - self._reset() - try: - arg = r.json() - except JSONDecodeError: - arg = None - raise exceptions.ConnectionError( - 'Unexpected status code {} in server response'.format( - r.status_code), arg) - try: - p = payload.Payload(encoded_payload=r.content.decode('utf-8')) - except ValueError: - raise exceptions.ConnectionError( - 'Unexpected response from server') from None - open_packet = p.packets[0] - if open_packet.packet_type != packet.OPEN: - raise exceptions.ConnectionError( - 'OPEN packet not returned by server') - self.logger.info( - 'Polling connection accepted with ' + str(open_packet.data)) - self.sid = open_packet.data['sid'] - self.upgrades = open_packet.data['upgrades'] - self.ping_interval = int(open_packet.data['pingInterval']) / 1000.0 - self.ping_timeout = int(open_packet.data['pingTimeout']) / 1000.0 - self.current_transport = 'polling' - self.base_url += '&sid=' + self.sid - - self.state = 'connected' - connected_clients.append(self) - self._trigger_event('connect', run_async=False) - - for pkt in p.packets[1:]: - self._receive_packet(pkt) - - if 'websocket' in self.upgrades and 'websocket' in self.transports: - # attempt to upgrade to websocket - if self._connect_websocket(url, headers, engineio_path): - # upgrade to websocket succeeded, we're done here - return - - # start background tasks associated with this client - self.write_loop_task = self.start_background_task(self._write_loop) - self.read_loop_task = self.start_background_task( - self._read_loop_polling) - - def _connect_websocket(self, url, headers, engineio_path): - """Establish or upgrade to a WebSocket connection with the server.""" - if websocket is None: # pragma: no cover - # not installed - self.logger.error('websocket-client package not installed, only ' - 'polling transport is available') - return False - websocket_url = self._get_engineio_url(url, engineio_path, 'websocket') - if self.sid: - self.logger.info( - 'Attempting WebSocket upgrade to ' + websocket_url) - upgrade = True - websocket_url += '&sid=' + self.sid - else: - upgrade = False - self.base_url = websocket_url - self.logger.info( - 'Attempting WebSocket connection to ' + websocket_url) - - # get cookies and other settings from the long-polling connection - # so that they are preserved when connecting to the WebSocket route - cookies = None - extra_options = {} - if self.http: - # cookies - cookies = '; '.join(["{}={}".format(cookie.name, cookie.value) - for cookie in self.http.cookies]) - for header, value in headers.items(): - if header.lower() == 'cookie': - if cookies: - cookies += '; ' - cookies += value - del headers[header] - break - - # auth - if 'Authorization' not in headers and self.http.auth is not None: - if not isinstance(self.http.auth, tuple): # pragma: no cover - raise ValueError('Only basic authentication is supported') - basic_auth = '{}:{}'.format( - self.http.auth[0], self.http.auth[1]).encode('utf-8') - basic_auth = b64encode(basic_auth).decode('utf-8') - headers['Authorization'] = 'Basic ' + basic_auth - - # cert - # this can be given as ('certfile', 'keyfile') or just 'certfile' - if isinstance(self.http.cert, tuple): - extra_options['sslopt'] = { - 'certfile': self.http.cert[0], - 'keyfile': self.http.cert[1]} - elif self.http.cert: - extra_options['sslopt'] = {'certfile': self.http.cert} - - # proxies - if self.http.proxies: - proxy_url = None - if websocket_url.startswith('ws://'): - proxy_url = self.http.proxies.get( - 'ws', self.http.proxies.get('http')) - else: # wss:// - proxy_url = self.http.proxies.get( - 'wss', self.http.proxies.get('https')) - if proxy_url: - parsed_url = urllib.parse.urlparse( - proxy_url if '://' in proxy_url - else 'scheme://' + proxy_url) - extra_options['http_proxy_host'] = parsed_url.hostname - extra_options['http_proxy_port'] = parsed_url.port - extra_options['http_proxy_auth'] = ( - (parsed_url.username, parsed_url.password) - if parsed_url.username or parsed_url.password - else None) - - # verify - if isinstance(self.http.verify, str): - if 'sslopt' in extra_options: - extra_options['sslopt']['ca_certs'] = self.http.verify - else: - extra_options['sslopt'] = {'ca_certs': self.http.verify} - elif not self.http.verify: - self.ssl_verify = False - - if not self.ssl_verify: - extra_options['sslopt'] = {"cert_reqs": ssl.CERT_NONE} - - # combine internally generated options with the ones supplied by the - # caller. The caller's options take precedence. - headers.update(self.websocket_extra_options.pop('header', {})) - extra_options['header'] = headers - extra_options['cookie'] = cookies - extra_options['enable_multithread'] = True - extra_options['timeout'] = self.request_timeout - extra_options.update(self.websocket_extra_options) - try: - ws = websocket.create_connection( - websocket_url + self._get_url_timestamp(), **extra_options) - except (ConnectionError, IOError, websocket.WebSocketException): - if upgrade: - self.logger.warning( - 'WebSocket upgrade failed: connection error') - return False - else: - raise exceptions.ConnectionError('Connection error') - if upgrade: - p = packet.Packet(packet.PING, data='probe').encode() - try: - ws.send(p) - except Exception as e: # pragma: no cover - self.logger.warning( - 'WebSocket upgrade failed: unexpected send exception: %s', - str(e)) - return False - try: - p = ws.recv() - except Exception as e: # pragma: no cover - self.logger.warning( - 'WebSocket upgrade failed: unexpected recv exception: %s', - str(e)) - return False - pkt = packet.Packet(encoded_packet=p) - if pkt.packet_type != packet.PONG or pkt.data != 'probe': - self.logger.warning( - 'WebSocket upgrade failed: no PONG packet') - return False - p = packet.Packet(packet.UPGRADE).encode() - try: - ws.send(p) - except Exception as e: # pragma: no cover - self.logger.warning( - 'WebSocket upgrade failed: unexpected send exception: %s', - str(e)) - return False - self.current_transport = 'websocket' - self.logger.info('WebSocket upgrade was successful') - else: - try: - p = ws.recv() - except Exception as e: # pragma: no cover - raise exceptions.ConnectionError( - 'Unexpected recv exception: ' + str(e)) - open_packet = packet.Packet(encoded_packet=p) - if open_packet.packet_type != packet.OPEN: - raise exceptions.ConnectionError('no OPEN packet') - self.logger.info( - 'WebSocket connection accepted with ' + str(open_packet.data)) - self.sid = open_packet.data['sid'] - self.upgrades = open_packet.data['upgrades'] - self.ping_interval = int(open_packet.data['pingInterval']) / 1000.0 - self.ping_timeout = int(open_packet.data['pingTimeout']) / 1000.0 - self.current_transport = 'websocket' - - self.state = 'connected' - connected_clients.append(self) - self._trigger_event('connect', run_async=False) - self.ws = ws - self.ws.settimeout(self.ping_interval + self.ping_timeout) - - # start background tasks associated with this client - self.write_loop_task = self.start_background_task(self._write_loop) - self.read_loop_task = self.start_background_task( - self._read_loop_websocket) - return True - - def _receive_packet(self, pkt): - """Handle incoming packets from the server.""" - packet_name = packet.packet_names[pkt.packet_type] \ - if pkt.packet_type < len(packet.packet_names) else 'UNKNOWN' - self.logger.info( - 'Received packet %s data %s', packet_name, - pkt.data if not isinstance(pkt.data, bytes) else '') - if pkt.packet_type == packet.MESSAGE: - self._trigger_event('message', pkt.data, run_async=True) - elif pkt.packet_type == packet.PING: - self._send_packet(packet.Packet(packet.PONG, pkt.data)) - elif pkt.packet_type == packet.CLOSE: - self.disconnect(abort=True) - elif pkt.packet_type == packet.NOOP: - pass - else: - self.logger.error('Received unexpected packet of type %s', - pkt.packet_type) - - def _send_packet(self, pkt): - """Queue a packet to be sent to the server.""" - if self.state != 'connected': - return - self.queue.put(pkt) - self.logger.info( - 'Sending packet %s data %s', - packet.packet_names[pkt.packet_type], - pkt.data if not isinstance(pkt.data, bytes) else '') - - def _send_request( - self, method, url, headers=None, body=None, - timeout=None): # pragma: no cover - if self.http is None: - self.http = requests.Session() - if not self.ssl_verify: - self.http.verify = False - try: - return self.http.request(method, url, headers=headers, data=body, - timeout=timeout) - except requests.exceptions.RequestException as exc: - self.logger.info('HTTP %s request to %s failed with error %s.', - method, url, exc) - return str(exc) - - def _trigger_event(self, event, *args, **kwargs): - """Invoke an event handler.""" - run_async = kwargs.pop('run_async', False) - if event in self.handlers: - if run_async: - return self.start_background_task(self.handlers[event], *args) - else: - try: - return self.handlers[event](*args) - except: - self.logger.exception(event + ' handler error') - - def _get_engineio_url(self, url, engineio_path, transport): - """Generate the Engine.IO connection URL.""" - engineio_path = engineio_path.strip('/') - parsed_url = urllib.parse.urlparse(url) - - if transport == 'polling': - scheme = 'http' - elif transport == 'websocket': - scheme = 'ws' - else: # pragma: no cover - raise ValueError('invalid transport') - if parsed_url.scheme in ['https', 'wss']: - scheme += 's' - - return ('{scheme}://{netloc}/{path}/?{query}' - '{sep}transport={transport}&EIO=4').format( - scheme=scheme, netloc=parsed_url.netloc, - path=engineio_path, query=parsed_url.query, - sep='&' if parsed_url.query else '', - transport=transport) - - def _get_url_timestamp(self): - """Generate the Engine.IO query string timestamp.""" - return '&t=' + str(time.time()) - - def _read_loop_polling(self): - """Read packets by polling the Engine.IO server.""" - while self.state == 'connected': - self.logger.info( - 'Sending polling GET request to ' + self.base_url) - r = self._send_request( - 'GET', self.base_url + self._get_url_timestamp(), - timeout=max(self.ping_interval, self.ping_timeout) + 5) - if r is None or isinstance(r, str): - self.logger.warning( - r or 'Connection refused by the server, aborting') - self.queue.put(None) - break - if r.status_code < 200 or r.status_code >= 300: - self.logger.warning('Unexpected status code %s in server ' - 'response, aborting', r.status_code) - self.queue.put(None) - break - try: - p = payload.Payload(encoded_payload=r.content.decode('utf-8')) - except ValueError: - self.logger.warning( - 'Unexpected packet from server, aborting') - self.queue.put(None) - break - for pkt in p.packets: - self._receive_packet(pkt) - - self.logger.info('Waiting for write loop task to end') - self.write_loop_task.join() - if self.state == 'connected': - self._trigger_event('disconnect', run_async=False) - try: - connected_clients.remove(self) - except ValueError: # pragma: no cover - pass - self._reset() - self.logger.info('Exiting read loop task') - - def _read_loop_websocket(self): - """Read packets from the Engine.IO WebSocket connection.""" - while self.state == 'connected': - p = None - try: - p = self.ws.recv() - except websocket.WebSocketTimeoutException: - self.logger.warning( - 'Server has stopped communicating, aborting') - self.queue.put(None) - break - except websocket.WebSocketConnectionClosedException: - self.logger.warning( - 'WebSocket connection was closed, aborting') - self.queue.put(None) - break - except Exception as e: - self.logger.info( - 'Unexpected error receiving packet: "%s", aborting', - str(e)) - self.queue.put(None) - break - try: - pkt = packet.Packet(encoded_packet=p) - except Exception as e: # pragma: no cover - self.logger.info( - 'Unexpected error decoding packet: "%s", aborting', str(e)) - self.queue.put(None) - break - self._receive_packet(pkt) - - self.logger.info('Waiting for write loop task to end') - self.write_loop_task.join() - if self.state == 'connected': - self._trigger_event('disconnect', run_async=False) - try: - connected_clients.remove(self) - except ValueError: # pragma: no cover - pass - self._reset() - self.logger.info('Exiting read loop task') - - def _write_loop(self): - """This background task sends packages to the server as they are - pushed to the send queue. - """ - while self.state == 'connected': - # to simplify the timeout handling, use the maximum of the - # ping interval and ping timeout as timeout, with an extra 5 - # seconds grace period - timeout = max(self.ping_interval, self.ping_timeout) + 5 - packets = None - try: - packets = [self.queue.get(timeout=timeout)] - except self.queue.Empty: - self.logger.error('packet queue is empty, aborting') - break - if packets == [None]: - self.queue.task_done() - packets = [] - else: - while True: - try: - packets.append(self.queue.get(block=False)) - except self.queue.Empty: - break - if packets[-1] is None: - packets = packets[:-1] - self.queue.task_done() - break - if not packets: - # empty packet list returned -> connection closed - break - if self.current_transport == 'polling': - p = payload.Payload(packets=packets) - r = self._send_request( - 'POST', self.base_url, body=p.encode(), - headers={'Content-Type': 'text/plain'}, - timeout=self.request_timeout) - for pkt in packets: - self.queue.task_done() - if r is None or isinstance(r, str): - self.logger.warning( - r or 'Connection refused by the server, aborting') - break - if r.status_code < 200 or r.status_code >= 300: - self.logger.warning('Unexpected status code %s in server ' - 'response, aborting', r.status_code) - self._reset() - break - else: - # websocket - try: - for pkt in packets: - encoded_packet = pkt.encode() - if pkt.binary: - self.ws.send_binary(encoded_packet) - else: - self.ws.send(encoded_packet) - self.queue.task_done() - except (websocket.WebSocketConnectionClosedException, - BrokenPipeError, OSError): - self.logger.warning( - 'WebSocket connection was closed, aborting') - break - self.logger.info('Exiting write loop task') diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/exceptions.py b/venv_flaskchat/lib/python3.11/site-packages/engineio/exceptions.py deleted file mode 100644 index fb0b3e0..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/engineio/exceptions.py +++ /dev/null @@ -1,22 +0,0 @@ -class EngineIOError(Exception): - pass - - -class ContentTooLongError(EngineIOError): - pass - - -class UnknownPacketError(EngineIOError): - pass - - -class QueueEmpty(EngineIOError): - pass - - -class SocketIsClosedError(EngineIOError): - pass - - -class ConnectionError(EngineIOError): - pass diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/json.py b/venv_flaskchat/lib/python3.11/site-packages/engineio/json.py deleted file mode 100644 index b612556..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/engineio/json.py +++ /dev/null @@ -1,16 +0,0 @@ -"""JSON-compatible module with sane defaults.""" - -from json import * # noqa: F401, F403 -from json import loads as original_loads - - -def _safe_int(s): - if len(s) > 100: - raise ValueError('Integer is too large') - return int(s) - - -def loads(*args, **kwargs): - if 'parse_int' not in kwargs: # pragma: no cover - kwargs['parse_int'] = _safe_int - return original_loads(*args, **kwargs) diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/middleware.py b/venv_flaskchat/lib/python3.11/site-packages/engineio/middleware.py deleted file mode 100644 index 5d6ffdd..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/engineio/middleware.py +++ /dev/null @@ -1,87 +0,0 @@ -import os -from engineio.static_files import get_static_file - - -class WSGIApp(object): - """WSGI application middleware for Engine.IO. - - This middleware dispatches traffic to an Engine.IO application. It can - also serve a list of static files to the client, or forward unrelated - HTTP traffic to another WSGI application. - - :param engineio_app: The Engine.IO server. Must be an instance of the - ``engineio.Server`` class. - :param wsgi_app: The WSGI app that receives all other traffic. - :param static_files: A dictionary with static file mapping rules. See the - documentation for details on this argument. - :param engineio_path: The endpoint where the Engine.IO application should - be installed. The default value is appropriate for - most cases. - - Example usage:: - - import engineio - import eventlet - - eio = engineio.Server() - app = engineio.WSGIApp(eio, static_files={ - '/': {'content_type': 'text/html', 'filename': 'index.html'}, - '/index.html': {'content_type': 'text/html', - 'filename': 'index.html'}, - }) - eventlet.wsgi.server(eventlet.listen(('', 8000)), app) - """ - def __init__(self, engineio_app, wsgi_app=None, static_files=None, - engineio_path='engine.io'): - self.engineio_app = engineio_app - self.wsgi_app = wsgi_app - self.engineio_path = engineio_path - if not self.engineio_path.startswith('/'): - self.engineio_path = '/' + self.engineio_path - if not self.engineio_path.endswith('/'): - self.engineio_path += '/' - self.static_files = static_files or {} - - def __call__(self, environ, start_response): - if 'gunicorn.socket' in environ: - # gunicorn saves the socket under environ['gunicorn.socket'], while - # eventlet saves it under environ['eventlet.input']. Eventlet also - # stores the socket inside a wrapper class, while gunicon writes it - # directly into the environment. To give eventlet's WebSocket - # module access to this socket when running under gunicorn, here we - # copy the socket to the eventlet format. - class Input(object): - def __init__(self, socket): - self.socket = socket - - def get_socket(self): - return self.socket - - environ['eventlet.input'] = Input(environ['gunicorn.socket']) - path = environ['PATH_INFO'] - if path is not None and path.startswith(self.engineio_path): - return self.engineio_app.handle_request(environ, start_response) - else: - static_file = get_static_file(path, self.static_files) \ - if self.static_files else None - if static_file and os.path.exists(static_file['filename']): - start_response( - '200 OK', - [('Content-Type', static_file['content_type'])]) - with open(static_file['filename'], 'rb') as f: - return [f.read()] - elif self.wsgi_app is not None: - return self.wsgi_app(environ, start_response) - return self.not_found(start_response) - - def not_found(self, start_response): - start_response("404 Not Found", [('Content-Type', 'text/plain')]) - return [b'Not Found'] - - -class Middleware(WSGIApp): - """This class has been renamed to ``WSGIApp`` and is now deprecated.""" - def __init__(self, engineio_app, wsgi_app=None, - engineio_path='engine.io'): - super(Middleware, self).__init__(engineio_app, wsgi_app, - engineio_path=engineio_path) diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/packet.py b/venv_flaskchat/lib/python3.11/site-packages/engineio/packet.py deleted file mode 100644 index a9cbd33..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/engineio/packet.py +++ /dev/null @@ -1,74 +0,0 @@ -import base64 -from engineio import json as _json - -(OPEN, CLOSE, PING, PONG, MESSAGE, UPGRADE, NOOP) = (0, 1, 2, 3, 4, 5, 6) -packet_names = ['OPEN', 'CLOSE', 'PING', 'PONG', 'MESSAGE', 'UPGRADE', 'NOOP'] - -binary_types = (bytes, bytearray) - - -class Packet(object): - """Engine.IO packet.""" - - json = _json - - def __init__(self, packet_type=NOOP, data=None, encoded_packet=None): - self.packet_type = packet_type - self.data = data - if isinstance(data, str): - self.binary = False - elif isinstance(data, binary_types): - self.binary = True - else: - self.binary = False - if self.binary and self.packet_type != MESSAGE: - raise ValueError('Binary packets can only be of type MESSAGE') - if encoded_packet is not None: - self.decode(encoded_packet) - - def encode(self, b64=False): - """Encode the packet for transmission.""" - if self.binary: - if b64: - encoded_packet = 'b' + base64.b64encode(self.data).decode( - 'utf-8') - else: - encoded_packet = self.data - else: - encoded_packet = str(self.packet_type) - if isinstance(self.data, str): - encoded_packet += self.data - elif isinstance(self.data, dict) or isinstance(self.data, list): - encoded_packet += self.json.dumps(self.data, - separators=(',', ':')) - elif self.data is not None: - encoded_packet += str(self.data) - return encoded_packet - - def decode(self, encoded_packet): - """Decode a transmitted package.""" - self.binary = isinstance(encoded_packet, binary_types) - if not self.binary and len(encoded_packet) == 0: - raise ValueError('Invalid empty packet received') - b64 = not self.binary and encoded_packet[0] == 'b' - if b64: - self.binary = True - self.packet_type = MESSAGE - self.data = base64.b64decode(encoded_packet[1:]) - else: - if self.binary and not isinstance(encoded_packet, bytes): - encoded_packet = bytes(encoded_packet) - if self.binary: - self.packet_type = MESSAGE - self.data = encoded_packet - else: - self.packet_type = int(encoded_packet[0]) - try: - self.data = self.json.loads(encoded_packet[1:]) - if isinstance(self.data, int): - # do not allow integer payloads, see - # github.com/miguelgrinberg/python-engineio/issues/75 - # for background on this decision - raise ValueError - except ValueError: - self.data = encoded_packet[1:] diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/payload.py b/venv_flaskchat/lib/python3.11/site-packages/engineio/payload.py deleted file mode 100644 index f0e9e34..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/engineio/payload.py +++ /dev/null @@ -1,46 +0,0 @@ -import urllib - -from . import packet - - -class Payload(object): - """Engine.IO payload.""" - max_decode_packets = 16 - - def __init__(self, packets=None, encoded_payload=None): - self.packets = packets or [] - if encoded_payload is not None: - self.decode(encoded_payload) - - def encode(self, jsonp_index=None): - """Encode the payload for transmission.""" - encoded_payload = '' - for pkt in self.packets: - if encoded_payload: - encoded_payload += '\x1e' - encoded_payload += pkt.encode(b64=True) - if jsonp_index is not None: - encoded_payload = '___eio[' + \ - str(jsonp_index) + \ - ']("' + \ - encoded_payload.replace('"', '\\"') + \ - '");' - return encoded_payload - - def decode(self, encoded_payload): - """Decode a transmitted payload.""" - self.packets = [] - - if len(encoded_payload) == 0: - return - - # JSONP POST payload starts with 'd=' - if encoded_payload.startswith('d='): - encoded_payload = urllib.parse.parse_qs( - encoded_payload)['d'][0] - - encoded_packets = encoded_payload.split('\x1e') - if len(encoded_packets) > self.max_decode_packets: - raise ValueError('Too many packets in payload') - self.packets = [packet.Packet(encoded_packet=encoded_packet) - for encoded_packet in encoded_packets] diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/server.py b/venv_flaskchat/lib/python3.11/site-packages/engineio/server.py deleted file mode 100644 index 386ca82..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/engineio/server.py +++ /dev/null @@ -1,770 +0,0 @@ -import base64 -import gzip -import importlib -import io -import logging -import secrets -import urllib -import zlib - -from . import exceptions -from . import packet -from . import payload -from . import socket - -default_logger = logging.getLogger('engineio.server') - - -class Server(object): - """An Engine.IO server. - - This class implements a fully compliant Engine.IO web server with support - for websocket and long-polling transports. - - :param async_mode: The asynchronous model to use. See the Deployment - section in the documentation for a description of the - available options. Valid async modes are "threading", - "eventlet", "gevent" and "gevent_uwsgi". If this - argument is not given, "eventlet" is tried first, then - "gevent_uwsgi", then "gevent", and finally "threading". - The first async mode that has all its dependencies - installed is the one that is chosen. - :param ping_interval: The interval in seconds at which the server pings - the client. The default is 25 seconds. For advanced - control, a two element tuple can be given, where - the first number is the ping interval and the second - is a grace period added by the server. - :param ping_timeout: The time in seconds that the client waits for the - server to respond before disconnecting. The default - is 20 seconds. - :param max_http_buffer_size: The maximum size of a message. The default - is 1,000,000 bytes. - :param allow_upgrades: Whether to allow transport upgrades or not. The - default is ``True``. - :param http_compression: Whether to compress packages when using the - polling transport. The default is ``True``. - :param compression_threshold: Only compress messages when their byte size - is greater than this value. The default is - 1024 bytes. - :param cookie: If set to a string, it is the name of the HTTP cookie the - server sends back tot he client containing the client - session id. If set to a dictionary, the ``'name'`` key - contains the cookie name and other keys define cookie - attributes, where the value of each attribute can be a - string, a callable with no arguments, or a boolean. If set - to ``None`` (the default), a cookie is not sent to the - client. - :param cors_allowed_origins: Origin or list of origins that are allowed to - connect to this server. Only the same origin - is allowed by default. Set this argument to - ``'*'`` to allow all origins, or to ``[]`` to - disable CORS handling. - :param cors_credentials: Whether credentials (cookies, authentication) are - allowed in requests to this server. The default - is ``True``. - :param logger: To enable logging set to ``True`` or pass a logger object to - use. To disable logging set to ``False``. The default is - ``False``. Note that fatal errors are logged even when - ``logger`` is ``False``. - :param json: An alternative json module to use for encoding and decoding - packets. Custom json modules must have ``dumps`` and ``loads`` - functions that are compatible with the standard library - versions. - :param async_handlers: If set to ``True``, run message event handlers in - non-blocking threads. To run handlers synchronously, - set to ``False``. The default is ``True``. - :param monitor_clients: If set to ``True``, a background task will ensure - inactive clients are closed. Set to ``False`` to - disable the monitoring task (not recommended). The - default is ``True``. - :param transports: The list of allowed transports. Valid transports - are ``'polling'`` and ``'websocket'``. Defaults to - ``['polling', 'websocket']``. - :param kwargs: Reserved for future extensions, any additional parameters - given as keyword arguments will be silently ignored. - """ - compression_methods = ['gzip', 'deflate'] - event_names = ['connect', 'disconnect', 'message'] - valid_transports = ['polling', 'websocket'] - _default_monitor_clients = True - sequence_number = 0 - - def __init__(self, async_mode=None, ping_interval=25, ping_timeout=20, - max_http_buffer_size=1000000, allow_upgrades=True, - http_compression=True, compression_threshold=1024, - cookie=None, cors_allowed_origins=None, - cors_credentials=True, logger=False, json=None, - async_handlers=True, monitor_clients=None, transports=None, - **kwargs): - self.ping_timeout = ping_timeout - if isinstance(ping_interval, tuple): - self.ping_interval = ping_interval[0] - self.ping_interval_grace_period = ping_interval[1] - else: - self.ping_interval = ping_interval - self.ping_interval_grace_period = 0 - self.max_http_buffer_size = max_http_buffer_size - self.allow_upgrades = allow_upgrades - self.http_compression = http_compression - self.compression_threshold = compression_threshold - self.cookie = cookie - self.cors_allowed_origins = cors_allowed_origins - self.cors_credentials = cors_credentials - self.async_handlers = async_handlers - self.sockets = {} - self.handlers = {} - self.log_message_keys = set() - self.start_service_task = monitor_clients \ - if monitor_clients is not None else self._default_monitor_clients - if json is not None: - packet.Packet.json = json - if not isinstance(logger, bool): - self.logger = logger - else: - self.logger = default_logger - if self.logger.level == logging.NOTSET: - if logger: - self.logger.setLevel(logging.INFO) - else: - self.logger.setLevel(logging.ERROR) - self.logger.addHandler(logging.StreamHandler()) - modes = self.async_modes() - if async_mode is not None: - modes = [async_mode] if async_mode in modes else [] - self._async = None - self.async_mode = None - for mode in modes: - try: - self._async = importlib.import_module( - 'engineio.async_drivers.' + mode)._async - asyncio_based = self._async['asyncio'] \ - if 'asyncio' in self._async else False - if asyncio_based != self.is_asyncio_based(): - continue # pragma: no cover - self.async_mode = mode - break - except ImportError: - pass - if self.async_mode is None: - raise ValueError('Invalid async_mode specified') - if self.is_asyncio_based() and \ - ('asyncio' not in self._async or not - self._async['asyncio']): # pragma: no cover - raise ValueError('The selected async_mode is not asyncio ' - 'compatible') - if not self.is_asyncio_based() and 'asyncio' in self._async and \ - self._async['asyncio']: # pragma: no cover - raise ValueError('The selected async_mode requires asyncio and ' - 'must use the AsyncServer class') - if transports is not None: - if isinstance(transports, str): - transports = [transports] - transports = [transport for transport in transports - if transport in self.valid_transports] - if not transports: - raise ValueError('No valid transports provided') - self.transports = transports or self.valid_transports - self.logger.info('Server initialized for %s.', self.async_mode) - - def is_asyncio_based(self): - return False - - def async_modes(self): - return ['eventlet', 'gevent_uwsgi', 'gevent', 'threading'] - - def on(self, event, handler=None): - """Register an event handler. - - :param event: The event name. Can be ``'connect'``, ``'message'`` or - ``'disconnect'``. - :param handler: The function that should be invoked to handle the - event. When this parameter is not given, the method - acts as a decorator for the handler function. - - Example usage:: - - # as a decorator: - @eio.on('connect') - def connect_handler(sid, environ): - print('Connection request') - if environ['REMOTE_ADDR'] in blacklisted: - return False # reject - - # as a method: - def message_handler(sid, msg): - print('Received message: ', msg) - eio.send(sid, 'response') - eio.on('message', message_handler) - - The handler function receives the ``sid`` (session ID) for the - client as first argument. The ``'connect'`` event handler receives the - WSGI environment as a second argument, and can return ``False`` to - reject the connection. The ``'message'`` handler receives the message - payload as a second argument. The ``'disconnect'`` handler does not - take a second argument. - """ - if event not in self.event_names: - raise ValueError('Invalid event') - - def set_handler(handler): - self.handlers[event] = handler - return handler - - if handler is None: - return set_handler - set_handler(handler) - - def send(self, sid, data): - """Send a message to a client. - - :param sid: The session id of the recipient client. - :param data: The data to send to the client. Data can be of type - ``str``, ``bytes``, ``list`` or ``dict``. If a ``list`` - or ``dict``, the data will be serialized as JSON. - """ - try: - socket = self._get_socket(sid) - except KeyError: - # the socket is not available - self.logger.warning('Cannot send to sid %s', sid) - return - socket.send(packet.Packet(packet.MESSAGE, data=data)) - - def get_session(self, sid): - """Return the user session for a client. - - :param sid: The session id of the client. - - The return value is a dictionary. Modifications made to this - dictionary are not guaranteed to be preserved unless - ``save_session()`` is called, or when the ``session`` context manager - is used. - """ - socket = self._get_socket(sid) - return socket.session - - def save_session(self, sid, session): - """Store the user session for a client. - - :param sid: The session id of the client. - :param session: The session dictionary. - """ - socket = self._get_socket(sid) - socket.session = session - - def session(self, sid): - """Return the user session for a client with context manager syntax. - - :param sid: The session id of the client. - - This is a context manager that returns the user session dictionary for - the client. Any changes that are made to this dictionary inside the - context manager block are saved back to the session. Example usage:: - - @eio.on('connect') - def on_connect(sid, environ): - username = authenticate_user(environ) - if not username: - return False - with eio.session(sid) as session: - session['username'] = username - - @eio.on('message') - def on_message(sid, msg): - with eio.session(sid) as session: - print('received message from ', session['username']) - """ - class _session_context_manager(object): - def __init__(self, server, sid): - self.server = server - self.sid = sid - self.session = None - - def __enter__(self): - self.session = self.server.get_session(sid) - return self.session - - def __exit__(self, *args): - self.server.save_session(sid, self.session) - - return _session_context_manager(self, sid) - - def disconnect(self, sid=None): - """Disconnect a client. - - :param sid: The session id of the client to close. If this parameter - is not given, then all clients are closed. - """ - if sid is not None: - try: - socket = self._get_socket(sid) - except KeyError: # pragma: no cover - # the socket was already closed or gone - pass - else: - socket.close() - if sid in self.sockets: # pragma: no cover - del self.sockets[sid] - else: - for client in self.sockets.values(): - client.close() - self.sockets = {} - - def transport(self, sid): - """Return the name of the transport used by the client. - - The two possible values returned by this function are ``'polling'`` - and ``'websocket'``. - - :param sid: The session of the client. - """ - return 'websocket' if self._get_socket(sid).upgraded else 'polling' - - def handle_request(self, environ, start_response): - """Handle an HTTP request from the client. - - This is the entry point of the Engine.IO application, using the same - interface as a WSGI application. For the typical usage, this function - is invoked by the :class:`Middleware` instance, but it can be invoked - directly when the middleware is not used. - - :param environ: The WSGI environment. - :param start_response: The WSGI ``start_response`` function. - - This function returns the HTTP response body to deliver to the client - as a byte sequence. - """ - if self.cors_allowed_origins != []: - # Validate the origin header if present - # This is important for WebSocket more than for HTTP, since - # browsers only apply CORS controls to HTTP. - origin = environ.get('HTTP_ORIGIN') - if origin: - allowed_origins = self._cors_allowed_origins(environ) - if allowed_origins is not None and origin not in \ - allowed_origins: - self._log_error_once( - origin + ' is not an accepted origin.', 'bad-origin') - r = self._bad_request('Not an accepted origin.') - start_response(r['status'], r['headers']) - return [r['response']] - - method = environ['REQUEST_METHOD'] - query = urllib.parse.parse_qs(environ.get('QUERY_STRING', '')) - jsonp = False - jsonp_index = None - - # make sure the client uses an allowed transport - transport = query.get('transport', ['polling'])[0] - if transport not in self.transports: - self._log_error_once('Invalid transport', 'bad-transport') - r = self._bad_request('Invalid transport') - start_response(r['status'], r['headers']) - return [r['response']] - - # make sure the client speaks a compatible Engine.IO version - sid = query['sid'][0] if 'sid' in query else None - if sid is None and query.get('EIO') != ['4']: - self._log_error_once( - 'The client is using an unsupported version of the Socket.IO ' - 'or Engine.IO protocols', 'bad-version') - r = self._bad_request( - 'The client is using an unsupported version of the Socket.IO ' - 'or Engine.IO protocols') - start_response(r['status'], r['headers']) - return [r['response']] - - if 'j' in query: - jsonp = True - try: - jsonp_index = int(query['j'][0]) - except (ValueError, KeyError, IndexError): - # Invalid JSONP index number - pass - - if jsonp and jsonp_index is None: - self._log_error_once('Invalid JSONP index number', - 'bad-jsonp-index') - r = self._bad_request('Invalid JSONP index number') - elif method == 'GET': - if sid is None: - # transport must be one of 'polling' or 'websocket'. - # if 'websocket', the HTTP_UPGRADE header must match. - upgrade_header = environ.get('HTTP_UPGRADE').lower() \ - if 'HTTP_UPGRADE' in environ else None - if transport == 'polling' \ - or transport == upgrade_header == 'websocket': - r = self._handle_connect(environ, start_response, - transport, jsonp_index) - else: - self._log_error_once('Invalid websocket upgrade', - 'bad-upgrade') - r = self._bad_request('Invalid websocket upgrade') - else: - if sid not in self.sockets: - self._log_error_once('Invalid session ' + sid, 'bad-sid') - r = self._bad_request('Invalid session') - else: - socket = self._get_socket(sid) - try: - packets = socket.handle_get_request( - environ, start_response) - if isinstance(packets, list): - r = self._ok(packets, jsonp_index=jsonp_index) - else: - r = packets - except exceptions.EngineIOError: - if sid in self.sockets: # pragma: no cover - self.disconnect(sid) - r = self._bad_request() - if sid in self.sockets and self.sockets[sid].closed: - del self.sockets[sid] - elif method == 'POST': - if sid is None or sid not in self.sockets: - self._log_error_once( - 'Invalid session ' + (sid or 'None'), 'bad-sid') - r = self._bad_request('Invalid session') - else: - socket = self._get_socket(sid) - try: - socket.handle_post_request(environ) - r = self._ok(jsonp_index=jsonp_index) - except exceptions.EngineIOError: - if sid in self.sockets: # pragma: no cover - self.disconnect(sid) - r = self._bad_request() - except: # pragma: no cover - # for any other unexpected errors, we log the error - # and keep going - self.logger.exception('post request handler error') - r = self._ok(jsonp_index=jsonp_index) - elif method == 'OPTIONS': - r = self._ok() - else: - self.logger.warning('Method %s not supported', method) - r = self._method_not_found() - - if not isinstance(r, dict): - return r or [] - if self.http_compression and \ - len(r['response']) >= self.compression_threshold: - encodings = [e.split(';')[0].strip() for e in - environ.get('HTTP_ACCEPT_ENCODING', '').split(',')] - for encoding in encodings: - if encoding in self.compression_methods: - r['response'] = \ - getattr(self, '_' + encoding)(r['response']) - r['headers'] += [('Content-Encoding', encoding)] - break - cors_headers = self._cors_headers(environ) - start_response(r['status'], r['headers'] + cors_headers) - return [r['response']] - - def start_background_task(self, target, *args, **kwargs): - """Start a background task using the appropriate async model. - - This is a utility function that applications can use to start a - background task using the method that is compatible with the - selected async mode. - - :param target: the target function to execute. - :param args: arguments to pass to the function. - :param kwargs: keyword arguments to pass to the function. - - This function returns an object that represents the background task, - on which the ``join()`` methond can be invoked to wait for the task to - complete. - """ - th = self._async['thread'](target=target, args=args, kwargs=kwargs) - th.start() - return th # pragma: no cover - - def sleep(self, seconds=0): - """Sleep for the requested amount of time using the appropriate async - model. - - This is a utility function that applications can use to put a task to - sleep without having to worry about using the correct call for the - selected async mode. - """ - return self._async['sleep'](seconds) - - def create_queue(self, *args, **kwargs): - """Create a queue object using the appropriate async model. - - This is a utility function that applications can use to create a queue - without having to worry about using the correct call for the selected - async mode. - """ - return self._async['queue'](*args, **kwargs) - - def get_queue_empty_exception(self): - """Return the queue empty exception for the appropriate async model. - - This is a utility function that applications can use to work with a - queue without having to worry about using the correct call for the - selected async mode. - """ - return self._async['queue_empty'] - - def create_event(self, *args, **kwargs): - """Create an event object using the appropriate async model. - - This is a utility function that applications can use to create an - event without having to worry about using the correct call for the - selected async mode. - """ - return self._async['event'](*args, **kwargs) - - def generate_id(self): - """Generate a unique session id.""" - id = base64.b64encode( - secrets.token_bytes(12) + self.sequence_number.to_bytes(3, 'big')) - self.sequence_number = (self.sequence_number + 1) & 0xffffff - return id.decode('utf-8').replace('/', '_').replace('+', '-') - - def _generate_sid_cookie(self, sid, attributes): - """Generate the sid cookie.""" - cookie = attributes.get('name', 'io') + '=' + sid - for attribute, value in attributes.items(): - if attribute == 'name': - continue - if callable(value): - value = value() - if value is True: - cookie += '; ' + attribute - else: - cookie += '; ' + attribute + '=' + value - return cookie - - def _handle_connect(self, environ, start_response, transport, - jsonp_index=None): - """Handle a client connection request.""" - if self.start_service_task: - # start the service task to monitor connected clients - self.start_service_task = False - self.start_background_task(self._service_task) - - sid = self.generate_id() - s = socket.Socket(self, sid) - self.sockets[sid] = s - - pkt = packet.Packet(packet.OPEN, { - 'sid': sid, - 'upgrades': self._upgrades(sid, transport), - 'pingTimeout': int(self.ping_timeout * 1000), - 'pingInterval': int( - self.ping_interval + self.ping_interval_grace_period) * 1000}) - s.send(pkt) - s.schedule_ping() - - # NOTE: some sections below are marked as "no cover" to workaround - # what seems to be a bug in the coverage package. All the lines below - # are covered by tests, but some are not reported as such for some - # reason - ret = self._trigger_event('connect', sid, environ, run_async=False) - if ret is not None and ret is not True: # pragma: no cover - del self.sockets[sid] - self.logger.warning('Application rejected connection') - return self._unauthorized(ret or None) - - if transport == 'websocket': # pragma: no cover - ret = s.handle_get_request(environ, start_response) - if s.closed and sid in self.sockets: - # websocket connection ended, so we are done - del self.sockets[sid] - return ret - else: # pragma: no cover - s.connected = True - headers = None - if self.cookie: - if isinstance(self.cookie, dict): - headers = [( - 'Set-Cookie', - self._generate_sid_cookie(sid, self.cookie) - )] - else: - headers = [( - 'Set-Cookie', - self._generate_sid_cookie(sid, { - 'name': self.cookie, 'path': '/', 'SameSite': 'Lax' - }) - )] - try: - return self._ok(s.poll(), headers=headers, - jsonp_index=jsonp_index) - except exceptions.QueueEmpty: - return self._bad_request() - - def _upgrades(self, sid, transport): - """Return the list of possible upgrades for a client connection.""" - if not self.allow_upgrades or self._get_socket(sid).upgraded or \ - transport == 'websocket': - return [] - if self._async['websocket'] is None: # pragma: no cover - self._log_error_once( - 'The WebSocket transport is not available, you must install a ' - 'WebSocket server that is compatible with your async mode to ' - 'enable it. See the documentation for details.', - 'no-websocket') - return [] - return ['websocket'] - - def _trigger_event(self, event, *args, **kwargs): - """Invoke an event handler.""" - run_async = kwargs.pop('run_async', False) - if event in self.handlers: - if run_async: - return self.start_background_task(self.handlers[event], *args) - else: - try: - return self.handlers[event](*args) - except: - self.logger.exception(event + ' handler error') - if event == 'connect': - # if connect handler raised error we reject the - # connection - return False - - def _get_socket(self, sid): - """Return the socket object for a given session.""" - try: - s = self.sockets[sid] - except KeyError: - raise KeyError('Session not found') - if s.closed: - del self.sockets[sid] - raise KeyError('Session is disconnected') - return s - - def _ok(self, packets=None, headers=None, jsonp_index=None): - """Generate a successful HTTP response.""" - if packets is not None: - if headers is None: - headers = [] - headers += [('Content-Type', 'text/plain; charset=UTF-8')] - return {'status': '200 OK', - 'headers': headers, - 'response': payload.Payload(packets=packets).encode( - jsonp_index=jsonp_index).encode('utf-8')} - else: - return {'status': '200 OK', - 'headers': [('Content-Type', 'text/plain')], - 'response': b'OK'} - - def _bad_request(self, message=None): - """Generate a bad request HTTP error response.""" - if message is None: - message = 'Bad Request' - message = packet.Packet.json.dumps(message) - return {'status': '400 BAD REQUEST', - 'headers': [('Content-Type', 'text/plain')], - 'response': message.encode('utf-8')} - - def _method_not_found(self): - """Generate a method not found HTTP error response.""" - return {'status': '405 METHOD NOT FOUND', - 'headers': [('Content-Type', 'text/plain')], - 'response': b'Method Not Found'} - - def _unauthorized(self, message=None): - """Generate a unauthorized HTTP error response.""" - if message is None: - message = 'Unauthorized' - message = packet.Packet.json.dumps(message) - return {'status': '401 UNAUTHORIZED', - 'headers': [('Content-Type', 'application/json')], - 'response': message.encode('utf-8')} - - def _cors_allowed_origins(self, environ): - default_origins = [] - if 'wsgi.url_scheme' in environ and 'HTTP_HOST' in environ: - default_origins.append('{scheme}://{host}'.format( - scheme=environ['wsgi.url_scheme'], host=environ['HTTP_HOST'])) - if 'HTTP_X_FORWARDED_PROTO' in environ or \ - 'HTTP_X_FORWARDED_HOST' in environ: - scheme = environ.get( - 'HTTP_X_FORWARDED_PROTO', - environ['wsgi.url_scheme']).split(',')[0].strip() - default_origins.append('{scheme}://{host}'.format( - scheme=scheme, host=environ.get( - 'HTTP_X_FORWARDED_HOST', environ['HTTP_HOST']).split( - ',')[0].strip())) - if self.cors_allowed_origins is None: - allowed_origins = default_origins - elif self.cors_allowed_origins == '*': - allowed_origins = None - elif isinstance(self.cors_allowed_origins, str): - allowed_origins = [self.cors_allowed_origins] - elif callable(self.cors_allowed_origins): - origin = environ.get('HTTP_ORIGIN') - allowed_origins = [origin] \ - if self.cors_allowed_origins(origin) else [] - else: - allowed_origins = self.cors_allowed_origins - return allowed_origins - - def _cors_headers(self, environ): - """Return the cross-origin-resource-sharing headers.""" - if self.cors_allowed_origins == []: - # special case, CORS handling is completely disabled - return [] - headers = [] - allowed_origins = self._cors_allowed_origins(environ) - if 'HTTP_ORIGIN' in environ and \ - (allowed_origins is None or environ['HTTP_ORIGIN'] in - allowed_origins): - headers = [('Access-Control-Allow-Origin', environ['HTTP_ORIGIN'])] - if environ['REQUEST_METHOD'] == 'OPTIONS': - headers += [('Access-Control-Allow-Methods', 'OPTIONS, GET, POST')] - if 'HTTP_ACCESS_CONTROL_REQUEST_HEADERS' in environ: - headers += [('Access-Control-Allow-Headers', - environ['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])] - if self.cors_credentials: - headers += [('Access-Control-Allow-Credentials', 'true')] - return headers - - def _gzip(self, response): - """Apply gzip compression to a response.""" - bytesio = io.BytesIO() - with gzip.GzipFile(fileobj=bytesio, mode='w') as gz: - gz.write(response) - return bytesio.getvalue() - - def _deflate(self, response): - """Apply deflate compression to a response.""" - return zlib.compress(response) - - def _log_error_once(self, message, message_key): - """Log message with logging.ERROR level the first time, then log - with given level.""" - if message_key not in self.log_message_keys: - self.logger.error(message + ' (further occurrences of this error ' - 'will be logged with level INFO)') - self.log_message_keys.add(message_key) - else: - self.logger.info(message) - - def _service_task(self): # pragma: no cover - """Monitor connected clients and clean up those that time out.""" - while True: - if len(self.sockets) == 0: - # nothing to do - self.sleep(self.ping_timeout) - continue - - # go through the entire client list in a ping interval cycle - sleep_interval = float(self.ping_timeout) / len(self.sockets) - - try: - # iterate over the current clients - for s in self.sockets.copy().values(): - if not s.closing and not s.closed: - s.check_ping_timeout() - self.sleep(sleep_interval) - except (SystemExit, KeyboardInterrupt): - self.logger.info('service task canceled') - break - except: - # an unexpected exception has occurred, log it and continue - self.logger.exception('service task exception') diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/socket.py b/venv_flaskchat/lib/python3.11/site-packages/engineio/socket.py deleted file mode 100644 index be0c83f..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/engineio/socket.py +++ /dev/null @@ -1,260 +0,0 @@ -import sys -import time - -from . import exceptions -from . import packet -from . import payload - - -class Socket(object): - """An Engine.IO socket.""" - upgrade_protocols = ['websocket'] - - def __init__(self, server, sid): - self.server = server - self.sid = sid - self.queue = self.server.create_queue() - self.last_ping = None - self.connected = False - self.upgrading = False - self.upgraded = False - self.closing = False - self.closed = False - self.session = {} - - def poll(self): - """Wait for packets to send to the client.""" - queue_empty = self.server.get_queue_empty_exception() - try: - packets = [self.queue.get( - timeout=self.server.ping_interval + self.server.ping_timeout)] - self.queue.task_done() - except queue_empty: - raise exceptions.QueueEmpty() - if packets == [None]: - return [] - while True: - try: - pkt = self.queue.get(block=False) - self.queue.task_done() - if pkt is None: - self.queue.put(None) - break - packets.append(pkt) - except queue_empty: - break - return packets - - def receive(self, pkt): - """Receive packet from the client.""" - packet_name = packet.packet_names[pkt.packet_type] \ - if pkt.packet_type < len(packet.packet_names) else 'UNKNOWN' - self.server.logger.info('%s: Received packet %s data %s', - self.sid, packet_name, - pkt.data if not isinstance(pkt.data, bytes) - else '') - if pkt.packet_type == packet.PONG: - self.schedule_ping() - elif pkt.packet_type == packet.MESSAGE: - self.server._trigger_event('message', self.sid, pkt.data, - run_async=self.server.async_handlers) - elif pkt.packet_type == packet.UPGRADE: - self.send(packet.Packet(packet.NOOP)) - elif pkt.packet_type == packet.CLOSE: - self.close(wait=False, abort=True) - else: - raise exceptions.UnknownPacketError() - - def check_ping_timeout(self): - """Make sure the client is still responding to pings.""" - if self.closed: - raise exceptions.SocketIsClosedError() - if self.last_ping and \ - time.time() - self.last_ping > self.server.ping_timeout: - self.server.logger.info('%s: Client is gone, closing socket', - self.sid) - # Passing abort=False here will cause close() to write a - # CLOSE packet. This has the effect of updating half-open sockets - # to their correct state of disconnected - self.close(wait=False, abort=False) - return False - return True - - def send(self, pkt): - """Send a packet to the client.""" - if not self.check_ping_timeout(): - return - else: - self.queue.put(pkt) - self.server.logger.info('%s: Sending packet %s data %s', - self.sid, packet.packet_names[pkt.packet_type], - pkt.data if not isinstance(pkt.data, bytes) - else '') - - def handle_get_request(self, environ, start_response): - """Handle a long-polling GET request from the client.""" - connections = [ - s.strip() - for s in environ.get('HTTP_CONNECTION', '').lower().split(',')] - transport = environ.get('HTTP_UPGRADE', '').lower() - if 'upgrade' in connections and transport in self.upgrade_protocols: - self.server.logger.info('%s: Received request to upgrade to %s', - self.sid, transport) - return getattr(self, '_upgrade_' + transport)(environ, - start_response) - if self.upgrading or self.upgraded: - # we are upgrading to WebSocket, do not return any more packets - # through the polling endpoint - return [packet.Packet(packet.NOOP)] - try: - packets = self.poll() - except exceptions.QueueEmpty: - exc = sys.exc_info() - self.close(wait=False) - raise exc[1].with_traceback(exc[2]) - return packets - - def handle_post_request(self, environ): - """Handle a long-polling POST request from the client.""" - length = int(environ.get('CONTENT_LENGTH', '0')) - if length > self.server.max_http_buffer_size: - raise exceptions.ContentTooLongError() - else: - body = environ['wsgi.input'].read(length).decode('utf-8') - p = payload.Payload(encoded_payload=body) - for pkt in p.packets: - self.receive(pkt) - - def close(self, wait=True, abort=False): - """Close the socket connection.""" - if not self.closed and not self.closing: - self.closing = True - self.server._trigger_event('disconnect', self.sid, run_async=False) - if not abort: - self.send(packet.Packet(packet.CLOSE)) - self.closed = True - self.queue.put(None) - if wait: - self.queue.join() - - def schedule_ping(self): - def send_ping(): - self.last_ping = None - self.server.sleep(self.server.ping_interval) - if not self.closing and not self.closed: - self.last_ping = time.time() - self.send(packet.Packet(packet.PING)) - - self.server.start_background_task(send_ping) - - def _upgrade_websocket(self, environ, start_response): - """Upgrade the connection from polling to websocket.""" - if self.upgraded: - raise IOError('Socket has been upgraded already') - if self.server._async['websocket'] is None: - # the selected async mode does not support websocket - return self.server._bad_request() - ws = self.server._async['websocket'](self._websocket_handler) - return ws(environ, start_response) - - def _websocket_handler(self, ws): - """Engine.IO handler for websocket transport.""" - def websocket_wait(): - data = ws.wait() - if data and len(data) > self.server.max_http_buffer_size: - raise ValueError('packet is too large') - return data - - # try to set a socket timeout matching the configured ping interval - # and timeout - for attr in ['_sock', 'socket']: # pragma: no cover - if hasattr(ws, attr) and hasattr(getattr(ws, attr), 'settimeout'): - getattr(ws, attr).settimeout( - self.server.ping_interval + self.server.ping_timeout) - - if self.connected: - # the socket was already connected, so this is an upgrade - self.upgrading = True # hold packet sends during the upgrade - - pkt = websocket_wait() - decoded_pkt = packet.Packet(encoded_packet=pkt) - if decoded_pkt.packet_type != packet.PING or \ - decoded_pkt.data != 'probe': - self.server.logger.info( - '%s: Failed websocket upgrade, no PING packet', self.sid) - self.upgrading = False - return [] - ws.send(packet.Packet(packet.PONG, data='probe').encode()) - self.queue.put(packet.Packet(packet.NOOP)) # end poll - - pkt = websocket_wait() - decoded_pkt = packet.Packet(encoded_packet=pkt) - if decoded_pkt.packet_type != packet.UPGRADE: - self.upgraded = False - self.server.logger.info( - ('%s: Failed websocket upgrade, expected UPGRADE packet, ' - 'received %s instead.'), - self.sid, pkt) - self.upgrading = False - return [] - self.upgraded = True - self.upgrading = False - else: - self.connected = True - self.upgraded = True - - # start separate writer thread - def writer(): - while True: - packets = None - try: - packets = self.poll() - except exceptions.QueueEmpty: - break - if not packets: - # empty packet list returned -> connection closed - break - try: - for pkt in packets: - ws.send(pkt.encode()) - except: - break - writer_task = self.server.start_background_task(writer) - - self.server.logger.info( - '%s: Upgrade to websocket successful', self.sid) - - while True: - p = None - try: - p = websocket_wait() - except Exception as e: - # if the socket is already closed, we can assume this is a - # downstream error of that - if not self.closed: # pragma: no cover - self.server.logger.info( - '%s: Unexpected error "%s", closing connection', - self.sid, str(e)) - break - if p is None: - # connection closed by client - break - pkt = packet.Packet(encoded_packet=p) - try: - self.receive(pkt) - except exceptions.UnknownPacketError: # pragma: no cover - pass - except exceptions.SocketIsClosedError: # pragma: no cover - self.server.logger.info('Receive error -- socket is closed') - break - except: # pragma: no cover - # if we get an unexpected exception we log the error and exit - # the connection properly - self.server.logger.exception('Unknown receive error') - break - - self.queue.put(None) # unlock the writer task so that it can exit - writer_task.join() - self.close(wait=False, abort=True) - - return [] diff --git a/venv_flaskchat/lib/python3.11/site-packages/engineio/static_files.py b/venv_flaskchat/lib/python3.11/site-packages/engineio/static_files.py deleted file mode 100644 index 77c8915..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/engineio/static_files.py +++ /dev/null @@ -1,60 +0,0 @@ -content_types = { - 'css': 'text/css', - 'gif': 'image/gif', - 'html': 'text/html', - 'jpg': 'image/jpeg', - 'js': 'application/javascript', - 'json': 'application/json', - 'png': 'image/png', - 'txt': 'text/plain', -} - - -def get_static_file(path, static_files): - """Return the local filename and content type for the requested static - file URL. - - :param path: the path portion of the requested URL. - :param static_files: a static file configuration dictionary. - - This function returns a dictionary with two keys, "filename" and - "content_type". If the requested URL does not match any static file, the - return value is None. - """ - extra_path = '' - if path in static_files: - f = static_files[path] - else: - f = None - while path != '': - path, last = path.rsplit('/', 1) - extra_path = '/' + last + extra_path - if path in static_files: - f = static_files[path] - break - elif path + '/' in static_files: - f = static_files[path + '/'] - break - if f: - if isinstance(f, str): - f = {'filename': f} - else: - f = f.copy() # in case it is mutated below - if f['filename'].endswith('/') and extra_path.startswith('/'): - extra_path = extra_path[1:] - f['filename'] += extra_path - if f['filename'].endswith('/'): - if '' in static_files: - if isinstance(static_files[''], str): - f['filename'] += static_files[''] - else: - f['filename'] += static_files['']['filename'] - if 'content_type' in static_files['']: - f['content_type'] = static_files['']['content_type'] - else: - f['filename'] += 'index.html' - if 'content_type' not in f: - ext = f['filename'].rsplit('.')[-1] - f['content_type'] = content_types.get( - ext, 'application/octet-stream') - return f diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/__init__.py b/venv_flaskchat/lib/python3.11/site-packages/flask/__init__.py deleted file mode 100644 index 0bef221..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/__init__.py +++ /dev/null @@ -1,102 +0,0 @@ -from . import json as json -from .app import Flask as Flask -from .app import Request as Request -from .app import Response as Response -from .blueprints import Blueprint as Blueprint -from .config import Config as Config -from .ctx import after_this_request as after_this_request -from .ctx import copy_current_request_context as copy_current_request_context -from .ctx import has_app_context as has_app_context -from .ctx import has_request_context as has_request_context -from .globals import current_app as current_app -from .globals import g as g -from .globals import request as request -from .globals import session as session -from .helpers import abort as abort -from .helpers import flash as flash -from .helpers import get_flashed_messages as get_flashed_messages -from .helpers import get_template_attribute as get_template_attribute -from .helpers import make_response as make_response -from .helpers import redirect as redirect -from .helpers import send_file as send_file -from .helpers import send_from_directory as send_from_directory -from .helpers import stream_with_context as stream_with_context -from .helpers import url_for as url_for -from .json import jsonify as jsonify -from .signals import appcontext_popped as appcontext_popped -from .signals import appcontext_pushed as appcontext_pushed -from .signals import appcontext_tearing_down as appcontext_tearing_down -from .signals import before_render_template as before_render_template -from .signals import got_request_exception as got_request_exception -from .signals import message_flashed as message_flashed -from .signals import request_finished as request_finished -from .signals import request_started as request_started -from .signals import request_tearing_down as request_tearing_down -from .signals import template_rendered as template_rendered -from .templating import render_template as render_template -from .templating import render_template_string as render_template_string -from .templating import stream_template as stream_template -from .templating import stream_template_string as stream_template_string - -__version__ = "2.3.2" - - -def __getattr__(name): - if name == "_app_ctx_stack": - import warnings - from .globals import __app_ctx_stack - - warnings.warn( - "'_app_ctx_stack' is deprecated and will be removed in Flask 2.4.", - DeprecationWarning, - stacklevel=2, - ) - return __app_ctx_stack - - if name == "_request_ctx_stack": - import warnings - from .globals import __request_ctx_stack - - warnings.warn( - "'_request_ctx_stack' is deprecated and will be removed in Flask 2.4.", - DeprecationWarning, - stacklevel=2, - ) - return __request_ctx_stack - - if name == "escape": - import warnings - from markupsafe import escape - - warnings.warn( - "'flask.escape' is deprecated and will be removed in Flask 2.4. Import" - " 'markupsafe.escape' instead.", - DeprecationWarning, - stacklevel=2, - ) - return escape - - if name == "Markup": - import warnings - from markupsafe import Markup - - warnings.warn( - "'flask.Markup' is deprecated and will be removed in Flask 2.4. Import" - " 'markupsafe.Markup' instead.", - DeprecationWarning, - stacklevel=2, - ) - return Markup - - if name == "signals_available": - import warnings - - warnings.warn( - "'signals_available' is deprecated and will be removed in Flask 2.4." - " Signals are always available", - DeprecationWarning, - stacklevel=2, - ) - return True - - raise AttributeError(name) diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/__main__.py b/venv_flaskchat/lib/python3.11/site-packages/flask/__main__.py deleted file mode 100644 index 4e28416..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/__main__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .cli import main - -main() diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/__init__.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e21fc3ac5ed5b6db5a1c206c53f1e6f4d59e0f54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4089 zcmcJS%WoUk6^AdM!-ptRFH)9dax6-wY0G3R_kpHq+SEzYEbN7yAi&*BhMX&Ds(JO! z=m`r5iY|<9x+u_gRdki2NdA=qw?-F(0SY)svv5`_oK;pi=aQ5(q8!ISGCDf?=FFMj zea@NDKT4$nf#YB1pN&6F67m_IjE>|Gp8YRD$X|#-jD$t(1WhE6lUCAB(UjyAaGIti zr-3sxBROMbZG|e5vsTW|)4XKGD%eF@l$-;epc9hwz$IFeTmYV=lah;8*{;xvAyiAuRF9A1cQ}Sit6}lq1 z4!lZNB{zVt(yNkH;1+F3z5;xWUX#2G+@@{GP2lVFy5tq>hP_7DB(DPBq&FpB1@6#} zgIjs7}|zuVdl)>guAvj zNO1Xq3~Krla5-csIN#<5CQrebhI68MuIDl1d~nC#lEK=U%z){z z3Y(hY?%}#sdkloJ(~f})F&q|LncH+v=br8NnHLOZsyv*F(cD08Wi;~}reh8pEstV; zpz}cXV|Ele*NLf7v%_x4WVru)m#XJNnh$gD;F^|!aNq*>-pBnr zIx+w$_Sa*R z9YH03u6pH#>KUm%HB@ho=KZ;f(=SpqW*(4W=5#$Cl8<0@KR#La-zD0!_oB%`9SQbf zd+7b`r58rH!2Vc4mQI`3A-GeH`*I}H8y%yHE?amEzmq0Uq()6n`R1mhTkxLP z)lEz9S?utG)>!Q2+kP;RRdvo(-P+R+eD$P-ciV+1x2JOlijp5Go0i*y9`Ktm<|vKv zX!_0JZh=zz{veUx!pnuz>66PMCn}nJWAt`;i*u;|*(mMkHse2pTcoVK`Sb=q3l~&* zeAVy1=QHkiZRY6Q0D0Zfo$g(C*JOTIZpk}adeGfv&aSNF+kHH>%wE?!2)113cIVcu zu5SkHrUwrOzWcgzqjWV5ihQ7H9q%A2Y8t!^@f`^J^=Hud8vOcygNN)x5-LSeZah{R zLTQA#+M_c5gt;{lwM16NIu$stki^3JEOQNaxoh!9w!r}wa*9L%*$?Ou$$nH zrJEp?>Z8*4BPq(ukCkPiET44q+jnaAQSf--%!#TSVGDHQVKR3ecG$%2SmNE#w;A!&-Zg=AI4EhHTgw~(xexP{~=B5onME8-TC z+ahiu`KgFoNV+0!Az2i03rS1F?V`x|xW*%I2okf9yd~mxQJ>p_#4IE?MBGC1a}l?T zBIBbNpVjgC8IQazNX#x8#T`Ln7Lp%}xLve@<2kYEg4w%h1z!~;W+C~th+7y>fc){C UCzEp@7LT*9CK|_N+{s7aYiTWoTmS$7 diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/__main__.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/__main__.cpython-311.pyc deleted file mode 100644 index a501d54fbea76cc1561706ef034c314970bb7ec4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 283 zcmZ3^%ge<81ZOj+rN{y4#~=<2FhLog)qsrY3@HpLj5!Rsj8Tk?3``8EjLU$ct6^#x z7#UKSf*CZKUorxPG#PKP* zGfPr+3lfvF6VrjZz{>RF<3V=D$LkeT{^GF7%}*)KNwq8D0NM$1Q!&UFAD9^#8E-I% XUO+_;7+4xu8rfRd8o;oK4X6|V`kP40 diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/app.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/app.cpython-311.pyc deleted file mode 100644 index 0273a9f5b551ff247f91cd981fd2bfabd681d72b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87110 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 hYBWFb{{b6CztI2y diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/blueprints.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/blueprints.cpython-311.pyc deleted file mode 100644 index 4991826185e7927b4555c64bd1d93d97a401e6e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32032 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 UF3_&!!x{e*mh!U|(isx|KZ3m9cK`qY diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/cli.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/cli.cpython-311.pyc deleted file mode 100644 index bf88b09ec6f5b1aa16d719eaa0d51a3f9dde31f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44184 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 diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/ctx.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/ctx.cpython-311.pyc deleted file mode 100644 index f129b7cfd1dd58297a1b99c7b579b19a8ff8dce7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20646 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 HAfxv`c1u?j diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/helpers.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/helpers.cpython-311.pyc deleted file mode 100644 index f600da0cf23a95b54cdbba6520f2df3c886faeae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29804 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 PWfz%K0QvtoO$!U-~au;-6(ea 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 Zk51CjN`0MVpqbh^$$sZh&XJj|^gp(^x~u>I diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/testing.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/testing.cpython-311.pyc deleted file mode 100644 index fd682aad93db78a2c0787ee706a3cc0a9e0f7fd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14167 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 Ive=6LFHba>wEzGB diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/typing.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/typing.cpython-311.pyc deleted file mode 100644 index cf4f7635bd7a782e02ff7c2b2f6b4ae875d387b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3455 zcmb7FOH3PC7OiqUV*@s}!Tj6_kfhTDNbEL*iJEWBCqF_Gfzz$=1{JPn$E2uos>&f` z(^+IeOIfh6W>~QBBI@yISa>lD7HO%Mvl;1)^cGgFkY+VIOPy6#bIWemhmJ?nMH#(! z@44sPd*6NbU;O?K2A+TB{v`a=$uR#mHqEEKv0#5$X=9i_GXf*9BD2e;Sk_p(L|2N# z+zx8Om2R+dqIR=g&0G-Aov|%6igQcr!fpws{9&9d* zm|$}Q5jIT5@;U;qE|L8Pr7p*`ca^iu;a<4jD0&>^&) zbpGgKn7_fN@uVVv_@cSPwjQP~I5OsTE}E!Fmc@~CSvkGj&X9#R6JYEy_H}Bwl~xue z*p398sgyOUGj#;pjM*dX>(oeV9q?Fv82Eh7t<_saf1byY)1}|AUN(Ez@)kK5t^k8| zD{LKdWc8($OO|cj)z&fK`F-8K3K7oJ`n{EXWoHmPurt4R932?_KXKR2;l>;+<9086 zyG&$V&OW8CI}rAXvE3ZNSd%ni>-u@N8|T=}+TeZ-I5LX@^0OxlJ#irIjP-t*Cx%8>9u329&VtOM4_!FylB3a`nERlv8rSirhF zS;&i6?`+iGuz5G}ivpI?Soi(fl7^kjNt)i%Y`_MF^rVKzlZ1M{nH%CK8OCyPs}6T)`Q>AX*K$0JeIA zpD574^JRor6-8F=@sc3gGVpK61xWnYCjXWB1x|$d#K)e(Fsrd$EJ3ZiyuwSo6kC^H z=CB&O1Ec(W`5CXpUSjFxR>s(-jjfp5j^+2YXRno zdTRlXyZ*YVw#=S*DqLl=;-%NVA${M_u9-KTpcf3i z+p8kK!D7(QlCB|&h8v_W-t8T#M{A^ilm@O*G*)xF+!G%;6m-4u)w-Defnv6bLI(Ek z!TQl0@r_b+t+|~dz9y65ohtc=?>a>{s*q?qG7@d;cM+zi*2jb*hitL^C{~G(;M~80 zb2K>j#(x&>Ej~C>i;oEts)7_`2^Amu556z?N#F)WQOm%-?<}v=kr@)0p=cHk%02&) z;|72}T=OzR!^hv%u?NcG&4X7I4IEuM9xrW_LnmKUl5}i_T%DnjS%PLia;_l=ia=im zBgb$8MvoQf`3xC~)1FBZn51aRGS42pIDSpW=jreQ?O7y&MT%}4>Psxh4+2v!$X~kr zzN0)@esS`$l0J=pn6B*5Sb|I>=*SXbE>?TO#aoR^*kZ@gJPnSKz<7Cu1iq#y{#!@l zWbG8u>+>WqPtk%QcH0mOgIEy6zP$Q=ro3Ib^!Kk$drtWe_%uQ%S4eb)URfo~NENDz zl$N3J-qHg)7$Z#I=Sl6p z_{mHqeX@9(`0(Iojm|wJ$oM85P7>xqEyxTE0$Ke1bZL}KERf3!w0{vO&w?Ri r&g(Nw!lNY6937bH!$fh7j7-t+O%k|C(X>(IEvV6$YvWIuhAa7B;+q*s diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/views.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/views.cpython-311.pyc deleted file mode 100644 index 0bb3b8d4fd34ed3e72352027c42620fb57dd2d20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7324 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 diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/wrappers.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/flask/__pycache__/wrappers.cpython-311.pyc deleted file mode 100644 index f112baf086e680777335b5d589c2cafbc7c0550b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6774 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 Qy;xrSlBi#`=@K&g4^Y1aYybcN diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/app.py b/venv_flaskchat/lib/python3.11/site-packages/flask/app.py deleted file mode 100644 index 3b6b38d..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/app.py +++ /dev/null @@ -1,2213 +0,0 @@ -from __future__ import annotations - -import logging -import os -import sys -import typing as t -import weakref -from collections.abc import Iterator as _abc_Iterator -from datetime import timedelta -from inspect import iscoroutinefunction -from itertools import chain -from types import TracebackType -from urllib.parse import quote as _url_quote - -import click -from werkzeug.datastructures import Headers -from werkzeug.datastructures import ImmutableDict -from werkzeug.exceptions import Aborter -from werkzeug.exceptions import BadRequest -from werkzeug.exceptions import BadRequestKeyError -from werkzeug.exceptions import HTTPException -from werkzeug.exceptions import InternalServerError -from werkzeug.routing import BuildError -from werkzeug.routing import Map -from werkzeug.routing import MapAdapter -from werkzeug.routing import RequestRedirect -from werkzeug.routing import RoutingException -from werkzeug.routing import Rule -from werkzeug.serving import is_running_from_reloader -from werkzeug.utils import cached_property -from werkzeug.utils import redirect as _wz_redirect -from werkzeug.wrappers import Response as BaseResponse - -from . import cli -from . import typing as ft -from .config import Config -from .config import ConfigAttribute -from .ctx import _AppCtxGlobals -from .ctx import AppContext -from .ctx import RequestContext -from .globals import _cv_app -from .globals import _cv_request -from .globals import g -from .globals import request -from .globals import request_ctx -from .globals import session -from .helpers import _split_blueprint_path -from .helpers import get_debug_flag -from .helpers import get_flashed_messages -from .helpers import get_load_dotenv -from .json.provider import DefaultJSONProvider -from .json.provider import JSONProvider -from .logging import create_logger -from .scaffold import _endpoint_from_view_func -from .scaffold import _sentinel -from .scaffold import find_package -from .scaffold import Scaffold -from .scaffold import setupmethod -from .sessions import SecureCookieSessionInterface -from .sessions import SessionInterface -from .signals import appcontext_tearing_down -from .signals import got_request_exception -from .signals import request_finished -from .signals import request_started -from .signals import request_tearing_down -from .templating import DispatchingJinjaLoader -from .templating import Environment -from .wrappers import Request -from .wrappers import Response - -if t.TYPE_CHECKING: # pragma: no cover - from .blueprints import Blueprint - from .testing import FlaskClient - from .testing import FlaskCliRunner - -T_shell_context_processor = t.TypeVar( - "T_shell_context_processor", bound=ft.ShellContextProcessorCallable -) -T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) -T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) -T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) -T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) - - -def _make_timedelta(value: timedelta | int | None) -> timedelta | None: - if value is None or isinstance(value, timedelta): - return value - - return timedelta(seconds=value) - - -class Flask(Scaffold): - """The flask object implements a WSGI application and acts as the central - object. It is passed the name of the module or package of the - application. Once it is created it will act as a central registry for - the view functions, the URL rules, template configuration and much more. - - The name of the package is used to resolve resources from inside the - package or the folder the module is contained in depending on if the - package parameter resolves to an actual python package (a folder with - an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). - - For more information about resource loading, see :func:`open_resource`. - - Usually you create a :class:`Flask` instance in your main module or - in the :file:`__init__.py` file of your package like this:: - - from flask import Flask - app = Flask(__name__) - - .. admonition:: About the First Parameter - - The idea of the first parameter is to give Flask an idea of what - belongs to your application. This name is used to find resources - on the filesystem, can be used by extensions to improve debugging - information and a lot more. - - So it's important what you provide there. If you are using a single - module, `__name__` is always the correct value. If you however are - using a package, it's usually recommended to hardcode the name of - your package there. - - For example if your application is defined in :file:`yourapplication/app.py` - you should create it with one of the two versions below:: - - app = Flask('yourapplication') - app = Flask(__name__.split('.')[0]) - - Why is that? The application will work even with `__name__`, thanks - to how resources are looked up. However it will make debugging more - painful. Certain extensions can make assumptions based on the - import name of your application. For example the Flask-SQLAlchemy - extension will look for the code in your application that triggered - an SQL query in debug mode. If the import name is not properly set - up, that debugging information is lost. (For example it would only - pick up SQL queries in `yourapplication.app` and not - `yourapplication.views.frontend`) - - .. versionadded:: 0.7 - The `static_url_path`, `static_folder`, and `template_folder` - parameters were added. - - .. versionadded:: 0.8 - The `instance_path` and `instance_relative_config` parameters were - added. - - .. versionadded:: 0.11 - The `root_path` parameter was added. - - .. versionadded:: 1.0 - The ``host_matching`` and ``static_host`` parameters were added. - - .. versionadded:: 1.0 - The ``subdomain_matching`` parameter was added. Subdomain - matching needs to be enabled manually now. Setting - :data:`SERVER_NAME` does not implicitly enable it. - - :param import_name: the name of the application package - :param static_url_path: can be used to specify a different path for the - static files on the web. Defaults to the name - of the `static_folder` folder. - :param static_folder: The folder with static files that is served at - ``static_url_path``. Relative to the application ``root_path`` - or an absolute path. Defaults to ``'static'``. - :param static_host: the host to use when adding the static route. - Defaults to None. Required when using ``host_matching=True`` - with a ``static_folder`` configured. - :param host_matching: set ``url_map.host_matching`` attribute. - Defaults to False. - :param subdomain_matching: consider the subdomain relative to - :data:`SERVER_NAME` when matching routes. Defaults to False. - :param template_folder: the folder that contains the templates that should - be used by the application. Defaults to - ``'templates'`` folder in the root path of the - application. - :param instance_path: An alternative instance path for the application. - By default the folder ``'instance'`` next to the - package or module is assumed to be the instance - path. - :param instance_relative_config: if set to ``True`` relative filenames - for loading the config are assumed to - be relative to the instance path instead - of the application root. - :param root_path: The path to the root of the application files. - This should only be set manually when it can't be detected - automatically, such as for namespace packages. - """ - - #: The class that is used for request objects. See :class:`~flask.Request` - #: for more information. - request_class = Request - - #: The class that is used for response objects. See - #: :class:`~flask.Response` for more information. - response_class = Response - - #: The class of the object assigned to :attr:`aborter`, created by - #: :meth:`create_aborter`. That object is called by - #: :func:`flask.abort` to raise HTTP errors, and can be - #: called directly as well. - #: - #: Defaults to :class:`werkzeug.exceptions.Aborter`. - #: - #: .. versionadded:: 2.2 - aborter_class = Aborter - - #: The class that is used for the Jinja environment. - #: - #: .. versionadded:: 0.11 - jinja_environment = Environment - - #: The class that is used for the :data:`~flask.g` instance. - #: - #: Example use cases for a custom class: - #: - #: 1. Store arbitrary attributes on flask.g. - #: 2. Add a property for lazy per-request database connectors. - #: 3. Return None instead of AttributeError on unexpected attributes. - #: 4. Raise exception if an unexpected attr is set, a "controlled" flask.g. - #: - #: In Flask 0.9 this property was called `request_globals_class` but it - #: was changed in 0.10 to :attr:`app_ctx_globals_class` because the - #: flask.g object is now application context scoped. - #: - #: .. versionadded:: 0.10 - app_ctx_globals_class = _AppCtxGlobals - - #: The class that is used for the ``config`` attribute of this app. - #: Defaults to :class:`~flask.Config`. - #: - #: Example use cases for a custom class: - #: - #: 1. Default values for certain config options. - #: 2. Access to config values through attributes in addition to keys. - #: - #: .. versionadded:: 0.11 - config_class = Config - - #: The testing flag. Set this to ``True`` to enable the test mode of - #: Flask extensions (and in the future probably also Flask itself). - #: For example this might activate test helpers that have an - #: additional runtime cost which should not be enabled by default. - #: - #: If this is enabled and PROPAGATE_EXCEPTIONS is not changed from the - #: default it's implicitly enabled. - #: - #: This attribute can also be configured from the config with the - #: ``TESTING`` configuration key. Defaults to ``False``. - testing = ConfigAttribute("TESTING") - - #: If a secret key is set, cryptographic components can use this to - #: sign cookies and other things. Set this to a complex random value - #: when you want to use the secure cookie for instance. - #: - #: This attribute can also be configured from the config with the - #: :data:`SECRET_KEY` configuration key. Defaults to ``None``. - secret_key = ConfigAttribute("SECRET_KEY") - - #: A :class:`~datetime.timedelta` which is used to set the expiration - #: date of a permanent session. The default is 31 days which makes a - #: permanent session survive for roughly one month. - #: - #: This attribute can also be configured from the config with the - #: ``PERMANENT_SESSION_LIFETIME`` configuration key. Defaults to - #: ``timedelta(days=31)`` - permanent_session_lifetime = ConfigAttribute( - "PERMANENT_SESSION_LIFETIME", get_converter=_make_timedelta - ) - - json_provider_class: type[JSONProvider] = DefaultJSONProvider - """A subclass of :class:`~flask.json.provider.JSONProvider`. An - instance is created and assigned to :attr:`app.json` when creating - the app. - - The default, :class:`~flask.json.provider.DefaultJSONProvider`, uses - Python's built-in :mod:`json` library. A different provider can use - a different JSON library. - - .. versionadded:: 2.2 - """ - - #: Options that are passed to the Jinja environment in - #: :meth:`create_jinja_environment`. Changing these options after - #: the environment is created (accessing :attr:`jinja_env`) will - #: have no effect. - #: - #: .. versionchanged:: 1.1.0 - #: This is a ``dict`` instead of an ``ImmutableDict`` to allow - #: easier configuration. - #: - jinja_options: dict = {} - - #: Default configuration parameters. - default_config = ImmutableDict( - { - "DEBUG": None, - "TESTING": False, - "PROPAGATE_EXCEPTIONS": None, - "SECRET_KEY": None, - "PERMANENT_SESSION_LIFETIME": timedelta(days=31), - "USE_X_SENDFILE": False, - "SERVER_NAME": None, - "APPLICATION_ROOT": "/", - "SESSION_COOKIE_NAME": "session", - "SESSION_COOKIE_DOMAIN": None, - "SESSION_COOKIE_PATH": None, - "SESSION_COOKIE_HTTPONLY": True, - "SESSION_COOKIE_SECURE": False, - "SESSION_COOKIE_SAMESITE": None, - "SESSION_REFRESH_EACH_REQUEST": True, - "MAX_CONTENT_LENGTH": None, - "SEND_FILE_MAX_AGE_DEFAULT": None, - "TRAP_BAD_REQUEST_ERRORS": None, - "TRAP_HTTP_EXCEPTIONS": False, - "EXPLAIN_TEMPLATE_LOADING": False, - "PREFERRED_URL_SCHEME": "http", - "TEMPLATES_AUTO_RELOAD": None, - "MAX_COOKIE_SIZE": 4093, - } - ) - - #: The rule object to use for URL rules created. This is used by - #: :meth:`add_url_rule`. Defaults to :class:`werkzeug.routing.Rule`. - #: - #: .. versionadded:: 0.7 - url_rule_class = Rule - - #: The map object to use for storing the URL rules and routing - #: configuration parameters. Defaults to :class:`werkzeug.routing.Map`. - #: - #: .. versionadded:: 1.1.0 - url_map_class = Map - - #: The :meth:`test_client` method creates an instance of this test - #: client class. Defaults to :class:`~flask.testing.FlaskClient`. - #: - #: .. versionadded:: 0.7 - test_client_class: type[FlaskClient] | None = None - - #: The :class:`~click.testing.CliRunner` subclass, by default - #: :class:`~flask.testing.FlaskCliRunner` that is used by - #: :meth:`test_cli_runner`. Its ``__init__`` method should take a - #: Flask app object as the first argument. - #: - #: .. versionadded:: 1.0 - test_cli_runner_class: type[FlaskCliRunner] | None = None - - #: the session interface to use. By default an instance of - #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here. - #: - #: .. versionadded:: 0.8 - session_interface: SessionInterface = SecureCookieSessionInterface() - - def __init__( - self, - import_name: str, - static_url_path: str | None = None, - static_folder: str | os.PathLike | None = "static", - static_host: str | None = None, - host_matching: bool = False, - subdomain_matching: bool = False, - template_folder: str | os.PathLike | None = "templates", - instance_path: str | None = None, - instance_relative_config: bool = False, - root_path: str | None = None, - ): - super().__init__( - import_name=import_name, - static_folder=static_folder, - static_url_path=static_url_path, - template_folder=template_folder, - root_path=root_path, - ) - - if instance_path is None: - instance_path = self.auto_find_instance_path() - elif not os.path.isabs(instance_path): - raise ValueError( - "If an instance path is provided it must be absolute." - " A relative path was given instead." - ) - - #: Holds the path to the instance folder. - #: - #: .. versionadded:: 0.8 - self.instance_path = instance_path - - #: The configuration dictionary as :class:`Config`. This behaves - #: exactly like a regular dictionary but supports additional methods - #: to load a config from files. - self.config = self.make_config(instance_relative_config) - - #: An instance of :attr:`aborter_class` created by - #: :meth:`make_aborter`. This is called by :func:`flask.abort` - #: to raise HTTP errors, and can be called directly as well. - #: - #: .. versionadded:: 2.2 - #: Moved from ``flask.abort``, which calls this object. - self.aborter = self.make_aborter() - - self.json: JSONProvider = self.json_provider_class(self) - """Provides access to JSON methods. Functions in ``flask.json`` - will call methods on this provider when the application context - is active. Used for handling JSON requests and responses. - - An instance of :attr:`json_provider_class`. Can be customized by - changing that attribute on a subclass, or by assigning to this - attribute afterwards. - - The default, :class:`~flask.json.provider.DefaultJSONProvider`, - uses Python's built-in :mod:`json` library. A different provider - can use a different JSON library. - - .. versionadded:: 2.2 - """ - - #: A list of functions that are called by - #: :meth:`handle_url_build_error` when :meth:`.url_for` raises a - #: :exc:`~werkzeug.routing.BuildError`. Each function is called - #: with ``error``, ``endpoint`` and ``values``. If a function - #: returns ``None`` or raises a ``BuildError``, it is skipped. - #: Otherwise, its return value is returned by ``url_for``. - #: - #: .. versionadded:: 0.9 - self.url_build_error_handlers: list[ - t.Callable[[Exception, str, dict[str, t.Any]], str] - ] = [] - - #: A list of functions that are called when the application context - #: is destroyed. Since the application context is also torn down - #: if the request ends this is the place to store code that disconnects - #: from databases. - #: - #: .. versionadded:: 0.9 - self.teardown_appcontext_funcs: list[ft.TeardownCallable] = [] - - #: A list of shell context processor functions that should be run - #: when a shell context is created. - #: - #: .. versionadded:: 0.11 - self.shell_context_processors: list[ft.ShellContextProcessorCallable] = [] - - #: Maps registered blueprint names to blueprint objects. The - #: dict retains the order the blueprints were registered in. - #: Blueprints can be registered multiple times, this dict does - #: not track how often they were attached. - #: - #: .. versionadded:: 0.7 - self.blueprints: dict[str, Blueprint] = {} - - #: a place where extensions can store application specific state. For - #: example this is where an extension could store database engines and - #: similar things. - #: - #: The key must match the name of the extension module. For example in - #: case of a "Flask-Foo" extension in `flask_foo`, the key would be - #: ``'foo'``. - #: - #: .. versionadded:: 0.7 - self.extensions: dict = {} - - #: The :class:`~werkzeug.routing.Map` for this instance. You can use - #: this to change the routing converters after the class was created - #: but before any routes are connected. Example:: - #: - #: from werkzeug.routing import BaseConverter - #: - #: class ListConverter(BaseConverter): - #: def to_python(self, value): - #: return value.split(',') - #: def to_url(self, values): - #: return ','.join(super(ListConverter, self).to_url(value) - #: for value in values) - #: - #: app = Flask(__name__) - #: app.url_map.converters['list'] = ListConverter - self.url_map = self.url_map_class() - - self.url_map.host_matching = host_matching - self.subdomain_matching = subdomain_matching - - # tracks internally if the application already handled at least one - # request. - self._got_first_request = False - - # Add a static route using the provided static_url_path, static_host, - # and static_folder if there is a configured static_folder. - # Note we do this without checking if static_folder exists. - # For one, it might be created while the server is running (e.g. during - # development). Also, Google App Engine stores static files somewhere - if self.has_static_folder: - assert ( - bool(static_host) == host_matching - ), "Invalid static_host/host_matching combination" - # Use a weakref to avoid creating a reference cycle between the app - # and the view function (see #3761). - self_ref = weakref.ref(self) - self.add_url_rule( - f"{self.static_url_path}/", - endpoint="static", - host=static_host, - view_func=lambda **kw: self_ref().send_static_file(**kw), # type: ignore # noqa: B950 - ) - - # Set the name of the Click group in case someone wants to add - # the app's commands to another CLI tool. - self.cli.name = self.name - - def _check_setup_finished(self, f_name: str) -> None: - if self._got_first_request: - raise AssertionError( - f"The setup method '{f_name}' can no longer be called" - " on the application. It has already handled its first" - " request, any changes will not be applied" - " consistently.\n" - "Make sure all imports, decorators, functions, etc." - " needed to set up the application are done before" - " running it." - ) - - @cached_property - def name(self) -> str: # type: ignore - """The name of the application. This is usually the import name - with the difference that it's guessed from the run file if the - import name is main. This name is used as a display name when - Flask needs the name of the application. It can be set and overridden - to change the value. - - .. versionadded:: 0.8 - """ - if self.import_name == "__main__": - fn = getattr(sys.modules["__main__"], "__file__", None) - if fn is None: - return "__main__" - return os.path.splitext(os.path.basename(fn))[0] - return self.import_name - - @cached_property - def logger(self) -> logging.Logger: - """A standard Python :class:`~logging.Logger` for the app, with - the same name as :attr:`name`. - - In debug mode, the logger's :attr:`~logging.Logger.level` will - be set to :data:`~logging.DEBUG`. - - If there are no handlers configured, a default handler will be - added. See :doc:`/logging` for more information. - - .. versionchanged:: 1.1.0 - The logger takes the same name as :attr:`name` rather than - hard-coding ``"flask.app"``. - - .. versionchanged:: 1.0.0 - Behavior was simplified. The logger is always named - ``"flask.app"``. The level is only set during configuration, - it doesn't check ``app.debug`` each time. Only one format is - used, not different ones depending on ``app.debug``. No - handlers are removed, and a handler is only added if no - handlers are already configured. - - .. versionadded:: 0.3 - """ - return create_logger(self) - - @cached_property - def jinja_env(self) -> Environment: - """The Jinja environment used to load templates. - - The environment is created the first time this property is - accessed. Changing :attr:`jinja_options` after that will have no - effect. - """ - return self.create_jinja_environment() - - @property - def got_first_request(self) -> bool: - """This attribute is set to ``True`` if the application started - handling the first request. - - .. deprecated:: 2.3 - Will be removed in Flask 2.4. - - .. versionadded:: 0.8 - """ - import warnings - - warnings.warn( - "'got_first_request' is deprecated and will be removed in Flask 2.4.", - DeprecationWarning, - stacklevel=2, - ) - return self._got_first_request - - def make_config(self, instance_relative: bool = False) -> Config: - """Used to create the config attribute by the Flask constructor. - The `instance_relative` parameter is passed in from the constructor - of Flask (there named `instance_relative_config`) and indicates if - the config should be relative to the instance path or the root path - of the application. - - .. versionadded:: 0.8 - """ - root_path = self.root_path - if instance_relative: - root_path = self.instance_path - defaults = dict(self.default_config) - defaults["DEBUG"] = get_debug_flag() - return self.config_class(root_path, defaults) - - def make_aborter(self) -> Aborter: - """Create the object to assign to :attr:`aborter`. That object - is called by :func:`flask.abort` to raise HTTP errors, and can - be called directly as well. - - By default, this creates an instance of :attr:`aborter_class`, - which defaults to :class:`werkzeug.exceptions.Aborter`. - - .. versionadded:: 2.2 - """ - return self.aborter_class() - - def auto_find_instance_path(self) -> str: - """Tries to locate the instance path if it was not provided to the - constructor of the application class. It will basically calculate - the path to a folder named ``instance`` next to your main file or - the package. - - .. versionadded:: 0.8 - """ - prefix, package_path = find_package(self.import_name) - if prefix is None: - return os.path.join(package_path, "instance") - return os.path.join(prefix, "var", f"{self.name}-instance") - - def open_instance_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: - """Opens a resource from the application's instance folder - (:attr:`instance_path`). Otherwise works like - :meth:`open_resource`. Instance resources can also be opened for - writing. - - :param resource: the name of the resource. To access resources within - subfolders use forward slashes as separator. - :param mode: resource file opening mode, default is 'rb'. - """ - return open(os.path.join(self.instance_path, resource), mode) - - def create_jinja_environment(self) -> Environment: - """Create the Jinja environment based on :attr:`jinja_options` - and the various Jinja-related methods of the app. Changing - :attr:`jinja_options` after this will have no effect. Also adds - Flask-related globals and filters to the environment. - - .. versionchanged:: 0.11 - ``Environment.auto_reload`` set in accordance with - ``TEMPLATES_AUTO_RELOAD`` configuration option. - - .. versionadded:: 0.5 - """ - options = dict(self.jinja_options) - - if "autoescape" not in options: - options["autoescape"] = self.select_jinja_autoescape - - if "auto_reload" not in options: - auto_reload = self.config["TEMPLATES_AUTO_RELOAD"] - - if auto_reload is None: - auto_reload = self.debug - - options["auto_reload"] = auto_reload - - rv = self.jinja_environment(self, **options) - rv.globals.update( - url_for=self.url_for, - get_flashed_messages=get_flashed_messages, - config=self.config, - # request, session and g are normally added with the - # context processor for efficiency reasons but for imported - # templates we also want the proxies in there. - request=request, - session=session, - g=g, - ) - rv.policies["json.dumps_function"] = self.json.dumps - return rv - - def create_global_jinja_loader(self) -> DispatchingJinjaLoader: - """Creates the loader for the Jinja2 environment. Can be used to - override just the loader and keeping the rest unchanged. It's - discouraged to override this function. Instead one should override - the :meth:`jinja_loader` function instead. - - The global loader dispatches between the loaders of the application - and the individual blueprints. - - .. versionadded:: 0.7 - """ - return DispatchingJinjaLoader(self) - - def select_jinja_autoescape(self, filename: str) -> bool: - """Returns ``True`` if autoescaping should be active for the given - template name. If no template name is given, returns `True`. - - .. versionchanged:: 2.2 - Autoescaping is now enabled by default for ``.svg`` files. - - .. versionadded:: 0.5 - """ - if filename is None: - return True - return filename.endswith((".html", ".htm", ".xml", ".xhtml", ".svg")) - - def update_template_context(self, context: dict) -> None: - """Update the template context with some commonly used variables. - This injects request, session, config and g into the template - context as well as everything template context processors want - to inject. Note that the as of Flask 0.6, the original values - in the context will not be overridden if a context processor - decides to return a value with the same key. - - :param context: the context as a dictionary that is updated in place - to add extra variables. - """ - names: t.Iterable[str | None] = (None,) - - # A template may be rendered outside a request context. - if request: - names = chain(names, reversed(request.blueprints)) - - # The values passed to render_template take precedence. Keep a - # copy to re-apply after all context functions. - orig_ctx = context.copy() - - for name in names: - if name in self.template_context_processors: - for func in self.template_context_processors[name]: - context.update(func()) - - context.update(orig_ctx) - - def make_shell_context(self) -> dict: - """Returns the shell context for an interactive shell for this - application. This runs all the registered shell context - processors. - - .. versionadded:: 0.11 - """ - rv = {"app": self, "g": g} - for processor in self.shell_context_processors: - rv.update(processor()) - return rv - - @property - def debug(self) -> bool: - """Whether debug mode is enabled. When using ``flask run`` to start the - development server, an interactive debugger will be shown for unhandled - exceptions, and the server will be reloaded when code changes. This maps to the - :data:`DEBUG` config key. It may not behave as expected if set late. - - **Do not enable debug mode when deploying in production.** - - Default: ``False`` - """ - return self.config["DEBUG"] - - @debug.setter - def debug(self, value: bool) -> None: - self.config["DEBUG"] = value - - if self.config["TEMPLATES_AUTO_RELOAD"] is None: - self.jinja_env.auto_reload = value - - def run( - self, - host: str | None = None, - port: int | None = None, - debug: bool | None = None, - load_dotenv: bool = True, - **options: t.Any, - ) -> None: - """Runs the application on a local development server. - - Do not use ``run()`` in a production setting. It is not intended to - meet security and performance requirements for a production server. - Instead, see :doc:`/deploying/index` for WSGI server recommendations. - - If the :attr:`debug` flag is set the server will automatically reload - for code changes and show a debugger in case an exception happened. - - If you want to run the application in debug mode, but disable the - code execution on the interactive debugger, you can pass - ``use_evalex=False`` as parameter. This will keep the debugger's - traceback screen active, but disable code execution. - - It is not recommended to use this function for development with - automatic reloading as this is badly supported. Instead you should - be using the :command:`flask` command line script's ``run`` support. - - .. admonition:: Keep in Mind - - Flask will suppress any server error with a generic error page - unless it is in debug mode. As such to enable just the - interactive debugger without the code reloading, you have to - invoke :meth:`run` with ``debug=True`` and ``use_reloader=False``. - Setting ``use_debugger`` to ``True`` without being in debug mode - won't catch any exceptions because there won't be any to - catch. - - :param host: the hostname to listen on. Set this to ``'0.0.0.0'`` to - have the server available externally as well. Defaults to - ``'127.0.0.1'`` or the host in the ``SERVER_NAME`` config variable - if present. - :param port: the port of the webserver. Defaults to ``5000`` or the - port defined in the ``SERVER_NAME`` config variable if present. - :param debug: if given, enable or disable debug mode. See - :attr:`debug`. - :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` - files to set environment variables. Will also change the working - directory to the directory containing the first file found. - :param options: the options to be forwarded to the underlying Werkzeug - server. See :func:`werkzeug.serving.run_simple` for more - information. - - .. versionchanged:: 1.0 - If installed, python-dotenv will be used to load environment - variables from :file:`.env` and :file:`.flaskenv` files. - - The :envvar:`FLASK_DEBUG` environment variable will override :attr:`debug`. - - Threaded mode is enabled by default. - - .. versionchanged:: 0.10 - The default port is now picked from the ``SERVER_NAME`` - variable. - """ - # Ignore this call so that it doesn't start another server if - # the 'flask run' command is used. - if os.environ.get("FLASK_RUN_FROM_CLI") == "true": - if not is_running_from_reloader(): - click.secho( - " * Ignoring a call to 'app.run()' that would block" - " the current 'flask' CLI command.\n" - " Only call 'app.run()' in an 'if __name__ ==" - ' "__main__"\' guard.', - fg="red", - ) - - return - - if get_load_dotenv(load_dotenv): - cli.load_dotenv() - - # if set, env var overrides existing value - if "FLASK_DEBUG" in os.environ: - self.debug = get_debug_flag() - - # debug passed to method overrides all other sources - if debug is not None: - self.debug = bool(debug) - - server_name = self.config.get("SERVER_NAME") - sn_host = sn_port = None - - if server_name: - sn_host, _, sn_port = server_name.partition(":") - - if not host: - if sn_host: - host = sn_host - else: - host = "127.0.0.1" - - if port or port == 0: - port = int(port) - elif sn_port: - port = int(sn_port) - else: - port = 5000 - - options.setdefault("use_reloader", self.debug) - options.setdefault("use_debugger", self.debug) - options.setdefault("threaded", True) - - cli.show_server_banner(self.debug, self.name) - - from werkzeug.serving import run_simple - - try: - run_simple(t.cast(str, host), port, self, **options) - finally: - # reset the first request information if the development server - # reset normally. This makes it possible to restart the server - # without reloader and that stuff from an interactive shell. - self._got_first_request = False - - def test_client(self, use_cookies: bool = True, **kwargs: t.Any) -> FlaskClient: - """Creates a test client for this application. For information - about unit testing head over to :doc:`/testing`. - - Note that if you are testing for assertions or exceptions in your - application code, you must set ``app.testing = True`` in order for the - exceptions to propagate to the test client. Otherwise, the exception - will be handled by the application (not visible to the test client) and - the only indication of an AssertionError or other exception will be a - 500 status code response to the test client. See the :attr:`testing` - attribute. For example:: - - app.testing = True - client = app.test_client() - - The test client can be used in a ``with`` block to defer the closing down - of the context until the end of the ``with`` block. This is useful if - you want to access the context locals for testing:: - - with app.test_client() as c: - rv = c.get('/?vodka=42') - assert request.args['vodka'] == '42' - - Additionally, you may pass optional keyword arguments that will then - be passed to the application's :attr:`test_client_class` constructor. - For example:: - - from flask.testing import FlaskClient - - class CustomClient(FlaskClient): - def __init__(self, *args, **kwargs): - self._authentication = kwargs.pop("authentication") - super(CustomClient,self).__init__( *args, **kwargs) - - app.test_client_class = CustomClient - client = app.test_client(authentication='Basic ....') - - See :class:`~flask.testing.FlaskClient` for more information. - - .. versionchanged:: 0.4 - added support for ``with`` block usage for the client. - - .. versionadded:: 0.7 - The `use_cookies` parameter was added as well as the ability - to override the client to be used by setting the - :attr:`test_client_class` attribute. - - .. versionchanged:: 0.11 - Added `**kwargs` to support passing additional keyword arguments to - the constructor of :attr:`test_client_class`. - """ - cls = self.test_client_class - if cls is None: - from .testing import FlaskClient as cls - return cls( # type: ignore - self, self.response_class, use_cookies=use_cookies, **kwargs - ) - - def test_cli_runner(self, **kwargs: t.Any) -> FlaskCliRunner: - """Create a CLI runner for testing CLI commands. - See :ref:`testing-cli`. - - Returns an instance of :attr:`test_cli_runner_class`, by default - :class:`~flask.testing.FlaskCliRunner`. The Flask app object is - passed as the first argument. - - .. versionadded:: 1.0 - """ - cls = self.test_cli_runner_class - - if cls is None: - from .testing import FlaskCliRunner as cls - - return cls(self, **kwargs) # type: ignore - - @setupmethod - def register_blueprint(self, blueprint: Blueprint, **options: t.Any) -> None: - """Register a :class:`~flask.Blueprint` on the application. Keyword - arguments passed to this method will override the defaults set on the - blueprint. - - Calls the blueprint's :meth:`~flask.Blueprint.register` method after - recording the blueprint in the application's :attr:`blueprints`. - - :param blueprint: The blueprint to register. - :param url_prefix: Blueprint routes will be prefixed with this. - :param subdomain: Blueprint routes will match on this subdomain. - :param url_defaults: Blueprint routes will use these default values for - view arguments. - :param options: Additional keyword arguments are passed to - :class:`~flask.blueprints.BlueprintSetupState`. They can be - accessed in :meth:`~flask.Blueprint.record` callbacks. - - .. versionchanged:: 2.0.1 - The ``name`` option can be used to change the (pre-dotted) - name the blueprint is registered with. This allows the same - blueprint to be registered multiple times with unique names - for ``url_for``. - - .. versionadded:: 0.7 - """ - blueprint.register(self, options) - - def iter_blueprints(self) -> t.ValuesView[Blueprint]: - """Iterates over all blueprints by the order they were registered. - - .. versionadded:: 0.11 - """ - return self.blueprints.values() - - @setupmethod - def add_url_rule( - self, - rule: str, - endpoint: str | None = None, - view_func: ft.RouteCallable | None = None, - provide_automatic_options: bool | None = None, - **options: t.Any, - ) -> None: - if endpoint is None: - endpoint = _endpoint_from_view_func(view_func) # type: ignore - options["endpoint"] = endpoint - methods = options.pop("methods", None) - - # if the methods are not given and the view_func object knows its - # methods we can use that instead. If neither exists, we go with - # a tuple of only ``GET`` as default. - if methods is None: - methods = getattr(view_func, "methods", None) or ("GET",) - if isinstance(methods, str): - raise TypeError( - "Allowed methods must be a list of strings, for" - ' example: @app.route(..., methods=["POST"])' - ) - methods = {item.upper() for item in methods} - - # Methods that should always be added - required_methods = set(getattr(view_func, "required_methods", ())) - - # starting with Flask 0.8 the view_func object can disable and - # force-enable the automatic options handling. - if provide_automatic_options is None: - provide_automatic_options = getattr( - view_func, "provide_automatic_options", None - ) - - if provide_automatic_options is None: - if "OPTIONS" not in methods: - provide_automatic_options = True - required_methods.add("OPTIONS") - else: - provide_automatic_options = False - - # Add the required methods now. - methods |= required_methods - - rule = self.url_rule_class(rule, methods=methods, **options) - rule.provide_automatic_options = provide_automatic_options # type: ignore - - self.url_map.add(rule) - if view_func is not None: - old_func = self.view_functions.get(endpoint) - if old_func is not None and old_func != view_func: - raise AssertionError( - "View function mapping is overwriting an existing" - f" endpoint function: {endpoint}" - ) - self.view_functions[endpoint] = view_func - - @setupmethod - def template_filter( - self, name: str | None = None - ) -> t.Callable[[T_template_filter], T_template_filter]: - """A decorator that is used to register custom template filter. - You can specify a name for the filter, otherwise the function - name will be used. Example:: - - @app.template_filter() - def reverse(s): - return s[::-1] - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - - def decorator(f: T_template_filter) -> T_template_filter: - self.add_template_filter(f, name=name) - return f - - return decorator - - @setupmethod - def add_template_filter( - self, f: ft.TemplateFilterCallable, name: str | None = None - ) -> None: - """Register a custom template filter. Works exactly like the - :meth:`template_filter` decorator. - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - self.jinja_env.filters[name or f.__name__] = f - - @setupmethod - def template_test( - self, name: str | None = None - ) -> t.Callable[[T_template_test], T_template_test]: - """A decorator that is used to register custom template test. - You can specify a name for the test, otherwise the function - name will be used. Example:: - - @app.template_test() - def is_prime(n): - if n == 2: - return True - for i in range(2, int(math.ceil(math.sqrt(n))) + 1): - if n % i == 0: - return False - return True - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - - def decorator(f: T_template_test) -> T_template_test: - self.add_template_test(f, name=name) - return f - - return decorator - - @setupmethod - def add_template_test( - self, f: ft.TemplateTestCallable, name: str | None = None - ) -> None: - """Register a custom template test. Works exactly like the - :meth:`template_test` decorator. - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - self.jinja_env.tests[name or f.__name__] = f - - @setupmethod - def template_global( - self, name: str | None = None - ) -> t.Callable[[T_template_global], T_template_global]: - """A decorator that is used to register a custom template global function. - You can specify a name for the global function, otherwise the function - name will be used. Example:: - - @app.template_global() - def double(n): - return 2 * n - - .. versionadded:: 0.10 - - :param name: the optional name of the global function, otherwise the - function name will be used. - """ - - def decorator(f: T_template_global) -> T_template_global: - self.add_template_global(f, name=name) - return f - - return decorator - - @setupmethod - def add_template_global( - self, f: ft.TemplateGlobalCallable, name: str | None = None - ) -> None: - """Register a custom template global function. Works exactly like the - :meth:`template_global` decorator. - - .. versionadded:: 0.10 - - :param name: the optional name of the global function, otherwise the - function name will be used. - """ - self.jinja_env.globals[name or f.__name__] = f - - @setupmethod - def teardown_appcontext(self, f: T_teardown) -> T_teardown: - """Registers a function to be called when the application - context is popped. The application context is typically popped - after the request context for each request, at the end of CLI - commands, or after a manually pushed context ends. - - .. code-block:: python - - with app.app_context(): - ... - - When the ``with`` block exits (or ``ctx.pop()`` is called), the - teardown functions are called just before the app context is - made inactive. Since a request context typically also manages an - application context it would also be called when you pop a - request context. - - When a teardown function was called because of an unhandled - exception it will be passed an error object. If an - :meth:`errorhandler` is registered, it will handle the exception - and the teardown will not receive it. - - Teardown functions must avoid raising exceptions. If they - execute code that might fail they must surround that code with a - ``try``/``except`` block and log any errors. - - The return values of teardown functions are ignored. - - .. versionadded:: 0.9 - """ - self.teardown_appcontext_funcs.append(f) - return f - - @setupmethod - def shell_context_processor( - self, f: T_shell_context_processor - ) -> T_shell_context_processor: - """Registers a shell context processor function. - - .. versionadded:: 0.11 - """ - self.shell_context_processors.append(f) - return f - - def _find_error_handler(self, e: Exception) -> ft.ErrorHandlerCallable | None: - """Return a registered error handler for an exception in this order: - blueprint handler for a specific code, app handler for a specific code, - blueprint handler for an exception class, app handler for an exception - class, or ``None`` if a suitable handler is not found. - """ - exc_class, code = self._get_exc_class_and_code(type(e)) - names = (*request.blueprints, None) - - for c in (code, None) if code is not None else (None,): - for name in names: - handler_map = self.error_handler_spec[name][c] - - if not handler_map: - continue - - for cls in exc_class.__mro__: - handler = handler_map.get(cls) - - if handler is not None: - return handler - return None - - def handle_http_exception( - self, e: HTTPException - ) -> HTTPException | ft.ResponseReturnValue: - """Handles an HTTP exception. By default this will invoke the - registered error handlers and fall back to returning the - exception as response. - - .. versionchanged:: 1.0.3 - ``RoutingException``, used internally for actions such as - slash redirects during routing, is not passed to error - handlers. - - .. versionchanged:: 1.0 - Exceptions are looked up by code *and* by MRO, so - ``HTTPException`` subclasses can be handled with a catch-all - handler for the base ``HTTPException``. - - .. versionadded:: 0.3 - """ - # Proxy exceptions don't have error codes. We want to always return - # those unchanged as errors - if e.code is None: - return e - - # RoutingExceptions are used internally to trigger routing - # actions, such as slash redirects raising RequestRedirect. They - # are not raised or handled in user code. - if isinstance(e, RoutingException): - return e - - handler = self._find_error_handler(e) - if handler is None: - return e - return self.ensure_sync(handler)(e) - - def trap_http_exception(self, e: Exception) -> bool: - """Checks if an HTTP exception should be trapped or not. By default - this will return ``False`` for all exceptions except for a bad request - key error if ``TRAP_BAD_REQUEST_ERRORS`` is set to ``True``. It - also returns ``True`` if ``TRAP_HTTP_EXCEPTIONS`` is set to ``True``. - - This is called for all HTTP exceptions raised by a view function. - If it returns ``True`` for any exception the error handler for this - exception is not called and it shows up as regular exception in the - traceback. This is helpful for debugging implicitly raised HTTP - exceptions. - - .. versionchanged:: 1.0 - Bad request errors are not trapped by default in debug mode. - - .. versionadded:: 0.8 - """ - if self.config["TRAP_HTTP_EXCEPTIONS"]: - return True - - trap_bad_request = self.config["TRAP_BAD_REQUEST_ERRORS"] - - # if unset, trap key errors in debug mode - if ( - trap_bad_request is None - and self.debug - and isinstance(e, BadRequestKeyError) - ): - return True - - if trap_bad_request: - return isinstance(e, BadRequest) - - return False - - def handle_user_exception( - self, e: Exception - ) -> HTTPException | ft.ResponseReturnValue: - """This method is called whenever an exception occurs that - should be handled. A special case is :class:`~werkzeug - .exceptions.HTTPException` which is forwarded to the - :meth:`handle_http_exception` method. This function will either - return a response value or reraise the exception with the same - traceback. - - .. versionchanged:: 1.0 - Key errors raised from request data like ``form`` show the - bad key in debug mode rather than a generic bad request - message. - - .. versionadded:: 0.7 - """ - if isinstance(e, BadRequestKeyError) and ( - self.debug or self.config["TRAP_BAD_REQUEST_ERRORS"] - ): - e.show_exception = True - - if isinstance(e, HTTPException) and not self.trap_http_exception(e): - return self.handle_http_exception(e) - - handler = self._find_error_handler(e) - - if handler is None: - raise - - return self.ensure_sync(handler)(e) - - def handle_exception(self, e: Exception) -> Response: - """Handle an exception that did not have an error handler - associated with it, or that was raised from an error handler. - This always causes a 500 ``InternalServerError``. - - Always sends the :data:`got_request_exception` signal. - - If :data:`PROPAGATE_EXCEPTIONS` is ``True``, such as in debug - mode, the error will be re-raised so that the debugger can - display it. Otherwise, the original exception is logged, and - an :exc:`~werkzeug.exceptions.InternalServerError` is returned. - - If an error handler is registered for ``InternalServerError`` or - ``500``, it will be used. For consistency, the handler will - always receive the ``InternalServerError``. The original - unhandled exception is available as ``e.original_exception``. - - .. versionchanged:: 1.1.0 - Always passes the ``InternalServerError`` instance to the - handler, setting ``original_exception`` to the unhandled - error. - - .. versionchanged:: 1.1.0 - ``after_request`` functions and other finalization is done - even for the default 500 response when there is no handler. - - .. versionadded:: 0.3 - """ - exc_info = sys.exc_info() - got_request_exception.send(self, _async_wrapper=self.ensure_sync, exception=e) - propagate = self.config["PROPAGATE_EXCEPTIONS"] - - if propagate is None: - propagate = self.testing or self.debug - - if propagate: - # Re-raise if called with an active exception, otherwise - # raise the passed in exception. - if exc_info[1] is e: - raise - - raise e - - self.log_exception(exc_info) - server_error: InternalServerError | ft.ResponseReturnValue - server_error = InternalServerError(original_exception=e) - handler = self._find_error_handler(server_error) - - if handler is not None: - server_error = self.ensure_sync(handler)(server_error) - - return self.finalize_request(server_error, from_error_handler=True) - - def log_exception( - self, - exc_info: (tuple[type, BaseException, TracebackType] | tuple[None, None, None]), - ) -> None: - """Logs an exception. This is called by :meth:`handle_exception` - if debugging is disabled and right before the handler is called. - The default implementation logs the exception as error on the - :attr:`logger`. - - .. versionadded:: 0.8 - """ - self.logger.error( - f"Exception on {request.path} [{request.method}]", exc_info=exc_info - ) - - def raise_routing_exception(self, request: Request) -> t.NoReturn: - """Intercept routing exceptions and possibly do something else. - - In debug mode, intercept a routing redirect and replace it with - an error if the body will be discarded. - - With modern Werkzeug this shouldn't occur, since it now uses a - 308 status which tells the browser to resend the method and - body. - - .. versionchanged:: 2.1 - Don't intercept 307 and 308 redirects. - - :meta private: - :internal: - """ - if ( - not self.debug - or not isinstance(request.routing_exception, RequestRedirect) - or request.routing_exception.code in {307, 308} - or request.method in {"GET", "HEAD", "OPTIONS"} - ): - raise request.routing_exception # type: ignore - - from .debughelpers import FormDataRoutingRedirect - - raise FormDataRoutingRedirect(request) - - def dispatch_request(self) -> ft.ResponseReturnValue: - """Does the request dispatching. Matches the URL and returns the - return value of the view or error handler. This does not have to - be a response object. In order to convert the return value to a - proper response object, call :func:`make_response`. - - .. versionchanged:: 0.7 - This no longer does the exception handling, this code was - moved to the new :meth:`full_dispatch_request`. - """ - req = request_ctx.request - if req.routing_exception is not None: - self.raise_routing_exception(req) - rule: Rule = req.url_rule # type: ignore[assignment] - # if we provide automatic options for this URL and the - # request came with the OPTIONS method, reply automatically - if ( - getattr(rule, "provide_automatic_options", False) - and req.method == "OPTIONS" - ): - return self.make_default_options_response() - # otherwise dispatch to the handler for that endpoint - view_args: dict[str, t.Any] = req.view_args # type: ignore[assignment] - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) - - def full_dispatch_request(self) -> Response: - """Dispatches the request and on top of that performs request - pre and postprocessing as well as HTTP exception catching and - error handling. - - .. versionadded:: 0.7 - """ - self._got_first_request = True - - try: - request_started.send(self, _async_wrapper=self.ensure_sync) - rv = self.preprocess_request() - if rv is None: - rv = self.dispatch_request() - except Exception as e: - rv = self.handle_user_exception(e) - return self.finalize_request(rv) - - def finalize_request( - self, - rv: ft.ResponseReturnValue | HTTPException, - from_error_handler: bool = False, - ) -> Response: - """Given the return value from a view function this finalizes - the request by converting it into a response and invoking the - postprocessing functions. This is invoked for both normal - request dispatching as well as error handlers. - - Because this means that it might be called as a result of a - failure a special safe mode is available which can be enabled - with the `from_error_handler` flag. If enabled, failures in - response processing will be logged and otherwise ignored. - - :internal: - """ - response = self.make_response(rv) - try: - response = self.process_response(response) - request_finished.send( - self, _async_wrapper=self.ensure_sync, response=response - ) - except Exception: - if not from_error_handler: - raise - self.logger.exception( - "Request finalizing failed with an error while handling an error" - ) - return response - - def make_default_options_response(self) -> Response: - """This method is called to create the default ``OPTIONS`` response. - This can be changed through subclassing to change the default - behavior of ``OPTIONS`` responses. - - .. versionadded:: 0.7 - """ - adapter = request_ctx.url_adapter - methods = adapter.allowed_methods() # type: ignore[union-attr] - rv = self.response_class() - rv.allow.update(methods) - return rv - - def should_ignore_error(self, error: BaseException | None) -> bool: - """This is called to figure out if an error should be ignored - or not as far as the teardown system is concerned. If this - function returns ``True`` then the teardown handlers will not be - passed the error. - - .. versionadded:: 0.10 - """ - return False - - def ensure_sync(self, func: t.Callable) -> t.Callable: - """Ensure that the function is synchronous for WSGI workers. - Plain ``def`` functions are returned as-is. ``async def`` - functions are wrapped to run and wait for the response. - - Override this method to change how the app runs async views. - - .. versionadded:: 2.0 - """ - if iscoroutinefunction(func): - return self.async_to_sync(func) - - return func - - def async_to_sync( - self, func: t.Callable[..., t.Coroutine] - ) -> t.Callable[..., t.Any]: - """Return a sync function that will run the coroutine function. - - .. code-block:: python - - result = app.async_to_sync(func)(*args, **kwargs) - - Override this method to change how the app converts async code - to be synchronously callable. - - .. versionadded:: 2.0 - """ - try: - from asgiref.sync import async_to_sync as asgiref_async_to_sync - except ImportError: - raise RuntimeError( - "Install Flask with the 'async' extra in order to use async views." - ) from None - - return asgiref_async_to_sync(func) - - def url_for( - self, - endpoint: str, - *, - _anchor: str | None = None, - _method: str | None = None, - _scheme: str | None = None, - _external: bool | None = None, - **values: t.Any, - ) -> str: - """Generate a URL to the given endpoint with the given values. - - This is called by :func:`flask.url_for`, and can be called - directly as well. - - An *endpoint* is the name of a URL rule, usually added with - :meth:`@app.route() `, and usually the same name as the - view function. A route defined in a :class:`~flask.Blueprint` - will prepend the blueprint's name separated by a ``.`` to the - endpoint. - - In some cases, such as email messages, you want URLs to include - the scheme and domain, like ``https://example.com/hello``. When - not in an active request, URLs will be external by default, but - this requires setting :data:`SERVER_NAME` so Flask knows what - domain to use. :data:`APPLICATION_ROOT` and - :data:`PREFERRED_URL_SCHEME` should also be configured as - needed. This config is only used when not in an active request. - - Functions can be decorated with :meth:`url_defaults` to modify - keyword arguments before the URL is built. - - If building fails for some reason, such as an unknown endpoint - or incorrect values, the app's :meth:`handle_url_build_error` - method is called. If that returns a string, that is returned, - otherwise a :exc:`~werkzeug.routing.BuildError` is raised. - - :param endpoint: The endpoint name associated with the URL to - generate. If this starts with a ``.``, the current blueprint - name (if any) will be used. - :param _anchor: If given, append this as ``#anchor`` to the URL. - :param _method: If given, generate the URL associated with this - method for the endpoint. - :param _scheme: If given, the URL will have this scheme if it - is external. - :param _external: If given, prefer the URL to be internal - (False) or require it to be external (True). External URLs - include the scheme and domain. When not in an active - request, URLs are external by default. - :param values: Values to use for the variable parts of the URL - rule. Unknown keys are appended as query string arguments, - like ``?a=b&c=d``. - - .. versionadded:: 2.2 - Moved from ``flask.url_for``, which calls this method. - """ - req_ctx = _cv_request.get(None) - - if req_ctx is not None: - url_adapter = req_ctx.url_adapter - blueprint_name = req_ctx.request.blueprint - - # If the endpoint starts with "." and the request matches a - # blueprint, the endpoint is relative to the blueprint. - if endpoint[:1] == ".": - if blueprint_name is not None: - endpoint = f"{blueprint_name}{endpoint}" - else: - endpoint = endpoint[1:] - - # When in a request, generate a URL without scheme and - # domain by default, unless a scheme is given. - if _external is None: - _external = _scheme is not None - else: - app_ctx = _cv_app.get(None) - - # If called by helpers.url_for, an app context is active, - # use its url_adapter. Otherwise, app.url_for was called - # directly, build an adapter. - if app_ctx is not None: - url_adapter = app_ctx.url_adapter - else: - url_adapter = self.create_url_adapter(None) - - if url_adapter is None: - raise RuntimeError( - "Unable to build URLs outside an active request" - " without 'SERVER_NAME' configured. Also configure" - " 'APPLICATION_ROOT' and 'PREFERRED_URL_SCHEME' as" - " needed." - ) - - # When outside a request, generate a URL with scheme and - # domain by default. - if _external is None: - _external = True - - # It is an error to set _scheme when _external=False, in order - # to avoid accidental insecure URLs. - if _scheme is not None and not _external: - raise ValueError("When specifying '_scheme', '_external' must be True.") - - self.inject_url_defaults(endpoint, values) - - try: - rv = url_adapter.build( # type: ignore[union-attr] - endpoint, - values, - method=_method, - url_scheme=_scheme, - force_external=_external, - ) - except BuildError as error: - values.update( - _anchor=_anchor, _method=_method, _scheme=_scheme, _external=_external - ) - return self.handle_url_build_error(error, endpoint, values) - - if _anchor is not None: - _anchor = _url_quote(_anchor, safe="%!#$&'()*+,/:;=?@") - rv = f"{rv}#{_anchor}" - - return rv - - def redirect(self, location: str, code: int = 302) -> BaseResponse: - """Create a redirect response object. - - This is called by :func:`flask.redirect`, and can be called - directly as well. - - :param location: The URL to redirect to. - :param code: The status code for the redirect. - - .. versionadded:: 2.2 - Moved from ``flask.redirect``, which calls this method. - """ - return _wz_redirect(location, code=code, Response=self.response_class) - - def make_response(self, rv: ft.ResponseReturnValue) -> Response: - """Convert the return value from a view function to an instance of - :attr:`response_class`. - - :param rv: the return value from the view function. The view function - must return a response. Returning ``None``, or the view ending - without returning, is not allowed. The following types are allowed - for ``view_rv``: - - ``str`` - A response object is created with the string encoded to UTF-8 - as the body. - - ``bytes`` - A response object is created with the bytes as the body. - - ``dict`` - A dictionary that will be jsonify'd before being returned. - - ``list`` - A list that will be jsonify'd before being returned. - - ``generator`` or ``iterator`` - A generator that returns ``str`` or ``bytes`` to be - streamed as the response. - - ``tuple`` - Either ``(body, status, headers)``, ``(body, status)``, or - ``(body, headers)``, where ``body`` is any of the other types - allowed here, ``status`` is a string or an integer, and - ``headers`` is a dictionary or a list of ``(key, value)`` - tuples. If ``body`` is a :attr:`response_class` instance, - ``status`` overwrites the exiting value and ``headers`` are - extended. - - :attr:`response_class` - The object is returned unchanged. - - other :class:`~werkzeug.wrappers.Response` class - The object is coerced to :attr:`response_class`. - - :func:`callable` - The function is called as a WSGI application. The result is - used to create a response object. - - .. versionchanged:: 2.2 - A generator will be converted to a streaming response. - A list will be converted to a JSON response. - - .. versionchanged:: 1.1 - A dict will be converted to a JSON response. - - .. versionchanged:: 0.9 - Previously a tuple was interpreted as the arguments for the - response object. - """ - - status = headers = None - - # unpack tuple returns - if isinstance(rv, tuple): - len_rv = len(rv) - - # a 3-tuple is unpacked directly - if len_rv == 3: - rv, status, headers = rv # type: ignore[misc] - # decide if a 2-tuple has status or headers - elif len_rv == 2: - if isinstance(rv[1], (Headers, dict, tuple, list)): - rv, headers = rv - else: - rv, status = rv # type: ignore[assignment,misc] - # other sized tuples are not allowed - else: - raise TypeError( - "The view function did not return a valid response tuple." - " The tuple must have the form (body, status, headers)," - " (body, status), or (body, headers)." - ) - - # the body must not be None - if rv is None: - raise TypeError( - f"The view function for {request.endpoint!r} did not" - " return a valid response. The function either returned" - " None or ended without a return statement." - ) - - # make sure the body is an instance of the response class - if not isinstance(rv, self.response_class): - if isinstance(rv, (str, bytes, bytearray)) or isinstance(rv, _abc_Iterator): - # let the response class set the status and headers instead of - # waiting to do it manually, so that the class can handle any - # special logic - rv = self.response_class( - rv, - status=status, - headers=headers, # type: ignore[arg-type] - ) - status = headers = None - elif isinstance(rv, (dict, list)): - rv = self.json.response(rv) - elif isinstance(rv, BaseResponse) or callable(rv): - # evaluate a WSGI callable, or coerce a different response - # class to the correct type - try: - rv = self.response_class.force_type( - rv, request.environ # type: ignore[arg-type] - ) - except TypeError as e: - raise TypeError( - f"{e}\nThe view function did not return a valid" - " response. The return type must be a string," - " dict, list, tuple with headers or status," - " Response instance, or WSGI callable, but it" - f" was a {type(rv).__name__}." - ).with_traceback(sys.exc_info()[2]) from None - else: - raise TypeError( - "The view function did not return a valid" - " response. The return type must be a string," - " dict, list, tuple with headers or status," - " Response instance, or WSGI callable, but it was a" - f" {type(rv).__name__}." - ) - - rv = t.cast(Response, rv) - # prefer the status if it was provided - if status is not None: - if isinstance(status, (str, bytes, bytearray)): - rv.status = status - else: - rv.status_code = status - - # extend existing headers with provided headers - if headers: - rv.headers.update(headers) # type: ignore[arg-type] - - return rv - - def create_url_adapter(self, request: Request | None) -> MapAdapter | None: - """Creates a URL adapter for the given request. The URL adapter - is created at a point where the request context is not yet set - up so the request is passed explicitly. - - .. versionadded:: 0.6 - - .. versionchanged:: 0.9 - This can now also be called without a request object when the - URL adapter is created for the application context. - - .. versionchanged:: 1.0 - :data:`SERVER_NAME` no longer implicitly enables subdomain - matching. Use :attr:`subdomain_matching` instead. - """ - if request is not None: - # If subdomain matching is disabled (the default), use the - # default subdomain in all cases. This should be the default - # in Werkzeug but it currently does not have that feature. - if not self.subdomain_matching: - subdomain = self.url_map.default_subdomain or None - else: - subdomain = None - - return self.url_map.bind_to_environ( - request.environ, - server_name=self.config["SERVER_NAME"], - subdomain=subdomain, - ) - # We need at the very least the server name to be set for this - # to work. - if self.config["SERVER_NAME"] is not None: - return self.url_map.bind( - self.config["SERVER_NAME"], - script_name=self.config["APPLICATION_ROOT"], - url_scheme=self.config["PREFERRED_URL_SCHEME"], - ) - - return None - - def inject_url_defaults(self, endpoint: str, values: dict) -> None: - """Injects the URL defaults for the given endpoint directly into - the values dictionary passed. This is used internally and - automatically called on URL building. - - .. versionadded:: 0.7 - """ - names: t.Iterable[str | None] = (None,) - - # url_for may be called outside a request context, parse the - # passed endpoint instead of using request.blueprints. - if "." in endpoint: - names = chain( - names, reversed(_split_blueprint_path(endpoint.rpartition(".")[0])) - ) - - for name in names: - if name in self.url_default_functions: - for func in self.url_default_functions[name]: - func(endpoint, values) - - def handle_url_build_error( - self, error: BuildError, endpoint: str, values: dict[str, t.Any] - ) -> str: - """Called by :meth:`.url_for` if a - :exc:`~werkzeug.routing.BuildError` was raised. If this returns - a value, it will be returned by ``url_for``, otherwise the error - will be re-raised. - - Each function in :attr:`url_build_error_handlers` is called with - ``error``, ``endpoint`` and ``values``. If a function returns - ``None`` or raises a ``BuildError``, it is skipped. Otherwise, - its return value is returned by ``url_for``. - - :param error: The active ``BuildError`` being handled. - :param endpoint: The endpoint being built. - :param values: The keyword arguments passed to ``url_for``. - """ - for handler in self.url_build_error_handlers: - try: - rv = handler(error, endpoint, values) - except BuildError as e: - # make error available outside except block - error = e - else: - if rv is not None: - return rv - - # Re-raise if called with an active exception, otherwise raise - # the passed in exception. - if error is sys.exc_info()[1]: - raise - - raise error - - def preprocess_request(self) -> ft.ResponseReturnValue | None: - """Called before the request is dispatched. Calls - :attr:`url_value_preprocessors` registered with the app and the - current blueprint (if any). Then calls :attr:`before_request_funcs` - registered with the app and the blueprint. - - If any :meth:`before_request` handler returns a non-None value, the - value is handled as if it was the return value from the view, and - further request handling is stopped. - """ - names = (None, *reversed(request.blueprints)) - - for name in names: - if name in self.url_value_preprocessors: - for url_func in self.url_value_preprocessors[name]: - url_func(request.endpoint, request.view_args) - - for name in names: - if name in self.before_request_funcs: - for before_func in self.before_request_funcs[name]: - rv = self.ensure_sync(before_func)() - - if rv is not None: - return rv - - return None - - def process_response(self, response: Response) -> Response: - """Can be overridden in order to modify the response object - before it's sent to the WSGI server. By default this will - call all the :meth:`after_request` decorated functions. - - .. versionchanged:: 0.5 - As of Flask 0.5 the functions registered for after request - execution are called in reverse order of registration. - - :param response: a :attr:`response_class` object. - :return: a new response object or the same, has to be an - instance of :attr:`response_class`. - """ - ctx = request_ctx._get_current_object() # type: ignore[attr-defined] - - for func in ctx._after_request_functions: - response = self.ensure_sync(func)(response) - - for name in chain(request.blueprints, (None,)): - if name in self.after_request_funcs: - for func in reversed(self.after_request_funcs[name]): - response = self.ensure_sync(func)(response) - - if not self.session_interface.is_null_session(ctx.session): - self.session_interface.save_session(self, ctx.session, response) - - return response - - def do_teardown_request( - self, exc: BaseException | None = _sentinel # type: ignore - ) -> None: - """Called after the request is dispatched and the response is - returned, right before the request context is popped. - - This calls all functions decorated with - :meth:`teardown_request`, and :meth:`Blueprint.teardown_request` - if a blueprint handled the request. Finally, the - :data:`request_tearing_down` signal is sent. - - This is called by - :meth:`RequestContext.pop() `, - which may be delayed during testing to maintain access to - resources. - - :param exc: An unhandled exception raised while dispatching the - request. Detected from the current exception information if - not passed. Passed to each teardown function. - - .. versionchanged:: 0.9 - Added the ``exc`` argument. - """ - if exc is _sentinel: - exc = sys.exc_info()[1] - - for name in chain(request.blueprints, (None,)): - if name in self.teardown_request_funcs: - for func in reversed(self.teardown_request_funcs[name]): - self.ensure_sync(func)(exc) - - request_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) - - def do_teardown_appcontext( - self, exc: BaseException | None = _sentinel # type: ignore - ) -> None: - """Called right before the application context is popped. - - When handling a request, the application context is popped - after the request context. See :meth:`do_teardown_request`. - - This calls all functions decorated with - :meth:`teardown_appcontext`. Then the - :data:`appcontext_tearing_down` signal is sent. - - This is called by - :meth:`AppContext.pop() `. - - .. versionadded:: 0.9 - """ - if exc is _sentinel: - exc = sys.exc_info()[1] - - for func in reversed(self.teardown_appcontext_funcs): - self.ensure_sync(func)(exc) - - appcontext_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) - - def app_context(self) -> AppContext: - """Create an :class:`~flask.ctx.AppContext`. Use as a ``with`` - block to push the context, which will make :data:`current_app` - point at this application. - - An application context is automatically pushed by - :meth:`RequestContext.push() ` - when handling a request, and when running a CLI command. Use - this to manually create a context outside of these situations. - - :: - - with app.app_context(): - init_db() - - See :doc:`/appcontext`. - - .. versionadded:: 0.9 - """ - return AppContext(self) - - def request_context(self, environ: dict) -> RequestContext: - """Create a :class:`~flask.ctx.RequestContext` representing a - WSGI environment. Use a ``with`` block to push the context, - which will make :data:`request` point at this request. - - See :doc:`/reqcontext`. - - Typically you should not call this from your own code. A request - context is automatically pushed by the :meth:`wsgi_app` when - handling a request. Use :meth:`test_request_context` to create - an environment and context instead of this method. - - :param environ: a WSGI environment - """ - return RequestContext(self, environ) - - def test_request_context(self, *args: t.Any, **kwargs: t.Any) -> RequestContext: - """Create a :class:`~flask.ctx.RequestContext` for a WSGI - environment created from the given values. This is mostly useful - during testing, where you may want to run a function that uses - request data without dispatching a full request. - - See :doc:`/reqcontext`. - - Use a ``with`` block to push the context, which will make - :data:`request` point at the request for the created - environment. :: - - with app.test_request_context(...): - generate_report() - - When using the shell, it may be easier to push and pop the - context manually to avoid indentation. :: - - ctx = app.test_request_context(...) - ctx.push() - ... - ctx.pop() - - Takes the same arguments as Werkzeug's - :class:`~werkzeug.test.EnvironBuilder`, with some defaults from - the application. See the linked Werkzeug docs for most of the - available arguments. Flask-specific behavior is listed here. - - :param path: URL path being requested. - :param base_url: Base URL where the app is being served, which - ``path`` is relative to. If not given, built from - :data:`PREFERRED_URL_SCHEME`, ``subdomain``, - :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. - :param subdomain: Subdomain name to append to - :data:`SERVER_NAME`. - :param url_scheme: Scheme to use instead of - :data:`PREFERRED_URL_SCHEME`. - :param data: The request body, either as a string or a dict of - form keys and values. - :param json: If given, this is serialized as JSON and passed as - ``data``. Also defaults ``content_type`` to - ``application/json``. - :param args: other positional arguments passed to - :class:`~werkzeug.test.EnvironBuilder`. - :param kwargs: other keyword arguments passed to - :class:`~werkzeug.test.EnvironBuilder`. - """ - from .testing import EnvironBuilder - - builder = EnvironBuilder(self, *args, **kwargs) - - try: - return self.request_context(builder.get_environ()) - finally: - builder.close() - - def wsgi_app(self, environ: dict, start_response: t.Callable) -> t.Any: - """The actual WSGI application. This is not implemented in - :meth:`__call__` so that middlewares can be applied without - losing a reference to the app object. Instead of doing this:: - - app = MyMiddleware(app) - - It's a better idea to do this instead:: - - app.wsgi_app = MyMiddleware(app.wsgi_app) - - Then you still have the original application object around and - can continue to call methods on it. - - .. versionchanged:: 0.7 - Teardown events for the request and app contexts are called - even if an unhandled error occurs. Other events may not be - called depending on when an error occurs during dispatch. - See :ref:`callbacks-and-errors`. - - :param environ: A WSGI environment. - :param start_response: A callable accepting a status code, - a list of headers, and an optional exception context to - start the response. - """ - ctx = self.request_context(environ) - error: BaseException | None = None - try: - try: - ctx.push() - response = self.full_dispatch_request() - except Exception as e: - error = e - response = self.handle_exception(e) - except: # noqa: B001 - error = sys.exc_info()[1] - raise - return response(environ, start_response) - finally: - if "werkzeug.debug.preserve_context" in environ: - environ["werkzeug.debug.preserve_context"](_cv_app.get()) - environ["werkzeug.debug.preserve_context"](_cv_request.get()) - - if error is not None and self.should_ignore_error(error): - error = None - - ctx.pop(error) - - def __call__(self, environ: dict, start_response: t.Callable) -> t.Any: - """The WSGI server calls the Flask application object as the - WSGI application. This calls :meth:`wsgi_app`, which can be - wrapped to apply middleware. - """ - return self.wsgi_app(environ, start_response) diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/blueprints.py b/venv_flaskchat/lib/python3.11/site-packages/flask/blueprints.py deleted file mode 100644 index 0407f86..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/blueprints.py +++ /dev/null @@ -1,626 +0,0 @@ -from __future__ import annotations - -import os -import typing as t -from collections import defaultdict -from functools import update_wrapper - -from . import typing as ft -from .scaffold import _endpoint_from_view_func -from .scaffold import _sentinel -from .scaffold import Scaffold -from .scaffold import setupmethod - -if t.TYPE_CHECKING: # pragma: no cover - from .app import Flask - -DeferredSetupFunction = t.Callable[["BlueprintSetupState"], t.Callable] -T_after_request = t.TypeVar("T_after_request", bound=ft.AfterRequestCallable) -T_before_request = t.TypeVar("T_before_request", bound=ft.BeforeRequestCallable) -T_error_handler = t.TypeVar("T_error_handler", bound=ft.ErrorHandlerCallable) -T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) -T_template_context_processor = t.TypeVar( - "T_template_context_processor", bound=ft.TemplateContextProcessorCallable -) -T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) -T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) -T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) -T_url_defaults = t.TypeVar("T_url_defaults", bound=ft.URLDefaultCallable) -T_url_value_preprocessor = t.TypeVar( - "T_url_value_preprocessor", bound=ft.URLValuePreprocessorCallable -) - - -class BlueprintSetupState: - """Temporary holder object for registering a blueprint with the - application. An instance of this class is created by the - :meth:`~flask.Blueprint.make_setup_state` method and later passed - to all register callback functions. - """ - - def __init__( - self, - blueprint: Blueprint, - app: Flask, - options: t.Any, - first_registration: bool, - ) -> None: - #: a reference to the current application - self.app = app - - #: a reference to the blueprint that created this setup state. - self.blueprint = blueprint - - #: a dictionary with all options that were passed to the - #: :meth:`~flask.Flask.register_blueprint` method. - self.options = options - - #: as blueprints can be registered multiple times with the - #: application and not everything wants to be registered - #: multiple times on it, this attribute can be used to figure - #: out if the blueprint was registered in the past already. - self.first_registration = first_registration - - subdomain = self.options.get("subdomain") - if subdomain is None: - subdomain = self.blueprint.subdomain - - #: The subdomain that the blueprint should be active for, ``None`` - #: otherwise. - self.subdomain = subdomain - - url_prefix = self.options.get("url_prefix") - if url_prefix is None: - url_prefix = self.blueprint.url_prefix - #: The prefix that should be used for all URLs defined on the - #: blueprint. - self.url_prefix = url_prefix - - self.name = self.options.get("name", blueprint.name) - self.name_prefix = self.options.get("name_prefix", "") - - #: A dictionary with URL defaults that is added to each and every - #: URL that was defined with the blueprint. - self.url_defaults = dict(self.blueprint.url_values_defaults) - self.url_defaults.update(self.options.get("url_defaults", ())) - - def add_url_rule( - self, - rule: str, - endpoint: str | None = None, - view_func: t.Callable | None = None, - **options: t.Any, - ) -> None: - """A helper method to register a rule (and optionally a view function) - to the application. The endpoint is automatically prefixed with the - blueprint's name. - """ - if self.url_prefix is not None: - if rule: - rule = "/".join((self.url_prefix.rstrip("/"), rule.lstrip("/"))) - else: - rule = self.url_prefix - options.setdefault("subdomain", self.subdomain) - if endpoint is None: - endpoint = _endpoint_from_view_func(view_func) # type: ignore - defaults = self.url_defaults - if "defaults" in options: - defaults = dict(defaults, **options.pop("defaults")) - - self.app.add_url_rule( - rule, - f"{self.name_prefix}.{self.name}.{endpoint}".lstrip("."), - view_func, - defaults=defaults, - **options, - ) - - -class Blueprint(Scaffold): - """Represents a blueprint, a collection of routes and other - app-related functions that can be registered on a real application - later. - - A blueprint is an object that allows defining application functions - without requiring an application object ahead of time. It uses the - same decorators as :class:`~flask.Flask`, but defers the need for an - application by recording them for later registration. - - Decorating a function with a blueprint creates a deferred function - that is called with :class:`~flask.blueprints.BlueprintSetupState` - when the blueprint is registered on an application. - - See :doc:`/blueprints` for more information. - - :param name: The name of the blueprint. Will be prepended to each - endpoint name. - :param import_name: The name of the blueprint package, usually - ``__name__``. This helps locate the ``root_path`` for the - blueprint. - :param static_folder: A folder with static files that should be - served by the blueprint's static route. The path is relative to - the blueprint's root path. Blueprint static files are disabled - by default. - :param static_url_path: The url to serve static files from. - Defaults to ``static_folder``. If the blueprint does not have - a ``url_prefix``, the app's static route will take precedence, - and the blueprint's static files won't be accessible. - :param template_folder: A folder with templates that should be added - to the app's template search path. The path is relative to the - blueprint's root path. Blueprint templates are disabled by - default. Blueprint templates have a lower precedence than those - in the app's templates folder. - :param url_prefix: A path to prepend to all of the blueprint's URLs, - to make them distinct from the rest of the app's routes. - :param subdomain: A subdomain that blueprint routes will match on by - default. - :param url_defaults: A dict of default values that blueprint routes - will receive by default. - :param root_path: By default, the blueprint will automatically set - this based on ``import_name``. In certain situations this - automatic detection can fail, so the path can be specified - manually instead. - - .. versionchanged:: 1.1.0 - Blueprints have a ``cli`` group to register nested CLI commands. - The ``cli_group`` parameter controls the name of the group under - the ``flask`` command. - - .. versionadded:: 0.7 - """ - - _got_registered_once = False - - def __init__( - self, - name: str, - import_name: str, - static_folder: str | os.PathLike | None = None, - static_url_path: str | None = None, - template_folder: str | os.PathLike | None = None, - url_prefix: str | None = None, - subdomain: str | None = None, - url_defaults: dict | None = None, - root_path: str | None = None, - cli_group: str | None = _sentinel, # type: ignore - ): - super().__init__( - import_name=import_name, - static_folder=static_folder, - static_url_path=static_url_path, - template_folder=template_folder, - root_path=root_path, - ) - - if not name: - raise ValueError("'name' may not be empty.") - - if "." in name: - raise ValueError("'name' may not contain a dot '.' character.") - - self.name = name - self.url_prefix = url_prefix - self.subdomain = subdomain - self.deferred_functions: list[DeferredSetupFunction] = [] - - if url_defaults is None: - url_defaults = {} - - self.url_values_defaults = url_defaults - self.cli_group = cli_group - self._blueprints: list[tuple[Blueprint, dict]] = [] - - def _check_setup_finished(self, f_name: str) -> None: - if self._got_registered_once: - raise AssertionError( - f"The setup method '{f_name}' can no longer be called on the blueprint" - f" '{self.name}'. It has already been registered at least once, any" - " changes will not be applied consistently.\n" - "Make sure all imports, decorators, functions, etc. needed to set up" - " the blueprint are done before registering it." - ) - - @setupmethod - def record(self, func: t.Callable) -> None: - """Registers a function that is called when the blueprint is - registered on the application. This function is called with the - state as argument as returned by the :meth:`make_setup_state` - method. - """ - self.deferred_functions.append(func) - - @setupmethod - def record_once(self, func: t.Callable) -> None: - """Works like :meth:`record` but wraps the function in another - function that will ensure the function is only called once. If the - blueprint is registered a second time on the application, the - function passed is not called. - """ - - def wrapper(state: BlueprintSetupState) -> None: - if state.first_registration: - func(state) - - self.record(update_wrapper(wrapper, func)) - - def make_setup_state( - self, app: Flask, options: dict, first_registration: bool = False - ) -> BlueprintSetupState: - """Creates an instance of :meth:`~flask.blueprints.BlueprintSetupState` - object that is later passed to the register callback functions. - Subclasses can override this to return a subclass of the setup state. - """ - return BlueprintSetupState(self, app, options, first_registration) - - @setupmethod - def register_blueprint(self, blueprint: Blueprint, **options: t.Any) -> None: - """Register a :class:`~flask.Blueprint` on this blueprint. Keyword - arguments passed to this method will override the defaults set - on the blueprint. - - .. versionchanged:: 2.0.1 - The ``name`` option can be used to change the (pre-dotted) - name the blueprint is registered with. This allows the same - blueprint to be registered multiple times with unique names - for ``url_for``. - - .. versionadded:: 2.0 - """ - if blueprint is self: - raise ValueError("Cannot register a blueprint on itself") - self._blueprints.append((blueprint, options)) - - def register(self, app: Flask, options: dict) -> None: - """Called by :meth:`Flask.register_blueprint` to register all - views and callbacks registered on the blueprint with the - application. Creates a :class:`.BlueprintSetupState` and calls - each :meth:`record` callback with it. - - :param app: The application this blueprint is being registered - with. - :param options: Keyword arguments forwarded from - :meth:`~Flask.register_blueprint`. - - .. versionchanged:: 2.3 - Nested blueprints now correctly apply subdomains. - - .. versionchanged:: 2.1 - Registering the same blueprint with the same name multiple - times is an error. - - .. versionchanged:: 2.0.1 - Nested blueprints are registered with their dotted name. - This allows different blueprints with the same name to be - nested at different locations. - - .. versionchanged:: 2.0.1 - The ``name`` option can be used to change the (pre-dotted) - name the blueprint is registered with. This allows the same - blueprint to be registered multiple times with unique names - for ``url_for``. - """ - name_prefix = options.get("name_prefix", "") - self_name = options.get("name", self.name) - name = f"{name_prefix}.{self_name}".lstrip(".") - - if name in app.blueprints: - bp_desc = "this" if app.blueprints[name] is self else "a different" - existing_at = f" '{name}'" if self_name != name else "" - - raise ValueError( - f"The name '{self_name}' is already registered for" - f" {bp_desc} blueprint{existing_at}. Use 'name=' to" - f" provide a unique name." - ) - - first_bp_registration = not any(bp is self for bp in app.blueprints.values()) - first_name_registration = name not in app.blueprints - - app.blueprints[name] = self - self._got_registered_once = True - state = self.make_setup_state(app, options, first_bp_registration) - - if self.has_static_folder: - state.add_url_rule( - f"{self.static_url_path}/", - view_func=self.send_static_file, - endpoint="static", - ) - - # Merge blueprint data into parent. - if first_bp_registration or first_name_registration: - - def extend(bp_dict, parent_dict): - for key, values in bp_dict.items(): - key = name if key is None else f"{name}.{key}" - parent_dict[key].extend(values) - - for key, value in self.error_handler_spec.items(): - key = name if key is None else f"{name}.{key}" - value = defaultdict( - dict, - { - code: { - exc_class: func for exc_class, func in code_values.items() - } - for code, code_values in value.items() - }, - ) - app.error_handler_spec[key] = value - - for endpoint, func in self.view_functions.items(): - app.view_functions[endpoint] = func - - extend(self.before_request_funcs, app.before_request_funcs) - extend(self.after_request_funcs, app.after_request_funcs) - extend( - self.teardown_request_funcs, - app.teardown_request_funcs, - ) - extend(self.url_default_functions, app.url_default_functions) - extend(self.url_value_preprocessors, app.url_value_preprocessors) - extend(self.template_context_processors, app.template_context_processors) - - for deferred in self.deferred_functions: - deferred(state) - - cli_resolved_group = options.get("cli_group", self.cli_group) - - if self.cli.commands: - if cli_resolved_group is None: - app.cli.commands.update(self.cli.commands) - elif cli_resolved_group is _sentinel: - self.cli.name = name - app.cli.add_command(self.cli) - else: - self.cli.name = cli_resolved_group - app.cli.add_command(self.cli) - - for blueprint, bp_options in self._blueprints: - bp_options = bp_options.copy() - bp_url_prefix = bp_options.get("url_prefix") - bp_subdomain = bp_options.get("subdomain") - - if bp_subdomain is None: - bp_subdomain = blueprint.subdomain - - if state.subdomain is not None and bp_subdomain is not None: - bp_options["subdomain"] = bp_subdomain + "." + state.subdomain - elif bp_subdomain is not None: - bp_options["subdomain"] = bp_subdomain - elif state.subdomain is not None: - bp_options["subdomain"] = state.subdomain - - if bp_url_prefix is None: - bp_url_prefix = blueprint.url_prefix - - if state.url_prefix is not None and bp_url_prefix is not None: - bp_options["url_prefix"] = ( - state.url_prefix.rstrip("/") + "/" + bp_url_prefix.lstrip("/") - ) - elif bp_url_prefix is not None: - bp_options["url_prefix"] = bp_url_prefix - elif state.url_prefix is not None: - bp_options["url_prefix"] = state.url_prefix - - bp_options["name_prefix"] = name - blueprint.register(app, bp_options) - - @setupmethod - def add_url_rule( - self, - rule: str, - endpoint: str | None = None, - view_func: ft.RouteCallable | None = None, - provide_automatic_options: bool | None = None, - **options: t.Any, - ) -> None: - """Register a URL rule with the blueprint. See :meth:`.Flask.add_url_rule` for - full documentation. - - The URL rule is prefixed with the blueprint's URL prefix. The endpoint name, - used with :func:`url_for`, is prefixed with the blueprint's name. - """ - if endpoint and "." in endpoint: - raise ValueError("'endpoint' may not contain a dot '.' character.") - - if view_func and hasattr(view_func, "__name__") and "." in view_func.__name__: - raise ValueError("'view_func' name may not contain a dot '.' character.") - - self.record( - lambda s: s.add_url_rule( - rule, - endpoint, - view_func, - provide_automatic_options=provide_automatic_options, - **options, - ) - ) - - @setupmethod - def app_template_filter( - self, name: str | None = None - ) -> t.Callable[[T_template_filter], T_template_filter]: - """Register a template filter, available in any template rendered by the - application. Equivalent to :meth:`.Flask.template_filter`. - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - - def decorator(f: T_template_filter) -> T_template_filter: - self.add_app_template_filter(f, name=name) - return f - - return decorator - - @setupmethod - def add_app_template_filter( - self, f: ft.TemplateFilterCallable, name: str | None = None - ) -> None: - """Register a template filter, available in any template rendered by the - application. Works like the :meth:`app_template_filter` decorator. Equivalent to - :meth:`.Flask.add_template_filter`. - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - - def register_template(state: BlueprintSetupState) -> None: - state.app.jinja_env.filters[name or f.__name__] = f - - self.record_once(register_template) - - @setupmethod - def app_template_test( - self, name: str | None = None - ) -> t.Callable[[T_template_test], T_template_test]: - """Register a template test, available in any template rendered by the - application. Equivalent to :meth:`.Flask.template_test`. - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - - def decorator(f: T_template_test) -> T_template_test: - self.add_app_template_test(f, name=name) - return f - - return decorator - - @setupmethod - def add_app_template_test( - self, f: ft.TemplateTestCallable, name: str | None = None - ) -> None: - """Register a template test, available in any template rendered by the - application. Works like the :meth:`app_template_test` decorator. Equivalent to - :meth:`.Flask.add_template_test`. - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - - def register_template(state: BlueprintSetupState) -> None: - state.app.jinja_env.tests[name or f.__name__] = f - - self.record_once(register_template) - - @setupmethod - def app_template_global( - self, name: str | None = None - ) -> t.Callable[[T_template_global], T_template_global]: - """Register a template global, available in any template rendered by the - application. Equivalent to :meth:`.Flask.template_global`. - - .. versionadded:: 0.10 - - :param name: the optional name of the global, otherwise the - function name will be used. - """ - - def decorator(f: T_template_global) -> T_template_global: - self.add_app_template_global(f, name=name) - return f - - return decorator - - @setupmethod - def add_app_template_global( - self, f: ft.TemplateGlobalCallable, name: str | None = None - ) -> None: - """Register a template global, available in any template rendered by the - application. Works like the :meth:`app_template_global` decorator. Equivalent to - :meth:`.Flask.add_template_global`. - - .. versionadded:: 0.10 - - :param name: the optional name of the global, otherwise the - function name will be used. - """ - - def register_template(state: BlueprintSetupState) -> None: - state.app.jinja_env.globals[name or f.__name__] = f - - self.record_once(register_template) - - @setupmethod - def before_app_request(self, f: T_before_request) -> T_before_request: - """Like :meth:`before_request`, but before every request, not only those handled - by the blueprint. Equivalent to :meth:`.Flask.before_request`. - """ - self.record_once( - lambda s: s.app.before_request_funcs.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def after_app_request(self, f: T_after_request) -> T_after_request: - """Like :meth:`after_request`, but after every request, not only those handled - by the blueprint. Equivalent to :meth:`.Flask.after_request`. - """ - self.record_once( - lambda s: s.app.after_request_funcs.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def teardown_app_request(self, f: T_teardown) -> T_teardown: - """Like :meth:`teardown_request`, but after every request, not only those - handled by the blueprint. Equivalent to :meth:`.Flask.teardown_request`. - """ - self.record_once( - lambda s: s.app.teardown_request_funcs.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def app_context_processor( - self, f: T_template_context_processor - ) -> T_template_context_processor: - """Like :meth:`context_processor`, but for templates rendered by every view, not - only by the blueprint. Equivalent to :meth:`.Flask.context_processor`. - """ - self.record_once( - lambda s: s.app.template_context_processors.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def app_errorhandler( - self, code: type[Exception] | int - ) -> t.Callable[[T_error_handler], T_error_handler]: - """Like :meth:`errorhandler`, but for every request, not only those handled by - the blueprint. Equivalent to :meth:`.Flask.errorhandler`. - """ - - def decorator(f: T_error_handler) -> T_error_handler: - self.record_once(lambda s: s.app.errorhandler(code)(f)) - return f - - return decorator - - @setupmethod - def app_url_value_preprocessor( - self, f: T_url_value_preprocessor - ) -> T_url_value_preprocessor: - """Like :meth:`url_value_preprocessor`, but for every request, not only those - handled by the blueprint. Equivalent to :meth:`.Flask.url_value_preprocessor`. - """ - self.record_once( - lambda s: s.app.url_value_preprocessors.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def app_url_defaults(self, f: T_url_defaults) -> T_url_defaults: - """Like :meth:`url_defaults`, but for every request, not only those handled by - the blueprint. Equivalent to :meth:`.Flask.url_defaults`. - """ - self.record_once( - lambda s: s.app.url_default_functions.setdefault(None, []).append(f) - ) - return f diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/cli.py b/venv_flaskchat/lib/python3.11/site-packages/flask/cli.py deleted file mode 100644 index f7e1f29..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/cli.py +++ /dev/null @@ -1,1067 +0,0 @@ -from __future__ import annotations - -import ast -import inspect -import os -import platform -import re -import sys -import traceback -import typing as t -from functools import update_wrapper -from operator import itemgetter - -import click -from click.core import ParameterSource -from werkzeug import run_simple -from werkzeug.serving import is_running_from_reloader -from werkzeug.utils import import_string - -from .globals import current_app -from .helpers import get_debug_flag -from .helpers import get_load_dotenv - -if t.TYPE_CHECKING: - from .app import Flask - - -class NoAppException(click.UsageError): - """Raised if an application cannot be found or loaded.""" - - -def find_best_app(module): - """Given a module instance this tries to find the best possible - application in the module or raises an exception. - """ - from . import Flask - - # Search for the most common names first. - for attr_name in ("app", "application"): - app = getattr(module, attr_name, None) - - if isinstance(app, Flask): - return app - - # Otherwise find the only object that is a Flask instance. - matches = [v for v in module.__dict__.values() if isinstance(v, Flask)] - - if len(matches) == 1: - return matches[0] - elif len(matches) > 1: - raise NoAppException( - "Detected multiple Flask applications in module" - f" '{module.__name__}'. Use '{module.__name__}:name'" - " to specify the correct one." - ) - - # Search for app factory functions. - for attr_name in ("create_app", "make_app"): - app_factory = getattr(module, attr_name, None) - - if inspect.isfunction(app_factory): - try: - app = app_factory() - - if isinstance(app, Flask): - return app - except TypeError as e: - if not _called_with_wrong_args(app_factory): - raise - - raise NoAppException( - f"Detected factory '{attr_name}' in module '{module.__name__}'," - " but could not call it without arguments. Use" - f" '{module.__name__}:{attr_name}(args)'" - " to specify arguments." - ) from e - - raise NoAppException( - "Failed to find Flask application or factory in module" - f" '{module.__name__}'. Use '{module.__name__}:name'" - " to specify one." - ) - - -def _called_with_wrong_args(f): - """Check whether calling a function raised a ``TypeError`` because - the call failed or because something in the factory raised the - error. - - :param f: The function that was called. - :return: ``True`` if the call failed. - """ - tb = sys.exc_info()[2] - - try: - while tb is not None: - if tb.tb_frame.f_code is f.__code__: - # In the function, it was called successfully. - return False - - tb = tb.tb_next - - # Didn't reach the function. - return True - finally: - # Delete tb to break a circular reference. - # https://docs.python.org/2/library/sys.html#sys.exc_info - del tb - - -def find_app_by_string(module, app_name): - """Check if the given string is a variable name or a function. Call - a function to get the app instance, or return the variable directly. - """ - from . import Flask - - # Parse app_name as a single expression to determine if it's a valid - # attribute name or function call. - try: - expr = ast.parse(app_name.strip(), mode="eval").body - except SyntaxError: - raise NoAppException( - f"Failed to parse {app_name!r} as an attribute name or function call." - ) from None - - if isinstance(expr, ast.Name): - name = expr.id - args = [] - kwargs = {} - elif isinstance(expr, ast.Call): - # Ensure the function name is an attribute name only. - if not isinstance(expr.func, ast.Name): - raise NoAppException( - f"Function reference must be a simple name: {app_name!r}." - ) - - name = expr.func.id - - # Parse the positional and keyword arguments as literals. - try: - args = [ast.literal_eval(arg) for arg in expr.args] - kwargs = {kw.arg: ast.literal_eval(kw.value) for kw in expr.keywords} - except ValueError: - # literal_eval gives cryptic error messages, show a generic - # message with the full expression instead. - raise NoAppException( - f"Failed to parse arguments as literal values: {app_name!r}." - ) from None - else: - raise NoAppException( - f"Failed to parse {app_name!r} as an attribute name or function call." - ) - - try: - attr = getattr(module, name) - except AttributeError as e: - raise NoAppException( - f"Failed to find attribute {name!r} in {module.__name__!r}." - ) from e - - # If the attribute is a function, call it with any args and kwargs - # to get the real application. - if inspect.isfunction(attr): - try: - app = attr(*args, **kwargs) - except TypeError as e: - if not _called_with_wrong_args(attr): - raise - - raise NoAppException( - f"The factory {app_name!r} in module" - f" {module.__name__!r} could not be called with the" - " specified arguments." - ) from e - else: - app = attr - - if isinstance(app, Flask): - return app - - raise NoAppException( - "A valid Flask application was not obtained from" - f" '{module.__name__}:{app_name}'." - ) - - -def prepare_import(path): - """Given a filename this will try to calculate the python path, add it - to the search path and return the actual module name that is expected. - """ - path = os.path.realpath(path) - - fname, ext = os.path.splitext(path) - if ext == ".py": - path = fname - - if os.path.basename(path) == "__init__": - path = os.path.dirname(path) - - module_name = [] - - # move up until outside package structure (no __init__.py) - while True: - path, name = os.path.split(path) - module_name.append(name) - - if not os.path.exists(os.path.join(path, "__init__.py")): - break - - if sys.path[0] != path: - sys.path.insert(0, path) - - return ".".join(module_name[::-1]) - - -def locate_app(module_name, app_name, raise_if_not_found=True): - try: - __import__(module_name) - except ImportError: - # Reraise the ImportError if it occurred within the imported module. - # Determine this by checking whether the trace has a depth > 1. - if sys.exc_info()[2].tb_next: - raise NoAppException( - f"While importing {module_name!r}, an ImportError was" - f" raised:\n\n{traceback.format_exc()}" - ) from None - elif raise_if_not_found: - raise NoAppException(f"Could not import {module_name!r}.") from None - else: - return - - module = sys.modules[module_name] - - if app_name is None: - return find_best_app(module) - else: - return find_app_by_string(module, app_name) - - -def get_version(ctx, param, value): - if not value or ctx.resilient_parsing: - return - - import werkzeug - from . import __version__ - - click.echo( - f"Python {platform.python_version()}\n" - f"Flask {__version__}\n" - f"Werkzeug {werkzeug.__version__}", - color=ctx.color, - ) - ctx.exit() - - -version_option = click.Option( - ["--version"], - help="Show the Flask version.", - expose_value=False, - callback=get_version, - is_flag=True, - is_eager=True, -) - - -class ScriptInfo: - """Helper object to deal with Flask applications. This is usually not - necessary to interface with as it's used internally in the dispatching - to click. In future versions of Flask this object will most likely play - a bigger role. Typically it's created automatically by the - :class:`FlaskGroup` but you can also manually create it and pass it - onwards as click object. - """ - - def __init__( - self, - app_import_path: str | None = None, - create_app: t.Callable[..., Flask] | None = None, - set_debug_flag: bool = True, - ) -> None: - #: Optionally the import path for the Flask application. - self.app_import_path = app_import_path - #: Optionally a function that is passed the script info to create - #: the instance of the application. - self.create_app = create_app - #: A dictionary with arbitrary data that can be associated with - #: this script info. - self.data: dict[t.Any, t.Any] = {} - self.set_debug_flag = set_debug_flag - self._loaded_app: Flask | None = None - - def load_app(self) -> Flask: - """Loads the Flask app (if not yet loaded) and returns it. Calling - this multiple times will just result in the already loaded app to - be returned. - """ - if self._loaded_app is not None: - return self._loaded_app - - if self.create_app is not None: - app = self.create_app() - else: - if self.app_import_path: - path, name = ( - re.split(r":(?![\\/])", self.app_import_path, 1) + [None] - )[:2] - import_name = prepare_import(path) - app = locate_app(import_name, name) - else: - for path in ("wsgi.py", "app.py"): - import_name = prepare_import(path) - app = locate_app(import_name, None, raise_if_not_found=False) - - if app: - break - - if not app: - raise NoAppException( - "Could not locate a Flask application. Use the" - " 'flask --app' option, 'FLASK_APP' environment" - " variable, or a 'wsgi.py' or 'app.py' file in the" - " current directory." - ) - - if self.set_debug_flag: - # Update the app's debug flag through the descriptor so that - # other values repopulate as well. - app.debug = get_debug_flag() - - self._loaded_app = app - return app - - -pass_script_info = click.make_pass_decorator(ScriptInfo, ensure=True) - - -def with_appcontext(f): - """Wraps a callback so that it's guaranteed to be executed with the - script's application context. - - Custom commands (and their options) registered under ``app.cli`` or - ``blueprint.cli`` will always have an app context available, this - decorator is not required in that case. - - .. versionchanged:: 2.2 - The app context is active for subcommands as well as the - decorated callback. The app context is always available to - ``app.cli`` command and parameter callbacks. - """ - - @click.pass_context - def decorator(__ctx, *args, **kwargs): - if not current_app: - app = __ctx.ensure_object(ScriptInfo).load_app() - __ctx.with_resource(app.app_context()) - - return __ctx.invoke(f, *args, **kwargs) - - return update_wrapper(decorator, f) - - -class AppGroup(click.Group): - """This works similar to a regular click :class:`~click.Group` but it - changes the behavior of the :meth:`command` decorator so that it - automatically wraps the functions in :func:`with_appcontext`. - - Not to be confused with :class:`FlaskGroup`. - """ - - def command(self, *args, **kwargs): - """This works exactly like the method of the same name on a regular - :class:`click.Group` but it wraps callbacks in :func:`with_appcontext` - unless it's disabled by passing ``with_appcontext=False``. - """ - wrap_for_ctx = kwargs.pop("with_appcontext", True) - - def decorator(f): - if wrap_for_ctx: - f = with_appcontext(f) - return click.Group.command(self, *args, **kwargs)(f) - - return decorator - - def group(self, *args, **kwargs): - """This works exactly like the method of the same name on a regular - :class:`click.Group` but it defaults the group class to - :class:`AppGroup`. - """ - kwargs.setdefault("cls", AppGroup) - return click.Group.group(self, *args, **kwargs) - - -def _set_app(ctx: click.Context, param: click.Option, value: str | None) -> str | None: - if value is None: - return None - - info = ctx.ensure_object(ScriptInfo) - info.app_import_path = value - return value - - -# This option is eager so the app will be available if --help is given. -# --help is also eager, so --app must be before it in the param list. -# no_args_is_help bypasses eager processing, so this option must be -# processed manually in that case to ensure FLASK_APP gets picked up. -_app_option = click.Option( - ["-A", "--app"], - metavar="IMPORT", - help=( - "The Flask application or factory function to load, in the form 'module:name'." - " Module can be a dotted import or file path. Name is not required if it is" - " 'app', 'application', 'create_app', or 'make_app', and can be 'name(args)' to" - " pass arguments." - ), - is_eager=True, - expose_value=False, - callback=_set_app, -) - - -def _set_debug(ctx: click.Context, param: click.Option, value: bool) -> bool | None: - # If the flag isn't provided, it will default to False. Don't use - # that, let debug be set by env in that case. - source = ctx.get_parameter_source(param.name) # type: ignore[arg-type] - - if source is not None and source in ( - ParameterSource.DEFAULT, - ParameterSource.DEFAULT_MAP, - ): - return None - - # Set with env var instead of ScriptInfo.load so that it can be - # accessed early during a factory function. - os.environ["FLASK_DEBUG"] = "1" if value else "0" - return value - - -_debug_option = click.Option( - ["--debug/--no-debug"], - help="Set debug mode.", - expose_value=False, - callback=_set_debug, -) - - -def _env_file_callback( - ctx: click.Context, param: click.Option, value: str | None -) -> str | None: - if value is None: - return None - - import importlib - - try: - importlib.import_module("dotenv") - except ImportError: - raise click.BadParameter( - "python-dotenv must be installed to load an env file.", - ctx=ctx, - param=param, - ) from None - - # Don't check FLASK_SKIP_DOTENV, that only disables automatically - # loading .env and .flaskenv files. - load_dotenv(value) - return value - - -# This option is eager so env vars are loaded as early as possible to be -# used by other options. -_env_file_option = click.Option( - ["-e", "--env-file"], - type=click.Path(exists=True, dir_okay=False), - help="Load environment variables from this file. python-dotenv must be installed.", - is_eager=True, - expose_value=False, - callback=_env_file_callback, -) - - -class FlaskGroup(AppGroup): - """Special subclass of the :class:`AppGroup` group that supports - loading more commands from the configured Flask app. Normally a - developer does not have to interface with this class but there are - some very advanced use cases for which it makes sense to create an - instance of this. see :ref:`custom-scripts`. - - :param add_default_commands: if this is True then the default run and - shell commands will be added. - :param add_version_option: adds the ``--version`` option. - :param create_app: an optional callback that is passed the script info and - returns the loaded app. - :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` - files to set environment variables. Will also change the working - directory to the directory containing the first file found. - :param set_debug_flag: Set the app's debug flag. - - .. versionchanged:: 2.2 - Added the ``-A/--app``, ``--debug/--no-debug``, ``-e/--env-file`` options. - - .. versionchanged:: 2.2 - An app context is pushed when running ``app.cli`` commands, so - ``@with_appcontext`` is no longer required for those commands. - - .. versionchanged:: 1.0 - If installed, python-dotenv will be used to load environment variables - from :file:`.env` and :file:`.flaskenv` files. - """ - - def __init__( - self, - add_default_commands: bool = True, - create_app: t.Callable[..., Flask] | None = None, - add_version_option: bool = True, - load_dotenv: bool = True, - set_debug_flag: bool = True, - **extra: t.Any, - ) -> None: - params = list(extra.pop("params", None) or ()) - # Processing is done with option callbacks instead of a group - # callback. This allows users to make a custom group callback - # without losing the behavior. --env-file must come first so - # that it is eagerly evaluated before --app. - params.extend((_env_file_option, _app_option, _debug_option)) - - if add_version_option: - params.append(version_option) - - if "context_settings" not in extra: - extra["context_settings"] = {} - - extra["context_settings"].setdefault("auto_envvar_prefix", "FLASK") - - super().__init__(params=params, **extra) - - self.create_app = create_app - self.load_dotenv = load_dotenv - self.set_debug_flag = set_debug_flag - - if add_default_commands: - self.add_command(run_command) - self.add_command(shell_command) - self.add_command(routes_command) - - self._loaded_plugin_commands = False - - def _load_plugin_commands(self): - if self._loaded_plugin_commands: - return - - if sys.version_info >= (3, 10): - from importlib import metadata - else: - # Use a backport on Python < 3.10. We technically have - # importlib.metadata on 3.8+, but the API changed in 3.10, - # so use the backport for consistency. - import importlib_metadata as metadata - - for ep in metadata.entry_points(group="flask.commands"): - self.add_command(ep.load(), ep.name) - - self._loaded_plugin_commands = True - - def get_command(self, ctx, name): - self._load_plugin_commands() - # Look up built-in and plugin commands, which should be - # available even if the app fails to load. - rv = super().get_command(ctx, name) - - if rv is not None: - return rv - - info = ctx.ensure_object(ScriptInfo) - - # Look up commands provided by the app, showing an error and - # continuing if the app couldn't be loaded. - try: - app = info.load_app() - except NoAppException as e: - click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") - return None - - # Push an app context for the loaded app unless it is already - # active somehow. This makes the context available to parameter - # and command callbacks without needing @with_appcontext. - if not current_app or current_app._get_current_object() is not app: - ctx.with_resource(app.app_context()) - - return app.cli.get_command(ctx, name) - - def list_commands(self, ctx): - self._load_plugin_commands() - # Start with the built-in and plugin commands. - rv = set(super().list_commands(ctx)) - info = ctx.ensure_object(ScriptInfo) - - # Add commands provided by the app, showing an error and - # continuing if the app couldn't be loaded. - try: - rv.update(info.load_app().cli.list_commands(ctx)) - except NoAppException as e: - # When an app couldn't be loaded, show the error message - # without the traceback. - click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") - except Exception: - # When any other errors occurred during loading, show the - # full traceback. - click.secho(f"{traceback.format_exc()}\n", err=True, fg="red") - - return sorted(rv) - - def make_context( - self, - info_name: str | None, - args: list[str], - parent: click.Context | None = None, - **extra: t.Any, - ) -> click.Context: - # Set a flag to tell app.run to become a no-op. If app.run was - # not in a __name__ == __main__ guard, it would start the server - # when importing, blocking whatever command is being called. - os.environ["FLASK_RUN_FROM_CLI"] = "true" - - # Attempt to load .env and .flask env files. The --env-file - # option can cause another file to be loaded. - if get_load_dotenv(self.load_dotenv): - load_dotenv() - - if "obj" not in extra and "obj" not in self.context_settings: - extra["obj"] = ScriptInfo( - create_app=self.create_app, set_debug_flag=self.set_debug_flag - ) - - return super().make_context(info_name, args, parent=parent, **extra) - - def parse_args(self, ctx: click.Context, args: list[str]) -> list[str]: - if not args and self.no_args_is_help: - # Attempt to load --env-file and --app early in case they - # were given as env vars. Otherwise no_args_is_help will not - # see commands from app.cli. - _env_file_option.handle_parse_result(ctx, {}, []) - _app_option.handle_parse_result(ctx, {}, []) - - return super().parse_args(ctx, args) - - -def _path_is_ancestor(path, other): - """Take ``other`` and remove the length of ``path`` from it. Then join it - to ``path``. If it is the original value, ``path`` is an ancestor of - ``other``.""" - return os.path.join(path, other[len(path) :].lstrip(os.sep)) == other - - -def load_dotenv(path: str | os.PathLike | None = None) -> bool: - """Load "dotenv" files in order of precedence to set environment variables. - - If an env var is already set it is not overwritten, so earlier files in the - list are preferred over later files. - - This is a no-op if `python-dotenv`_ is not installed. - - .. _python-dotenv: https://github.com/theskumar/python-dotenv#readme - - :param path: Load the file at this location instead of searching. - :return: ``True`` if a file was loaded. - - .. versionchanged:: 2.0 - The current directory is not changed to the location of the - loaded file. - - .. versionchanged:: 2.0 - When loading the env files, set the default encoding to UTF-8. - - .. versionchanged:: 1.1.0 - Returns ``False`` when python-dotenv is not installed, or when - the given path isn't a file. - - .. versionadded:: 1.0 - """ - try: - import dotenv - except ImportError: - if path or os.path.isfile(".env") or os.path.isfile(".flaskenv"): - click.secho( - " * Tip: There are .env or .flaskenv files present." - ' Do "pip install python-dotenv" to use them.', - fg="yellow", - err=True, - ) - - return False - - # Always return after attempting to load a given path, don't load - # the default files. - if path is not None: - if os.path.isfile(path): - return dotenv.load_dotenv(path, encoding="utf-8") - - return False - - loaded = False - - for name in (".env", ".flaskenv"): - path = dotenv.find_dotenv(name, usecwd=True) - - if not path: - continue - - dotenv.load_dotenv(path, encoding="utf-8") - loaded = True - - return loaded # True if at least one file was located and loaded. - - -def show_server_banner(debug, app_import_path): - """Show extra startup messages the first time the server is run, - ignoring the reloader. - """ - if is_running_from_reloader(): - return - - if app_import_path is not None: - click.echo(f" * Serving Flask app '{app_import_path}'") - - if debug is not None: - click.echo(f" * Debug mode: {'on' if debug else 'off'}") - - -class CertParamType(click.ParamType): - """Click option type for the ``--cert`` option. Allows either an - existing file, the string ``'adhoc'``, or an import for a - :class:`~ssl.SSLContext` object. - """ - - name = "path" - - def __init__(self): - self.path_type = click.Path(exists=True, dir_okay=False, resolve_path=True) - - def convert(self, value, param, ctx): - try: - import ssl - except ImportError: - raise click.BadParameter( - 'Using "--cert" requires Python to be compiled with SSL support.', - ctx, - param, - ) from None - - try: - return self.path_type(value, param, ctx) - except click.BadParameter: - value = click.STRING(value, param, ctx).lower() - - if value == "adhoc": - try: - import cryptography # noqa: F401 - except ImportError: - raise click.BadParameter( - "Using ad-hoc certificates requires the cryptography library.", - ctx, - param, - ) from None - - return value - - obj = import_string(value, silent=True) - - if isinstance(obj, ssl.SSLContext): - return obj - - raise - - -def _validate_key(ctx, param, value): - """The ``--key`` option must be specified when ``--cert`` is a file. - Modifies the ``cert`` param to be a ``(cert, key)`` pair if needed. - """ - cert = ctx.params.get("cert") - is_adhoc = cert == "adhoc" - - try: - import ssl - except ImportError: - is_context = False - else: - is_context = isinstance(cert, ssl.SSLContext) - - if value is not None: - if is_adhoc: - raise click.BadParameter( - 'When "--cert" is "adhoc", "--key" is not used.', ctx, param - ) - - if is_context: - raise click.BadParameter( - 'When "--cert" is an SSLContext object, "--key is not used.', ctx, param - ) - - if not cert: - raise click.BadParameter('"--cert" must also be specified.', ctx, param) - - ctx.params["cert"] = cert, value - - else: - if cert and not (is_adhoc or is_context): - raise click.BadParameter('Required when using "--cert".', ctx, param) - - return value - - -class SeparatedPathType(click.Path): - """Click option type that accepts a list of values separated by the - OS's path separator (``:``, ``;`` on Windows). Each value is - validated as a :class:`click.Path` type. - """ - - def convert(self, value, param, ctx): - items = self.split_envvar_value(value) - super_convert = super().convert - return [super_convert(item, param, ctx) for item in items] - - -@click.command("run", short_help="Run a development server.") -@click.option("--host", "-h", default="127.0.0.1", help="The interface to bind to.") -@click.option("--port", "-p", default=5000, help="The port to bind to.") -@click.option( - "--cert", - type=CertParamType(), - help="Specify a certificate file to use HTTPS.", - is_eager=True, -) -@click.option( - "--key", - type=click.Path(exists=True, dir_okay=False, resolve_path=True), - callback=_validate_key, - expose_value=False, - help="The key file to use when specifying a certificate.", -) -@click.option( - "--reload/--no-reload", - default=None, - help="Enable or disable the reloader. By default the reloader " - "is active if debug is enabled.", -) -@click.option( - "--debugger/--no-debugger", - default=None, - help="Enable or disable the debugger. By default the debugger " - "is active if debug is enabled.", -) -@click.option( - "--with-threads/--without-threads", - default=True, - help="Enable or disable multithreading.", -) -@click.option( - "--extra-files", - default=None, - type=SeparatedPathType(), - help=( - "Extra files that trigger a reload on change. Multiple paths" - f" are separated by {os.path.pathsep!r}." - ), -) -@click.option( - "--exclude-patterns", - default=None, - type=SeparatedPathType(), - help=( - "Files matching these fnmatch patterns will not trigger a reload" - " on change. Multiple patterns are separated by" - f" {os.path.pathsep!r}." - ), -) -@pass_script_info -def run_command( - info, - host, - port, - reload, - debugger, - with_threads, - cert, - extra_files, - exclude_patterns, -): - """Run a local development server. - - This server is for development purposes only. It does not provide - the stability, security, or performance of production WSGI servers. - - The reloader and debugger are enabled by default with the '--debug' - option. - """ - try: - app = info.load_app() - except Exception as e: - if is_running_from_reloader(): - # When reloading, print out the error immediately, but raise - # it later so the debugger or server can handle it. - traceback.print_exc() - err = e - - def app(environ, start_response): - raise err from None - - else: - # When not reloading, raise the error immediately so the - # command fails. - raise e from None - - debug = get_debug_flag() - - if reload is None: - reload = debug - - if debugger is None: - debugger = debug - - show_server_banner(debug, info.app_import_path) - - run_simple( - host, - port, - app, - use_reloader=reload, - use_debugger=debugger, - threaded=with_threads, - ssl_context=cert, - extra_files=extra_files, - exclude_patterns=exclude_patterns, - ) - - -run_command.params.insert(0, _debug_option) - - -@click.command("shell", short_help="Run a shell in the app context.") -@with_appcontext -def shell_command() -> None: - """Run an interactive Python shell in the context of a given - Flask application. The application will populate the default - namespace of this shell according to its configuration. - - This is useful for executing small snippets of management code - without having to manually configure the application. - """ - import code - - banner = ( - f"Python {sys.version} on {sys.platform}\n" - f"App: {current_app.import_name}\n" - f"Instance: {current_app.instance_path}" - ) - ctx: dict = {} - - # Support the regular Python interpreter startup script if someone - # is using it. - startup = os.environ.get("PYTHONSTARTUP") - if startup and os.path.isfile(startup): - with open(startup) as f: - eval(compile(f.read(), startup, "exec"), ctx) - - ctx.update(current_app.make_shell_context()) - - # Site, customize, or startup script can set a hook to call when - # entering interactive mode. The default one sets up readline with - # tab and history completion. - interactive_hook = getattr(sys, "__interactivehook__", None) - - if interactive_hook is not None: - try: - import readline - from rlcompleter import Completer - except ImportError: - pass - else: - # rlcompleter uses __main__.__dict__ by default, which is - # flask.__main__. Use the shell context instead. - readline.set_completer(Completer(ctx).complete) - - interactive_hook() - - code.interact(banner=banner, local=ctx) - - -@click.command("routes", short_help="Show the routes for the app.") -@click.option( - "--sort", - "-s", - type=click.Choice(("endpoint", "methods", "domain", "rule", "match")), - default="endpoint", - help=( - "Method to sort routes by. 'match' is the order that Flask will match routes" - " when dispatching a request." - ), -) -@click.option("--all-methods", is_flag=True, help="Show HEAD and OPTIONS methods.") -@with_appcontext -def routes_command(sort: str, all_methods: bool) -> None: - """Show all registered routes with endpoints and methods.""" - rules = list(current_app.url_map.iter_rules()) - - if not rules: - click.echo("No routes were registered.") - return - - ignored_methods = set() if all_methods else {"HEAD", "OPTIONS"} - host_matching = current_app.url_map.host_matching - has_domain = any(rule.host if host_matching else rule.subdomain for rule in rules) - rows = [] - - for rule in rules: - row = [ - rule.endpoint, - ", ".join(sorted((rule.methods or set()) - ignored_methods)), - ] - - if has_domain: - row.append((rule.host if host_matching else rule.subdomain) or "") - - row.append(rule.rule) - rows.append(row) - - headers = ["Endpoint", "Methods"] - sorts = ["endpoint", "methods"] - - if has_domain: - headers.append("Host" if host_matching else "Subdomain") - sorts.append("domain") - - headers.append("Rule") - sorts.append("rule") - - try: - rows.sort(key=itemgetter(sorts.index(sort))) - except ValueError: - pass - - rows.insert(0, headers) - widths = [max(len(row[i]) for row in rows) for i in range(len(headers))] - rows.insert(1, ["-" * w for w in widths]) - template = " ".join(f"{{{i}:<{w}}}" for i, w in enumerate(widths)) - - for row in rows: - click.echo(template.format(*row)) - - -cli = FlaskGroup( - name="flask", - help="""\ -A general utility script for Flask applications. - -An application to load must be given with the '--app' option, -'FLASK_APP' environment variable, or with a 'wsgi.py' or 'app.py' file -in the current directory. -""", -) - - -def main() -> None: - cli.main() - - -if __name__ == "__main__": - main() diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/config.py b/venv_flaskchat/lib/python3.11/site-packages/flask/config.py deleted file mode 100644 index a73dd78..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/config.py +++ /dev/null @@ -1,345 +0,0 @@ -from __future__ import annotations - -import errno -import json -import os -import types -import typing as t - -from werkzeug.utils import import_string - - -class ConfigAttribute: - """Makes an attribute forward to the config""" - - def __init__(self, name: str, get_converter: t.Callable | None = None) -> None: - self.__name__ = name - self.get_converter = get_converter - - def __get__(self, obj: t.Any, owner: t.Any = None) -> t.Any: - if obj is None: - return self - rv = obj.config[self.__name__] - if self.get_converter is not None: - rv = self.get_converter(rv) - return rv - - def __set__(self, obj: t.Any, value: t.Any) -> None: - obj.config[self.__name__] = value - - -class Config(dict): - """Works exactly like a dict but provides ways to fill it from files - or special dictionaries. There are two common patterns to populate the - config. - - Either you can fill the config from a config file:: - - app.config.from_pyfile('yourconfig.cfg') - - Or alternatively you can define the configuration options in the - module that calls :meth:`from_object` or provide an import path to - a module that should be loaded. It is also possible to tell it to - use the same module and with that provide the configuration values - just before the call:: - - DEBUG = True - SECRET_KEY = 'development key' - app.config.from_object(__name__) - - In both cases (loading from any Python file or loading from modules), - only uppercase keys are added to the config. This makes it possible to use - lowercase values in the config file for temporary values that are not added - to the config or to define the config keys in the same file that implements - the application. - - Probably the most interesting way to load configurations is from an - environment variable pointing to a file:: - - app.config.from_envvar('YOURAPPLICATION_SETTINGS') - - In this case before launching the application you have to set this - environment variable to the file you want to use. On Linux and OS X - use the export statement:: - - export YOURAPPLICATION_SETTINGS='/path/to/config/file' - - On windows use `set` instead. - - :param root_path: path to which files are read relative from. When the - config object is created by the application, this is - the application's :attr:`~flask.Flask.root_path`. - :param defaults: an optional dictionary of default values - """ - - def __init__(self, root_path: str, defaults: dict | None = None) -> None: - super().__init__(defaults or {}) - self.root_path = root_path - - def from_envvar(self, variable_name: str, silent: bool = False) -> bool: - """Loads a configuration from an environment variable pointing to - a configuration file. This is basically just a shortcut with nicer - error messages for this line of code:: - - app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS']) - - :param variable_name: name of the environment variable - :param silent: set to ``True`` if you want silent failure for missing - files. - :return: ``True`` if the file was loaded successfully. - """ - rv = os.environ.get(variable_name) - if not rv: - if silent: - return False - raise RuntimeError( - f"The environment variable {variable_name!r} is not set" - " and as such configuration could not be loaded. Set" - " this variable and make it point to a configuration" - " file" - ) - return self.from_pyfile(rv, silent=silent) - - def from_prefixed_env( - self, prefix: str = "FLASK", *, loads: t.Callable[[str], t.Any] = json.loads - ) -> bool: - """Load any environment variables that start with ``FLASK_``, - dropping the prefix from the env key for the config key. Values - are passed through a loading function to attempt to convert them - to more specific types than strings. - - Keys are loaded in :func:`sorted` order. - - The default loading function attempts to parse values as any - valid JSON type, including dicts and lists. - - Specific items in nested dicts can be set by separating the - keys with double underscores (``__``). If an intermediate key - doesn't exist, it will be initialized to an empty dict. - - :param prefix: Load env vars that start with this prefix, - separated with an underscore (``_``). - :param loads: Pass each string value to this function and use - the returned value as the config value. If any error is - raised it is ignored and the value remains a string. The - default is :func:`json.loads`. - - .. versionadded:: 2.1 - """ - prefix = f"{prefix}_" - len_prefix = len(prefix) - - for key in sorted(os.environ): - if not key.startswith(prefix): - continue - - value = os.environ[key] - - try: - value = loads(value) - except Exception: - # Keep the value as a string if loading failed. - pass - - # Change to key.removeprefix(prefix) on Python >= 3.9. - key = key[len_prefix:] - - if "__" not in key: - # A non-nested key, set directly. - self[key] = value - continue - - # Traverse nested dictionaries with keys separated by "__". - current = self - *parts, tail = key.split("__") - - for part in parts: - # If an intermediate dict does not exist, create it. - if part not in current: - current[part] = {} - - current = current[part] - - current[tail] = value - - return True - - def from_pyfile(self, filename: str, silent: bool = False) -> bool: - """Updates the values in the config from a Python file. This function - behaves as if the file was imported as module with the - :meth:`from_object` function. - - :param filename: the filename of the config. This can either be an - absolute filename or a filename relative to the - root path. - :param silent: set to ``True`` if you want silent failure for missing - files. - :return: ``True`` if the file was loaded successfully. - - .. versionadded:: 0.7 - `silent` parameter. - """ - filename = os.path.join(self.root_path, filename) - d = types.ModuleType("config") - d.__file__ = filename - try: - with open(filename, mode="rb") as config_file: - exec(compile(config_file.read(), filename, "exec"), d.__dict__) - except OSError as e: - if silent and e.errno in (errno.ENOENT, errno.EISDIR, errno.ENOTDIR): - return False - e.strerror = f"Unable to load configuration file ({e.strerror})" - raise - self.from_object(d) - return True - - def from_object(self, obj: object | str) -> None: - """Updates the values from the given object. An object can be of one - of the following two types: - - - a string: in this case the object with that name will be imported - - an actual object reference: that object is used directly - - Objects are usually either modules or classes. :meth:`from_object` - loads only the uppercase attributes of the module/class. A ``dict`` - object will not work with :meth:`from_object` because the keys of a - ``dict`` are not attributes of the ``dict`` class. - - Example of module-based configuration:: - - app.config.from_object('yourapplication.default_config') - from yourapplication import default_config - app.config.from_object(default_config) - - Nothing is done to the object before loading. If the object is a - class and has ``@property`` attributes, it needs to be - instantiated before being passed to this method. - - You should not use this function to load the actual configuration but - rather configuration defaults. The actual config should be loaded - with :meth:`from_pyfile` and ideally from a location not within the - package because the package might be installed system wide. - - See :ref:`config-dev-prod` for an example of class-based configuration - using :meth:`from_object`. - - :param obj: an import name or object - """ - if isinstance(obj, str): - obj = import_string(obj) - for key in dir(obj): - if key.isupper(): - self[key] = getattr(obj, key) - - def from_file( - self, - filename: str, - load: t.Callable[[t.IO[t.Any]], t.Mapping], - silent: bool = False, - text: bool = True, - ) -> bool: - """Update the values in the config from a file that is loaded - using the ``load`` parameter. The loaded data is passed to the - :meth:`from_mapping` method. - - .. code-block:: python - - import json - app.config.from_file("config.json", load=json.load) - - import tomllib - app.config.from_file("config.toml", load=tomllib.load, text=False) - - :param filename: The path to the data file. This can be an - absolute path or relative to the config root path. - :param load: A callable that takes a file handle and returns a - mapping of loaded data from the file. - :type load: ``Callable[[Reader], Mapping]`` where ``Reader`` - implements a ``read`` method. - :param silent: Ignore the file if it doesn't exist. - :param text: Open the file in text or binary mode. - :return: ``True`` if the file was loaded successfully. - - .. versionchanged:: 2.3 - The ``text`` parameter was added. - - .. versionadded:: 2.0 - """ - filename = os.path.join(self.root_path, filename) - - try: - with open(filename, "r" if text else "rb") as f: - obj = load(f) - except OSError as e: - if silent and e.errno in (errno.ENOENT, errno.EISDIR): - return False - - e.strerror = f"Unable to load configuration file ({e.strerror})" - raise - - return self.from_mapping(obj) - - def from_mapping( - self, mapping: t.Mapping[str, t.Any] | None = None, **kwargs: t.Any - ) -> bool: - """Updates the config like :meth:`update` ignoring items with - non-upper keys. - - :return: Always returns ``True``. - - .. versionadded:: 0.11 - """ - mappings: dict[str, t.Any] = {} - if mapping is not None: - mappings.update(mapping) - mappings.update(kwargs) - for key, value in mappings.items(): - if key.isupper(): - self[key] = value - return True - - def get_namespace( - self, namespace: str, lowercase: bool = True, trim_namespace: bool = True - ) -> dict[str, t.Any]: - """Returns a dictionary containing a subset of configuration options - that match the specified namespace/prefix. Example usage:: - - app.config['IMAGE_STORE_TYPE'] = 'fs' - app.config['IMAGE_STORE_PATH'] = '/var/app/images' - app.config['IMAGE_STORE_BASE_URL'] = 'http://img.website.com' - image_store_config = app.config.get_namespace('IMAGE_STORE_') - - The resulting dictionary `image_store_config` would look like:: - - { - 'type': 'fs', - 'path': '/var/app/images', - 'base_url': 'http://img.website.com' - } - - This is often useful when configuration options map directly to - keyword arguments in functions or class constructors. - - :param namespace: a configuration namespace - :param lowercase: a flag indicating if the keys of the resulting - dictionary should be lowercase - :param trim_namespace: a flag indicating if the keys of the resulting - dictionary should not include the namespace - - .. versionadded:: 0.11 - """ - rv = {} - for k, v in self.items(): - if not k.startswith(namespace): - continue - if trim_namespace: - key = k[len(namespace) :] - else: - key = k - if lowercase: - key = key.lower() - rv[key] = v - return rv - - def __repr__(self) -> str: - return f"<{type(self).__name__} {dict.__repr__(self)}>" diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/ctx.py b/venv_flaskchat/lib/python3.11/site-packages/flask/ctx.py deleted file mode 100644 index b37e4e0..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/ctx.py +++ /dev/null @@ -1,440 +0,0 @@ -from __future__ import annotations - -import contextvars -import sys -import typing as t -from functools import update_wrapper -from types import TracebackType - -from werkzeug.exceptions import HTTPException - -from . import typing as ft -from .globals import _cv_app -from .globals import _cv_request -from .signals import appcontext_popped -from .signals import appcontext_pushed - -if t.TYPE_CHECKING: # pragma: no cover - from .app import Flask - from .sessions import SessionMixin - from .wrappers import Request - - -# a singleton sentinel value for parameter defaults -_sentinel = object() - - -class _AppCtxGlobals: - """A plain object. Used as a namespace for storing data during an - application context. - - Creating an app context automatically creates this object, which is - made available as the :data:`g` proxy. - - .. describe:: 'key' in g - - Check whether an attribute is present. - - .. versionadded:: 0.10 - - .. describe:: iter(g) - - Return an iterator over the attribute names. - - .. versionadded:: 0.10 - """ - - # Define attr methods to let mypy know this is a namespace object - # that has arbitrary attributes. - - def __getattr__(self, name: str) -> t.Any: - try: - return self.__dict__[name] - except KeyError: - raise AttributeError(name) from None - - def __setattr__(self, name: str, value: t.Any) -> None: - self.__dict__[name] = value - - def __delattr__(self, name: str) -> None: - try: - del self.__dict__[name] - except KeyError: - raise AttributeError(name) from None - - def get(self, name: str, default: t.Any | None = None) -> t.Any: - """Get an attribute by name, or a default value. Like - :meth:`dict.get`. - - :param name: Name of attribute to get. - :param default: Value to return if the attribute is not present. - - .. versionadded:: 0.10 - """ - return self.__dict__.get(name, default) - - def pop(self, name: str, default: t.Any = _sentinel) -> t.Any: - """Get and remove an attribute by name. Like :meth:`dict.pop`. - - :param name: Name of attribute to pop. - :param default: Value to return if the attribute is not present, - instead of raising a ``KeyError``. - - .. versionadded:: 0.11 - """ - if default is _sentinel: - return self.__dict__.pop(name) - else: - return self.__dict__.pop(name, default) - - def setdefault(self, name: str, default: t.Any = None) -> t.Any: - """Get the value of an attribute if it is present, otherwise - set and return a default value. Like :meth:`dict.setdefault`. - - :param name: Name of attribute to get. - :param default: Value to set and return if the attribute is not - present. - - .. versionadded:: 0.11 - """ - return self.__dict__.setdefault(name, default) - - def __contains__(self, item: str) -> bool: - return item in self.__dict__ - - def __iter__(self) -> t.Iterator[str]: - return iter(self.__dict__) - - def __repr__(self) -> str: - ctx = _cv_app.get(None) - if ctx is not None: - return f"" - return object.__repr__(self) - - -def after_this_request(f: ft.AfterRequestCallable) -> ft.AfterRequestCallable: - """Executes a function after this request. This is useful to modify - response objects. The function is passed the response object and has - to return the same or a new one. - - Example:: - - @app.route('/') - def index(): - @after_this_request - def add_header(response): - response.headers['X-Foo'] = 'Parachute' - return response - return 'Hello World!' - - This is more useful if a function other than the view function wants to - modify a response. For instance think of a decorator that wants to add - some headers without converting the return value into a response object. - - .. versionadded:: 0.9 - """ - ctx = _cv_request.get(None) - - if ctx is None: - raise RuntimeError( - "'after_this_request' can only be used when a request" - " context is active, such as in a view function." - ) - - ctx._after_request_functions.append(f) - return f - - -def copy_current_request_context(f: t.Callable) -> t.Callable: - """A helper function that decorates a function to retain the current - request context. This is useful when working with greenlets. The moment - the function is decorated a copy of the request context is created and - then pushed when the function is called. The current session is also - included in the copied request context. - - Example:: - - import gevent - from flask import copy_current_request_context - - @app.route('/') - def index(): - @copy_current_request_context - def do_some_work(): - # do some work here, it can access flask.request or - # flask.session like you would otherwise in the view function. - ... - gevent.spawn(do_some_work) - return 'Regular response' - - .. versionadded:: 0.10 - """ - ctx = _cv_request.get(None) - - if ctx is None: - raise RuntimeError( - "'copy_current_request_context' can only be used when a" - " request context is active, such as in a view function." - ) - - ctx = ctx.copy() - - def wrapper(*args, **kwargs): - with ctx: - return ctx.app.ensure_sync(f)(*args, **kwargs) - - return update_wrapper(wrapper, f) - - -def has_request_context() -> bool: - """If you have code that wants to test if a request context is there or - not this function can be used. For instance, you may want to take advantage - of request information if the request object is available, but fail - silently if it is unavailable. - - :: - - class User(db.Model): - - def __init__(self, username, remote_addr=None): - self.username = username - if remote_addr is None and has_request_context(): - remote_addr = request.remote_addr - self.remote_addr = remote_addr - - Alternatively you can also just test any of the context bound objects - (such as :class:`request` or :class:`g`) for truthness:: - - class User(db.Model): - - def __init__(self, username, remote_addr=None): - self.username = username - if remote_addr is None and request: - remote_addr = request.remote_addr - self.remote_addr = remote_addr - - .. versionadded:: 0.7 - """ - return _cv_request.get(None) is not None - - -def has_app_context() -> bool: - """Works like :func:`has_request_context` but for the application - context. You can also just do a boolean check on the - :data:`current_app` object instead. - - .. versionadded:: 0.9 - """ - return _cv_app.get(None) is not None - - -class AppContext: - """The app context contains application-specific information. An app - context is created and pushed at the beginning of each request if - one is not already active. An app context is also pushed when - running CLI commands. - """ - - def __init__(self, app: Flask) -> None: - self.app = app - self.url_adapter = app.create_url_adapter(None) - self.g: _AppCtxGlobals = app.app_ctx_globals_class() - self._cv_tokens: list[contextvars.Token] = [] - - def push(self) -> None: - """Binds the app context to the current context.""" - self._cv_tokens.append(_cv_app.set(self)) - appcontext_pushed.send(self.app, _async_wrapper=self.app.ensure_sync) - - def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore - """Pops the app context.""" - try: - if len(self._cv_tokens) == 1: - if exc is _sentinel: - exc = sys.exc_info()[1] - self.app.do_teardown_appcontext(exc) - finally: - ctx = _cv_app.get() - _cv_app.reset(self._cv_tokens.pop()) - - if ctx is not self: - raise AssertionError( - f"Popped wrong app context. ({ctx!r} instead of {self!r})" - ) - - appcontext_popped.send(self.app, _async_wrapper=self.app.ensure_sync) - - def __enter__(self) -> AppContext: - self.push() - return self - - def __exit__( - self, - exc_type: type | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.pop(exc_value) - - -class RequestContext: - """The request context contains per-request information. The Flask - app creates and pushes it at the beginning of the request, then pops - it at the end of the request. It will create the URL adapter and - request object for the WSGI environment provided. - - Do not attempt to use this class directly, instead use - :meth:`~flask.Flask.test_request_context` and - :meth:`~flask.Flask.request_context` to create this object. - - When the request context is popped, it will evaluate all the - functions registered on the application for teardown execution - (:meth:`~flask.Flask.teardown_request`). - - The request context is automatically popped at the end of the - request. When using the interactive debugger, the context will be - restored so ``request`` is still accessible. Similarly, the test - client can preserve the context after the request ends. However, - teardown functions may already have closed some resources such as - database connections. - """ - - def __init__( - self, - app: Flask, - environ: dict, - request: Request | None = None, - session: SessionMixin | None = None, - ) -> None: - self.app = app - if request is None: - request = app.request_class(environ) - request.json_module = app.json - self.request: Request = request - self.url_adapter = None - try: - self.url_adapter = app.create_url_adapter(self.request) - except HTTPException as e: - self.request.routing_exception = e - self.flashes: list[tuple[str, str]] | None = None - self.session: SessionMixin | None = session - # Functions that should be executed after the request on the response - # object. These will be called before the regular "after_request" - # functions. - self._after_request_functions: list[ft.AfterRequestCallable] = [] - - self._cv_tokens: list[tuple[contextvars.Token, AppContext | None]] = [] - - def copy(self) -> RequestContext: - """Creates a copy of this request context with the same request object. - This can be used to move a request context to a different greenlet. - Because the actual request object is the same this cannot be used to - move a request context to a different thread unless access to the - request object is locked. - - .. versionadded:: 0.10 - - .. versionchanged:: 1.1 - The current session object is used instead of reloading the original - data. This prevents `flask.session` pointing to an out-of-date object. - """ - return self.__class__( - self.app, - environ=self.request.environ, - request=self.request, - session=self.session, - ) - - def match_request(self) -> None: - """Can be overridden by a subclass to hook into the matching - of the request. - """ - try: - result = self.url_adapter.match(return_rule=True) # type: ignore - self.request.url_rule, self.request.view_args = result # type: ignore - except HTTPException as e: - self.request.routing_exception = e - - def push(self) -> None: - # Before we push the request context we have to ensure that there - # is an application context. - app_ctx = _cv_app.get(None) - - if app_ctx is None or app_ctx.app is not self.app: - app_ctx = self.app.app_context() - app_ctx.push() - else: - app_ctx = None - - self._cv_tokens.append((_cv_request.set(self), app_ctx)) - - # Open the session at the moment that the request context is available. - # This allows a custom open_session method to use the request context. - # Only open a new session if this is the first time the request was - # pushed, otherwise stream_with_context loses the session. - if self.session is None: - session_interface = self.app.session_interface - self.session = session_interface.open_session(self.app, self.request) - - if self.session is None: - self.session = session_interface.make_null_session(self.app) - - # Match the request URL after loading the session, so that the - # session is available in custom URL converters. - if self.url_adapter is not None: - self.match_request() - - def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore - """Pops the request context and unbinds it by doing that. This will - also trigger the execution of functions registered by the - :meth:`~flask.Flask.teardown_request` decorator. - - .. versionchanged:: 0.9 - Added the `exc` argument. - """ - clear_request = len(self._cv_tokens) == 1 - - try: - if clear_request: - if exc is _sentinel: - exc = sys.exc_info()[1] - self.app.do_teardown_request(exc) - - request_close = getattr(self.request, "close", None) - if request_close is not None: - request_close() - finally: - ctx = _cv_request.get() - token, app_ctx = self._cv_tokens.pop() - _cv_request.reset(token) - - # get rid of circular dependencies at the end of the request - # so that we don't require the GC to be active. - if clear_request: - ctx.request.environ["werkzeug.request"] = None - - if app_ctx is not None: - app_ctx.pop(exc) - - if ctx is not self: - raise AssertionError( - f"Popped wrong request context. ({ctx!r} instead of {self!r})" - ) - - def __enter__(self) -> RequestContext: - self.push() - return self - - def __exit__( - self, - exc_type: type | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.pop(exc_value) - - def __repr__(self) -> str: - return ( - f"<{type(self).__name__} {self.request.url!r}" - f" [{self.request.method}] of {self.app.name}>" - ) diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/debughelpers.py b/venv_flaskchat/lib/python3.11/site-packages/flask/debughelpers.py deleted file mode 100644 index 6061441..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/debughelpers.py +++ /dev/null @@ -1,160 +0,0 @@ -from __future__ import annotations - -import typing as t - -from .app import Flask -from .blueprints import Blueprint -from .globals import request_ctx - - -class UnexpectedUnicodeError(AssertionError, UnicodeError): - """Raised in places where we want some better error reporting for - unexpected unicode or binary data. - """ - - -class DebugFilesKeyError(KeyError, AssertionError): - """Raised from request.files during debugging. The idea is that it can - provide a better error message than just a generic KeyError/BadRequest. - """ - - def __init__(self, request, key): - form_matches = request.form.getlist(key) - buf = [ - f"You tried to access the file {key!r} in the request.files" - " dictionary but it does not exist. The mimetype for the" - f" request is {request.mimetype!r} instead of" - " 'multipart/form-data' which means that no file contents" - " were transmitted. To fix this error you should provide" - ' enctype="multipart/form-data" in your form.' - ] - if form_matches: - names = ", ".join(repr(x) for x in form_matches) - buf.append( - "\n\nThe browser instead transmitted some file names. " - f"This was submitted: {names}" - ) - self.msg = "".join(buf) - - def __str__(self): - return self.msg - - -class FormDataRoutingRedirect(AssertionError): - """This exception is raised in debug mode if a routing redirect - would cause the browser to drop the method or body. This happens - when method is not GET, HEAD or OPTIONS and the status code is not - 307 or 308. - """ - - def __init__(self, request): - exc = request.routing_exception - buf = [ - f"A request was sent to '{request.url}', but routing issued" - f" a redirect to the canonical URL '{exc.new_url}'." - ] - - if f"{request.base_url}/" == exc.new_url.partition("?")[0]: - buf.append( - " The URL was defined with a trailing slash. Flask" - " will redirect to the URL with a trailing slash if it" - " was accessed without one." - ) - - buf.append( - " Send requests to the canonical URL, or use 307 or 308 for" - " routing redirects. Otherwise, browsers will drop form" - " data.\n\n" - "This exception is only raised in debug mode." - ) - super().__init__("".join(buf)) - - -def attach_enctype_error_multidict(request): - """Patch ``request.files.__getitem__`` to raise a descriptive error - about ``enctype=multipart/form-data``. - - :param request: The request to patch. - :meta private: - """ - oldcls = request.files.__class__ - - class newcls(oldcls): - def __getitem__(self, key): - try: - return super().__getitem__(key) - except KeyError as e: - if key not in request.form: - raise - - raise DebugFilesKeyError(request, key).with_traceback( - e.__traceback__ - ) from None - - newcls.__name__ = oldcls.__name__ - newcls.__module__ = oldcls.__module__ - request.files.__class__ = newcls - - -def _dump_loader_info(loader) -> t.Generator: - yield f"class: {type(loader).__module__}.{type(loader).__name__}" - for key, value in sorted(loader.__dict__.items()): - if key.startswith("_"): - continue - if isinstance(value, (tuple, list)): - if not all(isinstance(x, str) for x in value): - continue - yield f"{key}:" - for item in value: - yield f" - {item}" - continue - elif not isinstance(value, (str, int, float, bool)): - continue - yield f"{key}: {value!r}" - - -def explain_template_loading_attempts(app: Flask, template, attempts) -> None: - """This should help developers understand what failed""" - info = [f"Locating template {template!r}:"] - total_found = 0 - blueprint = None - if request_ctx and request_ctx.request.blueprint is not None: - blueprint = request_ctx.request.blueprint - - for idx, (loader, srcobj, triple) in enumerate(attempts): - if isinstance(srcobj, Flask): - src_info = f"application {srcobj.import_name!r}" - elif isinstance(srcobj, Blueprint): - src_info = f"blueprint {srcobj.name!r} ({srcobj.import_name})" - else: - src_info = repr(srcobj) - - info.append(f"{idx + 1:5}: trying loader of {src_info}") - - for line in _dump_loader_info(loader): - info.append(f" {line}") - - if triple is None: - detail = "no match" - else: - detail = f"found ({triple[1] or ''!r})" - total_found += 1 - info.append(f" -> {detail}") - - seems_fishy = False - if total_found == 0: - info.append("Error: the template could not be found.") - seems_fishy = True - elif total_found > 1: - info.append("Warning: multiple loaders returned a match for the template.") - seems_fishy = True - - if blueprint is not None and seems_fishy: - info.append( - " The template was looked up from an endpoint that belongs" - f" to the blueprint {blueprint!r}." - ) - info.append(" Maybe you did not place a template in the right folder?") - info.append(" See https://flask.palletsprojects.com/blueprints/#templates") - - app.logger.info("\n".join(info)) diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/globals.py b/venv_flaskchat/lib/python3.11/site-packages/flask/globals.py deleted file mode 100644 index e9cd4ac..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/globals.py +++ /dev/null @@ -1,96 +0,0 @@ -from __future__ import annotations - -import typing as t -from contextvars import ContextVar - -from werkzeug.local import LocalProxy - -if t.TYPE_CHECKING: # pragma: no cover - from .app import Flask - from .ctx import _AppCtxGlobals - from .ctx import AppContext - from .ctx import RequestContext - from .sessions import SessionMixin - from .wrappers import Request - - -class _FakeStack: - def __init__(self, name: str, cv: ContextVar[t.Any]) -> None: - self.name = name - self.cv = cv - - @property - def top(self) -> t.Any | None: - import warnings - - warnings.warn( - f"'_{self.name}_ctx_stack' is deprecated and will be removed in Flask 2.4." - f" Use 'g' to store data, or '{self.name}_ctx' to access the current" - " context.", - DeprecationWarning, - stacklevel=2, - ) - return self.cv.get(None) - - -_no_app_msg = """\ -Working outside of application context. - -This typically means that you attempted to use functionality that needed -the current application. To solve this, set up an application context -with app.app_context(). See the documentation for more information.\ -""" -_cv_app: ContextVar[AppContext] = ContextVar("flask.app_ctx") -__app_ctx_stack = _FakeStack("app", _cv_app) -app_ctx: AppContext = LocalProxy( # type: ignore[assignment] - _cv_app, unbound_message=_no_app_msg -) -current_app: Flask = LocalProxy( # type: ignore[assignment] - _cv_app, "app", unbound_message=_no_app_msg -) -g: _AppCtxGlobals = LocalProxy( # type: ignore[assignment] - _cv_app, "g", unbound_message=_no_app_msg -) - -_no_req_msg = """\ -Working outside of request context. - -This typically means that you attempted to use functionality that needed -an active HTTP request. Consult the documentation on testing for -information about how to avoid this problem.\ -""" -_cv_request: ContextVar[RequestContext] = ContextVar("flask.request_ctx") -__request_ctx_stack = _FakeStack("request", _cv_request) -request_ctx: RequestContext = LocalProxy( # type: ignore[assignment] - _cv_request, unbound_message=_no_req_msg -) -request: Request = LocalProxy( # type: ignore[assignment] - _cv_request, "request", unbound_message=_no_req_msg -) -session: SessionMixin = LocalProxy( # type: ignore[assignment] - _cv_request, "session", unbound_message=_no_req_msg -) - - -def __getattr__(name: str) -> t.Any: - if name == "_app_ctx_stack": - import warnings - - warnings.warn( - "'_app_ctx_stack' is deprecated and will be removed in Flask 2.4.", - DeprecationWarning, - stacklevel=2, - ) - return __app_ctx_stack - - if name == "_request_ctx_stack": - import warnings - - warnings.warn( - "'_request_ctx_stack' is deprecated and will be removed in Flask 2.4.", - DeprecationWarning, - stacklevel=2, - ) - return __request_ctx_stack - - raise AttributeError(name) diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/helpers.py b/venv_flaskchat/lib/python3.11/site-packages/flask/helpers.py deleted file mode 100644 index 61a0f81..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/helpers.py +++ /dev/null @@ -1,693 +0,0 @@ -from __future__ import annotations - -import os -import pkgutil -import socket -import sys -import typing as t -import warnings -from datetime import datetime -from functools import lru_cache -from functools import update_wrapper -from threading import RLock - -import werkzeug.utils -from werkzeug.exceptions import abort as _wz_abort -from werkzeug.utils import redirect as _wz_redirect - -from .globals import _cv_request -from .globals import current_app -from .globals import request -from .globals import request_ctx -from .globals import session -from .signals import message_flashed - -if t.TYPE_CHECKING: # pragma: no cover - from werkzeug.wrappers import Response as BaseResponse - from .wrappers import Response - - -def get_debug_flag() -> bool: - """Get whether debug mode should be enabled for the app, indicated by the - :envvar:`FLASK_DEBUG` environment variable. The default is ``False``. - """ - val = os.environ.get("FLASK_DEBUG") - return bool(val and val.lower() not in {"0", "false", "no"}) - - -def get_load_dotenv(default: bool = True) -> bool: - """Get whether the user has disabled loading default dotenv files by - setting :envvar:`FLASK_SKIP_DOTENV`. The default is ``True``, load - the files. - - :param default: What to return if the env var isn't set. - """ - val = os.environ.get("FLASK_SKIP_DOTENV") - - if not val: - return default - - return val.lower() in ("0", "false", "no") - - -def stream_with_context( - generator_or_function: ( - t.Iterator[t.AnyStr] | t.Callable[..., t.Iterator[t.AnyStr]] - ) -) -> t.Iterator[t.AnyStr]: - """Request contexts disappear when the response is started on the server. - This is done for efficiency reasons and to make it less likely to encounter - memory leaks with badly written WSGI middlewares. The downside is that if - you are using streamed responses, the generator cannot access request bound - information any more. - - This function however can help you keep the context around for longer:: - - from flask import stream_with_context, request, Response - - @app.route('/stream') - def streamed_response(): - @stream_with_context - def generate(): - yield 'Hello ' - yield request.args['name'] - yield '!' - return Response(generate()) - - Alternatively it can also be used around a specific generator:: - - from flask import stream_with_context, request, Response - - @app.route('/stream') - def streamed_response(): - def generate(): - yield 'Hello ' - yield request.args['name'] - yield '!' - return Response(stream_with_context(generate())) - - .. versionadded:: 0.9 - """ - try: - gen = iter(generator_or_function) # type: ignore - except TypeError: - - def decorator(*args: t.Any, **kwargs: t.Any) -> t.Any: - gen = generator_or_function(*args, **kwargs) # type: ignore - return stream_with_context(gen) - - return update_wrapper(decorator, generator_or_function) # type: ignore - - def generator() -> t.Generator: - ctx = _cv_request.get(None) - if ctx is None: - raise RuntimeError( - "'stream_with_context' can only be used when a request" - " context is active, such as in a view function." - ) - with ctx: - # Dummy sentinel. Has to be inside the context block or we're - # not actually keeping the context around. - yield None - - # The try/finally is here so that if someone passes a WSGI level - # iterator in we're still running the cleanup logic. Generators - # don't need that because they are closed on their destruction - # automatically. - try: - yield from gen - finally: - if hasattr(gen, "close"): - gen.close() - - # The trick is to start the generator. Then the code execution runs until - # the first dummy None is yielded at which point the context was already - # pushed. This item is discarded. Then when the iteration continues the - # real generator is executed. - wrapped_g = generator() - next(wrapped_g) - return wrapped_g - - -def make_response(*args: t.Any) -> Response: - """Sometimes it is necessary to set additional headers in a view. Because - views do not have to return response objects but can return a value that - is converted into a response object by Flask itself, it becomes tricky to - add headers to it. This function can be called instead of using a return - and you will get a response object which you can use to attach headers. - - If view looked like this and you want to add a new header:: - - def index(): - return render_template('index.html', foo=42) - - You can now do something like this:: - - def index(): - response = make_response(render_template('index.html', foo=42)) - response.headers['X-Parachutes'] = 'parachutes are cool' - return response - - This function accepts the very same arguments you can return from a - view function. This for example creates a response with a 404 error - code:: - - response = make_response(render_template('not_found.html'), 404) - - The other use case of this function is to force the return value of a - view function into a response which is helpful with view - decorators:: - - response = make_response(view_function()) - response.headers['X-Parachutes'] = 'parachutes are cool' - - Internally this function does the following things: - - - if no arguments are passed, it creates a new response argument - - if one argument is passed, :meth:`flask.Flask.make_response` - is invoked with it. - - if more than one argument is passed, the arguments are passed - to the :meth:`flask.Flask.make_response` function as tuple. - - .. versionadded:: 0.6 - """ - if not args: - return current_app.response_class() - if len(args) == 1: - args = args[0] - return current_app.make_response(args) # type: ignore - - -def url_for( - endpoint: str, - *, - _anchor: str | None = None, - _method: str | None = None, - _scheme: str | None = None, - _external: bool | None = None, - **values: t.Any, -) -> str: - """Generate a URL to the given endpoint with the given values. - - This requires an active request or application context, and calls - :meth:`current_app.url_for() `. See that method - for full documentation. - - :param endpoint: The endpoint name associated with the URL to - generate. If this starts with a ``.``, the current blueprint - name (if any) will be used. - :param _anchor: If given, append this as ``#anchor`` to the URL. - :param _method: If given, generate the URL associated with this - method for the endpoint. - :param _scheme: If given, the URL will have this scheme if it is - external. - :param _external: If given, prefer the URL to be internal (False) or - require it to be external (True). External URLs include the - scheme and domain. When not in an active request, URLs are - external by default. - :param values: Values to use for the variable parts of the URL rule. - Unknown keys are appended as query string arguments, like - ``?a=b&c=d``. - - .. versionchanged:: 2.2 - Calls ``current_app.url_for``, allowing an app to override the - behavior. - - .. versionchanged:: 0.10 - The ``_scheme`` parameter was added. - - .. versionchanged:: 0.9 - The ``_anchor`` and ``_method`` parameters were added. - - .. versionchanged:: 0.9 - Calls ``app.handle_url_build_error`` on build errors. - """ - return current_app.url_for( - endpoint, - _anchor=_anchor, - _method=_method, - _scheme=_scheme, - _external=_external, - **values, - ) - - -def redirect( - location: str, code: int = 302, Response: type[BaseResponse] | None = None -) -> BaseResponse: - """Create a redirect response object. - - If :data:`~flask.current_app` is available, it will use its - :meth:`~flask.Flask.redirect` method, otherwise it will use - :func:`werkzeug.utils.redirect`. - - :param location: The URL to redirect to. - :param code: The status code for the redirect. - :param Response: The response class to use. Not used when - ``current_app`` is active, which uses ``app.response_class``. - - .. versionadded:: 2.2 - Calls ``current_app.redirect`` if available instead of always - using Werkzeug's default ``redirect``. - """ - if current_app: - return current_app.redirect(location, code=code) - - return _wz_redirect(location, code=code, Response=Response) - - -def abort(code: int | BaseResponse, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: - """Raise an :exc:`~werkzeug.exceptions.HTTPException` for the given - status code. - - If :data:`~flask.current_app` is available, it will call its - :attr:`~flask.Flask.aborter` object, otherwise it will use - :func:`werkzeug.exceptions.abort`. - - :param code: The status code for the exception, which must be - registered in ``app.aborter``. - :param args: Passed to the exception. - :param kwargs: Passed to the exception. - - .. versionadded:: 2.2 - Calls ``current_app.aborter`` if available instead of always - using Werkzeug's default ``abort``. - """ - if current_app: - current_app.aborter(code, *args, **kwargs) - - _wz_abort(code, *args, **kwargs) - - -def get_template_attribute(template_name: str, attribute: str) -> t.Any: - """Loads a macro (or variable) a template exports. This can be used to - invoke a macro from within Python code. If you for example have a - template named :file:`_cider.html` with the following contents: - - .. sourcecode:: html+jinja - - {% macro hello(name) %}Hello {{ name }}!{% endmacro %} - - You can access this from Python code like this:: - - hello = get_template_attribute('_cider.html', 'hello') - return hello('World') - - .. versionadded:: 0.2 - - :param template_name: the name of the template - :param attribute: the name of the variable of macro to access - """ - return getattr(current_app.jinja_env.get_template(template_name).module, attribute) - - -def flash(message: str, category: str = "message") -> None: - """Flashes a message to the next request. In order to remove the - flashed message from the session and to display it to the user, - the template has to call :func:`get_flashed_messages`. - - .. versionchanged:: 0.3 - `category` parameter added. - - :param message: the message to be flashed. - :param category: the category for the message. The following values - are recommended: ``'message'`` for any kind of message, - ``'error'`` for errors, ``'info'`` for information - messages and ``'warning'`` for warnings. However any - kind of string can be used as category. - """ - # Original implementation: - # - # session.setdefault('_flashes', []).append((category, message)) - # - # This assumed that changes made to mutable structures in the session are - # always in sync with the session object, which is not true for session - # implementations that use external storage for keeping their keys/values. - flashes = session.get("_flashes", []) - flashes.append((category, message)) - session["_flashes"] = flashes - app = current_app._get_current_object() # type: ignore - message_flashed.send( - app, - _async_wrapper=app.ensure_sync, - message=message, - category=category, - ) - - -def get_flashed_messages( - with_categories: bool = False, category_filter: t.Iterable[str] = () -) -> list[str] | list[tuple[str, str]]: - """Pulls all flashed messages from the session and returns them. - Further calls in the same request to the function will return - the same messages. By default just the messages are returned, - but when `with_categories` is set to ``True``, the return value will - be a list of tuples in the form ``(category, message)`` instead. - - Filter the flashed messages to one or more categories by providing those - categories in `category_filter`. This allows rendering categories in - separate html blocks. The `with_categories` and `category_filter` - arguments are distinct: - - * `with_categories` controls whether categories are returned with message - text (``True`` gives a tuple, where ``False`` gives just the message text). - * `category_filter` filters the messages down to only those matching the - provided categories. - - See :doc:`/patterns/flashing` for examples. - - .. versionchanged:: 0.3 - `with_categories` parameter added. - - .. versionchanged:: 0.9 - `category_filter` parameter added. - - :param with_categories: set to ``True`` to also receive categories. - :param category_filter: filter of categories to limit return values. Only - categories in the list will be returned. - """ - flashes = request_ctx.flashes - if flashes is None: - flashes = session.pop("_flashes") if "_flashes" in session else [] - request_ctx.flashes = flashes - if category_filter: - flashes = list(filter(lambda f: f[0] in category_filter, flashes)) - if not with_categories: - return [x[1] for x in flashes] - return flashes - - -def _prepare_send_file_kwargs(**kwargs: t.Any) -> dict[str, t.Any]: - if kwargs.get("max_age") is None: - kwargs["max_age"] = current_app.get_send_file_max_age - - kwargs.update( - environ=request.environ, - use_x_sendfile=current_app.config["USE_X_SENDFILE"], - response_class=current_app.response_class, - _root_path=current_app.root_path, # type: ignore - ) - return kwargs - - -def send_file( - path_or_file: os.PathLike | str | t.BinaryIO, - mimetype: str | None = None, - as_attachment: bool = False, - download_name: str | None = None, - conditional: bool = True, - etag: bool | str = True, - last_modified: datetime | int | float | None = None, - max_age: None | (int | t.Callable[[str | None], int | None]) = None, -) -> Response: - """Send the contents of a file to the client. - - The first argument can be a file path or a file-like object. Paths - are preferred in most cases because Werkzeug can manage the file and - get extra information from the path. Passing a file-like object - requires that the file is opened in binary mode, and is mostly - useful when building a file in memory with :class:`io.BytesIO`. - - Never pass file paths provided by a user. The path is assumed to be - trusted, so a user could craft a path to access a file you didn't - intend. Use :func:`send_from_directory` to safely serve - user-requested paths from within a directory. - - If the WSGI server sets a ``file_wrapper`` in ``environ``, it is - used, otherwise Werkzeug's built-in wrapper is used. Alternatively, - if the HTTP server supports ``X-Sendfile``, configuring Flask with - ``USE_X_SENDFILE = True`` will tell the server to send the given - path, which is much more efficient than reading it in Python. - - :param path_or_file: The path to the file to send, relative to the - current working directory if a relative path is given. - Alternatively, a file-like object opened in binary mode. Make - sure the file pointer is seeked to the start of the data. - :param mimetype: The MIME type to send for the file. If not - provided, it will try to detect it from the file name. - :param as_attachment: Indicate to a browser that it should offer to - save the file instead of displaying it. - :param download_name: The default name browsers will use when saving - the file. Defaults to the passed file name. - :param conditional: Enable conditional and range responses based on - request headers. Requires passing a file path and ``environ``. - :param etag: Calculate an ETag for the file, which requires passing - a file path. Can also be a string to use instead. - :param last_modified: The last modified time to send for the file, - in seconds. If not provided, it will try to detect it from the - file path. - :param max_age: How long the client should cache the file, in - seconds. If set, ``Cache-Control`` will be ``public``, otherwise - it will be ``no-cache`` to prefer conditional caching. - - .. versionchanged:: 2.0 - ``download_name`` replaces the ``attachment_filename`` - parameter. If ``as_attachment=False``, it is passed with - ``Content-Disposition: inline`` instead. - - .. versionchanged:: 2.0 - ``max_age`` replaces the ``cache_timeout`` parameter. - ``conditional`` is enabled and ``max_age`` is not set by - default. - - .. versionchanged:: 2.0 - ``etag`` replaces the ``add_etags`` parameter. It can be a - string to use instead of generating one. - - .. versionchanged:: 2.0 - Passing a file-like object that inherits from - :class:`~io.TextIOBase` will raise a :exc:`ValueError` rather - than sending an empty file. - - .. versionadded:: 2.0 - Moved the implementation to Werkzeug. This is now a wrapper to - pass some Flask-specific arguments. - - .. versionchanged:: 1.1 - ``filename`` may be a :class:`~os.PathLike` object. - - .. versionchanged:: 1.1 - Passing a :class:`~io.BytesIO` object supports range requests. - - .. versionchanged:: 1.0.3 - Filenames are encoded with ASCII instead of Latin-1 for broader - compatibility with WSGI servers. - - .. versionchanged:: 1.0 - UTF-8 filenames as specified in :rfc:`2231` are supported. - - .. versionchanged:: 0.12 - The filename is no longer automatically inferred from file - objects. If you want to use automatic MIME and etag support, - pass a filename via ``filename_or_fp`` or - ``attachment_filename``. - - .. versionchanged:: 0.12 - ``attachment_filename`` is preferred over ``filename`` for MIME - detection. - - .. versionchanged:: 0.9 - ``cache_timeout`` defaults to - :meth:`Flask.get_send_file_max_age`. - - .. versionchanged:: 0.7 - MIME guessing and etag support for file-like objects was - deprecated because it was unreliable. Pass a filename if you are - able to, otherwise attach an etag yourself. - - .. versionchanged:: 0.5 - The ``add_etags``, ``cache_timeout`` and ``conditional`` - parameters were added. The default behavior is to add etags. - - .. versionadded:: 0.2 - """ - return werkzeug.utils.send_file( # type: ignore[return-value] - **_prepare_send_file_kwargs( - path_or_file=path_or_file, - environ=request.environ, - mimetype=mimetype, - as_attachment=as_attachment, - download_name=download_name, - conditional=conditional, - etag=etag, - last_modified=last_modified, - max_age=max_age, - ) - ) - - -def send_from_directory( - directory: os.PathLike | str, - path: os.PathLike | str, - **kwargs: t.Any, -) -> Response: - """Send a file from within a directory using :func:`send_file`. - - .. code-block:: python - - @app.route("/uploads/") - def download_file(name): - return send_from_directory( - app.config['UPLOAD_FOLDER'], name, as_attachment=True - ) - - This is a secure way to serve files from a folder, such as static - files or uploads. Uses :func:`~werkzeug.security.safe_join` to - ensure the path coming from the client is not maliciously crafted to - point outside the specified directory. - - If the final path does not point to an existing regular file, - raises a 404 :exc:`~werkzeug.exceptions.NotFound` error. - - :param directory: The directory that ``path`` must be located under, - relative to the current application's root path. - :param path: The path to the file to send, relative to - ``directory``. - :param kwargs: Arguments to pass to :func:`send_file`. - - .. versionchanged:: 2.0 - ``path`` replaces the ``filename`` parameter. - - .. versionadded:: 2.0 - Moved the implementation to Werkzeug. This is now a wrapper to - pass some Flask-specific arguments. - - .. versionadded:: 0.5 - """ - return werkzeug.utils.send_from_directory( # type: ignore[return-value] - directory, path, **_prepare_send_file_kwargs(**kwargs) - ) - - -def get_root_path(import_name: str) -> str: - """Find the root path of a package, or the path that contains a - module. If it cannot be found, returns the current working - directory. - - Not to be confused with the value returned by :func:`find_package`. - - :meta private: - """ - # Module already imported and has a file attribute. Use that first. - mod = sys.modules.get(import_name) - - if mod is not None and hasattr(mod, "__file__") and mod.__file__ is not None: - return os.path.dirname(os.path.abspath(mod.__file__)) - - # Next attempt: check the loader. - loader = pkgutil.get_loader(import_name) - - # Loader does not exist or we're referring to an unloaded main - # module or a main module without path (interactive sessions), go - # with the current working directory. - if loader is None or import_name == "__main__": - return os.getcwd() - - if hasattr(loader, "get_filename"): - filepath = loader.get_filename(import_name) - else: - # Fall back to imports. - __import__(import_name) - mod = sys.modules[import_name] - filepath = getattr(mod, "__file__", None) - - # If we don't have a file path it might be because it is a - # namespace package. In this case pick the root path from the - # first module that is contained in the package. - if filepath is None: - raise RuntimeError( - "No root path can be found for the provided module" - f" {import_name!r}. This can happen because the module" - " came from an import hook that does not provide file" - " name information or because it's a namespace package." - " In this case the root path needs to be explicitly" - " provided." - ) - - # filepath is import_name.py for a module, or __init__.py for a package. - return os.path.dirname(os.path.abspath(filepath)) - - -class locked_cached_property(werkzeug.utils.cached_property): - """A :func:`property` that is only evaluated once. Like - :class:`werkzeug.utils.cached_property` except access uses a lock - for thread safety. - - .. deprecated:: 2.3 - Will be removed in Flask 2.4. Use a lock inside the decorated function if - locking is needed. - - .. versionchanged:: 2.0 - Inherits from Werkzeug's ``cached_property`` (and ``property``). - """ - - def __init__( - self, - fget: t.Callable[[t.Any], t.Any], - name: str | None = None, - doc: str | None = None, - ) -> None: - import warnings - - warnings.warn( - "'locked_cached_property' is deprecated and will be removed in Flask 2.4." - " Use a lock inside the decorated function if locking is needed.", - DeprecationWarning, - stacklevel=2, - ) - super().__init__(fget, name=name, doc=doc) - self.lock = RLock() - - def __get__(self, obj: object, type: type = None) -> t.Any: # type: ignore - if obj is None: - return self - - with self.lock: - return super().__get__(obj, type=type) - - def __set__(self, obj: object, value: t.Any) -> None: - with self.lock: - super().__set__(obj, value) - - def __delete__(self, obj: object) -> None: - with self.lock: - super().__delete__(obj) - - -def is_ip(value: str) -> bool: - """Determine if the given string is an IP address. - - :param value: value to check - :type value: str - - :return: True if string is an IP address - :rtype: bool - - .. deprecated:: 2.3 - Will be removed in Flask 2.4. - """ - warnings.warn( - "The 'is_ip' function is deprecated and will be removed in Flask 2.4.", - DeprecationWarning, - stacklevel=2, - ) - - for family in (socket.AF_INET, socket.AF_INET6): - try: - socket.inet_pton(family, value) - except OSError: - pass - else: - return True - - return False - - -@lru_cache(maxsize=None) -def _split_blueprint_path(name: str) -> list[str]: - out: list[str] = [name] - - if "." in name: - out.extend(_split_blueprint_path(name.rpartition(".")[0])) - - return out diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/json/__init__.py b/venv_flaskchat/lib/python3.11/site-packages/flask/json/__init__.py deleted file mode 100644 index f15296f..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/json/__init__.py +++ /dev/null @@ -1,170 +0,0 @@ -from __future__ import annotations - -import json as _json -import typing as t - -from ..globals import current_app -from .provider import _default - -if t.TYPE_CHECKING: # pragma: no cover - from ..wrappers import Response - - -def dumps(obj: t.Any, **kwargs: t.Any) -> str: - """Serialize data as JSON. - - If :data:`~flask.current_app` is available, it will use its - :meth:`app.json.dumps() ` - method, otherwise it will use :func:`json.dumps`. - - :param obj: The data to serialize. - :param kwargs: Arguments passed to the ``dumps`` implementation. - - .. versionchanged:: 2.3 - The ``app`` parameter was removed. - - .. versionchanged:: 2.2 - Calls ``current_app.json.dumps``, allowing an app to override - the behavior. - - .. versionchanged:: 2.0.2 - :class:`decimal.Decimal` is supported by converting to a string. - - .. versionchanged:: 2.0 - ``encoding`` will be removed in Flask 2.1. - - .. versionchanged:: 1.0.3 - ``app`` can be passed directly, rather than requiring an app - context for configuration. - """ - if current_app: - return current_app.json.dumps(obj, **kwargs) - - kwargs.setdefault("default", _default) - return _json.dumps(obj, **kwargs) - - -def dump(obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: - """Serialize data as JSON and write to a file. - - If :data:`~flask.current_app` is available, it will use its - :meth:`app.json.dump() ` - method, otherwise it will use :func:`json.dump`. - - :param obj: The data to serialize. - :param fp: A file opened for writing text. Should use the UTF-8 - encoding to be valid JSON. - :param kwargs: Arguments passed to the ``dump`` implementation. - - .. versionchanged:: 2.3 - The ``app`` parameter was removed. - - .. versionchanged:: 2.2 - Calls ``current_app.json.dump``, allowing an app to override - the behavior. - - .. versionchanged:: 2.0 - Writing to a binary file, and the ``encoding`` argument, will be - removed in Flask 2.1. - """ - if current_app: - current_app.json.dump(obj, fp, **kwargs) - else: - kwargs.setdefault("default", _default) - _json.dump(obj, fp, **kwargs) - - -def loads(s: str | bytes, **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON. - - If :data:`~flask.current_app` is available, it will use its - :meth:`app.json.loads() ` - method, otherwise it will use :func:`json.loads`. - - :param s: Text or UTF-8 bytes. - :param kwargs: Arguments passed to the ``loads`` implementation. - - .. versionchanged:: 2.3 - The ``app`` parameter was removed. - - .. versionchanged:: 2.2 - Calls ``current_app.json.loads``, allowing an app to override - the behavior. - - .. versionchanged:: 2.0 - ``encoding`` will be removed in Flask 2.1. The data must be a - string or UTF-8 bytes. - - .. versionchanged:: 1.0.3 - ``app`` can be passed directly, rather than requiring an app - context for configuration. - """ - if current_app: - return current_app.json.loads(s, **kwargs) - - return _json.loads(s, **kwargs) - - -def load(fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON read from a file. - - If :data:`~flask.current_app` is available, it will use its - :meth:`app.json.load() ` - method, otherwise it will use :func:`json.load`. - - :param fp: A file opened for reading text or UTF-8 bytes. - :param kwargs: Arguments passed to the ``load`` implementation. - - .. versionchanged:: 2.3 - The ``app`` parameter was removed. - - .. versionchanged:: 2.2 - Calls ``current_app.json.load``, allowing an app to override - the behavior. - - .. versionchanged:: 2.2 - The ``app`` parameter will be removed in Flask 2.3. - - .. versionchanged:: 2.0 - ``encoding`` will be removed in Flask 2.1. The file must be text - mode, or binary mode with UTF-8 bytes. - """ - if current_app: - return current_app.json.load(fp, **kwargs) - - return _json.load(fp, **kwargs) - - -def jsonify(*args: t.Any, **kwargs: t.Any) -> Response: - """Serialize the given arguments as JSON, and return a - :class:`~flask.Response` object with the ``application/json`` - mimetype. A dict or list returned from a view will be converted to a - JSON response automatically without needing to call this. - - This requires an active request or application context, and calls - :meth:`app.json.response() `. - - In debug mode, the output is formatted with indentation to make it - easier to read. This may also be controlled by the provider. - - Either positional or keyword arguments can be given, not both. - If no arguments are given, ``None`` is serialized. - - :param args: A single value to serialize, or multiple values to - treat as a list to serialize. - :param kwargs: Treat as a dict to serialize. - - .. versionchanged:: 2.2 - Calls ``current_app.json.response``, allowing an app to override - the behavior. - - .. versionchanged:: 2.0.2 - :class:`decimal.Decimal` is supported by converting to a string. - - .. versionchanged:: 0.11 - Added support for serializing top-level arrays. This was a - security risk in ancient browsers. See :ref:`security-json`. - - .. versionadded:: 0.2 - """ - return current_app.json.response(*args, **kwargs) diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/json/__pycache__/__init__.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/flask/json/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index a1f4b20c30af33411c54f2d8b929cb09f6149998..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6898 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 YLhW5y#$m4?-WmRamwdTFIj4pH24;Tik^lez diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/json/__pycache__/tag.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/flask/json/__pycache__/tag.cpython-311.pyc deleted file mode 100644 index 92bae208dcf0d098a257599c4997099723e6eb63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15607 zcmdU0Uu+!5dEdQ1<6_75TFlzD9|DgEpT*+nm8bUfFcimJA*C| z=%McKo7vsly*)~f(gx^q`R(k??94aceE(+VyPveThXq{!mieCYlY@frpY&o~L7ot| ze;^9NZ9x&n1w~YRSuy7u_lcDDXZ_;=JOkNau4%l9=?Y(zr>0az z`qJ1dqv7kdD;$17N*8joa@vqIbyib#HE+m9rjVB=3!0QI=z3PwbxBvXjGWDscu`?e z$`|q{bVJT7vSzkwEX=BULK;qIWnCXmU7y5rCZXeNw5BJ<)O1l(&lUcsT7DE&M4rd%;W;AL9|Xt7ag-{F%(UjR=}hY11M~aljz=H zqsin^t=5MjPf4I2bvdaO@(g==;bhP=`LqfgoMcN$xuR}_!3S0+3YY>Er;5~DDwSZ< znJy^miHU3>Ju^Hk%`O!?IJ!S-)`$(Px~zC42|LD!IIt_oC*h;ei-eub$D6weVW zg2Ob%WxVtF6;FqpypQhEfwkEdZ%Uq>wbV*7W2q1)TADfq-d44v?&&xV^c3~#vropu zACUowik-mbIDU zEPXd^7_&*Lf)@yormO7jBeFwru@WQ!)G3iI$cmok_J>2$9Esbbc)u;E!ng>7>bnFp zI__6|Fr)tQpb}7w)oRB?faB7!N7kN(9dqJfnDq@$AI2l_~#Sm1dI% zOCvAJx+-xtCDjgw%H%WoDT!oL!c6LH8ZAu((!pNP$7A+A!b5`I!d`I^bl5~JEKd>Qvu0>rKiBb|DXqzCDtOTbgMc{xAy za$zo`>O(J)y*dl^JcI`4l1%2)^qS2~3~`=4nRx1{AsyU(0tRzNp2AnG+7QXm5D-hu zE>uEEaAn3wCQDJ1_6aLz1Ze2(087ICzQfCbmB=#wwvi!Jf=pH)1dYTC`GrbgqEN`X zhy+iI6Df+sZNZ?A%rFLs*?DhAlRtR88_+`g|a_E4zA1}Wa z`jcl1`8iA3zseM_RG4@Twva4045;-&_7k|vWUn&Z^cxPRGc2)*lcljuG(8Rsgw7 zB8QQHL<+Cr$*)CWomkOxEsF0V|2?}bLvkyY#++m4{7CazKYPrlz(g?;(Bwg}6w@$g zsy%dBD-_{)WQ;`Ir}dzJEl$8QmwtR+YPClzPyHdP>BPKCLbXZg+;uCocKC0P|Ml_p z;zr+z&At=mNTM7{Fe1bQOkZfd)bbtzeE@d@Ob)aIcJ9H3xl|r+BL$F`b80eK2`7`e zf>O*I!J&G_c)~z0C)McG5*y^ zaWe1>68ajzlH+eHFj@|b-jD8II$sS5Jx?s1EeHDey%FfE27JLIRlyBHzTiR1bAphc zUfm$XTO7Odx;A=wsMoCcs=8CiPGxxYvM%VZ&UjQ(3);D&h?LvM^{g zQ#rqk7Axib!Y$%Z3wGtjsC_@)o(% z5CHXck2EvRFSVOK_cujsQ zQuQO}m(lLGFRmTAdHL4mjp%{R=z;Z%KT2*MIbDvPt~Li+!d~rX6Z>^^0#oZCwt-2o zu6lC1iF3`j==&S^aPRm)CVPU`9p78+5SbT!q;2@+Zinen-)O~`OhP+7k1E>l5g<>C zD*}JbR5Kl-Qy;V(Af3mwMk!(u&@^i~l<1_}mxNz*biI9QEqL>pThDBC?BDFzzwFDd%=6@pN2R3pV{nxrW`p_4xM=j+5Q*}|0ZNpK(;@35X4O$ zlOP}c_ottJ3QJI<$OsL}HFi>#rB27#x#9Z;Riv`UqX!3_UH!`HS=fmq>;CT_D@Tr$ zLr2(nN3|h*racL8w?%u3(xkAolLSr?_#6Rdo$7Qp$vRhlY+6p!D}k@$UniDcvj3{S zKrmDl2($^Ev8D4{;mFe2Y9JU4R|Pld@CBbGJ?#Y0-2;@@5O5Tz<23&5%Vbb-djMH= z`nN@Cf}Ra1VWk<*pc;e@4nf9SE1_4h)k8{`X|hKuu>jh}{D|8`dpCnTOo@#Ncg0c6 zG_8KLX9*CJPXCQ-i4F@Jt|k^xX}b#mvmDv8cI3z18}_ zMmB*=XoPj+6wKy&!DKR76G!r%IKz_P%eCZrN)edDziC`7f!vCA!Ep+R!NIEF22K9p zIgwnQIv5sOyOz$<9~U=jxUskqE_LEYEB;n4YKrCZw3#kX7>w0k2|=S>EMmdN9SEO< zML622^G{v=1F^tkiJtald}#__C1|i-cMv}dD=vP^_|7GMyEY<&n~}kCXwWNuq<$EB z5)y9ld$eegxn`n8vP+^hMWWSzO}ycIq)62*T5kGQ_L?H4y@J;6`n6Z_V17!D3lq?U zFxj$1yQrot+2i-hl3i;BUvI|&m@J(kQyMvQM_CQrihLM7^g;B{`p8B!z8QrSnT4E# znDwyf?v|kXe!oL~kdZ+jTUIk@@16><5jnHDgZ-wF*^^MOp53YkG-7-qYJY@}YNBm9 z9i-q(T~5Tf<^3-5^$q~i$=$1$ZY-`WmP1c?L^#w?gg=8>{VJhD;C1S0ob}|Aq)|3$9 z;`}!9G_qa)e}q@N0(4D>kjtx(YB$42%LLH#QlYKj0e5?`Ry4)RA9%-I|*zctzV z)M1&lOO(l)s#zYD@(8?zfBi)Oi(etVJ6j$%pE9;>sit4)1N$#6D>l3`eJHvJ*StdZDz+0<5VFQNG1>aDT=rPLV<=Hyj^vYyUlU?H2( zY^8~x9@JRHLY8!XDQY8Ya^8=TtJ4k->BHVNn8^K`k^LV=20n-ktj}*mhBhNZ<~gLLrN-dZze!^4wxqS$NtsZPn)42)TLShFf*!Z!IO|Iim z0Y^f*JgFx5w<+m`SI=Y1o$UnS;Fi9Sr4;s!rj1+{yGJ;qRB_(OPN-=Q31{%dta-MH zy>4EZkY32n%L_VdrM8tshvsZ|+&b~21Ko$qV#^kZD9K zeppY9Rt#SJnY`21gNeT>@IOOko%WPz1YN72yZzi-&uzpGZN?65L=JC84wplRz4!z7 zU(+$u!VQsP!X9%W#ijip2rbJm+qJ6RxVCbw9P0PT`WLC$Is-;0Q5u2wsgY@bCHt@H z^99dhg~VXU+{-W>uwjyDCxDb=AKDF&x0mu70xtQ~bsGQnWjkPxW#(ufna+1DNhv;3 zQUd6iu@{lIp1pS7o3(ssb7P|gAA8w|i2-eY5=vYM{)sAHAV5xpYn4Z=%rGIvO$Vv9 z^^et?Sn*G*SG^rEekFNh9huzv&uB&`R-%PO_sT*!)a&i^F}O2?CcP*y?j(`1P~g1z zb3(%6O>FMo_~yzt%b`9GZxRpG^X4_mBk+&Z$itQc-nG3L+(Vq_1mMOeD6b*l+(?}f zCieB4abqjUF@lrJi-fo^$E*n8ZFNShI< z9Fjg0*ZvuGN8n$nnTK)h?+`aSK_gEIc?YOoL%_L~I!oi&0S5Nsun}d~3xrC9DLmfkn&+f^$UfXayKr+A_YVv>|RuhJTzia9mgk zS*N!^o&3UzKb_TGCj+#&D(!`kdZL-^sGMJ+icSNEl{30jZ%@OVpv9cWz>04%h?7bGJAQX--x3!C&hHjkyxF3EsUNxaw5>aFv~U#`1Mapc zXnPFI;P{Tl5~j0faP$o`5M$tTGy$P{Gdr|v9#sV1?eB$9j$Blu2+ zlCUOVn1urIus3K9i(eAbS1B%bf|LNoN*bgC%p-jkhD>c)SFIznc3Q1P8<`!lc^#Gz zjHAs{{3C@dsaLUm##V?3ERfDmN|QKQQKh3M3&#;Rz+~3yXIQKG=i&JszxEaRFy?m>9cAY(cV&; zA_lRbY&4Wqio*C1Eo>oAPshltzNx|4Svv%qvhhN#Qj%lFH6t}JtkHNSiv$=UuScj+ zSS+<>20vLdN$MO8rc!JMu$o2;IW=WnWC9RNHf}HxZ{kO|OdEzQ zY`6ky;=`#lahjtlDIV=F2)s#Pl>jY0_+dP43vpcdNz-@mzJo%thV&__=-&fCz|w#a z>0QpO1#T2p3OJeX=vgjTjgdFz4kd$4NKlwW<0W{# zP0)H!)AXj%l;f(enZ|EW#)OrjMIM6ov=xHJqRxtt2?{_1OVJM^YzKn>vH|>t;8aAT z%i2OB?q^fZqpxU2k-;WgLYhsnJKTV(lzPEiURy&9427(pM->Er#(HjHeYfY|nqMp4yngF?IeLWOFgEQ2bS}DUxs6SPi`cf!_!sn3 zzZ7+AXaxT-ovz{Rc}#F_={RjgJ!#!-(BwIF{G7;JbLKfCTXwJ=4~c%EJ=W52Z2}w5 znlpZ~pk<~q2;JgAp&A9m#e*7cVmU%ZNU$~X-?b3{*DO|o#XNc`^);MFR(6zTk`BHQ zfCNb_-WXmPUh910c_x#~7k=rDsDZ$)Dz`G_*8R94xXTyrM`9}rYq6EdoY>|%n<5Y8p-WNUN_my6_fVh12 z6C?U*Ne&}+jFcG|$EGV;9E4DF1;XQ!^#rKU%G1ed{KyGppw+O(&XGK1prRefz(oz~1t_FvW4Mxj&$`i0Jeh~o$gEzzxz^X}XV zMYck*YG+G#)6#|N?qCq^z8iE4J^fq#Qnh7&@K{x70A3WEg1f4M8$`pwQ&qtYdfl;F zEOZM2Td21K;HrRz7vIZ5%qXgOvPhxPhz=$dUTMM_0|HqQjY`u5e74V@(#R076Df^$ zaVh~?3u-Nt4A)L5v{uS!pI5b+l3JWf(2rO&`gwvDVIR@28n`esvUgL-XPrhiDej4S z5IV!7p`X+4peeAppnn?%9VSf_tG>7xs3KxKP`xM$;-Ru|(0Sh%y2{qQCG?lwccYxW zWx;iC3A@Vf`@XvZ>Te0?*L80Rhs*B!zR+8C-&^iilvbPeiHLsof{!WhlUl)xVvh(P zzzdeAKBnAHYDK47#jdL013VqW)G9@d{qRYxYx3v%J5B+VlddiQG?WMZK*e z4&S_hw<%GZW_f=^#Adx0tTum4xu4XE4!4TfNc935J94Q_vm7JB=9L$$4pPknRMRZ) UPl+OAsWJSR<$tn6DHF8+0mSpT!~g&Q diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/json/provider.py b/venv_flaskchat/lib/python3.11/site-packages/flask/json/provider.py deleted file mode 100644 index 0edd3d5..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/json/provider.py +++ /dev/null @@ -1,216 +0,0 @@ -from __future__ import annotations - -import dataclasses -import decimal -import json -import typing as t -import uuid -import weakref -from datetime import date - -from werkzeug.http import http_date - -if t.TYPE_CHECKING: # pragma: no cover - from ..app import Flask - from ..wrappers import Response - - -class JSONProvider: - """A standard set of JSON operations for an application. Subclasses - of this can be used to customize JSON behavior or use different - JSON libraries. - - To implement a provider for a specific library, subclass this base - class and implement at least :meth:`dumps` and :meth:`loads`. All - other methods have default implementations. - - To use a different provider, either subclass ``Flask`` and set - :attr:`~flask.Flask.json_provider_class` to a provider class, or set - :attr:`app.json ` to an instance of the class. - - :param app: An application instance. This will be stored as a - :class:`weakref.proxy` on the :attr:`_app` attribute. - - .. versionadded:: 2.2 - """ - - def __init__(self, app: Flask) -> None: - self._app = weakref.proxy(app) - - def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: - """Serialize data as JSON. - - :param obj: The data to serialize. - :param kwargs: May be passed to the underlying JSON library. - """ - raise NotImplementedError - - def dump(self, obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: - """Serialize data as JSON and write to a file. - - :param obj: The data to serialize. - :param fp: A file opened for writing text. Should use the UTF-8 - encoding to be valid JSON. - :param kwargs: May be passed to the underlying JSON library. - """ - fp.write(self.dumps(obj, **kwargs)) - - def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON. - - :param s: Text or UTF-8 bytes. - :param kwargs: May be passed to the underlying JSON library. - """ - raise NotImplementedError - - def load(self, fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON read from a file. - - :param fp: A file opened for reading text or UTF-8 bytes. - :param kwargs: May be passed to the underlying JSON library. - """ - return self.loads(fp.read(), **kwargs) - - def _prepare_response_obj( - self, args: tuple[t.Any, ...], kwargs: dict[str, t.Any] - ) -> t.Any: - if args and kwargs: - raise TypeError("app.json.response() takes either args or kwargs, not both") - - if not args and not kwargs: - return None - - if len(args) == 1: - return args[0] - - return args or kwargs - - def response(self, *args: t.Any, **kwargs: t.Any) -> Response: - """Serialize the given arguments as JSON, and return a - :class:`~flask.Response` object with the ``application/json`` - mimetype. - - The :func:`~flask.json.jsonify` function calls this method for - the current application. - - Either positional or keyword arguments can be given, not both. - If no arguments are given, ``None`` is serialized. - - :param args: A single value to serialize, or multiple values to - treat as a list to serialize. - :param kwargs: Treat as a dict to serialize. - """ - obj = self._prepare_response_obj(args, kwargs) - return self._app.response_class(self.dumps(obj), mimetype="application/json") - - -def _default(o: t.Any) -> t.Any: - if isinstance(o, date): - return http_date(o) - - if isinstance(o, (decimal.Decimal, uuid.UUID)): - return str(o) - - if dataclasses and dataclasses.is_dataclass(o): - return dataclasses.asdict(o) - - if hasattr(o, "__html__"): - return str(o.__html__()) - - raise TypeError(f"Object of type {type(o).__name__} is not JSON serializable") - - -class DefaultJSONProvider(JSONProvider): - """Provide JSON operations using Python's built-in :mod:`json` - library. Serializes the following additional data types: - - - :class:`datetime.datetime` and :class:`datetime.date` are - serialized to :rfc:`822` strings. This is the same as the HTTP - date format. - - :class:`uuid.UUID` is serialized to a string. - - :class:`dataclasses.dataclass` is passed to - :func:`dataclasses.asdict`. - - :class:`~markupsafe.Markup` (or any object with a ``__html__`` - method) will call the ``__html__`` method to get a string. - """ - - default: t.Callable[[t.Any], t.Any] = staticmethod( - _default - ) # type: ignore[assignment] - """Apply this function to any object that :meth:`json.dumps` does - not know how to serialize. It should return a valid JSON type or - raise a ``TypeError``. - """ - - ensure_ascii = True - """Replace non-ASCII characters with escape sequences. This may be - more compatible with some clients, but can be disabled for better - performance and size. - """ - - sort_keys = True - """Sort the keys in any serialized dicts. This may be useful for - some caching situations, but can be disabled for better performance. - When enabled, keys must all be strings, they are not converted - before sorting. - """ - - compact: bool | None = None - """If ``True``, or ``None`` out of debug mode, the :meth:`response` - output will not add indentation, newlines, or spaces. If ``False``, - or ``None`` in debug mode, it will use a non-compact representation. - """ - - mimetype = "application/json" - """The mimetype set in :meth:`response`.""" - - def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: - """Serialize data as JSON to a string. - - Keyword arguments are passed to :func:`json.dumps`. Sets some - parameter defaults from the :attr:`default`, - :attr:`ensure_ascii`, and :attr:`sort_keys` attributes. - - :param obj: The data to serialize. - :param kwargs: Passed to :func:`json.dumps`. - """ - kwargs.setdefault("default", self.default) - kwargs.setdefault("ensure_ascii", self.ensure_ascii) - kwargs.setdefault("sort_keys", self.sort_keys) - return json.dumps(obj, **kwargs) - - def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON from a string or bytes. - - :param s: Text or UTF-8 bytes. - :param kwargs: Passed to :func:`json.loads`. - """ - return json.loads(s, **kwargs) - - def response(self, *args: t.Any, **kwargs: t.Any) -> Response: - """Serialize the given arguments as JSON, and return a - :class:`~flask.Response` object with it. The response mimetype - will be "application/json" and can be changed with - :attr:`mimetype`. - - If :attr:`compact` is ``False`` or debug mode is enabled, the - output will be formatted to be easier to read. - - Either positional or keyword arguments can be given, not both. - If no arguments are given, ``None`` is serialized. - - :param args: A single value to serialize, or multiple values to - treat as a list to serialize. - :param kwargs: Treat as a dict to serialize. - """ - obj = self._prepare_response_obj(args, kwargs) - dump_args: dict[str, t.Any] = {} - - if (self.compact is None and self._app.debug) or self.compact is False: - dump_args.setdefault("indent", 2) - else: - dump_args.setdefault("separators", (",", ":")) - - return self._app.response_class( - f"{self.dumps(obj, **dump_args)}\n", mimetype=self.mimetype - ) diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/json/tag.py b/venv_flaskchat/lib/python3.11/site-packages/flask/json/tag.py deleted file mode 100644 index 91cc441..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/json/tag.py +++ /dev/null @@ -1,314 +0,0 @@ -""" -Tagged JSON -~~~~~~~~~~~ - -A compact representation for lossless serialization of non-standard JSON -types. :class:`~flask.sessions.SecureCookieSessionInterface` uses this -to serialize the session data, but it may be useful in other places. It -can be extended to support other types. - -.. autoclass:: TaggedJSONSerializer - :members: - -.. autoclass:: JSONTag - :members: - -Let's see an example that adds support for -:class:`~collections.OrderedDict`. Dicts don't have an order in JSON, so -to handle this we will dump the items as a list of ``[key, value]`` -pairs. Subclass :class:`JSONTag` and give it the new key ``' od'`` to -identify the type. The session serializer processes dicts first, so -insert the new tag at the front of the order since ``OrderedDict`` must -be processed before ``dict``. - -.. code-block:: python - - from flask.json.tag import JSONTag - - class TagOrderedDict(JSONTag): - __slots__ = ('serializer',) - key = ' od' - - def check(self, value): - return isinstance(value, OrderedDict) - - def to_json(self, value): - return [[k, self.serializer.tag(v)] for k, v in iteritems(value)] - - def to_python(self, value): - return OrderedDict(value) - - app.session_interface.serializer.register(TagOrderedDict, index=0) -""" -from __future__ import annotations - -import typing as t -from base64 import b64decode -from base64 import b64encode -from datetime import datetime -from uuid import UUID - -from markupsafe import Markup -from werkzeug.http import http_date -from werkzeug.http import parse_date - -from ..json import dumps -from ..json import loads - - -class JSONTag: - """Base class for defining type tags for :class:`TaggedJSONSerializer`.""" - - __slots__ = ("serializer",) - - #: The tag to mark the serialized object with. If ``None``, this tag is - #: only used as an intermediate step during tagging. - key: str | None = None - - def __init__(self, serializer: TaggedJSONSerializer) -> None: - """Create a tagger for the given serializer.""" - self.serializer = serializer - - def check(self, value: t.Any) -> bool: - """Check if the given value should be tagged by this tag.""" - raise NotImplementedError - - def to_json(self, value: t.Any) -> t.Any: - """Convert the Python object to an object that is a valid JSON type. - The tag will be added later.""" - raise NotImplementedError - - def to_python(self, value: t.Any) -> t.Any: - """Convert the JSON representation back to the correct type. The tag - will already be removed.""" - raise NotImplementedError - - def tag(self, value: t.Any) -> t.Any: - """Convert the value to a valid JSON type and add the tag structure - around it.""" - return {self.key: self.to_json(value)} - - -class TagDict(JSONTag): - """Tag for 1-item dicts whose only key matches a registered tag. - - Internally, the dict key is suffixed with `__`, and the suffix is removed - when deserializing. - """ - - __slots__ = () - key = " di" - - def check(self, value: t.Any) -> bool: - return ( - isinstance(value, dict) - and len(value) == 1 - and next(iter(value)) in self.serializer.tags - ) - - def to_json(self, value: t.Any) -> t.Any: - key = next(iter(value)) - return {f"{key}__": self.serializer.tag(value[key])} - - def to_python(self, value: t.Any) -> t.Any: - key = next(iter(value)) - return {key[:-2]: value[key]} - - -class PassDict(JSONTag): - __slots__ = () - - def check(self, value: t.Any) -> bool: - return isinstance(value, dict) - - def to_json(self, value: t.Any) -> t.Any: - # JSON objects may only have string keys, so don't bother tagging the - # key here. - return {k: self.serializer.tag(v) for k, v in value.items()} - - tag = to_json - - -class TagTuple(JSONTag): - __slots__ = () - key = " t" - - def check(self, value: t.Any) -> bool: - return isinstance(value, tuple) - - def to_json(self, value: t.Any) -> t.Any: - return [self.serializer.tag(item) for item in value] - - def to_python(self, value: t.Any) -> t.Any: - return tuple(value) - - -class PassList(JSONTag): - __slots__ = () - - def check(self, value: t.Any) -> bool: - return isinstance(value, list) - - def to_json(self, value: t.Any) -> t.Any: - return [self.serializer.tag(item) for item in value] - - tag = to_json - - -class TagBytes(JSONTag): - __slots__ = () - key = " b" - - def check(self, value: t.Any) -> bool: - return isinstance(value, bytes) - - def to_json(self, value: t.Any) -> t.Any: - return b64encode(value).decode("ascii") - - def to_python(self, value: t.Any) -> t.Any: - return b64decode(value) - - -class TagMarkup(JSONTag): - """Serialize anything matching the :class:`~markupsafe.Markup` API by - having a ``__html__`` method to the result of that method. Always - deserializes to an instance of :class:`~markupsafe.Markup`.""" - - __slots__ = () - key = " m" - - def check(self, value: t.Any) -> bool: - return callable(getattr(value, "__html__", None)) - - def to_json(self, value: t.Any) -> t.Any: - return str(value.__html__()) - - def to_python(self, value: t.Any) -> t.Any: - return Markup(value) - - -class TagUUID(JSONTag): - __slots__ = () - key = " u" - - def check(self, value: t.Any) -> bool: - return isinstance(value, UUID) - - def to_json(self, value: t.Any) -> t.Any: - return value.hex - - def to_python(self, value: t.Any) -> t.Any: - return UUID(value) - - -class TagDateTime(JSONTag): - __slots__ = () - key = " d" - - def check(self, value: t.Any) -> bool: - return isinstance(value, datetime) - - def to_json(self, value: t.Any) -> t.Any: - return http_date(value) - - def to_python(self, value: t.Any) -> t.Any: - return parse_date(value) - - -class TaggedJSONSerializer: - """Serializer that uses a tag system to compactly represent objects that - are not JSON types. Passed as the intermediate serializer to - :class:`itsdangerous.Serializer`. - - The following extra types are supported: - - * :class:`dict` - * :class:`tuple` - * :class:`bytes` - * :class:`~markupsafe.Markup` - * :class:`~uuid.UUID` - * :class:`~datetime.datetime` - """ - - __slots__ = ("tags", "order") - - #: Tag classes to bind when creating the serializer. Other tags can be - #: added later using :meth:`~register`. - default_tags = [ - TagDict, - PassDict, - TagTuple, - PassList, - TagBytes, - TagMarkup, - TagUUID, - TagDateTime, - ] - - def __init__(self) -> None: - self.tags: dict[str, JSONTag] = {} - self.order: list[JSONTag] = [] - - for cls in self.default_tags: - self.register(cls) - - def register( - self, - tag_class: type[JSONTag], - force: bool = False, - index: int | None = None, - ) -> None: - """Register a new tag with this serializer. - - :param tag_class: tag class to register. Will be instantiated with this - serializer instance. - :param force: overwrite an existing tag. If false (default), a - :exc:`KeyError` is raised. - :param index: index to insert the new tag in the tag order. Useful when - the new tag is a special case of an existing tag. If ``None`` - (default), the tag is appended to the end of the order. - - :raise KeyError: if the tag key is already registered and ``force`` is - not true. - """ - tag = tag_class(self) - key = tag.key - - if key is not None: - if not force and key in self.tags: - raise KeyError(f"Tag '{key}' is already registered.") - - self.tags[key] = tag - - if index is None: - self.order.append(tag) - else: - self.order.insert(index, tag) - - def tag(self, value: t.Any) -> dict[str, t.Any]: - """Convert a value to a tagged representation if necessary.""" - for tag in self.order: - if tag.check(value): - return tag.tag(value) - - return value - - def untag(self, value: dict[str, t.Any]) -> t.Any: - """Convert a tagged representation back to the original type.""" - if len(value) != 1: - return value - - key = next(iter(value)) - - if key not in self.tags: - return value - - return self.tags[key].to_python(value[key]) - - def dumps(self, value: t.Any) -> str: - """Tag the value and dump it to a compact JSON string.""" - return dumps(self.tag(value), separators=(",", ":")) - - def loads(self, value: str) -> t.Any: - """Load data from a JSON string and deserialized any tagged objects.""" - return loads(value, object_hook=self.untag) diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/logging.py b/venv_flaskchat/lib/python3.11/site-packages/flask/logging.py deleted file mode 100644 index 99f6be8..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/logging.py +++ /dev/null @@ -1,76 +0,0 @@ -from __future__ import annotations - -import logging -import sys -import typing as t - -from werkzeug.local import LocalProxy - -from .globals import request - -if t.TYPE_CHECKING: # pragma: no cover - from .app import Flask - - -@LocalProxy -def wsgi_errors_stream() -> t.TextIO: - """Find the most appropriate error stream for the application. If a request - is active, log to ``wsgi.errors``, otherwise use ``sys.stderr``. - - If you configure your own :class:`logging.StreamHandler`, you may want to - use this for the stream. If you are using file or dict configuration and - can't import this directly, you can refer to it as - ``ext://flask.logging.wsgi_errors_stream``. - """ - return request.environ["wsgi.errors"] if request else sys.stderr - - -def has_level_handler(logger: logging.Logger) -> bool: - """Check if there is a handler in the logging chain that will handle the - given logger's :meth:`effective level <~logging.Logger.getEffectiveLevel>`. - """ - level = logger.getEffectiveLevel() - current = logger - - while current: - if any(handler.level <= level for handler in current.handlers): - return True - - if not current.propagate: - break - - current = current.parent # type: ignore - - return False - - -#: Log messages to :func:`~flask.logging.wsgi_errors_stream` with the format -#: ``[%(asctime)s] %(levelname)s in %(module)s: %(message)s``. -default_handler = logging.StreamHandler(wsgi_errors_stream) # type: ignore -default_handler.setFormatter( - logging.Formatter("[%(asctime)s] %(levelname)s in %(module)s: %(message)s") -) - - -def create_logger(app: Flask) -> logging.Logger: - """Get the Flask app's logger and configure it if needed. - - The logger name will be the same as - :attr:`app.import_name `. - - When :attr:`~flask.Flask.debug` is enabled, set the logger level to - :data:`logging.DEBUG` if it is not set. - - If there is no handler for the logger's effective level, add a - :class:`~logging.StreamHandler` for - :func:`~flask.logging.wsgi_errors_stream` with a basic format. - """ - logger = logging.getLogger(app.name) - - if app.debug and not logger.level: - logger.setLevel(logging.DEBUG) - - if not has_level_handler(logger): - logger.addHandler(default_handler) - - return logger diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/py.typed b/venv_flaskchat/lib/python3.11/site-packages/flask/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/scaffold.py b/venv_flaskchat/lib/python3.11/site-packages/flask/scaffold.py deleted file mode 100644 index 6af6906..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/scaffold.py +++ /dev/null @@ -1,923 +0,0 @@ -from __future__ import annotations - -import importlib.util -import os -import pathlib -import pkgutil -import sys -import typing as t -from collections import defaultdict -from datetime import timedelta -from functools import update_wrapper - -from jinja2 import FileSystemLoader -from werkzeug.exceptions import default_exceptions -from werkzeug.exceptions import HTTPException -from werkzeug.utils import cached_property - -from . import typing as ft -from .cli import AppGroup -from .globals import current_app -from .helpers import get_root_path -from .helpers import send_from_directory -from .templating import _default_template_ctx_processor - -if t.TYPE_CHECKING: # pragma: no cover - from .wrappers import Response - -# a singleton sentinel value for parameter defaults -_sentinel = object() - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) -T_after_request = t.TypeVar("T_after_request", bound=ft.AfterRequestCallable) -T_before_request = t.TypeVar("T_before_request", bound=ft.BeforeRequestCallable) -T_error_handler = t.TypeVar("T_error_handler", bound=ft.ErrorHandlerCallable) -T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) -T_template_context_processor = t.TypeVar( - "T_template_context_processor", bound=ft.TemplateContextProcessorCallable -) -T_url_defaults = t.TypeVar("T_url_defaults", bound=ft.URLDefaultCallable) -T_url_value_preprocessor = t.TypeVar( - "T_url_value_preprocessor", bound=ft.URLValuePreprocessorCallable -) -T_route = t.TypeVar("T_route", bound=ft.RouteCallable) - - -def setupmethod(f: F) -> F: - f_name = f.__name__ - - def wrapper_func(self, *args: t.Any, **kwargs: t.Any) -> t.Any: - self._check_setup_finished(f_name) - return f(self, *args, **kwargs) - - return t.cast(F, update_wrapper(wrapper_func, f)) - - -class Scaffold: - """Common behavior shared between :class:`~flask.Flask` and - :class:`~flask.blueprints.Blueprint`. - - :param import_name: The import name of the module where this object - is defined. Usually :attr:`__name__` should be used. - :param static_folder: Path to a folder of static files to serve. - If this is set, a static route will be added. - :param static_url_path: URL prefix for the static route. - :param template_folder: Path to a folder containing template files. - for rendering. If this is set, a Jinja loader will be added. - :param root_path: The path that static, template, and resource files - are relative to. Typically not set, it is discovered based on - the ``import_name``. - - .. versionadded:: 2.0 - """ - - name: str - _static_folder: str | None = None - _static_url_path: str | None = None - - def __init__( - self, - import_name: str, - static_folder: str | os.PathLike | None = None, - static_url_path: str | None = None, - template_folder: str | os.PathLike | None = None, - root_path: str | None = None, - ): - #: The name of the package or module that this object belongs - #: to. Do not change this once it is set by the constructor. - self.import_name = import_name - - self.static_folder = static_folder # type: ignore - self.static_url_path = static_url_path - - #: The path to the templates folder, relative to - #: :attr:`root_path`, to add to the template loader. ``None`` if - #: templates should not be added. - self.template_folder = template_folder - - if root_path is None: - root_path = get_root_path(self.import_name) - - #: Absolute path to the package on the filesystem. Used to look - #: up resources contained in the package. - self.root_path = root_path - - #: The Click command group for registering CLI commands for this - #: object. The commands are available from the ``flask`` command - #: once the application has been discovered and blueprints have - #: been registered. - self.cli = AppGroup() - - #: A dictionary mapping endpoint names to view functions. - #: - #: To register a view function, use the :meth:`route` decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.view_functions: dict[str, t.Callable] = {} - - #: A data structure of registered error handlers, in the format - #: ``{scope: {code: {class: handler}}}``. The ``scope`` key is - #: the name of a blueprint the handlers are active for, or - #: ``None`` for all requests. The ``code`` key is the HTTP - #: status code for ``HTTPException``, or ``None`` for - #: other exceptions. The innermost dictionary maps exception - #: classes to handler functions. - #: - #: To register an error handler, use the :meth:`errorhandler` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.error_handler_spec: dict[ - ft.AppOrBlueprintKey, - dict[int | None, dict[type[Exception], ft.ErrorHandlerCallable]], - ] = defaultdict(lambda: defaultdict(dict)) - - #: A data structure of functions to call at the beginning of - #: each request, in the format ``{scope: [functions]}``. The - #: ``scope`` key is the name of a blueprint the functions are - #: active for, or ``None`` for all requests. - #: - #: To register a function, use the :meth:`before_request` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.before_request_funcs: dict[ - ft.AppOrBlueprintKey, list[ft.BeforeRequestCallable] - ] = defaultdict(list) - - #: A data structure of functions to call at the end of each - #: request, in the format ``{scope: [functions]}``. The - #: ``scope`` key is the name of a blueprint the functions are - #: active for, or ``None`` for all requests. - #: - #: To register a function, use the :meth:`after_request` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.after_request_funcs: dict[ - ft.AppOrBlueprintKey, list[ft.AfterRequestCallable] - ] = defaultdict(list) - - #: A data structure of functions to call at the end of each - #: request even if an exception is raised, in the format - #: ``{scope: [functions]}``. The ``scope`` key is the name of a - #: blueprint the functions are active for, or ``None`` for all - #: requests. - #: - #: To register a function, use the :meth:`teardown_request` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.teardown_request_funcs: dict[ - ft.AppOrBlueprintKey, list[ft.TeardownCallable] - ] = defaultdict(list) - - #: A data structure of functions to call to pass extra context - #: values when rendering templates, in the format - #: ``{scope: [functions]}``. The ``scope`` key is the name of a - #: blueprint the functions are active for, or ``None`` for all - #: requests. - #: - #: To register a function, use the :meth:`context_processor` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.template_context_processors: dict[ - ft.AppOrBlueprintKey, list[ft.TemplateContextProcessorCallable] - ] = defaultdict(list, {None: [_default_template_ctx_processor]}) - - #: A data structure of functions to call to modify the keyword - #: arguments passed to the view function, in the format - #: ``{scope: [functions]}``. The ``scope`` key is the name of a - #: blueprint the functions are active for, or ``None`` for all - #: requests. - #: - #: To register a function, use the - #: :meth:`url_value_preprocessor` decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.url_value_preprocessors: dict[ - ft.AppOrBlueprintKey, - list[ft.URLValuePreprocessorCallable], - ] = defaultdict(list) - - #: A data structure of functions to call to modify the keyword - #: arguments when generating URLs, in the format - #: ``{scope: [functions]}``. The ``scope`` key is the name of a - #: blueprint the functions are active for, or ``None`` for all - #: requests. - #: - #: To register a function, use the :meth:`url_defaults` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.url_default_functions: dict[ - ft.AppOrBlueprintKey, list[ft.URLDefaultCallable] - ] = defaultdict(list) - - def __repr__(self) -> str: - return f"<{type(self).__name__} {self.name!r}>" - - def _check_setup_finished(self, f_name: str) -> None: - raise NotImplementedError - - @property - def static_folder(self) -> str | None: - """The absolute path to the configured static folder. ``None`` - if no static folder is set. - """ - if self._static_folder is not None: - return os.path.join(self.root_path, self._static_folder) - else: - return None - - @static_folder.setter - def static_folder(self, value: str | os.PathLike | None) -> None: - if value is not None: - value = os.fspath(value).rstrip(r"\/") - - self._static_folder = value - - @property - def has_static_folder(self) -> bool: - """``True`` if :attr:`static_folder` is set. - - .. versionadded:: 0.5 - """ - return self.static_folder is not None - - @property - def static_url_path(self) -> str | None: - """The URL prefix that the static route will be accessible from. - - If it was not configured during init, it is derived from - :attr:`static_folder`. - """ - if self._static_url_path is not None: - return self._static_url_path - - if self.static_folder is not None: - basename = os.path.basename(self.static_folder) - return f"/{basename}".rstrip("/") - - return None - - @static_url_path.setter - def static_url_path(self, value: str | None) -> None: - if value is not None: - value = value.rstrip("/") - - self._static_url_path = value - - def get_send_file_max_age(self, filename: str | None) -> int | None: - """Used by :func:`send_file` to determine the ``max_age`` cache - value for a given file path if it wasn't passed. - - By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from - the configuration of :data:`~flask.current_app`. This defaults - to ``None``, which tells the browser to use conditional requests - instead of a timed cache, which is usually preferable. - - .. versionchanged:: 2.0 - The default configuration is ``None`` instead of 12 hours. - - .. versionadded:: 0.9 - """ - value = current_app.config["SEND_FILE_MAX_AGE_DEFAULT"] - - if value is None: - return None - - if isinstance(value, timedelta): - return int(value.total_seconds()) - - return value - - def send_static_file(self, filename: str) -> Response: - """The view function used to serve files from - :attr:`static_folder`. A route is automatically registered for - this view at :attr:`static_url_path` if :attr:`static_folder` is - set. - - .. versionadded:: 0.5 - """ - if not self.has_static_folder: - raise RuntimeError("'static_folder' must be set to serve static_files.") - - # send_file only knows to call get_send_file_max_age on the app, - # call it here so it works for blueprints too. - max_age = self.get_send_file_max_age(filename) - return send_from_directory( - t.cast(str, self.static_folder), filename, max_age=max_age - ) - - @cached_property - def jinja_loader(self) -> FileSystemLoader | None: - """The Jinja loader for this object's templates. By default this - is a class :class:`jinja2.loaders.FileSystemLoader` to - :attr:`template_folder` if it is set. - - .. versionadded:: 0.5 - """ - if self.template_folder is not None: - return FileSystemLoader(os.path.join(self.root_path, self.template_folder)) - else: - return None - - def open_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: - """Open a resource file relative to :attr:`root_path` for - reading. - - For example, if the file ``schema.sql`` is next to the file - ``app.py`` where the ``Flask`` app is defined, it can be opened - with: - - .. code-block:: python - - with app.open_resource("schema.sql") as f: - conn.executescript(f.read()) - - :param resource: Path to the resource relative to - :attr:`root_path`. - :param mode: Open the file in this mode. Only reading is - supported, valid values are "r" (or "rt") and "rb". - """ - if mode not in {"r", "rt", "rb"}: - raise ValueError("Resources can only be opened for reading.") - - return open(os.path.join(self.root_path, resource), mode) - - def _method_route( - self, - method: str, - rule: str, - options: dict, - ) -> t.Callable[[T_route], T_route]: - if "methods" in options: - raise TypeError("Use the 'route' decorator to use the 'methods' argument.") - - return self.route(rule, methods=[method], **options) - - @setupmethod - def get(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["GET"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("GET", rule, options) - - @setupmethod - def post(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["POST"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("POST", rule, options) - - @setupmethod - def put(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["PUT"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("PUT", rule, options) - - @setupmethod - def delete(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["DELETE"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("DELETE", rule, options) - - @setupmethod - def patch(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["PATCH"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("PATCH", rule, options) - - @setupmethod - def route(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Decorate a view function to register it with the given URL - rule and options. Calls :meth:`add_url_rule`, which has more - details about the implementation. - - .. code-block:: python - - @app.route("/") - def index(): - return "Hello, World!" - - See :ref:`url-route-registrations`. - - The endpoint name for the route defaults to the name of the view - function if the ``endpoint`` parameter isn't passed. - - The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` and - ``OPTIONS`` are added automatically. - - :param rule: The URL rule string. - :param options: Extra options passed to the - :class:`~werkzeug.routing.Rule` object. - """ - - def decorator(f: T_route) -> T_route: - endpoint = options.pop("endpoint", None) - self.add_url_rule(rule, endpoint, f, **options) - return f - - return decorator - - @setupmethod - def add_url_rule( - self, - rule: str, - endpoint: str | None = None, - view_func: ft.RouteCallable | None = None, - provide_automatic_options: bool | None = None, - **options: t.Any, - ) -> None: - """Register a rule for routing incoming requests and building - URLs. The :meth:`route` decorator is a shortcut to call this - with the ``view_func`` argument. These are equivalent: - - .. code-block:: python - - @app.route("/") - def index(): - ... - - .. code-block:: python - - def index(): - ... - - app.add_url_rule("/", view_func=index) - - See :ref:`url-route-registrations`. - - The endpoint name for the route defaults to the name of the view - function if the ``endpoint`` parameter isn't passed. An error - will be raised if a function has already been registered for the - endpoint. - - The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` is - always added automatically, and ``OPTIONS`` is added - automatically by default. - - ``view_func`` does not necessarily need to be passed, but if the - rule should participate in routing an endpoint name must be - associated with a view function at some point with the - :meth:`endpoint` decorator. - - .. code-block:: python - - app.add_url_rule("/", endpoint="index") - - @app.endpoint("index") - def index(): - ... - - If ``view_func`` has a ``required_methods`` attribute, those - methods are added to the passed and automatic methods. If it - has a ``provide_automatic_methods`` attribute, it is used as the - default if the parameter is not passed. - - :param rule: The URL rule string. - :param endpoint: The endpoint name to associate with the rule - and view function. Used when routing and building URLs. - Defaults to ``view_func.__name__``. - :param view_func: The view function to associate with the - endpoint name. - :param provide_automatic_options: Add the ``OPTIONS`` method and - respond to ``OPTIONS`` requests automatically. - :param options: Extra options passed to the - :class:`~werkzeug.routing.Rule` object. - """ - raise NotImplementedError - - @setupmethod - def endpoint(self, endpoint: str) -> t.Callable[[F], F]: - """Decorate a view function to register it for the given - endpoint. Used if a rule is added without a ``view_func`` with - :meth:`add_url_rule`. - - .. code-block:: python - - app.add_url_rule("/ex", endpoint="example") - - @app.endpoint("example") - def example(): - ... - - :param endpoint: The endpoint name to associate with the view - function. - """ - - def decorator(f: F) -> F: - self.view_functions[endpoint] = f - return f - - return decorator - - @setupmethod - def before_request(self, f: T_before_request) -> T_before_request: - """Register a function to run before each request. - - For example, this can be used to open a database connection, or - to load the logged in user from the session. - - .. code-block:: python - - @app.before_request - def load_user(): - if "user_id" in session: - g.user = db.session.get(session["user_id"]) - - The function will be called without any arguments. If it returns - a non-``None`` value, the value is handled as if it was the - return value from the view, and further request handling is - stopped. - - This is available on both app and blueprint objects. When used on an app, this - executes before every request. When used on a blueprint, this executes before - every request that the blueprint handles. To register with a blueprint and - execute before every request, use :meth:`.Blueprint.before_app_request`. - """ - self.before_request_funcs.setdefault(None, []).append(f) - return f - - @setupmethod - def after_request(self, f: T_after_request) -> T_after_request: - """Register a function to run after each request to this object. - - The function is called with the response object, and must return - a response object. This allows the functions to modify or - replace the response before it is sent. - - If a function raises an exception, any remaining - ``after_request`` functions will not be called. Therefore, this - should not be used for actions that must execute, such as to - close resources. Use :meth:`teardown_request` for that. - - This is available on both app and blueprint objects. When used on an app, this - executes after every request. When used on a blueprint, this executes after - every request that the blueprint handles. To register with a blueprint and - execute after every request, use :meth:`.Blueprint.after_app_request`. - """ - self.after_request_funcs.setdefault(None, []).append(f) - return f - - @setupmethod - def teardown_request(self, f: T_teardown) -> T_teardown: - """Register a function to be called when the request context is - popped. Typically this happens at the end of each request, but - contexts may be pushed manually as well during testing. - - .. code-block:: python - - with app.test_request_context(): - ... - - When the ``with`` block exits (or ``ctx.pop()`` is called), the - teardown functions are called just before the request context is - made inactive. - - When a teardown function was called because of an unhandled - exception it will be passed an error object. If an - :meth:`errorhandler` is registered, it will handle the exception - and the teardown will not receive it. - - Teardown functions must avoid raising exceptions. If they - execute code that might fail they must surround that code with a - ``try``/``except`` block and log any errors. - - The return values of teardown functions are ignored. - - This is available on both app and blueprint objects. When used on an app, this - executes after every request. When used on a blueprint, this executes after - every request that the blueprint handles. To register with a blueprint and - execute after every request, use :meth:`.Blueprint.teardown_app_request`. - """ - self.teardown_request_funcs.setdefault(None, []).append(f) - return f - - @setupmethod - def context_processor( - self, - f: T_template_context_processor, - ) -> T_template_context_processor: - """Registers a template context processor function. These functions run before - rendering a template. The keys of the returned dict are added as variables - available in the template. - - This is available on both app and blueprint objects. When used on an app, this - is called for every rendered template. When used on a blueprint, this is called - for templates rendered from the blueprint's views. To register with a blueprint - and affect every template, use :meth:`.Blueprint.app_context_processor`. - """ - self.template_context_processors[None].append(f) - return f - - @setupmethod - def url_value_preprocessor( - self, - f: T_url_value_preprocessor, - ) -> T_url_value_preprocessor: - """Register a URL value preprocessor function for all view - functions in the application. These functions will be called before the - :meth:`before_request` functions. - - The function can modify the values captured from the matched url before - they are passed to the view. For example, this can be used to pop a - common language code value and place it in ``g`` rather than pass it to - every view. - - The function is passed the endpoint name and values dict. The return - value is ignored. - - This is available on both app and blueprint objects. When used on an app, this - is called for every request. When used on a blueprint, this is called for - requests that the blueprint handles. To register with a blueprint and affect - every request, use :meth:`.Blueprint.app_url_value_preprocessor`. - """ - self.url_value_preprocessors[None].append(f) - return f - - @setupmethod - def url_defaults(self, f: T_url_defaults) -> T_url_defaults: - """Callback function for URL defaults for all view functions of the - application. It's called with the endpoint and values and should - update the values passed in place. - - This is available on both app and blueprint objects. When used on an app, this - is called for every request. When used on a blueprint, this is called for - requests that the blueprint handles. To register with a blueprint and affect - every request, use :meth:`.Blueprint.app_url_defaults`. - """ - self.url_default_functions[None].append(f) - return f - - @setupmethod - def errorhandler( - self, code_or_exception: type[Exception] | int - ) -> t.Callable[[T_error_handler], T_error_handler]: - """Register a function to handle errors by code or exception class. - - A decorator that is used to register a function given an - error code. Example:: - - @app.errorhandler(404) - def page_not_found(error): - return 'This page does not exist', 404 - - You can also register handlers for arbitrary exceptions:: - - @app.errorhandler(DatabaseError) - def special_exception_handler(error): - return 'Database connection failed', 500 - - This is available on both app and blueprint objects. When used on an app, this - can handle errors from every request. When used on a blueprint, this can handle - errors from requests that the blueprint handles. To register with a blueprint - and affect every request, use :meth:`.Blueprint.app_errorhandler`. - - .. versionadded:: 0.7 - Use :meth:`register_error_handler` instead of modifying - :attr:`error_handler_spec` directly, for application wide error - handlers. - - .. versionadded:: 0.7 - One can now additionally also register custom exception types - that do not necessarily have to be a subclass of the - :class:`~werkzeug.exceptions.HTTPException` class. - - :param code_or_exception: the code as integer for the handler, or - an arbitrary exception - """ - - def decorator(f: T_error_handler) -> T_error_handler: - self.register_error_handler(code_or_exception, f) - return f - - return decorator - - @setupmethod - def register_error_handler( - self, - code_or_exception: type[Exception] | int, - f: ft.ErrorHandlerCallable, - ) -> None: - """Alternative error attach function to the :meth:`errorhandler` - decorator that is more straightforward to use for non decorator - usage. - - .. versionadded:: 0.7 - """ - exc_class, code = self._get_exc_class_and_code(code_or_exception) - self.error_handler_spec[None][code][exc_class] = f - - @staticmethod - def _get_exc_class_and_code( - exc_class_or_code: type[Exception] | int, - ) -> tuple[type[Exception], int | None]: - """Get the exception class being handled. For HTTP status codes - or ``HTTPException`` subclasses, return both the exception and - status code. - - :param exc_class_or_code: Any exception class, or an HTTP status - code as an integer. - """ - exc_class: type[Exception] - - if isinstance(exc_class_or_code, int): - try: - exc_class = default_exceptions[exc_class_or_code] - except KeyError: - raise ValueError( - f"'{exc_class_or_code}' is not a recognized HTTP" - " error code. Use a subclass of HTTPException with" - " that code instead." - ) from None - else: - exc_class = exc_class_or_code - - if isinstance(exc_class, Exception): - raise TypeError( - f"{exc_class!r} is an instance, not a class. Handlers" - " can only be registered for Exception classes or HTTP" - " error codes." - ) - - if not issubclass(exc_class, Exception): - raise ValueError( - f"'{exc_class.__name__}' is not a subclass of Exception." - " Handlers can only be registered for Exception classes" - " or HTTP error codes." - ) - - if issubclass(exc_class, HTTPException): - return exc_class, exc_class.code - else: - return exc_class, None - - -def _endpoint_from_view_func(view_func: t.Callable) -> str: - """Internal helper that returns the default endpoint for a given - function. This always is the function name. - """ - assert view_func is not None, "expected view func if endpoint is not provided." - return view_func.__name__ - - -def _matching_loader_thinks_module_is_package(loader, mod_name): - """Attempt to figure out if the given name is a package or a module. - - :param: loader: The loader that handled the name. - :param mod_name: The name of the package or module. - """ - # Use loader.is_package if it's available. - if hasattr(loader, "is_package"): - return loader.is_package(mod_name) - - cls = type(loader) - - # NamespaceLoader doesn't implement is_package, but all names it - # loads must be packages. - if cls.__module__ == "_frozen_importlib" and cls.__name__ == "NamespaceLoader": - return True - - # Otherwise we need to fail with an error that explains what went - # wrong. - raise AttributeError( - f"'{cls.__name__}.is_package()' must be implemented for PEP 302" - f" import hooks." - ) - - -def _path_is_relative_to(path: pathlib.PurePath, base: str) -> bool: - # Path.is_relative_to doesn't exist until Python 3.9 - try: - path.relative_to(base) - return True - except ValueError: - return False - - -def _find_package_path(import_name): - """Find the path that contains the package or module.""" - root_mod_name, _, _ = import_name.partition(".") - - try: - root_spec = importlib.util.find_spec(root_mod_name) - - if root_spec is None: - raise ValueError("not found") - # ImportError: the machinery told us it does not exist - # ValueError: - # - the module name was invalid - # - the module name is __main__ - # - *we* raised `ValueError` due to `root_spec` being `None` - except (ImportError, ValueError): - pass # handled below - else: - # namespace package - if root_spec.origin in {"namespace", None}: - package_spec = importlib.util.find_spec(import_name) - if package_spec is not None and package_spec.submodule_search_locations: - # Pick the path in the namespace that contains the submodule. - package_path = pathlib.Path( - os.path.commonpath(package_spec.submodule_search_locations) - ) - search_locations = ( - location - for location in root_spec.submodule_search_locations - if _path_is_relative_to(package_path, location) - ) - else: - # Pick the first path. - search_locations = iter(root_spec.submodule_search_locations) - return os.path.dirname(next(search_locations)) - # a package (with __init__.py) - elif root_spec.submodule_search_locations: - return os.path.dirname(os.path.dirname(root_spec.origin)) - # just a normal module - else: - return os.path.dirname(root_spec.origin) - - # we were unable to find the `package_path` using PEP 451 loaders - loader = pkgutil.get_loader(root_mod_name) - - if loader is None or root_mod_name == "__main__": - # import name is not found, or interactive/main module - return os.getcwd() - - if hasattr(loader, "get_filename"): - filename = loader.get_filename(root_mod_name) - elif hasattr(loader, "archive"): - # zipimporter's loader.archive points to the .egg or .zip file. - filename = loader.archive - else: - # At least one loader is missing both get_filename and archive: - # Google App Engine's HardenedModulesHook, use __file__. - filename = importlib.import_module(root_mod_name).__file__ - - package_path = os.path.abspath(os.path.dirname(filename)) - - # If the imported name is a package, filename is currently pointing - # to the root of the package, need to get the current directory. - if _matching_loader_thinks_module_is_package(loader, root_mod_name): - package_path = os.path.dirname(package_path) - - return package_path - - -def find_package(import_name: str): - """Find the prefix that a package is installed under, and the path - that it would be imported from. - - The prefix is the directory containing the standard directory - hierarchy (lib, bin, etc.). If the package is not installed to the - system (:attr:`sys.prefix`) or a virtualenv (``site-packages``), - ``None`` is returned. - - The path is the entry in :attr:`sys.path` that contains the package - for import. If the package is not installed, it's assumed that the - package was imported from the current working directory. - """ - package_path = _find_package_path(import_name) - py_prefix = os.path.abspath(sys.prefix) - - # installed to the system - if _path_is_relative_to(pathlib.PurePath(package_path), py_prefix): - return py_prefix, package_path - - site_parent, site_folder = os.path.split(package_path) - - # installed to a virtualenv - if site_folder.lower() == "site-packages": - parent, folder = os.path.split(site_parent) - - # Windows (prefix/lib/site-packages) - if folder.lower() == "lib": - return parent, package_path - - # Unix (prefix/lib/pythonX.Y/site-packages) - if os.path.basename(parent).lower() == "lib": - return os.path.dirname(parent), package_path - - # something else (prefix/site-packages) - return site_parent, package_path - - # not installed - return None, package_path diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/sessions.py b/venv_flaskchat/lib/python3.11/site-packages/flask/sessions.py deleted file mode 100644 index e5650d6..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/sessions.py +++ /dev/null @@ -1,367 +0,0 @@ -from __future__ import annotations - -import hashlib -import typing as t -from collections.abc import MutableMapping -from datetime import datetime -from datetime import timezone - -from itsdangerous import BadSignature -from itsdangerous import URLSafeTimedSerializer -from werkzeug.datastructures import CallbackDict - -from .json.tag import TaggedJSONSerializer - -if t.TYPE_CHECKING: # pragma: no cover - from .app import Flask - from .wrappers import Request, Response - - -class SessionMixin(MutableMapping): - """Expands a basic dictionary with session attributes.""" - - @property - def permanent(self) -> bool: - """This reflects the ``'_permanent'`` key in the dict.""" - return self.get("_permanent", False) - - @permanent.setter - def permanent(self, value: bool) -> None: - self["_permanent"] = bool(value) - - #: Some implementations can detect whether a session is newly - #: created, but that is not guaranteed. Use with caution. The mixin - # default is hard-coded ``False``. - new = False - - #: Some implementations can detect changes to the session and set - #: this when that happens. The mixin default is hard coded to - #: ``True``. - modified = True - - #: Some implementations can detect when session data is read or - #: written and set this when that happens. The mixin default is hard - #: coded to ``True``. - accessed = True - - -class SecureCookieSession(CallbackDict, SessionMixin): - """Base class for sessions based on signed cookies. - - This session backend will set the :attr:`modified` and - :attr:`accessed` attributes. It cannot reliably track whether a - session is new (vs. empty), so :attr:`new` remains hard coded to - ``False``. - """ - - #: When data is changed, this is set to ``True``. Only the session - #: dictionary itself is tracked; if the session contains mutable - #: data (for example a nested dict) then this must be set to - #: ``True`` manually when modifying that data. The session cookie - #: will only be written to the response if this is ``True``. - modified = False - - #: When data is read or written, this is set to ``True``. Used by - # :class:`.SecureCookieSessionInterface` to add a ``Vary: Cookie`` - #: header, which allows caching proxies to cache different pages for - #: different users. - accessed = False - - def __init__(self, initial: t.Any = None) -> None: - def on_update(self) -> None: - self.modified = True - self.accessed = True - - super().__init__(initial, on_update) - - def __getitem__(self, key: str) -> t.Any: - self.accessed = True - return super().__getitem__(key) - - def get(self, key: str, default: t.Any = None) -> t.Any: - self.accessed = True - return super().get(key, default) - - def setdefault(self, key: str, default: t.Any = None) -> t.Any: - self.accessed = True - return super().setdefault(key, default) - - -class NullSession(SecureCookieSession): - """Class used to generate nicer error messages if sessions are not - available. Will still allow read-only access to the empty session - but fail on setting. - """ - - def _fail(self, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: - raise RuntimeError( - "The session is unavailable because no secret " - "key was set. Set the secret_key on the " - "application to something unique and secret." - ) - - __setitem__ = __delitem__ = clear = pop = popitem = update = setdefault = _fail # type: ignore # noqa: B950 - del _fail - - -class SessionInterface: - """The basic interface you have to implement in order to replace the - default session interface which uses werkzeug's securecookie - implementation. The only methods you have to implement are - :meth:`open_session` and :meth:`save_session`, the others have - useful defaults which you don't need to change. - - The session object returned by the :meth:`open_session` method has to - provide a dictionary like interface plus the properties and methods - from the :class:`SessionMixin`. We recommend just subclassing a dict - and adding that mixin:: - - class Session(dict, SessionMixin): - pass - - If :meth:`open_session` returns ``None`` Flask will call into - :meth:`make_null_session` to create a session that acts as replacement - if the session support cannot work because some requirement is not - fulfilled. The default :class:`NullSession` class that is created - will complain that the secret key was not set. - - To replace the session interface on an application all you have to do - is to assign :attr:`flask.Flask.session_interface`:: - - app = Flask(__name__) - app.session_interface = MySessionInterface() - - Multiple requests with the same session may be sent and handled - concurrently. When implementing a new session interface, consider - whether reads or writes to the backing store must be synchronized. - There is no guarantee on the order in which the session for each - request is opened or saved, it will occur in the order that requests - begin and end processing. - - .. versionadded:: 0.8 - """ - - #: :meth:`make_null_session` will look here for the class that should - #: be created when a null session is requested. Likewise the - #: :meth:`is_null_session` method will perform a typecheck against - #: this type. - null_session_class = NullSession - - #: A flag that indicates if the session interface is pickle based. - #: This can be used by Flask extensions to make a decision in regards - #: to how to deal with the session object. - #: - #: .. versionadded:: 0.10 - pickle_based = False - - def make_null_session(self, app: Flask) -> NullSession: - """Creates a null session which acts as a replacement object if the - real session support could not be loaded due to a configuration - error. This mainly aids the user experience because the job of the - null session is to still support lookup without complaining but - modifications are answered with a helpful error message of what - failed. - - This creates an instance of :attr:`null_session_class` by default. - """ - return self.null_session_class() - - def is_null_session(self, obj: object) -> bool: - """Checks if a given object is a null session. Null sessions are - not asked to be saved. - - This checks if the object is an instance of :attr:`null_session_class` - by default. - """ - return isinstance(obj, self.null_session_class) - - def get_cookie_name(self, app: Flask) -> str: - """The name of the session cookie. Uses``app.config["SESSION_COOKIE_NAME"]``.""" - return app.config["SESSION_COOKIE_NAME"] - - def get_cookie_domain(self, app: Flask) -> str | None: - """The value of the ``Domain`` parameter on the session cookie. If not set, - browsers will only send the cookie to the exact domain it was set from. - Otherwise, they will send it to any subdomain of the given value as well. - - Uses the :data:`SESSION_COOKIE_DOMAIN` config. - - .. versionchanged:: 2.3 - Not set by default, does not fall back to ``SERVER_NAME``. - """ - rv = app.config["SESSION_COOKIE_DOMAIN"] - return rv if rv else None - - def get_cookie_path(self, app: Flask) -> str: - """Returns the path for which the cookie should be valid. The - default implementation uses the value from the ``SESSION_COOKIE_PATH`` - config var if it's set, and falls back to ``APPLICATION_ROOT`` or - uses ``/`` if it's ``None``. - """ - return app.config["SESSION_COOKIE_PATH"] or app.config["APPLICATION_ROOT"] - - def get_cookie_httponly(self, app: Flask) -> bool: - """Returns True if the session cookie should be httponly. This - currently just returns the value of the ``SESSION_COOKIE_HTTPONLY`` - config var. - """ - return app.config["SESSION_COOKIE_HTTPONLY"] - - def get_cookie_secure(self, app: Flask) -> bool: - """Returns True if the cookie should be secure. This currently - just returns the value of the ``SESSION_COOKIE_SECURE`` setting. - """ - return app.config["SESSION_COOKIE_SECURE"] - - def get_cookie_samesite(self, app: Flask) -> str: - """Return ``'Strict'`` or ``'Lax'`` if the cookie should use the - ``SameSite`` attribute. This currently just returns the value of - the :data:`SESSION_COOKIE_SAMESITE` setting. - """ - return app.config["SESSION_COOKIE_SAMESITE"] - - def get_expiration_time(self, app: Flask, session: SessionMixin) -> datetime | None: - """A helper method that returns an expiration date for the session - or ``None`` if the session is linked to the browser session. The - default implementation returns now + the permanent session - lifetime configured on the application. - """ - if session.permanent: - return datetime.now(timezone.utc) + app.permanent_session_lifetime - return None - - def should_set_cookie(self, app: Flask, session: SessionMixin) -> bool: - """Used by session backends to determine if a ``Set-Cookie`` header - should be set for this session cookie for this response. If the session - has been modified, the cookie is set. If the session is permanent and - the ``SESSION_REFRESH_EACH_REQUEST`` config is true, the cookie is - always set. - - This check is usually skipped if the session was deleted. - - .. versionadded:: 0.11 - """ - - return session.modified or ( - session.permanent and app.config["SESSION_REFRESH_EACH_REQUEST"] - ) - - def open_session(self, app: Flask, request: Request) -> SessionMixin | None: - """This is called at the beginning of each request, after - pushing the request context, before matching the URL. - - This must return an object which implements a dictionary-like - interface as well as the :class:`SessionMixin` interface. - - This will return ``None`` to indicate that loading failed in - some way that is not immediately an error. The request - context will fall back to using :meth:`make_null_session` - in this case. - """ - raise NotImplementedError() - - def save_session( - self, app: Flask, session: SessionMixin, response: Response - ) -> None: - """This is called at the end of each request, after generating - a response, before removing the request context. It is skipped - if :meth:`is_null_session` returns ``True``. - """ - raise NotImplementedError() - - -session_json_serializer = TaggedJSONSerializer() - - -class SecureCookieSessionInterface(SessionInterface): - """The default session interface that stores sessions in signed cookies - through the :mod:`itsdangerous` module. - """ - - #: the salt that should be applied on top of the secret key for the - #: signing of cookie based sessions. - salt = "cookie-session" - #: the hash function to use for the signature. The default is sha1 - digest_method = staticmethod(hashlib.sha1) - #: the name of the itsdangerous supported key derivation. The default - #: is hmac. - key_derivation = "hmac" - #: A python serializer for the payload. The default is a compact - #: JSON derived serializer with support for some extra Python types - #: such as datetime objects or tuples. - serializer = session_json_serializer - session_class = SecureCookieSession - - def get_signing_serializer(self, app: Flask) -> URLSafeTimedSerializer | None: - if not app.secret_key: - return None - signer_kwargs = dict( - key_derivation=self.key_derivation, digest_method=self.digest_method - ) - return URLSafeTimedSerializer( - app.secret_key, - salt=self.salt, - serializer=self.serializer, - signer_kwargs=signer_kwargs, - ) - - def open_session(self, app: Flask, request: Request) -> SecureCookieSession | None: - s = self.get_signing_serializer(app) - if s is None: - return None - val = request.cookies.get(self.get_cookie_name(app)) - if not val: - return self.session_class() - max_age = int(app.permanent_session_lifetime.total_seconds()) - try: - data = s.loads(val, max_age=max_age) - return self.session_class(data) - except BadSignature: - return self.session_class() - - def save_session( - self, app: Flask, session: SessionMixin, response: Response - ) -> None: - name = self.get_cookie_name(app) - domain = self.get_cookie_domain(app) - path = self.get_cookie_path(app) - secure = self.get_cookie_secure(app) - samesite = self.get_cookie_samesite(app) - httponly = self.get_cookie_httponly(app) - - # Add a "Vary: Cookie" header if the session was accessed at all. - if session.accessed: - response.vary.add("Cookie") - - # If the session is modified to be empty, remove the cookie. - # If the session is empty, return without setting the cookie. - if not session: - if session.modified: - response.delete_cookie( - name, - domain=domain, - path=path, - secure=secure, - samesite=samesite, - httponly=httponly, - ) - response.vary.add("Cookie") - - return - - if not self.should_set_cookie(app, session): - return - - expires = self.get_expiration_time(app, session) - val = self.get_signing_serializer(app).dumps(dict(session)) # type: ignore - response.set_cookie( - name, - val, # type: ignore - expires=expires, - httponly=httponly, - domain=domain, - path=path, - secure=secure, - samesite=samesite, - ) - response.vary.add("Cookie") diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/signals.py b/venv_flaskchat/lib/python3.11/site-packages/flask/signals.py deleted file mode 100644 index d79f21f..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/signals.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import annotations - -import typing as t -import warnings - -from blinker import Namespace - -# This namespace is only for signals provided by Flask itself. -_signals = Namespace() - -template_rendered = _signals.signal("template-rendered") -before_render_template = _signals.signal("before-render-template") -request_started = _signals.signal("request-started") -request_finished = _signals.signal("request-finished") -request_tearing_down = _signals.signal("request-tearing-down") -got_request_exception = _signals.signal("got-request-exception") -appcontext_tearing_down = _signals.signal("appcontext-tearing-down") -appcontext_pushed = _signals.signal("appcontext-pushed") -appcontext_popped = _signals.signal("appcontext-popped") -message_flashed = _signals.signal("message-flashed") - - -def __getattr__(name: str) -> t.Any: - if name == "signals_available": - warnings.warn( - "The 'signals_available' attribute is deprecated and will be removed in" - " Flask 2.4. Signals are always available.", - DeprecationWarning, - stacklevel=2, - ) - return True - - raise AttributeError(name) diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/templating.py b/venv_flaskchat/lib/python3.11/site-packages/flask/templating.py deleted file mode 100644 index 769108f..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/templating.py +++ /dev/null @@ -1,220 +0,0 @@ -from __future__ import annotations - -import typing as t - -from jinja2 import BaseLoader -from jinja2 import Environment as BaseEnvironment -from jinja2 import Template -from jinja2 import TemplateNotFound - -from .globals import _cv_app -from .globals import _cv_request -from .globals import current_app -from .globals import request -from .helpers import stream_with_context -from .signals import before_render_template -from .signals import template_rendered - -if t.TYPE_CHECKING: # pragma: no cover - from .app import Flask - from .scaffold import Scaffold - - -def _default_template_ctx_processor() -> dict[str, t.Any]: - """Default template context processor. Injects `request`, - `session` and `g`. - """ - appctx = _cv_app.get(None) - reqctx = _cv_request.get(None) - rv: dict[str, t.Any] = {} - if appctx is not None: - rv["g"] = appctx.g - if reqctx is not None: - rv["request"] = reqctx.request - rv["session"] = reqctx.session - return rv - - -class Environment(BaseEnvironment): - """Works like a regular Jinja2 environment but has some additional - knowledge of how Flask's blueprint works so that it can prepend the - name of the blueprint to referenced templates if necessary. - """ - - def __init__(self, app: Flask, **options: t.Any) -> None: - if "loader" not in options: - options["loader"] = app.create_global_jinja_loader() - BaseEnvironment.__init__(self, **options) - self.app = app - - -class DispatchingJinjaLoader(BaseLoader): - """A loader that looks for templates in the application and all - the blueprint folders. - """ - - def __init__(self, app: Flask) -> None: - self.app = app - - def get_source( # type: ignore - self, environment: Environment, template: str - ) -> tuple[str, str | None, t.Callable | None]: - if self.app.config["EXPLAIN_TEMPLATE_LOADING"]: - return self._get_source_explained(environment, template) - return self._get_source_fast(environment, template) - - def _get_source_explained( - self, environment: Environment, template: str - ) -> tuple[str, str | None, t.Callable | None]: - attempts = [] - rv: tuple[str, str | None, t.Callable[[], bool] | None] | None - trv: None | (tuple[str, str | None, t.Callable[[], bool] | None]) = None - - for srcobj, loader in self._iter_loaders(template): - try: - rv = loader.get_source(environment, template) - if trv is None: - trv = rv - except TemplateNotFound: - rv = None - attempts.append((loader, srcobj, rv)) - - from .debughelpers import explain_template_loading_attempts - - explain_template_loading_attempts(self.app, template, attempts) - - if trv is not None: - return trv - raise TemplateNotFound(template) - - def _get_source_fast( - self, environment: Environment, template: str - ) -> tuple[str, str | None, t.Callable | None]: - for _srcobj, loader in self._iter_loaders(template): - try: - return loader.get_source(environment, template) - except TemplateNotFound: - continue - raise TemplateNotFound(template) - - def _iter_loaders( - self, template: str - ) -> t.Generator[tuple[Scaffold, BaseLoader], None, None]: - loader = self.app.jinja_loader - if loader is not None: - yield self.app, loader - - for blueprint in self.app.iter_blueprints(): - loader = blueprint.jinja_loader - if loader is not None: - yield blueprint, loader - - def list_templates(self) -> list[str]: - result = set() - loader = self.app.jinja_loader - if loader is not None: - result.update(loader.list_templates()) - - for blueprint in self.app.iter_blueprints(): - loader = blueprint.jinja_loader - if loader is not None: - for template in loader.list_templates(): - result.add(template) - - return list(result) - - -def _render(app: Flask, template: Template, context: dict[str, t.Any]) -> str: - app.update_template_context(context) - before_render_template.send( - app, _async_wrapper=app.ensure_sync, template=template, context=context - ) - rv = template.render(context) - template_rendered.send( - app, _async_wrapper=app.ensure_sync, template=template, context=context - ) - return rv - - -def render_template( - template_name_or_list: str | Template | list[str | Template], - **context: t.Any, -) -> str: - """Render a template by name with the given context. - - :param template_name_or_list: The name of the template to render. If - a list is given, the first name to exist will be rendered. - :param context: The variables to make available in the template. - """ - app = current_app._get_current_object() # type: ignore[attr-defined] - template = app.jinja_env.get_or_select_template(template_name_or_list) - return _render(app, template, context) - - -def render_template_string(source: str, **context: t.Any) -> str: - """Render a template from the given source string with the given - context. - - :param source: The source code of the template to render. - :param context: The variables to make available in the template. - """ - app = current_app._get_current_object() # type: ignore[attr-defined] - template = app.jinja_env.from_string(source) - return _render(app, template, context) - - -def _stream( - app: Flask, template: Template, context: dict[str, t.Any] -) -> t.Iterator[str]: - app.update_template_context(context) - before_render_template.send( - app, _async_wrapper=app.ensure_sync, template=template, context=context - ) - - def generate() -> t.Iterator[str]: - yield from template.generate(context) - template_rendered.send( - app, _async_wrapper=app.ensure_sync, template=template, context=context - ) - - rv = generate() - - # If a request context is active, keep it while generating. - if request: - rv = stream_with_context(rv) - - return rv - - -def stream_template( - template_name_or_list: str | Template | list[str | Template], - **context: t.Any, -) -> t.Iterator[str]: - """Render a template by name with the given context as a stream. - This returns an iterator of strings, which can be used as a - streaming response from a view. - - :param template_name_or_list: The name of the template to render. If - a list is given, the first name to exist will be rendered. - :param context: The variables to make available in the template. - - .. versionadded:: 2.2 - """ - app = current_app._get_current_object() # type: ignore[attr-defined] - template = app.jinja_env.get_or_select_template(template_name_or_list) - return _stream(app, template, context) - - -def stream_template_string(source: str, **context: t.Any) -> t.Iterator[str]: - """Render a template from the given source string with the given - context as a stream. This returns an iterator of strings, which can - be used as a streaming response from a view. - - :param source: The source code of the template to render. - :param context: The variables to make available in the template. - - .. versionadded:: 2.2 - """ - app = current_app._get_current_object() # type: ignore[attr-defined] - template = app.jinja_env.from_string(source) - return _stream(app, template, context) diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/testing.py b/venv_flaskchat/lib/python3.11/site-packages/flask/testing.py deleted file mode 100644 index 773f152..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/testing.py +++ /dev/null @@ -1,282 +0,0 @@ -from __future__ import annotations - -import typing as t -from contextlib import contextmanager -from contextlib import ExitStack -from copy import copy -from types import TracebackType -from urllib.parse import urlsplit - -import werkzeug.test -from click.testing import CliRunner -from werkzeug.test import Client -from werkzeug.wrappers import Request as BaseRequest - -from .cli import ScriptInfo -from .sessions import SessionMixin - -if t.TYPE_CHECKING: # pragma: no cover - from werkzeug.test import TestResponse - - from .app import Flask - - -class EnvironBuilder(werkzeug.test.EnvironBuilder): - """An :class:`~werkzeug.test.EnvironBuilder`, that takes defaults from the - application. - - :param app: The Flask application to configure the environment from. - :param path: URL path being requested. - :param base_url: Base URL where the app is being served, which - ``path`` is relative to. If not given, built from - :data:`PREFERRED_URL_SCHEME`, ``subdomain``, - :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. - :param subdomain: Subdomain name to append to :data:`SERVER_NAME`. - :param url_scheme: Scheme to use instead of - :data:`PREFERRED_URL_SCHEME`. - :param json: If given, this is serialized as JSON and passed as - ``data``. Also defaults ``content_type`` to - ``application/json``. - :param args: other positional arguments passed to - :class:`~werkzeug.test.EnvironBuilder`. - :param kwargs: other keyword arguments passed to - :class:`~werkzeug.test.EnvironBuilder`. - """ - - def __init__( - self, - app: Flask, - path: str = "/", - base_url: str | None = None, - subdomain: str | None = None, - url_scheme: str | None = None, - *args: t.Any, - **kwargs: t.Any, - ) -> None: - assert not (base_url or subdomain or url_scheme) or ( - base_url is not None - ) != bool( - subdomain or url_scheme - ), 'Cannot pass "subdomain" or "url_scheme" with "base_url".' - - if base_url is None: - http_host = app.config.get("SERVER_NAME") or "localhost" - app_root = app.config["APPLICATION_ROOT"] - - if subdomain: - http_host = f"{subdomain}.{http_host}" - - if url_scheme is None: - url_scheme = app.config["PREFERRED_URL_SCHEME"] - - url = urlsplit(path) - base_url = ( - f"{url.scheme or url_scheme}://{url.netloc or http_host}" - f"/{app_root.lstrip('/')}" - ) - path = url.path - - if url.query: - sep = b"?" if isinstance(url.query, bytes) else "?" - path += sep + url.query - - self.app = app - super().__init__(path, base_url, *args, **kwargs) - - def json_dumps(self, obj: t.Any, **kwargs: t.Any) -> str: # type: ignore - """Serialize ``obj`` to a JSON-formatted string. - - The serialization will be configured according to the config associated - with this EnvironBuilder's ``app``. - """ - return self.app.json.dumps(obj, **kwargs) - - -class FlaskClient(Client): - """Works like a regular Werkzeug test client but has knowledge about - Flask's contexts to defer the cleanup of the request context until - the end of a ``with`` block. For general information about how to - use this class refer to :class:`werkzeug.test.Client`. - - .. versionchanged:: 0.12 - `app.test_client()` includes preset default environment, which can be - set after instantiation of the `app.test_client()` object in - `client.environ_base`. - - Basic usage is outlined in the :doc:`/testing` chapter. - """ - - application: Flask - - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - super().__init__(*args, **kwargs) - self.preserve_context = False - self._new_contexts: list[t.ContextManager[t.Any]] = [] - self._context_stack = ExitStack() - self.environ_base = { - "REMOTE_ADDR": "127.0.0.1", - "HTTP_USER_AGENT": f"werkzeug/{werkzeug.__version__}", - } - - @contextmanager - def session_transaction( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Generator[SessionMixin, None, None]: - """When used in combination with a ``with`` statement this opens a - session transaction. This can be used to modify the session that - the test client uses. Once the ``with`` block is left the session is - stored back. - - :: - - with client.session_transaction() as session: - session['value'] = 42 - - Internally this is implemented by going through a temporary test - request context and since session handling could depend on - request variables this function accepts the same arguments as - :meth:`~flask.Flask.test_request_context` which are directly - passed through. - """ - if self._cookies is None: - raise TypeError( - "Cookies are disabled. Create a client with 'use_cookies=True'." - ) - - app = self.application - ctx = app.test_request_context(*args, **kwargs) - self._add_cookies_to_wsgi(ctx.request.environ) - - with ctx: - sess = app.session_interface.open_session(app, ctx.request) - - if sess is None: - raise RuntimeError("Session backend did not open a session.") - - yield sess - resp = app.response_class() - - if app.session_interface.is_null_session(sess): - return - - with ctx: - app.session_interface.save_session(app, sess, resp) - - self._update_cookies_from_response( - ctx.request.host.partition(":")[0], - ctx.request.path, - resp.headers.getlist("Set-Cookie"), - ) - - def _copy_environ(self, other): - out = {**self.environ_base, **other} - - if self.preserve_context: - out["werkzeug.debug.preserve_context"] = self._new_contexts.append - - return out - - def _request_from_builder_args(self, args, kwargs): - kwargs["environ_base"] = self._copy_environ(kwargs.get("environ_base", {})) - builder = EnvironBuilder(self.application, *args, **kwargs) - - try: - return builder.get_request() - finally: - builder.close() - - def open( - self, - *args: t.Any, - buffered: bool = False, - follow_redirects: bool = False, - **kwargs: t.Any, - ) -> TestResponse: - if args and isinstance( - args[0], (werkzeug.test.EnvironBuilder, dict, BaseRequest) - ): - if isinstance(args[0], werkzeug.test.EnvironBuilder): - builder = copy(args[0]) - builder.environ_base = self._copy_environ(builder.environ_base or {}) - request = builder.get_request() - elif isinstance(args[0], dict): - request = EnvironBuilder.from_environ( - args[0], app=self.application, environ_base=self._copy_environ({}) - ).get_request() - else: - # isinstance(args[0], BaseRequest) - request = copy(args[0]) - request.environ = self._copy_environ(request.environ) - else: - # request is None - request = self._request_from_builder_args(args, kwargs) - - # Pop any previously preserved contexts. This prevents contexts - # from being preserved across redirects or multiple requests - # within a single block. - self._context_stack.close() - - response = super().open( - request, - buffered=buffered, - follow_redirects=follow_redirects, - ) - response.json_module = self.application.json # type: ignore[assignment] - - # Re-push contexts that were preserved during the request. - while self._new_contexts: - cm = self._new_contexts.pop() - self._context_stack.enter_context(cm) - - return response - - def __enter__(self) -> FlaskClient: - if self.preserve_context: - raise RuntimeError("Cannot nest client invocations") - self.preserve_context = True - return self - - def __exit__( - self, - exc_type: type | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.preserve_context = False - self._context_stack.close() - - -class FlaskCliRunner(CliRunner): - """A :class:`~click.testing.CliRunner` for testing a Flask app's - CLI commands. Typically created using - :meth:`~flask.Flask.test_cli_runner`. See :ref:`testing-cli`. - """ - - def __init__(self, app: Flask, **kwargs: t.Any) -> None: - self.app = app - super().__init__(**kwargs) - - def invoke( # type: ignore - self, cli: t.Any = None, args: t.Any = None, **kwargs: t.Any - ) -> t.Any: - """Invokes a CLI command in an isolated environment. See - :meth:`CliRunner.invoke ` for - full method documentation. See :ref:`testing-cli` for examples. - - If the ``obj`` argument is not given, passes an instance of - :class:`~flask.cli.ScriptInfo` that knows how to load the Flask - app being tested. - - :param cli: Command object to invoke. Default is the app's - :attr:`~flask.app.Flask.cli` group. - :param args: List of strings to invoke the command with. - - :return: a :class:`~click.testing.Result` object. - """ - if cli is None: - cli = self.app.cli # type: ignore - - if "obj" not in kwargs: - kwargs["obj"] = ScriptInfo(create_app=lambda: self.app) - - return super().invoke(cli, args, **kwargs) diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/typing.py b/venv_flaskchat/lib/python3.11/site-packages/flask/typing.py deleted file mode 100644 index 50aef7f..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/typing.py +++ /dev/null @@ -1,82 +0,0 @@ -from __future__ import annotations - -import typing as t - -if t.TYPE_CHECKING: # pragma: no cover - from _typeshed.wsgi import WSGIApplication # noqa: F401 - from werkzeug.datastructures import Headers # noqa: F401 - from werkzeug.wrappers import Response # noqa: F401 - -# The possible types that are directly convertible or are a Response object. -ResponseValue = t.Union[ - "Response", - str, - bytes, - t.List[t.Any], - # Only dict is actually accepted, but Mapping allows for TypedDict. - t.Mapping[str, t.Any], - t.Iterator[str], - t.Iterator[bytes], -] - -# the possible types for an individual HTTP header -# This should be a Union, but mypy doesn't pass unless it's a TypeVar. -HeaderValue = t.Union[str, t.List[str], t.Tuple[str, ...]] - -# the possible types for HTTP headers -HeadersValue = t.Union[ - "Headers", - t.Mapping[str, HeaderValue], - t.Sequence[t.Tuple[str, HeaderValue]], -] - -# The possible types returned by a route function. -ResponseReturnValue = t.Union[ - ResponseValue, - t.Tuple[ResponseValue, HeadersValue], - t.Tuple[ResponseValue, int], - t.Tuple[ResponseValue, int, HeadersValue], - "WSGIApplication", -] - -# Allow any subclass of werkzeug.Response, such as the one from Flask, -# as a callback argument. Using werkzeug.Response directly makes a -# callback annotated with flask.Response fail type checking. -ResponseClass = t.TypeVar("ResponseClass", bound="Response") - -AppOrBlueprintKey = t.Optional[str] # The App key is None, whereas blueprints are named -AfterRequestCallable = t.Union[ - t.Callable[[ResponseClass], ResponseClass], - t.Callable[[ResponseClass], t.Awaitable[ResponseClass]], -] -BeforeFirstRequestCallable = t.Union[ - t.Callable[[], None], t.Callable[[], t.Awaitable[None]] -] -BeforeRequestCallable = t.Union[ - t.Callable[[], t.Optional[ResponseReturnValue]], - t.Callable[[], t.Awaitable[t.Optional[ResponseReturnValue]]], -] -ShellContextProcessorCallable = t.Callable[[], t.Dict[str, t.Any]] -TeardownCallable = t.Union[ - t.Callable[[t.Optional[BaseException]], None], - t.Callable[[t.Optional[BaseException]], t.Awaitable[None]], -] -TemplateContextProcessorCallable = t.Callable[[], t.Dict[str, t.Any]] -TemplateFilterCallable = t.Callable[..., t.Any] -TemplateGlobalCallable = t.Callable[..., t.Any] -TemplateTestCallable = t.Callable[..., bool] -URLDefaultCallable = t.Callable[[str, dict], None] -URLValuePreprocessorCallable = t.Callable[[t.Optional[str], t.Optional[dict]], None] - -# This should take Exception, but that either breaks typing the argument -# with a specific exception, or decorating multiple times with different -# exceptions (and using a union type on the argument). -# https://github.com/pallets/flask/issues/4095 -# https://github.com/pallets/flask/issues/4295 -# https://github.com/pallets/flask/issues/4297 -ErrorHandlerCallable = t.Callable[[t.Any], ResponseReturnValue] - -RouteCallable = t.Union[ - t.Callable[..., ResponseReturnValue], - t.Callable[..., t.Awaitable[ResponseReturnValue]], -] diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/views.py b/venv_flaskchat/lib/python3.11/site-packages/flask/views.py deleted file mode 100644 index c7a2b62..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/views.py +++ /dev/null @@ -1,190 +0,0 @@ -from __future__ import annotations - -import typing as t - -from . import typing as ft -from .globals import current_app -from .globals import request - - -http_method_funcs = frozenset( - ["get", "post", "head", "options", "delete", "put", "trace", "patch"] -) - - -class View: - """Subclass this class and override :meth:`dispatch_request` to - create a generic class-based view. Call :meth:`as_view` to create a - view function that creates an instance of the class with the given - arguments and calls its ``dispatch_request`` method with any URL - variables. - - See :doc:`views` for a detailed guide. - - .. code-block:: python - - class Hello(View): - init_every_request = False - - def dispatch_request(self, name): - return f"Hello, {name}!" - - app.add_url_rule( - "/hello/", view_func=Hello.as_view("hello") - ) - - Set :attr:`methods` on the class to change what methods the view - accepts. - - Set :attr:`decorators` on the class to apply a list of decorators to - the generated view function. Decorators applied to the class itself - will not be applied to the generated view function! - - Set :attr:`init_every_request` to ``False`` for efficiency, unless - you need to store request-global data on ``self``. - """ - - #: The methods this view is registered for. Uses the same default - #: (``["GET", "HEAD", "OPTIONS"]``) as ``route`` and - #: ``add_url_rule`` by default. - methods: t.ClassVar[t.Collection[str] | None] = None - - #: Control whether the ``OPTIONS`` method is handled automatically. - #: Uses the same default (``True``) as ``route`` and - #: ``add_url_rule`` by default. - provide_automatic_options: t.ClassVar[bool | None] = None - - #: A list of decorators to apply, in order, to the generated view - #: function. Remember that ``@decorator`` syntax is applied bottom - #: to top, so the first decorator in the list would be the bottom - #: decorator. - #: - #: .. versionadded:: 0.8 - decorators: t.ClassVar[list[t.Callable]] = [] - - #: Create a new instance of this view class for every request by - #: default. If a view subclass sets this to ``False``, the same - #: instance is used for every request. - #: - #: A single instance is more efficient, especially if complex setup - #: is done during init. However, storing data on ``self`` is no - #: longer safe across requests, and :data:`~flask.g` should be used - #: instead. - #: - #: .. versionadded:: 2.2 - init_every_request: t.ClassVar[bool] = True - - def dispatch_request(self) -> ft.ResponseReturnValue: - """The actual view function behavior. Subclasses must override - this and return a valid response. Any variables from the URL - rule are passed as keyword arguments. - """ - raise NotImplementedError() - - @classmethod - def as_view( - cls, name: str, *class_args: t.Any, **class_kwargs: t.Any - ) -> ft.RouteCallable: - """Convert the class into a view function that can be registered - for a route. - - By default, the generated view will create a new instance of the - view class for every request and call its - :meth:`dispatch_request` method. If the view class sets - :attr:`init_every_request` to ``False``, the same instance will - be used for every request. - - Except for ``name``, all other arguments passed to this method - are forwarded to the view class ``__init__`` method. - - .. versionchanged:: 2.2 - Added the ``init_every_request`` class attribute. - """ - if cls.init_every_request: - - def view(**kwargs: t.Any) -> ft.ResponseReturnValue: - self = view.view_class( # type: ignore[attr-defined] - *class_args, **class_kwargs - ) - return current_app.ensure_sync(self.dispatch_request)(**kwargs) - - else: - self = cls(*class_args, **class_kwargs) - - def view(**kwargs: t.Any) -> ft.ResponseReturnValue: - return current_app.ensure_sync(self.dispatch_request)(**kwargs) - - if cls.decorators: - view.__name__ = name - view.__module__ = cls.__module__ - for decorator in cls.decorators: - view = decorator(view) - - # We attach the view class to the view function for two reasons: - # first of all it allows us to easily figure out what class-based - # view this thing came from, secondly it's also used for instantiating - # the view class so you can actually replace it with something else - # for testing purposes and debugging. - view.view_class = cls # type: ignore - view.__name__ = name - view.__doc__ = cls.__doc__ - view.__module__ = cls.__module__ - view.methods = cls.methods # type: ignore - view.provide_automatic_options = cls.provide_automatic_options # type: ignore - return view - - -class MethodView(View): - """Dispatches request methods to the corresponding instance methods. - For example, if you implement a ``get`` method, it will be used to - handle ``GET`` requests. - - This can be useful for defining a REST API. - - :attr:`methods` is automatically set based on the methods defined on - the class. - - See :doc:`views` for a detailed guide. - - .. code-block:: python - - class CounterAPI(MethodView): - def get(self): - return str(session.get("counter", 0)) - - def post(self): - session["counter"] = session.get("counter", 0) + 1 - return redirect(url_for("counter")) - - app.add_url_rule( - "/counter", view_func=CounterAPI.as_view("counter") - ) - """ - - def __init_subclass__(cls, **kwargs: t.Any) -> None: - super().__init_subclass__(**kwargs) - - if "methods" not in cls.__dict__: - methods = set() - - for base in cls.__bases__: - if getattr(base, "methods", None): - methods.update(base.methods) # type: ignore[attr-defined] - - for key in http_method_funcs: - if hasattr(cls, key): - methods.add(key.upper()) - - if methods: - cls.methods = methods - - def dispatch_request(self, **kwargs: t.Any) -> ft.ResponseReturnValue: - meth = getattr(self, request.method.lower(), None) - - # If the request method is HEAD and we don't have a handler for it - # retry with GET. - if meth is None and request.method == "HEAD": - meth = getattr(self, "get", None) - - assert meth is not None, f"Unimplemented method {request.method!r}" - return current_app.ensure_sync(meth)(**kwargs) diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask/wrappers.py b/venv_flaskchat/lib/python3.11/site-packages/flask/wrappers.py deleted file mode 100644 index ef7aa38..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask/wrappers.py +++ /dev/null @@ -1,173 +0,0 @@ -from __future__ import annotations - -import typing as t - -from werkzeug.exceptions import BadRequest -from werkzeug.wrappers import Request as RequestBase -from werkzeug.wrappers import Response as ResponseBase - -from . import json -from .globals import current_app -from .helpers import _split_blueprint_path - -if t.TYPE_CHECKING: # pragma: no cover - from werkzeug.routing import Rule - - -class Request(RequestBase): - """The request object used by default in Flask. Remembers the - matched endpoint and view arguments. - - It is what ends up as :class:`~flask.request`. If you want to replace - the request object used you can subclass this and set - :attr:`~flask.Flask.request_class` to your subclass. - - The request object is a :class:`~werkzeug.wrappers.Request` subclass and - provides all of the attributes Werkzeug defines plus a few Flask - specific ones. - """ - - json_module: t.Any = json - - #: The internal URL rule that matched the request. This can be - #: useful to inspect which methods are allowed for the URL from - #: a before/after handler (``request.url_rule.methods``) etc. - #: Though if the request's method was invalid for the URL rule, - #: the valid list is available in ``routing_exception.valid_methods`` - #: instead (an attribute of the Werkzeug exception - #: :exc:`~werkzeug.exceptions.MethodNotAllowed`) - #: because the request was never internally bound. - #: - #: .. versionadded:: 0.6 - url_rule: Rule | None = None - - #: A dict of view arguments that matched the request. If an exception - #: happened when matching, this will be ``None``. - view_args: dict[str, t.Any] | None = None - - #: If matching the URL failed, this is the exception that will be - #: raised / was raised as part of the request handling. This is - #: usually a :exc:`~werkzeug.exceptions.NotFound` exception or - #: something similar. - routing_exception: Exception | None = None - - @property - def max_content_length(self) -> int | None: # type: ignore - """Read-only view of the ``MAX_CONTENT_LENGTH`` config key.""" - if current_app: - return current_app.config["MAX_CONTENT_LENGTH"] - else: - return None - - @property - def endpoint(self) -> str | None: - """The endpoint that matched the request URL. - - This will be ``None`` if matching failed or has not been - performed yet. - - This in combination with :attr:`view_args` can be used to - reconstruct the same URL or a modified URL. - """ - if self.url_rule is not None: - return self.url_rule.endpoint - - return None - - @property - def blueprint(self) -> str | None: - """The registered name of the current blueprint. - - This will be ``None`` if the endpoint is not part of a - blueprint, or if URL matching failed or has not been performed - yet. - - This does not necessarily match the name the blueprint was - created with. It may have been nested, or registered with a - different name. - """ - endpoint = self.endpoint - - if endpoint is not None and "." in endpoint: - return endpoint.rpartition(".")[0] - - return None - - @property - def blueprints(self) -> list[str]: - """The registered names of the current blueprint upwards through - parent blueprints. - - This will be an empty list if there is no current blueprint, or - if URL matching failed. - - .. versionadded:: 2.0.1 - """ - name = self.blueprint - - if name is None: - return [] - - return _split_blueprint_path(name) - - def _load_form_data(self) -> None: - super()._load_form_data() - - # In debug mode we're replacing the files multidict with an ad-hoc - # subclass that raises a different error for key errors. - if ( - current_app - and current_app.debug - and self.mimetype != "multipart/form-data" - and not self.files - ): - from .debughelpers import attach_enctype_error_multidict - - attach_enctype_error_multidict(self) - - def on_json_loading_failed(self, e: ValueError | None) -> t.Any: - try: - return super().on_json_loading_failed(e) - except BadRequest as e: - if current_app and current_app.debug: - raise - - raise BadRequest() from e - - -class Response(ResponseBase): - """The response object that is used by default in Flask. Works like the - response object from Werkzeug but is set to have an HTML mimetype by - default. Quite often you don't have to create this object yourself because - :meth:`~flask.Flask.make_response` will take care of that for you. - - If you want to replace the response object used you can subclass this and - set :attr:`~flask.Flask.response_class` to your subclass. - - .. versionchanged:: 1.0 - JSON support is added to the response, like the request. This is useful - when testing to get the test client response data as JSON. - - .. versionchanged:: 1.0 - - Added :attr:`max_cookie_size`. - """ - - default_mimetype: str | None = "text/html" - - json_module = json - - autocorrect_location_header = False - - @property - def max_cookie_size(self) -> int: # type: ignore - """Read-only view of the :data:`MAX_COOKIE_SIZE` config key. - - See :attr:`~werkzeug.wrappers.Response.max_cookie_size` in - Werkzeug's docs. - """ - if current_app: - return current_app.config["MAX_COOKIE_SIZE"] - - # return Werkzeug's default when not in an app context - return super().max_cookie_size diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask_socketio/__init__.py b/venv_flaskchat/lib/python3.11/site-packages/flask_socketio/__init__.py deleted file mode 100644 index adea0e2..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask_socketio/__init__.py +++ /dev/null @@ -1,1118 +0,0 @@ -from functools import wraps -import os -import sys - -# make sure gevent-socketio is not installed, as it conflicts with -# python-socketio -gevent_socketio_found = True -try: - from socketio import socketio_manage # noqa: F401 -except ImportError: - gevent_socketio_found = False -if gevent_socketio_found: - print('The gevent-socketio package is incompatible with this version of ' - 'the Flask-SocketIO extension. Please uninstall it, and then ' - 'install the latest version of python-socketio in its place.') - sys.exit(1) - -import flask -from flask import has_request_context, json as flask_json -from flask.sessions import SessionMixin -import socketio -from socketio.exceptions import ConnectionRefusedError # noqa: F401 -from werkzeug.debug import DebuggedApplication -from werkzeug._reloader import run_with_reloader - -from .namespace import Namespace -from .test_client import SocketIOTestClient - - -class _SocketIOMiddleware(socketio.WSGIApp): - """This WSGI middleware simply exposes the Flask application in the WSGI - environment before executing the request. - """ - def __init__(self, socketio_app, flask_app, socketio_path='socket.io'): - self.flask_app = flask_app - super(_SocketIOMiddleware, self).__init__(socketio_app, - flask_app.wsgi_app, - socketio_path=socketio_path) - - def __call__(self, environ, start_response): - environ = environ.copy() - environ['flask.app'] = self.flask_app - return super(_SocketIOMiddleware, self).__call__(environ, - start_response) - - -class _ManagedSession(dict, SessionMixin): - """This class is used for user sessions that are managed by - Flask-SocketIO. It is simple dict, expanded with the Flask session - attributes.""" - pass - - -class SocketIO(object): - """Create a Flask-SocketIO server. - - :param app: The flask application instance. If the application instance - isn't known at the time this class is instantiated, then call - ``socketio.init_app(app)`` once the application instance is - available. - :param manage_session: If set to ``True``, this extension manages the user - session for Socket.IO events. If set to ``False``, - Flask's own session management is used. When using - Flask's cookie based sessions it is recommended that - you leave this set to the default of ``True``. When - using server-side sessions, a ``False`` setting - enables sharing the user session between HTTP routes - and Socket.IO events. - :param message_queue: A connection URL for a message queue service the - server can use for multi-process communication. A - message queue is not required when using a single - server process. - :param channel: The channel name, when using a message queue. If a channel - isn't specified, a default channel will be used. If - multiple clusters of SocketIO processes need to use the - same message queue without interfering with each other, - then each cluster should use a different channel. - :param path: The path where the Socket.IO server is exposed. Defaults to - ``'socket.io'``. Leave this as is unless you know what you are - doing. - :param resource: Alias to ``path``. - :param kwargs: Socket.IO and Engine.IO server options. - - The Socket.IO server options are detailed below: - - :param client_manager: The client manager instance that will manage the - client list. When this is omitted, the client list - is stored in an in-memory structure, so the use of - multiple connected servers is not possible. In most - cases, this argument does not need to be set - explicitly. - :param logger: To enable logging set to ``True`` or pass a logger object to - use. To disable logging set to ``False``. The default is - ``False``. Note that fatal errors will be logged even when - ``logger`` is ``False``. - :param json: An alternative json module to use for encoding and decoding - packets. Custom json modules must have ``dumps`` and ``loads`` - functions that are compatible with the standard library - versions. To use the same json encoder and decoder as a Flask - application, use ``flask.json``. - :param async_handlers: If set to ``True``, event handlers for a client are - executed in separate threads. To run handlers for a - client synchronously, set to ``False``. The default - is ``True``. - :param always_connect: When set to ``False``, new connections are - provisory until the connect handler returns - something other than ``False``, at which point they - are accepted. When set to ``True``, connections are - immediately accepted, and then if the connect - handler returns ``False`` a disconnect is issued. - Set to ``True`` if you need to emit events from the - connect handler and your client is confused when it - receives events before the connection acceptance. - In any other case use the default of ``False``. - - The Engine.IO server configuration supports the following settings: - - :param async_mode: The asynchronous model to use. See the Deployment - section in the documentation for a description of the - available options. Valid async modes are ``threading``, - ``eventlet``, ``gevent`` and ``gevent_uwsgi``. If this - argument is not given, ``eventlet`` is tried first, then - ``gevent_uwsgi``, then ``gevent``, and finally - ``threading``. The first async mode that has all its - dependencies installed is then one that is chosen. - :param ping_interval: The interval in seconds at which the server pings - the client. The default is 25 seconds. For advanced - control, a two element tuple can be given, where - the first number is the ping interval and the second - is a grace period added by the server. - :param ping_timeout: The time in seconds that the client waits for the - server to respond before disconnecting. The default - is 5 seconds. - :param max_http_buffer_size: The maximum size of a message when using the - polling transport. The default is 1,000,000 - bytes. - :param allow_upgrades: Whether to allow transport upgrades or not. The - default is ``True``. - :param http_compression: Whether to compress packages when using the - polling transport. The default is ``True``. - :param compression_threshold: Only compress messages when their byte size - is greater than this value. The default is - 1024 bytes. - :param cookie: If set to a string, it is the name of the HTTP cookie the - server sends back to the client containing the client - session id. If set to a dictionary, the ``'name'`` key - contains the cookie name and other keys define cookie - attributes, where the value of each attribute can be a - string, a callable with no arguments, or a boolean. If set - to ``None`` (the default), a cookie is not sent to the - client. - :param cors_allowed_origins: Origin or list of origins that are allowed to - connect to this server. Only the same origin - is allowed by default. Set this argument to - ``'*'`` to allow all origins, or to ``[]`` to - disable CORS handling. - :param cors_credentials: Whether credentials (cookies, authentication) are - allowed in requests to this server. The default is - ``True``. - :param monitor_clients: If set to ``True``, a background task will ensure - inactive clients are closed. Set to ``False`` to - disable the monitoring task (not recommended). The - default is ``True``. - :param engineio_logger: To enable Engine.IO logging set to ``True`` or pass - a logger object to use. To disable logging set to - ``False``. The default is ``False``. Note that - fatal errors are logged even when - ``engineio_logger`` is ``False``. - """ - - def __init__(self, app=None, **kwargs): - self.server = None - self.server_options = {} - self.wsgi_server = None - self.handlers = [] - self.namespace_handlers = [] - self.exception_handlers = {} - self.default_exception_handler = None - self.manage_session = True - # We can call init_app when: - # - we were given the Flask app instance (standard initialization) - # - we were not given the app, but we were given a message_queue - # (standard initialization for auxiliary process) - # In all other cases we collect the arguments and assume the client - # will call init_app from an app factory function. - if app is not None or 'message_queue' in kwargs: - self.init_app(app, **kwargs) - else: - self.server_options.update(kwargs) - - def init_app(self, app, **kwargs): - if app is not None: - if not hasattr(app, 'extensions'): - app.extensions = {} # pragma: no cover - app.extensions['socketio'] = self - self.server_options.update(kwargs) - self.manage_session = self.server_options.pop('manage_session', - self.manage_session) - - if 'client_manager' not in kwargs: - url = self.server_options.get('message_queue', None) - channel = self.server_options.pop('channel', 'flask-socketio') - write_only = app is None - if url: - if url.startswith(('redis://', "rediss://")): - queue_class = socketio.RedisManager - elif url.startswith(('kafka://')): - queue_class = socketio.KafkaManager - elif url.startswith('zmq'): - queue_class = socketio.ZmqManager - else: - queue_class = socketio.KombuManager - queue = queue_class(url, channel=channel, - write_only=write_only) - self.server_options['client_manager'] = queue - - if 'json' in self.server_options and \ - self.server_options['json'] == flask_json: - # flask's json module is tricky to use because its output - # changes when it is invoked inside or outside the app context - # so here to prevent any ambiguities we replace it with wrappers - # that ensure that the app context is always present - class FlaskSafeJSON(object): - @staticmethod - def dumps(*args, **kwargs): - with app.app_context(): - return flask_json.dumps(*args, **kwargs) - - @staticmethod - def loads(*args, **kwargs): - with app.app_context(): - return flask_json.loads(*args, **kwargs) - - self.server_options['json'] = FlaskSafeJSON - - resource = self.server_options.pop('path', None) or \ - self.server_options.pop('resource', None) or 'socket.io' - if resource.startswith('/'): - resource = resource[1:] - if os.environ.get('FLASK_RUN_FROM_CLI'): - if self.server_options.get('async_mode') is None: - self.server_options['async_mode'] = 'threading' - self.server = socketio.Server(**self.server_options) - self.async_mode = self.server.async_mode - for handler in self.handlers: - self.server.on(handler[0], handler[1], namespace=handler[2]) - for namespace_handler in self.namespace_handlers: - self.server.register_namespace(namespace_handler) - - if app is not None: - # here we attach the SocketIO middleware to the SocketIO object so - # it can be referenced later if debug middleware needs to be - # inserted - self.sockio_mw = _SocketIOMiddleware(self.server, app, - socketio_path=resource) - app.wsgi_app = self.sockio_mw - - def on(self, message, namespace=None): - """Decorator to register a SocketIO event handler. - - This decorator must be applied to SocketIO event handlers. Example:: - - @socketio.on('my event', namespace='/chat') - def handle_my_custom_event(json): - print('received json: ' + str(json)) - - :param message: The name of the event. This is normally a user defined - string, but a few event names are already defined. Use - ``'message'`` to define a handler that takes a string - payload, ``'json'`` to define a handler that takes a - JSON blob payload, ``'connect'`` or ``'disconnect'`` - to create handlers for connection and disconnection - events. - :param namespace: The namespace on which the handler is to be - registered. Defaults to the global namespace. - """ - namespace = namespace or '/' - - def decorator(handler): - @wraps(handler) - def _handler(sid, *args): - return self._handle_event(handler, message, namespace, sid, - *args) - - if self.server: - self.server.on(message, _handler, namespace=namespace) - else: - self.handlers.append((message, _handler, namespace)) - return handler - return decorator - - def on_error(self, namespace=None): - """Decorator to define a custom error handler for SocketIO events. - - This decorator can be applied to a function that acts as an error - handler for a namespace. This handler will be invoked when a SocketIO - event handler raises an exception. The handler function must accept one - argument, which is the exception raised. Example:: - - @socketio.on_error(namespace='/chat') - def chat_error_handler(e): - print('An error has occurred: ' + str(e)) - - :param namespace: The namespace for which to register the error - handler. Defaults to the global namespace. - """ - namespace = namespace or '/' - - def decorator(exception_handler): - if not callable(exception_handler): - raise ValueError('exception_handler must be callable') - self.exception_handlers[namespace] = exception_handler - return exception_handler - return decorator - - def on_error_default(self, exception_handler): - """Decorator to define a default error handler for SocketIO events. - - This decorator can be applied to a function that acts as a default - error handler for any namespaces that do not have a specific handler. - Example:: - - @socketio.on_error_default - def error_handler(e): - print('An error has occurred: ' + str(e)) - """ - if not callable(exception_handler): - raise ValueError('exception_handler must be callable') - self.default_exception_handler = exception_handler - return exception_handler - - def on_event(self, message, handler, namespace=None): - """Register a SocketIO event handler. - - ``on_event`` is the non-decorator version of ``'on'``. - - Example:: - - def on_foo_event(json): - print('received json: ' + str(json)) - - socketio.on_event('my event', on_foo_event, namespace='/chat') - - :param message: The name of the event. This is normally a user defined - string, but a few event names are already defined. Use - ``'message'`` to define a handler that takes a string - payload, ``'json'`` to define a handler that takes a - JSON blob payload, ``'connect'`` or ``'disconnect'`` - to create handlers for connection and disconnection - events. - :param handler: The function that handles the event. - :param namespace: The namespace on which the handler is to be - registered. Defaults to the global namespace. - """ - self.on(message, namespace=namespace)(handler) - - def event(self, *args, **kwargs): - """Decorator to register an event handler. - - This is a simplified version of the ``on()`` method that takes the - event name from the decorated function. - - Example usage:: - - @socketio.event - def my_event(data): - print('Received data: ', data) - - The above example is equivalent to:: - - @socketio.on('my_event') - def my_event(data): - print('Received data: ', data) - - A custom namespace can be given as an argument to the decorator:: - - @socketio.event(namespace='/test') - def my_event(data): - print('Received data: ', data) - """ - if len(args) == 1 and len(kwargs) == 0 and callable(args[0]): - # the decorator was invoked without arguments - # args[0] is the decorated function - return self.on(args[0].__name__)(args[0]) - else: - # the decorator was invoked with arguments - def set_handler(handler): - return self.on(handler.__name__, *args, **kwargs)(handler) - - return set_handler - - def on_namespace(self, namespace_handler): - if not isinstance(namespace_handler, Namespace): - raise ValueError('Not a namespace instance.') - namespace_handler._set_socketio(self) - if self.server: - self.server.register_namespace(namespace_handler) - else: - self.namespace_handlers.append(namespace_handler) - - def emit(self, event, *args, **kwargs): - """Emit a server generated SocketIO event. - - This function emits a SocketIO event to one or more connected clients. - A JSON blob can be attached to the event as payload. This function can - be used outside of a SocketIO event context, so it is appropriate to - use when the server is the originator of an event, outside of any - client context, such as in a regular HTTP request handler or a - background task. Example:: - - @app.route('/ping') - def ping(): - socketio.emit('ping event', {'data': 42}, namespace='/chat') - - :param event: The name of the user event to emit. - :param args: A dictionary with the JSON data to send as payload. - :param namespace: The namespace under which the message is to be sent. - Defaults to the global namespace. - :param to: Send the message to all the users in the given room, or to - the user with the given session ID. If this parameter is not - included, the event is sent to all connected users. - :param include_self: ``True`` to include the sender when broadcasting - or addressing a room, or ``False`` to send to - everyone but the sender. - :param skip_sid: The session id of a client to ignore when broadcasting - or addressing a room. This is typically set to the - originator of the message, so that everyone except - that client receive the message. To skip multiple sids - pass a list. - :param callback: If given, this function will be called to acknowledge - that the client has received the message. The - arguments that will be passed to the function are - those provided by the client. Callback functions can - only be used when addressing an individual client. - """ - namespace = kwargs.pop('namespace', '/') - to = kwargs.pop('to', None) or kwargs.pop('room', None) - include_self = kwargs.pop('include_self', True) - skip_sid = kwargs.pop('skip_sid', None) - if not include_self and not skip_sid: - skip_sid = flask.request.sid - callback = kwargs.pop('callback', None) - if callback: - # wrap the callback so that it sets app app and request contexts - sid = None - original_callback = callback - original_namespace = namespace - if has_request_context(): - sid = getattr(flask.request, 'sid', None) - original_namespace = getattr(flask.request, 'namespace', None) - - def _callback_wrapper(*args): - return self._handle_event(original_callback, None, - original_namespace, sid, *args) - - if sid: - # the callback wrapper above will install a request context - # before invoking the original callback - # we only use it if the emit was issued from a Socket.IO - # populated request context (i.e. request.sid is defined) - callback = _callback_wrapper - self.server.emit(event, *args, namespace=namespace, to=to, - skip_sid=skip_sid, callback=callback, **kwargs) - - def call(self, event, *args, **kwargs): # pragma: no cover - """Emit a SocketIO event and wait for the response. - - This method issues an emit with a callback and waits for the callback - to be invoked by the client before returning. If the callback isn’t - invoked before the timeout, then a TimeoutError exception is raised. If - the Socket.IO connection drops during the wait, this method still waits - until the specified timeout. Example:: - - def get_status(client, data): - status = call('status', {'data': data}, to=client) - - :param event: The name of the user event to emit. - :param args: A dictionary with the JSON data to send as payload. - :param namespace: The namespace under which the message is to be sent. - Defaults to the global namespace. - :param to: The session ID of the recipient client. - :param timeout: The waiting timeout. If the timeout is reached before - the client acknowledges the event, then a - ``TimeoutError`` exception is raised. The default is 60 - seconds. - :param ignore_queue: Only used when a message queue is configured. If - set to ``True``, the event is emitted to the - client directly, without going through the queue. - This is more efficient, but only works when a - single server process is used, or when there is a - single addressee. It is recommended to always - leave this parameter with its default value of - ``False``. - """ - namespace = kwargs.pop('namespace', '/') - to = kwargs.pop('to', None) or kwargs.pop('room', None) - return self.server.call(event, *args, namespace=namespace, to=to, - **kwargs) - - def send(self, data, json=False, namespace=None, to=None, - callback=None, include_self=True, skip_sid=None, **kwargs): - """Send a server-generated SocketIO message. - - This function sends a simple SocketIO message to one or more connected - clients. The message can be a string or a JSON blob. This is a simpler - version of ``emit()``, which should be preferred. This function can be - used outside of a SocketIO event context, so it is appropriate to use - when the server is the originator of an event. - - :param data: The message to send, either a string or a JSON blob. - :param json: ``True`` if ``message`` is a JSON blob, ``False`` - otherwise. - :param namespace: The namespace under which the message is to be sent. - Defaults to the global namespace. - :param to: Send the message to all the users in the given room, or to - the user with the given session ID. If this parameter is not - included, the event is sent to all connected users. - :param include_self: ``True`` to include the sender when broadcasting - or addressing a room, or ``False`` to send to - everyone but the sender. - :param skip_sid: The session id of a client to ignore when broadcasting - or addressing a room. This is typically set to the - originator of the message, so that everyone except - that client receive the message. To skip multiple sids - pass a list. - :param callback: If given, this function will be called to acknowledge - that the client has received the message. The - arguments that will be passed to the function are - those provided by the client. Callback functions can - only be used when addressing an individual client. - """ - skip_sid = flask.request.sid if not include_self else skip_sid - if json: - self.emit('json', data, namespace=namespace, to=to, - skip_sid=skip_sid, callback=callback, **kwargs) - else: - self.emit('message', data, namespace=namespace, to=to, - skip_sid=skip_sid, callback=callback, **kwargs) - - def close_room(self, room, namespace=None): - """Close a room. - - This function removes any users that are in the given room and then - deletes the room from the server. This function can be used outside - of a SocketIO event context. - - :param room: The name of the room to close. - :param namespace: The namespace under which the room exists. Defaults - to the global namespace. - """ - self.server.close_room(room, namespace) - - def run(self, app, host=None, port=None, **kwargs): # pragma: no cover - """Run the SocketIO web server. - - :param app: The Flask application instance. - :param host: The hostname or IP address for the server to listen on. - Defaults to 127.0.0.1. - :param port: The port number for the server to listen on. Defaults to - 5000. - :param debug: ``True`` to start the server in debug mode, ``False`` to - start in normal mode. - :param use_reloader: ``True`` to enable the Flask reloader, ``False`` - to disable it. - :param reloader_options: A dictionary with options that are passed to - the Flask reloader, such as ``extra_files``, - ``reloader_type``, etc. - :param extra_files: A list of additional files that the Flask - reloader should watch. Defaults to ``None``. - Deprecated, use ``reloader_options`` instead. - :param log_output: If ``True``, the server logs all incoming - connections. If ``False`` logging is disabled. - Defaults to ``True`` in debug mode, ``False`` - in normal mode. Unused when the threading async - mode is used. - :param allow_unsafe_werkzeug: Set to ``True`` to allow the use of the - Werkzeug web server in a production - setting. Default is ``False``. Set to - ``True`` at your own risk. - :param kwargs: Additional web server options. The web server options - are specific to the server used in each of the supported - async modes. Note that options provided here will - not be seen when using an external web server such - as gunicorn, since this method is not called in that - case. - """ - if host is None: - host = '127.0.0.1' - if port is None: - server_name = app.config['SERVER_NAME'] - if server_name and ':' in server_name: - port = int(server_name.rsplit(':', 1)[1]) - else: - port = 5000 - - debug = kwargs.pop('debug', app.debug) - log_output = kwargs.pop('log_output', debug) - use_reloader = kwargs.pop('use_reloader', debug) - extra_files = kwargs.pop('extra_files', None) - reloader_options = kwargs.pop('reloader_options', {}) - if extra_files: - reloader_options['extra_files'] = extra_files - - app.debug = debug - if app.debug and self.server.eio.async_mode != 'threading': - # put the debug middleware between the SocketIO middleware - # and the Flask application instance - # - # mw1 mw2 mw3 Flask app - # o ---- o ---- o ---- o - # / - # o Flask-SocketIO - # \ middleware - # o - # Flask-SocketIO WebSocket handler - # - # BECOMES - # - # dbg-mw mw1 mw2 mw3 Flask app - # o ---- o ---- o ---- o ---- o - # / - # o Flask-SocketIO - # \ middleware - # o - # Flask-SocketIO WebSocket handler - # - self.sockio_mw.wsgi_app = DebuggedApplication( - self.sockio_mw.wsgi_app, evalex=True) - - if self.server.eio.async_mode == 'threading': - try: - import simple_websocket # noqa: F401 - except ImportError: - from werkzeug._internal import _log - _log('warning', 'WebSocket transport not available. Install ' - 'simple-websocket for improved performance.') - allow_unsafe_werkzeug = kwargs.pop('allow_unsafe_werkzeug', - False) - if not sys.stdin or not sys.stdin.isatty(): # pragma: no cover - if not allow_unsafe_werkzeug: - raise RuntimeError('The Werkzeug web server is not ' - 'designed to run in production. Pass ' - 'allow_unsafe_werkzeug=True to the ' - 'run() method to disable this error.') - else: - from werkzeug._internal import _log - _log('warning', ('Werkzeug appears to be used in a ' - 'production deployment. Consider ' - 'switching to a production web server ' - 'instead.')) - app.run(host=host, port=port, threaded=True, - use_reloader=use_reloader, **reloader_options, **kwargs) - elif self.server.eio.async_mode == 'eventlet': - def run_server(): - import eventlet - import eventlet.wsgi - import eventlet.green - addresses = eventlet.green.socket.getaddrinfo(host, port) - if not addresses: - raise RuntimeError( - 'Could not resolve host to a valid address') - eventlet_socket = eventlet.listen(addresses[0][4], - addresses[0][0]) - - # If provided an SSL argument, use an SSL socket - ssl_args = ['keyfile', 'certfile', 'server_side', 'cert_reqs', - 'ssl_version', 'ca_certs', - 'do_handshake_on_connect', 'suppress_ragged_eofs', - 'ciphers'] - ssl_params = {k: kwargs[k] for k in kwargs - if k in ssl_args and kwargs[k] is not None} - for k in ssl_args: - kwargs.pop(k, None) - if len(ssl_params) > 0: - ssl_params['server_side'] = True # Listening requires true - eventlet_socket = eventlet.wrap_ssl(eventlet_socket, - **ssl_params) - - eventlet.wsgi.server(eventlet_socket, app, - log_output=log_output, **kwargs) - - if use_reloader: - run_with_reloader(run_server, **reloader_options) - else: - run_server() - elif self.server.eio.async_mode == 'gevent': - from gevent import pywsgi - try: - from geventwebsocket.handler import WebSocketHandler - websocket = True - except ImportError: - app.logger.warning( - 'WebSocket transport not available. Install ' - 'gevent-websocket for improved performance.') - websocket = False - - log = 'default' - if not log_output: - log = None - if websocket: - self.wsgi_server = pywsgi.WSGIServer( - (host, port), app, handler_class=WebSocketHandler, - log=log, **kwargs) - else: - self.wsgi_server = pywsgi.WSGIServer((host, port), app, - log=log, **kwargs) - - if use_reloader: - # monkey patching is required by the reloader - from gevent import monkey - monkey.patch_thread() - monkey.patch_time() - - def run_server(): - self.wsgi_server.serve_forever() - - run_with_reloader(run_server, **reloader_options) - else: - self.wsgi_server.serve_forever() - - def stop(self): - """Stop a running SocketIO web server. - - This method must be called from a HTTP or SocketIO handler function. - """ - if self.server.eio.async_mode == 'threading': - func = flask.request.environ.get('werkzeug.server.shutdown') - if func: - func() - else: - raise RuntimeError('Cannot stop unknown web server') - elif self.server.eio.async_mode == 'eventlet': - raise SystemExit - elif self.server.eio.async_mode == 'gevent': - self.wsgi_server.stop() - - def start_background_task(self, target, *args, **kwargs): - """Start a background task using the appropriate async model. - - This is a utility function that applications can use to start a - background task using the method that is compatible with the - selected async mode. - - :param target: the target function to execute. - :param args: arguments to pass to the function. - :param kwargs: keyword arguments to pass to the function. - - This function returns an object that represents the background task, - on which the ``join()`` method can be invoked to wait for the task to - complete. - """ - return self.server.start_background_task(target, *args, **kwargs) - - def sleep(self, seconds=0): - """Sleep for the requested amount of time using the appropriate async - model. - - This is a utility function that applications can use to put a task to - sleep without having to worry about using the correct call for the - selected async mode. - """ - return self.server.sleep(seconds) - - def test_client(self, app, namespace=None, query_string=None, - headers=None, auth=None, flask_test_client=None): - """The Socket.IO test client is useful for testing a Flask-SocketIO - server. It works in a similar way to the Flask Test Client, but - adapted to the Socket.IO server. - - :param app: The Flask application instance. - :param namespace: The namespace for the client. If not provided, the - client connects to the server on the global - namespace. - :param query_string: A string with custom query string arguments. - :param headers: A dictionary with custom HTTP headers. - :param auth: Optional authentication data, given as a dictionary. - :param flask_test_client: The instance of the Flask test client - currently in use. Passing the Flask test - client is optional, but is necessary if you - want the Flask user session and any other - cookies set in HTTP routes accessible from - Socket.IO events. - """ - return SocketIOTestClient(app, self, namespace=namespace, - query_string=query_string, headers=headers, - auth=auth, - flask_test_client=flask_test_client) - - def _handle_event(self, handler, message, namespace, sid, *args): - environ = self.server.get_environ(sid, namespace=namespace) - if not environ: - # we don't have record of this client, ignore this event - return '', 400 - app = environ['flask.app'] - with app.request_context(environ): - if self.manage_session: - # manage a separate session for this client's Socket.IO events - # created as a copy of the regular user session - if 'saved_session' not in environ: - environ['saved_session'] = _ManagedSession(flask.session) - session_obj = environ['saved_session'] - if hasattr(flask, 'globals') and \ - hasattr(flask.globals, 'request_ctx'): - # update session for Flask >= 2.2 - ctx = flask.globals.request_ctx._get_current_object() - else: # pragma: no cover - # update session for Flask < 2.2 - ctx = flask._request_ctx_stack.top - ctx.session = session_obj - else: - # let Flask handle the user session - # for cookie based sessions, this effectively freezes the - # session to its state at connection time - # for server-side sessions, this allows HTTP and Socket.IO to - # share the session, with both having read/write access to it - session_obj = flask.session._get_current_object() - flask.request.sid = sid - flask.request.namespace = namespace - flask.request.event = {'message': message, 'args': args} - try: - if message == 'connect': - auth = args[1] if len(args) > 1 else None - try: - ret = handler(auth) - except TypeError: - ret = handler() - else: - ret = handler(*args) - except ConnectionRefusedError: - raise # let this error bubble up to python-socketio - except: - err_handler = self.exception_handlers.get( - namespace, self.default_exception_handler) - if err_handler is None: - raise - type, value, traceback = sys.exc_info() - return err_handler(value) - if not self.manage_session: - # when Flask is managing the user session, it needs to save it - if not hasattr(session_obj, 'modified') or \ - session_obj.modified: - resp = app.response_class() - app.session_interface.save_session(app, session_obj, resp) - return ret - - -def emit(event, *args, **kwargs): - """Emit a SocketIO event. - - This function emits a SocketIO event to one or more connected clients. A - JSON blob can be attached to the event as payload. This is a function that - can only be called from a SocketIO event handler, as in obtains some - information from the current client context. Example:: - - @socketio.on('my event') - def handle_my_custom_event(json): - emit('my response', {'data': 42}) - - :param event: The name of the user event to emit. - :param args: A dictionary with the JSON data to send as payload. - :param namespace: The namespace under which the message is to be sent. - Defaults to the namespace used by the originating event. - A ``'/'`` can be used to explicitly specify the global - namespace. - :param callback: Callback function to invoke with the client's - acknowledgement. - :param broadcast: ``True`` to send the message to all clients, or ``False`` - to only reply to the sender of the originating event. - :param to: Send the message to all the users in the given room, or to the - user with the given session ID. If this argument is not set and - ``broadcast`` is ``False``, then the message is sent only to the - originating user. - :param include_self: ``True`` to include the sender when broadcasting or - addressing a room, or ``False`` to send to everyone - but the sender. - :param skip_sid: The session id of a client to ignore when broadcasting - or addressing a room. This is typically set to the - originator of the message, so that everyone except - that client receive the message. To skip multiple sids - pass a list. - :param ignore_queue: Only used when a message queue is configured. If - set to ``True``, the event is emitted to the - clients directly, without going through the queue. - This is more efficient, but only works when a - single server process is used, or when there is a - single addressee. It is recommended to always leave - this parameter with its default value of ``False``. - """ - if 'namespace' in kwargs: - namespace = kwargs['namespace'] - else: - namespace = flask.request.namespace - callback = kwargs.get('callback') - broadcast = kwargs.get('broadcast') - to = kwargs.pop('to', None) or kwargs.pop('room', None) - if to is None and not broadcast: - to = flask.request.sid - include_self = kwargs.get('include_self', True) - skip_sid = kwargs.get('skip_sid') - ignore_queue = kwargs.get('ignore_queue', False) - - socketio = flask.current_app.extensions['socketio'] - return socketio.emit(event, *args, namespace=namespace, to=to, - include_self=include_self, skip_sid=skip_sid, - callback=callback, ignore_queue=ignore_queue) - - -def call(event, *args, **kwargs): # pragma: no cover - """Emit a SocketIO event and wait for the response. - - This function issues an emit with a callback and waits for the callback to - be invoked by the client before returning. If the callback isn’t invoked - before the timeout, then a TimeoutError exception is raised. If the - Socket.IO connection drops during the wait, this method still waits until - the specified timeout. Example:: - - def get_status(client, data): - status = call('status', {'data': data}, to=client) - - :param event: The name of the user event to emit. - :param args: A dictionary with the JSON data to send as payload. - :param namespace: The namespace under which the message is to be sent. - Defaults to the namespace used by the originating event. - A ``'/'`` can be used to explicitly specify the global - namespace. - :param to: The session ID of the recipient client. If this argument is not - given, the event is sent to the originating client. - :param timeout: The waiting timeout. If the timeout is reached before the - client acknowledges the event, then a ``TimeoutError`` - exception is raised. The default is 60 seconds. - :param ignore_queue: Only used when a message queue is configured. If - set to ``True``, the event is emitted to the - client directly, without going through the queue. - This is more efficient, but only works when a - single server process is used, or when there is a - single addressee. It is recommended to always leave - this parameter with its default value of ``False``. - """ - if 'namespace' in kwargs: - namespace = kwargs['namespace'] - else: - namespace = flask.request.namespace - to = kwargs.pop('to', None) or kwargs.pop('room', None) - if to is None: - to = flask.request.sid - timeout = kwargs.get('timeout', 60) - ignore_queue = kwargs.get('ignore_queue', False) - - socketio = flask.current_app.extensions['socketio'] - return socketio.call(event, *args, namespace=namespace, to=to, - ignore_queue=ignore_queue, timeout=timeout) - - -def send(message, **kwargs): - """Send a SocketIO message. - - This function sends a simple SocketIO message to one or more connected - clients. The message can be a string or a JSON blob. This is a simpler - version of ``emit()``, which should be preferred. This is a function that - can only be called from a SocketIO event handler. - - :param message: The message to send, either a string or a JSON blob. - :param json: ``True`` if ``message`` is a JSON blob, ``False`` - otherwise. - :param namespace: The namespace under which the message is to be sent. - Defaults to the namespace used by the originating event. - An empty string can be used to use the global namespace. - :param callback: Callback function to invoke with the client's - acknowledgement. - :param broadcast: ``True`` to send the message to all connected clients, or - ``False`` to only reply to the sender of the originating - event. - :param to: Send the message to all the users in the given room, or to the - user with the given session ID. If this argument is not set and - ``broadcast`` is ``False``, then the message is sent only to the - originating user. - :param include_self: ``True`` to include the sender when broadcasting or - addressing a room, or ``False`` to send to everyone - but the sender. - :param skip_sid: The session id of a client to ignore when broadcasting - or addressing a room. This is typically set to the - originator of the message, so that everyone except - that client receive the message. To skip multiple sids - pass a list. - :param ignore_queue: Only used when a message queue is configured. If - set to ``True``, the event is emitted to the - clients directly, without going through the queue. - This is more efficient, but only works when a - single server process is used, or when there is a - single addressee. It is recommended to always leave - this parameter with its default value of ``False``. - """ - json = kwargs.get('json', False) - if 'namespace' in kwargs: - namespace = kwargs['namespace'] - else: - namespace = flask.request.namespace - callback = kwargs.get('callback') - broadcast = kwargs.get('broadcast') - to = kwargs.pop('to', None) or kwargs.pop('room', None) - if to is None and not broadcast: - to = flask.request.sid - include_self = kwargs.get('include_self', True) - skip_sid = kwargs.get('skip_sid') - ignore_queue = kwargs.get('ignore_queue', False) - - socketio = flask.current_app.extensions['socketio'] - return socketio.send(message, json=json, namespace=namespace, to=to, - include_self=include_self, skip_sid=skip_sid, - callback=callback, ignore_queue=ignore_queue) - - -def join_room(room, sid=None, namespace=None): - """Join a room. - - This function puts the user in a room, under the current namespace. The - user and the namespace are obtained from the event context. This is a - function that can only be called from a SocketIO event handler. Example:: - - @socketio.on('join') - def on_join(data): - username = session['username'] - room = data['room'] - join_room(room) - send(username + ' has entered the room.', to=room) - - :param room: The name of the room to join. - :param sid: The session id of the client. If not provided, the client is - obtained from the request context. - :param namespace: The namespace for the room. If not provided, the - namespace is obtained from the request context. - """ - socketio = flask.current_app.extensions['socketio'] - sid = sid or flask.request.sid - namespace = namespace or flask.request.namespace - socketio.server.enter_room(sid, room, namespace=namespace) - - -def leave_room(room, sid=None, namespace=None): - """Leave a room. - - This function removes the user from a room, under the current namespace. - The user and the namespace are obtained from the event context. Example:: - - @socketio.on('leave') - def on_leave(data): - username = session['username'] - room = data['room'] - leave_room(room) - send(username + ' has left the room.', to=room) - - :param room: The name of the room to leave. - :param sid: The session id of the client. If not provided, the client is - obtained from the request context. - :param namespace: The namespace for the room. If not provided, the - namespace is obtained from the request context. - """ - socketio = flask.current_app.extensions['socketio'] - sid = sid or flask.request.sid - namespace = namespace or flask.request.namespace - socketio.server.leave_room(sid, room, namespace=namespace) - - -def close_room(room, namespace=None): - """Close a room. - - This function removes any users that are in the given room and then deletes - the room from the server. - - :param room: The name of the room to close. - :param namespace: The namespace for the room. If not provided, the - namespace is obtained from the request context. - """ - socketio = flask.current_app.extensions['socketio'] - namespace = namespace or flask.request.namespace - socketio.server.close_room(room, namespace=namespace) - - -def rooms(sid=None, namespace=None): - """Return a list of the rooms the client is in. - - This function returns all the rooms the client has entered, including its - own room, assigned by the Socket.IO server. - - :param sid: The session id of the client. If not provided, the client is - obtained from the request context. - :param namespace: The namespace for the room. If not provided, the - namespace is obtained from the request context. - """ - socketio = flask.current_app.extensions['socketio'] - sid = sid or flask.request.sid - namespace = namespace or flask.request.namespace - return socketio.server.rooms(sid, namespace=namespace) - - -def disconnect(sid=None, namespace=None, silent=False): - """Disconnect the client. - - This function terminates the connection with the client. As a result of - this call the client will receive a disconnect event. Example:: - - @socketio.on('message') - def receive_message(msg): - if is_banned(session['username']): - disconnect() - else: - # ... - - :param sid: The session id of the client. If not provided, the client is - obtained from the request context. - :param namespace: The namespace for the room. If not provided, the - namespace is obtained from the request context. - :param silent: this option is deprecated. - """ - socketio = flask.current_app.extensions['socketio'] - sid = sid or flask.request.sid - namespace = namespace or flask.request.namespace - return socketio.server.disconnect(sid, namespace=namespace) diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask_socketio/__pycache__/__init__.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/flask_socketio/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 2c8f85a82488edeeb9cf5923328adbd6de27d6b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60209 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�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 U;s1Lz>mA>!?QwtC+2j6y0d`A8L;wH) diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask_socketio/__pycache__/namespace.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/flask_socketio/__pycache__/namespace.cpython-311.pyc deleted file mode 100644 index 3974a9129e0efacb7771bd864befa976ba4e2f5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2972 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 HG6eq%^QV1B diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask_socketio/namespace.py b/venv_flaskchat/lib/python3.11/site-packages/flask_socketio/namespace.py deleted file mode 100644 index 43833a9..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask_socketio/namespace.py +++ /dev/null @@ -1,46 +0,0 @@ -from socketio import Namespace as _Namespace - - -class Namespace(_Namespace): - def __init__(self, namespace=None): - super(Namespace, self).__init__(namespace) - self.socketio = None - - def _set_socketio(self, socketio): - self.socketio = socketio - - def trigger_event(self, event, *args): - """Dispatch an event to the proper handler method. - - In the most common usage, this method is not overloaded by subclasses, - as it performs the routing of events to methods. However, this - method can be overridden if special dispatching rules are needed, or if - having a single method that catches all events is desired. - """ - handler_name = 'on_' + event - if not hasattr(self, handler_name): - # there is no handler for this event, so we ignore it - return - handler = getattr(self, handler_name) - return self.socketio._handle_event(handler, event, self.namespace, - *args) - - def emit(self, event, data=None, room=None, include_self=True, - namespace=None, callback=None): - """Emit a custom event to one or more connected clients.""" - return self.socketio.emit(event, data, room=room, - include_self=include_self, - namespace=namespace or self.namespace, - callback=callback) - - def send(self, data, room=None, include_self=True, namespace=None, - callback=None): - """Send a message to one or more connected clients.""" - return self.socketio.send(data, room=room, include_self=include_self, - namespace=namespace or self.namespace, - callback=callback) - - def close_room(self, room, namespace=None): - """Close a room.""" - return self.socketio.close_room(room=room, - namespace=namespace or self.namespace) diff --git a/venv_flaskchat/lib/python3.11/site-packages/flask_socketio/test_client.py b/venv_flaskchat/lib/python3.11/site-packages/flask_socketio/test_client.py deleted file mode 100644 index f930c97..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/flask_socketio/test_client.py +++ /dev/null @@ -1,218 +0,0 @@ -import uuid - -from socketio import packet -from socketio.pubsub_manager import PubSubManager -from werkzeug.test import EnvironBuilder - - -class SocketIOTestClient(object): - """ - This class is useful for testing a Flask-SocketIO server. It works in a - similar way to the Flask Test Client, but adapted to the Socket.IO server. - - :param app: The Flask application instance. - :param socketio: The application's ``SocketIO`` instance. - :param namespace: The namespace for the client. If not provided, the client - connects to the server on the global namespace. - :param query_string: A string with custom query string arguments. - :param headers: A dictionary with custom HTTP headers. - :param auth: Optional authentication data, given as a dictionary. - :param flask_test_client: The instance of the Flask test client - currently in use. Passing the Flask test - client is optional, but is necessary if you - want the Flask user session and any other - cookies set in HTTP routes accessible from - Socket.IO events. - """ - clients = {} - - def __init__(self, app, socketio, namespace=None, query_string=None, - headers=None, auth=None, flask_test_client=None): - def _mock_send_packet(eio_sid, pkt): - # make sure the packet can be encoded and decoded - epkt = pkt.encode() - if not isinstance(epkt, list): - pkt = packet.Packet(encoded_packet=epkt) - else: - pkt = packet.Packet(encoded_packet=epkt[0]) - for att in epkt[1:]: - pkt.add_attachment(att) - client = self.clients.get(eio_sid) - if not client: - return - if pkt.packet_type == packet.EVENT or \ - pkt.packet_type == packet.BINARY_EVENT: - if pkt.data[0] == 'message' or pkt.data[0] == 'json': - client.queue.append({ - 'name': pkt.data[0], - 'args': pkt.data[1], - 'namespace': pkt.namespace or '/'}) - else: - client.queue.append({ - 'name': pkt.data[0], - 'args': pkt.data[1:], - 'namespace': pkt.namespace or '/'}) - elif pkt.packet_type == packet.ACK or \ - pkt.packet_type == packet.BINARY_ACK: - client.acks = {'args': pkt.data, - 'namespace': pkt.namespace or '/'} - elif pkt.packet_type in [packet.DISCONNECT, packet.CONNECT_ERROR]: - client.connected[pkt.namespace or '/'] = False - - self.app = app - self.flask_test_client = flask_test_client - self.eio_sid = uuid.uuid4().hex - self.clients[self.eio_sid] = self - self.callback_counter = 0 - self.socketio = socketio - self.connected = {} - self.queue = [] - self.acks = None - socketio.server._send_packet = _mock_send_packet - socketio.server.environ[self.eio_sid] = {} - socketio.server.async_handlers = False # easier to test when - socketio.server.eio.async_handlers = False # events are sync - if isinstance(socketio.server.manager, PubSubManager): - raise RuntimeError('Test client cannot be used with a message ' - 'queue. Disable the queue on your test ' - 'configuration.') - socketio.server.manager.initialize() - self.connect(namespace=namespace, query_string=query_string, - headers=headers, auth=auth) - - def is_connected(self, namespace=None): - """Check if a namespace is connected. - - :param namespace: The namespace to check. The global namespace is - assumed if this argument is not provided. - """ - return self.connected.get(namespace or '/', False) - - def connect(self, namespace=None, query_string=None, headers=None, - auth=None): - """Connect the client. - - :param namespace: The namespace for the client. If not provided, the - client connects to the server on the global - namespace. - :param query_string: A string with custom query string arguments. - :param headers: A dictionary with custom HTTP headers. - :param auth: Optional authentication data, given as a dictionary. - - Note that it is usually not necessary to explicitly call this method, - since a connection is automatically established when an instance of - this class is created. An example where it this method would be useful - is when the application accepts multiple namespace connections. - """ - url = '/socket.io' - namespace = namespace or '/' - if query_string: - if query_string[0] != '?': - query_string = '?' + query_string - url += query_string - environ = EnvironBuilder(url, headers=headers).get_environ() - environ['flask.app'] = self.app - if self.flask_test_client: - # inject cookies from Flask - if hasattr(self.flask_test_client, '_add_cookies_to_wsgi'): - # flask >= 2.3 - self.flask_test_client._add_cookies_to_wsgi(environ) - else: # pragma: no cover - # flask < 2.3 - self.flask_test_client.cookie_jar.inject_wsgi(environ) - self.socketio.server._handle_eio_connect(self.eio_sid, environ) - pkt = packet.Packet(packet.CONNECT, auth, namespace=namespace) - self.socketio.server._handle_eio_message(self.eio_sid, pkt.encode()) - sid = self.socketio.server.manager.sid_from_eio_sid(self.eio_sid, - namespace) - if sid: - self.connected[namespace] = True - - def disconnect(self, namespace=None): - """Disconnect the client. - - :param namespace: The namespace to disconnect. The global namespace is - assumed if this argument is not provided. - """ - if not self.is_connected(namespace): - raise RuntimeError('not connected') - pkt = packet.Packet(packet.DISCONNECT, namespace=namespace) - self.socketio.server._handle_eio_message(self.eio_sid, pkt.encode()) - del self.connected[namespace or '/'] - - def emit(self, event, *args, **kwargs): - """Emit an event to the server. - - :param event: The event name. - :param *args: The event arguments. - :param callback: ``True`` if the client requests a callback, ``False`` - if not. Note that client-side callbacks are not - implemented, a callback request will just tell the - server to provide the arguments to invoke the - callback, but no callback is invoked. Instead, the - arguments that the server provided for the callback - are returned by this function. - :param namespace: The namespace of the event. The global namespace is - assumed if this argument is not provided. - """ - namespace = kwargs.pop('namespace', None) - if not self.is_connected(namespace): - raise RuntimeError('not connected') - callback = kwargs.pop('callback', False) - id = None - if callback: - self.callback_counter += 1 - id = self.callback_counter - pkt = packet.Packet(packet.EVENT, data=[event] + list(args), - namespace=namespace, id=id) - encoded_pkt = pkt.encode() - if isinstance(encoded_pkt, list): - for epkt in encoded_pkt: - self.socketio.server._handle_eio_message(self.eio_sid, epkt) - else: - self.socketio.server._handle_eio_message(self.eio_sid, encoded_pkt) - if self.acks is not None: - ack = self.acks - self.acks = None - return ack['args'][0] if len(ack['args']) == 1 \ - else ack['args'] - - def send(self, data, json=False, callback=False, namespace=None): - """Send a text or JSON message to the server. - - :param data: A string, dictionary or list to send to the server. - :param json: ``True`` to send a JSON message, ``False`` to send a text - message. - :param callback: ``True`` if the client requests a callback, ``False`` - if not. Note that client-side callbacks are not - implemented, a callback request will just tell the - server to provide the arguments to invoke the - callback, but no callback is invoked. Instead, the - arguments that the server provided for the callback - are returned by this function. - :param namespace: The namespace of the event. The global namespace is - assumed if this argument is not provided. - """ - if json: - msg = 'json' - else: - msg = 'message' - return self.emit(msg, data, callback=callback, namespace=namespace) - - def get_received(self, namespace=None): - """Return the list of messages received from the server. - - Since this is not a real client, any time the server emits an event, - the event is simply stored. The test code can invoke this method to - obtain the list of events that were received since the last call. - - :param namespace: The namespace to get events from. The global - namespace is assumed if this argument is not - provided. - """ - if not self.is_connected(namespace): - raise RuntimeError('not connected') - namespace = namespace or '/' - r = [pkt for pkt in self.queue if pkt['namespace'] == namespace] - self.queue = [pkt for pkt in self.queue if pkt not in r] - return r diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/INSTALLER b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst deleted file mode 100644 index 7b190ca..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2011 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. diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/METADATA b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/METADATA deleted file mode 100644 index 1d935ed..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/METADATA +++ /dev/null @@ -1,97 +0,0 @@ -Metadata-Version: 2.1 -Name: itsdangerous -Version: 2.1.2 -Summary: Safely pass data to untrusted environments and back. -Home-page: https://palletsprojects.com/p/itsdangerous/ -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -Maintainer: Pallets -Maintainer-email: contact@palletsprojects.com -License: BSD-3-Clause -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Documentation, https://itsdangerous.palletsprojects.com/ -Project-URL: Changes, https://itsdangerous.palletsprojects.com/changes/ -Project-URL: Source Code, https://github.com/pallets/itsdangerous/ -Project-URL: Issue Tracker, https://github.com/pallets/itsdangerous/issues/ -Project-URL: Twitter, https://twitter.com/PalletsTeam -Project-URL: Chat, https://discord.gg/pallets -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Requires-Python: >=3.7 -Description-Content-Type: text/x-rst -License-File: LICENSE.rst - -ItsDangerous -============ - -... so better sign this - -Various helpers to pass data to untrusted environments and to get it -back safe and sound. Data is cryptographically signed to ensure that a -token has not been tampered with. - -It's possible to customize how data is serialized. Data is compressed as -needed. A timestamp can be added and verified automatically while -loading a token. - - -Installing ----------- - -Install and update using `pip`_: - -.. code-block:: text - - pip install -U itsdangerous - -.. _pip: https://pip.pypa.io/en/stable/getting-started/ - - -A Simple Example ----------------- - -Here's how you could generate a token for transmitting a user's id and -name between web requests. - -.. code-block:: python - - from itsdangerous import URLSafeSerializer - auth_s = URLSafeSerializer("secret key", "auth") - token = auth_s.dumps({"id": 5, "name": "itsdangerous"}) - - print(token) - # eyJpZCI6NSwibmFtZSI6Iml0c2Rhbmdlcm91cyJ9.6YP6T0BaO67XP--9UzTrmurXSmg - - data = auth_s.loads(token) - print(data["name"]) - # itsdangerous - - -Donate ------- - -The Pallets organization develops and supports ItsDangerous 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://itsdangerous.palletsprojects.com/ -- Changes: https://itsdangerous.palletsprojects.com/changes/ -- PyPI Releases: https://pypi.org/project/ItsDangerous/ -- Source Code: https://github.com/pallets/itsdangerous/ -- Issue Tracker: https://github.com/pallets/itsdangerous/issues/ -- Website: https://palletsprojects.com/p/itsdangerous/ -- Twitter: https://twitter.com/PalletsTeam -- Chat: https://discord.gg/pallets - - diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/RECORD b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/RECORD deleted file mode 100644 index d943693..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/RECORD +++ /dev/null @@ -1,23 +0,0 @@ -itsdangerous-2.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -itsdangerous-2.1.2.dist-info/LICENSE.rst,sha256=Y68JiRtr6K0aQlLtQ68PTvun_JSOIoNnvtfzxa4LCdc,1475 -itsdangerous-2.1.2.dist-info/METADATA,sha256=ThrHIJQ_6XlfbDMCAVe_hawT7IXiIxnTBIDrwxxtucQ,2928 -itsdangerous-2.1.2.dist-info/RECORD,, -itsdangerous-2.1.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 -itsdangerous-2.1.2.dist-info/top_level.txt,sha256=gKN1OKLk81i7fbWWildJA88EQ9NhnGMSvZqhfz9ICjk,13 -itsdangerous/__init__.py,sha256=n4mkyjlIVn23pgsgCIw0MJKPdcHIetyeRpe5Fwsn8qg,876 -itsdangerous/__pycache__/__init__.cpython-311.pyc,, -itsdangerous/__pycache__/_json.cpython-311.pyc,, -itsdangerous/__pycache__/encoding.cpython-311.pyc,, -itsdangerous/__pycache__/exc.cpython-311.pyc,, -itsdangerous/__pycache__/serializer.cpython-311.pyc,, -itsdangerous/__pycache__/signer.cpython-311.pyc,, -itsdangerous/__pycache__/timed.cpython-311.pyc,, -itsdangerous/__pycache__/url_safe.cpython-311.pyc,, -itsdangerous/_json.py,sha256=wIhs_7-_XZolmyr-JvKNiy_LgAcfevYR0qhCVdlIhg8,450 -itsdangerous/encoding.py,sha256=pgh86snHC76dPLNCnPlrjR5SaYL_M8H-gWRiiLNbhCU,1419 -itsdangerous/exc.py,sha256=VFxmP2lMoSJFqxNMzWonqs35ROII4-fvCBfG0v1Tkbs,3206 -itsdangerous/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -itsdangerous/serializer.py,sha256=zgZ1-U705jHDpt62x_pmLJdryEKDNAbt5UkJtnkcCSw,11144 -itsdangerous/signer.py,sha256=QUH0iX0in-OTptMAXKU5zWMwmOCXn1fsDsubXiGdFN4,9367 -itsdangerous/timed.py,sha256=5CBWLds4Nm8-3bFVC8RxNzFjx6PSwjch8wuZ5cwcHFI,8174 -itsdangerous/url_safe.py,sha256=5bC4jSKOjWNRkWrFseifWVXUnHnPgwOLROjiOwb-eeo,2402 diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/WHEEL b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/WHEEL deleted file mode 100644 index becc9a6..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.1) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt deleted file mode 100644 index e163955..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -itsdangerous diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__init__.py b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__init__.py deleted file mode 100644 index fdb2dfd..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -from .encoding import base64_decode as base64_decode -from .encoding import base64_encode as base64_encode -from .encoding import want_bytes as want_bytes -from .exc import BadData as BadData -from .exc import BadHeader as BadHeader -from .exc import BadPayload as BadPayload -from .exc import BadSignature as BadSignature -from .exc import BadTimeSignature as BadTimeSignature -from .exc import SignatureExpired as SignatureExpired -from .serializer import Serializer as Serializer -from .signer import HMACAlgorithm as HMACAlgorithm -from .signer import NoneAlgorithm as NoneAlgorithm -from .signer import Signer as Signer -from .timed import TimedSerializer as TimedSerializer -from .timed import TimestampSigner as TimestampSigner -from .url_safe import URLSafeSerializer as URLSafeSerializer -from .url_safe import URLSafeTimedSerializer as URLSafeTimedSerializer - -__version__ = "2.1.2" diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__pycache__/__init__.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index f3022ae06ae4b50f286ba5cd1b1c79316d6d89c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1172 zcmZvaPjAyO7{;A;ZPT>r-)(R}TtGrStYKqtnh;|!?Z75P*~OR0YrM{z<5YH9)}8ni z@DUK-g+op#>IsPxH>BNm;3YHIUL0fb{x$G-~uifE&>;E(eM&qic7d;xCC6rWy59Q3a%Kg0K3>V>;hMD)o>Nq z!=7P}*Wx;^8?JFbZs3ODI&c#=4g0_?+%nwY?YM(GhMT}$+%??d%kc_cG28}T#jC&_ zd?)G-P;dE{1BdH5bN`4a`fM|d=rD=st$>Q_!23W%8XnD3s$jVCl0>gaN&u^Xdz3^} zg7Lt-B{QCo2wWZ9fQ-~*`-rc!t zeg+dG33mm_C0$BT=0$owlx1xzy12Sjb* zAX_?U>%g5z9xC`)+0j{7XSFb#QmI%X!tg7)ga}=o28XbP3SugVjA9~*AR^dLri`j! zmlJiib3)Q!O2srh)^?~ZXGg(!mYyWyNq>DkP%NcuV=_D=BUr^!6%jF_GMT6#44GhQ z81~1rD|ahSq6w$Z<$c&%Um^7Z>hGfCI62zPY%NOq8M2h42brxLJ<4q5sF&Hw(OPCJ vM^7_bi;~9~vXrBZ%+{jhVTLR%>iqxiTN$#HqutEbkH*T!nttUy_>+GCFoIR! diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__pycache__/_json.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__pycache__/_json.cpython-311.pyc deleted file mode 100644 index 7461883414f82eb9fdc72fbad829db96c0c345c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1410 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 diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__pycache__/exc.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__pycache__/exc.cpython-311.pyc deleted file mode 100644 index 0cb1e9013174ee7d983939001e09cd405853c2e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5013 zcmcIo-)|dP6~1G8?6G4fY11|-{WT?&;&f|o*&^6zLBMud5D*Yu5b_F5rk?9$y7r8@ zcakkJ{77;X#Wr%vM3UfC8U*j;>}Tlg!YN=-0_UZb`rX)Wg4Hk z_ntfV$GP8k&bj?lsZ?Ni{_4K({JO~4KdBNudatn0G{zn?hdEl4)ik_Q%~UH@OKFU2 zchgaKlrvHJY*b)1eV|V^p~2&C_+!)g3l`aRJ!Sh49 zg3{%oEAYaQZcORMpev4iS5&$ZbmJrQl^pFhD^L83_OwveI)-BhJaAjQ9`6!`Xzlwq zQTYw*#g(mUDMzcNofOYBQd_K{VZX(ijvb@!=npcr>=wJP)pD32+sS>~c5c~$z5ctO z*skP`={C$ewqs&K+w>cz?X8*87lC=tmL~V={)!iH!JUfv&ax{_`~}M#Ur1gs@ics4 z+RdiP@7H-daD9*Tc3^%lkhg4ai3@*4nhtNc9+#DZ`lM1ZSGkbrYda2i=I6~uHP zRGnOlOKC6hdMdGR+BW_6e-7~n?J)}gmgsqg!i%WFo+dPLBiqoPq5Vay)6lZPtauKG z-Dc0Vg>t&1%at}49mBF*&kZa~WHAcbGm z_pp6gbpz={_N&6UmG+t-8m&+E&aV1wf&WUkU%LWJ!vcg(PboxDgDyZbeG|Ev@kUN{FA9J!|Nr4+Mk-cj%nj3c6AjrjgU9%qYpczz1&r<0qG0slF4lwX24 z2Jqc+_JwN^+9(Ruc6 zPW6W1Mn5Vx5DyR~vVd4#MTP<*gV7<+@(w~yA7*!wFr#R6o&3I&KpaH`Z`E$PiTD6S zuG~>BQu%bmlzCN~UrZk7Vnt~~j4Bv(#wh4n1ZVEl<2aASQ(1wvhQg-{02`@iaQ81_ zmyZyT{@-vlF<)69hAXv(m?cgFvjd<#J8Z@nxO3<&s}O+9zl$tCp7hmEuYPFE?HF_0 z#$5LlJAZX6vt!I`tH01;rWO{;V@JYQT)?=UlofQ0AE`KOHwBsO7${#NHHjo>ajN&RYT z5bLy(0jx){X`d)Noa+Fw>CR*f)wk}qT_h>%B8k|(Vwg(G z8YsT3RAjCmzwt(1*y5D&wR*{*?={zy#g^@Mn9vzrzd!WVTSX7t3~V;L>~AMde| zfiFo%6H+=EhQ3T9^p&9&fMx1 zE``J?aw!)s?_Mc)$0qdGy9`2k6{>_@g-QlHaju)EQh}YF?RQoEUqXa5qV){WC<4d+ zr^>_%IEWvI8I^q#J}OC`UZ$0xO^+$KMm0eyMH9Ml(H*MSIdVCaqJel0mu=hxa1V=_ z7jxqk6Z{Il7Mv!r&6X=wvZqG5!-IRAdusGP4Kb7&Hs&R*iDRgcG5xEX8bk5Zuh&-u z{Hf`z2-jOOX>Ihzlrr#1;d>_Thx2w2i2226sE~Z{i)y4}?s>haPi&~iv_XZ+^!qGt zdM}ZcDpn@5QffFdE1l{CAf{piAINJEpyE-NutV7w`iY~{Qt=8cr9k4)e3T$8Nc;jn zN%_%05YH0hNKEQPGYHB_@%o^qUY|&WbfU@12D!@R=G(2 zt?0i5!aWe{ROYO5jxZ!Df1$QO7uaxo3YZ@oZ-f`ZZ;01WrA$EHg6yU>P1|Kt+tJ@H zyRbd@_fcu$;k!>x{_)IC$=odLs@mC|((GoTn=NX%zm1A5caK^R`l^d#8Z!7%@#w32 z)OyfYojG+2#rE{oJ!(Ga>x$DF4r^3AD(+G1L0@%qoO+Im ON7H-MdT@wJS^2+b1VeTJ diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__pycache__/serializer.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__pycache__/serializer.cpython-311.pyc deleted file mode 100644 index 2058905b458fbda5dff6eba4a9de94d6c385291e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13656 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 diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__pycache__/timed.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/__pycache__/timed.cpython-311.pyc deleted file mode 100644 index 4688d512ac111730c4c37021393c511381a99484..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10089 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 yQ1r=8uv~tOqfh!ICP)HgshwbT&&0jtV _t.Any: - return _json.loads(payload) - - @staticmethod - def dumps(obj: _t.Any, **kwargs: _t.Any) -> str: - kwargs.setdefault("ensure_ascii", False) - kwargs.setdefault("separators", (",", ":")) - return _json.dumps(obj, **kwargs) diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/encoding.py b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/encoding.py deleted file mode 100644 index edb04d1..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/encoding.py +++ /dev/null @@ -1,54 +0,0 @@ -import base64 -import string -import struct -import typing as _t - -from .exc import BadData - -_t_str_bytes = _t.Union[str, bytes] - - -def want_bytes( - s: _t_str_bytes, encoding: str = "utf-8", errors: str = "strict" -) -> bytes: - if isinstance(s, str): - s = s.encode(encoding, errors) - - return s - - -def base64_encode(string: _t_str_bytes) -> bytes: - """Base64 encode a string of bytes or text. The resulting bytes are - safe to use in URLs. - """ - string = want_bytes(string) - return base64.urlsafe_b64encode(string).rstrip(b"=") - - -def base64_decode(string: _t_str_bytes) -> bytes: - """Base64 decode a URL-safe string of bytes or text. The result is - bytes. - """ - string = want_bytes(string, encoding="ascii", errors="ignore") - string += b"=" * (-len(string) % 4) - - try: - return base64.urlsafe_b64decode(string) - except (TypeError, ValueError) as e: - raise BadData("Invalid base64-encoded data") from e - - -# The alphabet used by base64.urlsafe_* -_base64_alphabet = f"{string.ascii_letters}{string.digits}-_=".encode("ascii") - -_int64_struct = struct.Struct(">Q") -_int_to_bytes = _int64_struct.pack -_bytes_to_int = _t.cast("_t.Callable[[bytes], _t.Tuple[int]]", _int64_struct.unpack) - - -def int_to_bytes(num: int) -> bytes: - return _int_to_bytes(num).lstrip(b"\x00") - - -def bytes_to_int(bytestr: bytes) -> int: - return _bytes_to_int(bytestr.rjust(8, b"\x00"))[0] diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/exc.py b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/exc.py deleted file mode 100644 index c38a6af..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/exc.py +++ /dev/null @@ -1,107 +0,0 @@ -import typing as _t -from datetime import datetime - -_t_opt_any = _t.Optional[_t.Any] -_t_opt_exc = _t.Optional[Exception] - - -class BadData(Exception): - """Raised if bad data of any sort was encountered. This is the base - for all exceptions that ItsDangerous defines. - - .. versionadded:: 0.15 - """ - - def __init__(self, message: str): - super().__init__(message) - self.message = message - - def __str__(self) -> str: - return self.message - - -class BadSignature(BadData): - """Raised if a signature does not match.""" - - def __init__(self, message: str, payload: _t_opt_any = None): - super().__init__(message) - - #: The payload that failed the signature test. In some - #: situations you might still want to inspect this, even if - #: you know it was tampered with. - #: - #: .. versionadded:: 0.14 - self.payload: _t_opt_any = payload - - -class BadTimeSignature(BadSignature): - """Raised if a time-based signature is invalid. This is a subclass - of :class:`BadSignature`. - """ - - def __init__( - self, - message: str, - payload: _t_opt_any = None, - date_signed: _t.Optional[datetime] = None, - ): - super().__init__(message, payload) - - #: If the signature expired this exposes the date of when the - #: signature was created. This can be helpful in order to - #: tell the user how long a link has been gone stale. - #: - #: .. versionchanged:: 2.0 - #: The datetime value is timezone-aware rather than naive. - #: - #: .. versionadded:: 0.14 - self.date_signed = date_signed - - -class SignatureExpired(BadTimeSignature): - """Raised if a signature timestamp is older than ``max_age``. This - is a subclass of :exc:`BadTimeSignature`. - """ - - -class BadHeader(BadSignature): - """Raised if a signed header is invalid in some form. This only - happens for serializers that have a header that goes with the - signature. - - .. versionadded:: 0.24 - """ - - def __init__( - self, - message: str, - payload: _t_opt_any = None, - header: _t_opt_any = None, - original_error: _t_opt_exc = None, - ): - super().__init__(message, payload) - - #: If the header is actually available but just malformed it - #: might be stored here. - self.header: _t_opt_any = header - - #: If available, the error that indicates why the payload was - #: not valid. This might be ``None``. - self.original_error: _t_opt_exc = original_error - - -class BadPayload(BadData): - """Raised if a payload is invalid. This could happen if the payload - is loaded despite an invalid signature, or if there is a mismatch - between the serializer and deserializer. The original exception - that occurred during loading is stored on as :attr:`original_error`. - - .. versionadded:: 0.15 - """ - - def __init__(self, message: str, original_error: _t_opt_exc = None): - super().__init__(message) - - #: If available, the error that indicates why the payload was - #: not valid. This might be ``None``. - self.original_error: _t_opt_exc = original_error diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/py.typed b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/serializer.py b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/serializer.py deleted file mode 100644 index 9f4a84a..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/serializer.py +++ /dev/null @@ -1,295 +0,0 @@ -import json -import typing as _t - -from .encoding import want_bytes -from .exc import BadPayload -from .exc import BadSignature -from .signer import _make_keys_list -from .signer import Signer - -_t_str_bytes = _t.Union[str, bytes] -_t_opt_str_bytes = _t.Optional[_t_str_bytes] -_t_kwargs = _t.Dict[str, _t.Any] -_t_opt_kwargs = _t.Optional[_t_kwargs] -_t_signer = _t.Type[Signer] -_t_fallbacks = _t.List[_t.Union[_t_kwargs, _t.Tuple[_t_signer, _t_kwargs], _t_signer]] -_t_load_unsafe = _t.Tuple[bool, _t.Any] -_t_secret_key = _t.Union[_t.Iterable[_t_str_bytes], _t_str_bytes] - - -def is_text_serializer(serializer: _t.Any) -> bool: - """Checks whether a serializer generates text or binary.""" - return isinstance(serializer.dumps({}), str) - - -class Serializer: - """A serializer wraps a :class:`~itsdangerous.signer.Signer` to - enable serializing and securely signing data other than bytes. It - can unsign to verify that the data hasn't been changed. - - The serializer provides :meth:`dumps` and :meth:`loads`, similar to - :mod:`json`, and by default uses :mod:`json` internally to serialize - the data to bytes. - - The secret key should be a random string of ``bytes`` and should not - be saved to code or version control. Different salts should be used - to distinguish signing in different contexts. See :doc:`/concepts` - for information about the security of the secret key and salt. - - :param secret_key: The secret key to sign and verify with. Can be a - list of keys, oldest to newest, to support key rotation. - :param salt: Extra key to combine with ``secret_key`` to distinguish - signatures in different contexts. - :param serializer: An object that provides ``dumps`` and ``loads`` - methods for serializing data to a string. Defaults to - :attr:`default_serializer`, which defaults to :mod:`json`. - :param serializer_kwargs: Keyword arguments to pass when calling - ``serializer.dumps``. - :param signer: A ``Signer`` class to instantiate when signing data. - Defaults to :attr:`default_signer`, which defaults to - :class:`~itsdangerous.signer.Signer`. - :param signer_kwargs: Keyword arguments to pass when instantiating - the ``Signer`` class. - :param fallback_signers: List of signer parameters to try when - unsigning with the default signer fails. Each item can be a dict - of ``signer_kwargs``, a ``Signer`` class, or a tuple of - ``(signer, signer_kwargs)``. Defaults to - :attr:`default_fallback_signers`. - - .. versionchanged:: 2.0 - Added support for key rotation by passing a list to - ``secret_key``. - - .. versionchanged:: 2.0 - Removed the default SHA-512 fallback signer from - ``default_fallback_signers``. - - .. versionchanged:: 1.1 - Added support for ``fallback_signers`` and configured a default - SHA-512 fallback. This fallback is for users who used the yanked - 1.0.0 release which defaulted to SHA-512. - - .. versionchanged:: 0.14 - The ``signer`` and ``signer_kwargs`` parameters were added to - the constructor. - """ - - #: The default serialization module to use to serialize data to a - #: string internally. The default is :mod:`json`, but can be changed - #: to any object that provides ``dumps`` and ``loads`` methods. - default_serializer: _t.Any = json - - #: The default ``Signer`` class to instantiate when signing data. - #: The default is :class:`itsdangerous.signer.Signer`. - default_signer: _t_signer = Signer - - #: The default fallback signers to try when unsigning fails. - default_fallback_signers: _t_fallbacks = [] - - def __init__( - self, - secret_key: _t_secret_key, - salt: _t_opt_str_bytes = b"itsdangerous", - serializer: _t.Any = None, - serializer_kwargs: _t_opt_kwargs = None, - signer: _t.Optional[_t_signer] = None, - signer_kwargs: _t_opt_kwargs = None, - fallback_signers: _t.Optional[_t_fallbacks] = None, - ): - #: The list of secret keys to try for verifying signatures, from - #: oldest to newest. The newest (last) key is used for signing. - #: - #: This allows a key rotation system to keep a list of allowed - #: keys and remove expired ones. - self.secret_keys: _t.List[bytes] = _make_keys_list(secret_key) - - if salt is not None: - salt = want_bytes(salt) - # if salt is None then the signer's default is used - - self.salt = salt - - if serializer is None: - serializer = self.default_serializer - - self.serializer: _t.Any = serializer - self.is_text_serializer: bool = is_text_serializer(serializer) - - if signer is None: - signer = self.default_signer - - self.signer: _t_signer = signer - self.signer_kwargs: _t_kwargs = signer_kwargs or {} - - if fallback_signers is None: - fallback_signers = list(self.default_fallback_signers or ()) - - self.fallback_signers: _t_fallbacks = fallback_signers - self.serializer_kwargs: _t_kwargs = serializer_kwargs or {} - - @property - def secret_key(self) -> bytes: - """The newest (last) entry in the :attr:`secret_keys` list. This - is for compatibility from before key rotation support was added. - """ - return self.secret_keys[-1] - - def load_payload( - self, payload: bytes, serializer: _t.Optional[_t.Any] = None - ) -> _t.Any: - """Loads the encoded object. This function raises - :class:`.BadPayload` if the payload is not valid. The - ``serializer`` parameter can be used to override the serializer - stored on the class. The encoded ``payload`` should always be - bytes. - """ - if serializer is None: - serializer = self.serializer - is_text = self.is_text_serializer - else: - is_text = is_text_serializer(serializer) - - try: - if is_text: - return serializer.loads(payload.decode("utf-8")) - - return serializer.loads(payload) - except Exception as e: - raise BadPayload( - "Could not load the payload because an exception" - " occurred on unserializing the data.", - original_error=e, - ) from e - - def dump_payload(self, obj: _t.Any) -> bytes: - """Dumps the encoded object. The return value is always bytes. - If the internal serializer returns text, the value will be - encoded as UTF-8. - """ - return want_bytes(self.serializer.dumps(obj, **self.serializer_kwargs)) - - def make_signer(self, salt: _t_opt_str_bytes = None) -> Signer: - """Creates a new instance of the signer to be used. The default - implementation uses the :class:`.Signer` base class. - """ - if salt is None: - salt = self.salt - - return self.signer(self.secret_keys, salt=salt, **self.signer_kwargs) - - def iter_unsigners(self, salt: _t_opt_str_bytes = None) -> _t.Iterator[Signer]: - """Iterates over all signers to be tried for unsigning. Starts - with the configured signer, then constructs each signer - specified in ``fallback_signers``. - """ - if salt is None: - salt = self.salt - - yield self.make_signer(salt) - - for fallback in self.fallback_signers: - if isinstance(fallback, dict): - kwargs = fallback - fallback = self.signer - elif isinstance(fallback, tuple): - fallback, kwargs = fallback - else: - kwargs = self.signer_kwargs - - for secret_key in self.secret_keys: - yield fallback(secret_key, salt=salt, **kwargs) - - def dumps(self, obj: _t.Any, salt: _t_opt_str_bytes = None) -> _t_str_bytes: - """Returns a signed string serialized with the internal - serializer. The return value can be either a byte or unicode - string depending on the format of the internal serializer. - """ - payload = want_bytes(self.dump_payload(obj)) - rv = self.make_signer(salt).sign(payload) - - if self.is_text_serializer: - return rv.decode("utf-8") - - return rv - - def dump(self, obj: _t.Any, f: _t.IO, salt: _t_opt_str_bytes = None) -> None: - """Like :meth:`dumps` but dumps into a file. The file handle has - to be compatible with what the internal serializer expects. - """ - f.write(self.dumps(obj, salt)) - - def loads( - self, s: _t_str_bytes, salt: _t_opt_str_bytes = None, **kwargs: _t.Any - ) -> _t.Any: - """Reverse of :meth:`dumps`. Raises :exc:`.BadSignature` if the - signature validation fails. - """ - s = want_bytes(s) - last_exception = None - - for signer in self.iter_unsigners(salt): - try: - return self.load_payload(signer.unsign(s)) - except BadSignature as err: - last_exception = err - - raise _t.cast(BadSignature, last_exception) - - def load(self, f: _t.IO, salt: _t_opt_str_bytes = None) -> _t.Any: - """Like :meth:`loads` but loads from a file.""" - return self.loads(f.read(), salt) - - def loads_unsafe( - self, s: _t_str_bytes, salt: _t_opt_str_bytes = None - ) -> _t_load_unsafe: - """Like :meth:`loads` but without verifying the signature. This - is potentially very dangerous to use depending on how your - serializer works. The return value is ``(signature_valid, - payload)`` instead of just the payload. The first item will be a - boolean that indicates if the signature is valid. This function - never fails. - - Use it for debugging only and if you know that your serializer - module is not exploitable (for example, do not use it with a - pickle serializer). - - .. versionadded:: 0.15 - """ - return self._loads_unsafe_impl(s, salt) - - def _loads_unsafe_impl( - self, - s: _t_str_bytes, - salt: _t_opt_str_bytes, - load_kwargs: _t_opt_kwargs = None, - load_payload_kwargs: _t_opt_kwargs = None, - ) -> _t_load_unsafe: - """Low level helper function to implement :meth:`loads_unsafe` - in serializer subclasses. - """ - if load_kwargs is None: - load_kwargs = {} - - try: - return True, self.loads(s, salt=salt, **load_kwargs) - except BadSignature as e: - if e.payload is None: - return False, None - - if load_payload_kwargs is None: - load_payload_kwargs = {} - - try: - return ( - False, - self.load_payload(e.payload, **load_payload_kwargs), - ) - except BadPayload: - return False, None - - def load_unsafe(self, f: _t.IO, salt: _t_opt_str_bytes = None) -> _t_load_unsafe: - """Like :meth:`loads_unsafe` but loads from a file. - - .. versionadded:: 0.15 - """ - return self.loads_unsafe(f.read(), salt=salt) diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/signer.py b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/signer.py deleted file mode 100644 index aa12005..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/signer.py +++ /dev/null @@ -1,257 +0,0 @@ -import hashlib -import hmac -import typing as _t - -from .encoding import _base64_alphabet -from .encoding import base64_decode -from .encoding import base64_encode -from .encoding import want_bytes -from .exc import BadSignature - -_t_str_bytes = _t.Union[str, bytes] -_t_opt_str_bytes = _t.Optional[_t_str_bytes] -_t_secret_key = _t.Union[_t.Iterable[_t_str_bytes], _t_str_bytes] - - -class SigningAlgorithm: - """Subclasses must implement :meth:`get_signature` to provide - signature generation functionality. - """ - - def get_signature(self, key: bytes, value: bytes) -> bytes: - """Returns the signature for the given key and value.""" - raise NotImplementedError() - - def verify_signature(self, key: bytes, value: bytes, sig: bytes) -> bool: - """Verifies the given signature matches the expected - signature. - """ - return hmac.compare_digest(sig, self.get_signature(key, value)) - - -class NoneAlgorithm(SigningAlgorithm): - """Provides an algorithm that does not perform any signing and - returns an empty signature. - """ - - def get_signature(self, key: bytes, value: bytes) -> bytes: - return b"" - - -class HMACAlgorithm(SigningAlgorithm): - """Provides signature generation using HMACs.""" - - #: The digest method to use with the MAC algorithm. This defaults to - #: SHA1, but can be changed to any other function in the hashlib - #: module. - default_digest_method: _t.Any = staticmethod(hashlib.sha1) - - def __init__(self, digest_method: _t.Any = None): - if digest_method is None: - digest_method = self.default_digest_method - - self.digest_method: _t.Any = digest_method - - def get_signature(self, key: bytes, value: bytes) -> bytes: - mac = hmac.new(key, msg=value, digestmod=self.digest_method) - return mac.digest() - - -def _make_keys_list(secret_key: _t_secret_key) -> _t.List[bytes]: - if isinstance(secret_key, (str, bytes)): - return [want_bytes(secret_key)] - - return [want_bytes(s) for s in secret_key] - - -class Signer: - """A signer securely signs bytes, then unsigns them to verify that - the value hasn't been changed. - - The secret key should be a random string of ``bytes`` and should not - be saved to code or version control. Different salts should be used - to distinguish signing in different contexts. See :doc:`/concepts` - for information about the security of the secret key and salt. - - :param secret_key: The secret key to sign and verify with. Can be a - list of keys, oldest to newest, to support key rotation. - :param salt: Extra key to combine with ``secret_key`` to distinguish - signatures in different contexts. - :param sep: Separator between the signature and value. - :param key_derivation: How to derive the signing key from the secret - key and salt. Possible values are ``concat``, ``django-concat``, - or ``hmac``. Defaults to :attr:`default_key_derivation`, which - defaults to ``django-concat``. - :param digest_method: Hash function to use when generating the HMAC - signature. Defaults to :attr:`default_digest_method`, which - defaults to :func:`hashlib.sha1`. Note that the security of the - hash alone doesn't apply when used intermediately in HMAC. - :param algorithm: A :class:`SigningAlgorithm` instance to use - instead of building a default :class:`HMACAlgorithm` with the - ``digest_method``. - - .. versionchanged:: 2.0 - Added support for key rotation by passing a list to - ``secret_key``. - - .. versionchanged:: 0.18 - ``algorithm`` was added as an argument to the class constructor. - - .. versionchanged:: 0.14 - ``key_derivation`` and ``digest_method`` were added as arguments - to the class constructor. - """ - - #: The default digest method to use for the signer. The default is - #: :func:`hashlib.sha1`, but can be changed to any :mod:`hashlib` or - #: compatible object. Note that the security of the hash alone - #: doesn't apply when used intermediately in HMAC. - #: - #: .. versionadded:: 0.14 - default_digest_method: _t.Any = staticmethod(hashlib.sha1) - - #: The default scheme to use to derive the signing key from the - #: secret key and salt. The default is ``django-concat``. Possible - #: values are ``concat``, ``django-concat``, and ``hmac``. - #: - #: .. versionadded:: 0.14 - default_key_derivation: str = "django-concat" - - def __init__( - self, - secret_key: _t_secret_key, - salt: _t_opt_str_bytes = b"itsdangerous.Signer", - sep: _t_str_bytes = b".", - key_derivation: _t.Optional[str] = None, - digest_method: _t.Optional[_t.Any] = None, - algorithm: _t.Optional[SigningAlgorithm] = None, - ): - #: The list of secret keys to try for verifying signatures, from - #: oldest to newest. The newest (last) key is used for signing. - #: - #: This allows a key rotation system to keep a list of allowed - #: keys and remove expired ones. - self.secret_keys: _t.List[bytes] = _make_keys_list(secret_key) - self.sep: bytes = want_bytes(sep) - - if self.sep in _base64_alphabet: - raise ValueError( - "The given separator cannot be used because it may be" - " contained in the signature itself. ASCII letters," - " digits, and '-_=' must not be used." - ) - - if salt is not None: - salt = want_bytes(salt) - else: - salt = b"itsdangerous.Signer" - - self.salt = salt - - if key_derivation is None: - key_derivation = self.default_key_derivation - - self.key_derivation: str = key_derivation - - if digest_method is None: - digest_method = self.default_digest_method - - self.digest_method: _t.Any = digest_method - - if algorithm is None: - algorithm = HMACAlgorithm(self.digest_method) - - self.algorithm: SigningAlgorithm = algorithm - - @property - def secret_key(self) -> bytes: - """The newest (last) entry in the :attr:`secret_keys` list. This - is for compatibility from before key rotation support was added. - """ - return self.secret_keys[-1] - - def derive_key(self, secret_key: _t_opt_str_bytes = None) -> bytes: - """This method is called to derive the key. The default key - derivation choices can be overridden here. Key derivation is not - intended to be used as a security method to make a complex key - out of a short password. Instead you should use large random - secret keys. - - :param secret_key: A specific secret key to derive from. - Defaults to the last item in :attr:`secret_keys`. - - .. versionchanged:: 2.0 - Added the ``secret_key`` parameter. - """ - if secret_key is None: - secret_key = self.secret_keys[-1] - else: - secret_key = want_bytes(secret_key) - - if self.key_derivation == "concat": - return _t.cast(bytes, self.digest_method(self.salt + secret_key).digest()) - elif self.key_derivation == "django-concat": - return _t.cast( - bytes, self.digest_method(self.salt + b"signer" + secret_key).digest() - ) - elif self.key_derivation == "hmac": - mac = hmac.new(secret_key, digestmod=self.digest_method) - mac.update(self.salt) - return mac.digest() - elif self.key_derivation == "none": - return secret_key - else: - raise TypeError("Unknown key derivation method") - - def get_signature(self, value: _t_str_bytes) -> bytes: - """Returns the signature for the given value.""" - value = want_bytes(value) - key = self.derive_key() - sig = self.algorithm.get_signature(key, value) - return base64_encode(sig) - - def sign(self, value: _t_str_bytes) -> bytes: - """Signs the given string.""" - value = want_bytes(value) - return value + self.sep + self.get_signature(value) - - def verify_signature(self, value: _t_str_bytes, sig: _t_str_bytes) -> bool: - """Verifies the signature for the given value.""" - try: - sig = base64_decode(sig) - except Exception: - return False - - value = want_bytes(value) - - for secret_key in reversed(self.secret_keys): - key = self.derive_key(secret_key) - - if self.algorithm.verify_signature(key, value, sig): - return True - - return False - - def unsign(self, signed_value: _t_str_bytes) -> bytes: - """Unsigns the given string.""" - signed_value = want_bytes(signed_value) - - if self.sep not in signed_value: - raise BadSignature(f"No {self.sep!r} found in value") - - value, sig = signed_value.rsplit(self.sep, 1) - - if self.verify_signature(value, sig): - return value - - raise BadSignature(f"Signature {sig!r} does not match", payload=value) - - def validate(self, signed_value: _t_str_bytes) -> bool: - """Only validates the given signed value. Returns ``True`` if - the signature exists and is valid. - """ - try: - self.unsign(signed_value) - return True - except BadSignature: - return False diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/timed.py b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/timed.py deleted file mode 100644 index cad8da3..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/timed.py +++ /dev/null @@ -1,234 +0,0 @@ -import time -import typing -import typing as _t -from datetime import datetime -from datetime import timezone - -from .encoding import base64_decode -from .encoding import base64_encode -from .encoding import bytes_to_int -from .encoding import int_to_bytes -from .encoding import want_bytes -from .exc import BadSignature -from .exc import BadTimeSignature -from .exc import SignatureExpired -from .serializer import Serializer -from .signer import Signer - -_t_str_bytes = _t.Union[str, bytes] -_t_opt_str_bytes = _t.Optional[_t_str_bytes] -_t_opt_int = _t.Optional[int] - -if _t.TYPE_CHECKING: - import typing_extensions as _te - - -class TimestampSigner(Signer): - """Works like the regular :class:`.Signer` but also records the time - of the signing and can be used to expire signatures. The - :meth:`unsign` method can raise :exc:`.SignatureExpired` if the - unsigning failed because the signature is expired. - """ - - def get_timestamp(self) -> int: - """Returns the current timestamp. The function must return an - integer. - """ - return int(time.time()) - - def timestamp_to_datetime(self, ts: int) -> datetime: - """Convert the timestamp from :meth:`get_timestamp` into an - aware :class`datetime.datetime` in UTC. - - .. versionchanged:: 2.0 - The timestamp is returned as a timezone-aware ``datetime`` - in UTC rather than a naive ``datetime`` assumed to be UTC. - """ - return datetime.fromtimestamp(ts, tz=timezone.utc) - - def sign(self, value: _t_str_bytes) -> bytes: - """Signs the given string and also attaches time information.""" - value = want_bytes(value) - timestamp = base64_encode(int_to_bytes(self.get_timestamp())) - sep = want_bytes(self.sep) - value = value + sep + timestamp - return value + sep + self.get_signature(value) - - # Ignore overlapping signatures check, return_timestamp is the only - # parameter that affects the return type. - - @typing.overload - def unsign( # type: ignore - self, - signed_value: _t_str_bytes, - max_age: _t_opt_int = None, - return_timestamp: "_te.Literal[False]" = False, - ) -> bytes: - ... - - @typing.overload - def unsign( - self, - signed_value: _t_str_bytes, - max_age: _t_opt_int = None, - return_timestamp: "_te.Literal[True]" = True, - ) -> _t.Tuple[bytes, datetime]: - ... - - def unsign( - self, - signed_value: _t_str_bytes, - max_age: _t_opt_int = None, - return_timestamp: bool = False, - ) -> _t.Union[_t.Tuple[bytes, datetime], bytes]: - """Works like the regular :meth:`.Signer.unsign` but can also - validate the time. See the base docstring of the class for - the general behavior. If ``return_timestamp`` is ``True`` the - timestamp of the signature will be returned as an aware - :class:`datetime.datetime` object in UTC. - - .. versionchanged:: 2.0 - The timestamp is returned as a timezone-aware ``datetime`` - in UTC rather than a naive ``datetime`` assumed to be UTC. - """ - try: - result = super().unsign(signed_value) - sig_error = None - except BadSignature as e: - sig_error = e - result = e.payload or b"" - - sep = want_bytes(self.sep) - - # If there is no timestamp in the result there is something - # seriously wrong. In case there was a signature error, we raise - # that one directly, otherwise we have a weird situation in - # which we shouldn't have come except someone uses a time-based - # serializer on non-timestamp data, so catch that. - if sep not in result: - if sig_error: - raise sig_error - - raise BadTimeSignature("timestamp missing", payload=result) - - value, ts_bytes = result.rsplit(sep, 1) - ts_int: _t_opt_int = None - ts_dt: _t.Optional[datetime] = None - - try: - ts_int = bytes_to_int(base64_decode(ts_bytes)) - except Exception: - pass - - # Signature is *not* okay. Raise a proper error now that we have - # split the value and the timestamp. - if sig_error is not None: - if ts_int is not None: - try: - ts_dt = self.timestamp_to_datetime(ts_int) - except (ValueError, OSError, OverflowError) as exc: - # Windows raises OSError - # 32-bit raises OverflowError - raise BadTimeSignature( - "Malformed timestamp", payload=value - ) from exc - - raise BadTimeSignature(str(sig_error), payload=value, date_signed=ts_dt) - - # Signature was okay but the timestamp is actually not there or - # malformed. Should not happen, but we handle it anyway. - if ts_int is None: - raise BadTimeSignature("Malformed timestamp", payload=value) - - # Check timestamp is not older than max_age - if max_age is not None: - age = self.get_timestamp() - ts_int - - if age > max_age: - raise SignatureExpired( - f"Signature age {age} > {max_age} seconds", - payload=value, - date_signed=self.timestamp_to_datetime(ts_int), - ) - - if age < 0: - raise SignatureExpired( - f"Signature age {age} < 0 seconds", - payload=value, - date_signed=self.timestamp_to_datetime(ts_int), - ) - - if return_timestamp: - return value, self.timestamp_to_datetime(ts_int) - - return value - - def validate(self, signed_value: _t_str_bytes, max_age: _t_opt_int = None) -> bool: - """Only validates the given signed value. Returns ``True`` if - the signature exists and is valid.""" - try: - self.unsign(signed_value, max_age=max_age) - return True - except BadSignature: - return False - - -class TimedSerializer(Serializer): - """Uses :class:`TimestampSigner` instead of the default - :class:`.Signer`. - """ - - default_signer: _t.Type[TimestampSigner] = TimestampSigner - - def iter_unsigners( - self, salt: _t_opt_str_bytes = None - ) -> _t.Iterator[TimestampSigner]: - return _t.cast("_t.Iterator[TimestampSigner]", super().iter_unsigners(salt)) - - # TODO: Signature is incompatible because parameters were added - # before salt. - - def loads( # type: ignore - self, - s: _t_str_bytes, - max_age: _t_opt_int = None, - return_timestamp: bool = False, - salt: _t_opt_str_bytes = None, - ) -> _t.Any: - """Reverse of :meth:`dumps`, raises :exc:`.BadSignature` if the - signature validation fails. If a ``max_age`` is provided it will - ensure the signature is not older than that time in seconds. In - case the signature is outdated, :exc:`.SignatureExpired` is - raised. All arguments are forwarded to the signer's - :meth:`~TimestampSigner.unsign` method. - """ - s = want_bytes(s) - last_exception = None - - for signer in self.iter_unsigners(salt): - try: - base64d, timestamp = signer.unsign( - s, max_age=max_age, return_timestamp=True - ) - payload = self.load_payload(base64d) - - if return_timestamp: - return payload, timestamp - - return payload - except SignatureExpired: - # The signature was unsigned successfully but was - # expired. Do not try the next signer. - raise - except BadSignature as err: - last_exception = err - - raise _t.cast(BadSignature, last_exception) - - def loads_unsafe( # type: ignore - self, - s: _t_str_bytes, - max_age: _t_opt_int = None, - salt: _t_opt_str_bytes = None, - ) -> _t.Tuple[bool, _t.Any]: - return self._loads_unsafe_impl(s, salt, load_kwargs={"max_age": max_age}) diff --git a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/url_safe.py b/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/url_safe.py deleted file mode 100644 index d5a9b0c..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/itsdangerous/url_safe.py +++ /dev/null @@ -1,80 +0,0 @@ -import typing as _t -import zlib - -from ._json import _CompactJSON -from .encoding import base64_decode -from .encoding import base64_encode -from .exc import BadPayload -from .serializer import Serializer -from .timed import TimedSerializer - - -class URLSafeSerializerMixin(Serializer): - """Mixed in with a regular serializer it will attempt to zlib - compress the string to make it shorter if necessary. It will also - base64 encode the string so that it can safely be placed in a URL. - """ - - default_serializer = _CompactJSON - - def load_payload( - self, - payload: bytes, - *args: _t.Any, - serializer: _t.Optional[_t.Any] = None, - **kwargs: _t.Any, - ) -> _t.Any: - decompress = False - - if payload.startswith(b"."): - payload = payload[1:] - decompress = True - - try: - json = base64_decode(payload) - except Exception as e: - raise BadPayload( - "Could not base64 decode the payload because of an exception", - original_error=e, - ) from e - - if decompress: - try: - json = zlib.decompress(json) - except Exception as e: - raise BadPayload( - "Could not zlib decompress the payload before decoding the payload", - original_error=e, - ) from e - - return super().load_payload(json, *args, **kwargs) - - def dump_payload(self, obj: _t.Any) -> bytes: - json = super().dump_payload(obj) - is_compressed = False - compressed = zlib.compress(json) - - if len(compressed) < (len(json) - 1): - json = compressed - is_compressed = True - - base64d = base64_encode(json) - - if is_compressed: - base64d = b"." + base64d - - return base64d - - -class URLSafeSerializer(URLSafeSerializerMixin, Serializer): - """Works like :class:`.Serializer` but dumps and loads into a URL - safe string consisting of the upper and lowercase character of the - alphabet as well as ``'_'``, ``'-'`` and ``'.'``. - """ - - -class URLSafeTimedSerializer(URLSafeSerializerMixin, TimedSerializer): - """Works like :class:`.TimedSerializer` but dumps and loads into a - URL safe string consisting of the upper and lowercase character of - the alphabet as well as ``'_'``, ``'-'`` and ``'.'``. - """ diff --git a/venv_flaskchat/lib/python3.11/site-packages/jinja2/__init__.py b/venv_flaskchat/lib/python3.11/site-packages/jinja2/__init__.py deleted file mode 100644 index e323926..0000000 --- a/venv_flaskchat/lib/python3.11/site-packages/jinja2/__init__.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Jinja is a template engine written in pure Python. It provides a -non-XML syntax that supports inline expressions and an optional -sandboxed environment. -""" -from .bccache import BytecodeCache as BytecodeCache -from .bccache import FileSystemBytecodeCache as FileSystemBytecodeCache -from .bccache import MemcachedBytecodeCache as MemcachedBytecodeCache -from .environment import Environment as Environment -from .environment import Template as Template -from .exceptions import TemplateAssertionError as TemplateAssertionError -from .exceptions import TemplateError as TemplateError -from .exceptions import TemplateNotFound as TemplateNotFound -from .exceptions import TemplateRuntimeError as TemplateRuntimeError -from .exceptions import TemplatesNotFound as TemplatesNotFound -from .exceptions import TemplateSyntaxError as TemplateSyntaxError -from .exceptions import UndefinedError as UndefinedError -from .loaders import BaseLoader as BaseLoader -from .loaders import ChoiceLoader as ChoiceLoader -from .loaders import DictLoader as DictLoader -from .loaders import FileSystemLoader as FileSystemLoader -from .loaders import FunctionLoader as FunctionLoader -from .loaders import ModuleLoader as ModuleLoader -from .loaders import PackageLoader as PackageLoader -from .loaders import PrefixLoader as PrefixLoader -from .runtime import ChainableUndefined as ChainableUndefined -from .runtime import DebugUndefined as DebugUndefined -from .runtime import make_logging_undefined as make_logging_undefined -from .runtime import StrictUndefined as StrictUndefined -from .runtime import Undefined as Undefined -from .utils import clear_caches as clear_caches -from .utils import is_undefined as is_undefined -from .utils import pass_context as pass_context -from .utils import pass_environment as pass_environment -from .utils import pass_eval_context as pass_eval_context -from .utils import select_autoescape as select_autoescape - -__version__ = "3.1.2" diff --git a/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/__init__.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 41d59e9156f7bb6bcef2a688a921606a4f0c3cf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2142 zcma)+%Wm676oyBZZQXCSCHZdJPFfg&B{=C7NCVWjq(vMUbpiylA;#oHW=sx=nUN}I zRdmxgX!{05AEp48gjNN*>druRS@p~~v^9wrm5+aX^Us+p5BW!>Qbh3k%lp;+C5O;I zs*(OC-ox9UGYI{LT!fLEaVPvtFo7pBinG93oYg!DJc%bYPx({9G@jNx4V=R{%{f0G z6mUUv9=M2$nhU@sT+&@~4GVG&ExAo7W%7G*t;QR_$UNlBUIF)QkGY8_w5vygSH@1zy+aNxNVMip7e zwqG7SwZsLJWN67VA}!I6qL51gLwz+99Y&lA;e`xFFcx!TkL=OI^1r#-1rPmO1xJPiBHg`~OE`=QUI7tl1fk@{jRc{Vjq^kt>F z)fddAui&EG)G6)~L7#@irD`MPy|d7BZra6t&ym-?^_vU1_Ns?{=BTq=JLRL$?fW-# zRE~*rPI@;+`Iy5VhSvjT_RfgM$f-}ScL!Uk?$gtLZ`^4GEXWCxP7B ziR7@+@#MmIqwM&Ua9ckyp^oVZV|+OxLfB5oBppiVuj}?$m4Mf{@&?2oOKb@0Q%BmQ zFGDIE645tP4>~)Y`_HyM9p!A>4ISGarV>01j@yQcXuSeebjz=~o`^Zl^0eNw=e`q7mKK>a%gbYug_4 zq-}Sii+A~lfiAH}d>a;3udjFlAN0G$Yv%lk&-;hd={ezzFpf6%G67(=OBSHJI83}q6n~|X1*o*{y6`OI}es*GH#BDiW$H<5T zeIA>Un3KSqx7~)Zkk0ugMn>E=^T+r6WsHnS(7o7<1a)IG{-0w^3#%mN!Qmc0cK)t5 Me=4azeh(_@KkCzrrvLx| diff --git a/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/_identifier.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/_identifier.cpython-311.pyc deleted file mode 100644 index f4e7fbf3477763c8ea4988420007ab9163290e52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2158 zcmX|@J!~V#6~`$F$;B~Trc0I13FZVRMVcT@fOJU{q;V1$%!#&j*69wCe1WShzj>0@ z;!1apVIK#kAIFu|M17Z{B8J|!ajHZp8X=pzQ{h;*z?Kr*;V{1ah1ACUu9q9 z*^8r>JM87@%g%LyU7uW^vg_J)^SX6yv1{im?W+#^$M)9^_I2l#&0cx0CZrb_=_S&S z5e(An2u;#W1c%N_jLwe9IACO)kzp{ZC8>6a5KwK(sJ=&a4WUT&D%A~Y#2Gb`)Cj17 zYBNR6EH!h~+`&YpW|5jzY8up>QVY&jl3D?^;4~9tX35Nv38$%&sgcc(-2!#1)HSGw&3Z}d1=NGp zOOXewmm?2WPbKdec?I&S&rE~9CRrWu-MX{usUq$!^9G@x0AD>mcGl*bE<$4fk3LC|@;icsV6 zCW6D`T?C&e5{xHQp4j7wBd9W0%Z#h1{A8c;lc)Tohv4(_J})2ea*vliUhx?}J>aKh zuJ16etGt@#)eNtiyrwf=vw5w9Fy^fy+EK4aXha1%8%;O2~5C|eWWRv2%mcpIxZ zDejBJ2l2TL+<4n_x8E>6rsgEhkNMF^SL)fxZp!vIz$*F z%;w5$9#`h^r}Jc<&66kdt~hw98zhx63=+;iF7>(2YL`A}!`;p|4S*p1@eBuY1l zBT;fi$!DT85l0nqbSjQJ;2Ow=4v z&oWUz5DkTiMp869CYp+9)|;C#3pTnh*nU`OOVLJVf@TVnX;_%ies)jk}LN`R04Sc<^xLKm6Cy;+u>Aj$lyk$oB^R2Sok@>^=*P diff --git a/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/async_utils.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/async_utils.cpython-311.pyc deleted file mode 100644 index 6447c06ce294037a5ae6121961ade8c9feb90307..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4659 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 QF8}NyOZj%4bhb49H%!=kEC2ui diff --git a/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/compiler.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/compiler.cpython-311.pyc deleted file mode 100644 index c283505a13df052db6e6fc9db5e672bfbda6965d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110501 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 diff --git a/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/debug.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/debug.cpython-311.pyc deleted file mode 100644 index e07f4330a31c9817faf19ef921f6be609b67558e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6737 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 PVEy8KTK2+(PWk@<&6SKi diff --git a/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/defaults.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/defaults.cpython-311.pyc deleted file mode 100644 index 8e390003e6e4c34dc7d11234cff3fb227e7a553a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1743 zcmaJ>OK;mo5MJv2u-=m2Nt`&YDkPSWv?y92X`v`|sz#O_OYVbBL9p7jLz|@3C6!bR zf~G)!Kn_NmgAcwH{V@d?pa)`40eZ?!MQ%BDmKGBWC`yf%-^_kHGdnxW-&3gsg6B{5 zSNuAJ(BE9~pZEm4z9k^^8`?z}VL?NZfCD(F1@xd45)j~!7S0E)L2otOiqN9@4kH9N5O z1m2JBz!UynwF9e9SgF-)i*l!1?~0pZyDM++h#SqXS-~?mwl>cgH{J*d`@BV}E!Bd! z+PCHVM)~SW`9AgEe4PQ9CiDnrf3OC7PX@ zU`wI<#IlPMmHcQ?MK*g62vo$*SafLgpmbG@kVneME*zMBql$<6z?Ao3%2NA=ojYSZ zd<6bXI}3iQ>a~xJszp^@Czxe#iyQUb7F2Gl)oe7yPGyZntkFO<_L*R@=$@)UwM+_E z2eFJ#o*XO-Tg0?X>TNUSPkKkq!b3~dOd5f8G|Gn_F)^|+GKN&2xHQ;qrG!}$YVi{Rh45M!;+-S-&O>$Ba65Eu$v^p%+;(2aQRLZYD zE8P{vZMnNsZ$e+)kth8{(=bOfoRIVD)~;`go$Y!5A+%g=nbyz zns631ofrzmx&nQv7`4s*LzS4d4NWl*8xIt#_K+A4k&*9If&LEreGdhJ@x zgzjI5J9Vh+!>R+-I8d(FFxgXvnq^i8qc^b|dLIup@+tigg7T|u{tV+dCn26nU??JEIVjQUIs(Id^SdcuVBkOMx+h!9lt4 zELytY=9eM7yS(Dg&AXs3uANxU!c}lF&c)vcE)3xQ*~O#xo)?}g$K?6qU-`>m7WkYH N_~$M1RC*nb;$Q6({hj~- diff --git a/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/environment.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/environment.cpython-311.pyc deleted file mode 100644 index 150e2ee675c95431b07f1718a7dad25669ed2d39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80559 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

332E$V%#H~8U(RuG@tt^TRJbWtZ=y(Z6{n}- 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 TiLMM++P`5fzu2ao&CCA-`j8FN diff --git a/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/lexer.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/lexer.cpython-311.pyc deleted file mode 100644 index a805439096d492097d9ea32ac6d151222964980c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35638 zcmcJ&3v?UTnI>3x5&!`LAVCs*gKvTqNl|Z6lw?YxWW6X^q+hgT3St!{N)#a%Ks{j4 zVchNwon~)nM;^nDH9_2V%p}gVdMABGb0)K`?oIDzPIvDBobn0>(>%j{`0Qr4&sk~} zpHA!a+1c;ERRF4rQsSN2Ef)W}_rLGgfB*a6|6Y9Nayd9We>3$@`1&Zv{m*2{J;jRQ z(PJCOz0W<*@!S~48+hZiVa&k3#xWDVrfKt4%b3MLZsuw0)uOQ?X0}Y*uG+`!FkAVe zX~)&#F()(Ird?M{#!8skKJC8h8S@x8!F1W1OIUQU*h|OC5YjR2yIMY0Zs3fZ;NgpZ zXyCY?;9q{mDiE$RXM@?FGxN?#V^z+=301sn05-&7xLln>^Ci02YIN>yoqMg$-GkWb za1Eb}(#}4jW|HY8|$dVQX~QE{3huVK*^soeta0u=P4@55qR- zu)Pc$&|x<-Y@-g_$FNO0>=uS?)?v3YY>N)NjbU4L*zFA4ro--F*mfOuC&PB=u)7#G zsKf4N*iId`pJBUn*gXupNrxR^*lrzmFT?ieu=^OcSBKrtu$y(*XBf6mhaF_tEjsK0 zhTW>e9%R^UI_x2a-LAt9G3*W<_AtZl)M1Y>>@FSlS%%%M!yaYWejWB0!|u^xk2CCm z4ts)O_v)}G8FrrzJIt{Ab=Xr3`-~2InqdcZ*ykAbfDU_xVGruCBU2oINNE19fgcj~ z03H_F0gnisfX@nB0gnn>0FMbf0FMg;fG30=z>~r*z+s^m@RYC{@U+kk_?)m4@Qe@y z91*qwjtX7hH3*x8%|f5hB6J9?!gire=;xpR$o{EeY?OcDElwCsKA)qD>hBL>`AHse zh|}7~UO<^%6h^gWVz?KyxGRi4M;ymE{zYvZZyMlVJvR*VFC|~fC#f>)`72u5tzk&tJ&9Prx4Hd1k)={{rk2{3L%7{!N$p zTtU@ysqiXdR?Vh`c@^O=A-rJZj&S_cTO5B`TN`7O%;gGP&LhT)x!8YbLVMz0e#R~_ zU(@h)RTqAWxy-;NtaG`{U+1qOZ8Ry;ehofEVOkgORpu6fTlBZ2KEr&?!k1H*MwmB_ zaKRg~$49STn-;DLGto#O6gW0Db2${~4V=Cey%e4aOoXpqn3@Sir(m8IZVF;gVDyp@ zIDh^GS3KV z7zu=Dqk*ZJ>!Il>J`lbph@og0*y*V&f+LE!FHA)vm!>A8Dz_T~qMd1v213)*;Ts4X zhziJbC@Mr)%n{*Q2+;@;M-GpS^Fkmr!w0VA3IaO<3OA842dsunrJv^$U3K| zkhReCxPWZIZsCR3W(63mQ!{Xw`4ur`uohhlMad3h*{G6*ky|s-(9I!H42wY9PMmrE zU})kJ1uh<%xjrR^XQ*y}wFNO`Ev(wI&T&?k;}hgDW;z?`ia9&Zif3oyXT|v0nP6;Z zM|;OBueP5(d#IAelB_=osJs%I5CA zbHT1aGwOCGB;I1K@q(YQ>}RL!Cp-}iP3yhfBrj+AQ1_(l>5_0$=jD~Y?%n6$>ntDa zL`u9cF?DrgJn*nt?H-5;VwlAgWH9!R?9;J-pz&-^FhCK7g$Ol$BpMQV!Ky(v6{)(zyn7OGX92Kg1yrKUs-k|(7gmp*F(@yc2; zqNXm+WGxfn=`j0Ty&B4z_^Imv;b_(?07pG>jcG)7#@Y#~8wczPd+wuJvMYd zHuT1fy}emO=VL=_%-D&~8;=dIJT{zrZ0LAw2xbkhXAN^Pb(hJ8VM%(xGR zftYasAG|$}4gHS|@yCWuj}3b!@{2)G4>SI0T6siky!W{&F3z2^VeaJS40Fb~F>d&- zanU}){fHAs;UQ?s8hbWp4Og;;>k$fuj{i8+`+Ni>xEJ*i68Wnjnlqu9-jm_$Q$nQo zFi828gO@_l-s{55_3=rvPLOqa>O!wfMz{9#_4P*3?%injE1`=Bb(toNExq#OaP8J( z#{fSy5k=Kq+b6z^Wd9KVk$Ql6F6G-LzaQ|4P|~~fT*8n?J%SG|=FN4LNPri^*RBb? zcpCT()zA#&qkRC!IRmN!72%&VL{*h_Id6^|wEV;i-1`Otw^+ql{we|jud5&d*;$Ga?zPVn|T(&vj08sqJyDz&4F=QO1bMo_Rx*`mOTt#;7%C<~ZIIh43Z! zz{bQivYj_aojDiyv_z>m%EMcuo}3wOMbT1~%@*~kZ1!k{%I1jXMJNbYJmpNf3a$lH z9HrGVOJJ0o!!Zw|4T10^u|-5uVkICAD!aG?k;MFYZ+Y4iV6-k)p?KHh3n8w7VzRkT zrdjzAdVFO*4WdglIVu6ll_Yd%ADkJ(6d=+C{w^xqjK!1+Aczz^; z(>Zl~Xn6eKsgoy%hDXN_3>`T-ob_svL&Jx%E)6Q@PIQgU6M4+;Sip zMX~r~#0!IGjt(9;F{F4a)nUnJm5ieVMn(rmhg7+%e3BD|amWsb21f_8cG*01>TuR{ zQHTZ&BC+tQQI++L^Pmgj)CFO@Fj~Z$@byRJGY&A%Ws1CCl((gd=v{ROlGT!XQ_8mK zD=TNOP1W_T+Nx4DU8}b8rCTs2b~F3-Ra<4Ms&Ca+o2uWnYO7AwZdoqP*6C2N%k7*!hEu-|&4Bb4l1Y zJ|wc$QiS}xYj{FcVm2P(W{h#n%u!1rHvLqD$}`0_pTNQ=a9&&1^MMOkBu$1zx%M=x z7V#8f6p4&tinm0rVd)~y5sLa{&?L^2nYyO<20(7=XA@brOqbgwkJ0ra1AN}0;gzgwQ7@h?Y zrM@>ad-Z}KQcs)_ZZMJvhK3k?T8Gjy5`JVZwI_guEtauU5ytUjH9I+r#Q<6Wgi@Gc z3r2Vk<(9GN>j)@>uF6Xh)cXYTm~|-WjDx2rnw*;9v0_EnW-U>euCpZ*l*Mtyb42_W z!u~b>BLRSU?kgMTbpK)OfxB_V-I#1myE`OzN4hvD6$ex1pxmd6!K39Cmm*D^nmVR= zmDTYiY7un|YwjtqM!Md~U8WH1(blSZmNs&6jFqSPoHS|rJ9jzX`*ks@=5{58{%w&zOw&1d4qq>A^*;W-4jeC^!iL+Elt%LC=%O-gQ_;`hn9;mvPx(frmA$Hk4j<#Vf+{^>=5pk+m| z!GmD?r=|tW1k=-OaEY^In-s%WnN`(iG5jDc3PJ7@fv9IPz^(aY48HQ}*%6YFoa@x|bm}){_gz2BaDXAcMMQ|*y<(LNFS7DT+Z46)~=!H$iAL}mw%w(0RSulig(KI zQfOgtA+&H|;lkoj9?6F6C|K_zg}n;8#d8QJzDj^m4xhqPj)RvIqkyz_7O%iPTPm-V zH4b5ND9^8xHEyplHzIcwnamiDL+mvsF+zUW0(m@_u;N3-J84-yYa}d2 z1sUX}`J3myv^f^-^MhcHT%M(3$+J1_?30{* ztImdu(}jw=B9-){oxPH?cfH7LcYNhk{3*y)XIy;jtb$)2Qg|n4OMIEW4Z5f;EJI-%Azx0$X9hZFD)1DoYXUD21nDNvm zUQ4`|tdSZIq#F)O4F}VngNVab^3Y_pJATaptTRx;;sW=#MH|=Fv}c>-*|zFw&v-hQ zpTpnlQtxoO`;^puD(yM-#JD`1a~C?zogK;6yS`M-j&#iqsb&W->EfLddYE}9>q*pM z@=uP;JsJh-eNN!8f6a{7H;O{f2d1!00vQl^ zd4`1Gfe&1`#mImnJtlE+R^&jLRNc?8_@?qxc~(*{cGtQk=ZX20fzx2wpNOn;_$*Jb&)uu+^Hji!&$6c(n`Y#Yo<~%K!q|Ks z8X~`KkBUFqbnB2B; zG7-bchKy#eq|rnFj{*Q%&Rfq{=f;bHExRCbqRyjUouLuYaOf{Cw(!J|U{+|ma1r9g z=DAgOU4l=$n;YcjzkeiLnWz=Se z;SE%*gmZcpcPGp%#kHy8+DuvH(zdnYlBJe~Jqvqad%yqP{=`JGFJ0Cum9;Lnd>*_z z`m?cA@R^meXHw2**4(~@S()V7*p3=x`kEd{%}o>0Bcg8K()Gaw4%3z4EnD26=PtDz zE^%?O4!O~k#=?$9bPC&;PgpN+NPjD(e*oY;LtcDbHD`F+m;`R)qhGZv0_5t#oMI6F zD+EIWknC7qf3wj-{W=hsmq}L$mRMt<(#JzHx4=r~c*>lBxrN%I8-9PI2$xHDrAl`t zqf6V~-~I0H#OOQwZ|?^}_sY~4l3hd!4wtq2KSw02-OtN1;;fC@nv#u`XtU8oX|_?C zV9?y9>bRG0!j>-GB>}p3N$y=K+b)*aaL^%sf*|6j1b#?>bQrSkailO42HQzntf2AB zn0cJ;`Q!7)zj-|4aLpf`Kl;t1nc|Z9 zWAn$pd2HQmu(Tw~h&H$Afz@RxCntQ8KK9XrdZT4`vYFhEx6_Gs_Q&zG$XUrYN}|{WBod(-Sdms3^=&PfMJ+_EO?RkdU~$>`BQ|k}TPe zm1GN(N`V8T^=4s$QSWiga$-O|5hcxtX2V0{r=S94;M6-IZyKViT?%zvTB-;s0;Wls z?<*3iA+QrVD`NjQD$fkp31yj>4o8HnYa|-JCN~AfDK=~&<;qPMx8P6RhK#3!`_t=^ zLXVGcp}Kq)fl-$p-)*e!nini<#h%6fJ5{OTCcGKUEyo`?>sFj~X=j7vY)Cm9R!a$f zX>%@&F20hsRY{PS+o~YXU2w`&&CJRo{%b@m_fqsVS`3K)3Lt3HQ=!kuiMUAdJ^@Bm z{yQ?!@`%MK(_;$FqG+dVhhUq}|EX9>o54~?L`4m(1`BA37FcZ{G_C6#K2HU5>Xh&V z{__uYKYAV!?bi_zqhKz`&;+Y$;RXg$wWPDDT+B~%!J>{>N)RT&0a8TlWHHQ8CT3*G zC6p*OFqYaLIp*da0$5SL7;LB$;XLq3XtcZ#O271g?mTFF&^&yYiR!W>fG|_5 zW-W}Si5+G=n*`t3$h1S1W51&wc7z7Sokmq{=PiZOS{mKOc z3ssD@Q{Xg)P9V47y#Q4nB4bn-nUeNEEk>^WcaW6$-vVeD0y7Q0m`7a}!kneT)Wb72 z5pB*z=L1{KimfIwl(scVwx(3>-B{E4k`Zt9+j}@TEtTYp_HmxFPiWM3K;n)-fT&H` zLp!u+%gPhs@ReLk56i&O2v}l5geNNOc!WmF`h?1k)cjM``(hDV0rTq$p*9 zx){{^7!_5diGPdOvW9V89Yn57UDMV9VJ=Y}&_W4y;H_AC?H&JZKiDXHB?AkCt4`07 z@9krY#}@FnZpt~x<)245P2ux>W}|Y$*BcF@TRj!(s{_Izd91v4S`e`fEbm{jDq+GJ zCXSKSrr5xdT_E!Yr*JhCEiAWaQaOd8CEkFvoOxA3F|iKuEa!*8IVjUU`5s1JV^oi% z3UW966PPq3u!ynTQM zms}4h|EM@CoM$4l!`NU$RX`wf%cjDiUCl1Nv ze%Y6Dcc*OK8%a-o44DyFOH{R_Mr=?Mo+lHX4g6HTo@UOd7j93R|HS=vE=se3@*qr} z&(e}Jkg}X7Zl(|daAGBGDJN;(+VE)eXy9JvX3RIZo2Hk!8(73Lq8L9C4(OO! zeRl^HBriRVyzmqIJFItKn1z~uH*_odCue6Sa$GV=RKXK7T{-a3*xH0=^nD&0(G$_> zTQbv2y+3G|J3meS(6tJ$a!5oNJLup>DdA{M8;#( zQ@#afj1UJ`Qo49{!3e#U#R1yVtIO0hd^GT&rgx>LH(k>w)$}bKT0F6EBIEKdo|Rnn zpH8J*y?ED+CRg2RLv!-bC&$tay;4K(lKHlC$@!brvH*sdiV8m#61ytaODuj$VR41gNG%K|SnA|L%106J=~ni8KZ zhTshwcyUyL{6zCyIdSkC`WdCm9-dYK`TnTL&brAI$HE7fiO)8M@`>B?uM%4Zlu zU0#)FdgrCvFTvt~{t`YaX_A_@(b!V#k+uTP|WbtS}k!o(XMmD0Aafl&zj=K|e7e zT*JvE#++hfF;8zo;>B6g!DTCGc|k6#qW8$E=&bwnkjPs#wZ>X!K>#QNSbFCecV+W> z6KUDWF5)n13)-We$6m5p)|QN>%Qi`6n-&gX z&RdL2?!c!QS^8@ZV4bsgOTQ}N z%Gxr}Wp9yn*Z;KSUi9bj^yU-N<`Xi81ba>h_ULOT;6fB-C5WP|1W~w35QWFLbm;Ba zVhmzDHs4}0r#`HR?S>(}`GhLtQvyFE@EL(00c34VBnjb-yoR@(QcmT_y9i9G$K-bR zDFj<1{yP>7C(W>T9K9ueK@P;Pi~pX$PYA3LVC=;ILMECO*t8-3?_|=61(}$Uz+S5V zUjWSK|3L6*hnaxGX(?MP^WE-G2oiL3EwF-=yFH7S6J?9x^&+y{IC$txjNI;Bx09XI zf?9(mn5yo^Bw-2a0VIsi8WLea>Y$agmXMIrzcfm_6=0)t;GqdlZ@t7E*KI~i zGYKW}NgiS!J+N6V6-xqUJxhficuW>><^W6B0>>wb?Bq}?lcUJuOB`J1@JSASa%_24 zYT3?gdQfV#^pHn<l{8wB#F;cfxL#G zX4Oooq!q^|fsM=`2p-yAeqhc|9WYY}_P}gbne!7R@V}F2!%u$Nh1sEsCr`d7p~t2^ zvGA1B3i_!B+Q;)%8vQ+;l<1}=);Lo`pc6!l`Rh2tl(|8m866GanAgN5TBcx(U4UHm z7PNZU>IN!o|0Qyr_2kcSkp=)Mt$l~kWqI8+(Ak{JACgOHPT@@DK-+!dyX0DoIIfPf zI3rotG(~wWXZ7T?Ya?_#b7n%wmR}KsYvWOYbP6x|I1)Wld%Es%Kg27?T?GuXkP?5f5$Fnl9}N+{^@ z7hC5KepSo4svbCNSDdwpk+ic>ayHHnL6v=eZnY)2+?8(GA+_vC*>?P)b7=(PfW#0s zQ07m_>lWlF|KvL4qc)&uBVDcc#T&=WY%|^TmTkE&och0Fi3>c?$mp0ghI`BPZ;HU?MUL@(+y;Z|7b02vxUBI7T@}g?RvXIZ{6E4LtI$>sM7}JxzoOny0}sC;8KUp)8;du- z^NnwRBN0g+NxL`6hdtzZuINb<8zmZ<4o7J(oRZ19luS$rq;7@D@jn8~wl1HMh0p&0 zyGYrPl$MO@WAz$0dm*MtQ^AZ_O#?^+e)IHDm#UfE+4i{=y8&mQ zT_#cnda_o=qebMypWq~i!KHly7ZsbqIEu5 z@G5EtMNDnXf_*bmIk4I}`r}J^JMa#nNZnF}7T}AY>f(H=i&?NwIra z&Cg;m6A@;Q;6g94sM}nX_J2yQpcr?#BptD4OLpTQ|j9oeYYAWBa1f85+a)LoJ342N^no|ay6M!*Ho&S*%TY~TWpvap*U zNGq;zCPkL$oXqKEsazu9AZ7v)9K=!N23Xc9mrJnKojh3+1(5gqHDcdNpiTIH^tqKu zL2_-6Z-HT(gT~;~kDV4sn%a-5>zH}dTjn{FdL6AkjH;Hk@tjt!q6tI$Y09HHqWasy z_;Mj|_@ts>{;lcw3;v?j1@mtWQ(N#Cr7auf`K@6BIbX2)Q{40Qr*pR>ZR$tt5g{F!G4Pf-2eA2? zgruurHeAkk4&V!B)r~s9=WCv~#;v#urzl0&xq2+iy6 zf}6xS32ki1{h@;Y4Y{viZCP4qSC;#d4Y@yDh(n*>i-x$FS~dD?!OwSA!%C`eCdCIdPKHUv{(HC+)(S9!#%o}^n6;(sLmm*x+whsw$!0t6LAr^QZXz_0W zvIbEj5)l7@0yI6X4hlyAG1qVr+8@Ocz}n~J_g}W$YrOYds&0Fd0N!P<{3V$4#8~^R zSqz7xF53K0j#NEeF;o0(_hWN2w#8zmj-Ftw z`s5TY3&LVu5oRl*l|VFfF=mm27*VVCd>pard?lc!5vox6U9nnSY;aR{=pd_)*{P9m zM^#HO=9c3_miID5ut#;AaT#S`;#|>+p2C()Sy$nBm-ybCcxUM6SU*XO|I{PKJ`T>&_d?aNQ<3x2?O1S{w`Zuj;w# z_T=m7s;yGh)`gO_s_KL{u}7-eov!Mas`?j7GL`zd~-IJ~!kg5k3+z=?XZkAg1q^b`l+7fN|OBdX0bsbXO4mvYfy%y+_0s~~M%fMUf zVKO$YTMe#Vi5XOaYZn8V@ca z&q;vJ=N_7jRXE5Bu;5z9LEEw~J>?l+`O;vjVoS0cKz`G{t&(r+s;}wO{^eNO*Dv|{ zGrszVMP@H{jsTzr32mOxQV8lK7jIv@6GOdvHsfgTy4PM_@>K=r3aly-uNw_jgNEcA z$R)lqyoYUof-O_mg~Grw(~To~1-$I%p~+NU@oNqMHzZUvf6=l%<=c_*RX=nUQDy+X z^5imOeP`psrye^~Aa_$j%@Tym+31Bp`rc<(mI-?ZuZXsi^=}vs8@4!TZ=V!qW#QNxpnw_)0SJmL zAvgd7*eSr=^EAnFft}hYV}_F8`7;9UPMUzmCvG*!-Ps{uMM$!diSW$i)J2?*=5gVm zye~mAb9q9F6gI3$N}|4nNu~2*5`Q0g6p6866ON+MBHtSV4uew^le1;xGtfoD)tNCN zx7iWNvuYciMu|J2MJKyc#8ds9H@^Kwf|u&I-hDpp-Xpp9q-=X+Mg)iZXT=Gjpb-tB zI^7*Gk&_K05_WQr316tvf15%WmiMN(S*w^ZXVI!3K3Rn-ZlSQ+W!Xjy+o|e5i1vVH z0I4aGdU&8qF~{VaKW~VkYq-#bZD53CCu$VBvjs=K?fG!*FhSN#-h)UR3dAQPw_v_!SPgUwtDY;LkY$xR|PAO|t|7}1t zIwMB%V;@HNwM;23Tknyb`d&PgxpNV zEqv}cuoNEKcvPpH!o9+nYw-K4*KwcEgZY zJhVjH3UMkuq%|5W;NsR~dBIjN;do`SP6VO5=oqzg1nsw}5Jri=CE8oSef{`1)V&|E z(+W^|l-OO-EjbKSu2iR=KnJ(0T+E<&MOu0%pD<^Tysgw&f3R90v z&PWAHR-BS0|L1c==sZ)~WOOh;4bdSdoHv(`hRy^+x}#An1ZFh&Qnap^o^oNX$`;}F z$Q!tOHr8-dxx_htrxs0nQ#_QirY5Iw!3L3!U;RfsSxYD~F*OBM0UR}m;0BRPxEz{h z)L6;v4DOcYg>L!&O?IArSo{wN$ixOBQL11~wgmU#(s3zS^FAUknb=y3t((|_tC5H_ z9c7kRXFX(^L-4F~Dx%61(J!$Mj=1x4hLX-&aaS>Y?L#+7*9?1s^5)>16d1E0Hp<0n zij61--QdHrF8T=tYRicY6q`M_&WteKB^;0br{qSoTQ!p;$$ASQYiIRJiV^Z<4YZQO z&AgF|5u&Cv!^n@ke%gv8Vh(xzMD2-7$+<`efP6}Py_5^~u5(@Xo`(d|&X$G4OGAm> zI7WG=B;{_yoALP9YFZYCa76zLf8UC`FXirA^#_+M?^rV4iZ81BR=j;FFHr4-TJu)i z+5gj%sp|femtKU1uREP9-jf-BzUl(#wKZ&Waa z5WuWe);_2Vu2crom0eP07nF#+6|2?V8UOBkJMM4$r5_8D8Ze^(U{K2|z+HPQu#73K zyt8S=+m`aSt($G$GlsQ7>i7EYow>K|XANoppyVI?4^<5xRwRp3!9D4!0jX+$*;9ed z>8d`ds&BoBE3aM}`VH7leQ{L7u{VmCtAGGdRY29%* za_>O8b-&cQKka`;@;{UF*|Xy9NO?O}{f)_>`_q2E_+@6TDF=tKjWJrOsibd@V_RtTqw@O!bzpQORH;fY&x1lYh^=kOam zb49%EqG8S!H-B?e9Gl)(SZLfAg4>L)bL>|U9NNk1O+(z4#ALtmL6~Ba(rZ&<*RK2-m;y=rNO?BweK{_2*a@=EVIODC1qQ+nw#|I5i?MAbbM84$yd;@dsmR4b zUmRc3F$Z(rxOd*L7>E~(m2tQFqhj`8PaZh2G^u5s;FUQ_ODPN=w{jp)Lbmnd3(XI5$-@{nQGgM+6 zwM?Sz4Uaa*N#6z!KtwwWSZ%FDPNOFByPySMq(Yf23%_g?-BAdG z>lK{X1NFy?uxJEr`AMF>V08O=kJ2M9e9ih*_1Z!j+BQJ0I#{l%=Bne>-)uz6Rq^Uc zlgzZiR{iyQN(@wD4p(c{B zdfk9qe2Y*UHLCp7e7*d{ozw&5ToHX*{Ii+AL#?SsW+9K-8kwuXcz>qgs?_-(#cTLd z#at0Deln%Sz8pB4pWt79P#@nyIN$FKryHvXcLm`perGt{Z+s!#DTMQbE*_5;M=GKR zb2-5nsfyQNGpQQqF^ZnFFhrS}3cd>_UG3DyYvVP_sIPiL{5A1fmI{^uPfUec+5Lo8 zcK@fevfRF3uU)Z()lfj*BG>Mm3*nm!fv3a?P48y`^wrR6WT=n2RN2ccS~#E3Jrq?>km z7I(1S2+>8(&`VQN2|$jgh)`8W4|{q7Sgz6)%~*-zgfidXAK2QnIlttkh14m!W$pa= zvoq(NOV!5)2V1SO zRj*hIG)_$0a(ii63)@7CxpF^z#DuF^tNi;VqZ)kxikGIvM`*m5O8P+Hi_&;PE)-y+cnjZNj&vEWE5IC9r;|GE3; zmK*P%lmCFiE6XIGfnRYyfie^|wwE;(#1CjJ>;i_TNu`iF1d}uHx3E_$Ybmm8RAz8z z3hi&_PD+cU3K1cnG42EaZ&b7ELR#GI;AThxB-=%XwRJ|#;K z;6n^dy6nFzTd~dnyFLcRLZ^$~QbhVp{6arsg;;QNg52j~9#x)5AQFg~>0W_gi!9oI zlS=ayfdDcmzC$M3&6O|zwXh@OY`a+AJ*M>*Hovj8k3{I8gN5nmXRWN>BJwWuUy>)Q z$Rrf>YeBeDob6d>?aUYb4vTyUg7%_udY|qi7x81G5I*2?^J$i5)-K?ZbatZ{Q$%Om z*jWqY=~p9J=NUvfbyXOmYgw~ySqOvE*W;`@vKE#M6MraIc|tD%zlJlz2kW0IN5=sS z46O+L>QF>XvW&5M%oejoVI2ksKjiHQ9Lkuv7`=oo=+HE(fsS~{p1rwk7H8DbmTFteq73S@c=MRq-^Ta0%kgXx72%Zk+wxl8u=uCd>3VGM6Qh8-M{r8EPS;o{uEK>SDsenTl7*}`tUPy{wl`N(n{x+5#*mgPA4@%TL&eCMsX z!S_`y=dF3*39NVm$%?e6L-KSim*KB(xlHnO<4P@endGJ;WA^H0;qHOYr|xa}adAj`O(xRvo$y?^}O zk=Hn}ykN@&edh>JAW~c;p zXWDvFtpj%}?iubG?-_qq4NKy1;xIB%*S_2gxe)xU1zM!QmURnP*8`DPYujhXKR*70 zlb@V?(6W7{W&0O9j-^|UOD)IO?c||^YYl#O?BiolS!mfNwQRflTDoNyjtVujBwzdR zR^rz3$;2(xOH1E_=KhuDe#olI)6GYu<|F7djYkcco-KEG+#R~R_1cBg80Bj5GS$;&Hsn^Se0sRge5_{xv2etz{q&)`bWV7lj^)Pv)H_Bz}@0q_Gy z(v*BY)7+72-j?aye7E`TY^rl0)uOzamd<5?Vz}3m?%6N(>`%AsPae*+1d~G$rc-9>8Vuv zLA;r^O&CO@skYszfby=@HYNGbE`NOat}orTLu%WR+I=kDb}U_cEO9uqxetwncYQn6 z%>Y+h_x+t8?)+f)N4u8}p+WuipVqHb_NFR(afv{3>xX+1dos0M4{Eop)NZ-EHC?+? zs@<7lZ>Fv>Ir8BviC6wJ+{aUO+wf+Z(MqPerq#CHnU?;$+fpt4@_X;_{X@U(fLN94 z1OW0*)QOGj>VMF=ccpW0x^utOxj%7yt)X+7UuoEqYS_Z!7^OHy@!r28e*w`TnU;=B z%O)K7rRV@KJQ1CT^ONF4`PRhspN^**2JmL;TauH@e5!s+%CEd@zUl=3{mUO-hKf#o zk5u22_Vp|sUJEpSR`hYv5A2`Vmz$QG(MTnCTUG))mR!iCzv}(jcW2+Zar?%SnFvE& zs;pzJGLSsHQrVfR?9BML~ zfKJw2k51N%*i3cx@Y>jhYN)FJzVkz8^5wL@SMv9!{Jm>UZJ%^5KYw@2=Pyf5JC}|x z9Y?8fW!T8OuPnW?THThZ38ehP@~e}5<5r5wnk5s_bPLSB%0%}{S$nDsXSb`D4r6Si z{J#Ck>&p|Lyq@yy$9u0?{@$BA!yqQs1K!|AvM%wp^}L*xS% zLDTRs?)Sless7B=XXNwy1eOV~O%*yvCH@@&I#4Ta!;~ieA7rwTiEWa|=eTjh9oq{L zY4<{;sZW2ViZ+YcDVQ(d82MKK^ZCDZqlHde6DXNASa93^1~`Koz6X|}FNV)u`NPaA zP|7v7Qon6%T`#sv&^AM;Pi-@VgY$S7V~OU)ZzwT1IY;@ri@CAL z4PIh(TWOs0m;zev) zNcQUWVnR@iDu7>&YYnop9Wl|NX@ab5%&Lx^A=J?`gt}}DfwED8gSU@hgy7U#;-uv3 zll!#T`NY2|1h$Jr^;!IeBYrJ_{q|-= zzT(dmxfKy<`I;>rSMA`DcwDSOU&%Uz+>TvDW`%QA8F z$ndE%Lk9;(hO$L344pY}YGg>PB4^yf1Kv~Cf;G&w_+oOVEe&W z$n!J-rmY(x6WcfbE}5FiA1U3+`^G6UT_-R|4lfe8Ox6hkZ1HxRO!aWUI!X-3Alwje zfhT!c!aqKfQSp0ef>_<NO-lQ&nappI2BIODF*l`hZ^qn_ z(!L;u+Xn9Lx_97D27Wd$?_3B;_}PiqKDx17l)`08C7V;+e!OXJKd7j;X2}RDyCdys zk~~fGu8ga4;S5gHy3?)>$<;CM$T%w&4lEwan8E1&;t*y>ml3n0%Q$aG=n_A9UN<^1 z)l_qqqPI>i9k_igZLWV<=PrRifO*GyfI}Qx7W>zYcKGvY{8c)g@CPt&Td#*EEq33x zzkPD?Bx)H~_+4MRly)~r?uL11ro^`}x%A@O;l=QLvDV@&RfW=6ioFXvmRjB(SR9zQ z(HgEI;YfR%C2#Y5Nk-#_gkM-X{PwGhucE}dgmvL`u1}9flM{{QYlhLK^xN}M>R)P0 z)TB#WrP9`UcSe(*rs~S7mUbjIrOVnSutl6lTa})QCF|0yw5L(>G*V~y`qe_*RbsEK ziJIcP8C`xV>z1ykz`IuVN?`IiU#7ff>4n5_y1Yv&$5<%U``2ZpqIPLAF`lmImMXea zTp8o#)T!yb*ES^%rOz;Ey0+J?H7;YuT(nTNZh~oznJh42yjX0&7LnP;S?miv>vl3bWPCB1 zowC_Q<`VJ~Tz8Y%L-?9?FPTfpT)$pMW{f5>my@}I%(d&4WcJJEDl%ha626AawX(U6 z%=Hw1$9e;q1G2f1%uVFSzurvd7OuEFWA|npzKk7)(u^I3G6wzY+sOx)1E2`~T={PN zFmZC~v+&1Zc_|EQ+P6!>4;Z6U6glQ23%kGh##?VB$`WO%x}J1ZuT<5$Qq-H0-@ZfX zqF#xaGaxP(7B6SaBMYYQ*uHH`$v+l+9jyCQYVR<;?WfZ1r=<2%aFX@Y)3(!+?R3gK zBEO(kZlYFh<9sn{ytHPiYRy)Yv6W{aX0iD*HrzH+2lKkyX0bjrIZELfV7>%ZSysCg z%vj2oV#&R!EeBI(B7J2PS($O(z3%WDnvx^y96rnPhnZEN!(!N!Xa^T=*p!@LA3g9m z3~dQG;X^*~(SvHUp)-MXH$L=33;5_kNtkdyqp=)URx$bFl%>!{Rs zj5+AR8H3Y+X=EdKNH`GVoNIlR0c*F7U}13a#6!aWy5P90%z*3LH-d+R`*p!#(`ADJ zw+%fRK4kb`t6j%Tkd${S;TmQv5&iFCbU| diff --git a/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/loaders.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/loaders.cpython-311.pyc deleted file mode 100644 index 5bcc562b551db7c1d85ddbb907bd14e066dc50b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33096 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%0A^8q&l(#*Qa348WZ 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 diff --git a/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/meta.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/meta.cpython-311.pyc deleted file mode 100644 index 12f33f4becdece625110f1758fa3cefb2efe8538..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5722 zcmcgwO>7&-6`m!RKcYlQw*G7>i6@k0iH=OgihmL(Qj*G&<0w+nSZ-0K?s~-?N-HgQ z+1aK3ETL*)AabFDTBNlO37~`Grf>_mfCJ>v0y*T+O99d#5MluX0g3?4je!%u$f<8; z$t5Yv0n$TC0u?YjfcxaloXYQ>tehKW;d5#!Wd+58jKHCja$m& zq!@1nnr-FhAHKfAL%e+-ZaZAcp1DKrxQg@2dXOOuG8|Ssmr%5EMH5Z4Xm`NVWtTu z8Vh~JxS9M4jESOx?b8i~m@o*Bz~BPW36(8_vM*y)P7xT?kLn95HS`qGtwdQAb{9(z z4_<@8yWkrH#Rc#Wk0QjqO8o{(3X1=FLtIn>#HWag4=q$*$$HK`J6M!mLZ5-myD zIkxL038t8)B$;d{jMu-rI&j&9c>`cXnJOun%DSu%Oc)C)F$czA^85%m+rR?oOiHrH z1bfuf>4EgJHEZb4#ZI0aFjb43NP}(U8CW%^>T~iSP_*P&dYLxDPAgCCYr0rj26isZ z=b(GIj_wD;Hv*f1&x42V1rKd^WsjZBzVLc3IGzuVXM^MS2T%X4=Wfr2m=AVm`Sk#n zAzN6gF&;ArHy%SN04IT|bEVDr%b z{*kX?)Ytisw(@mJb~b7_VTXZp@(m3BH#fQk(%g1kOaRB4a~*Zgb(x*=v4edot=7fP zqbp~A4r|vuy!Wn&t6oKz=hSH5s!jU-{e)CFw{1G4ITLEmt|k=x)L4-93?yoc=uW;=Ra=xyVpH zGE_vKy0g5?H9WQP>WyD*`L}(Arnc?F_nIQvrpQj_&iVW)xZcS2va8VCns0vQ^X7qj z%>#FQx#lzZ<}=ymGY^ZtG9B)7QIYF_0~xIcwkD$?1`awnB7j3kl2V3}(b%{_l75+y zwbGY>Bq>HhlK24y5V0s_qEV(6t_wR{f{O&vG)amIj@ppaY$h ze+BXRtoVFU^!T0!sUOn?1z*>eSwwK#w)kyt=lA>0?z9yV+&((RZ$GHxI^sNnUx18E zLkagR!2>%#{CrNspcdr8=iQmLzP%=_3Onu@goSQfMYS{eX?4#ippYQ9!{ggL;Fws( z0N&V0@`JG;Q&pbUAaJWXk7ci3nsQ?Oq6+6`nqbW^=81wcX`G}+D#V=EiFt5PmMjce z0nGsPr$`LrACZL2f+D<37^$?XL41TSShadhtQ!`d*NsITFV3ooSx%|4eR(@ru3&|v ziLS7u0Wu7>TUxee`G72uM206GmOKw!%ND0oVxfPJOc0u|6K9DM3-Ou5!^2zk69RTCqop%L)G8=qV6}aE_{O-F*xHU>Fd4L!ElM~qku%Sy_CXbef% zxpVj;0j zGlrpH%i!h&A90MnPbTE#fmBwRPn3zABTI>MSEouD+(B+v6RQtD)@*bD7CjArW(>M@^zAX!baZEA_sv}6 zseI$9^$P{D{@sb+Ol)=M#P+<{o)y~*^#}9y(X1HdxKRTX3>UlM@4;{3;Ey8#z+x5c zz>7zlRRs;TaBv=N30ICX_^5>NHILn;1IGp%c~K3M8iGR zoPdVA9?|gQbp$C|iT5YAgiT!52#k+8X{|gBZZQUs0ml-;1UveaB%##P69C_pYLJBt z{uROs#0QQa9O)fY#{Z~3Q!AuODBXG<0$mmqHMyw5$>hcK&|_ z4K5cbGos1MP*2BZt&|pF(WA!^6JUFmXi$T}yQ&bPsixIei6a#gNUjNZ9C3oqJH1uZ zd;2ky`ic`OxM5rjbrh4#XuOnlf-zVYVo0eN1_h6SD#?<}!VXrG7`VoZvhGAnitL>Dxb1FNu45?Q0TqC+ zt^0mg&rT|T?1g_km+N{t-}N%&yNAydA_Gt@WS=Nq4~u?uq-cRMi{rPY|@Kx9G zaVMVs^(@3IbX1=Z2pBsm4HYX>iuz|Ic7$@39e&z#F zXhH1D)?P(_vj7$3qa7HMz5S;0=~$a^eCPBocqR<)$al#nBX{Tc!`|*$)YQ6}+P<8B z^2A4(zpQ?8`R`Y<;qmoQp}t}B?AGb`hIV@Lk-c9{8#Rm@;gyN{s%wo;;tiG$2mf75Shqa zo}@W=yYj9ApXNEN;{g}a0>g#8yWmNC814qVE8WF#Pu^SbrG0>R$=&Ahe!#=&FvA0YN75072lLTFEFEKb2=I714tQAM<`VWq0q?f)ej6cj1nPV2&(1W{ zf*idjq@sh#Xf!AMu2I0za#y`&e57+PalkTiXuS)&p(5O1!PDU+GtNWOmwo zWNwNi`@Y7{$s}h6^Eq9iQa+@s6eY1>AB^3 zORy1sW36KT}ww$C=fpwgfw2UTAD;cWHQ)mgCP#1Hws1_7ehfnW0r7)kD zbj9?*EEW{a^iV}#plTM!u!{!}6vx)TGd0j#+VqB)2q}SjeB=Vr!Otom0p%wR>Z@Fd z(_FG^is-gt0a=N2Qpx;f)}M+cP8OP*dDW$N*?ggwOZPUvoTF;45{#i9chD1^sd;@~ zj#<*E9%}L`aV6s9ca_NQ&6cs7w6f(@?``3MIE$BoTkNssLv{5KBwtoaazn43-h_WB8yDFQsU`pzX%0MsG=?8bup&_ zD=nwa$TSGsEEQ7Zlz0|8(WRWG?8EMi4Pz=wRDp5SET|q#3C5B%QPU}~ z)NsJo!LpJnUQ$G69~j|-O;5F2(nU6sP5s0vHCAN}?3lUV8UqHE z3f983=fu-!u$N%XAf)1gKED8q){Cv{NU?5TqXJJ-R8WejNgU>c%8yF0wGY4zG6O2~ zqu5oh)vVf$;-{|b@hS2#`Is|#nC-_d)0H}4a*G(jqkjQ_HF@U8#S(suYTJnSCUA8eyGh6-hREDlKWq0W_WN z!upV7c{B-ia6S_45r9?lC{BXWUwGCRH{Pm5cN@{&mB6487+gJmKM<)A&fQ&&B-Zq= zy8LTnKVH7Jygu>H+pBL^!}0ae>oaToy-5GY&`qrp88RY6K~IQrhqyEAoxq97~1DFa}5#0Zb9@ioEg zPTY&^dgLXc`1;Vs$#QV05*#vuLl1oJsQ)1WP$O=i|M8zLcjgnW6V|D|sJKN1|kEYvoN?Uc75901)`ShSFK$y}OO z1lgsy=Ws(=k@?myIERI6g42T7If4&S%kY*#)P;=932G25I$!GPj9S*;Zs19K76<58n2J zG|5j=bh{2&{Mo*kiHqWCOz{}5J7VTJ=m1o#Jl9c3*0F&uQ`1>Y*2!%iMTT{^IdHJd zo?G0_sm<8GUijdG^$m~-H0d%0jP2+Ubixl!$xqV*ZBsJinQbGl{M8>f!{?FL_W-Pt zdy&NYu^Xp;cB($7^YE?=95euSj~U%#mB_de883Ust-TiTtT)}$7>t@;TYa+VqV0k> z+x!0p1ay(xv|AkSl54J^2hM%HDma2k!P%-MT7$s3#>h@T^A4v6n!}Yi9W}CEn*Pce zrcqZ(m?9;ipYJhr^bki~HaR>og89jpFMF1M=Gn`=d8P?m__Ssxs&geyJ?3HJpxb+TN z#`Y4hT_rUSiS^tF{VcShe4tjM`;F-SHTPGMfsOOcgKW>ec%Km;ti*?n_;5Km{8gZ5 zUA}q37)VtDBSv5ZkF)-2V#nGm_alApz5VXn8%iZIY($33-eIOSlMekr-C+9h3Lu~# z{2aWk^5cOL>Fga^shs)%_eSt`_+$G4aTKr7tm$5&5c_;AbdsxvO4F2R%qh`%`fcve zwl^kBAbT0uXs85Cj=}EhN6UesYB2iVnRm~uUwOY&2@V@Ul$iC@cmil(h{>e0NR9!s zHj(swn@Heh1_ty=!-$%KNV+D!;gWO$n9<`nN9TH*j>B3=QPcl`<7m*mhTOgjpwo)A ze>!{p>>B%XEH#-hy_t*(9wU=6{h15|g9~}YgPF`*3sSz`(v```#Vl4sM5yPo1qCiN zvdQTtKcOzu5g66<+VQ#-E{;Q;Wo5#NE8sBEd@y|_G$;7fO}81yZ?O%7!mvKKI?ttgmGkwq4$0M z>pe9$G}ed{>=YVZ5yP(du6G6WzAsdB!@EYDASk#8>SH2ibsT7R9H@63z>Xb(B}5cm z7JiL_=8dI(9dd?@X}60g9;M5vy=gCI5t6(av;0^~Qe)+X2~~t^j-BLyo1~;SqAI=Q+l|ehgbH1@Vm^gC4BpYG6jjwKmzIV627;GofryYAinj# zY|`MV;Jv*#GD=(yG8!Lp|I+5YuJS$zTjv@< zgKYk?EKFlIn2izt%uGy!i8D!5PXjr#F*s!`5I_Y~WeKAgUAdy0f}G3hW~{~D>qdD2 z_S%fnViBWkyisK^U1a)BT*)f)dakINftF5YbXHPjIA#>P*^UL?06rA&B_Kq?K@me z^cjid-Nb=Ai38PW_uc58JJCIx*-G>oBl^q(-qjs`NC3bA6AC|uG(of<4hG-hCSVMP z?k2|WB*rRyaS2U&W5RDtXnUoC!09Nv#e~|KF_XTZ*~tPoei?x%%5#b z)BXhFz`y4&kQ@9zZj06->5A9pdTF=-yMk=Cte{cZ#=p%4@RKV?&Or*bMeW2T$a><% zK1&sr1ZCzVY0GL>#3UHdV!BaIIkpFV+Rx#)H3-1k9!wz~Y*`Lw+974=KV%2G*5%$s zF>7LS>h{~}NJkaUu(@=)qLzRWi)MdMeh&&>j=s?G*?4U|*4n@f=pQ^0A?c?Q&c&P4 ztU=7+>kF!$D_B`O`X)5eA0hZV1Zd7QgWw_pG%boJVw*t*>$c9Oy|U{GYogfM0AS4@ zl66MpX(O_?MtEQNUi_(Q^b8nW0u3%<85~4(f4U8$R5pk24j#TUc=&U^GI-P&JPK8n z=nFoJw++>4DrdWW^}1z~tfI0WEo8AKdDwUM%J{mM6B7$!?a+wz9{V53=qA z-uiz%D7z9^mjiY$M>VDR{~;Pi@B;)WDARkE9VAko1%E6;WKkZIkr}p6`1*n56y`VH zqt?adMXCWW@Uuj_2@t$A$5lzZY(G^pPd^+`dx=b9;eUd0UpDGzD zJD*ORx6=%liQ}n~-DT%f^E}NZHgeW=cB(FHx5j&?{;vU z8{*&|u^nvee}J_Qn@z890+)n)$2PDLc!0GJn@wSng9CFrSpVSztbN#QI?0jYXUimJ L5V6c2rgr}ak0V{m diff --git a/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/nodes.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/nodes.cpython-311.pyc deleted file mode 100644 index 2dffe51bf0807285d1f00e39f7ec699e78f82a79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64503 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 JYnEdB{s&%L#{mEU diff --git a/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/parser.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/parser.cpython-311.pyc deleted file mode 100644 index 4d388effeff7a6a5a91c80fcdb2be18f9c3ae37c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59317 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 diff --git a/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/runtime.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/jinja2/__pycache__/runtime.cpython-311.pyc deleted file mode 100644 index 061b253199f86f59685a329b1eedf4833e43c4b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50669 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

x3wHC;`0$KK|M)oGVzr*yS%>hwVWoe*b#D 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 diff --git a/venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/termui.cpython-311.pyc b/venv_flaskchat/lib/python3.11/site-packages/click/__pycache__/termui.cpython-311.pyc deleted file mode 100644 index 2280ccbe47e78a5c3915627329adf2443c17d76d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34693 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